and.... edje_cc can take small code snippets in script{} areas and compile

them, include them int eh edje.eet and edje can run them. all i have to do
now is actually give the small scripts an api worht talking about


SVN revision: 9514
This commit is contained in:
Carsten Haitzler 2004-03-28 05:26:17 +00:00
parent 4059260663
commit 3821f74e99
11 changed files with 336 additions and 52 deletions

View File

@ -0,0 +1,3 @@
native tst();
native emit(sig[], src[]);

View File

@ -139,11 +139,20 @@ collections {
name: "test";
min: 32 32;
max: 1024 768;
data
{
item: "My Data" "The string to attach to this data";
item: "The Key" "String data attached to the key";
}
data {
item: "My Data" "The string to attach to this data";
item: "The Key" "String data attached to the key";
}
script {
main()
{
tst();
emit("Flabby", "Pants");
return 7;
}
}
parts {
part {
name: "background";
@ -466,7 +475,10 @@ collections {
name: "logo_animate_signal";
signal: "mouse,up,1";
source: "logo_anim";
action: SIGNAL_EMIT "do_it" "the_source";
// action: SIGNAL_EMIT "do_it" "the_source";
script {
emit("PROGRAAAAAAAM", "TEEEEEEEEEEEEEST");
}
}
program {
name: "random_signal";

View File

@ -23,6 +23,8 @@
typedef struct _New_Object_Handler New_Object_Handler;
typedef struct _New_Statement_Handler New_Statement_Handler;
typedef struct _Font Font;
typedef struct _Code Code;
typedef struct _Code_Program Code_Program;
struct _New_Object_Handler
{
@ -42,6 +44,18 @@ struct _Font
char *name;
};
struct _Code
{
char *shared;
Evas_List *programs;
};
struct _Code_Program
{
int id;
char *script;
};
/* global fn calls */
void data_setup(void);
void data_write(void);
@ -50,7 +64,11 @@ void data_queue_program_lookup(Edje_Part_Collection *pc, char *name, int *des
void data_queue_image_lookup(char *name, int *dest);
void data_process_lookups(void);
int is_verbatim(void);
void track_verbatim(int on);
void set_verbatim(char *s);
char *get_verbatim(void);
void compile(void);
int is_param(int n);
int is_num(int n);
@ -81,6 +99,7 @@ extern Evas_List *params;
extern Edje_File *edje_file;
extern Evas_List *edje_collections;
extern Evas_List *fonts;
extern Evas_List *codes;
extern New_Object_Handler object_handlers[];
extern New_Statement_Handler statement_handlers[];

View File

@ -17,6 +17,8 @@ static void st_collections_group_min(void);
static void st_collections_group_max(void);
static void st_collections_group_data_item(void);
static void ob_collections_group_script(void);
static void ob_collections_group_parts_part(void);
static void st_collections_group_parts_part_name(void);
static void st_collections_group_parts_part_type(void);
@ -78,6 +80,8 @@ static void st_collections_group_programs_program_transition(void);
static void st_collections_group_programs_program_target(void);
static void st_collections_group_programs_program_after(void);
static void ob_collections_group_programs_program_script(void);
/*****/
New_Statement_Handler statement_handlers[] =
@ -159,6 +163,7 @@ New_Object_Handler object_handlers[] =
{"collections.group.max", NULL},
{"collections.group.data", NULL},
{"collections.group.data.item", NULL},
{"collections.group.script", ob_collections_group_script},
{"collections.group.parts", NULL},
{"collections.group.parts.part", ob_collections_group_parts_part},
{"collections.group.parts.part.name", NULL},
@ -224,7 +229,8 @@ New_Object_Handler object_handlers[] =
{"collections.group.programs.program.action", NULL},
{"collections.group.programs.program.transition", NULL},
{"collections.group.programs.program.target", NULL},
{"collections.group.programs.program.after", NULL}
{"collections.group.programs.program.after", NULL},
{"collections.group.programs.program.script", ob_collections_group_programs_program_script}
};
/*****/
@ -332,6 +338,7 @@ ob_collections_group(void)
{
Edje_Part_Collection_Directory_Entry *de;
Edje_Part_Collection *pc;
Code *cd;
de = mem_alloc(SZ(Edje_Part_Collection_Directory_Entry));
edje_file->collection_dir->entries = evas_list_append(edje_file->collection_dir->entries, de);
@ -340,6 +347,9 @@ ob_collections_group(void)
pc = mem_alloc(SZ(Edje_Part_Collection));
edje_collections = evas_list_append(edje_collections, pc);
pc->id = evas_list_count(edje_collections) - 1;
cd = mem_alloc(SZ(Code));
codes = evas_list_append(codes, cd);
}
static void
@ -371,6 +381,35 @@ st_collections_group_max(void)
pc->prop.max.h = parse_int_range(1, 0, 0x7fffffff);
}
static void
ob_collections_group_script(void)
{
Edje_Part_Collection *pc;
Code *cd;
pc = evas_list_data(evas_list_last(edje_collections));
cd = evas_list_data(evas_list_last(codes));
if (!is_verbatim()) track_verbatim(1);
else
{
char *s;
s = get_verbatim();
if (s)
{
if (cd->shared)
{
fprintf(stderr, "%s: Error. parse error %s:%i. There is already an existing script section for the group\n",
progname, file_in, line);
exit(-1);
}
cd->shared = s;
set_verbatim(NULL);
}
}
}
static void
st_collections_group_data_item(void)
{
@ -1256,6 +1295,7 @@ st_collections_group_programs_program_action(void)
"DRAG_VAL_SET", EDJE_ACTION_TYPE_DRAG_VAL_SET,
"DRAG_VAL_STEP", EDJE_ACTION_TYPE_DRAG_VAL_STEP,
"DRAG_VAL_PAGE", EDJE_ACTION_TYPE_DRAG_VAL_PAGE,
"SCRIPT", EDJE_ACTION_TYPE_SCRIPT,
NULL);
if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
{
@ -1348,14 +1388,45 @@ st_collections_group_programs_program_after(void)
{
Edje_Program_After *pa;
char *name;
name = parse_str(0);
pa = mem_alloc(SZ(Edje_Program_After));
pa->id = -1;
ep->after = evas_list_append(ep->after, pa);
data_queue_program_lookup(pc, name, &(pa->id));
free(name);
}
}
static void
ob_collections_group_programs_program_script(void)
{
Edje_Part_Collection *pc;
Edje_Program *ep;
Code *cd;
pc = evas_list_data(evas_list_last(edje_collections));
ep = evas_list_data(evas_list_last(pc->programs));
cd = evas_list_data(evas_list_last(codes));
if (!is_verbatim()) track_verbatim(1);
else
{
char *s;
s = get_verbatim();
if (s)
{
Code_Program *cp;
cp = mem_alloc(SZ(Code_Program));
cp->id = ep->id;
cp->script = s;
cd->programs = evas_list_append(cd->programs, cp);
set_verbatim(NULL);
ep->action = EDJE_ACTION_TYPE_SCRIPT;
}
}
}

View File

@ -27,6 +27,7 @@ struct _Image_Lookup
Edje_File *edje_file = NULL;
Evas_List *edje_collections = NULL;
Evas_List *fonts = NULL;
Evas_List *codes = NULL;
static Eet_Data_Descriptor *edd_edje_file = NULL;
static Eet_Data_Descriptor *edd_edje_image_directory = NULL;
@ -77,6 +78,7 @@ data_write(void)
int image_num;
int font_num;
int collection_num;
int i;
bytes = 0;
input_bytes = 0;
@ -374,37 +376,6 @@ data_write(void)
char buf[4096];
pc = l->data;
/* FIXME: hack!!!! */
{
FILE *f;
f = fopen("test.amx", "r");
if (f)
{
int size;
void *data;
fseek(f, 0, SEEK_END);
size = ftell(f);
rewind(f);
if (size > 0)
{
int bt;
data = malloc(size);
if (data)
{
fread(data, size, 1, f);
snprintf(buf, sizeof(buf), "scripts/%i", pc->id);
bt = eet_write(ef, buf, data, size, 1);
free(data);
printf("WROTE %i bytes of AMX!\n", bt);
}
}
fclose(f);
}
}
snprintf(buf, sizeof(buf), "collections/%i", pc->id);
bytes = eet_data_write(ef, edd_edje_part_collection, buf, pc, 1);
if (bytes <= 0)
@ -424,6 +395,88 @@ data_write(void)
progname, bytes, (bytes + 512) / 1024, buf);
}
}
for (i = 0, l = codes; l; l = l->next, i++)
{
Code *cd;
cd = l->data;
if ((cd->shared) || (cd->programs))
{
int fd;
char tmpn[4096];
strcpy(tmpn, "/tmp/edje_cc.sma-tmp-XXXXXX");
fd = mkstemp(tmpn);
if (fd >= 0)
{
FILE *f;
char buf[4096];
char tmpo[4096];
int ret;
f = fopen(tmpn, "w");
if (f)
{
Evas_List *ll;
fprintf(f, "#include <edje>\n\n");
if (cd->shared) fprintf(f, "%s\n", cd->shared);
for (ll = cd->programs; ll; ll = ll->next)
{
Code_Program *cp;
cp = ll->data;
if (cp->script)
{
/* FIXME: this prototype needs to be */
/* formalised and set in stone */
fprintf(f, "public _p%i(sig[], src[]) {\n", cp->id);
fprintf(f, "%s\n", cp->script);
fprintf(f, "}\n");
}
}
fclose(f);
}
close(fd);
strcpy(tmpo, "/tmp/edje_cc.amx-tmp-XXXXXX");
fd = mkstemp(tmpo);
if (fd >= 0)
{
snprintf(buf, sizeof(buf), "embryo_cc -i%s -o%s %s",
DAT"data/include", tmpo, tmpn);
ret = system(buf);
printf("ret = %i\n", ret);
close(fd);
}
f = fopen(tmpo, "r");
if (f)
{
int size;
void *data;
fseek(f, 0, SEEK_END);
size = ftell(f);
rewind(f);
if (size > 0)
{
int bt;
data = malloc(size);
if (data)
{
fread(data, size, 1, f);
snprintf(buf, sizeof(buf), "scripts/%i", i);
bt = eet_write(ef, buf, data, size, 1);
free(data);
}
}
fclose(f);
}
unlink(tmpn);
unlink(tmpo);
}
}
}
eet_close(ef);
if (verbose)
{

View File

@ -36,7 +36,9 @@ int line = 0;
Evas_List *stack = NULL;
Evas_List *params = NULL;
static char file_buf[4096];
static char file_buf[4096];
static int verbatim = 0;
static char *verbatim_str = NULL;
static void
new_object(void)
@ -379,6 +381,73 @@ parse(char *data, off_t size)
{
stack = evas_list_append(stack, token);
new_object();
if ((verbatim == 1) && (p < (end - 2)))
{
int escaped = 0;
int inquotes = 0;
int insquotes = 0;
int squigglie = 1;
char *verbatim_1;
char *verbatim_2;
while ((p[0] != '{') && (p < end)) p++;
p++;
verbatim_1 = p;
verbatim_2 = NULL;
for (; p < end; p++)
{
if (escaped) escaped = 0;
if (!escaped)
{
if (p[0] == '\\') escaped = 1;
else if (p[0] == '\"')
{
if (!insquotes)
{
if (inquotes) inquotes = 0;
else inquotes = 1;
}
}
else if (p[0] == '\'')
{
if (!inquotes)
{
if (insquotes) insquotes = 0;
else insquotes = 1;
}
}
else if ((!inquotes) && (!insquotes))
{
if (p[0] == '{') squigglie++;
else if (p[0] == '}') squigglie--;
if (squigglie == 0)
{
verbatim_2 = p - 1;
break;
}
}
}
}
if (verbatim_2 > verbatim_1)
{
int l;
char *v;
l = verbatim_2 - verbatim_1 + 1;
v = malloc(l + 1);
strncpy(v, verbatim_1, l);
v[l] = 0;
set_verbatim(v);
}
else
{
fprintf(stderr, "%s: Error. parse error %s:%i. { marker does not have matching } marker\n",
progname, file_in, line);
exit(-1);
}
new_object();
verbatim = 0;
}
}
}
}
@ -396,6 +465,30 @@ clean_tmp_file(void)
if (clean_file) unlink(clean_file);
}
int
is_verbatim(void)
{
return verbatim;
}
void
track_verbatim(int on)
{
verbatim = on;
}
void
set_verbatim(char *s)
{
verbatim_str = s;
}
char *
get_verbatim(void)
{
return verbatim_str;
}
void
compile(void)
{

View File

@ -113,7 +113,8 @@ Edje_Edit_Image *edje_edit_iamge_get_by_id(int id);
#define EDJE_ACTION_TYPE_DRAG_VAL_SET 4
#define EDJE_ACTION_TYPE_DRAG_VAL_STEP 5
#define EDJE_ACTION_TYPE_DRAG_VAL_PAGE 6
#define EDJE_ACTION_TYPE_LAST 7
#define EDJE_ACTION_TYPE_SCRIPT 7
#define EDJE_ACTION_TYPE_LAST 8
#define EDJE_TWEEN_MODE_NONE 0
#define EDJE_TWEEN_MODE_LINEAR 1
@ -597,7 +598,7 @@ void _edje_unref(Edje *ed);
int _edje_program_run_iterate(Edje_Running_Program *runp, double tim);
void _edje_program_end(Edje *ed, Edje_Running_Program *runp);
void _edje_program_run(Edje *ed, Edje_Program *pr, int force);
void _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc);
void _edje_emit(Edje *ed, char *sig, char *src);
void _edje_text_init(void);

View File

@ -307,7 +307,7 @@ _edje_pending_timer_cb(void *data)
pp = data;
pp->edje->pending_actions = evas_list_remove(pp->edje->pending_actions, pp);
_edje_program_run(pp->edje, pp->program, 1);
_edje_program_run(pp->edje, pp->program, 1, "", "");
free(pp);
return 0;
}

View File

@ -93,3 +93,23 @@ _edje_embryo_script_reset(Edje *ed)
if (embryo_program_recursion_get(ed->collection->script) > 0) return;
embryo_program_vm_reset(ed->collection->script);
}
void
_edje_embryo_test_run(Edje *ed, char *fname, char *sig, char *src)
{
Embryo_Function fn;
if (!ed) return;
if (!ed->collection) return;
if (!ed->collection->script) return;
_edje_embryo_script_reset(ed);
fn = embryo_program_function_find(ed->collection->script, fname);
if (fn != EMBRYO_FUNCTION_NONE)
{
printf("EDJE DEBUG: About to run script from progrqm.\n");
embryo_parameter_string_push(ed->collection->script, sig);
embryo_parameter_string_push(ed->collection->script, src);
embryo_program_run(ed->collection->script, fn);
printf("EDJE DEBUG: Done.\n");
}
}

View File

@ -59,5 +59,6 @@ extern Evas_List *_edje_edjes;
void _edje_embryo_script_init (Edje *ed);
void _edje_embryo_script_shutdown (Edje *ed);
void _edje_embryo_script_reset (Edje *ed);
void _edje_embryo_test_run (Edje *ed, char *fname, char *sig, char *src);
#endif

View File

@ -276,7 +276,7 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
if (pa->id >= 0)
{
pr = evas_list_nth(ed->collection->programs, pa->id);
if (pr) _edje_program_run(ed, pr, 0);
if (pr) _edje_program_run(ed, pr, 0, "", "");
if (_edje_block_break(ed))
{
if (!ed->walking_actions) free(runp);
@ -345,7 +345,7 @@ _edje_program_end(Edje *ed, Edje_Running_Program *runp)
}
void
_edje_program_run(Edje *ed, Edje_Program *pr, int force)
_edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
{
Evas_List *l;
/* limit self-feeding loops in programs to 64 levels */
@ -461,7 +461,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
if (pa->id >= 0)
{
pr2 = evas_list_nth(ed->collection->programs, pa->id);
if (pr2) _edje_program_run(ed, pr2, 0);
if (pr2) _edje_program_run(ed, pr2, 0, "", "");
if (_edje_block_break(ed)) goto break_prog;
}
}
@ -597,6 +597,17 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
_edje_emit(ed, "program,stop", pr->name);
if (_edje_block_break(ed)) goto break_prog;
}
else if (pr->action == EDJE_ACTION_TYPE_SCRIPT)
{
char fname[128];
_edje_emit(ed, "program,start", pr->name);
if (_edje_block_break(ed)) goto break_prog;
snprintf(fname, sizeof(fname), "_p%i", pr->id);
_edje_embryo_test_run(ed, fname, ssig, ssrc);
_edje_emit(ed, "program,stop", pr->name);
if (_edje_block_break(ed)) goto break_prog;
}
if (!((pr->action == EDJE_ACTION_TYPE_STATE_SET)
/* hmm this fucks somethgin up. must look into it later */
/* && (pr->tween.time > 0.0) && (!ed->no_anim))) */
@ -610,7 +621,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force)
if (pa->id >= 0)
{
pr2 = evas_list_nth(ed->collection->programs, pa->id);
if (pr2) _edje_program_run(ed, pr2, 0);
if (pr2) _edje_program_run(ed, pr2, 0, "", "");
if (_edje_block_break(ed)) goto break_prog;
}
}
@ -734,7 +745,7 @@ _edje_emit(Edje *ed, char *sig, char *src)
Edje_Program *pr;
pr = l->data;
_edje_program_run(ed, pr, 0);
_edje_program_run(ed, pr, 0, sig, src);
if (_edje_block_break(ed))
{
if (tmps) free(tmps);
@ -767,7 +778,7 @@ _edje_emit(Edje *ed, char *sig, char *src)
#ifdef EDJE_PROGRAM_CACHE
matched++;
#endif
_edje_program_run(ed, pr, 0);
_edje_program_run(ed, pr, 0, ee->signal, ee->source);
if (_edje_block_break(ed))
{
#ifdef EDJE_PROGRAM_CACHE