From 20f851e6e2ceed52739ffcad85e10fa4c183bff1 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Tue, 6 May 2014 16:53:17 +1000 Subject: Every window is a winFang now, and winFangs delete their own children. --- src/GuiLua/GuiLua.c | 19 +++++++++++++------ src/GuiLua/GuiLua.h | 4 ++-- src/extantz/chat.c | 3 +-- src/extantz/extantz.c | 24 +++++------------------- src/extantz/extantz.h | 3 +-- src/extantz/files.c | 3 +-- src/extantz/woMan.c | 3 +-- src/libraries/winFang.c | 16 ++++++++++++---- src/libraries/winFang.h | 3 ++- 9 files changed, 38 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/GuiLua/GuiLua.c b/src/GuiLua/GuiLua.c index 7463abb..3ff8f94 100644 --- a/src/GuiLua/GuiLua.c +++ b/src/GuiLua/GuiLua.c @@ -232,7 +232,7 @@ static int colour(lua_State *L) static int window(lua_State *L) { winFang *win = NULL; - Evas_Object *parent = NULL; + winFang *parent = NULL; char *name = "GuiLua"; char *title = "GuiLua test harness"; int w = WIDTH, h = HEIGHT; @@ -246,7 +246,12 @@ static int window(lua_State *L) if (gl && gl->parent) parent = gl->parent; win = winFangAdd(parent, 25, 25, w, h, title, name); - eina_clist_add_head(&gl->winFangs, &win->node); + // If there's no parent, we become the parent. + if (gl && !parent) + { + gl->parent = win; + eina_clist_add_head(&gl->winFangs, &win->node); + } lua_pushlightuserdata(L, win); return 1; @@ -282,10 +287,12 @@ static int closeWindow(lua_State *L) gl = lua_touserdata(L, -1); lua_pop(L, 1); - - EINA_CLIST_FOR_EACH_ENTRY(win, &gl->winFangs, winFang, node) + if (gl) { - winFangDel(win); + EINA_CLIST_FOR_EACH_ENTRY(win, &gl->winFangs, winFang, node) + { + winFangDel(win); + } } return 0; @@ -357,7 +364,7 @@ PD("GuiLua 3"); return 1; } -GuiLua *GuiLuaDo(int argc, char **argv, Evas_Object *parent) +GuiLua *GuiLuaDo(int argc, char **argv, winFang *parent) { GuiLua *result; lua_State *L; diff --git a/src/GuiLua/GuiLua.h b/src/GuiLua/GuiLua.h index 3548a44..d390000 100644 --- a/src/GuiLua/GuiLua.h +++ b/src/GuiLua/GuiLua.h @@ -18,7 +18,7 @@ typedef struct _GuiLua { lua_State *L; - Evas_Object *parent; // Our parent window, if it exists. + winFang *parent; // Our parent window, if it exists. Eina_Clist winFangs; // The windows we might open. Eina_Clist node; @@ -26,6 +26,6 @@ typedef struct _GuiLua Evas_Smart_Cb on_del; } GuiLua; -GuiLua *GuiLuaDo(int argc, char **argv, Evas_Object *parent); +GuiLua *GuiLuaDo(int argc, char **argv, winFang *parent); #endif diff --git a/src/extantz/chat.c b/src/extantz/chat.c index d060cb1..4c18e53 100644 --- a/src/extantz/chat.c +++ b/src/extantz/chat.c @@ -16,8 +16,7 @@ winFang *chat_add(globals *ourGlobals) Widget *wid; Evas_Object *bx, *en; - me = winFangAdd(ourGlobals->win, 30, 520, ourGlobals->win_w / 3, ourGlobals->win_h / 3, "chatter box", "chat"); - eina_clist_add_head(&ourGlobals->winFangs, &me->node); + me = winFangAdd(ourGlobals->mainWindow, 30, 520, ourGlobals->win_w / 3, ourGlobals->win_h / 3, "chatter box", "chat"); bx = eo_add(ELM_OBJ_BOX_CLASS, me->win, evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND), diff --git a/src/extantz/extantz.c b/src/extantz/extantz.c index b7de3a7..aceebe7 100644 --- a/src/extantz/extantz.c +++ b/src/extantz/extantz.c @@ -140,8 +140,6 @@ static void _on_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info static void _on_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { -// GLData *gld = data; - elm_exit(); } @@ -420,13 +418,14 @@ EAPI_MAIN int elm_main(int argc, char **argv) elm_config_finger_size_set(0); elm_config_scale_set(1.0); - eina_clist_init(&ourGlobals.winFangs); gld = &ourGlobals.gld; gldata_init(gld); // Set the engine to opengl_x11, then open our window. elm_config_preferred_engine_set("opengl_x11"); - ourGlobals.win = elm_win_util_standard_add("extantz", "extantz virtual world viewer"); + + ourGlobals.mainWindow = winFangAdd(NULL, 0, 0, 50, 20, "extantz virtual world viewer", "extantz"); + ourGlobals.win = ourGlobals.mainWindow->win; // Set preferred engine back to default from config elm_config_preferred_engine_set(NULL); @@ -444,7 +443,6 @@ EAPI_MAIN int elm_main(int argc, char **argv) return 1; #endif - evas_object_smart_callback_add(ourGlobals.win, "delete,request", _on_done, gld); evas_object_event_callback_add(ourGlobals.win, EVAS_CALLBACK_RESIZE, _on_resize, &ourGlobals); // Get the screen size. @@ -476,7 +474,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) chat_add(&ourGlobals); ourGlobals.files = filesAdd(&ourGlobals, (char *) elm_app_data_dir_get(), EINA_TRUE, EINA_FALSE); char *args[] = {"extantz", "-l", "test", "-foo", "COMBINED!", NULL}; - GuiLua *test = GuiLuaDo(5, args, ourGlobals.win); + GuiLua *test = GuiLuaDo(5, args, ourGlobals.mainWindow); // Gotta do this after adding the windows, otherwise the menu renders under the window. // This sucks, gotta redefine this menu each time we create a new window? @@ -511,22 +509,10 @@ EAPI_MAIN int elm_main(int argc, char **argv) if (ourGlobals.win) { - winFang *win; - Evas_3D_Demo_fini(&ourGlobals); eo_unref(ourGlobals.tb); - - EINA_CLIST_FOR_EACH_ENTRY(win, &test->winFangs, winFang, node) - { - winFangDel(win); - } - - EINA_CLIST_FOR_EACH_ENTRY(win, &ourGlobals.winFangs, winFang, node) - { - winFangDel(win); - } eo_unref(ourGlobals.bx); - evas_object_del(ourGlobals.win); + winFangDel(ourGlobals.mainWindow); } if (logDom >= 0) diff --git a/src/extantz/extantz.h b/src/extantz/extantz.h index aab5de5..502420b 100644 --- a/src/extantz/extantz.h +++ b/src/extantz/extantz.h @@ -216,6 +216,7 @@ typedef struct _globals Evas_Object *bx; // Our box. int logDom; // Our logging domain. + winFang *mainWindow; int scr_w, scr_h; // The size of the screen. int win_w, win_h; // The size of the window. int win_x, win_y; // The position of the window. @@ -225,8 +226,6 @@ typedef struct _globals GLData gld; Scene_Data *scene; - Eina_Clist winFangs; - winFang *files; } globals; diff --git a/src/extantz/files.c b/src/extantz/files.c index 357769e..948c261 100644 --- a/src/extantz/files.c +++ b/src/extantz/files.c @@ -146,8 +146,7 @@ winFang *filesAdd(globals *ourGlobals, char *path, Eina_Bool multi, Eina_Bool sa Widget *wid; Evas_Object *bx, *vbox, *fs, *bt, *rd = NULL, *rdg = NULL, *hoversel; - me = winFangAdd(ourGlobals->win, ourGlobals->win_w - 380, ourGlobals->win_w - 530, 350, 500, "file selector", "files"); - eina_clist_add_head(&ourGlobals->winFangs, &me->node); + me = winFangAdd(ourGlobals->mainWindow, ourGlobals->win_w - 380, ourGlobals->win_w - 530, 350, 500, "file selector", "files"); bx = eo_add(ELM_OBJ_BOX_CLASS, me->win, elm_obj_box_homogeneous_set(EINA_FALSE), diff --git a/src/extantz/woMan.c b/src/extantz/woMan.c index ee0cc02..8215253 100644 --- a/src/extantz/woMan.c +++ b/src/extantz/woMan.c @@ -159,8 +159,7 @@ winFang *woMan_add(globals *ourGlobals) char buf[PATH_MAX]; int i; - me = winFangAdd(ourGlobals->win, 30, 150, ourGlobals->win_w / 3, ourGlobals->win_h / 3, "virtual world manager", "woMan"); - eina_clist_add_head(&ourGlobals->winFangs, &me->node); + me = winFangAdd(ourGlobals->mainWindow, 30, 150, ourGlobals->win_w / 3, ourGlobals->win_h / 3, "virtual world manager", "woMan"); bx = elm_box_add(me->win); elm_win_resize_object_add(me->win, bx); diff --git a/src/libraries/winFang.c b/src/libraries/winFang.c index 4d54627..33d5ea6 100644 --- a/src/libraries/winFang.c +++ b/src/libraries/winFang.c @@ -72,7 +72,7 @@ void winFangShow(winFang *win) evas_object_show(win->hand[i]); } -winFang *winFangAdd(Evas_Object *parent, int x, int y, int w, int h, char *title, char *name) +winFang *winFangAdd(winFang *parent, int x, int y, int w, int h, char *title, char *name) { winFang *result; Evas_Object *obj, *obj2, *bg; @@ -81,6 +81,7 @@ winFang *winFangAdd(Evas_Object *parent, int x, int y, int w, int h, char *title result = calloc(1, sizeof(winFang)); eina_clist_init(&result->widgets); + eina_clist_init(&result->winFangs); if (parent) result->internal = EINA_TRUE; @@ -94,7 +95,8 @@ winFang *winFangAdd(Evas_Object *parent, int x, int y, int w, int h, char *title // elm_config_engine_set("ews"); if (result->internal) { - result->win = elm_win_add(parent, name, ELM_WIN_INLINED_IMAGE); + result->win = elm_win_add(parent->win, name, ELM_WIN_INLINED_IMAGE); + eina_clist_add_head(&parent->winFangs, &result->node); obj = elm_win_inlined_image_object_get(result->win); // On mouse down we try to shift focus to the backing image, this seems to be the correct thing to force focus onto it's widgets. // According to the Elm inlined image window example, this is what's needed to. @@ -144,7 +146,7 @@ winFang *winFangAdd(Evas_Object *parent, int x, int y, int w, int h, char *title } else { - result->win = elm_win_add(parent, name, ELM_WIN_BASIC); + result->win = elm_win_add(NULL, name, ELM_WIN_BASIC); evas_object_move(result->win, result->x, result->y); evas_object_smart_callback_add(result->win, "delete,request", _on_done, NULL); } @@ -168,10 +170,16 @@ winFang *winFangAdd(Evas_Object *parent, int x, int y, int w, int h, char *title void winFangDel(winFang *win) { - Widget *wid; + winFang *wf; + Widget *wid; if (!win) return; + EINA_CLIST_FOR_EACH_ENTRY(wf, &win->winFangs, winFang, node) + { + winFangDel(wf); + } + // Elm will delete our widgets, but if we are using eo, we need to unref them. EINA_CLIST_FOR_EACH_ENTRY(wid, &win->widgets, Widget, node) { diff --git a/src/libraries/winFang.h b/src/libraries/winFang.h index 38487cc..f3c4861 100644 --- a/src/libraries/winFang.h +++ b/src/libraries/winFang.h @@ -19,6 +19,7 @@ typedef struct _winFang { Evas_Object *win; Eina_Clist widgets; + Eina_Clist winFangs; int x, y, w, h; Eina_Bool internal; @@ -45,7 +46,7 @@ typedef struct _Widget Evas_Smart_Cb on_del; } Widget; -winFang *winFangAdd(Evas_Object *parent, int x, int y, int w, int h, char *title, char *name); +winFang *winFangAdd(winFang *parent, int x, int y, int w, int h, char *title, char *name); void winFangHide(winFang *win); void winFangShow(winFang *win); void winFangDel(winFang *win); -- cgit v1.1