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:
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