viking

webkit based web browser for Enlightenment
Log | Files | Refs | LICENSE

commit 29f923f86f6a95fdff52f454bb4364b095ed08a3
parent fafd4869791ef1f078964bb8b34ec4dad4b15d31
Author: Kyle Milz <kmilz@ucalgary.ca>
Date:   Mon, 22 Oct 2012 11:44:53 -0600

main: implement proper per object delete/free

when elm_shutdown is called all objects delete and then free themselves,
so no need to do this manually.

also, make in program deleting/adding of buffers and windows work
consistently and make eet state always match program state. fixes bugs
in session saving/restoring.

Diffstat:
Msrc/buffer.c | 19+++++++------------
Msrc/commands.c | 68++++++++++++++++++++++++++++----------------------------------------
Msrc/commands.h | 3+--
Msrc/keymap.h | 9++++-----
Msrc/main.c | 32++++++++------------------------
Msrc/viking.h | 2+-
Msrc/window.c | 18+++++++++++++++---
7 files changed, 64 insertions(+), 87 deletions(-)

diff --git a/src/buffer.c b/src/buffer.c @@ -518,22 +518,17 @@ free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Buffer_Data *bd = data; Window_Data *wd = bd->window; - elm_naviframe_item_pop(wd->naviframe); + Session_Item *si; - if (!wd->app->exiting) - wd->cur_buf->view = NULL; + if ((si = evas_object_data_get(wd->cur_buf->view, "session"))) + session_window_tabs_del(wd->session_window, si); - wd->buffer_list = eina_list_remove(wd->buffer_list, bd); + // if (!wd->app->exiting) + // wd->cur_buf->view = NULL; - if (eina_list_count(wd->buffer_list)) { - printf("buffer_free_cb() freeing buffer\n"); - // window_main_buffer_set(eina_list_nth(wd->buffer_list, 0)); - } - else { - printf("buffer_free_cb() all buffers are gone!\n"); - // evas_object_del(wd->win); - } + wd->buffer_list = eina_list_remove(wd->buffer_list, bd); + printf("buffer_free_cb()\n"); free(bd); } diff --git a/src/commands.c b/src/commands.c @@ -343,6 +343,7 @@ open_arg(const Arg *arg, void *data) { Arg a = { .i = NavigationReload }; Window_Data *wd = data; + Buffer_Data *buf_new; if (!arg->s) { navigate(&a, wd); @@ -350,12 +351,19 @@ open_arg(const Arg *arg, void *data) else if (arg->i == TargetCurrent) { ewk_view_url_set(wd->cur_buf->view, uri_sanitize(arg->s)); } - else { + else if (arg->i == TargetNew) { buffer_add(SwitchToBuffer, wd, NULL, NULL); a.i = TargetCurrent; a.s = arg->s; open_arg(&a, wd); } + else if (arg->i == TargetNewWindow) { + buf_new = buffer_add(SwitchToBuffer | InNewWindow, wd, NULL, NULL); + a.i = TargetCurrent; + a.s = arg->s; + open_arg(&a, buf_new->window); + } + return EINA_TRUE; } @@ -433,20 +441,31 @@ paste(const Arg *arg, void *data) { } Eina_Bool -tab_quit(const Arg *arg, void *data) +buffer(const Arg *arg, void *data) { - Session_Item *si; Window_Data *wd = data; + Eina_List *cur, *next, *prev; - if ((si = evas_object_data_get(wd->cur_buf->view, "session"))) { - Eina_List *tabs = session_window_tabs_list_get(wd->session_window); - tabs = eina_list_remove(tabs, si); - session_item_free(si); - session_window_tabs_list_set(wd->session_window, tabs); - } + cur = eina_list_data_find_list(wd->buffer_list, wd->cur_buf); + next = eina_list_next(cur); + prev = eina_list_prev(cur); + // elm_naviframe_item_pop(wd->naviframe); evas_object_del(wd->cur_buf->view); + if (next) { + printf("buffer_quit() setting main buf to next element\n"); + window_main_buffer_set(eina_list_data_get(next)); + } + else if (prev) { + printf("buffer_quit() setting main buf to prev element\n"); + window_main_buffer_set(eina_list_data_get(prev)); + } + else { + printf("buffer_quit() no ->next or ->prev, deleting window!\n"); + evas_object_del(wd->win); + } + return EINA_TRUE; } @@ -897,34 +916,3 @@ inspector(const Arg *arg, void *data) return EINA_TRUE; } -Eina_Bool -window(const Arg *arg, void *data) -{ - Window_Data *wd = data; - App_Data *ad = wd->app; - Session_Window *sw; - - if (arg->i & CreateWindow) { - buffer_add(InNewWindow | SwitchToBuffer, wd, (arg->s ? arg->s : NULL), NULL); - } - else if (arg->i & DeleteWindow) { - ad->windows = eina_list_remove(ad->windows, wd); - - sw = wd->session_window; - Eina_List *windows = session_windows_list_get(ad->session); - windows = eina_list_remove(windows, sw); - session_window_free(sw); - session_windows_list_set(ad->session, windows); - - // session_windows_del(ad->session, wd->session_window); - evas_object_del(wd->win); - } - - if (!ad->windows) { - ad->exiting = EINA_TRUE; - elm_exit(); - } - - return EINA_TRUE; -} - diff --git a/src/commands.h b/src/commands.h @@ -20,12 +20,11 @@ Eina_Bool search(const Arg *, void *); Eina_Bool input(const Arg *, void *); Eina_Bool focus_input(const Arg *, void *); Eina_Bool quickmark(const Arg *, void *); -Eina_Bool tab_quit(const Arg *, void *); +Eina_Bool buffer(const Arg *, void *); Eina_Bool revive(const Arg *, void *); Eina_Bool set(const Arg *, void *); Eina_Bool list(const Arg *, void *); Eina_Bool switch_buffer(const Arg *, void *); Eina_Bool inspector(const Arg *, void *); -Eina_Bool window(const Arg *arg, void *data); // static Eina_Bool fake_key_event(const Arg *, void *); diff --git a/src/keymap.h b/src/keymap.h @@ -99,6 +99,8 @@ static Key keys[] = { { 0, 0, "O", input, {.s = ":open ", .i = InsertCurrentURL} }, { 0, 0, "t", input, {.s = ":tabopen "} }, { 0, 0, "T", input, {.s = ":tabopen ", .i = InsertCurrentURL} }, + { 0, 0, "w", input, {.s = ":winopen "} }, + { 0, 0, "W", input, {.s = ":winopen ", .i = InsertCurrentURL} }, { 0, 0, "slash", input, {.s = "/"} }, // { 0, 0, GDK_KP_Divide, input, {.s = "/"} }, { 0, 0, "question", input, {.s = "?"} }, @@ -126,9 +128,7 @@ static Key keys[] = { { 0, 'g', "i", focus_input,{} }, { 0, 0, "u", revive, {} }, - { 0, 0, "x", tab_quit, {0} }, - // { 0, 0, "w", input, { .s = ":winopen "} }, - { 0, 0, "w", window, { .i = CreateWindow} }, + { 0, 0, "x", buffer, {0} }, // { 0, 0, "X", revive_last_tab, {0} }, { 0, 0, "b", switch_buffer, {0}}, { 0, 0, "i", inspector, {0} }, @@ -162,6 +162,7 @@ static Command commands[] = { { "stop", navigate, {NavigationCancel} }, { "t", open_arg, {0} }, { "tabopen", open_arg, {TargetNew} }, + { "winopen", open_arg, {TargetNewWindow} }, { "print", print_frame, {0} }, { "bma", bookmark, {0} }, { "bookmark", bookmark, {0} }, @@ -181,8 +182,6 @@ static Command commands[] = { { "scrollup", scroll, {ScrollMove | DirectionTop | UnitLine} }, { "scrolldown", scroll, {ScrollMove | DirectionBottom | UnitLine} }, { "ls", list, {0} }, - { "winopen", window, {CreateWindow} }, - { "winclose", window, {DeleteWindow} }, }; #if 0 diff --git a/src/main.c b/src/main.c @@ -454,41 +454,25 @@ elm_main(int argc, char *argv[]) elm_run(); session_save_cb(ad); - config_save(ad->config, NULL); - config_free(ad->config); hist_save(ad->history, NULL); - hist_free(ad->history); - session_free(ad->session); if (ad->session_save_timer) ecore_timer_del(ad->session_save_timer); - Eina_List *w, *b_itr, *b_next; - Window_Data *wd; - Buffer_Data *bd; - /* free window specific data */ - EINA_LIST_FOREACH(ad->windows, w, wd) { - EINA_LIST_FOREACH_SAFE(wd->buffer_list, b_itr, b_next, bd) - evas_object_del(bd->view); - - eina_list_free(wd->buffer_list); - eina_list_free(wd->commandhistory); - evas_object_del(wd->win); - } - - eina_list_free(ad->windows); - eina_list_free(ad->downloads); - eina_list_free(ad->keylistroot); - free(ad->modkeys); - free(ad); - // printf("viking was up for %0.3f seconds\n", ecore_con_server_uptime_get(svr)); elm_shutdown(); viking_state_shutdown(); eet_shutdown(); ecore_con_shutdown(); - // free(uri); + config_free(ad->config); + hist_free(ad->history); + session_free(ad->session); + eina_list_free(ad->windows); + eina_list_free(ad->downloads); + eina_list_free(ad->keylistroot); + free(ad->modkeys); + free(ad); return 0; } diff --git a/src/viking.h b/src/viking.h @@ -12,7 +12,7 @@ /* enums */ enum { ModeNormal, ModePassThrough, ModeSendKey, ModeInsert, ModeHints }; /* modes */ -enum { TargetCurrent, TargetNew }; /* target */ +enum { TargetCurrent, TargetNew, TargetNewWindow }; /* target */ /* bitmask, 1 << 0: 0 = jumpTo, 1 = scroll 1 << 1: 0 = top/down, 1 = left/right diff --git a/src/window.c b/src/window.c @@ -318,18 +318,30 @@ delete_request_cb(void *data, Evas_Object *obj, void *event_info) printf("window requested deletion .."); - if (eina_list_count(wd->buffer_list) > 1) + if (eina_list_count(wd->buffer_list) > 1) { printf("denied, more than 1 buffer open\n"); - else + } + else { printf("ok!\n"); + evas_object_del(wd->win); + } } static void free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Window_Data *wd = data; - printf("window_free_cb()\n"); + App_Data *ad = wd->app; + + session_windows_del(ad->session, wd->session_window); + session_window_free(wd->session_window); + + ad->windows = eina_list_remove(ad->windows, wd); + + eina_list_free(wd->buffer_list); + eina_list_free(wd->commandhistory); free(wd); + printf("window_free_cb()\n"); } static void