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