viking

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

commit 601e82d7b4c8e9af3107220a5173cc6dee2d30ec
parent 914066ca5d1bfb3d8ef32f502bf46354df5f7dbb
Author: Kyle Milz <kmilz@ucalgary.ca>
Date:   Mon,  8 Oct 2012 00:12:25 -0600

implement session save/restore

use eet to save and restore session data. this includes all windows and
buffers that are currently open.

Diffstat:
Msrc/commands.c | 19+++++++++++++------
Msrc/main.c | 187++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Msrc/utilities.c | 52++++++++++++++++++++++++++++++++++------------------
Msrc/utilities.h | 4++--
Msrc/viking.h | 1+
5 files changed, 165 insertions(+), 98 deletions(-)

diff --git a/src/commands.c b/src/commands.c @@ -553,8 +553,7 @@ open_arg(const Arg *arg, void *data) ewk_view_uri_set(ad->cur_buf->view, new); free(new); } else { - a.i = SwitchToBuffer; - buffer_add(&a, ad); + buffer_add(SwitchToBuffer, ad, NULL, NULL); a.i = TargetCurrent; a.s = arg->s; open_arg(&a, ad); @@ -638,10 +637,18 @@ paste(const Arg *arg, void *data) { Eina_Bool tab_quit(const Arg *arg, void *data) { - Window_Data *ad = data; - /* TODO: save the session information for revival later */ + Session_Item *si; + Window_Data *wd = data; + + 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); + } + + evas_object_del(wd->cur_buf->view); - evas_object_del(ad->cur_buf->view); return EINA_TRUE; } @@ -1480,7 +1487,7 @@ window(const Arg *arg, void *data) Window_Data *wd = data; if (arg->i & CreateWindow) - window_add(wd->app); + window_add(wd->app, NULL); else if (arg->i & DeleteWindow) evas_object_del(wd->win); diff --git a/src/main.c b/src/main.c @@ -27,65 +27,66 @@ char *uri_sanitize(const char *); static Eina_Bool _cb_session_save(void *data) { - printf("session_save_cb()\n"); - /* - Browser_Window *win; - Eina_List *chrome_iter, *win_iter; - Evas_Object *chrome; - Eina_Bool changed = EINA_FALSE; - Session_Item *si; - - if (!config_restore_state_get(config)) goto end; - - EINA_LIST_FOREACH(app.windows, win_iter, win) - { - EINA_LIST_FOREACH(win->chromes, chrome_iter, chrome) - { - Evas_Object *view = evas_object_data_get(chrome, "view"); - Evas_Object *frame = ewk_view_frame_main_get(view); - const Eina_Bool focused = chrome == win->current_chrome; - const char *url, *wk_url; - int sx, sy; - - si = evas_object_data_get(chrome, "session"); - if (!si) - { - WRN("chrome %p doesn't have a Session_Item, ignoring", chrome); - continue; - } - - url = session_item_url_get(si); - wk_url = ewk_view_uri_get(view); - if ((url && wk_url && strcmp(url, wk_url)) || (wk_url && !url)) - { - session_item_url_set(si, wk_url); - changed = EINA_TRUE; - } - - ewk_frame_scroll_pos_get(frame, &sx, &sy); - if (session_item_scroll_x_get(si) != sx || - session_item_scroll_y_get(si) != sy) - { - session_item_scroll_x_set(si, sx); - session_item_scroll_y_set(si, sy); - changed = EINA_TRUE; - } - - if (session_item_focused_get(si) != focused) - { - session_item_focused_set(si, focused); - changed = EINA_TRUE; - } - } - } - - if (changed) - session_save(session, NULL); -end: - return ECORE_CALLBACK_RENEW; - */ + printf("session_saved()\n"); + Window_Data *wd; + Buffer_Data *bd; + Eina_List *buffer_iter, *win_iter; + Session_Item *si; + Eina_Bool changed = EINA_FALSE; + App_Data *ad = data; + + if (!config_restore_state_get(ad->config)) goto end; + + EINA_LIST_FOREACH(ad->windows, win_iter, wd) + { + EINA_LIST_FOREACH(wd->buffer_list, buffer_iter, bd) + { + printf("iterating over buffer ..\n"); + Evas_Object *view = bd->view; + + const Eina_Bool focused = bd == wd->cur_buf; + const char *url, *wk_url; + // int sx, sy; + + si = evas_object_data_get(bd->view, "session"); + if (!si) { + printf("chrome %p doesn't have a Session_Item, ignoring\n", bd); + continue; + } + + url = session_item_url_get(si); + wk_url = ewk_view_uri_get(view); + if ((url && wk_url && strcmp(url, wk_url)) || (wk_url && !url)) + { + session_item_url_set(si, wk_url); + changed = EINA_TRUE; + } + + /* + ewk_frame_scroll_pos_get(frame, &sx, &sy); + if (session_item_scroll_x_get(si) != sx || + session_item_scroll_y_get(si) != sy) + { + session_item_scroll_x_set(si, sx); + session_item_scroll_y_set(si, sy); + changed = EINA_TRUE; + } + */ + + if (session_item_focused_get(si) != focused) + { + session_item_focused_set(si, focused); + changed = EINA_TRUE; + } + } + } - return EINA_FALSE; + if (changed) { + session_save(ad->session, NULL); + printf("saving session to file ..\n"); + } +end: + return ECORE_CALLBACK_RENEW; } static const Ecore_Getopt options = { @@ -143,9 +144,54 @@ uri_sanitize(const char *uri) { } static Eina_Bool -session_restore(void) +session_restore(App_Data *ad) { - return EINA_FALSE; + Eina_List *windows = session_windows_list_get(ad->session); + Eina_List *window_iter; + Session_Window *window; + int n_tabs = 0; + + printf("restoring session with %i windows..\n", eina_list_count(windows)); + + EINA_LIST_FOREACH(windows, window_iter, window) { + + Eina_List *items = session_window_tabs_list_get(window); + Eina_List *items_iter; + Window_Data *wd; + Session_Item *item; + Buffer_Data *bd, *focused_buffer; + + printf("\trestoring window with %i buffers ..\n", eina_list_count(items)); + + // if (!items) continue; + // item = eina_list_data_get(items); + + wd = window_add(ad, window); + // focused_buffer = buffer_add(0, wd, session_item_url_get(item), item); + // printf("\t\tbuffer restored, url = %s\n", session_item_url_get(item)); + // if (!wd) continue; + + // focused_buffer = win->current_chrome; + // session_restore_delayed_scroll(win->current_view, item); + //n_tabs++; + + EINA_LIST_FOREACH(items, items_iter, item) { + + printf("\t\tbuffer restored, url = %s\n", session_item_url_get(item)); + bd = buffer_add(0, wd, session_item_url_get(item), item); + + // session_restore_delayed_scroll(win->current_view, item); + if (session_item_focused_get(item)) + focused_buffer = bd; + + n_tabs++; + } + + // tab_focus_chrome(win, focused_chrome); + buffer_current_set(focused_buffer); + } + + return !!n_tabs; } static URIHandler uri_handlers[] = { @@ -205,8 +251,8 @@ _server_data(void *data, int type, Ecore_Con_Event_Client_Data *ev) arg.s = uri; } /* second arg can be NULL because InNewWindow flag set */ - Window_Data *wd = window_add(ad); - buffer_add(&arg, wd); + Window_Data *wd = window_add(ad, NULL); + buffer_add(SwitchToBuffer, wd, uri, NULL); return ECORE_CALLBACK_RENEW; } @@ -330,7 +376,7 @@ elm_main(int argc, char *argv[]) ERR("Could not save new session file at %s", path); } - session_save_timer = ecore_timer_loop_add(30, _cb_session_save, NULL); + session_save_timer = ecore_timer_loop_add(10, _cb_session_save, ad); if (!session_save_timer) ERR("Could not register session save timer"); @@ -362,27 +408,22 @@ elm_main(int argc, char *argv[]) // ecore_con_server_client_limit_set(svr, 3, 0); /* try to restore session */ - if (session_windows_count(session) > 0 && session_restore()) { + if (session_windows_count(session) > 0 && session_restore(ad)) { printf("session restored successfully.\n"); } else { - Arg arg; - arg.i = SwitchToBuffer | (uri ? CustomUrl : DefaultUrl); - arg.s = (uri ? uri : NULL); - Window_Data *wd = window_add(ad); - buffer_add(&arg, wd); + Window_Data *wd = window_add(ad, NULL); + buffer_add(SwitchToBuffer, wd, uri, NULL); } elm_run(); - // printf("viking was up for %0.3f seconds\n", ecore_con_server_uptime_get(svr)); - ecore_con_shutdown(); + _cb_session_save(ad); config_save(ad->config, NULL); config_free(ad->config); hist_save(ad->history, NULL); hist_free(ad->history); - _cb_session_save(ad->session); session_free(ad->session); if (ad->session_save_timer) ecore_timer_del(ad->session_save_timer); @@ -403,6 +444,8 @@ elm_main(int argc, char *argv[]) free(ad->modkeys); free(ad); + // printf("viking was up for %0.3f seconds\n", ecore_con_server_uptime_get(svr)); + ecore_con_shutdown(); elm_shutdown(); viking_state_shutdown(); diff --git a/src/utilities.c b/src/utilities.c @@ -1165,20 +1165,22 @@ setup_modkeys(void *data) // fprintf(stderr, "Modkey array looks like %s\n", ad->modkeys); } -void -buffer_add(const Arg *arg, Window_Data *wd) +Buffer_Data* +buffer_add(const unsigned char flags, Window_Data *wd, const char *url, Session_Item *session_item) { // Window_Data *wd = data; Buffer_Data *td; + // Session_Item *session_item; td = calloc(1, sizeof(Buffer_Data)); - if (!td) return; + if (!td) return NULL; /* if the InNewWindow flag is set, create the buffer in a new window */ - if (arg->i & InNewWindow) - wd = window_add(wd->app); + if (flags & InNewWindow) + wd = window_add(wd->app, NULL); wd->buf_total++; + wd->buffer_list = eina_list_append(wd->buffer_list, td); td->window = wd; td->buf_number = wd->buf_total; @@ -1190,8 +1192,6 @@ buffer_add(const Arg *arg, Window_Data *wd) td->web = elm_web_add(wd->win); td->view = elm_web_webkit_view_get(td->web); - wd->buffer_list = eina_list_append(wd->buffer_list, td); - // ewk_view_setting_user_agent_set(td->view, "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7"); // ewk_view_history_enable_set(td->view, EINA_TRUE); @@ -1208,17 +1208,26 @@ buffer_add(const Arg *arg, Window_Data *wd) elm_naviframe_item_simple_push(ad->naviframe, td->web); */ - evas_object_data_set(td->view, "buffer_data", td); - setup_buffer_callbacks(td); - if (arg->i & CustomUrl) - ewk_view_uri_set(td->view, arg->s); + if (url) + ewk_view_uri_set(td->view, url); else ewk_view_uri_set(td->view, config_home_page_get(wd->app->config)); - if (arg->i & SwitchToBuffer) + if (flags & SwitchToBuffer) buffer_current_set(td); + + if (!session_item) { + if (!(session_item = session_item_new(ewk_view_uri_get(td->view), EINA_FALSE, 0, 0))) + CRITICAL("Could not create session object"); + session_window_tabs_add(wd->session_window, session_item); + } + + evas_object_data_set(td->view, "session", session_item); + evas_object_data_set(td->view, "buffer_data", td); + + return td; } void @@ -1228,8 +1237,8 @@ buffer_current_set(Buffer_Data *new_buf) Buffer_Data *old_buf = wd->cur_buf; App_Data *ad = wd->app; - if (new_buf == old_buf || ad->exiting) - return; + // if (new_buf == old_buf || ad->exiting) + // return; if (old_buf) { // ewk_view_visibility_state_set(old_buf->view, EWK_PAGE_VISIBILITY_STATE_HIDDEN, 0); @@ -1262,7 +1271,7 @@ buffer_current_set(Buffer_Data *new_buf) } Window_Data* -window_add(App_Data *ad) +window_add(App_Data *ad, Session_Window *session_window) { // App_Data *ad = data; Window_Data *wd; @@ -1382,12 +1391,19 @@ window_add(App_Data *ad) wd->progress_bar = progress; wd->downloads = downloads; wd->app = ad; - - setup_window_callbacks(wd); - wd->mode = ModeNormal; wd->echo_active = EINA_TRUE; + if (session_window) { + wd->session_window = session_window; + } + else { + wd->session_window = session_window_new(NULL, EINA_FALSE); + session_windows_add(ad->session, wd->session_window); + } + + setup_window_callbacks(wd); + ad->windows = eina_list_append(ad->windows, wd); evas_object_resize(wd->win, 1024, 768); diff --git a/src/utilities.h b/src/utilities.h @@ -33,8 +33,8 @@ char * search_word(int whichword); void userscript_hooks_start(const char*); void userscript_hooks_end(const char*); void setup_modkeys(void *data); -void buffer_add(const Arg *, Window_Data *); -Window_Data* window_add(App_Data *); +Buffer_Data* buffer_add(const unsigned char, Window_Data *, const char *, Session_Item *); +Window_Data* window_add(App_Data *, Session_Window*); Eina_Bool echo(const Arg *arg, void *); void update_state(void *); void update_url(const char *, void *); diff --git a/src/viking.h b/src/viking.h @@ -253,6 +253,7 @@ typedef struct char *error_msg; char *search_handle; + Session_Window *session_window; Buffer_Data *cur_buf; App_Data *app; } Window_Data;