From e8ef0d8bab959fc3a0dc636f428c8d4bfb29ef3b Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 7 Oct 2008 01:23:49 +0000 Subject: [PATCH] new elm api - more evas liek and evas/edje freindly. i can mvoe forward now. SVN revision: 36487 --- legacy/elementary/data/themes/default.edc | 22 +- legacy/elementary/src/bin/test.c | 1455 +++++++------------ legacy/elementary/src/lib/Elementary.h | 592 ++------ legacy/elementary/src/lib/Makefile.am | 20 +- legacy/elementary/src/lib/elm_bg.c | 115 +- legacy/elementary/src/lib/elm_box.c | 197 ++- legacy/elementary/src/lib/elm_button.c | 232 ++- legacy/elementary/src/lib/elm_clock.c | 514 +++---- legacy/elementary/src/lib/elm_contactlist.c | 120 -- legacy/elementary/src/lib/elm_frame.c | 80 + legacy/elementary/src/lib/elm_icon.c | 186 ++- legacy/elementary/src/lib/elm_label.c | 86 +- legacy/elementary/src/lib/elm_main.c | 2 + legacy/elementary/src/lib/elm_pad.c | 116 -- legacy/elementary/src/lib/elm_priv.h | 40 +- legacy/elementary/src/lib/elm_scroller.c | 136 +- legacy/elementary/src/lib/elm_table.c | 136 +- legacy/elementary/src/lib/elm_toggle.c | 308 ++-- legacy/elementary/src/lib/elm_widget.c | 695 +++++++-- legacy/elementary/src/lib/elm_win.c | 672 ++++++--- legacy/elementary/src/lib/els_box.c | 478 +++--- legacy/elementary/src/lib/els_box.h | 3 - legacy/elementary/src/lib/els_table.c | 289 ++-- legacy/elementary/src/lib/els_table.h | 5 - 24 files changed, 2939 insertions(+), 3560 deletions(-) delete mode 100644 legacy/elementary/src/lib/elm_pad.c diff --git a/legacy/elementary/data/themes/default.edc b/legacy/elementary/data/themes/default.edc index c8189b3260..04c90cfc5c 100644 --- a/legacy/elementary/data/themes/default.edc +++ b/legacy/elementary/data/themes/default.edc @@ -56,7 +56,7 @@ collections { } } } - part { name: "elm.swallow.contents"; + part { name: "elm.swallow.content"; type: SWALLOW; description { state: "default" 0.0; rel1.offset: 4 4; @@ -398,7 +398,7 @@ collections { image.normal: "bt_base1.png"; } } - part { name: "elm.swallow.contents"; + part { name: "elm.swallow.content"; type: SWALLOW; description { state: "default" 0.0; visible: 0; @@ -423,7 +423,7 @@ collections { scale: 1; description { state: "default" 0.0; visible: 0; - rel1.to_x: "elm.swallow.contents"; + rel1.to_x: "elm.swallow.content"; rel1.relative: 1.0 0.0; rel1.offset: 0 4; rel2.offset: -5 -5; @@ -501,13 +501,13 @@ collections { signal: "elm,state,icon,visible"; source: "elm"; action: STATE_SET "visible" 0.0; - target: "elm.swallow.contents"; + target: "elm.swallow.content"; } program { name: "icon_hide"; signal: "elm,state,icon,hidden"; source: "elm"; action: STATE_SET "default" 0.0; - target: "elm.swallow.contents"; + target: "elm.swallow.content"; } } } @@ -696,7 +696,7 @@ collections { } } } - part { name: "elm.swallow.contents"; + part { name: "elm.swallow.content"; type: SWALLOW; description { state: "default" 0.0; visible: 0; @@ -720,7 +720,7 @@ collections { scale: 1; description { state: "default" 0.0; visible: 0; - rel1.to_x: "elm.swallow.contents"; + rel1.to_x: "elm.swallow.content"; rel1.relative: 1.0 0.0; rel1.offset: 0 4; rel2.to_x: "bg"; @@ -790,13 +790,13 @@ collections { signal: "elm,state,icon,visible"; source: "elm"; action: STATE_SET "visible" 0.0; - target: "elm.swallow.contents"; + target: "elm.swallow.content"; } program { name: "icon_hide"; signal: "elm,state,icon,hidden"; source: "elm"; action: STATE_SET "default" 0.0; - target: "elm.swallow.contents"; + target: "elm.swallow.content"; } } } @@ -2141,7 +2141,7 @@ collections { image.normal: "bt_base1.png"; } } - part { name: "elm.swallow.contents"; + part { name: "elm.swallow.content"; type: SWALLOW; type: RECT; description { state: "default" 0.0; @@ -2162,7 +2162,7 @@ collections { scale: 1; description { state: "default" 0.0; align: 0.0 1.0; - rel1.to_x: "elm.swallow.contents"; + rel1.to_x: "elm.swallow.content"; rel1.relative: 1.0 1.0; rel1.offset: 0 -5; rel2.offset: -5 -5; diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index 3d85be552d..64d42fce0f 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -1,975 +1,589 @@ #include -/* This is a test app (that is also functional) to test the api and serve - * as an example - */ +// FIXME: add more explicit tests for: +// labels +// frames +// scroller + +static void my_win_del(void *data, Evas_Object *obj, void *event_info); +static void my_bt_1(void *data, Evas_Object *obj, void *event_info); +static void my_win_main(void); static void -on_win_resize(void *data, Elm_Win *win, Elm_Cb_Type type, void *info) +my_win_del(void *data, Evas_Object *obj, void *event_info) { - /* window is resized */ - printf("resize to: %ix%i\n", win->w, win->h); + /* called when my_win_main is requested to be deleted */ + elm_exit(); /* exit the program's main loop that runs in elm_run() */ } static void -on_win_del_req(void *data, Elm_Win *win, Elm_Cb_Type type, void *info) +my_bt_1(void *data, Evas_Object *obj, void *event_info) { - /* because autodel is on - after this callback the window will be deleted */ - /* but to be explicit - exit the app when window is closed */ - elm_exit(); -} - -static void -win_bg_simple(void) -{ - Elm_Win *win; - Elm_Bg *bg; - - win = elm_win_new(); /* create a window */ - win->name_set(win, "win_simple"); /* set the window name - used by window - * manager. make it uniqie for windows - * with in this application */ - win->title_set(win, "Simple Window with default Bg"); /* set the title */ - win->autodel = 0; /* dont auto delete the window if someone closes it. - * this means the del+req handler has to delete it. by - * default it is on */ - /* add a callback that is called when the user tries to close the window */ - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - /* add a callback that gets called when the window is resized */ - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - /* our window needs a baground, so ask for one - it will be set with a - * default bg */ - bg = elm_bg_new(win); - bg->show(bg); /* show the bg */ + Evas_Object *win, *bg; - win->size_req(win, NULL, 240, 320); /* request that the window is 240x240 - * no min/max size enforced */ - win->show(win); /* show the window */ + win = elm_win_add(NULL, "bg-plain", ELM_WIN_BASIC); + elm_win_title_set(win, "Bg Plain"); + elm_win_autodel_set(win, 1); + + bg = elm_bg_add(win); + /* allow bg to expand in x & y */ + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + /* set size hints. a minimum size for the bg. this should propagate back + * to the window thus limiting its size based off the bg as the bg is one + * of the window's resize objects. */ + evas_object_size_hint_min_set(bg, 160, 160); + /* and set a maximum size. not needed very often. normally used together + * with evas_object_size_hint_min_set() at the same size to make a + * window not resizable */ + evas_object_size_hint_max_set(bg, 640, 640); + /* and now just resize the window to a size you want. normally widgets + * will determine the initial size though */ + evas_object_resize(win, 320, 320); + /* and show the window */ + evas_object_show(win); } static void -win_bg_image(void) +my_bt_2(void *data, Evas_Object *obj, void *event_info) { - Elm_Win *win; - Elm_Bg *bg; + Evas_Object *win, *bg; char buf[PATH_MAX]; + + win = elm_win_add(NULL, "bg-image", ELM_WIN_BASIC); + elm_win_title_set(win, "Bg Image"); + elm_win_autodel_set(win, 1); - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with and image Bg"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - /* this is a test - shows how to have your own custom wallpaper in - * your app - don't use this unless you have a very good reason! there - * is a default and all apps look nicer sharing the default, but if - * you insist... */ + bg = elm_bg_add(win); snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", PACKAGE_DATA_DIR); - bg->file_set(bg, buf, NULL); /* set the bg - the NULL is for special - * files that contain multiple images - * inside 1 file. not normally used but - * might be if you have archive files with - * multiple images in them */ - bg->show(bg); - - win->size_req(win, NULL, 240, 240); - win->show(win); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); } static void -win_scrollable_label(void) +my_bt_3(void *data, Evas_Object *obj, void *event_info) { - Elm_Win *win; - Elm_Bg *bg; - Elm_Scroller *scroller; - Elm_Label *label; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with scroller and label inside"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->show(bg); - - scroller = elm_scroller_new(win); - - label = elm_label_new(win); - label->text_set(label, - "Hello world
" - "
" - "I am a label. I come here to temonstrate how to put
" - "text into a label, with newlines, even markup to test
" - "things like bold text where markup can be custom
" - "and extensible, defined by the theme's textbloxk style
" - "for the label.
" - "
" - "Note that the markup is html-like and things like newline
" - "chars and tab chars like stdout text are not valid text
" - "markup mechanisms. Use markup tags instead.
" - "
" - "Now we shall borrow some text from another test program
" - "(Expedite) to put some more tests in here
" - "
" - "Styled " - "text " - "should " - "go here " - "as it is " - "within " - "right tags " - "to make it align to the " - "right hand " - "side of " - "the textblock." - "
" - "now we need " - "to test some CO" - "LO" - "R Bla Rai" - " Stuff." - "
" - "Round about the cauldron go; " - "In the poison'd entrails throw.
" - "Toad, that under cold stone " - "Days and nights has thirty-one
" - "Swelter'd venom sleeping got, " - "Boil thou first i' the charmed pot.
" - "Double, double toil and trouble; " - "Fire burn, and cauldron bubble.
" - "Fillet of a fenny snake, " - "In the cauldron boil and bake;
" - "Eye of newt and toe of frog, " - "Wool of bat and tongue of dog,
" - "Adder's fork and blind-worm's sting, " - "Lizard's leg and owlet's wing,
" - "For a charm of powerful trouble, " - "Like a hell-broth boil and bubble.
" - "Double, double toil and trouble; " - "Fire burn and cauldron bubble.
" - "Scale of dragon, tooth of wolf, " - "Witches' mummy, maw and gulf
" - "Of the ravin'd salt-sea shark, " - "Root of hemlock digg'd i' the dark,
" - "Liver of blaspheming Jew, " - "Gall of goat, and slips of yew
" - "Silver'd in the moon's eclipse, " - "Nose of Turk and Tartar's lips,
" - "Finger of birth-strangled babe " - "Ditch-deliver'd by a drab,
" - "Make the gruel thick and slab: " - "Add thereto a tiger's chaudron,
" - "For the ingredients of our cauldron. " - "Double, double toil and trouble;
" - "Fire burn and cauldron bubble. " - "Cool it with a baboon's blood,
" - "Then the charm is firm and good.
" - "
" - "Heizölrückstoßabdämpfung fløde pingüino kilómetros cœur déçu l'âme
" - "plutôt naïve Louÿs rêva crapaüter Íosa Úrmhac Óighe pór Éava Ádhaim
" - ); - scroller->child_add(scroller, label); - label->show(label); - scroller->show(scroller); - - win->size_req(win, NULL, 240, 480); - win->show(win); -} - -static void -win_label_determines_min_size(void) -{ - Elm_Win *win; - Elm_Bg *bg; - Elm_Label *label; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with label setting minimum size"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->expand_x = 0; /* allows the window to grow in the y axis because */ - bg->expand_y = 1; /* its only child can expand in y */ - bg->show(bg); - - label = elm_label_new(win); - label->text_set(label, - "Hello world
" - "
" - "I am a label. I come here to temonstrate how to put
" - "text into a label, with newlines, even markup to test
" - "things like bold text where markup can be custom
" - "and extensible, defined by the theme's textbloxk style
" - "for the label.
" - "
" - "Note that the markup is html-like and things like newline
" - "chars and tab chars like stdout text are not valid text
" - "markup mechanisms. Use markup tags instead.
" - ); - label->show(label); - label->expand_x = 0; /* allows the window to grow in the y axis because */ - label->expand_y = 1; /* its only child can expand in y */ - /* why do i change expand on both bg and label? both are children of the - * window widget and thus both affect the window sizing. if any expands - * in an axis then window expanding is allowed always */ - elm_widget_sizing_update(label); /* make sure that the lable knows about its - * sizing changes like expand above */ - win->show(win); -} - -static void -win_box_vert_of_labels(void) -{ - Elm_Win *win; - Elm_Bg *bg; - Elm_Box *box; - Elm_Label *label; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with box + labels setting minimum size"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->expand_x = 1; - bg->expand_y = 1; - bg->show(bg); - - box = elm_box_new(win); - box->expand_x = 1; - box->expand_y = 1; - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 0/0, Fill X/Y 0/0, Align: 0.5 0.5"); - box->pack_end(box, label); - label->show(label); - label->align_x = 0.5; - label->align_y = 0.5; - label->expand_x = 0; - label->expand_y = 0; - label->fill_x = 0; - label->fill_y = 0; - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 1/1, Fill X/Y 0/0, Align: 0.5 0.5"); - box->pack_end(box, label); - label->show(label); - label->align_x = 0.5; - label->align_y = 0.5; - label->expand_x = 1; - label->expand_y = 1; - label->fill_x = 0; - label->fill_y = 0; - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 1/1, Fill X/Y 1/1, Align: 0.5 0.5"); - box->pack_end(box, label); - label->show(label); - label->align_x = 0.5; - label->align_y = 0.5; - label->expand_x = 1; - label->expand_y = 1; - label->fill_x = 1; - label->fill_y = 1; - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 0/0, Fill X/Y 1/1, Align: 0.5 0.5"); - box->pack_end(box, label); - label->show(label); - label->align_x = 0.5; - label->align_y = 0.5; - label->expand_x = 0; - label->expand_y = 0; - label->fill_x = 1; - label->fill_y = 1; - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 0/0, Fill X/Y 1/1, Align: 0.0 0.5"); - box->pack_end(box, label); - label->show(label); - label->align_x = 0.0; - label->align_y = 0.5; - label->expand_x = 0; - label->expand_y = 0; - label->fill_x = 1; - label->fill_y = 1; - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 0/0, Fill X/Y 1/1, Align: 1.0 0.5"); - box->pack_end(box, label); - label->show(label); - label->align_x = 1.0; - label->align_y = 0.5; - label->expand_x = 0; - label->expand_y = 0; - label->fill_x = 1; - label->fill_y = 1; - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 0/0, Fill X/Y 1/1, Align: 0.5 0.0"); - box->pack_end(box, label); - label->show(label); - label->align_x = 0.5; - label->align_y = 0.0; - label->expand_x = 0; - label->expand_y = 0; - label->fill_x = 1; - label->fill_y = 1; - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Expand X/Y 0/0, Fill X/Y 1/1, Align: 0.5 1.0"); - box->pack_end(box, label); - label->show(label); - label->align_x = 0.5; - label->align_y = 1.0; - label->expand_x = 0; - label->expand_y = 0; - label->fill_x = 1; - label->fill_y = 1; - elm_widget_sizing_update(label); - - elm_widget_sizing_update(box); - box->show(box); - - win->show(win); -} - -static void -win_scrollable_box_vert_of_labels(void) -{ - Elm_Win *win; - Elm_Bg *bg; - Elm_Scroller *scroller; - Elm_Box *box; - Elm_Label *label; - int i; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with scroller and box + labels inside"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->expand_x = 1; - bg->expand_y = 1; - bg->show(bg); - - scroller = elm_scroller_new(win); - - box = elm_box_new(win); - box->expand_x = 1; - box->expand_y = 1; - - for (i = 0; i < 40; i++) - { - char buf[200]; - - snprintf(buf, sizeof(buf), "This is a Label in a box, #%i", i); - label = elm_label_new(win); - label->text_set(label, buf); - box->pack_end(box, label); - label->show(label); - label->expand_x = 0; - label->expand_y = 0; - elm_widget_sizing_update(label); - label->show(label); - } - - scroller->child_add(scroller, box); - - elm_widget_sizing_update(box); - box->show(box); - - scroller->show(scroller); - - win->size_req(win, NULL, 240, 240); - win->show(win); -} - -static void -win_table_of_labels(void) -{ - Elm_Win *win; - Elm_Bg *bg; - Elm_Table *table; - Elm_Label *label; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with table + labels setting minimum size"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->expand_x = 1; - bg->expand_y = 1; - bg->show(bg); - - table = elm_table_new(win); - table->expand_x = 1; - table->expand_y = 1; - - label = elm_label_new(win); - label->text_set(label, "X"); - table->pack(table, label, 0, 0, 1, 1); - label->fill_x = 0; - label->fill_y = 0; - label->show(label); - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Y"); - table->pack(table, label, 1, 0, 1, 1); - label->fill_x = 0; - label->fill_y = 0; - label->show(label); - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "Z"); - table->pack(table, label, 2, 0, 1, 1); - label->fill_x = 0; - label->fill_y = 0; - label->show(label); - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "A"); - table->pack(table, label, 0, 1, 1, 1); - label->fill_x = 0; - label->fill_y = 0; - label->show(label); - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "BB"); - table->pack(table, label, 1, 1, 2, 1); - label->fill_x = 0; - label->fill_y = 0; - label->show(label); - elm_widget_sizing_update(label); - - label = elm_label_new(win); - label->text_set(label, "CCC"); - table->pack(table, label, 0, 2, 3, 1); - label->fill_x = 0; - label->fill_y = 0; - label->show(label); - elm_widget_sizing_update(label); - - elm_widget_sizing_update(table); - table->show(table); - - win->show(win); -} - -static void -on_button_activate(void *data, Elm_Button *bt, Elm_Cb_Type type, void *info) -{ - printf("Button %p activate\n", bt); -} - -static void -win_table_of_buttons(void) -{ - Elm_Win *win; - Elm_Bg *bg; - Elm_Icon *icon; - Elm_Table *table; - Elm_Button *button; + Evas_Object *win, *bg, *ic; char buf[PATH_MAX]; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with table + buttons setting minimum size"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->expand_x = 1; - bg->expand_y = 1; - bg->show(bg); - table = elm_table_new(win); - table->expand_x = 1; - table->expand_y = 1; + win = elm_win_add(NULL, "icon-transparent", ELM_WIN_BASIC); + elm_win_title_set(win, "Icon Transparent"); + elm_win_autodel_set(win, 1); + elm_win_alpha_set(win, 1); - button = elm_button_new(win); - button->text_set(button, "Button 1"); - table->pack(table, button, 0, 0, 1, 1); - button->fill_x = 0; - button->fill_y = 0; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + elm_win_resize_object_add(win, ic); + evas_object_show(ic); + + evas_object_show(win); +} - button = elm_button_new(win); - button->text_set(button, "Button 2"); - table->pack(table, button, 1, 0, 1, 1); - button->fill_x = 0; - button->fill_y = 0; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); +static void +my_bt_4(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *bx, *ic; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "box-vert", ELM_WIN_BASIC); + elm_win_title_set(win, "Box Vert"); + elm_win_autodel_set(win, 1); - button = elm_button_new(win); - button->text_set(button, "Button 3"); - table->pack(table, button, 2, 0, 1, 1); - button->fill_x = 0; - button->fill_y = 0; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, 1.0, 1.0); + evas_object_show(bx); - button = elm_button_new(win); - button->text_set(button, "Button 4"); - table->pack(table, button, 0, 1, 1, 1); - button->fill_x = 1; - button->fill_y = 0; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); - - button = elm_button_new(win); - icon = elm_icon_new(win); + ic = elm_icon_add(win); snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); - icon->file_set(icon, buf, NULL); - icon->scale_up = 0; - icon->layout_update(icon); - button->child_add(button, icon); - table->pack(table, button, 1, 1, 2, 1); - button->fill_x = 1; - button->fill_y = 1; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); - - button = elm_button_new(win); - button->text_set(button, "Button 6"); - icon = elm_icon_new(win); - snprintf(buf, sizeof(buf), "%s/images/logo.png", PACKAGE_DATA_DIR); - icon->file_set(icon, buf, NULL); - button->child_add(button, icon); - table->pack(table, button, 0, 2, 3, 1); - button->fill_x = 1; - button->fill_y = 1; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); - - elm_widget_sizing_update(table); - table->show(table); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); - win->show(win); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.0, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 1.0, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + evas_object_show(win); } static void -on_toggle_changed(void *data, Elm_Toggle *tg, Elm_Cb_Type type, void *info) +my_bt_5(void *data, Evas_Object *obj, void *event_info) { - printf("toggle: %i\n", tg->state); -} - -static void -win_box_vert_of_toggles(void) -{ - Elm_Win *win; - Elm_Bg *bg; - Elm_Box *box; - Elm_Toggle *toggle; - Elm_Icon *icon; + Evas_Object *win, *bg, *bx, *ic; char buf[PATH_MAX]; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with box + toggles setting min size"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->expand_x = 0; - bg->expand_y = 0; - bg->show(bg); - box = elm_box_new(win); - box->expand_x = 0; - box->expand_y = 0; + win = elm_win_add(NULL, "box-horiz", ELM_WIN_BASIC); + elm_win_title_set(win, "Box Horiz"); + elm_win_autodel_set(win, 1); - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Label ON/OFF"); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Icon + Label ON/OFF"); - icon = elm_icon_new(win); - snprintf(buf, sizeof(buf), "%s/images/logo.png", PACKAGE_DATA_DIR); - icon->file_set(icon, buf, NULL); - toggle->child_add(toggle, icon); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, NULL); - icon = elm_icon_new(win); - snprintf(buf, sizeof(buf), "%s/images/logo.png", PACKAGE_DATA_DIR); - icon->file_set(icon, buf, NULL); - toggle->child_add(toggle, icon); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Label Yes/No"); - toggle->states_text_set(toggle, "Yes", "No"); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - elm_widget_sizing_update(box); - box->show(box); + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + evas_object_show(bg); - win->show(win); + bx = elm_box_add(win); + elm_box_horizontal_set(bx, 1); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, 1.0, 1.0); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.0, 1.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + evas_object_show(win); } static void -win_scrollable_box_vert_of_toggles_and_buttons(void) +my_bt_6(void *data, Evas_Object *obj, void *event_info) { - Elm_Win *win; - Elm_Bg *bg; - Elm_Box *box; - Elm_Scroller *scroller; - Elm_Toggle *toggle; - Elm_Icon *icon; - Elm_Button *button; - Elm_Label *label; + Evas_Object *win, *bg, *bx, *ic, *bt; char buf[PATH_MAX]; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with scroller + box + toggles + buttons"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - bg->expand_x = 1; - bg->expand_y = 1; - bg->show(bg); - scroller = elm_scroller_new(win); + win = elm_win_add(NULL, "buttons", ELM_WIN_BASIC); + elm_win_title_set(win, "Buttons"); + elm_win_autodel_set(win, 1); - box = elm_box_new(win); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Label ON/OFF"); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Icon + Label ON/OFF"); - icon = elm_icon_new(win); - snprintf(buf, sizeof(buf), "%s/images/logo.png", PACKAGE_DATA_DIR); - icon->file_set(icon, buf, NULL); - toggle->child_add(toggle, icon); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, NULL); - icon = elm_icon_new(win); - snprintf(buf, sizeof(buf), "%s/images/logo.png", PACKAGE_DATA_DIR); - icon->file_set(icon, buf, NULL); - toggle->child_add(toggle, icon); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Label Yes/No"); - toggle->states_text_set(toggle, "Yes", "No"); - toggle->state = 1; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Toggle "); - toggle->states_text_set(toggle, "Up", "Down"); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Toggle "); - toggle->states_text_set(toggle, "In", "Out"); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Toggle "); - toggle->states_text_set(toggle, "Up", "Down"); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - label = elm_label_new(win); - label->text_set(label, - "Hello world
" - "
" - "I am a label. I come here to temonstrate how to put
" - "text into a label, with newlines, even markup to test
" - "things like bold text where markup can be custom
" - "and extensible, defined by the theme's textbloxk style
" - "for the label.
" - "
" - "Note that the markup is html-like and things like newline
" - "chars and tab chars like stdout text are not valid text
" - "markup mechanisms. Use markup tags instead.
" - ); - box->pack_end(box, label); - label->expand_y = 0; - label->fill_y = 0; - elm_widget_sizing_update(label); - label->show(label); + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + evas_object_show(bg); - button = elm_button_new(win); - button->text_set(button, "Button 1"); - box->pack_end(box, button); - button->expand_y = 0; - button->fill_y = 0; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); - - button = elm_button_new(win); - button->text_set(button, "Button 2"); - box->pack_end(box, button); - button->expand_y = 0; - button->fill_y = 0; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); - - button = elm_button_new(win); - button->text_set(button, "Button 3"); - box->pack_end(box, button); - button->expand_y = 0; - button->fill_y = 0; - button->show(button); - elm_widget_sizing_update(button); - button->cb_add(button, ELM_CB_ACTIVATED, on_button_activate, NULL); - - scroller->child_add(scroller, box); - - elm_widget_sizing_update(box); - box->show(box); - - scroller->show(scroller); + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, 1.0, 1.0); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); - win->size_req(win, NULL, 400, 320); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_button_label_set(bt, "Icon sized to button"); + elm_button_icon_set(bt, ic); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); - win->show(win); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + bt = elm_button_add(win); + elm_button_label_set(bt, "Icon no scale"); + elm_button_icon_set(bt, ic); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Label Only"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + bt = elm_button_add(win); + elm_button_icon_set(bt, ic); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + evas_object_show(win); } static void -on_clock_changed(void *data, Elm_Clock *cloc, Elm_Cb_Type type, void *info) +my_bt_7(void *data, Evas_Object *obj, void *event_info) { - printf("clock: %i:%i:%i\n", cloc->hrs, cloc->min, cloc->sec); -} - -static void -win_box_vert_of_clock_and_toggles(void) -{ - Elm_Win *win; - Elm_Bg *bg; - Elm_Box *box; - Elm_Toggle *toggle; - Elm_Clock *cloc; - Elm_Pad *pad; - Elm_Frame *frame; + Evas_Object *win, *bg, *bx, *ic, *tg; char buf[PATH_MAX]; - - win = elm_win_new(); - win->name_set(win, "win_bg"); - win->title_set(win, "Simple Window with box + toggles setting min size"); - win->autodel = 0; - win->cb_add(win, ELM_CB_DEL_REQ, on_win_del_req, NULL); - win->cb_add(win, ELM_CB_RESIZE, on_win_resize, NULL); - - bg = elm_bg_new(win); - snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", PACKAGE_DATA_DIR); - bg->file_set(bg, buf, NULL); - bg->expand_x = 0; - bg->expand_y = 0; - bg->show(bg); - pad = elm_pad_new(win); - pad->expand_x = 0; - pad->expand_y = 0; - pad->show(pad); + win = elm_win_add(NULL, "toggles", ELM_WIN_BASIC); + elm_win_title_set(win, "Toggles"); + elm_win_autodel_set(win, 1); - frame = elm_frame_new(win); - pad->child_add(pad, frame); - frame->text_set(frame, "Time"); - frame->expand_x = 0; - frame->expand_y = 0; - frame->show(frame); -/* - pad = elm_pad_new(win); - frame->child_add(frame, pad); - pad->expand_x = 0; - pad->expand_y = 0; - pad->show(pad); -*/ - box = elm_box_new(win); -// pad->child_add(pad, box); - frame->child_add(frame, box); - box->expand_x = 0; - box->expand_y = 0; - - toggle = elm_toggle_new(win); - toggle->text_set(toggle, "Alarm"); - toggle->states_text_set(toggle, "ON", "OFF"); - toggle->state = 0; - toggle->layout_update(toggle); - toggle->cb_add(toggle, ELM_CB_CHANGED, on_toggle_changed, NULL); - box->pack_end(box, toggle); - toggle->show(toggle); - toggle->expand_y = 0; - toggle->fill_y = 0; - elm_widget_sizing_update(toggle); - - cloc = elm_clock_new(win); - cloc->expand_x = 0; - cloc->fill_x = 0; - cloc->edit = 1; - cloc->hrs = 6; - cloc->min = 54; - cloc->sec = 32; - cloc->time_update(cloc); - cloc->cb_add(cloc, ELM_CB_CHANGED, on_clock_changed, NULL); - box->pack_end(box, cloc); - elm_widget_sizing_update(cloc); - cloc->show(cloc); + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + evas_object_show(bg); - cloc = elm_clock_new(win); - cloc->expand_x = 0; - cloc->fill_x = 0; - box->pack_end(box, cloc); - elm_widget_sizing_update(cloc); - cloc->show(cloc); - - cloc = elm_clock_new(win); - cloc->am_pm = 0; - cloc->seconds = 1; - cloc->time_update(cloc); - cloc->expand_x = 0; - cloc->fill_x = 0; - box->pack_end(box, cloc); - elm_widget_sizing_update(cloc); - cloc->show(cloc); - - cloc = elm_clock_new(win); - cloc->am_pm = 0; - cloc->seconds = 0; - cloc->time_update(cloc); - cloc->expand_x = 0; - cloc->fill_x = 0; - box->pack_end(box, cloc); - elm_widget_sizing_update(cloc); - cloc->show(cloc); + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, 1.0, 1.0); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); -/* - cloc = elm_clock_new(win); - cloc->am_pm = 1; - cloc->seconds = 0; - cloc->time_update(cloc); - cloc->expand_x = 0; - cloc->fill_x = 0; - box->pack_end(box, cloc); - elm_widget_sizing_update(cloc); - cloc->show(cloc); - */ + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + tg = elm_toggle_add(win); + elm_toggle_label_set(tg, "Icon sized to toggle"); + elm_toggle_icon_set(tg, ic); + elm_toggle_state_set(tg, 1); + elm_toggle_states_labels_set(tg, "Yes", "No"); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); - elm_widget_sizing_update(box); - box->show(box); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + tg = elm_toggle_add(win); + elm_toggle_label_set(tg, "Icon no scale"); + elm_toggle_icon_set(tg, ic); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + tg = elm_toggle_add(win); + elm_toggle_label_set(tg, "Label Only"); + elm_toggle_states_labels_set(tg, "Big", "Small"); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + tg = elm_toggle_add(win); + elm_toggle_icon_set(tg, ic); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + evas_object_show(win); +} - win->show(win); +static void +my_bt_8(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *tb, *bt; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "table", ELM_WIN_BASIC); + elm_win_title_set(win, "Table"); + elm_win_autodel_set(win, 1); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, 1.0, 1.0); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + elm_table_pack(tb, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Button 4"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + elm_table_pack(tb, bt, 0, 1, 2, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Button 5"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + elm_table_pack(tb, bt, 2, 1, 1, 3); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Button 6"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + elm_table_pack(tb, bt, 0, 2, 2, 2); + evas_object_show(bt); + + evas_object_show(win); +} + +static void +my_bt_9(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win, *bg, *bx, *ck; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "clock", ELM_WIN_BASIC); + elm_win_title_set(win, "Clock"); + elm_win_autodel_set(win, 1); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, 1.0, 1.0); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ck = elm_clock_add(win); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_am_pm_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_clock_show_am_pm_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_edit_set(ck, 1); + elm_clock_show_seconds_set(ck, 1); + elm_clock_show_am_pm_set(ck, 1); + elm_clock_time_set(ck, 10, 11, 12); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + evas_object_show(win); +} + +static void +my_win_main(void) +{ + Evas_Object *win, *bg, *bx0, *lb, *bx, *bt, *sc, *fr; + + /* 1 create an elm window - it returns an evas object. this is a little + * special as the object lives in the canvas that is inside the window + * so what is returned is really inside the window, but as you manipulate + * the evas object returned - the window will respond. elm_win makes sure + * of that so you can blindly treat it like any other evas object + * pretty much, just as long as you know it has special significance */ + /* the first parameter is a "parent" window - eg for a dialog you want to + * have a main window it is related to, here it is NULL meaning there + * is no parent. "main" is the name of the window - used by the window + * manager for identifying the window uniquely amongst all the windows + * within this application (and all instances of the application). the + * type is a basic window (the final parameter) */ + win = elm_win_add(NULL, "main", ELM_WIN_BASIC); + /* set the title of the window - this is in the titlebar */ + elm_win_title_set(win, "Elementary Tests"); + + /* set a callback on the window when "delete-request" is emitted as + * a callback. when this happens my_win_del() is called and the + * data pointer (first param) is passed the final param here (in this + * case it is NULL). This is how you can pass specific things to a + * callback like objects or data layered on top */ + evas_object_smart_callback_add(win, "delete-request", my_win_del, NULL); + + /* add a background to our window. this just uses the standard theme set + * background. without a backgorund, you could make a window seem + * transparent with elm_win_alpha_set(win, 1); for example. if you have + * a compositor running this will make the window able to be + * semi-transparent and any space not filled by object/widget pixels will + * be transparent or translucent based on alpha. if you do not have a + * comnpositor running this should fall back to using shaped windows + * (which have a mask). both these features will be slow and rely on + * a lot more resources, so only use it if you need it. */ + bg = elm_bg_add(win); + /* set weight to 1.0 x 1.0 == expand in both x and y direction */ + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + /* tell the window that this object is to be resized along with the window. + * also as a result this object will be one of several objects that + * controls the minimum/maximum size of the window */ + elm_win_resize_object_add(win, bg); + /* and show the background */ + evas_object_show(bg); + + /* add a box layout widget to the window */ + bx0 = elm_box_add(win); + /* allow base box (bx0) to expand in x and y */ + evas_object_size_hint_weight_set(bx0, 1.0, 1.0); + /* tell the window that the box affects window size and also will be + * resized when the window is */ + elm_win_resize_object_add(win, bx0); + evas_object_show(bx0); + + fr = elm_frame_add(win); + elm_frame_label_set(fr, "Information"); + elm_box_pack_end(bx0, fr); + evas_object_show(fr); + + lb = elm_label_add(win); + elm_label_label_set(lb, + "Please slect a test from the list below
" + "by clicking the test button to show the
" + "test window."); + elm_frame_content_set(fr, lb); + evas_object_show(lb); + + /* add a scroller object - anything inside is scrollable */ + sc = elm_scroller_add(win); + /* add scroller to main box */ + evas_object_size_hint_weight_set(sc, 1.0, 1.0); + evas_object_size_hint_align_set(sc, -1.0, -1.0); + elm_box_pack_end(bx0, sc); + evas_object_show(sc); + + /* add a box layout widget to the window */ + bx = elm_box_add(win); + /* set weight to 1.0 x 1.0 == expand in x and y) */ + evas_object_size_hint_weight_set(bx, 1.0, 0.0); + + /* set the box ad the child int he scrolled view*/ + elm_scroller_child_set(sc, bx); + /* show the box, scroller and main box */ + evas_object_show(bx); + + /* create a button */ + bt = elm_button_add(win); + /* set the button label */ + elm_button_label_set(bt, "Bg Plain"); + /* add a callback to be run when the button is clicked */ + evas_object_smart_callback_add(bt, "clicked", my_bt_1, NULL); + /* the button should fill any space it is given horizontally */ + evas_object_size_hint_align_set(bt, -1.0, 0.0); + /* put the button at the end of the box */ + elm_box_pack_end(bx, bt); + /* show the button */ + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Bg Image"); + evas_object_smart_callback_add(bt, "clicked", my_bt_2, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Icon Transparent"); + evas_object_smart_callback_add(bt, "clicked", my_bt_3, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Box Vert"); + evas_object_smart_callback_add(bt, "clicked", my_bt_4, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Box Horiz"); + evas_object_smart_callback_add(bt, "clicked", my_bt_5, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Buttons"); + evas_object_smart_callback_add(bt, "clicked", my_bt_6, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Toggles"); + evas_object_smart_callback_add(bt, "clicked", my_bt_7, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Table"); + evas_object_smart_callback_add(bt, "clicked", my_bt_8, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_button_label_set(bt, "Clock"); + evas_object_smart_callback_add(bt, "clicked", my_bt_9, NULL); + evas_object_size_hint_align_set(bt, -1.0, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + /* set an initial window size */ + evas_object_resize(win, 320, 320); + /* show the window */ + evas_object_show(win); } int @@ -979,18 +593,7 @@ main(int argc, char **argv) * types, enums and macros will be Elm_ and ELM_ etc.) */ elm_init(argc, argv); - /* setup some windows with test widgets in them */ - win_bg_simple(); - win_bg_image(); - win_scrollable_label(); - win_label_determines_min_size(); - win_box_vert_of_labels(); - win_scrollable_box_vert_of_labels(); - win_table_of_labels(); - win_table_of_buttons(); - win_box_vert_of_toggles(); - win_scrollable_box_vert_of_toggles_and_buttons(); - win_box_vert_of_clock_and_toggles(); + my_win_main(); elm_run(); /* and run the program now and handle all events etc. */ diff --git a/legacy/elementary/src/lib/Elementary.h b/legacy/elementary/src/lib/Elementary.h index c4f92c139d..edb6291fa8 100644 --- a/legacy/elementary/src/lib/Elementary.h +++ b/legacy/elementary/src/lib/Elementary.h @@ -61,519 +61,107 @@ extern "C" { #endif -// FIXME: need to be able to enable/disable widgets -// FIXME: need to determine scale from dpi - /* Types here */ - typedef enum _Elm_Obj_Type - { - ELM_OBJ_OBJ, - ELM_OBJ_CB, - ELM_OBJ_WIDGET, - ELM_OBJ_WIN, - ELM_OBJ_BG, - ELM_OBJ_SCROLLER, - ELM_OBJ_LABEL, - ELM_OBJ_BOX, - ELM_OBJ_TABLE, - ELM_OBJ_BUTTON, - ELM_OBJ_ICON, - ELM_OBJ_TOGGLE, - ELM_OBJ_CLOCK, - ELM_OBJ_FRAME, - ELM_OBJ_PAD, - ELM_OBJ_CONTACTLIST -// ELM_OBJ_CHECK, // FIXME: do -// ELM_OBJ_RADIO, // FIXME: do -// ELM_OBJ_SEP, // FIXME: do (separator horiz or vert) -// ELM_OBJ_EXPANDER // FIXME: do (like a paned but slides open/closed) -// ELM_OBJ_SPIN, // FIXME: do -// ELM_OBJ_SLIDER, // FIXME: do -// ELM_OBJ_ENTRY, // FIXME: do -// ELM_OBJ_EDITOR, // FIXME: do -// ELM_OBJ_LISTITEM, // FIXME: do -// ELM_OBJ_BUSY, // FIXME: do -// // FIXME: list more widgets to do here like: -// // CONTACT, SELECTOR, FILES, PREVIEW, SIGNALINFO, CALLINFO, -// // CELLEDIT (csv - maybe later xls or some other cell format), -// // COLORSEL, TACHO ... -// -// wrap other basic ecore things: -// ELM_OBJ_TIMER, -// ELM_OBJ_ANIMATOR, -// ELM_OBJ_JOB, - } Elm_Obj_Type; - - typedef enum _Elm_Cb_Type - { - ELM_CB_DEL, - ELM_CB_CHILD_ADD, - ELM_CB_CHILD_DEL, - ELM_CB_UNPARENT, - ELM_CB_PARENT, - ELM_CB_DEL_REQ, - ELM_CB_RESIZE, - ELM_CB_CHANGED, - ELM_CB_ACTIVATED - } Elm_Cb_Type; - +/**************************************************************************/ + /* Objects */ typedef enum _Elm_Win_Type { ELM_WIN_BASIC, ELM_WIN_DIALOG_BASIC } Elm_Win_Type; - typedef struct _Elm_Obj_Class Elm_Obj_Class; - typedef struct _Elm_Obj Elm_Obj; - typedef struct _Elm_Cb_Class Elm_Cb_Class; - typedef struct _Elm_Cb Elm_Cb; - typedef struct _Elm_Win_Class Elm_Win_Class; - typedef struct _Elm_Win Elm_Win; - typedef struct _Elm_Widget_Class Elm_Widget_Class; - typedef struct _Elm_Widget Elm_Widget; - typedef struct _Elm_Bg_Class Elm_Bg_Class; - typedef struct _Elm_Bg Elm_Bg; - typedef struct _Elm_Scroller_Class Elm_Scroller_Class; - typedef struct _Elm_Scroller Elm_Scroller; - typedef struct _Elm_Label_Class Elm_Label_Class; - typedef struct _Elm_Label Elm_Label; - typedef struct _Elm_Box_Class Elm_Box_Class; - typedef struct _Elm_Box Elm_Box; - typedef struct _Elm_Table_Class Elm_Table_Class; - typedef struct _Elm_Table Elm_Table; - typedef struct _Elm_Button_Class Elm_Button_Class; - typedef struct _Elm_Button Elm_Button; - typedef struct _Elm_Icon_Class Elm_Icon_Class; - typedef struct _Elm_Icon Elm_Icon; - typedef struct _Elm_Toggle_Class Elm_Toggle_Class; - typedef struct _Elm_Toggle Elm_Toggle; - typedef struct _Elm_Clock_Class Elm_Clock_Class; - typedef struct _Elm_Clock Elm_Clock; - typedef struct _Elm_Frame_Class Elm_Frame_Class; - typedef struct _Elm_Frame Elm_Frame; - typedef struct _Elm_Pad_Class Elm_Pad_Class; - typedef struct _Elm_Pad Elm_Pad; - typedef struct _Elm_Contactlist_Class Elm_Contactlist_Class; - typedef struct _Elm_Contactlist Elm_Contactlist; - - typedef void (*Elm_Cb_Func) (void *data, Elm_Obj *obj, Elm_Cb_Type type, void *info); - - /* API calls here */ - /**************************************************************************/ /* General calls */ - EAPI void elm_init(int argc, char **argv); - EAPI void elm_shutdown(void); - EAPI void elm_run(void); - EAPI void elm_exit(void); + EAPI void elm_init(int argc, char **argv); + EAPI void elm_shutdown(void); + EAPI void elm_run(void); + EAPI void elm_exit(void); + + EAPI Evas_Object *elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type); + EAPI void elm_win_resize_object_add(Evas_Object *obj, Evas_Object *subobj); + EAPI void elm_win_resize_object_del(Evas_Object *obj, Evas_Object *subobj); + EAPI void elm_win_title_set(Evas_Object *obj, const char *title); + EAPI void elm_win_autodel_set(Evas_Object *obj, Evas_Bool autodel); + EAPI void elm_win_activate(Evas_Object *obj); + EAPI void elm_win_borderless_set(Evas_Object *obj, Evas_Bool borderless); + EAPI void elm_win_shaped_set(Evas_Object *obj, Evas_Bool shaped); + EAPI void elm_win_alpha_set(Evas_Object *obj, Evas_Bool alpha); + EAPI void elm_win_override_set(Evas_Object *obj, Evas_Bool override); +// FIXME: implement more of the above calls + /* smart callbacks elm_win objects will call: + * "delete-request" - the user requested to delete the window + */ -/**************************************************************************/ - /* Generic Elm Object */ -#define Elm_Obj_Class_Methods \ - void (*del) (Elm_Obj *obj); \ - void (*ref) (Elm_Obj *obj); \ - void (*unref) (Elm_Obj *obj); \ - Elm_Cb *(*cb_add) (Elm_Obj *obj, Elm_Cb_Type type, Elm_Cb_Func func, void *data); \ - void (*child_add) (Elm_Obj *obj, Elm_Obj *child); \ - void (*unparent) (Elm_Obj *obj); \ - int (*hastype) (Elm_Obj *obj, Elm_Obj_Type type) -#define Elm_Obj_Class_All Elm_Obj_Class_Methods; \ - Elm_Obj_Type type; \ - void *clas; /* the obj class and parent classes */ \ - Elm_Obj *parent; \ - Evas_List *children; \ - Evas_List *cbs; \ - int refs; \ - unsigned char delete_me : 1; \ - unsigned char delete_deferred : 1 - - struct _Elm_Obj_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Obj_Class_Methods; - }; - struct _Elm_Obj - { - Elm_Obj_Class_All; - }; -#define ELM_OBJ(o) ((Elm_Obj *)o) - -/**************************************************************************/ - /* Callback Object */ -#define Elm_Cb_Class_Methods -#define Elm_Cb_Class_All Elm_Obj_Class_All; Elm_Cb_Class_Methods; \ - Elm_Cb_Class_Methods; \ - Elm_Cb_Type cb_type; \ - Elm_Cb_Func func; \ - void *data; - struct _Elm_Cb_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Cb_Class_Methods; - }; - struct _Elm_Cb - { - Elm_Cb_Class_All; - }; + EAPI Evas_Object *elm_bg_add(Evas_Object *parent); + EAPI void elm_bg_file_set(Evas_Object *obj, const char *file, const char *group); + /* smart callbacks elm_win objects will call: + */ -/**************************************************************************/ - /* Widget Object */ -#define Elm_Widget_Class_Methods \ - void (*geom_set) (Elm_Widget *wid, int x, int y, int w, int h); \ - void (*show) (Elm_Widget *wid); \ - void (*hide) (Elm_Widget *wid); \ - void (*size_alloc) (Elm_Widget *wid, int w, int h); \ - void (*size_req) (Elm_Widget *wid, Elm_Widget *child, int w, int h); \ - void (*above) (Elm_Widget *wid, Elm_Widget *above); \ - void (*below) (Elm_Widget *wid, Elm_Widget *below) + EAPI Evas_Object *elm_icon_add(Evas_Object *parent); + EAPI void elm_icon_file_set(Evas_Object *obj, const char *file, const char *group); + EAPI void elm_icon_smooth_set(Evas_Object *obj, Evas_Bool smooth); + EAPI void elm_icon_no_scale_set(Evas_Object *obj, Evas_Bool no_scale); + EAPI void elm_icon_scale_set(Evas_Object *obj, Evas_Bool scale_up, Evas_Bool scale_down); + EAPI void elm_icon_fill_outside_set(Evas_Object *obj, Evas_Bool fill_outside); + /* smart callbacks elm_win objects will call: + */ + + EAPI Evas_Object *elm_box_add(Evas_Object *parent); + EAPI void elm_box_horizontal_set(Evas_Object *obj, Evas_Bool horizontal); + EAPI void elm_box_homogenous_set(Evas_Object *obj, Evas_Bool homogenous); + EAPI void elm_box_pack_start(Evas_Object *obj, Evas_Object *subobj); + EAPI void elm_box_pack_end(Evas_Object *obj, Evas_Object *subobj); + EAPI void elm_box_pack_before(Evas_Object *obj, Evas_Object *subobj, Evas_Object *before); + EAPI void elm_box_pack_after(Evas_Object *obj, Evas_Object *subobj, Evas_Object *after); + /* smart callbacks elm_win objects will call: + */ -#define Elm_Widget_Class_All Elm_Obj_Class_All; Elm_Widget_Class_Methods; \ - int x, y, w, h; \ - struct { int w, h; } req; \ - Evas_Object *base; \ - double align_x, align_y; \ - unsigned char expand_x : 1; \ - unsigned char expand_y : 1; \ - unsigned char fill_x : 1; \ - unsigned char fill_y : 1 + EAPI Evas_Object *elm_button_add(Evas_Object *parent); + EAPI void elm_button_label_set(Evas_Object *obj, const char *label); + EAPI void elm_button_icon_set(Evas_Object *obj, Evas_Object *icon); + /* smart callbacks elm_win objects will call: + * "clicked" - the user clicked the button + */ - /* Object specific ones */ - // FIXME: should this be a function or widget method call? - EAPI void elm_widget_sizing_update(Elm_Widget *wid); - struct _Elm_Widget_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Widget_Class_Methods; - }; - struct _Elm_Widget - { - Elm_Widget_Class_All; - }; - -#ifdef __cplusplus -} -#endif - -/**************************************************************************/ - /* Window Object */ -#define Elm_Win_Class_Methods \ - void (*name_set) (Elm_Win *win, const char *name); \ - void (*title_set) (Elm_Win *win, const char *title) -// FIXME: -// cover methods & state for: -// type, fullscreen, icon, activate, shaped, alpha, borderless, iconified, -// setting parent window (for dialogs) -#define Elm_Win_Class_All Elm_Widget_Class_All; Elm_Win_Class_Methods; \ - Elm_Win_Type win_type; \ - const char *name; \ - const char *title; \ - unsigned char autodel : 1 - - /* Object specific ones */ - EAPI Elm_Win *elm_win_new(void); - struct _Elm_Win_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Win_Class_Methods; - }; - struct _Elm_Win - { - Elm_Win_Class_All; - - Ecore_Evas *ee; /* private */ - Evas *evas; /* private */ - Ecore_X_Window xwin; /* private */ - Ecore_Job *deferred_resize_job; /* private */ - Ecore_Job *deferred_child_eval_job; /* private */ - unsigned char showme : 1; /* private */ - }; - -/**************************************************************************/ - /* Background Object */ -#define Elm_Bg_Class_Methods \ - void (*file_set) (Elm_Bg *bg, const char *file, const char *group); -#define Elm_Bg_Class_All Elm_Widget_Class_All; Elm_Bg_Class_Methods; \ - const char *file; \ - const char *group - - /* Object specific ones */ - EAPI Elm_Bg *elm_bg_new(Elm_Win *win); - struct _Elm_Bg_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Bg_Class_Methods; - }; - struct _Elm_Bg - { - Elm_Bg_Class_All; - - Evas_Object *custom_bg; - }; - -/**************************************************************************/ - /* Scroller (scrollframe/scrolledview) Object */ -#define Elm_Scroller_Class_Methods -#define Elm_Scroller_Class_All Elm_Widget_Class_All; Elm_Scroller_Class_Methods; - - /* Object specific ones */ - EAPI Elm_Scroller *elm_scroller_new(Elm_Win *win); - struct _Elm_Scroller_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Scroller_Class_Methods; - }; - struct _Elm_Scroller - { - Elm_Scroller_Class_All; - - Evas_Object *scroller_pan; - }; - -/**************************************************************************/ - /* Label Object */ -#define Elm_Label_Class_Methods \ - void (*text_set) (Elm_Label *lb, const char *text) -#define Elm_Label_Class_All Elm_Widget_Class_All; Elm_Label_Class_Methods; \ - const char *text; \ - int minw, minh - - /* Object specific ones */ - EAPI Elm_Label *elm_label_new(Elm_Win *win); - struct _Elm_Label_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Label_Class_Methods; - }; - struct _Elm_Label - { - Elm_Label_Class_All; - }; - -/**************************************************************************/ - /* Box Object */ -#define Elm_Box_Class_Methods \ - void (*layout_update) (Elm_Box *bx); \ - void (*pack_start) (Elm_Box *bx, Elm_Widget *wid); \ - void (*pack_end) (Elm_Box *bx, Elm_Widget *wid); \ - void (*pack_before) (Elm_Box *bx, Elm_Widget *wid, Elm_Widget *wid_before); \ - void (*pack_after) (Elm_Box *bx, Elm_Widget *wid, Elm_Widget *wid_after); - -#define Elm_Box_Class_All Elm_Widget_Class_All; Elm_Box_Class_Methods; \ - unsigned char horizontal : 1; \ - unsigned char homogenous : 1 - - /* Object specific ones */ - EAPI Elm_Box *elm_box_new(Elm_Win *win); - struct _Elm_Box_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Box_Class_Methods; - }; - struct _Elm_Box - { - Elm_Box_Class_All; - }; - -/**************************************************************************/ - /* Table Object */ -#define Elm_Table_Class_Methods \ - void (*layout_update) (Elm_Table *tb); \ - void (*pack) (Elm_Table *tb, Elm_Widget *wid, int x, int y, int w, int h) -#define Elm_Table_Class_All Elm_Widget_Class_All; Elm_Table_Class_Methods; \ - unsigned char homogenous : 1 - - /* Object specific ones */ - EAPI Elm_Table *elm_table_new(Elm_Win *win); - struct _Elm_Table_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Table_Class_Methods; - }; - struct _Elm_Table - { - Elm_Table_Class_All; - }; - -/**************************************************************************/ - /* Button Object */ -#define Elm_Button_Class_Methods \ - void (*text_set) (Elm_Button *bt, const char *text) -#define Elm_Button_Class_All Elm_Widget_Class_All; Elm_Button_Class_Methods; \ - const char *text; \ - int minw, minh - - /* Object specific ones */ - EAPI Elm_Button *elm_button_new(Elm_Win *win); - struct _Elm_Button_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Button_Class_Methods; - }; - struct _Elm_Button - { - Elm_Button_Class_All; - }; - -/**************************************************************************/ - /* Icon Object */ -#define Elm_Icon_Class_Methods \ - void (*file_set) (Elm_Icon *icon, const char *file, const char *group); \ - void (*layout_update) (Elm_Icon *icon) -#define Elm_Icon_Class_All Elm_Widget_Class_All; Elm_Icon_Class_Methods; \ - unsigned char scale_up : 1; \ - unsigned char scale_down : 1; \ - unsigned char fill_outside : 1; \ - unsigned char smooth : 1; \ - unsigned char no_scale : 1; \ - const char *file; \ - const char *group - - /* Object specific ones */ - EAPI Elm_Icon *elm_icon_new(Elm_Win *win); - struct _Elm_Icon_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Icon_Class_Methods; - }; - struct _Elm_Icon - { - Elm_Icon_Class_All; - }; - -/**************************************************************************/ - /* Toggle Object */ -#define Elm_Toggle_Class_Methods \ - void (*text_set) (Elm_Toggle *tg, const char *text); \ - void (*layout_update) (Elm_Toggle *tg); \ - void (*states_text_set) (Elm_Toggle *tg, const char *ontext, const char *offtext) -#define Elm_Toggle_Class_All Elm_Widget_Class_All; Elm_Toggle_Class_Methods; \ - const char *text; \ - int minw, minh; \ - int state; \ - int *state_ptr - - /* Object specific ones */ - EAPI Elm_Toggle *elm_toggle_new(Elm_Win *win); - struct _Elm_Toggle_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Toggle_Class_Methods; - }; - struct _Elm_Toggle - { - Elm_Toggle_Class_All; - }; - -/**************************************************************************/ - /* Clock Object */ -#define Elm_Clock_Class_Methods \ - void (*time_update) (Elm_Clock *ck) -#define Elm_Clock_Class_All Elm_Widget_Class_All; Elm_Clock_Class_Methods; \ - int hrs, min, sec; \ - int minw, minh; \ - unsigned char seconds : 1; \ - unsigned char am_pm : 1; \ - unsigned char edit : 1 - - /* Object specific ones */ - EAPI Elm_Clock *elm_clock_new(Elm_Win *win); - struct _Elm_Clock_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Clock_Class_Methods; - }; - struct _Elm_Clock - { - Elm_Clock_Class_All; - - Evas_Object *digit[6]; - Evas_Object *ampm; - Ecore_Timer *ticker; - struct { - int hrs, min, sec; - char ampm; - char seconds; - char am_pm; - char edit; - } cur; - }; - -/**************************************************************************/ - /* Frame Object */ -#define Elm_Frame_Class_Methods \ - void (*text_set) (Elm_Frame *fr, const char *text) -#define Elm_Frame_Class_All Elm_Widget_Class_All; Elm_Frame_Class_Methods; \ - const char *text; \ - int minw, minh - - /* Object specific ones */ - EAPI Elm_Frame *elm_frame_new(Elm_Win *win); - struct _Elm_Frame_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Frame_Class_Methods; - }; - struct _Elm_Frame - { - Elm_Frame_Class_All; - }; - -/**************************************************************************/ - /* Pad Object */ -#define Elm_Pad_Class_Methods -#define Elm_Pad_Class_All Elm_Widget_Class_All; Elm_Pad_Class_Methods; \ - int minw, minh - - /* Object specific ones */ - EAPI Elm_Pad *elm_pad_new(Elm_Win *win); - struct _Elm_Pad_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Pad_Class_Methods; - }; - struct _Elm_Pad - { - Elm_Pad_Class_All; - }; - -/**************************************************************************/ - /* Contactlist Object */ -#define Elm_Contactlist_Class_Methods \ - void (*file_set) (Elm_Contactlist *cl, const char *file, const char *group); -#define Elm_Contactlist_Class_All Elm_Widget_Class_All; Elm_Contactlist_Class_Methods; \ - const char *file; \ - const char *group - - /* Object specific ones */ - EAPI Elm_Contactlist *elm_contactlist_new(Elm_Win *win); - struct _Elm_Contactlist_Class - { - void *parent; - Elm_Obj_Type type; - Elm_Contactlist_Class_Methods; - }; - struct _Elm_Contactlist - { - Elm_Contactlist_Class_All; - - Elm_Box *box; - Elm_Scroller *scroller; - Elm_Button *button; - Elm_Box *listbox; - }; + EAPI Evas_Object *elm_scroller_add(Evas_Object *parent); + EAPI void elm_scroller_child_set(Evas_Object *obj, Evas_Object *child); + /* smart callbacks elm_win objects will call: + */ + + EAPI Evas_Object *elm_label_add(Evas_Object *parent); + EAPI void elm_label_label_set(Evas_Object *obj, const char *label); + /* smart callbacks elm_win objects will call: + */ + + EAPI Evas_Object *elm_toggle_add(Evas_Object *parent); + EAPI void elm_toggle_label_set(Evas_Object *obj, const char *label); + EAPI void elm_toggle_icon_set(Evas_Object *obj, Evas_Object *icon); + EAPI void elm_toggle_states_labels_set(Evas_Object *obj, const char *onlabel, const char *offlabel); + EAPI void elm_toggle_state_set(Evas_Object *obj, Evas_Bool state); + EAPI void elm_toggle_state_pointer_set(Evas_Object *obj, Evas_Bool *statep); + /* smart callbacks elm_win objects will call: + * "changed" - the user toggled the state + */ + EAPI Evas_Object *elm_frame_add(Evas_Object *parent); + EAPI void elm_frame_label_set(Evas_Object *obj, const char *label); + EAPI void elm_frame_content_set(Evas_Object *obj, Evas_Object *content); + /* smart callbacks elm_win objects will call: + */ + + EAPI Evas_Object *elm_table_add(Evas_Object *parent); + EAPI void elm_table_homogenous_set(Evas_Object *obj, Evas_Bool homogenous); + EAPI void elm_table_pack(Evas_Object *obj, Evas_Object *subobj, int x, int y, int w, int h); + /* smart callbacks elm_win objects will call: + */ + + EAPI Evas_Object *elm_clock_add(Evas_Object *parent); + EAPI void elm_clock_time_set(Evas_Object *obj, int hrs, int min, int sec); + EAPI void elm_clock_time_get(Evas_Object *obj, int *hrs, int *min, int *sec); + EAPI void elm_clock_edit_set(Evas_Object *obj, Evas_Bool edit); + EAPI void elm_clock_show_am_pm_set(Evas_Object *obj, Evas_Bool am_pm); + EAPI void elm_clock_show_seconds_set(Evas_Object *obj, Evas_Bool seconds); + /* smart callbacks elm_win objects will call: + * "changed" - the user changed the time + */ + #endif diff --git a/legacy/elementary/src/lib/Makefile.am b/legacy/elementary/src/lib/Makefile.am index c2888fef67..ac5234cc95 100644 --- a/legacy/elementary/src/lib/Makefile.am +++ b/legacy/elementary/src/lib/Makefile.am @@ -16,23 +16,20 @@ include_HEADERS = Elementary.h libelementary_la_SOURCES = \ elm_priv.h \ elm_main.c \ -elm_obj.c \ -elm_callback.c \ -elm_win.c \ elm_theme.c \ +\ +elm_win.c \ elm_widget.c \ elm_bg.c \ +elm_icon.c \ +elm_box.c \ +elm_button.c \ elm_scroller.c \ elm_label.c \ -elm_box.c \ -elm_table.c \ -elm_button.c \ -elm_icon.c \ elm_toggle.c \ -elm_clock.c \ elm_frame.c \ -elm_pad.c \ -elm_contactlist.c \ +elm_table.c \ +elm_clock.c \ \ els_pan.c \ els_pan.h \ @@ -45,6 +42,9 @@ els_table.h \ els_icon.c \ els_icon.h +#... later +#elm_contactlist.c + libelementary_la_CFLAGS = libelementary_la_LIBADD = @my_libs@ @ELEMENTARY_LIBS@ libelementary_la_LDFLAGS = -version-info @version_info@ diff --git a/legacy/elementary/src/lib/elm_bg.c b/legacy/elementary/src/lib/elm_bg.c index 0fef5fdd66..3f999df213 100644 --- a/legacy/elementary/src/lib/elm_bg.c +++ b/legacy/elementary/src/lib/elm_bg.c @@ -1,20 +1,28 @@ #include #include "elm_priv.h" -static void _elm_bg_file_set(Elm_Bg *bg, const char *file, const char *group); -static void _elm_bg_del(Elm_Bg *bg); +typedef struct _Widget_Data Widget_Data; -Elm_Bg_Class _elm_bg_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_BG, - _elm_bg_file_set + Evas_Object *img, *custom_img; + const char *file, *group; }; +static void _del_hook(Evas_Object *obj); +static void _custom_resize(void *data, Evas *a, Evas_Object *obj, void *event_info); + static void -_elm_bg_custom_resize(void *data, Evas *a, Evas_Object *obj, void *event_info) +_del_hook(Evas_Object *obj) { - Elm_Bg *bg = data; + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); +} + +static void +_custom_resize(void *data, Evas *a, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = data; int iw = 0, ih = 0; Evas_Coord x, y, w, h, ow = 0, oh = 0; @@ -34,66 +42,57 @@ _elm_bg_custom_resize(void *data, Evas *a, Evas_Object *obj, void *event_info) evas_object_image_fill_set(obj, x, y, w, h); } -static void -_elm_bg_file_set(Elm_Bg *bg, const char *file, const char *group) +EAPI Evas_Object * +elm_bg_add(Evas_Object *parent) { + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + elm_widget_can_focus_set(obj, 0); + + wd->img = edje_object_add(e); + _elm_theme_set(wd->img, "bg", "bg"); + elm_widget_resize_object_set(obj, wd->img); + return obj; +} + +EAPI void +elm_bg_file_set(Evas_Object *obj, const char *file, const char *group) +{ + Widget_Data *wd = elm_widget_data_get(obj); const char *p; - if (bg->custom_bg) + if (wd->custom_img) { - evas_object_del(bg->custom_bg); - bg->custom_bg = NULL; + evas_object_del(wd->custom_img); + wd->custom_img = NULL; } if (!file) return; - if (bg->file) evas_stringshare_del(bg->file); - if (file) bg->file = evas_stringshare_add(file); - else bg->file = NULL; - if (bg->group) evas_stringshare_del(bg->group); - if (group) bg->group = evas_stringshare_add(group); - else bg->group = NULL; + if (wd->file) evas_stringshare_del(wd->file); + if (file) wd->file = evas_stringshare_add(file); + else wd->file = NULL; + if (wd->group) evas_stringshare_del(wd->group); + if (group) wd->group = evas_stringshare_add(group); + else wd->group = NULL; if (((p = strrchr(file, '.'))) && (!strcasecmp(p, ".edj"))) { - bg->custom_bg = edje_object_add(evas_object_evas_get(bg->base)); - edje_object_file_set(bg->custom_bg, file, group); + wd->custom_img = edje_object_add(evas_object_evas_get(wd->img)); + edje_object_file_set(wd->custom_img, file, group); } else { - bg->custom_bg = evas_object_image_add(evas_object_evas_get(bg->base)); - evas_object_event_callback_add(bg->custom_bg, EVAS_CALLBACK_RESIZE, _elm_bg_custom_resize, bg); - evas_object_image_file_set(bg->custom_bg, file, group); + wd->custom_img = evas_object_image_add(evas_object_evas_get(wd->img)); + evas_object_event_callback_add(wd->custom_img, EVAS_CALLBACK_RESIZE, _custom_resize, wd); + evas_object_image_file_set(wd->custom_img, file, group); } - evas_object_repeat_events_set(bg->custom_bg, 1); - edje_object_part_swallow(bg->base, "elm.swallow.background", bg->custom_bg); - evas_object_show(bg->custom_bg); -} - -static void -_elm_bg_del(Elm_Bg *bg) -{ - if (bg->custom_bg) evas_object_del(bg->custom_bg); - if (bg->group) evas_stringshare_del(bg->group); - if (bg->file) evas_stringshare_del(bg->file); - ((Elm_Obj_Class *)(((Elm_Bg_Class *)(bg->clas))->parent))->del(ELM_OBJ(bg)); -} - -EAPI Elm_Bg * -elm_bg_new(Elm_Win *win) -{ - Elm_Bg *bg; - - bg = ELM_NEW(Elm_Bg); - - _elm_widget_init(bg); - bg->clas = &_elm_bg_class; - bg->type = ELM_OBJ_BG; - - bg->del = _elm_bg_del; - - bg->file_set = _elm_bg_file_set; - - bg->base = edje_object_add(win->evas); - _elm_theme_set(bg->base, "bg", "bg"); - _elm_widget_post_init(bg); - win->child_add(win, bg); - return bg; + elm_widget_sub_object_add(obj, wd->custom_img); + evas_object_repeat_events_set(wd->custom_img, 1); + edje_object_part_swallow(wd->img, "elm.swallow.background", wd->custom_img); + evas_object_show(wd->custom_img); } diff --git a/legacy/elementary/src/lib/elm_box.c b/legacy/elementary/src/lib/elm_box.c index e4cc77cdd0..c6d3c3074e 100644 --- a/legacy/elementary/src/lib/elm_box.c +++ b/legacy/elementary/src/lib/elm_box.c @@ -1,136 +1,115 @@ #include #include "elm_priv.h" -static void _elm_box_layout_update(Elm_Box *bx); -static void _elm_box_pack_start(Elm_Box *bx, Elm_Widget *wid); -static void _elm_box_pack_end(Elm_Box *bx, Elm_Widget *wid); -static void _elm_box_pack_before(Elm_Box *bx, Elm_Widget *wid, Elm_Widget *wid_before); -static void _elm_box_pack_after(Elm_Box *bx, Elm_Widget *wid, Elm_Widget *wid_after); +typedef struct _Widget_Data Widget_Data; -Elm_Box_Class _elm_box_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_SCROLLER, - _elm_box_layout_update, - _elm_box_pack_start, - _elm_box_pack_end, - _elm_box_pack_before, - _elm_box_pack_after + Evas_Object *box; }; +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); + static void -_elm_box_layout_update(Elm_Box *bx) +_del_hook(Evas_Object *obj) { - _els_smart_box_orientation_set(bx->base, bx->horizontal); - _els_smart_box_homogenous_set(bx->base, bx->homogenous); + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); } static void -_elm_box_pack_start(Elm_Box *bx, Elm_Widget *wid) +_sizing_eval(Evas_Object *obj) { - bx->child_add(bx, wid); - _els_smart_box_pack_start(bx->base, wid->base); - elm_widget_sizing_update(wid); + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + Evas_Coord w, h; + + evas_object_size_hint_min_get(wd->box, &minw, &minh); + evas_object_size_hint_max_get(wd->box, &maxw, &maxh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + if (w < minw) w = minw; + if (h < minh) h = minh; + if ((maxw >= 0) && (w > maxw)) w = maxw; + if ((maxh >= 0) && (h > maxh)) h = maxh; + evas_object_resize(obj, w, h); } static void -_elm_box_pack_end(Elm_Box *bx, Elm_Widget *wid) +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { - bx->child_add(bx, wid); - _els_smart_box_pack_end(bx->base, wid->base); - elm_widget_sizing_update(wid); -} - -static void -_elm_box_pack_before(Elm_Box *bx, Elm_Widget *wid, Elm_Widget *wid_before) -{ - bx->child_add(bx, wid); - _els_smart_box_pack_before(bx->base, wid->base, wid_before->base); - elm_widget_sizing_update(wid); -} - -static void -_elm_box_pack_after(Elm_Box *bx, Elm_Widget *wid, Elm_Widget *wid_after) -{ - bx->child_add(bx, wid); - _els_smart_box_pack_after(bx->base, wid->base, wid_after->base); - elm_widget_sizing_update(wid); -} - -static void -_elm_box_size_alloc(Elm_Box *bx, int w, int h) -{ - Evas_Coord mw, mh; - - _els_smart_box_min_size_get(bx->base, &mw, &mh); - if (w < mw) w = mw; - if (h < mh) h = mh; - printf("box %p size alloc to %ix%i\n", bx, w, h); - bx->req.w = w; - bx->req.h = h; + _sizing_eval(data); } -static void -_elm_box_size_req(Elm_Box *bx, Elm_Widget *child, int w, int h) +EAPI Evas_Object * +elm_box_add(Evas_Object *parent) { - Evas_Coord mw, mh; - - if (child) - { - Evas_Coord maxx, maxy; - - child->size_alloc(child, 0, 0); - maxx = child->req.w; - maxy = child->req.h; - if (child->expand_x) maxx = 32767; - if (child->expand_y) maxy = 32767; - _els_smart_box_pack_options_set(child->base, - child->fill_x, child->fill_y, - child->expand_x, child->expand_y, - child->align_x, child->align_y, - child->req.w, child->req.h, - maxx, maxy); - } - else - { - // FIXME: handle. - } - _els_smart_box_min_size_get(bx->base, &mw, &mh); - ((Elm_Widget *)(bx->parent))->size_req(bx->parent, bx, mw, mh); - bx->geom_set(bx, bx->x, bx->y, mw, mh); + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + + wd->box = _els_smart_box_add(e); + elm_widget_sub_object_add(obj, wd->box); + evas_object_event_callback_add(wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + elm_widget_resize_object_set(obj, wd->box); + return obj; } -static void -_elm_on_child_del(void *data, Elm_Box *bx, Elm_Cb_Type type, Elm_Obj *obj) +EAPI void +elm_box_horizontal_set(Evas_Object *obj, Evas_Bool horizontal) { - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - _els_smart_box_unpack(((Elm_Widget *)(obj))->base); + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_box_orientation_set(wd->box, horizontal); } -EAPI Elm_Box * -elm_box_new(Elm_Win *win) +EAPI void +elm_box_homogenous_set(Evas_Object *obj, Evas_Bool homogenous) { - Elm_Box *bx; - - bx = ELM_NEW(Elm_Box); - _elm_widget_init(bx); - - bx->clas = &_elm_box_class; - bx->type = ELM_OBJ_BOX; - - bx->layout_update = _elm_box_layout_update; - bx->pack_start = _elm_box_pack_start; - bx->pack_end = _elm_box_pack_end; - bx->pack_before = _elm_box_pack_before; - bx->pack_after = _elm_box_pack_after; - - bx->size_alloc = _elm_box_size_alloc; - bx->size_req = _elm_box_size_req; - - bx->base = _els_smart_box_add(win->evas); - - bx->cb_add(bx, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(bx); - win->child_add(win, bx); - return bx; + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_box_homogenous_set(wd->box, homogenous); +} + +EAPI void +elm_box_pack_start(Evas_Object *obj, Evas_Object *subobj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_box_pack_start(wd->box, subobj); + elm_widget_sub_object_add(obj, subobj); + // FIXME: track new sub obj... +} + +EAPI void +elm_box_pack_end(Evas_Object *obj, Evas_Object *subobj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_box_pack_end(wd->box, subobj); + elm_widget_sub_object_add(obj, subobj); + // FIXME: track new sub obj... +} + +EAPI void +elm_box_pack_before(Evas_Object *obj, Evas_Object *subobj, Evas_Object *before) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_box_pack_before(wd->box, subobj, before); + elm_widget_sub_object_add(obj, subobj); + // FIXME: track new sub obj... +} + +EAPI void +elm_box_pack_after(Evas_Object *obj, Evas_Object *subobj, Evas_Object *after) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_box_pack_after(wd->box, subobj, after); + elm_widget_sub_object_add(obj, subobj); + // FIXME: track new sub obj... } diff --git a/legacy/elementary/src/lib/elm_button.c b/legacy/elementary/src/lib/elm_button.c index a63f5649f7..7aa1a2677d 100644 --- a/legacy/elementary/src/lib/elm_button.c +++ b/legacy/elementary/src/lib/elm_button.c @@ -1,170 +1,102 @@ #include #include "elm_priv.h" -static void _elm_button_text_set(Elm_Button *bt, const char *text); +typedef struct _Widget_Data Widget_Data; -Elm_Button_Class _elm_button_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_BUTTON, - _elm_button_text_set + Evas_Object *btn; }; +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); + static void -_elm_button_text_set(Elm_Button *bt, const char *text) +_del_hook(Evas_Object *obj) { + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); +} + +static void +_sizing_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + + edje_object_size_min_calc(wd->btn, &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); +} + +static void +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(data); + edje_object_part_swallow(wd->btn, "elm.swallow.content", obj); + _sizing_eval(data); +} + +static void +_signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + Widget_Data *wd = elm_widget_data_get(data); + evas_object_smart_callback_call(data, "clicked", NULL); +} + +EAPI Evas_Object * +elm_button_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + + wd->btn = edje_object_add(e); + _elm_theme_set(wd->btn, "button", "button"); + edje_object_signal_callback_add(wd->btn, "elm,action,click", "", _signal_clicked, obj); + elm_widget_resize_object_set(obj, wd->btn); + + _sizing_eval(obj); + return obj; +} + +EAPI void +elm_button_label_set(Evas_Object *obj, const char *label) +{ + Widget_Data *wd = elm_widget_data_get(obj); Evas_Coord mw, mh; - if (text) + if (label) { - edje_object_signal_emit(bt->base, "elm,state,text,visible", "elm"); - edje_object_message_signal_process(bt->base); + edje_object_signal_emit(wd->btn, "elm,state,text,visible", "elm"); + edje_object_message_signal_process(wd->btn); } else { - edje_object_signal_emit(bt->base, "elm,state,text,hidden", "elm"); - edje_object_message_signal_process(bt->base); - } - edje_object_part_text_set(bt->base, "elm.text", text); - edje_object_size_min_calc(bt->base, &mw, &mh); - if ((bt->minw != mw) || (bt->minh != mh)) - { - bt->minw = mw; - bt->minh = mh; - ((Elm_Widget *)(bt->parent))->size_req(bt->parent, bt, bt->minw, bt->minh); - bt->geom_set(bt, bt->x, bt->y, bt->minw, bt->minh); + edje_object_signal_emit(wd->btn, "elm,state,text,hidden", "elm"); + edje_object_message_signal_process(wd->btn); } + edje_object_part_text_set(wd->btn, "elm.text", label); + _sizing_eval(obj); } -static void -_elm_button_size_alloc(Elm_Button *bt, int w, int h) +EAPI void +elm_button_icon_set(Evas_Object *obj, Evas_Object *icon) { - if (w < bt->minw) w = bt->minw; - if (h < bt->minh) h = bt->minh; - bt->req.w = w; - bt->req.h = h; -} - -static void -_elm_button_size_req(Elm_Button *bt, Elm_Widget *child, int w, int h) -{ - Evas_Coord mw, mh; - - if (child) - { - Evas_Coord maxx, maxy; - - child->size_alloc(child, 0, 0); - maxx = child->req.w; - maxy = child->req.h; - if (child->expand_x) maxx = 32767; - if (child->expand_y) maxy = 32767; - edje_extern_object_min_size_set(child->base, - child->req.w, - child->req.h); - edje_object_part_swallow(bt->base , "elm.swallow.contents", - child->base); - edje_object_size_min_calc(bt->base, &mw, &mh); - if ((bt->minw != mw) || (bt->minh != mh)) - { - bt->minw = mw; - bt->minh = mh; - ((Elm_Widget *)(bt->parent))->size_req(bt->parent, bt, mw, mh); - bt->geom_set(bt, bt->x, bt->y, mw, mh); - } - } - else - { - // FIXME: handle - } -} - -static void -_elm_on_child_add(void *data, Elm_Button *bt, Elm_Cb_Type type, Elm_Obj *obj) -{ - Evas_Coord mw, mh; - - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - edje_object_signal_emit(bt->base, "elm,state,icon,visible", "elm"); - edje_object_message_signal_process(bt->base); - ((Elm_Widget *)(obj))->size_alloc(obj, 0, 0); - ((Elm_Widget *)(obj))->geom_set(obj, - ((Elm_Widget *)(obj))->x, - ((Elm_Widget *)(obj))->y, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_extern_object_min_size_set(((Elm_Widget *)(obj))->base, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_object_part_swallow(bt->base , "elm.swallow.contents", - ((Elm_Widget *)(obj))->base); - edje_object_size_min_calc(bt->base, &mw, &mh); - if ((bt->minw != mw) || (bt->minh != mh)) - { - bt->minw = mw; - bt->minh = mh; - ((Elm_Widget *)(bt->parent))->size_req(bt->parent, bt, mw, mh); - bt->geom_set(bt, bt->x, bt->y, mw, mh); - } -} - -static void -_elm_on_child_del(void *data, Elm_Button *bt, Elm_Cb_Type type, Elm_Obj *obj) -{ - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - // FIXME: allow for removal of child - size down - edje_object_signal_emit(bt->base, "elm,state,icon,hidden", "elm"); - edje_object_message_signal_process(bt->base); -} - -static void -_elm_button_activate(Elm_Button *bt) -{ - _elm_obj_nest_push(); - _elm_cb_call(ELM_OBJ(bt), ELM_CB_ACTIVATED, NULL); - _elm_obj_nest_pop(); -} - -static void -_elm_signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Elm_Button *bt = data; - - _elm_button_activate(bt); -} - -static void -_elm_button_del(Elm_Button *bt) -{ - if (bt->text) evas_stringshare_del(bt->text); - ((Elm_Obj_Class *)(((Elm_Button_Class *)(bt->clas))->parent))->del(ELM_OBJ(bt)); -} - -EAPI Elm_Button * -elm_button_new(Elm_Win *win) -{ - Elm_Button *bt; - - bt = ELM_NEW(Elm_Button); - - _elm_widget_init(bt); - bt->clas = &_elm_button_class; - bt->type = ELM_OBJ_BUTTON; - - bt->del = _elm_button_del; - - bt->size_alloc = _elm_button_size_alloc; - bt->size_req = _elm_button_size_req; - - bt->text_set = _elm_button_text_set; - - bt->base = edje_object_add(win->evas); - _elm_theme_set(bt->base, "button", "button"); - edje_object_signal_callback_add(bt->base, "elm,action,click", "", - _elm_signal_clicked, bt); - bt->cb_add(bt, ELM_CB_CHILD_ADD, _elm_on_child_add, NULL); - bt->cb_add(bt, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(bt); - win->child_add(win, bt); - return bt; + Widget_Data *wd = elm_widget_data_get(obj); + edje_object_part_swallow(wd->btn, "elm.swallow.content", icon); + edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm"); + elm_widget_sub_object_add(obj, icon); + evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + // FIXME: track new sub obj... + _sizing_eval(obj); } diff --git a/legacy/elementary/src/lib/elm_clock.c b/legacy/elementary/src/lib/elm_clock.c index af968316bf..9a5fecf053 100644 --- a/legacy/elementary/src/lib/elm_clock.c +++ b/legacy/elementary/src/lib/elm_clock.c @@ -1,198 +1,254 @@ #include #include "elm_priv.h" -static void _elm_clock_time_update(Elm_Clock *ck); +typedef struct _Widget_Data Widget_Data; -Elm_Clock_Class _elm_clock_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_CLOCK, - _elm_clock_time_update + Evas_Object *clk; + Evas_Bool seconds : 1; + Evas_Bool am_pm : 1; + Evas_Bool edit : 1; + int hrs, min, sec; + Evas_Object *digit[6]; + Evas_Object *ampm; + Ecore_Timer *ticker; + struct { + int hrs, min, sec; + char ampm; + char seconds; + char am_pm; + char edit; + } cur; }; +static void _del_hook(Evas_Object *obj); +static int _ticker(void *data); +static void _signal_clock_val_up(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _signal_clock_val_down(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _time_update(Evas_Object *obj); static void -_elm_clock_val_up(void *data, Evas_Object *obj, const char *emission, const char *source) +_del_hook(Evas_Object *obj) { - Elm_Clock *ck = data; + Widget_Data *wd = elm_widget_data_get(obj); + int i; + for (i = 0; i < 6; i++) + { + if (wd->digit[i]) evas_object_del(wd->digit[i]); + } + if (wd->ampm) evas_object_del(wd->ampm); + if (wd->ticker) ecore_timer_del(wd->ticker); + free(wd); +} - if (!ck->edit) return; - if (obj == ck->digit[0]) +static int +_ticker(void *data) +{ + Widget_Data *wd = elm_widget_data_get(data); + double t; + struct timeval timev; + struct tm *tm; + time_t tt; + + gettimeofday(&timev, NULL); + t = ((double)(1000000 - timev.tv_usec)) / 1000000.0; + wd->ticker = ecore_timer_add(t, _ticker, data); + if (!wd->edit) { - ck->hrs = ck->hrs + 10; - if (ck->hrs >= 24) ck->hrs -= 24; + tt = (time_t)(timev.tv_sec); + tzset(); + tm = localtime(&tt); + if (tm) + { + wd->hrs = tm->tm_hour; + wd->min = tm->tm_min; + wd->sec = tm->tm_sec; + _time_update(data); + } } - if (obj == ck->digit[1]) - { - ck->hrs = ck->hrs + 1; - if (ck->hrs >= 24) ck->hrs -= 24; - } - if (obj == ck->digit[2]) - { - ck->min = ck->min + 10; - if (ck->min >= 60) ck->min -= 60; - } - if (obj == ck->digit[3]) - { - ck->min = ck->min + 1; - if (ck->min >= 60) ck->min -= 60; - } - if (obj == ck->digit[4]) - { - ck->sec = ck->sec + 10; - if (ck->sec >= 60) ck->sec -= 60; - } - if (obj == ck->digit[5]) - { - ck->sec = ck->sec + 1; - if (ck->sec >= 60) ck->sec -= 60; - } - if (obj == ck->ampm) - { - ck->hrs = ck->hrs + 12; - if (ck->hrs > 23) ck->hrs -= 24; - } - ck->time_update(ck); - _elm_obj_nest_push(); - _elm_cb_call(ELM_OBJ(ck), ELM_CB_CHANGED, NULL); - _elm_obj_nest_pop(); + return 0; } static void -_elm_clock_val_down(void *data, Evas_Object *obj, const char *emission, const char *source) +_signal_clock_val_up(void *data, Evas_Object *obj, const char *emission, const char *source) { - Elm_Clock *ck = data; - if (!ck->edit) return; - if (obj == ck->digit[0]) + Widget_Data *wd = elm_widget_data_get(data); + + if (!wd->edit) return; + if (obj == wd->digit[0]) { - ck->hrs = ck->hrs - 10; - if (ck->hrs < 0) ck->hrs += 24; + wd->hrs = wd->hrs + 10; + if (wd->hrs >= 24) wd->hrs -= 24; } - if (obj == ck->digit[1]) + if (obj == wd->digit[1]) { - ck->hrs = ck->hrs - 1; - if (ck->hrs < 0) ck->hrs += 24; + wd->hrs = wd->hrs + 1; + if (wd->hrs >= 24) wd->hrs -= 24; } - if (obj == ck->digit[2]) + if (obj == wd->digit[2]) { - ck->min = ck->min - 10; - if (ck->min < 0) ck->min += 60; + wd->min = wd->min + 10; + if (wd->min >= 60) wd->min -= 60; } - if (obj == ck->digit[3]) + if (obj == wd->digit[3]) { - ck->min = ck->min - 1; - if (ck->min < 0) ck->min += 60; + wd->min = wd->min + 1; + if (wd->min >= 60) wd->min -= 60; } - if (obj == ck->digit[4]) + if (obj == wd->digit[4]) { - ck->sec = ck->sec - 10; - if (ck->sec < 0) ck->sec += 60; + wd->sec = wd->sec + 10; + if (wd->sec >= 60) wd->sec -= 60; } - if (obj == ck->digit[5]) + if (obj == wd->digit[5]) { - ck->sec = ck->sec - 1; - if (ck->sec < 0) ck->sec += 60; + wd->sec = wd->sec + 1; + if (wd->sec >= 60) wd->sec -= 60; } - if (obj == ck->ampm) + if (obj == wd->ampm) { - ck->hrs = ck->hrs - 12; - if (ck->hrs < 0) ck->hrs += 24; + wd->hrs = wd->hrs + 12; + if (wd->hrs > 23) wd->hrs -= 24; } - ck->time_update(ck); - _elm_obj_nest_push(); - _elm_cb_call(ELM_OBJ(ck), ELM_CB_CHANGED, NULL); - _elm_obj_nest_pop(); + _time_update(data); + evas_object_smart_callback_call(data, "changed", NULL); } static void -_elm_clock_time_update(Elm_Clock *ck) +_signal_clock_val_down(void *data, Evas_Object *obj, const char *emission, const char *source) { + Widget_Data *wd = elm_widget_data_get(data); + + if (!wd->edit) return; + if (obj == wd->digit[0]) + { + wd->hrs = wd->hrs - 10; + if (wd->hrs < 0) wd->hrs += 24; + } + if (obj == wd->digit[1]) + { + wd->hrs = wd->hrs - 1; + if (wd->hrs < 0) wd->hrs += 24; + } + if (obj == wd->digit[2]) + { + wd->min = wd->min - 10; + if (wd->min < 0) wd->min += 60; + } + if (obj == wd->digit[3]) + { + wd->min = wd->min - 1; + if (wd->min < 0) wd->min += 60; + } + if (obj == wd->digit[4]) + { + wd->sec = wd->sec - 10; + if (wd->sec < 0) wd->sec += 60; + } + if (obj == wd->digit[5]) + { + wd->sec = wd->sec - 1; + if (wd->sec < 0) wd->sec += 60; + } + if (obj == wd->ampm) + { + wd->hrs = wd->hrs - 12; + if (wd->hrs < 0) wd->hrs += 24; + } + _time_update(data); + evas_object_smart_callback_call(data, "changed", NULL); +} + +static void +_time_update(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); Edje_Message_Int msg; int ampm = 0; - if ((ck->cur.seconds != ck->seconds) || (ck->cur.am_pm != ck->am_pm) || - (ck->cur.edit != ck->edit)) + if ((wd->cur.seconds != wd->seconds) || (wd->cur.am_pm != wd->am_pm) || + (wd->cur.edit != wd->edit)) { int i; Evas_Coord mw, mh; for (i = 0; i < 6; i++) { - if (ck->digit[i]) + if (wd->digit[i]) { - evas_object_del(ck->digit[i]); - ck->digit[i] = NULL; + evas_object_del(wd->digit[i]); + wd->digit[i] = NULL; } } - if (ck->ampm) + if (wd->ampm) { - evas_object_del(ck->ampm); - ck->ampm = NULL; + evas_object_del(wd->ampm); + wd->ampm = NULL; } - if ((ck->seconds) && (ck->am_pm)) - _elm_theme_set(ck->base, "clock", "clock/all"); - else if (ck->seconds) - _elm_theme_set(ck->base, "clock", "clock/seconds"); - else if (ck->am_pm) - _elm_theme_set(ck->base, "clock", "clock/am_pm"); + if ((wd->seconds) && (wd->am_pm)) + _elm_theme_set(wd->clk, "clock", "clock/all"); + else if (wd->seconds) + _elm_theme_set(wd->clk, "clock", "clock/seconds"); + else if (wd->am_pm) + _elm_theme_set(wd->clk, "clock", "clock/am_pm"); else - _elm_theme_set(ck->base, "clock", "clock"); + _elm_theme_set(wd->clk, "clock", "clock"); for (i = 0; i < 6; i++) { char buf[16]; - if ((!ck->seconds) && (i >= 4)) break; - ck->digit[i] = edje_object_add(evas_object_evas_get(ck->base)); - _elm_theme_set(ck->digit[i], "clock", "flipdigit"); - if (ck->edit) - edje_object_signal_emit(ck->digit[i], "elm,state,edit,on", "elm"); - edje_object_signal_callback_add(ck->digit[i], "elm,action,up", "", - _elm_clock_val_up, ck); - edje_object_signal_callback_add(ck->digit[i], "elm,action,down", "", - _elm_clock_val_down, ck); - edje_object_size_min_calc(ck->digit[i], &mw, &mh); - edje_extern_object_min_size_set(ck->digit[i], mw, mh); + if ((!wd->seconds) && (i >= 4)) break; + wd->digit[i] = edje_object_add(evas_object_evas_get(wd->clk)); + _elm_theme_set(wd->digit[i], "clock", "flipdigit"); + if (wd->edit) + edje_object_signal_emit(wd->digit[i], "elm,state,edit,on", "elm"); + edje_object_signal_callback_add(wd->digit[i], "elm,action,up", "", + _signal_clock_val_up, obj); + edje_object_signal_callback_add(wd->digit[i], "elm,action,down", "", + _signal_clock_val_down, obj); + edje_object_size_min_calc(wd->digit[i], &mw, &mh); + edje_extern_object_min_size_set(wd->digit[i], mw, mh); snprintf(buf, sizeof(buf), "d%i", i); - edje_object_part_swallow(ck->base , buf, ck->digit[i]); - evas_object_show(ck->digit[i]); + edje_object_part_swallow(wd->clk , buf, wd->digit[i]); + evas_object_show(wd->digit[i]); } - if (ck->am_pm) + if (wd->am_pm) { - ck->ampm = edje_object_add(evas_object_evas_get(ck->base)); - _elm_theme_set(ck->ampm, "clock", "flipampm"); - if (ck->edit) - edje_object_signal_emit(ck->ampm, "elm,state,edit,on", "elm"); - edje_object_signal_callback_add(ck->ampm, "elm,action,up", "", - _elm_clock_val_up, ck); - edje_object_signal_callback_add(ck->ampm, "elm,action,down", "", - _elm_clock_val_down, ck); - edje_object_size_min_calc(ck->ampm, &mw, &mh); - edje_extern_object_min_size_set(ck->ampm, mw, mh); - edje_object_part_swallow(ck->base , "ampm", ck->ampm); - evas_object_show(ck->ampm); + wd->ampm = edje_object_add(evas_object_evas_get(wd->clk)); + _elm_theme_set(wd->ampm, "clock", "flipampm"); + if (wd->edit) + edje_object_signal_emit(wd->ampm, "elm,state,edit,on", "elm"); + edje_object_signal_callback_add(wd->ampm, "elm,action,up", "", + _signal_clock_val_up, obj); + edje_object_signal_callback_add(wd->ampm, "elm,action,down", "", + _signal_clock_val_down, obj); + edje_object_size_min_calc(wd->ampm, &mw, &mh); + edje_extern_object_min_size_set(wd->ampm, mw, mh); + edje_object_part_swallow(wd->clk , "ampm", wd->ampm); + evas_object_show(wd->ampm); } - edje_object_size_min_calc(ck->base, &mw, &mh); - ck->minw = mw; - ck->minh = mh; + edje_object_size_min_calc(wd->clk, &mw, &mh); + evas_object_size_hint_min_set(obj, mw, mh); - ck->cur.hrs = 0; - ck->cur.min = 0; - ck->cur.sec = 0; - ck->cur.ampm = -1; - ck->cur.seconds = ck->seconds; - ck->cur.am_pm = ck->am_pm; - ck->cur.edit = ck->edit; + wd->cur.hrs = 0; + wd->cur.min = 0; + wd->cur.sec = 0; + wd->cur.ampm = -1; + wd->cur.seconds = wd->seconds; + wd->cur.am_pm = wd->am_pm; + wd->cur.edit = wd->edit; } - if (ck->hrs != ck->cur.hrs) + if (wd->hrs != wd->cur.hrs) { int hrs; int d1, d2, dc1, dc2; - hrs = ck->hrs; - if (ck->am_pm) + hrs = wd->hrs; + if (wd->am_pm) { if (hrs >= 12) { @@ -203,191 +259,151 @@ _elm_clock_time_update(Elm_Clock *ck) } d1 = hrs / 10; d2 = hrs % 10; - dc1 = ck->cur.hrs / 10; - dc2 = ck->cur.hrs % 10; + dc1 = wd->cur.hrs / 10; + dc2 = wd->cur.hrs % 10; if (d1 != dc1) { msg.val = d1; - edje_object_message_send(ck->digit[0], EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(wd->digit[0], EDJE_MESSAGE_INT, 1, &msg); } if (d2 != dc2) { msg.val = d2; - edje_object_message_send(ck->digit[1], EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(wd->digit[1], EDJE_MESSAGE_INT, 1, &msg); } - ck->cur.hrs = hrs; + wd->cur.hrs = hrs; } - if (ck->min != ck->cur.min) + if (wd->min != wd->cur.min) { int d1, d2, dc1, dc2; - d1 = ck->min / 10; - d2 = ck->min % 10; - dc1 = ck->cur.min / 10; - dc2 = ck->cur.min % 10; + d1 = wd->min / 10; + d2 = wd->min % 10; + dc1 = wd->cur.min / 10; + dc2 = wd->cur.min % 10; if (d1 != dc1) { msg.val = d1; - edje_object_message_send(ck->digit[2], EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(wd->digit[2], EDJE_MESSAGE_INT, 1, &msg); } if (d2 != dc2) { msg.val = d2; - edje_object_message_send(ck->digit[3], EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(wd->digit[3], EDJE_MESSAGE_INT, 1, &msg); } - ck->cur.min = ck->min; + wd->cur.min = wd->min; } - if (ck->seconds) + if (wd->seconds) { - if (ck->sec != ck->cur.sec) + if (wd->sec != wd->cur.sec) { int d1, d2, dc1, dc2; - d1 = ck->sec / 10; - d2 = ck->sec % 10; - dc1 = ck->cur.sec / 10; - dc2 = ck->cur.sec % 10; + d1 = wd->sec / 10; + d2 = wd->sec % 10; + dc1 = wd->cur.sec / 10; + dc2 = wd->cur.sec % 10; if (d1 != dc1) { msg.val = d1; - edje_object_message_send(ck->digit[4], EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(wd->digit[4], EDJE_MESSAGE_INT, 1, &msg); } if (d2 != dc2) { msg.val = d2; - edje_object_message_send(ck->digit[5], EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(wd->digit[5], EDJE_MESSAGE_INT, 1, &msg); } - ck->cur.sec = ck->sec; + wd->cur.sec = wd->sec; } } else - ck->cur.sec = -1; + wd->cur.sec = -1; - if (ck->am_pm) + if (wd->am_pm) { - if (ck->hrs >= 12) ampm = 1; - if (ampm != ck->cur.ampm) + if (wd->hrs >= 12) ampm = 1; + if (ampm != wd->cur.ampm) { int d1, d2, dc1, dc2; - if (ck->cur.ampm != ampm) + if (wd->cur.ampm != ampm) { msg.val = ampm; - edje_object_message_send(ck->ampm, EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(wd->ampm, EDJE_MESSAGE_INT, 1, &msg); } - ck->cur.ampm = ampm; + wd->cur.ampm = ampm; } } else - ck->cur.ampm = -1; + wd->cur.ampm = -1; } -static void -_elm_clock_size_alloc(Elm_Clock *ck, int w, int h) +EAPI Evas_Object * +elm_clock_add(Evas_Object *parent) { - Evas_Coord mw, mh; + Evas_Object *obj; + Evas *e; + Widget_Data *wd; - if (w < ck->minw) w = ck->minw; - if (h < ck->minh) h = ck->minh; - ck->req.w = w; - ck->req.h = h; + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + + wd->clk = edje_object_add(e); + elm_widget_resize_object_set(obj, wd->clk); + + wd->cur.ampm = -1; + wd->cur.seconds = -1; + wd->cur.am_pm = -1; + wd->cur.edit = -1; + + _time_update(obj); + _ticker(obj); + + return obj; } -static void -_elm_clock_size_req(Elm_Clock *ck, Elm_Widget *child, int w, int h) +EAPI void +elm_clock_time_set(Evas_Object *obj, int hrs, int min, int sec) { - if (child) - { - } - else - { - // FIXME: handle - } + Widget_Data *wd = elm_widget_data_get(obj); + wd->hrs = hrs; + wd->min = min; + wd->sec = sec; + _time_update(obj); } -static void -_elm_clock_activate(Elm_Clock *ck) +EAPI void +elm_clock_time_get(Evas_Object *obj, int *hrs, int *min, int *sec) { - _elm_obj_nest_push(); - _elm_cb_call(ELM_OBJ(ck), ELM_CB_ACTIVATED, NULL); - _elm_obj_nest_pop(); + Widget_Data *wd = elm_widget_data_get(obj); + if (hrs) *hrs = wd->hrs; + if (min) *min = wd->min; + if (sec) *sec = wd->sec; } -static void -_elm_clock_del(Elm_Clock *ck) +EAPI void +elm_clock_edit_set(Evas_Object *obj, Evas_Bool edit) { - int i; - - for (i = 0; i < 6; i++) - { - if (ck->digit[i]) evas_object_del(ck->digit[i]); - } - if (ck->ampm) evas_object_del(ck->ampm); - if (ck->ticker) ecore_timer_del(ck->ticker); - ((Elm_Obj_Class *)(((Elm_Clock_Class *)(ck->clas))->parent))->del(ELM_OBJ(ck)); + Widget_Data *wd = elm_widget_data_get(obj); + wd->edit = edit; + _time_update(obj); } -static int -_elm_clock_ticker(Elm_Clock *ck) +EAPI void +elm_clock_show_am_pm_set(Evas_Object *obj, Evas_Bool am_pm) { - double t; - struct timeval timev; - struct tm *tm; - time_t tt; - - gettimeofday(&timev, NULL); - t = ((double)(1000000 - timev.tv_usec)) / 1000000.0; - ck->ticker = ecore_timer_add(t, _elm_clock_ticker, ck); - if (!ck->edit) - { - tt = (time_t)(timev.tv_sec); - tzset(); - tm = localtime(&tt); - if (tm) - { - ck->hrs = tm->tm_hour; - ck->min = tm->tm_min; - ck->sec = tm->tm_sec; - ck->time_update(ck); - } - } - return 0; + Widget_Data *wd = elm_widget_data_get(obj); + wd->am_pm = am_pm; + _time_update(obj); } -EAPI Elm_Clock * -elm_clock_new(Elm_Win *win) +EAPI void +elm_clock_show_seconds_set(Evas_Object *obj, Evas_Bool seconds) { - Elm_Clock *ck; - - ck = ELM_NEW(Elm_Clock); - - _elm_widget_init(ck); - ck->clas = &_elm_clock_class; - ck->type = ELM_OBJ_CLOCK; - - ck->del = _elm_clock_del; - - ck->size_alloc = _elm_clock_size_alloc; - ck->size_req = _elm_clock_size_req; - - ck->time_update = _elm_clock_time_update; - - ck->seconds = 1; - ck->am_pm = 1; - - ck->cur.hrs = 0; - ck->cur.min = 0; - ck->cur.sec = 0; - ck->cur.ampm = -1; - ck->cur.seconds = -1; - ck->cur.am_pm = -1; - ck->cur.edit = -1; - - ck->base = edje_object_add(win->evas); - - _elm_clock_ticker(ck); - - _elm_widget_post_init(ck); - win->child_add(win, ck); - return ck; + Widget_Data *wd = elm_widget_data_get(obj); + wd->seconds = seconds; + _time_update(obj); } diff --git a/legacy/elementary/src/lib/elm_contactlist.c b/legacy/elementary/src/lib/elm_contactlist.c index 8ad24c5aa3..bd21d43cc2 100644 --- a/legacy/elementary/src/lib/elm_contactlist.c +++ b/legacy/elementary/src/lib/elm_contactlist.c @@ -1,122 +1,2 @@ #include #include "elm_priv.h" - -static void _elm_contactlist_del(Elm_Contactlist *cl); - -Elm_Contactlist_Class _elm_contactlist_class = -{ - &_elm_widget_class, - ELM_OBJ_CONTACTLIST -}; - -static void -_elm_contactlist_del(Elm_Contactlist *cl) -{ - // custom here - ((Elm_Obj_Class *)(((Elm_Contactlist_Class *)(cl->clas))->parent))->del(ELM_OBJ(cl)); -} - -static void -_elm_contactlist_geom_set(Elm_Contactlist *cl, int x, int y, int w, int h) -{ - cl->box->geom_set(cl->box, x, y, w, h); -} - -static void -_elm_on_child_add(void *data, Elm_Contactlist *cl, Elm_Cb_Type type, Elm_Obj *obj) -{ - Evas_Coord vw, vh; - - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - // custom here (eg pack to box) -} - -static void -_elm_on_child_del(void *data, Elm_Contactlist *cl, Elm_Cb_Type type, Elm_Obj *obj) -{ - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - // dunno -} - -static void -_elm_contactlist_show(Elm_Contactlist *cl) -{ - cl->box->show(cl->box); -} - -static void -_elm_contactlist_hide(Elm_Contactlist *cl) -{ - cl->box->hide(cl->box); -} - -static void -on_button_activate(Elm_Contactlist *cl, Elm_Button *bt, Elm_Cb_Type type, void *info) -{ - printf("Add contact\n"); -} - - -EAPI Elm_Contactlist * -elm_contactlist_new(Elm_Win *win) -{ - Elm_Contactlist *cl; - - cl = ELM_NEW(Elm_Contactlist); - _elm_widget_init(cl); - - cl->clas = &_elm_contactlist_class; - cl->type = ELM_OBJ_CONTACTLIST; - - cl->del = _elm_contactlist_del; - - cl->geom_set = _elm_contactlist_geom_set; - cl->show = _elm_contactlist_show; - cl->hide = _elm_contactlist_hide; - - cl->box = elm_box_new(win); - cl->child_add(cl, cl->box); - - cl->listbox = elm_box_new(win); - printf("--listbox = %p\n", cl->listbox); - - cl->scroller = elm_scroller_new(win); - cl->box->pack_end(cl->box, cl->scroller); - - cl->button = elm_button_new(win); - cl->button->text_set(cl->button, "Add Contact"); - cl->button->cb_add(cl->button, ELM_CB_ACTIVATED, on_button_activate, cl); - cl->button->expand_y = 0; - cl->box->pack_end(cl->box, cl->button); - - cl->button->show(cl->button); - - int i; - for (i = 0; i < 5; i++) - { - Elm_Button *bt; - - bt = elm_button_new(win); - bt->text_set(bt, "Contact 1"); - bt->expand_y = 0; - cl->listbox->pack_end(cl->listbox, bt); - bt->show(bt); - } - - cl->scroller->child_add(cl->scroller, cl->listbox); - elm_widget_sizing_update(cl->listbox); - cl->scroller->show(cl->scroller); - cl->listbox->show(cl->listbox); - - elm_widget_sizing_update(cl->scroller); - elm_widget_sizing_update(cl->button); - elm_widget_sizing_update(cl->box); - - cl->base = cl->box->base; - - cl->cb_add(cl, ELM_CB_CHILD_ADD, _elm_on_child_add, NULL); - cl->cb_add(cl, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(cl); - win->child_add(win, cl); - return cl; -} diff --git a/legacy/elementary/src/lib/elm_frame.c b/legacy/elementary/src/lib/elm_frame.c index 458573d36f..1653731c0e 100644 --- a/legacy/elementary/src/lib/elm_frame.c +++ b/legacy/elementary/src/lib/elm_frame.c @@ -1,6 +1,85 @@ #include #include "elm_priv.h" +typedef struct _Widget_Data Widget_Data; + +struct _Widget_Data +{ + Evas_Object *frm; +}; + +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); + +static void +_del_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); +} + +static void +_sizing_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + + edje_object_size_min_calc(wd->frm, &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); +} + +static void +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(data); + edje_object_part_swallow(wd->frm, "elm.swallow.content", obj); + _sizing_eval(data); +} + +EAPI Evas_Object * +elm_frame_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + + wd->frm = edje_object_add(e); + _elm_theme_set(wd->frm, "frame", "frame"); + elm_widget_resize_object_set(obj, wd->frm); + + _sizing_eval(obj); + return obj; +} + +EAPI void +elm_frame_label_set(Evas_Object *obj, const char *label) +{ + Widget_Data *wd = elm_widget_data_get(obj); + edje_object_part_text_set(wd->frm, "elm.text", label); + _sizing_eval(obj); +} + +EAPI void +elm_frame_content_set(Evas_Object *obj, Evas_Object *content) +{ + Widget_Data *wd = elm_widget_data_get(obj); + edje_object_part_swallow(wd->frm, "elm.swallow.content", content); + elm_widget_sub_object_add(obj, content); + evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + // FIXME: track new sub obj... + _sizing_eval(obj); +} + +/* static void _elm_frame_text_set(Elm_Frame *fr, const char *text); Elm_Frame_Class _elm_frame_class = @@ -136,3 +215,4 @@ elm_frame_new(Elm_Win *win) win->child_add(win, fr); return fr; } +*/ diff --git a/legacy/elementary/src/lib/elm_icon.c b/legacy/elementary/src/lib/elm_icon.c index 37c5ea11e2..84dc084de6 100644 --- a/legacy/elementary/src/lib/elm_icon.c +++ b/legacy/elementary/src/lib/elm_icon.c @@ -1,103 +1,137 @@ #include #include "elm_priv.h" -static void _elm_icon_file_set(Elm_Icon *icon, const char *file, const char *group); -static void _elm_icon_layout_update(Elm_Icon *icon); +typedef struct _Widget_Data Widget_Data; -Elm_Icon_Class _elm_icon_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_ICON, - _elm_icon_file_set, - _elm_icon_layout_update + Evas_Object *img; + const char *file, *group; + Evas_Bool scale_up : 1; + Evas_Bool scale_down : 1; + Evas_Bool smooth : 1; + Evas_Bool fill_outside : 1; + Evas_Bool no_scale : 1; }; +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); + static void -_elm_icon_file_set(Elm_Icon *icon, const char *file, const char *group) +_del_hook(Evas_Object *obj) { + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); +} + +static void +_sizing_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + int w, h; + + _els_smart_icon_size_get(wd->img, &w, &h); + _els_smart_icon_scale_up_set(wd->img, wd->scale_up); + _els_smart_icon_scale_down_set(wd->img, wd->scale_down); + _els_smart_icon_smooth_scale_set(wd->img, wd->smooth); + _els_smart_icon_fill_inside_set(wd->img, !(wd->fill_outside)); + if (wd->no_scale) _els_smart_icon_scale_set(wd->img, 1.0); + else + { + _els_smart_icon_scale_set(wd->img, _elm_config->scale); + w *= _elm_config->scale; + h *= _elm_config->scale; + } + if (!wd->scale_down) + { + minw = w; + minh = h; + } + if (!wd->scale_up) + { + maxw = w; + maxh = h; + } + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); +} + +EAPI Evas_Object * +elm_icon_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + elm_widget_can_focus_set(obj, 0); + + wd->img = _els_smart_icon_add(e); + evas_object_repeat_events_set(wd->img, 1); + elm_widget_resize_object_set(obj, wd->img); + + wd->smooth = 1; + wd->scale_up = 1; + wd->scale_down = 1; + + _sizing_eval(obj); + return obj; +} + +EAPI void +elm_icon_file_set(Evas_Object *obj, const char *file, const char *group) +{ + Widget_Data *wd = elm_widget_data_get(obj); const char *p; if (!file) return; - if (icon->file) evas_stringshare_del(icon->file); - if (file) icon->file = evas_stringshare_add(file); - else icon->file = NULL; - if (icon->group) evas_stringshare_del(icon->group); - if (group) icon->group = evas_stringshare_add(group); - else icon->group = NULL; + if (wd->file) evas_stringshare_del(wd->file); + if (file) wd->file = evas_stringshare_add(file); + else wd->file = NULL; + if (wd->group) evas_stringshare_del(wd->group); + if (group) wd->group = evas_stringshare_add(group); + else wd->group = NULL; if (((p = strrchr(file, '.'))) && (!strcasecmp(p, ".edj"))) - _els_smart_icon_file_edje_set(icon->base, file, group); + _els_smart_icon_file_edje_set(wd->img, file, group); else - _els_smart_icon_file_key_set(icon->base, file, group); - icon->layout_update(icon); + _els_smart_icon_file_key_set(wd->img, file, group); + _sizing_eval(obj); } -static void -_elm_icon_layout_update(Elm_Icon *icon) +EAPI void +elm_icon_smooth_set(Evas_Object *obj, Evas_Bool smooth) { - _els_smart_icon_scale_up_set(icon->base, icon->scale_up); - _els_smart_icon_scale_down_set(icon->base, icon->scale_down); - _els_smart_icon_smooth_scale_set(icon->base, icon->smooth); - _els_smart_icon_fill_inside_set(icon->base, !(icon->fill_outside)); - if (icon->no_scale) _els_smart_icon_scale_set(icon->base, 1.0); - else _els_smart_icon_scale_set(icon->base, _elm_config->scale); - if ((!icon->scale_down) || (!icon->scale_up)) - ((Elm_Widget *)(icon->parent))->size_req(icon->parent, icon, 0, 0); + Widget_Data *wd = elm_widget_data_get(obj); + wd->smooth = smooth; + _sizing_eval(obj); } -static void -_elm_icon_size_alloc(Elm_Icon *icon, int w, int h) +EAPI void +elm_icon_no_scale_set(Evas_Object *obj, Evas_Bool no_scale) { - int tw, th; - - _els_smart_icon_size_get(icon->base, &tw, &th); - if (!icon->scale_down) - { - if (w < tw) w = tw; - if (h < th) h = th; - } - if (!icon->scale_up) - { - if (w > tw) w = tw; - if (h > th) h = th; - } - icon->req.w = w; - icon->req.h = h; + Widget_Data *wd = elm_widget_data_get(obj); + wd->no_scale = no_scale; + _sizing_eval(obj); } -static void -_elm_icon_del(Elm_Icon *icon) +EAPI void +elm_icon_scale_set(Evas_Object *obj, Evas_Bool scale_up, Evas_Bool scale_down) { - if (icon->group) evas_stringshare_del(icon->group); - if (icon->file) evas_stringshare_del(icon->file); - ((Elm_Obj_Class *)(((Elm_Icon_Class *)(icon->clas))->parent))->del(ELM_OBJ(icon)); + Widget_Data *wd = elm_widget_data_get(obj); + wd->scale_up = scale_up; + wd->scale_down = scale_down; + _sizing_eval(obj); } -EAPI Elm_Icon * -elm_icon_new(Elm_Win *win) +EAPI void +elm_icon_fill_outside_set(Evas_Object *obj, Evas_Bool fill_outside) { - Elm_Icon *icon; - - icon = ELM_NEW(Elm_Icon); - - _elm_widget_init(icon); - icon->clas = &_elm_icon_class; - icon->type = ELM_OBJ_ICON; - - icon->del = _elm_icon_del; - - icon->size_alloc = _elm_icon_size_alloc; - - icon->file_set = _elm_icon_file_set; - icon->layout_update = _elm_icon_layout_update; - - icon->smooth = 1; - icon->scale_up = 1; - icon->scale_down = 1; - - icon->base = _els_smart_icon_add(win->evas); - evas_object_repeat_events_set(icon->base, 1); - - _elm_widget_post_init(icon); - win->child_add(win, icon); - return icon; + Widget_Data *wd = elm_widget_data_get(obj); + wd->fill_outside = fill_outside; + _sizing_eval(obj); } diff --git a/legacy/elementary/src/lib/elm_label.c b/legacy/elementary/src/lib/elm_label.c index 67bd641345..d41b2e3901 100644 --- a/legacy/elementary/src/lib/elm_label.c +++ b/legacy/elementary/src/lib/elm_label.c @@ -1,68 +1,58 @@ #include #include "elm_priv.h" -static void _elm_label_text_set(Elm_Label *lb, const char *text); +typedef struct _Widget_Data Widget_Data; -Elm_Label_Class _elm_label_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_LABEL, - _elm_label_text_set + Evas_Object *lbl; }; +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); + static void -_elm_label_text_set(Elm_Label *lb, const char *text) +_del_hook(Evas_Object *obj) { - Evas_Coord mw, mh; - - if (lb->text) evas_stringshare_del(lb->text); - if (text) lb->text = evas_stringshare_add(text); - else lb->text = NULL; - edje_object_part_text_set(lb->base, "elm.text", text); - edje_object_size_min_calc(lb->base, &mw, &mh); - if ((lb->minw != mw) || (lb->minh != mh)) - { - lb->minw = mw; - lb->minh = mh; - ((Elm_Widget *)(lb->parent))->size_req(lb->parent, lb, lb->minw, lb->minh); - lb->geom_set(lb, lb->x, lb->y, lb->minw, lb->minh); - } + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); } static void -_elm_label_size_alloc(Elm_Label *lb, int w, int h) +_sizing_eval(Evas_Object *obj) { - lb->req.w = lb->minw; - lb->req.h = lb->minh; + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + + edje_object_size_min_calc(wd->lbl, &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); } -static void -_elm_label_del(Elm_Label *lb) +EAPI Evas_Object * +elm_label_add(Evas_Object *parent) { - if (lb->text) evas_stringshare_del(lb->text); - ((Elm_Obj_Class *)(((Elm_Label_Class *)(lb->clas))->parent))->del(ELM_OBJ(lb)); + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + elm_widget_can_focus_set(obj, 0); + + wd->lbl = edje_object_add(e); + _elm_theme_set(wd->lbl, "label", "label"); + elm_widget_resize_object_set(obj, wd->lbl); + return obj; } -EAPI Elm_Label * -elm_label_new(Elm_Win *win) +EAPI void +elm_label_label_set(Evas_Object *obj, const char *label) { - Elm_Label *lb; - - lb = ELM_NEW(Elm_Label); - - _elm_widget_init(lb); - lb->clas = &_elm_label_class; - lb->type = ELM_OBJ_LABEL; - - lb->del = _elm_label_del; - - lb->size_alloc = _elm_label_size_alloc; - - lb->text_set = _elm_label_text_set; - - lb->base = edje_object_add(win->evas); - _elm_theme_set(lb->base, "label", "label"); - _elm_widget_post_init(lb); - win->child_add(win, lb); - return lb; + Widget_Data *wd = elm_widget_data_get(obj); + edje_object_part_text_set(wd->lbl, "elm.text", label); + _sizing_eval(obj); } diff --git a/legacy/elementary/src/lib/elm_main.c b/legacy/elementary/src/lib/elm_main.c index f919f2ad40..a0e27614a9 100644 --- a/legacy/elementary/src/lib/elm_main.c +++ b/legacy/elementary/src/lib/elm_main.c @@ -56,6 +56,8 @@ elm_init(int argc, char **argv) EAPI void elm_shutdown(void) { + _elm_win_shutdown(); + free(_elm_config); free(_elm_appname); ecore_evas_shutdown(); diff --git a/legacy/elementary/src/lib/elm_pad.c b/legacy/elementary/src/lib/elm_pad.c deleted file mode 100644 index 0513f4df5e..0000000000 --- a/legacy/elementary/src/lib/elm_pad.c +++ /dev/null @@ -1,116 +0,0 @@ -#include -#include "elm_priv.h" - -Elm_Pad_Class _elm_pad_class = -{ - &_elm_widget_class, - ELM_OBJ_PAD -}; - -static void -_elm_pad_size_alloc(Elm_Pad *pd, int w, int h) -{ - if (w < pd->minw) w = pd->minw; - if (h < pd->minh) h = pd->minh; - pd->req.w = w; - pd->req.h = h; -} - -static void -_elm_pad_size_req(Elm_Pad *pd, Elm_Widget *child, int w, int h) -{ - Evas_Coord mw, mh; - - if (child) - { - Evas_Coord maxx, maxy; - - child->size_alloc(child, 0, 0); - maxx = child->req.w; - maxy = child->req.h; - if (child->expand_x) maxx = 32767; - if (child->expand_y) maxy = 32767; - edje_extern_object_min_size_set(child->base, - child->req.w, - child->req.h); - edje_object_part_swallow(pd->base , "elm.swallow.contents", - child->base); - edje_object_size_min_calc(pd->base, &mw, &mh); - if ((pd->minw != mw) || (pd->minh != mh)) - { - pd->minw = mw; - pd->minh = mh; - ((Elm_Widget *)(pd->parent))->size_req(pd->parent, pd, mw, mh); - pd->geom_set(pd, pd->x, pd->y, mw, mh); - } - } - else - { - // FIXME: handle - } -} - -static void -_elm_on_child_add(void *data, Elm_Pad *pd, Elm_Cb_Type type, Elm_Obj *obj) -{ - Evas_Coord mw, mh; - - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - ((Elm_Widget *)(obj))->size_alloc(obj, 0, 0); - ((Elm_Widget *)(obj))->geom_set(obj, - ((Elm_Widget *)(obj))->x, - ((Elm_Widget *)(obj))->y, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_extern_object_min_size_set(((Elm_Widget *)(obj))->base, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_object_part_swallow(pd->base , "elm.swallow.content", - ((Elm_Widget *)(obj))->base); - edje_object_size_min_calc(pd->base, &mw, &mh); - if ((pd->minw != mw) || (pd->minh != mh)) - { - pd->minw = mw; - pd->minh = mh; - ((Elm_Widget *)(pd->parent))->size_req(pd->parent, pd, mw, mh); - pd->geom_set(pd, pd->x, pd->y, mw, mh); - } -} - -static void -_elm_on_child_del(void *data, Elm_Pad *pd, Elm_Cb_Type type, Elm_Obj *obj) -{ - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - // FIXME: allow for removal of child - size down -} - -static void -_elm_pad_del(Elm_Pad *pd) -{ - ((Elm_Obj_Class *)(((Elm_Pad_Class *)(pd->clas))->parent))->del(ELM_OBJ(pd)); -} - -EAPI Elm_Pad * -elm_pad_new(Elm_Win *win) -{ - Elm_Pad *pd; - - pd = ELM_NEW(Elm_Pad); - - _elm_widget_init(pd); - pd->clas = &_elm_pad_class; - pd->type = ELM_OBJ_PAD; - - pd->del = _elm_pad_del; - - pd->size_alloc = _elm_pad_size_alloc; - pd->size_req = _elm_pad_size_req; - - pd->base = edje_object_add(win->evas); - _elm_theme_set(pd->base, "pad", "pad"); - pd->cb_add(pd, ELM_CB_CHILD_ADD, _elm_on_child_add, NULL); - pd->cb_add(pd, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(pd); - win->child_add(win, pd); - return pd; -} diff --git a/legacy/elementary/src/lib/elm_priv.h b/legacy/elementary/src/lib/elm_priv.h index 02dee8267f..c135d03ee2 100644 --- a/legacy/elementary/src/lib/elm_priv.h +++ b/legacy/elementary/src/lib/elm_priv.h @@ -32,6 +32,39 @@ struct _Elm_Config #define ELM_NEW(t) calloc(1, sizeof(t)) +void _elm_win_shutdown(void); + +/* FIXME: should this be public? for now - private (but public symbols) */ +EAPI Evas_Object *elm_widget_add(Evas *evas); +EAPI void elm_widget_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void elm_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); +EAPI void elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); +EAPI void elm_widget_data_set(Evas_Object *obj, void *data); +EAPI void *elm_widget_data_get(Evas_Object *obj); +EAPI void elm_widget_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh); +EAPI void elm_widget_min_size_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh); +EAPI void elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj); +EAPI void elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj); +EAPI void elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj); +EAPI void elm_widget_can_focus_set(Evas_Object *obj, int can_focus); +EAPI int elm_widget_can_focus_get(Evas_Object *obj); +EAPI int elm_widget_focus_get(Evas_Object *obj); +EAPI Evas_Object *elm_widget_focused_object_get(Evas_Object *obj); +EAPI int elm_widget_focus_jump(Evas_Object *obj, int forward); +EAPI void elm_widget_focus_set(Evas_Object *obj, int first); +EAPI void elm_widget_focused_object_clear(Evas_Object *obj); +EAPI Evas_Object *elm_widget_parent_get(Evas_Object *obj); +EAPI void elm_widget_focus_steal(Evas_Object *obj); +EAPI void elm_widget_activate(Evas_Object *obj); +EAPI void elm_widget_change(Evas_Object *obj); +EAPI void elm_widget_disabled_set(Evas_Object *obj, int disabled); +EAPI int elm_widget_disabled_get(Evas_Object *obj); +EAPI void elm_widget_min_size_resize(Evas_Object *obj); + +/* void _elm_obj_init(Elm_Obj *obj); void _elm_obj_nest_push(void); void _elm_obj_nest_pop(void); @@ -41,11 +74,13 @@ void _elm_cb_call(Elm_Obj *obj, Elm_Cb_Type, void *info); int _elm_theme_set(Evas_Object *o, const char *clas, const char *group); void _elm_widget_init(Elm_Widget *wid); void _elm_widget_post_init(Elm_Widget *wid); - +*/ + extern char *_elm_appname; extern Elm_Config *_elm_config; +/* extern Elm_Obj_Class _elm_obj_class; extern Elm_Win_Class _elm_win_class; extern Elm_Widget_Class _elm_widget_class; @@ -61,5 +96,6 @@ extern Elm_Clock_Class _elm_clock_class; extern Elm_Frame_Class _elm_frame_class; extern Elm_Pad_Class _elm_pad_class; extern Elm_Contactlist_Class _elm_contactlist_class; - +*/ + #endif diff --git a/legacy/elementary/src/lib/elm_scroller.c b/legacy/elementary/src/lib/elm_scroller.c index ec2a21b014..b214bd9ee9 100644 --- a/legacy/elementary/src/lib/elm_scroller.c +++ b/legacy/elementary/src/lib/elm_scroller.c @@ -1,100 +1,96 @@ #include #include "elm_priv.h" -static void _elm_scroller_del(Elm_Scroller *sc); - -Elm_Scroller_Class _elm_scroller_class = +typedef struct _Widget_Data Widget_Data; + +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_SCROLLER + Evas_Object *scr; + Evas_Object *child; }; +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); + static void -_elm_scroller_del(Elm_Scroller *sc) +_del_hook(Evas_Object *obj) { - evas_object_del(sc->scroller_pan); - ((Elm_Obj_Class *)(((Elm_Scroller_Class *)(sc->clas))->parent))->del(ELM_OBJ(sc)); + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); } static void -_elm_scroller_geom_set(Elm_Scroller *sc, int x, int y, int w, int h) +_sizing_eval(Evas_Object *obj) { - Evas_Coord vw, vh; - - printf("sc geom set %ix%i (am %ix%i)\n", w, h, sc->w, sc->h); - if ((sc->w != w) || (sc->h != h) || (sc->x != x) || (sc->y != y)) + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord vw, vh, minw, minh, maxw, maxh; + double xw, xy; + + evas_object_size_hint_min_get(wd->child, &minw, &minh); + evas_object_size_hint_max_get(wd->child, &maxw, &maxh); + evas_object_size_hint_weight_get(wd->child, &xw, &xy); + elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh); + if (xw > 0.0) { - Evas_List *l; - int tries = 0; - - ((Elm_Widget_Class *)(((Elm_Scroller_Class *)(sc->clas))->parent))->geom_set(sc, x, y, w, h); - again: - tries++; - elm_smart_scroller_child_viewport_size_get(sc->base, &vw, &vh); - for (l = sc->children; l; l = l->next) - { - if (((Elm_Obj *)(l->data))->hastype(l->data, ELM_OBJ_WIDGET)) - { - ((Elm_Widget *)(l->data))->size_alloc(l->data, vw, vh); - ((Elm_Widget *)(l->data))->geom_set(l->data, - ((Elm_Widget *)(l->data))->x, - ((Elm_Widget *)(l->data))->y, - ((Elm_Widget *)(l->data))->req.w, - ((Elm_Widget *)(l->data))->req.h); -// FIXME: if scrollbars affect viewport size then we get an on/off effect of -// resizing child up and down. we need to find a way to avoid this. this tries -// this is a hack - but works. - if ((tries == 1) && - (((vw == ((Elm_Widget *)(l->data))->req.w) || - (vh == ((Elm_Widget *)(l->data))->req.h)))) goto again; - } - } + if ((minw > 0) && (vw < minw)) vw = minw; + else if ((maxw > 0) && (vw > maxw)) vw = maxw; } + else if (minw > 0) vw = minw; + if (xy > 0.0) + { + if ((minh > 0) && (vh < minh)) vh = minh; + else if ((maxh > 0) && (vh > maxh)) vh = maxh; + } + else if (minh > 0) vh = minh; + evas_object_resize(wd->child, vw, vh); } static void -_elm_on_child_add(void *data, Elm_Scroller *sc, Elm_Cb_Type type, Elm_Obj *obj) +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { - Evas_Coord vw, vh; - - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - elm_smart_scroller_child_set(sc->base, ((Elm_Widget *)(obj))->base); - elm_smart_scroller_child_viewport_size_get(sc->base, &vw, &vh); - ((Elm_Widget *)(obj))->size_alloc(obj, vw, vh); - ((Elm_Widget *)(obj))->geom_set(obj, - ((Elm_Widget *)(obj))->x, - ((Elm_Widget *)(obj))->y, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); + _sizing_eval(data); } static void -_elm_on_child_del(void *data, Elm_Scroller *sc, Elm_Cb_Type type, Elm_Obj *obj) +_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) { - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - elm_smart_scroller_child_set(sc->base, NULL); + _sizing_eval(data); } -EAPI Elm_Scroller * -elm_scroller_new(Elm_Win *win) +EAPI Evas_Object * +elm_scroller_add(Evas_Object *parent) { - Elm_Scroller *sc; + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + Evas_Coord vw, vh, minw, minh; - sc = ELM_NEW(Elm_Scroller); - _elm_widget_init(sc); + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); - sc->clas = &_elm_scroller_class; - sc->type = ELM_OBJ_SCROLLER; + wd->scr = elm_smart_scroller_add(e); + elm_widget_resize_object_set(obj, wd->scr); - sc->del = _elm_scroller_del; + edje_object_size_min_calc(wd->scr, &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj); - sc->geom_set = _elm_scroller_geom_set; - - sc->base = elm_smart_scroller_add(win->evas); - - sc->cb_add(sc, ELM_CB_CHILD_ADD, _elm_on_child_add, NULL); - sc->cb_add(sc, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(sc); - win->child_add(win, sc); - return sc; + _sizing_eval(obj); + return obj; +} + +EAPI void +elm_scroller_child_set(Evas_Object *obj, Evas_Object *child) +{ + Widget_Data *wd = elm_widget_data_get(obj); + wd->child = child; + elm_smart_scroller_child_set(wd->scr, child); + evas_object_event_callback_add(child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + elm_widget_sub_object_add(obj, child); + // FIXME: track new sub obj... + _sizing_eval(obj); } diff --git a/legacy/elementary/src/lib/elm_table.c b/legacy/elementary/src/lib/elm_table.c index 3c61adae19..4776ea6cc2 100644 --- a/legacy/elementary/src/lib/elm_table.c +++ b/legacy/elementary/src/lib/elm_table.c @@ -1,105 +1,81 @@ #include #include "elm_priv.h" -static void _elm_table_layout_update(Elm_Table *tb); -static void _elm_table_pack(Elm_Table *tb, Elm_Widget *wid, int x, int y, int w, int h); +typedef struct _Widget_Data Widget_Data; -Elm_Table_Class _elm_table_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_TABLE, - _elm_table_layout_update, - _elm_table_pack, + Evas_Object *tbl; }; +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); + static void -_elm_table_layout_update(Elm_Table *tb) +_del_hook(Evas_Object *obj) { - _els_smart_table_homogenous_set(tb->base, tb->homogenous); + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); } static void -_elm_table_pack(Elm_Table *tb, Elm_Widget *wid, int x, int y, int w, int h) +_sizing_eval(Evas_Object *obj) { - tb->child_add(tb, wid); - _els_smart_table_pack(tb->base, wid->base, x, y, w, h); - elm_widget_sizing_update(wid); + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + Evas_Coord w, h; + + evas_object_size_hint_min_get(wd->tbl, &minw, &minh); + evas_object_size_hint_max_get(wd->tbl, &maxw, &maxh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + if (w < minw) w = minw; + if (h < minh) h = minh; + if ((maxw >= 0) && (w > maxw)) w = maxw; + if ((maxh >= 0) && (h > maxh)) h = maxh; + evas_object_resize(obj, w, h); } static void -_elm_table_size_alloc(Elm_Table *tb, int w, int h) +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { - Evas_Coord mw, mh; - - _els_smart_table_min_size_get(tb->base, &mw, &mh); - if (w < mw) w = mw; - if (h < mh) h = mh; - tb->req.w = w; - tb->req.h = h; -} - -static void -_elm_table_size_req(Elm_Table *tb, Elm_Widget *child, int w, int h) -{ - Evas_Coord mw, mh; - - if (child) - { - Evas_Coord maxx, maxy; - - child->size_alloc(child, 0, 0); - maxx = child->req.w; - maxy = child->req.h; - if (child->expand_x) maxx = 32767; - if (child->expand_y) maxy = 32767; - _els_smart_table_pack_options_set(child->base, - child->fill_x, child->fill_y, - child->expand_x, child->expand_y, - child->align_x, child->align_y, - child->req.w, child->req.h, - maxx, maxy); - } - else - { - // FIXME: handle. - } - _els_smart_table_min_size_get(tb->base, &mw, &mh); - ((Elm_Widget *)(tb->parent))->size_req(tb->parent, tb, mw, mh); - tb->geom_set(tb, tb->x, tb->y, mw, mh); + _sizing_eval(data); } -static void -_elm_on_child_del(void *data, Elm_Table *tb, Elm_Cb_Type type, Elm_Obj *obj) +EAPI Evas_Object * +elm_table_add(Evas_Object *parent) { - Evas_Coord mw, mh; + Evas_Object *obj; + Evas *e; + Widget_Data *wd; - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - _els_smart_table_unpack(((Elm_Widget *)(obj))->base); - ((Elm_Widget *)(tb->parent))->size_req(tb->parent, tb, mw, mh); - tb->geom_set(tb, tb->x, tb->y, mw, mh); + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + + wd->tbl = _els_smart_table_add(e); + elm_widget_sub_object_add(obj, wd->tbl); + evas_object_event_callback_add(wd->tbl, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + elm_widget_resize_object_set(obj, wd->tbl); + return obj; } -EAPI Elm_Table * -elm_table_new(Elm_Win *win) +EAPI void +elm_table_homogenous_set(Evas_Object *obj, Evas_Bool homogenous) { - Elm_Table *tb; - - tb = ELM_NEW(Elm_Table); - - _elm_widget_init(tb); - tb->clas = &_elm_table_class; - tb->type = ELM_OBJ_TABLE; - - tb->layout_update = _elm_table_layout_update; - tb->pack = _elm_table_pack; - - tb->size_alloc = _elm_table_size_alloc; - tb->size_req = _elm_table_size_req; - - tb->base = _els_smart_table_add(win->evas); - - tb->cb_add(tb, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(tb); - win->child_add(win, tb); - return tb; + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_table_homogenous_set(wd->tbl, homogenous); +} + +EAPI void +elm_table_pack(Evas_Object *obj, Evas_Object *subobj, int x, int y, int w, int h) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _els_smart_table_pack(wd->tbl, subobj, x, y, w, h); + elm_widget_sub_object_add(obj, subobj); + // FIXME: track new sub obj... } diff --git a/legacy/elementary/src/lib/elm_toggle.c b/legacy/elementary/src/lib/elm_toggle.c index 1e73d20c07..1cc2aa553b 100644 --- a/legacy/elementary/src/lib/elm_toggle.c +++ b/legacy/elementary/src/lib/elm_toggle.c @@ -1,210 +1,160 @@ #include #include "elm_priv.h" -static void _elm_toggle_text_set(Elm_Toggle *tg, const char *text); -static void _elm_toggle_layout_update(Elm_Toggle *tg); -static void _elm_toggle_states_text_set(Elm_Toggle *tg, const char *ontext, const char *offtext); +typedef struct _Widget_Data Widget_Data; -Elm_Toggle_Class _elm_toggle_class = +struct _Widget_Data { - &_elm_widget_class, - ELM_OBJ_TOGGLE, - _elm_toggle_text_set, - _elm_toggle_layout_update, - _elm_toggle_states_text_set + Evas_Object *tgl; + Evas_Bool state; + Evas_Bool *statep; }; -static void -_elm_toggle_text_set(Elm_Toggle *tg, const char *text) -{ - Evas_Coord mw, mh; +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _signal_toggle_off(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _signal_toggle_on(void *data, Evas_Object *obj, const char *emission, const char *source); - if (text) - { - edje_object_signal_emit(tg->base, "elm,state,text,visible", "elm"); - edje_object_message_signal_process(tg->base); - } - else - { - edje_object_signal_emit(tg->base, "elm,state,text,hidden", "elm"); - edje_object_message_signal_process(tg->base); - } - edje_object_part_text_set(tg->base, "elm.text", text); - edje_object_size_min_calc(tg->base, &mw, &mh); - if ((tg->minw != mw) || (tg->minh != mh)) - { - tg->minw = mw; - tg->minh = mh; - ((Elm_Widget *)(tg->parent))->size_req(tg->parent, tg, tg->minw, tg->minh); - tg->geom_set(tg, tg->x, tg->y, tg->minw, tg->minh); - } +static void +_del_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + free(wd); } static void -_elm_toggle_states_text_set(Elm_Toggle *tg, const char *ontext, const char *offtext) +_sizing_eval(Evas_Object *obj) { - edje_object_part_text_set(tg->base, "elm.ontext", ontext); - edje_object_part_text_set(tg->base, "elm.offtext", offtext); + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + + edje_object_size_min_calc(wd->tgl, &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); } static void -_elm_toggle_layout_update(Elm_Toggle *tg) +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { - if (tg->state_ptr) tg->state = *(tg->state_ptr); - if (tg->state) - edje_object_signal_emit(tg->base, "elm,state,toggle,on", "elm"); - else - edje_object_signal_emit(tg->base, "elm,state,toggle,off", "elm"); + Widget_Data *wd = elm_widget_data_get(data); + edje_object_part_swallow(wd->tgl, "elm.swallow.content", obj); + _sizing_eval(data); } static void -_elm_toggle_size_alloc(Elm_Toggle *tg, int w, int h) +_signal_toggle_off(void *data, Evas_Object *obj, const char *emission, const char *source) { - if (w < tg->minw) w = tg->minw; - if (h < tg->minh) h = tg->minh; - tg->req.w = w; - tg->req.h = h; + Widget_Data *wd = elm_widget_data_get(data); + wd->state = 0; + if (wd->statep) *wd->statep = wd->state; + evas_object_smart_callback_call(data, "changed", NULL); } static void -_elm_toggle_size_req(Elm_Toggle *tg, Elm_Widget *child, int w, int h) +_signal_toggle_on(void *data, Evas_Object *obj, const char *emission, const char *source) { + Widget_Data *wd = elm_widget_data_get(data); + wd->state = 1; + if (wd->statep) *wd->statep = wd->state; + evas_object_smart_callback_call(data, "changed", NULL); +} + +EAPI Evas_Object * +elm_toggle_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_hook); + + wd->tgl = edje_object_add(e); + _elm_theme_set(wd->tgl, "toggle", "toggle"); + edje_object_signal_callback_add(wd->tgl, "elm,action,toggle,on", "", _signal_toggle_on, obj); + edje_object_signal_callback_add(wd->tgl, "elm,action,toggle,off", "", _signal_toggle_off, obj); + elm_widget_resize_object_set(obj, wd->tgl); + + _sizing_eval(obj); + return obj; +} + +EAPI void +elm_toggle_label_set(Evas_Object *obj, const char *label) +{ + Widget_Data *wd = elm_widget_data_get(obj); Evas_Coord mw, mh; - if (child) + if (label) { - Evas_Coord maxx, maxy; - - child->size_alloc(child, 0, 0); - maxx = child->req.w; - maxy = child->req.h; - if (child->expand_x) maxx = 32767; - if (child->expand_y) maxy = 32767; - edje_extern_object_min_size_set(child->base, - child->req.w, - child->req.h); - edje_object_part_swallow(tg->base , "elm.swallow.contents", - child->base); - edje_object_size_min_calc(tg->base, &mw, &mh); - if ((tg->minw != mw) || (tg->minh != mh)) + edje_object_signal_emit(wd->tgl, "elm,state,text,visible", "elm"); + edje_object_message_signal_process(wd->tgl); + } + else + { + edje_object_signal_emit(wd->tgl, "elm,state,text,hidden", "elm"); + edje_object_message_signal_process(wd->tgl); + } + edje_object_part_text_set(wd->tgl, "elm.text", label); + _sizing_eval(obj); +} + +EAPI void +elm_toggle_icon_set(Evas_Object *obj, Evas_Object *icon) +{ + Widget_Data *wd = elm_widget_data_get(obj); + edje_object_part_swallow(wd->tgl, "elm.swallow.content", icon); + edje_object_signal_emit(wd->tgl, "elm,state,icon,visible", "elm"); + elm_widget_sub_object_add(obj, icon); + evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + // FIXME: track new sub obj... + _sizing_eval(obj); +} + +EAPI void +elm_toggle_states_labels_set(Evas_Object *obj, const char *onlabel, const char *offlabel) +{ + Widget_Data *wd = elm_widget_data_get(obj); + edje_object_part_text_set(wd->tgl, "elm.ontext", onlabel); + edje_object_part_text_set(wd->tgl, "elm.offtext", offlabel); + _sizing_eval(obj); +} + +EAPI void +elm_toggle_state_set(Evas_Object *obj, Evas_Bool state) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (state != wd->state) + { + wd->state = state; + if (wd->statep) *wd->statep = wd->state; + if (wd->state) + edje_object_signal_emit(wd->tgl, "elm,state,toggle,on", "elm"); + else + edje_object_signal_emit(wd->tgl, "elm,state,toggle,off", "elm"); + } +} + +EAPI void +elm_toggle_state_pointer_set(Evas_Object *obj, Evas_Bool *statep) +{ + Widget_Data *wd = elm_widget_data_get(obj); + + if (statep) + { + wd->statep = statep; + if (*wd->statep != wd->state) { - tg->minw = mw; - tg->minh = mh; - ((Elm_Widget *)(tg->parent))->size_req(tg->parent, tg, mw, mh); - tg->geom_set(tg, tg->x, tg->y, mw, mh); + wd->state = *wd->statep; + if (wd->state) + edje_object_signal_emit(wd->tgl, "elm,state,toggle,on", "elm"); + else + edje_object_signal_emit(wd->tgl, "elm,state,toggle,off", "elm"); } } - else - { - // FIXME: handle - } -} - -static void -_elm_on_child_add(void *data, Elm_Toggle *tg, Elm_Cb_Type type, Elm_Obj *obj) -{ - Evas_Coord mw, mh; - - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - edje_object_signal_emit(tg->base, "elm,state,icon,visible", "elm"); - edje_object_message_signal_process(tg->base); - ((Elm_Widget *)(obj))->size_alloc(obj, 0, 0); - ((Elm_Widget *)(obj))->geom_set(obj, - ((Elm_Widget *)(obj))->x, - ((Elm_Widget *)(obj))->y, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_extern_object_min_size_set(((Elm_Widget *)(obj))->base, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_object_part_swallow(tg->base , "elm.swallow.contents", - ((Elm_Widget *)(obj))->base); - edje_object_size_min_calc(tg->base, &mw, &mh); - if ((tg->minw != mw) || (tg->minh != mh)) - { - tg->minw = mw; - tg->minh = mh; - ((Elm_Widget *)(tg->parent))->size_req(tg->parent, tg, mw, mh); - tg->geom_set(tg, tg->x, tg->y, mw, mh); - } -} - -static void -_elm_on_child_del(void *data, Elm_Toggle *tg, Elm_Cb_Type type, Elm_Obj *obj) -{ - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - // FIXME: allow for removal of child - size down - edje_object_signal_emit(tg->base, "elm,state,icon,hidden", "elm"); - edje_object_message_signal_process(tg->base); -} - -static void -_elm_toggle_activate(Elm_Toggle *tg) -{ - if (tg->state_ptr) *(tg->state_ptr) = tg->state; - _elm_obj_nest_push(); - _elm_cb_call(ELM_OBJ(tg), ELM_CB_CHANGED, NULL); - _elm_obj_nest_pop(); -} - -static void -_elm_signal_toggle_on(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Elm_Toggle *tg = data; - - if (tg->state) return; - tg->state = 1; - _elm_toggle_activate(tg); -} - -static void -_elm_signal_toggle_off(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - Elm_Toggle *tg = data; - - if (!tg->state) return; - tg->state = 0; - _elm_toggle_activate(tg); -} - -static void -_elm_toggle_del(Elm_Toggle *tg) -{ - if (tg->text) evas_stringshare_del(tg->text); - ((Elm_Obj_Class *)(((Elm_Toggle_Class *)(tg->clas))->parent))->del(ELM_OBJ(tg)); -} - -EAPI Elm_Toggle * -elm_toggle_new(Elm_Win *win) -{ - Elm_Toggle *tg; - - tg = ELM_NEW(Elm_Toggle); - - _elm_widget_init(tg); - tg->clas = &_elm_toggle_class; - tg->type = ELM_OBJ_TOGGLE; - - tg->del = _elm_toggle_del; - - tg->size_alloc = _elm_toggle_size_alloc; - tg->size_req = _elm_toggle_size_req; - - tg->text_set = _elm_toggle_text_set; - tg->layout_update = _elm_toggle_layout_update; - tg->states_text_set = _elm_toggle_states_text_set; - - tg->base = edje_object_add(win->evas); - _elm_theme_set(tg->base, "toggle", "toggle"); - edje_object_part_text_set(tg->base, "elm.ontext", "ON"); - edje_object_part_text_set(tg->base, "elm.offtext", "OFF"); - edje_object_signal_callback_add(tg->base, "elm,action,toggle,on", "", - _elm_signal_toggle_on, tg); - edje_object_signal_callback_add(tg->base, "elm,action,toggle,off", "", - _elm_signal_toggle_off, tg); - tg->cb_add(tg, ELM_CB_CHILD_ADD, _elm_on_child_add, NULL); - tg->cb_add(tg, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(tg); - win->child_add(win, tg); - return tg; } diff --git a/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c index 2fddfa8b0f..a80d1b8fb9 100644 --- a/legacy/elementary/src/lib/elm_widget.c +++ b/legacy/elementary/src/lib/elm_widget.c @@ -1,137 +1,576 @@ #include #include "elm_priv.h" -static void _elm_widget_geom_set(Elm_Widget *wid, int x, int y, int w, int h); -static void _elm_widget_show(Elm_Widget *wid); -static void _elm_widget_hide(Elm_Widget *wid); -static void _elm_widget_size_alloc(Elm_Widget *wid, int w, int h); -static void _elm_widget_size_req(Elm_Widget *wid, Elm_Widget *child, int w, int h); -static void _elm_widget_del(Elm_Widget *wid); -static void _elm_widget_above(Elm_Widget *wid, Elm_Widget *above); -static void _elm_widget_below(Elm_Widget *wid, Elm_Widget *below); - -Elm_Widget_Class _elm_widget_class = +#define SMART_NAME "e_widget" +#define API_ENTRY Smart_Data *sd; sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME))) +#define INTERNAL_ENTRY Smart_Data *sd; sd = evas_object_smart_data_get(obj); if (!sd) return; +typedef struct _Smart_Data Smart_Data; + +struct _Smart_Data +{ + Evas_Object *parent_obj; + Evas_Coord x, y, w, h; + Evas_Coord minw, minh; + Evas_List *subobjs; + Evas_Object *resize_obj; + void (*del_func) (Evas_Object *obj); + void (*focus_func) (Evas_Object *obj); + void (*activate_func) (Evas_Object *obj); + void (*disable_func) (Evas_Object *obj); + void (*on_focus_func) (void *data, Evas_Object *obj); + void *on_focus_data; + void (*on_change_func) (void *data, Evas_Object *obj); + void *on_change_data; + void *data; + unsigned char can_focus : 1; + unsigned char child_can_focus : 1; + unsigned char focused : 1; + unsigned char disabled : 1; +}; + +/* local subsystem functions */ +static void _smart_reconfigure(Smart_Data *sd); +static void _smart_add(Evas_Object *obj); +static void _smart_del(Evas_Object *obj); +static void _smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static void _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h); +static void _smart_show(Evas_Object *obj); +static void _smart_hide(Evas_Object *obj); +static void _smart_color_set(Evas_Object *obj, int r, int g, int b, int a); +static void _smart_clip_set(Evas_Object *obj, Evas_Object * clip); +static void _smart_clip_unset(Evas_Object *obj); +static void _smart_init(void); + +/* local subsystem globals */ +static Evas_Smart *_e_smart = NULL; + +/* externally accessible functions */ +EAPI Evas_Object * +elm_widget_add(Evas *evas) { - &_elm_obj_class, /* parent */ - ELM_OBJ_WIDGET, - _elm_widget_geom_set, - _elm_widget_show, - _elm_widget_hide, - _elm_widget_size_alloc, - _elm_widget_size_req, - _elm_widget_above, - _elm_widget_below -}; - -static void -_elm_widget_geom_set(Elm_Widget *wid, int x, int y, int w, int h) -{ - if ((wid->x != x) || (wid->y != y)) - { - wid->x = x; - wid->y = y; - evas_object_move(wid->base, wid->x, wid->y); - } - if ((wid->w != w) || (wid->h != h)) - { - wid->w = w; - wid->h = h; - evas_object_resize(wid->base, wid->w, wid->h); - _elm_obj_nest_push(); - _elm_cb_call(ELM_OBJ(wid), ELM_CB_RESIZE, NULL); - _elm_obj_nest_pop(); - } -} - -static void -_elm_widget_show(Elm_Widget *wid) -{ - evas_object_show(wid->base); -} - -static void -_elm_widget_hide(Elm_Widget *wid) -{ - evas_object_hide(wid->base); -} - -static void -_elm_widget_size_alloc(Elm_Widget *wid, int w, int h) -{ - // FIXME: widget gets to implement min/max etc. size here (indicating - // given the input w, h - what size it is willing to accept, then the - // parent checks and geometry_set()'s the child - wid->req.w = w; - wid->req.h = h; -} - -static void -_elm_widget_size_req(Elm_Widget *wid, Elm_Widget *child, int w, int h) -{ - // FIXME: a child will ask its parent for a requested size if something - // with its sizing setup. this is the call in the parent that will be - // called -} - -static void -_elm_widget_above(Elm_Widget *wid, Elm_Widget *above) -{ - if (above) evas_object_stack_above(wid->base, above->base); - else evas_object_raise(wid->base); -} - -static void -_elm_widget_below(Elm_Widget *wid, Elm_Widget *below) -{ - if (below) evas_object_stack_below(wid->base, below->base); - else evas_object_lower(wid->base); -} - -static void -_elm_widget_del(Elm_Widget *wid) -{ - if (_elm_obj_del_defer(ELM_OBJ(wid))) return; - - evas_object_del(wid->base); - - ((Elm_Obj_Class *)(((Elm_Widget_Class *)(wid->clas))->parent))->del(ELM_OBJ(wid)); -} - -void -_elm_widget_init(Elm_Widget *wid) -{ - _elm_obj_init(ELM_OBJ(wid)); - wid->clas = &_elm_widget_class; - wid->type = ELM_OBJ_WIDGET; - - wid->del = _elm_widget_del; - - wid->geom_set = _elm_widget_geom_set; - wid->show = _elm_widget_show; - wid->hide = _elm_widget_hide; - wid->size_alloc = _elm_widget_size_alloc; - wid->size_req = _elm_widget_size_req; - wid->above = _elm_widget_above; - wid->below = _elm_widget_below; - - wid->align_x = 0.5; - wid->align_y = 0.5; - wid->expand_x = 1; - wid->expand_y = 1; - wid->fill_x = 1; - wid->fill_y = 1; -} - -void -_elm_widget_post_init(Elm_Widget *wid) -{ - if (wid->base) evas_object_data_set(wid->base, "__Elm", wid); + _smart_init(); + return evas_object_smart_add(evas, _e_smart); } EAPI void -elm_widget_sizing_update(Elm_Widget *wid) +elm_widget_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) { - wid->size_alloc(wid, 0, 0); - if (!wid->parent) return; - ((Elm_Widget *)(wid->parent))->size_req(wid->parent, wid, wid->w, wid->h); + API_ENTRY return; + sd->del_func = func; +} + +EAPI void +elm_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) +{ + API_ENTRY return; + sd->focus_func = func; +} + +EAPI void +elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) +{ + API_ENTRY return; + sd->activate_func = func; +} + +EAPI void +elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) +{ + API_ENTRY return; + sd->disable_func = func; +} + +EAPI void +elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) +{ + API_ENTRY return; + sd->on_focus_func = func; + sd->on_focus_data = data; +} + +EAPI void +elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) +{ + API_ENTRY return; + sd->on_change_func = func; + sd->on_change_data = data; +} + +EAPI void +elm_widget_data_set(Evas_Object *obj, void *data) +{ + API_ENTRY return; + sd->data = data; +} + +EAPI void * +elm_widget_data_get(Evas_Object *obj) +{ + API_ENTRY return NULL; + return sd->data; +} + +EAPI void +elm_widget_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh) +{ + API_ENTRY return; + if (minw >= 0) + sd->minw = minw; + if (minh >= 0) + sd->minh = minh; +} + +EAPI void +elm_widget_min_size_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh) +{ + API_ENTRY return; + if (minw) *minw = sd->minw; + if (minh) *minh = sd->minh; +} + +EAPI void +elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj) +{ + API_ENTRY return; + sd->subobjs = evas_list_append(sd->subobjs, sobj); + if (!sd->child_can_focus) + { + if (elm_widget_can_focus_get(sobj)) sd->child_can_focus = 1; + } + if (!strcmp(evas_object_type_get(sobj), SMART_NAME)) + { + sd = evas_object_smart_data_get(sobj); + if (sd) + { + if (sd->parent_obj) elm_widget_sub_object_del(sd->parent_obj, sobj); + sd->parent_obj = obj; + } + } +} + +EAPI void +elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj) +{ + API_ENTRY return; + sd->subobjs = evas_list_remove(sd->subobjs, sobj); + if (!sd->child_can_focus) + { + if (elm_widget_can_focus_get(sobj)) sd->child_can_focus = 0; + } +} + +EAPI void +elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj) +{ + API_ENTRY return; + if (sd->resize_obj) evas_object_smart_member_del(sd->resize_obj); + sd->resize_obj = sobj; + evas_object_smart_member_add(sobj, obj); + _smart_reconfigure(sd); +} + +EAPI void +elm_widget_can_focus_set(Evas_Object *obj, int can_focus) +{ + API_ENTRY return; + sd->can_focus = can_focus; +} + +EAPI int +elm_widget_can_focus_get(Evas_Object *obj) +{ + API_ENTRY return 0; + if (sd->can_focus) return 1; + if (sd->child_can_focus) return 1; + return 0; +} + +EAPI int +elm_widget_focus_get(Evas_Object *obj) +{ + API_ENTRY return 0; + return sd->focused; +} + +EAPI Evas_Object * +elm_widget_focused_object_get(Evas_Object *obj) +{ + Evas_List *l; + API_ENTRY return NULL; + if (!sd->focused) return NULL; + for (l = sd->subobjs; l; l = l->next) + { + Evas_Object *fobj; + + fobj = elm_widget_focused_object_get(l->data); + if (fobj) return fobj; + } + return obj; +} + +EAPI int +elm_widget_focus_jump(Evas_Object *obj, int forward) +{ + API_ENTRY return 0; + if (!elm_widget_can_focus_get(obj)) return 0; + + /* if it has a focus func its an end-point widget like a button */ + if (sd->focus_func) + { + if (!sd->focused) sd->focused = 1; + else sd->focused = 0; + sd->focus_func(obj); + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj); + return sd->focused; + } + /* its some container */ + else + { + Evas_List *l; + int focus_next; + + focus_next = 0; + if (!sd->focused) + { + elm_widget_focus_set(obj, forward); + sd->focused = 1; + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj); + return 1; + } + else + { + if (forward) + { + for (l = sd->subobjs; l; l = l->next) + { + if (elm_widget_can_focus_get(l->data)) + { + if ((focus_next) && + (!elm_widget_disabled_get(l->data))) + { + /* the previous focused item was unfocused - so focus + * the next one (that can be focused) */ + if (elm_widget_focus_jump(l->data, forward)) return 1; + else break; + } + else + { + if (elm_widget_focus_get(l->data)) + { + /* jump to the next focused item or focus this item */ + if (elm_widget_focus_jump(l->data, forward)) return 1; + /* it returned 0 - it got to the last item and is past it */ + focus_next = 1; + } + } + } + } + } + else + { + for (l = evas_list_last(sd->subobjs); l; l = l->prev) + { + if (elm_widget_can_focus_get(l->data)) + { + if ((focus_next) && + (!elm_widget_disabled_get(l->data))) + { + /* the previous focused item was unfocused - so focus + * the next one (that can be focused) */ + if (elm_widget_focus_jump(l->data, forward)) return 1; + else break; + } + else + { + if (elm_widget_focus_get(l->data)) + { + /* jump to the next focused item or focus this item */ + if (elm_widget_focus_jump(l->data, forward)) return 1; + /* it returned 0 - it got to the last item and is past it */ + focus_next = 1; + } + } + } + } + } + } + } + /* no next item can be focused */ + sd->focused = 0; + return 0; +} + +EAPI void +elm_widget_focus_set(Evas_Object *obj, int first) +{ + API_ENTRY return; + if (!sd->focused) + { + sd->focused = 1; + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, obj); + } + if (sd->focus_func) + { + sd->focus_func(obj); + return; + } + else + { + Evas_List *l; + + if (first) + { + for (l = sd->subobjs; l; l = l->next) + { + if ((elm_widget_can_focus_get(l->data)) && + (!elm_widget_disabled_get(l->data))) + { + elm_widget_focus_set(l->data, first); + break; + } + } + } + else + { + for (l = evas_list_last(sd->subobjs); l; l = l->prev) + { + if ((elm_widget_can_focus_get(l->data)) && + (!elm_widget_disabled_get(l->data))) + { + elm_widget_focus_set(l->data, first); + break; + } + } + } + } +} + +EAPI Evas_Object * +elm_widget_parent_get(Evas_Object *obj) +{ + API_ENTRY return NULL; + return sd->parent_obj; +} + +EAPI void +elm_widget_focused_object_clear(Evas_Object *obj) +{ + Evas_List *l; + API_ENTRY return; + if (!sd->focused) return; + sd->focused = 0; + for (l = sd->subobjs; l; l = l->next) + { + if (elm_widget_focus_get(l->data)) + { + elm_widget_focused_object_clear(l->data); + break; + } + } + if (sd->focus_func) sd->focus_func(obj); +} + +EAPI void +elm_widget_focus_steal(Evas_Object *obj) +{ + Evas_Object *parent, *o; + API_ENTRY return; + if (sd->focused) return; + if (sd->disabled) return; + parent = obj; + for (;;) + { + o = elm_widget_parent_get(parent); + if (!o) break; + parent = o; + } + elm_widget_focused_object_clear(parent); + parent = obj; + for (;;) + { + sd = evas_object_smart_data_get(parent); + sd->focused = 1; + if (sd->on_focus_func) sd->on_focus_func(sd->on_focus_data, parent); + o = elm_widget_parent_get(parent); + if (!o) break; + parent = o; + } + sd = evas_object_smart_data_get(obj); + if (sd->focus_func) sd->focus_func(obj); + return; +} + +EAPI void +elm_widget_activate(Evas_Object *obj) +{ + API_ENTRY return; + elm_widget_change(obj); + if (sd->activate_func) sd->activate_func(obj); +} + +EAPI void +elm_widget_change(Evas_Object *obj) +{ + API_ENTRY return; + elm_widget_change(elm_widget_parent_get(obj)); + if (sd->on_change_func) sd->on_change_func(sd->on_change_data, obj); +} + +EAPI void +elm_widget_disabled_set(Evas_Object *obj, int disabled) +{ + API_ENTRY return; + if (((sd->disabled) && (disabled)) || + ((!sd->disabled) && (!disabled))) return; + sd->disabled = disabled; + if (sd->focused) + { + Evas_Object *o, *parent; + + parent = obj; + for (;;) + { + o = elm_widget_parent_get(parent); + if (!o) break; + parent = o; + } + elm_widget_focus_jump(parent, 1); + } + if (sd->disable_func) sd->disable_func(obj); +} + +EAPI int +elm_widget_disabled_get(Evas_Object *obj) +{ + API_ENTRY return 0; + return sd->disabled; +} + +EAPI void +elm_widget_min_size_resize(Evas_Object *obj) +{ + API_ENTRY return; + evas_object_resize(obj, sd->minw, sd->minh); +} + +/* local subsystem functions */ +static void +_smart_reconfigure(Smart_Data *sd) +{ + if (sd->resize_obj) + { + evas_object_move(sd->resize_obj, sd->x, sd->y); + evas_object_resize(sd->resize_obj, sd->w, sd->h); + } +} + +static void +_smart_add(Evas_Object *obj) +{ + Smart_Data *sd; + + sd = calloc(1, sizeof(Smart_Data)); + if (!sd) return; + sd->x = 0; + sd->y = 0; + sd->w = 0; + sd->h = 0; + sd->can_focus = 1; + evas_object_smart_data_set(obj, sd); +} + +static void +_smart_del(Evas_Object *obj) +{ + Evas_Object *sobj; + + INTERNAL_ENTRY; + if (sd->del_func) sd->del_func(obj); + while (sd->subobjs) + { + sobj = sd->subobjs->data; + sd->subobjs = evas_list_remove_list(sd->subobjs, sd->subobjs); + evas_object_del(sobj); + } + free(sd); +} + +static void +_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + INTERNAL_ENTRY; + sd->x = x; + sd->y = y; + _smart_reconfigure(sd); +} + +static void +_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + INTERNAL_ENTRY; + sd->w = w; + sd->h = h; + _smart_reconfigure(sd); +} + +static void +_smart_show(Evas_Object *obj) +{ + INTERNAL_ENTRY; + evas_object_show(sd->resize_obj); +} + +static void +_smart_hide(Evas_Object *obj) +{ + INTERNAL_ENTRY; + evas_object_hide(sd->resize_obj); +} + +static void +_smart_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + INTERNAL_ENTRY; + evas_object_color_set(sd->resize_obj, r, g, b, a); +} + +static void +_smart_clip_set(Evas_Object *obj, Evas_Object *clip) +{ + INTERNAL_ENTRY; + evas_object_clip_set(sd->resize_obj, clip); +} + +static void +_smart_clip_unset(Evas_Object *obj) +{ + INTERNAL_ENTRY; + evas_object_clip_unset(sd->resize_obj); +} + +/* never need to touch this */ + +static void +_smart_init(void) +{ + if (_e_smart) return; + { + static const Evas_Smart_Class sc = + { + SMART_NAME, + EVAS_SMART_CLASS_VERSION, + _smart_add, + _smart_del, + _smart_move, + _smart_resize, + _smart_show, + _smart_hide, + _smart_color_set, + _smart_clip_set, + _smart_clip_unset, + NULL, + NULL + }; + _e_smart = evas_smart_class_new(&sc); + } } diff --git a/legacy/elementary/src/lib/elm_win.c b/legacy/elementary/src/lib/elm_win.c index a0c7d185e9..6761dabb8b 100644 --- a/legacy/elementary/src/lib/elm_win.c +++ b/legacy/elementary/src/lib/elm_win.c @@ -1,254 +1,328 @@ #include #include "elm_priv.h" -static void _elm_win_name_set(Elm_Win *win, const char *name); -static void _elm_win_title_set(Elm_Win *win, const char *title); -static void _elm_win_show(Elm_Win *win); -static void _elm_win_hide(Elm_Win *win); -static void _elm_win_del(Elm_Win *win); +typedef struct _Elm_Win Elm_Win; -Elm_Win_Class _elm_win_class = +struct _Elm_Win { - &_elm_obj_class, /* parent */ - ELM_OBJ_WIN, - _elm_win_name_set, - _elm_win_title_set + Ecore_Evas *ee; + Evas *evas; + Evas_Object *parent; + Evas_Object *win_obj; + Evas_List *subobjs; + Ecore_X_Window xwin; + Ecore_Job *deferred_resize_job; + Ecore_Job *deferred_child_eval_job; + Elm_Win_Type type; + Evas_Bool autodel : 1; }; -static void -_elm_child_eval_job(Elm_Win *win) -{ - Evas_List *l; - int w, h; - int expand_x, expand_y; - - win->deferred_child_eval_job = NULL; - _elm_obj_nest_push(); - w = h = 0; - expand_x = expand_y = 0; - for (l = win->children; l; l = l->next) - { - if (((Elm_Obj *)(l->data))->hastype(l->data, ELM_OBJ_WIDGET)) - { - if (((Elm_Widget *)(l->data))->w > w) w = ((Elm_Widget *)(l->data))->w; - if (((Elm_Widget *)(l->data))->h > h) h = ((Elm_Widget *)(l->data))->h; - if (((Elm_Widget *)(l->data))->expand_x) expand_x = 1; - if (((Elm_Widget *)(l->data))->expand_y) expand_y = 1; - } - } - ecore_evas_size_min_set(win->ee, w, h); - if ((!expand_x) && (!expand_y)) ecore_evas_size_max_set(win->ee, w, h); - else if (!expand_x) ecore_evas_size_max_set(win->ee, w, 32727); - else if (!expand_y) ecore_evas_size_max_set(win->ee, 32767, h); - else ecore_evas_size_max_set(win->ee, 0, 0); - if (w < win->w) w = win->w; - if (h < win->h) h = win->h; - if ((w > win->w) || (h > win->h)) ecore_evas_resize(win->ee, w, h); - if (win->showme) - { - win->showme = 0; - ecore_evas_show(win->ee); - } - _elm_obj_nest_pop(); -} +static void _elm_win_resize(Ecore_Evas *ee); +static void _elm_win_obj_intercept_show(void *data, Evas_Object *obj); +static void _elm_win_obj_intercept_hide(void *data, Evas_Object *obj); +static void _elm_win_obj_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static void _elm_win_obj_intercept_resize(void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h); +static void _elm_win_obj_intercept_raise(void *data, Evas_Object *obj); +static void _elm_win_obj_intercept_lower(void *data, Evas_Object *obj); +static void _elm_win_obj_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above); +static void _elm_win_obj_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below); +static void _elm_win_obj_intercept_layer_set(void *data, Evas_Object *obj, int l); +static void _elm_win_obj_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a); +static void _elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _elm_win_obj_callback_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _elm_win_delete_request(Ecore_Evas *ee); +static void _elm_win_resize_job(void *data); +static void _elm_win_xwin_update(Elm_Win *win); +static void _elm_win_eval_subobjs(Evas_Object *obj); +static void _elm_win_subobj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _elm_win_subobj_callback_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void -_elm_on_child_add(void *data, Elm_Win *win, Elm_Cb_Type type, Elm_Obj *obj) -{ - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - if (win->deferred_child_eval_job) ecore_job_del(win->deferred_child_eval_job); - win->deferred_child_eval_job = ecore_job_add(_elm_child_eval_job, win); -} - -static void -_elm_on_child_del(void *data, Elm_Win *win, Elm_Cb_Type type, Elm_Obj *obj) -{ - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - if (win->deferred_child_eval_job) ecore_job_del(win->deferred_child_eval_job); - win->deferred_child_eval_job = ecore_job_add(_elm_child_eval_job, win); -} - -static void -_elm_win_name_set(Elm_Win *win, const char *name) -{ - if (win->name) evas_stringshare_del(win->name); - win->name = evas_stringshare_add(name); - if (win->ee) ecore_evas_name_class_set(win->ee, win->name, _elm_appname); -} - -static void -_elm_win_title_set(Elm_Win *win, const char *title) -{ - if (win->title) evas_stringshare_del(win->title); - win->title = evas_stringshare_add(title); - if (win->ee) ecore_evas_title_set(win->ee, win->title); -} - -static void -_elm_win_show(Elm_Win *win) -{ - if (win->deferred_child_eval_job) - win->showme = 1; - else - ecore_evas_show(win->ee); -} - -static void -_elm_win_hide(Elm_Win *win) -{ - win->showme = 0; - ecore_evas_hide(win->ee); -} - -static void -_elm_win_type_set(Elm_Win *win, Elm_Win_Type type) -{ - if (win->win_type == type) return; - win->win_type = type; - switch (win->win_type) - { - case ELM_WIN_BASIC: - if (win->xwin) ecore_x_netwm_window_type_set(win->xwin, ECORE_X_WINDOW_TYPE_NORMAL); - // FIXME: if child object is a scroll region, then put its child back - break; - case ELM_WIN_DIALOG_BASIC: - if (win->xwin) ecore_x_netwm_window_type_set(win->xwin, ECORE_X_WINDOW_TYPE_DIALOG); - // FIXME: if child object is a scroll region, then put its child back - break; - default: - break; - } -} - -static void -_elm_win_geom_set(Elm_Win *win, int x, int y, int w, int h) -{ - if ((win->w != w) || (win->h != h) || (win->x != x) || (win->y != y)) - { - win->x = x; - win->y = y; - win->w = w; - win->h = h; - ecore_evas_move_resize(win->ee, win->x, win->y, win->w, win->h); - } -} - -static void -_elm_win_size_alloc(Elm_Win *win, int w, int h) -{ - /* this should never be called */ -} - -static void -_elm_win_size_req(Elm_Win *win, Elm_Widget *child, int w, int h) -{ - if (child) - { - if (win->deferred_child_eval_job) ecore_job_del(win->deferred_child_eval_job); - win->deferred_child_eval_job = ecore_job_add(_elm_child_eval_job, win); - } - else - { - if ((w == win->w) && (h == win->h)) return; - ecore_evas_resize(win->ee, w, h); - } -} - -static void -_elm_win_above(Elm_Win *win, Elm_Widget *above) -{ -} - -static void -_elm_win_below(Elm_Win *win, Elm_Widget *below) -{ -} - -static void -_elm_win_del(Elm_Win *win) -{ - if (_elm_obj_del_defer(ELM_OBJ(win))) return; - if (win->ee) - { - ecore_evas_free(win->ee); - evas_stringshare_del(win->title); - evas_stringshare_del(win->name); - } - if (win->deferred_resize_job) - ecore_job_del(win->deferred_resize_job); - if (win->deferred_child_eval_job) - ecore_job_del(win->deferred_child_eval_job); - ((Elm_Obj_Class *)(((Elm_Win_Class *)(win->clas))->parent))->del(ELM_OBJ(win)); -} - - - -static void -_elm_win_delete_request(Ecore_Evas *ee) -{ - Elm_Win *win = ecore_evas_data_get(ee, "__Elm"); - if (!win) return; - _elm_obj_nest_push(); - _elm_cb_call(ELM_OBJ(win), ELM_CB_DEL_REQ, NULL); - if (win->autodel) win->del(ELM_OBJ(win)); - _elm_obj_nest_pop(); -} - -static void -_elm_win_resize_job(Elm_Win *win) -{ - Evas_List *l; - int w, h; - - win->deferred_resize_job = NULL; - ecore_evas_geometry_get(win->ee, NULL, NULL, &w, &h); - if ((win->w == w) && (win->h == h)) return; - win->w = w; - win->h = h; - /* resize all immediate children if they are widgets or sub-classes */ - _elm_obj_nest_push(); - for (l = win->children; l; l = l->next) - { - if (((Elm_Obj *)(l->data))->hastype(l->data, ELM_OBJ_WIDGET)) - ((Elm_Widget *)(l->data))->geom_set(l->data, 0, 0, win->w, win->h); - } - _elm_cb_call(ELM_OBJ(win), ELM_CB_RESIZE, NULL); - _elm_obj_nest_pop(); -} +static Evas_List *_elm_win_list = NULL; static void _elm_win_resize(Ecore_Evas *ee) { Elm_Win *win = ecore_evas_data_get(ee, "__Elm"); - if (!win) return; if (win->deferred_resize_job) ecore_job_del(win->deferred_resize_job); win->deferred_resize_job = ecore_job_add(_elm_win_resize_job, win); } -EAPI Elm_Win * -elm_win_new(void) +static void +_elm_win_obj_intercept_show(void *data, Evas_Object *obj) +{ + Elm_Win *win = data; + ecore_evas_show(win->ee); + evas_object_show(obj); +} + +static void +_elm_win_obj_intercept_hide(void *data, Evas_Object *obj) +{ + Elm_Win *win = data; + ecore_evas_hide(win->ee); + evas_object_hide(obj); +} + +static void +_elm_win_obj_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Elm_Win *win = data; + // FIXME: account for frame + ecore_evas_move(win->ee, x, y); +} + +static void +_elm_win_obj_intercept_resize(void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + Elm_Win *win = data; + ecore_evas_resize(win->ee, w, h); +} + +static void +_elm_win_obj_intercept_raise(void *data, Evas_Object *obj) +{ + Elm_Win *win = data; + ecore_evas_raise(win->ee); +} + +static void +_elm_win_obj_intercept_lower(void *data, Evas_Object *obj) +{ + Elm_Win *win = data; + ecore_evas_lower(win->ee); +} + +static void +_elm_win_obj_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above) +{ + if (above) + { + Elm_Win *win = evas_object_data_get(above, "__Elm"); + if (!win) evas_object_raise(obj); + // FIXME: find window id of win and stack abive + return; + } + evas_object_raise(obj); + return; +} + +static void +_elm_win_obj_intercept_stack_below(void *data, Evas_Object *obj, Evas_Object *below) +{ + if (below) + { + Elm_Win *win = evas_object_data_get(below, "__Elm"); + if (!win) evas_object_raise(obj); + // FIXME: find window id of win and stack below + return; + } + evas_object_lower(obj); + return; +} + +static void +_elm_win_obj_intercept_layer_set(void *data, Evas_Object *obj, int l) +{ + Elm_Win *win = data; + // FIXME: use netwm above/below hints + ecore_evas_layer_set(win->ee, l); +} + +static void +_elm_win_obj_intercept_color_set(void *data, Evas_Object *obj, int r, int g, int b, int a) +{ + return; +} + +static void +_elm_win_obj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Elm_Win *win = data; + + _elm_win_list = evas_list_remove(_elm_win_list, win->win_obj); + while (win->subobjs) elm_win_resize_object_del(obj, win->subobjs->data); + evas_object_intercept_show_callback_del(win->win_obj, _elm_win_obj_intercept_show); + evas_object_intercept_hide_callback_del(win->win_obj, _elm_win_obj_intercept_hide); + evas_object_intercept_move_callback_del(win->win_obj, _elm_win_obj_intercept_move); + evas_object_intercept_resize_callback_del(win->win_obj, _elm_win_obj_intercept_resize); + evas_object_intercept_raise_callback_del(win->win_obj, _elm_win_obj_intercept_raise); + evas_object_intercept_lower_callback_del(win->win_obj, _elm_win_obj_intercept_lower); + evas_object_intercept_stack_above_callback_del(win->win_obj, _elm_win_obj_intercept_stack_above); + evas_object_intercept_stack_below_callback_del(win->win_obj, _elm_win_obj_intercept_stack_below); + evas_object_intercept_layer_set_callback_del(win->win_obj, _elm_win_obj_intercept_layer_set); + evas_object_intercept_color_set_callback_del(win->win_obj, _elm_win_obj_intercept_color_set); + evas_object_event_callback_del(win->win_obj, EVAS_CALLBACK_DEL, _elm_win_obj_callback_del); + evas_object_event_callback_del(win->win_obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _elm_win_obj_callback_changed_size_hints); + ecore_evas_free(win->ee); + if (win->deferred_resize_job) ecore_job_del(win->deferred_resize_job); + if (win->deferred_child_eval_job) ecore_job_del(win->deferred_child_eval_job); + free(win); +} + +static void +_elm_win_obj_callback_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Elm_Win *win = data; + Evas_Coord w, h; + + evas_object_size_hint_min_get(obj, &w, &h); + ecore_evas_size_min_set(win->ee, w, h); + evas_object_size_hint_max_get(obj, &w, &h); + if (w < 1) w = -1; + if (h < 1) h = -1; + ecore_evas_size_max_set(win->ee, w, h); +} + +static void +_elm_win_delete_request(Ecore_Evas *ee) +{ + Elm_Win *win = ecore_evas_data_get(ee, "__Elm"); + evas_object_smart_callback_call(win->win_obj, "delete-request", NULL); + if (win->autodel) evas_object_del(win->win_obj); +} + +static void +_elm_win_resize_job(void *data) +{ + Elm_Win *win = data; + Evas_List *l; + int w, h; + + win->deferred_resize_job = NULL; + ecore_evas_geometry_get(win->ee, NULL, NULL, &w, &h); + evas_object_intercept_resize_callback_del(win->win_obj, _elm_win_obj_intercept_resize); + evas_object_resize(win->win_obj, w, h); + evas_object_intercept_resize_callback_add(win->win_obj, _elm_win_obj_intercept_resize, win); + for (l = win->subobjs; l; l = l->next) + { + evas_object_move(l->data, 0, 0); + evas_object_resize(l->data, w, h); + } +} + +static void +_elm_win_xwin_update(Elm_Win *win) +{ + win->xwin = 0; + switch (_elm_config->engine) + { + case ELM_SOFTWARE_X11: + if (win->ee) win->xwin = ecore_evas_software_x11_window_get(win->ee); + break; + case ELM_SOFTWARE_FB: + break; + case ELM_SOFTWARE_16_X11: + if (win->ee) win->xwin = ecore_evas_software_x11_16_window_get(win->ee); + break; + case ELM_XRENDER_X11: + if (win->ee) win->xwin = ecore_evas_xrender_x11_window_get(win->ee); + break; + case ELM_OPENGL_X11: + if (win->ee) win->xwin = ecore_evas_gl_x11_window_get(win->ee); + break; + default: + break; + } + if (win->parent) + { + Elm_Win *win2; + + win2 = evas_object_data_get(win->parent, "__Elm"); + if (win2) + { + if (win->xwin) + ecore_x_icccm_transient_for_set(win->xwin, win2->xwin); + } + } + + if (win->type == ELM_WIN_BASIC) + { + switch (win->type) + { + case ELM_WIN_BASIC: + if (win->xwin) + ecore_x_netwm_window_type_set(win->xwin, ECORE_X_WINDOW_TYPE_NORMAL); + break; + case ELM_WIN_DIALOG_BASIC: + if (win->xwin) + ecore_x_netwm_window_type_set(win->xwin, ECORE_X_WINDOW_TYPE_DIALOG); + break; + default: + break; + } + } + +} + +static void +_elm_win_eval_subobjs(Evas_Object *obj) +{ + Evas_List *l; + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + Evas_Coord w, h, minw = -1, minh = -1, maxw = -1, maxh = -1; + int xx = 1, xy = 1; + double wx, wy; + + for (l = win->subobjs; l; l = l->next) + { + evas_object_size_hint_weight_get(l->data, &wx, &wy); + if (wx == 0.0) xx = 0; + if (wy == 0.0) xy = 0; + + evas_object_size_hint_min_get(l->data, &w, &h); + if (w < 1) w = -1; + if (h < 1) h = -1; + if (w > minw) minw = w; + if (h > minh) minh = h; + + evas_object_size_hint_max_get(l->data, &w, &h); + if (w < 1) w = -1; + if (h < 1) h = -1; + if (maxw == -1) maxw = w; + else if (w < maxw) maxw = w; + if (maxh == -1) maxh = h; + else if (h < maxh) maxh = h; + } + if ((maxw >= 0) && (maxw < minw)) maxw = minw; + if ((maxh >= 0) && (maxh < minh)) maxh = minh; + if (!xx) maxw = minw; + else maxw = 32767; + if (!xy) maxh = minh; + else maxh = 32767; + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + if (w < minw) w = minw; + if (h < minh) h = minh; + if ((maxw >= 0) && (w > maxw)) w = maxw; + if ((maxh >= 0) && (h > maxh)) h = maxh; + evas_object_resize(obj, w, h); +} + +static void +_elm_win_subobj_callback_del(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + elm_win_resize_object_del(data, obj); +} + +static void +_elm_win_subobj_callback_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _elm_win_eval_subobjs(data); +} + +void +_elm_win_shutdown(void) +{ + while (_elm_win_list) evas_object_del(_elm_win_list->data); +} + +EAPI Evas_Object * +elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) { Elm_Win *win; win = ELM_NEW(Elm_Win); - - _elm_obj_init(ELM_OBJ(win)); - win->clas = &_elm_win_class; - win->type = ELM_OBJ_WIN; - - win->del = _elm_win_del; - - win->geom_set = _elm_win_geom_set; - win->show = _elm_win_show; - win->hide = _elm_win_hide; - win->size_alloc = _elm_win_size_alloc; - win->size_req = _elm_win_size_req; - win->above = _elm_win_above; - win->below = _elm_win_below; - - win->name_set = _elm_win_name_set; - win->title_set = _elm_win_title_set; - switch (_elm_config->engine) { case ELM_SOFTWARE_X11: @@ -277,16 +351,36 @@ elm_win_new(void) if (!win->ee) { printf("ELEMENTARY: Error. Cannot create window.\n"); - win->del(ELM_OBJ(win)); + free(win); return NULL; } - win->type = ELM_WIN_BASIC; - win->name = evas_stringshare_add("default"); - win->title = evas_stringshare_add("Elementary Window"); - + + win->type = type; + win->parent = parent; + win->evas = ecore_evas_get(win->ee); - ecore_evas_title_set(win->ee, win->title); - ecore_evas_name_class_set(win->ee, win->name, _elm_appname); + win->win_obj = elm_widget_add(win->evas); + evas_object_color_set(win->win_obj, 0, 0, 0, 0); + evas_object_move(win->win_obj, 0, 0); + evas_object_resize(win->win_obj, 1, 1); + evas_object_layer_set(win->win_obj, 50); + evas_object_pass_events_set(win->win_obj, 1); + evas_object_data_set(win->win_obj, "__Elm", win); + + evas_object_intercept_show_callback_add(win->win_obj, _elm_win_obj_intercept_show, win); + evas_object_intercept_hide_callback_add(win->win_obj, _elm_win_obj_intercept_hide, win); + evas_object_intercept_move_callback_add(win->win_obj, _elm_win_obj_intercept_move, win); + evas_object_intercept_resize_callback_add(win->win_obj, _elm_win_obj_intercept_resize, win); + evas_object_intercept_raise_callback_add(win->win_obj, _elm_win_obj_intercept_raise, win); + evas_object_intercept_lower_callback_add(win->win_obj, _elm_win_obj_intercept_lower, win); + evas_object_intercept_stack_above_callback_add(win->win_obj, _elm_win_obj_intercept_stack_above, win); + evas_object_intercept_stack_below_callback_add(win->win_obj, _elm_win_obj_intercept_stack_below, win); + evas_object_intercept_layer_set_callback_add(win->win_obj, _elm_win_obj_intercept_layer_set, win); + evas_object_intercept_color_set_callback_add(win->win_obj, _elm_win_obj_intercept_color_set, win); + evas_object_event_callback_add(win->win_obj, EVAS_CALLBACK_DEL, _elm_win_obj_callback_del, win); + evas_object_event_callback_add(win->win_obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _elm_win_obj_callback_changed_size_hints, win); + + ecore_evas_name_class_set(win->ee, name, _elm_appname); ecore_evas_data_set(win->ee, "__Elm", win); ecore_evas_callback_delete_request_set(win->ee, _elm_win_delete_request); ecore_evas_callback_resize_set(win->ee, _elm_win_resize); @@ -300,8 +394,106 @@ elm_win_new(void) edje_frametime_set(1.0 / 30.0); edje_scale_set(_elm_config->scale); - win->cb_add(win, ELM_CB_CHILD_ADD, _elm_on_child_add, NULL); - win->cb_add(win, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); + _elm_win_xwin_update(win); + + _elm_win_list = evas_list_append(_elm_win_list, win->win_obj); - return win; + return win->win_obj; +} + +EAPI void +elm_win_resize_object_add(Evas_Object *obj, Evas_Object *subobj) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + win->subobjs = evas_list_append(win->subobjs, subobj); + elm_widget_sub_object_add(obj, subobj); + evas_object_event_callback_add(subobj, EVAS_CALLBACK_DEL, _elm_win_subobj_callback_del, obj); + evas_object_event_callback_add(subobj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _elm_win_subobj_callback_changed_size_hints, obj); + _elm_win_eval_subobjs(obj); +} + +EAPI void +elm_win_resize_object_del(Evas_Object *obj, Evas_Object *subobj) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + evas_object_event_callback_del(subobj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _elm_win_subobj_callback_changed_size_hints); + evas_object_event_callback_del(subobj, EVAS_CALLBACK_DEL, _elm_win_subobj_callback_del); + win->subobjs = evas_list_remove(win->subobjs, subobj); + elm_widget_sub_object_del(obj, subobj); + _elm_win_eval_subobjs(obj); +} + +EAPI void +elm_win_title_set(Evas_Object *obj, const char *title) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + ecore_evas_title_set(win->ee, title); +} + +EAPI void +elm_win_autodel_set(Evas_Object *obj, Evas_Bool autodel) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + win->autodel = autodel; +} + +EAPI void +elm_win_activate(Evas_Object *obj) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + ecore_evas_activate(win->ee); +} + +EAPI void +elm_win_borderless_set(Evas_Object *obj, Evas_Bool borderless) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + ecore_evas_borderless_set(win->ee, borderless); + _elm_win_xwin_update(win); +} + +EAPI void +elm_win_shaped_set(Evas_Object *obj, Evas_Bool shaped) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + ecore_evas_shaped_set(win->ee, shaped); + _elm_win_xwin_update(win); +} + +EAPI void +elm_win_alpha_set(Evas_Object *obj, Evas_Bool alpha) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + if (win->xwin) + { + if (alpha) + { + if (!ecore_x_screen_is_composited(0)) + elm_win_shaped_set(obj, alpha); + else + ecore_evas_alpha_set(win->ee, alpha); + } + else + ecore_evas_alpha_set(win->ee, alpha); + _elm_win_xwin_update(win); + } + else + ecore_evas_alpha_set(win->ee, alpha); +} + +EAPI void +elm_win_override_set(Evas_Object *obj, Evas_Bool override) +{ + Elm_Win *win = evas_object_data_get(obj, "__Elm"); + if (!win) return; + ecore_evas_override_set(win->ee, override); + _elm_win_xwin_update(win); } diff --git a/legacy/elementary/src/lib/els_box.c b/legacy/elementary/src/lib/els_box.c index 516a7714f9..2a6e89a19a 100644 --- a/legacy/elementary/src/lib/els_box.c +++ b/legacy/elementary/src/lib/els_box.c @@ -9,39 +9,17 @@ struct _Smart_Data Evas_Coord x, y, w, h; Evas_Object *obj; Evas_Object *clip; - int frozen; unsigned char changed : 1; unsigned char horizontal : 1; unsigned char homogenous : 1; Evas_List *items; - struct { - Evas_Coord w, h; - } min, max; - struct { - double x, y; - } align; }; -struct _Box_Item -{ - Smart_Data *sd; - unsigned char fill_w : 1; - unsigned char fill_h : 1; - unsigned char expand_w : 1; - unsigned char expand_h : 1; - struct { - Evas_Coord w, h; - } min, max; - struct { - double x, y; - } align; - Evas_Object *obj; -}; - /* local subsystem functions */ -static Box_Item *_smart_adopt(Smart_Data *sd, Evas_Object *obj); +static void _smart_adopt(Smart_Data *sd, Evas_Object *obj); static void _smart_disown(Evas_Object *obj); static void _smart_item_del_hook(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _smart_item_changed_size_hints_hook(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _smart_reconfigure(Smart_Data *sd); static void _smart_extents_calculate(Smart_Data *sd); @@ -67,29 +45,6 @@ _els_smart_box_add(Evas *evas) return evas_object_smart_add(evas, _e_smart); } -int -_els_smart_box_freeze(Evas_Object *obj) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - if (!sd) return 0; - sd->frozen++; - return sd->frozen; -} - -int -_els_smart_box_thaw(Evas_Object *obj) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - if (!sd) return 0; - sd->frozen--; - if (sd->frozen <= 0) _smart_reconfigure(sd); - return sd->frozen; -} - void _els_smart_box_orientation_set(Evas_Object *obj, int horizontal) { @@ -99,8 +54,7 @@ _els_smart_box_orientation_set(Evas_Object *obj, int horizontal) if (!sd) return; if (sd->horizontal == horizontal) return; sd->horizontal = horizontal; - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); } int @@ -122,8 +76,7 @@ _els_smart_box_homogenous_set(Evas_Object *obj, int homogenous) if (!sd) return; if (sd->homogenous == homogenous) return; sd->homogenous = homogenous; - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); } int @@ -136,8 +89,7 @@ _els_smart_box_pack_start(Evas_Object *obj, Evas_Object *child) if (!sd) return 0; _smart_adopt(sd, child); sd->items = evas_list_prepend(sd->items, child); - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); return 0; } @@ -151,8 +103,7 @@ _els_smart_box_pack_end(Evas_Object *obj, Evas_Object *child) if (!sd) return 0; _smart_adopt(sd, child); sd->items = evas_list_append(sd->items, child); - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); return evas_list_count(sd->items) - 1; } @@ -172,8 +123,7 @@ _els_smart_box_pack_before(Evas_Object *obj, Evas_Object *child, Evas_Object *be { if (l->data == child) break; } - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); return i; } @@ -193,125 +143,56 @@ _els_smart_box_pack_after(Evas_Object *obj, Evas_Object *child, Evas_Object *aft { if (l->data == child) break; } - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); return i; } - -void -_els_smart_box_pack_options_set(Evas_Object *obj, int fill_w, int fill_h, int expand_w, int expand_h, double align_x, double align_y, Evas_Coord min_w, Evas_Coord min_h, Evas_Coord max_w, Evas_Coord max_h) -{ - Box_Item *bi; - - bi = evas_object_data_get(obj, "e_box_data"); - if (!bi) return; - bi->fill_w = fill_w; - bi->fill_h = fill_h; - bi->expand_w = expand_w; - bi->expand_h = expand_h; - bi->align.x = align_x; - bi->align.y = align_y; - bi->min.w = min_w; - bi->min.h = min_h; - bi->max.w = max_w; - bi->max.h = max_h; - bi->sd->changed = 1; - if (bi->sd->frozen <= 0) _smart_reconfigure(bi->sd); -} - void _els_smart_box_unpack(Evas_Object *obj) { - Box_Item *bi; Smart_Data *sd; if (!obj) return; - bi = evas_object_data_get(obj, "e_box_data"); - if (!bi) return; - sd = bi->sd; + sd = evas_object_smart_data_get(evas_object_smart_parent_get(obj)); if (!sd) return; sd->items = evas_list_remove(sd->items, obj); _smart_disown(obj); - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); -} - -void -_els_smart_box_min_size_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - if (!sd) return; - if (sd->changed) _smart_extents_calculate(sd); - if (minw) *minw = sd->min.w; - if (minh) *minh = sd->min.h; -} - -void -_els_smart_box_max_size_get(Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - if (!sd) return; - if (sd->changed) _smart_extents_calculate(sd); - if (maxw) *maxw = sd->max.w; - if (maxh) *maxh = sd->max.h; + _smart_reconfigure(sd); } /* local subsystem functions */ -static Box_Item * +static void _smart_adopt(Smart_Data *sd, Evas_Object *obj) { - Box_Item *bi; - - bi = calloc(1, sizeof(Box_Item)); - if (!bi) return NULL; - bi->sd = sd; - bi->obj = obj; - /* defaults */ - bi->fill_w = 0; - bi->fill_h = 0; - bi->expand_w = 0; - bi->expand_h = 0; - bi->align.x = 0.5; - bi->align.y = 0.5; - bi->min.w = 0; - bi->min.h = 0; - bi->max.w = 0; - bi->max.h = 0; evas_object_clip_set(obj, sd->clip); - evas_object_smart_member_add(obj, bi->sd->obj); - evas_object_data_set(obj, "e_box_data", bi); - evas_object_event_callback_add(obj, EVAS_CALLBACK_FREE, + evas_object_smart_member_add(obj, sd->obj); + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _smart_item_del_hook, NULL); + evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _smart_item_changed_size_hints_hook, NULL); if ((!evas_object_visible_get(sd->clip)) && (evas_object_visible_get(sd->obj))) evas_object_show(sd->clip); - return bi; } static void _smart_disown(Evas_Object *obj) { - Box_Item *bi; + Smart_Data *sd; - bi = evas_object_data_get(obj, "e_box_data"); - if (!bi) return; - if (!bi->sd->items) + sd = evas_object_smart_data_get(evas_object_smart_parent_get(obj)); + if (!sd) return; + if (sd->items) { - if (evas_object_visible_get(bi->sd->clip)) - evas_object_hide(bi->sd->clip); + if (evas_object_visible_get(sd->clip)) + evas_object_hide(sd->clip); } - evas_object_event_callback_del(obj, - EVAS_CALLBACK_FREE, + evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _smart_item_del_hook); + evas_object_event_callback_del(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _smart_item_changed_size_hints_hook); evas_object_smart_member_del(obj); evas_object_clip_unset(obj); - evas_object_data_del(obj, "e_box_data"); - free(bi); } static void @@ -320,65 +201,68 @@ _smart_item_del_hook(void *data, Evas *e, Evas_Object *obj, void *event_info) _els_smart_box_unpack(obj); } +static void +_smart_item_changed_size_hints_hook(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(evas_object_smart_parent_get(obj)); + _smart_reconfigure(sd); +} + static void _smart_reconfigure(Smart_Data *sd) { Evas_Coord x, y, w, h, xx, yy; Evas_List *l; - int minw, minh, wdif, hdif; - int count, expand; + Evas_Coord minw, minh, wdif, hdif, mnw, mnh, mxw, mxh; + int count, expand, fw, fh, xw, xh; + double ax, ay, wx, wy; - if (!sd->changed) return; + _smart_extents_calculate(sd); x = sd->x; y = sd->y; w = sd->w; h = sd->h; - _smart_extents_calculate(sd); - minw = sd->min.w; - minh = sd->min.h; + evas_object_size_hint_min_get(sd->obj, &minw, &minh); + evas_object_size_hint_align_get(sd->obj, &ax, &ay); count = evas_list_count(sd->items); expand = 0; if (w < minw) { - x = x + ((w - minw) * (1.0 - sd->align.x)); + x = x + ((w - minw) * (1.0 - ax)); w = minw; } if (h < minh) { - y = y + ((h - minh) * (1.0 - sd->align.y)); + y = y + ((h - minh) * (1.0 - ay)); h = minh; } for (l = sd->items; l; l = l->next) { - Box_Item *bi; - Evas_Object *obj; - - obj = l->data; - bi = evas_object_data_get(obj, "e_box_data"); - if (bi) + evas_object_size_hint_weight_get(l->data, &wx, &wy); + if (sd->horizontal) { - if (sd->horizontal) - { - if (bi->expand_w) expand++; - } - else - { - if (bi->expand_h) expand++; - } + if (wx > 0.0) expand++; + } + else + { + if (wy > 0.0) expand++; } } if (expand == 0) { + evas_object_size_hint_align_get(sd->obj, &ax, &ay); if (sd->horizontal) { - x += (double)(w - minw) * sd->align.x; + x += (double)(w - minw) * ax; w = minw; } else { - y += (double)(h - minh) * sd->align.y; + y += (double)(h - minh) * ay; h = minh; } } @@ -388,138 +272,134 @@ _smart_reconfigure(Smart_Data *sd) yy = y; for (l = sd->items; l; l = l->next) { - Box_Item *bi; Evas_Object *obj; obj = l->data; - bi = evas_object_data_get(obj, "e_box_data"); - if (bi) + evas_object_size_hint_align_get(l->data, &ax, &ay); + evas_object_size_hint_weight_get(l->data, &wx, &wy); + evas_object_size_hint_min_get(l->data, &mnw, &mnh); + evas_object_size_hint_max_get(l->data, &mxw, &mxh); + fw = fh = 0; + xw = xh = 0; + if (ax == -1.0) {fw = 1; ax = 0.5;} + if (ay == -1.0) {fh = 1; ay = 0.5;} + if (wx > 0.0) xw = 1; + if (wy > 0.0) xh = 1; + if (sd->horizontal) { - if (sd->horizontal) + if (sd->homogenous) { - if (sd->homogenous) - { - Evas_Coord ww, hh, ow, oh; - - ww = (w / (Evas_Coord)count); - hh = h; - ow = bi->min.w; - if (bi->fill_w) ow = ww; - if ((bi->max.w >= 0) && (bi->max.w < ow)) - ow = bi->max.w; - oh = bi->min.h; - if (bi->fill_h) oh = hh; - if ((bi->max.h >= 0) && (bi->max.h < oh)) - oh = bi->max.h; - evas_object_move(obj, - xx + (Evas_Coord)(((double)(ww - ow)) * bi->align.x), - yy + (Evas_Coord)(((double)(hh - oh)) * bi->align.y)); - evas_object_resize(obj, ow, oh); - xx += ww; - } - else - { - Evas_Coord ww, hh, ow, oh; - - ww = bi->min.w; - if ((expand > 0) && (bi->expand_w)) - { - if (expand == 1) ow = wdif; - else ow = (w - minw) / expand; - wdif -= ow; - ww += ow; - } - hh = h; - ow = bi->min.w; - if (bi->fill_w) ow = ww; - if ((bi->max.w >= 0) && (bi->max.w < ow)) ow = bi->max.w; - oh = bi->min.h; - if (bi->fill_h) oh = hh; - if ((bi->max.h >= 0) && (bi->max.h < oh)) oh = bi->max.h; - evas_object_move(obj, - xx + (Evas_Coord)(((double)(ww - ow)) * bi->align.x), - yy + (Evas_Coord)(((double)(hh - oh)) * bi->align.y)); - evas_object_resize(obj, ow, oh); - xx += ww; - } + Evas_Coord ww, hh, ow, oh; + + ww = (w / (Evas_Coord)count); + hh = h; + ow = mnw; + if (fw) ow = ww; + if ((mxw >= 0) && (mxw < ow)) + ow = mxw; + oh = mnh; + if (fh) oh = hh; + if ((mxh >= 0) && (mxh < oh)) + oh = mxh; + evas_object_move(obj, + xx + (Evas_Coord)(((double)(ww - ow)) * ax), + yy + (Evas_Coord)(((double)(hh - oh)) * ay)); + evas_object_resize(obj, ow, oh); + xx += ww; } else { - if (sd->homogenous) + Evas_Coord ww, hh, ow, oh; + + ww = mnw; + if ((expand > 0) && (xw)) { - Evas_Coord ww, hh, ow, oh; - - ww = w; - hh = (h / (Evas_Coord)count); - ow = bi->min.w; - if (bi->fill_w) ow = ww; - if ((bi->max.w >= 0) && (bi->max.w < ow)) ow = bi->max.w; - oh = bi->min.h; - if (bi->fill_h) oh = hh; - if ((bi->max.h >= 0) && (bi->max.h < oh)) oh = bi->max.h; - evas_object_move(obj, - xx + (Evas_Coord)(((double)(ww - ow)) * bi->align.x), - yy + (Evas_Coord)(((double)(hh - oh)) * bi->align.y)); - evas_object_resize(obj, ow, oh); - yy += hh; + if (expand == 1) ow = wdif; + else ow = (w - minw) / expand; + wdif -= ow; + ww += ow; } - else + hh = h; + ow = mnw; + if (fw) ow = ww; + if ((mxw >= 0) && (mxw < ow)) ow = mxw; + oh = mnh; + if (fh) oh = hh; + if ((mxh >= 0) && (mxh < oh)) oh = mxh; + evas_object_move(obj, + xx + (Evas_Coord)(((double)(ww - ow)) * ax), + yy + (Evas_Coord)(((double)(hh - oh)) * ay)); + evas_object_resize(obj, ow, oh); + xx += ww; + } + } + else + { + if (sd->homogenous) + { + Evas_Coord ww, hh, ow, oh; + + ww = w; + hh = (h / (Evas_Coord)count); + ow = mnw; + if (fw) ow = ww; + if ((mxw >= 0) && (mxw < ow)) ow = mxw; + oh = mnh; + if (fh) oh = hh; + if ((mxh >= 0) && (mxh < oh)) oh = mxh; + evas_object_move(obj, + xx + (Evas_Coord)(((double)(ww - ow)) * ax), + yy + (Evas_Coord)(((double)(hh - oh)) * ay)); + evas_object_resize(obj, ow, oh); + yy += hh; + } + else + { + Evas_Coord ww, hh, ow, oh; + + ww = w; + hh = mnh; + if ((expand > 0) && (xh)) { - Evas_Coord ww, hh, ow, oh; - - ww = w; - hh = bi->min.h; - if ((expand > 0) && (bi->expand_h)) - { - if (expand == 1) oh = hdif; - else oh = (h - minh) / expand; - hdif -= oh; - hh += oh; - } - ow = bi->min.w; - if (bi->fill_w) ow = ww; - if ((bi->max.w >= 0) && (bi->max.w < ow)) ow = bi->max.w; - oh = bi->min.h; - if (bi->fill_h) oh = hh; - if ((bi->max.h >= 0) && (bi->max.h < oh)) oh = bi->max.h; - evas_object_move(obj, - xx + (Evas_Coord)(((double)(ww - ow)) * bi->align.x), - yy + (Evas_Coord)(((double)(hh - oh)) * bi->align.y)); - evas_object_resize(obj, ow, oh); - yy += hh; + if (expand == 1) oh = hdif; + else oh = (h - minh) / expand; + hdif -= oh; + hh += oh; } + ow = mnw; + if (fw) ow = ww; + if ((mxw >= 0) && (mxw < ow)) ow = mxw; + oh = mnh; + if (fh) oh = hh; + if ((mxh >= 0) && (mxh < oh)) oh = mxh; + evas_object_move(obj, + xx + (Evas_Coord)(((double)(ww - ow)) * ax), + yy + (Evas_Coord)(((double)(hh - oh)) * ay)); + evas_object_resize(obj, ow, oh); + yy += hh; } } } - sd->changed = 0; } static void _smart_extents_calculate(Smart_Data *sd) { Evas_List *l; - int minw, minh; + Evas_Coord minw, minh, maxw, maxh, mnw, mnh; /* FIXME: need to calc max */ - sd->max.w = -1; /* max < 0 == unlimited */ - sd->max.h = -1; - minw = 0; minh = 0; + maxw = -1; + maxh = -1; if (sd->homogenous) { for (l = sd->items; l; l = l->next) { - Box_Item *bi; - Evas_Object *obj; - - obj = l->data; - bi = evas_object_data_get(obj, "e_box_data"); - if (bi) - { - if (minh < bi->min.h) minh = bi->min.h; - if (minw < bi->min.w) minw = bi->min.w; - } + evas_object_size_hint_min_get(l->data, &mnw, &mnh); + if (minh < mnh) minh = mnh; + if (minw < mnw) minw = mnw; } if (sd->horizontal) minw *= evas_list_count(sd->items); @@ -530,28 +410,20 @@ _smart_extents_calculate(Smart_Data *sd) { for (l = sd->items; l; l = l->next) { - Box_Item *bi; - Evas_Object *obj; - - obj = l->data; - bi = evas_object_data_get(obj, "e_box_data"); - if (bi) + evas_object_size_hint_min_get(l->data, &mnw, &mnh); + if (sd->horizontal) { - if (sd->horizontal) - { - if (minh < bi->min.h) minh = bi->min.h; - minw += bi->min.w; - } - else - { - if (minw < bi->min.w) minw = bi->min.w; - minh += bi->min.h; - } + if (minh < mnh) minh = mnh; + minw += mnw; + } + else + { + if (minw < mnw) minw = mnw; + minh += mnh; } } } - sd->min.w = minw; - sd->min.h = minh; + evas_object_size_hint_min_set(sd->obj, minw, minh); } static void @@ -587,12 +459,6 @@ _smart_add(Evas_Object *obj) sd = calloc(1, sizeof(Smart_Data)); if (!sd) return; sd->obj = obj; - sd->x = 0; - sd->y = 0; - sd->w = 0; - sd->h = 0; - sd->align.x = 0.5; - sd->align.y = 0.5; sd->clip = evas_object_rectangle_add(evas_object_evas_get(obj)); evas_object_smart_member_add(sd->clip, obj); evas_object_move(sd->clip, -100004, -100004); @@ -608,7 +474,6 @@ _smart_del(Evas_Object *obj) sd = evas_object_smart_data_get(obj); if (!sd) return; - _els_smart_box_freeze(obj); while (sd->items) { Evas_Object *child; @@ -616,7 +481,6 @@ _smart_del(Evas_Object *obj) child = sd->items->data; _els_smart_box_unpack(child); } - _els_smart_box_thaw(obj); evas_object_del(sd->clip); free(sd); } @@ -625,23 +489,19 @@ static void _smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) { Smart_Data *sd; + Evas_List *l; + Evas_Coord dx, dy; sd = evas_object_smart_data_get(obj); if (!sd) return; - if ((x == sd->x) && (y == sd->y)) return; + dx = x - sd->x; + dy = y - sd->y; + for (l = sd->items; l; l = l->next) { - Evas_List *l; - Evas_Coord dx, dy; + Evas_Coord ox, oy; - dx = x - sd->x; - dy = y - sd->y; - for (l = sd->items; l; l = l->next) - { - Evas_Coord ox, oy; - - evas_object_geometry_get(l->data, &ox, &oy, NULL, NULL); - evas_object_move(l->data, ox + dx, oy + dy); - } + evas_object_geometry_get(l->data, &ox, &oy, NULL, NULL); + evas_object_move(l->data, ox + dx, oy + dy); } sd->x = x; sd->y = y; @@ -654,10 +514,8 @@ _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) sd = evas_object_smart_data_get(obj); if (!sd) return; - if ((w == sd->w) && (h == sd->h)) return; sd->w = w; sd->h = h; - sd->changed = 1; _smart_reconfigure(sd); } diff --git a/legacy/elementary/src/lib/els_box.h b/legacy/elementary/src/lib/els_box.h index cb185ab59d..626a3fdebb 100644 --- a/legacy/elementary/src/lib/els_box.h +++ b/legacy/elementary/src/lib/els_box.h @@ -1,6 +1,4 @@ Evas_Object *_els_smart_box_add (Evas *evas); -int _els_smart_box_freeze (Evas_Object *obj); -int _els_smart_box_thaw (Evas_Object *obj); void _els_smart_box_orientation_set (Evas_Object *obj, int horizontal); int _els_smart_box_orientation_get (Evas_Object *obj); void _els_smart_box_homogenous_set (Evas_Object *obj, int homogenous); @@ -8,7 +6,6 @@ int _els_smart_box_pack_start (Evas_Object *obj, Evas_Object *ch int _els_smart_box_pack_end (Evas_Object *obj, Evas_Object *child); int _els_smart_box_pack_before (Evas_Object *obj, Evas_Object *child, Evas_Object *before); int _els_smart_box_pack_after (Evas_Object *obj, Evas_Object *child, Evas_Object *after); -void _els_smart_box_pack_options_set (Evas_Object *obj, int fill_w, int fill_h, int expand_w, int expand_h, double align_x, double align_y, Evas_Coord min_w, Evas_Coord min_h, Evas_Coord max_w, Evas_Coord max_h); void _els_smart_box_unpack (Evas_Object *obj); void _els_smart_box_min_size_get (Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh); void _els_smart_box_max_size_get (Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh); diff --git a/legacy/elementary/src/lib/els_table.c b/legacy/elementary/src/lib/els_table.c index 17921bb4dc..9d21b91fb6 100644 --- a/legacy/elementary/src/lib/els_table.c +++ b/legacy/elementary/src/lib/els_table.c @@ -9,16 +9,8 @@ struct _Smart_Data Evas_Coord x, y, w, h; Evas_Object *obj; Evas_Object *clip; - int frozen; - unsigned char changed : 1; unsigned char homogenous : 1; Evas_List *items; - struct { - Evas_Coord w, h; - } min, max; - struct { - double x, y; - } align; struct { int cols, rows; } size; @@ -26,18 +18,8 @@ struct _Smart_Data struct _Table_Item { - Smart_Data *sd; + Smart_Data *sd; int col, row, colspan, rowspan; - unsigned char fill_w : 1; - unsigned char fill_h : 1; - unsigned char expand_w : 1; - unsigned char expand_h : 1; - struct { - Evas_Coord w, h; - } min, max; - struct { - double x, y; - } align; Evas_Object *obj; }; @@ -45,6 +27,7 @@ struct _Table_Item static Table_Item *_smart_adopt(Smart_Data *sd, Evas_Object *obj); static void _smart_disown(Evas_Object *obj); static void _smart_item_del_hook(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _smart_item_changed_size_hints_hook(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _smart_reconfigure(Smart_Data *sd); static void _smart_extents_calcuate(Smart_Data *sd); @@ -70,27 +53,6 @@ _els_smart_table_add(Evas *evas) return evas_object_smart_add(evas, _e_smart); } -int -_els_smart_table_freeze(Evas_Object *obj) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - sd->frozen++; - return sd->frozen; -} - -int -_els_smart_table_thaw(Evas_Object *obj) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - sd->frozen--; - if (sd->frozen <= 0) _smart_reconfigure(sd); - return sd->frozen; -} - void _els_smart_table_homogenous_set(Evas_Object *obj, int homogenous) { @@ -99,8 +61,7 @@ _els_smart_table_homogenous_set(Evas_Object *obj, int homogenous) sd = evas_object_smart_data_get(obj); if (sd->homogenous == homogenous) return; sd->homogenous = homogenous; - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); } void @@ -122,29 +83,7 @@ _els_smart_table_pack(Evas_Object *obj, Evas_Object *child, int col, int row, in if (sd->size.cols < (col + colspan)) sd->size.cols = col + colspan; if (sd->size.rows < (row + rowspan)) sd->size.rows = row + rowspan; } - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); -} - -void -_els_smart_table_pack_options_set(Evas_Object *obj, int fill_w, int fill_h, int expand_w, int expand_h, double align_x, double align_y, Evas_Coord min_w, Evas_Coord min_h, Evas_Coord max_w, Evas_Coord max_h) -{ - Table_Item *ti; - - ti = evas_object_data_get(obj, "e_table_data"); - if (!ti) return; - ti->fill_w = fill_w; - ti->fill_h = fill_h; - ti->expand_w = expand_w; - ti->expand_h = expand_h; - ti->align.x = align_x; - ti->align.y = align_y; - ti->min.w = min_w; - ti->min.h = min_h; - ti->max.w = max_w; - ti->max.h = max_h; - ti->sd->changed = 1; - if (ti->sd->frozen <= 0) _smart_reconfigure(ti->sd); + _smart_reconfigure(sd); } void @@ -158,8 +97,7 @@ _els_smart_table_unpack(Evas_Object *obj) sd = ti->sd; sd->items = evas_list_remove(sd->items, obj); _smart_disown(obj); - sd->changed = 1; - if (sd->frozen <= 0) _smart_reconfigure(sd); + _smart_reconfigure(sd); } void @@ -168,33 +106,10 @@ _els_smart_table_col_row_size_get(Evas_Object *obj, int *cols, int *rows) Smart_Data *sd; sd = evas_object_smart_data_get(obj); - if (sd->changed) _smart_extents_calcuate(sd); if (cols) *cols = sd->size.cols; if (rows) *rows = sd->size.rows; } -void -_els_smart_table_min_size_get(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - if (sd->changed) _smart_extents_calcuate(sd); - if (minw) *minw = sd->min.w; - if (minh) *minh = sd->min.h; -} - -void -_els_smart_table_max_size_get(Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh) -{ - Smart_Data *sd; - - sd = evas_object_smart_data_get(obj); - if (sd->changed) _smart_extents_calcuate(sd); - if (maxw) *maxw = sd->max.w; - if (maxh) *maxh = sd->max.h; -} - /* local subsystem functions */ static Table_Item * _smart_adopt(Smart_Data *sd, Evas_Object *obj) @@ -210,22 +125,14 @@ _smart_adopt(Smart_Data *sd, Evas_Object *obj) ti->row = 0; ti->colspan = 1; ti->rowspan = 1; - ti->fill_w = 0; - ti->fill_h = 0; - ti->expand_w = 0; - ti->expand_h = 0; - ti->align.x = 0.5; - ti->align.y = 0.5; - ti->min.w = 0; - ti->min.h = 0; - ti->max.w = 0; - ti->max.h = 0; evas_object_clip_set(obj, sd->clip); evas_object_stack_above(obj, sd->obj); evas_object_smart_member_add(obj, ti->sd->obj); evas_object_data_set(obj, "e_table_data", ti); - evas_object_event_callback_add(obj, EVAS_CALLBACK_FREE, + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _smart_item_del_hook, NULL); + evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _smart_item_changed_size_hints_hook, NULL); evas_object_stack_below(obj, sd->obj); if ((!evas_object_visible_get(sd->clip)) && (evas_object_visible_get(sd->obj))) @@ -245,9 +152,10 @@ _smart_disown(Evas_Object *obj) if (evas_object_visible_get(ti->sd->clip)) evas_object_hide(ti->sd->clip); } - evas_object_event_callback_del(obj, - EVAS_CALLBACK_FREE, + evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _smart_item_del_hook); + evas_object_event_callback_del(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _smart_item_changed_size_hints_hook); evas_object_smart_member_del(obj); evas_object_data_del(obj, "e_table_data"); free(ti); @@ -259,45 +167,61 @@ _smart_item_del_hook(void *data, Evas *e, Evas_Object *obj, void *event_info) _els_smart_table_unpack(obj); } +static void +_smart_item_changed_size_hints_hook(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Smart_Data *sd; + + sd = evas_object_smart_data_get(evas_object_smart_parent_get(obj)); + _smart_reconfigure(sd); +} + static void _smart_reconfigure(Smart_Data *sd) { Evas_Coord x, y, w, h, xx, yy; Evas_List *l; - int minw, minh, expandw, expandh; - - if (!sd->changed) return; + Evas_Coord minw, minh; + int expandw, expandh; + double ax, ay; + + _smart_extents_calcuate(sd); x = sd->x; y = sd->y; w = sd->w; h = sd->h; - _smart_extents_calcuate(sd); - - minw = sd->min.w; - minh = sd->min.h; + evas_object_size_hint_min_get(sd->obj, &minw, &minh); + evas_object_size_hint_align_get(sd->obj, &ax, &ay); expandw = 0; expandh = 0; if (w < minw) { - x = x + ((w - minw) * (1.0 - sd->align.x)); + x = x + ((w - minw) * (1.0 - ax)); w = minw; } if (h < minh) { - y = y + ((h - minh) * (1.0 - sd->align.y)); + y = y + ((h - minh) * (1.0 - ay)); h = minh; } for (l = sd->items; l; l = l->next) { Table_Item *ti; Evas_Object *obj; - + int xw, xh; + double wx, wy; + obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); - if (ti->expand_w) expandw++; - if (ti->expand_h) expandh++; + evas_object_size_hint_weight_get(l->data, &wx, &wy); + xw = 0; + xh = 0; + if (wx > 0.0) xw = 1; + if (wy > 0.0) xh = 1; + if (xw) expandw++; + if (xh) expandh++; } if (expandw == 0) { @@ -318,6 +242,9 @@ _smart_reconfigure(Smart_Data *sd) Table_Item *ti; Evas_Object *obj; Evas_Coord ww, hh, ow, oh; + Evas_Coord mxw, mxh; + int xw, xh; + double wx, wy; obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); @@ -326,15 +253,21 @@ _smart_reconfigure(Smart_Data *sd) yy = y + ((ti->row) * (h / (Evas_Coord)sd->size.rows)); ww = ((w / (Evas_Coord)sd->size.cols) * (ti->colspan)); hh = ((h / (Evas_Coord)sd->size.rows) * (ti->rowspan)); - ow = ti->min.w; - if (ti->expand_w) ow = ww; - if ((ti->max.w >= 0) && (ti->max.w < ow)) ow = ti->max.w; - oh = ti->min.h; - if (ti->expand_h) oh = hh; - if ((ti->max.h >= 0) && (ti->max.h < oh)) oh = ti->max.h; + evas_object_size_hint_min_get(l->data, &ow, &oh); + evas_object_size_hint_max_get(l->data, &mxw, &mxh); + evas_object_size_hint_weight_get(l->data, &wx, &wy); + evas_object_size_hint_align_get(l->data, &ax, &ay); + xw = 0; + xh = 0; + if (wx > 0.0) xw = 1; + if (wy > 0.0) xh = 1; + if (xw) ow = ww; + if ((mxw >= 0) && (mxw < ow)) ow = mxw; + if (xh) oh = hh; + if ((mxh >= 0) && (mxh < oh)) oh = mxh; evas_object_move(obj, - xx + (Evas_Coord)(((double)(ww - ow)) * ti->align.x), - yy + (Evas_Coord)(((double)(hh - oh)) * ti->align.y)); + xx + (Evas_Coord)(((double)(ww - ow)) * ax), + yy + (Evas_Coord)(((double)(hh - oh)) * ay)); evas_object_resize(obj, ow, oh); } } @@ -366,23 +299,42 @@ _smart_reconfigure(Smart_Data *sd) { Table_Item *ti; Evas_Object *obj; + int xw, xh; + double wx, wy; obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); + evas_object_size_hint_weight_get(l->data, &wx, &wy); + xw = 0; + xh = 0; + if (wx > 0.0) xw = 1; + if (wy > 0.0) xh = 1; for (i = ti->col; i < (ti->col + ti->colspan); i++) - colsx[i] |= ti->expand_w; + colsx[i] |= xw; for (i = ti->row; i < (ti->row + ti->rowspan); i++) - rowsx[i] |= ti->expand_h; + rowsx[i] |= xh; } for (l = sd->items; l; l = l->next) { Table_Item *ti; Evas_Object *obj; + Evas_Coord mnw, mnh, mxw, mxh; + int xw, xh; + double wx, wy; obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); + evas_object_size_hint_min_get(l->data, &mnw, &mnh); + evas_object_size_hint_max_get(l->data, &mxw, &mxh); + evas_object_size_hint_weight_get(l->data, &wx, &wy); + evas_object_size_hint_align_get(l->data, &ax, &ay); + xw = 0; + xh = 0; + if (wx > 0.0) xw = 1; + if (wy > 0.0) xh = 1; + /* handle horizontal */ ex = 0; tot = 0; @@ -392,7 +344,7 @@ _smart_reconfigure(Smart_Data *sd) if (colsx[i]) ex++; tot += cols[i]; } - need = ti->min.w; + need = mnw; if (tot < need) { dif = need - tot; @@ -447,7 +399,7 @@ _smart_reconfigure(Smart_Data *sd) if (rowsx[i]) ex++; tot += rows[i]; } - need = ti->min.h; + need = mnh; if (tot < need) { dif = need - tot; @@ -561,9 +513,13 @@ _smart_reconfigure(Smart_Data *sd) Table_Item *ti; Evas_Object *obj; Evas_Coord ww, hh, ow, oh, i; + Evas_Coord mxw, mxh; obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); + evas_object_size_hint_min_get(l->data, &ow, &oh); + evas_object_size_hint_max_get(l->data, &mxw, &mxh); + evas_object_size_hint_align_get(l->data, &ax, &ay); xx = x; for (i = 0; i < ti->col; i++) xx += cols[i]; @@ -574,15 +530,13 @@ _smart_reconfigure(Smart_Data *sd) hh = 0; for (i = ti->row; i < (ti->row + ti->rowspan); i++) hh += rows[i]; - ow = ti->min.w; - if (ti->fill_w) ow = ww; - if ((ti->max.w >= 0) && (ti->max.w < ow)) ow = ti->max.w; - oh = ti->min.h; - if (ti->fill_h) oh = hh; - if ((ti->max.h >= 0) && (ti->max.h < oh)) oh = ti->max.h; + if (ax == -1.0) {ow = ww; ax = 0.0;} + if ((mxw >= 0) && (mxw < ow)) ow = mxw; + if (ay == -1.0) {oh = hh; ay = 0.0;} + if ((mxh >= 0) && (mxh < oh)) oh = mxh; evas_object_move(obj, - xx + (Evas_Coord)(((double)(ww - ow)) * ti->align.x), - yy + (Evas_Coord)(((double)(hh - oh)) * ti->align.y)); + xx + (Evas_Coord)(((double)(ww - ow)) * ax), + yy + (Evas_Coord)(((double)(hh - oh)) * ay)); evas_object_resize(obj, ow, oh); } free(rows); @@ -591,22 +545,20 @@ _smart_reconfigure(Smart_Data *sd) free(colsx); } } - sd->changed = 0; } static void _smart_extents_calcuate(Smart_Data *sd) { Evas_List *l; - int minw, minh; + Evas_Coord minw, minh, maxw, maxh; - sd->max.w = -1; /* max < 0 == unlimited */ - sd->max.h = -1; - sd->size.cols = 0; - sd->size.rows = 0; - minw = 0; minh = 0; + maxw = -1; /* max < 0 == unlimited */ + maxh = -1; + sd->size.cols = 0; + sd->size.rows = 0; if (sd->homogenous) { for (l = sd->items; l; l = l->next) @@ -614,6 +566,7 @@ _smart_extents_calcuate(Smart_Data *sd) Table_Item *ti; Evas_Object *obj; int mw, mh; + Evas_Coord w, h; obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); @@ -621,8 +574,9 @@ _smart_extents_calcuate(Smart_Data *sd) sd->size.cols = ti->col + ti->colspan; if (sd->size.rows < (ti->row + ti->rowspan)) sd->size.rows = ti->row + ti->rowspan; - mw = (ti->min.w + (ti->colspan - 1)) / ti->colspan; - mh = (ti->min.h + (ti->rowspan - 1)) / ti->rowspan; + evas_object_size_hint_min_get(l->data, &w, &h); + mw = (w + (ti->colspan - 1)) / ti->colspan; + mh = (h + (ti->rowspan - 1)) / ti->rowspan; if (minw < mw) minw = mw; if (minh < mh) minh = mh; } @@ -657,22 +611,31 @@ _smart_extents_calcuate(Smart_Data *sd) { Table_Item *ti; Evas_Object *obj; - + int xw, xh; + double wx, wy; + obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); + evas_object_size_hint_weight_get(l->data, &wx, &wy); + xw = 0; + xh = 0; + if (wx > 0.0) xw = 1; + if (wy > 0.0) xh = 1; for (i = ti->col; i < (ti->col + ti->colspan); i++) - colsx[i] |= ti->expand_w; + colsx[i] |= xw; for (i = ti->row; i < (ti->row + ti->rowspan); i++) - rowsx[i] |= ti->expand_h; + rowsx[i] |= xh; } for (l = sd->items; l; l = l->next) { Table_Item *ti; Evas_Object *obj; + Evas_Coord w, h; obj = l->data; ti = evas_object_data_get(obj, "e_table_data"); + evas_object_size_hint_min_get(l->data, &w, &h); /* handle horizontal */ ex = 0; @@ -683,7 +646,7 @@ _smart_extents_calcuate(Smart_Data *sd) if (colsx[i]) ex++; tot += cols[i]; } - need = ti->min.w; + need = w; if (tot < need) { dif = need - tot; @@ -738,7 +701,7 @@ _smart_extents_calcuate(Smart_Data *sd) if (rowsx[i]) ex++; tot += rows[i]; } - need = ti->min.h; + need = h; if (tot < need) { dif = need - tot; @@ -792,8 +755,7 @@ _smart_extents_calcuate(Smart_Data *sd) free(colsx); } } - sd->min.w = minw; - sd->min.h = minh; + evas_object_size_hint_min_set(sd->obj, minw, minh); } static void @@ -848,7 +810,6 @@ _smart_del(Evas_Object *obj) sd = evas_object_smart_data_get(obj); if (!sd) return; - _els_smart_table_freeze(obj); while (sd->items) { Evas_Object *child; @@ -856,7 +817,6 @@ _smart_del(Evas_Object *obj) child = sd->items->data; _els_smart_table_unpack(child); } - _els_smart_table_thaw(obj); evas_object_del(sd->clip); free(sd); } @@ -865,24 +825,19 @@ static void _smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) { Smart_Data *sd; + Evas_List *l; + Evas_Coord dx, dy; sd = evas_object_smart_data_get(obj); if (!sd) return; - if ((x == sd->x) && (y == sd->y)) return; - if ((x == sd->x) && (y == sd->y)) return; + dx = x - sd->x; + dy = y - sd->y; + for (l = sd->items; l; l = l->next) { - Evas_List *l; - Evas_Coord dx, dy; + Evas_Coord ox, oy; - dx = x - sd->x; - dy = y - sd->y; - for (l = sd->items; l; l = l->next) - { - Evas_Coord ox, oy; - - evas_object_geometry_get(l->data, &ox, &oy, NULL, NULL); - evas_object_move(l->data, ox + dx, oy + dy); - } + evas_object_geometry_get(l->data, &ox, &oy, NULL, NULL); + evas_object_move(l->data, ox + dx, oy + dy); } sd->x = x; sd->y = y; @@ -895,10 +850,8 @@ _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) sd = evas_object_smart_data_get(obj); if (!sd) return; - if ((w == sd->w) && (h == sd->h)) return; sd->w = w; sd->h = h; - sd->changed = 1; _smart_reconfigure(sd); } diff --git a/legacy/elementary/src/lib/els_table.h b/legacy/elementary/src/lib/els_table.h index c760b36fe4..b7da506337 100644 --- a/legacy/elementary/src/lib/els_table.h +++ b/legacy/elementary/src/lib/els_table.h @@ -1,10 +1,5 @@ Evas_Object *_els_smart_table_add (Evas *evas); -int _els_smart_table_freeze (Evas_Object *obj); -int _els_smart_table_thaw (Evas_Object *obj); void _els_smart_table_homogenous_set (Evas_Object *obj, int homogenous); void _els_smart_table_pack (Evas_Object *obj, Evas_Object *child, int col, int row, int colspan, int rowspan); -void _els_smart_table_pack_options_set (Evas_Object *obj, int fill_w, int fill_h, int expand_w, int expand_h, double align_x, double align_y, Evas_Coord min_w, Evas_Coord min_h, Evas_Coord max_w, Evas_Coord max_h); void _els_smart_table_unpack (Evas_Object *obj); void _els_smart_table_col_row_size_get (Evas_Object *obj, int *cols, int *rows); -void _els_smart_table_min_size_get (Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh); -void _els_smart_table_max_size_get (Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh);