X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fopenbox;a=blobdiff_plain;f=openbox%2Fsession.c;fp=openbox%2Fsession.c;h=758e9887bb2ad3f2d8f5378ab3f0cda47dd57c96;hp=14018478ae183df6beda9a5af2015edaeec4ee2a;hb=2f09e0ce388f63c341cb328d795766e2bd0dc24b;hpb=672aea85cfe2ac2bc8cb4e3f34fd023f10d90182 diff --git a/openbox/session.c b/openbox/session.c index 14018478..758e9887 100644 --- a/openbox/session.c +++ b/openbox/session.c @@ -40,10 +40,10 @@ gboolean session_connected(void) { return FALSE; } #include "debug.h" #include "openbox.h" #include "client.h" -#include "prop.h" #include "focus.h" #include "gettext.h" -#include "parser/parse.h" +#include "obt/parse.h" +#include "obt/paths.h" #include #include @@ -93,22 +93,26 @@ static void session_state_free(ObSessionState *state); void session_startup(gint argc, gchar **argv) { gchar *dir; + ObtPaths *p; if (!ob_sm_use) return; sm_argc = argc; sm_argv = argv; - dir = g_build_filename(parse_xdg_data_home_path(), + p = obt_paths_new(); + dir = g_build_filename(obt_paths_cache_home(p), "openbox", "sessions", NULL); - if (!parse_mkdir_path(dir, 0700)) { + obt_paths_unref(p), p = NULL; + + if (!obt_paths_mkdir_path(dir, 0700)) { g_message(_("Unable to make directory \"%s\": %s"), dir, g_strerror(errno)); } if (ob_sm_save_file != NULL) { if (ob_sm_restore) { - ob_debug_type(OB_DEBUG_SM, "Loading from session file %s\n", + ob_debug_type(OB_DEBUG_SM, "Loading from session file %s", ob_sm_save_file); session_load_file(ob_sm_save_file); } @@ -162,7 +166,7 @@ gboolean session_connected(void) } /*! Connect to the session manager and set up our callback functions */ -static gboolean session_connect() +static gboolean session_connect(void) { SmcCallbacks cb; gchar *oldid; @@ -180,7 +184,7 @@ static gboolean session_connect() /* connect to the server */ oldid = ob_sm_id; - ob_debug_type(OB_DEBUG_SM, "Connecting to SM with id: %s\n", + ob_debug_type(OB_DEBUG_SM, "Connecting to SM with id: %s", oldid ? oldid : "(null)"); sm_conn = SmcOpenConnection(NULL, NULL, 1, 0, SmcSaveYourselfProcMask | @@ -190,13 +194,13 @@ static gboolean session_connect() &cb, oldid, &ob_sm_id, SM_ERR_LEN-1, sm_err); g_free(oldid); - ob_debug_type(OB_DEBUG_SM, "Connected to SM with id: %s\n", ob_sm_id); + ob_debug_type(OB_DEBUG_SM, "Connected to SM with id: %s", ob_sm_id); if (sm_conn == NULL) - ob_debug("Failed to connect to session manager: %s\n", sm_err); + ob_debug("Failed to connect to session manager: %s", sm_err); return sm_conn != NULL; } -static void session_setup_program() +static void session_setup_program(void) { SmPropValue vals = { .value = sm_argv[0], @@ -209,13 +213,13 @@ static void session_setup_program() .vals = &vals }; SmProp *list = ∝ - ob_debug_type(OB_DEBUG_SM, "Setting program: %s\n", sm_argv[0]); + ob_debug_type(OB_DEBUG_SM, "Setting program: %s", sm_argv[0]); SmcSetProperties(sm_conn, 1, &list); g_free(prop.name); g_free(prop.type); } -static void session_setup_user() +static void session_setup_user(void) { char *user = g_strdup(g_get_user_name()); @@ -230,7 +234,7 @@ static void session_setup_user() .vals = &vals }; SmProp *list = ∝ - ob_debug_type(OB_DEBUG_SM, "Setting user: %s\n", user); + ob_debug_type(OB_DEBUG_SM, "Setting user: %s", user); SmcSetProperties(sm_conn, 1, &list); g_free(prop.name); g_free(prop.type); @@ -252,13 +256,13 @@ static void session_setup_restart_style(gboolean restart) .vals = &vals }; SmProp *list = ∝ - ob_debug_type(OB_DEBUG_SM, "Setting restart: %d\n", restart); + ob_debug_type(OB_DEBUG_SM, "Setting restart: %d", restart); SmcSetProperties(sm_conn, 1, &list); g_free(prop.name); g_free(prop.type); } -static void session_setup_pid() +static void session_setup_pid(void) { gchar *pid = g_strdup_printf("%ld", (glong) getpid()); @@ -273,7 +277,7 @@ static void session_setup_pid() .vals = &vals }; SmProp *list = ∝ - ob_debug_type(OB_DEBUG_SM, "Setting pid: %s\n", pid); + ob_debug_type(OB_DEBUG_SM, "Setting pid: %s", pid); SmcSetProperties(sm_conn, 1, &list); g_free(prop.name); g_free(prop.type); @@ -281,7 +285,7 @@ static void session_setup_pid() } /*! This is a gnome-session-manager extension */ -static void session_setup_priority() +static void session_setup_priority(void) { gchar priority = 20; /* 20 is a lower prioity to run before other apps */ @@ -296,13 +300,13 @@ static void session_setup_priority() .vals = &vals }; SmProp *list = ∝ - ob_debug_type(OB_DEBUG_SM, "Setting priority: %d\n", priority); + ob_debug_type(OB_DEBUG_SM, "Setting priority: %d", priority); SmcSetProperties(sm_conn, 1, &list); g_free(prop.name); g_free(prop.type); } -static void session_setup_clone_command() +static void session_setup_clone_command(void) { gint i; @@ -315,11 +319,11 @@ static void session_setup_clone_command() }; SmProp *list = ∝ - ob_debug_type(OB_DEBUG_SM, "Setting clone command: (%d)\n", sm_argc); + ob_debug_type(OB_DEBUG_SM, "Setting clone command: (%d)", sm_argc); for (i = 0; i < sm_argc; ++i) { vals[i].value = sm_argv[i]; vals[i].length = strlen(sm_argv[i]) + 1; - ob_debug_type(OB_DEBUG_SM, " %s\n", vals[i].value); + ob_debug_type(OB_DEBUG_SM, " %s", vals[i].value); } SmcSetProperties(sm_conn, 1, &list); @@ -328,7 +332,7 @@ static void session_setup_clone_command() g_free(vals); } -static void session_setup_restart_command() +static void session_setup_restart_command(void) { gint i; @@ -341,26 +345,26 @@ static void session_setup_restart_command() }; SmProp *list = ∝ - ob_debug_type(OB_DEBUG_SM, "Setting restart command: (%d)\n", sm_argc+4); + ob_debug_type(OB_DEBUG_SM, "Setting restart command: (%d)", sm_argc+4); for (i = 0; i < sm_argc; ++i) { vals[i].value = sm_argv[i]; vals[i].length = strlen(sm_argv[i]) + 1; - ob_debug_type(OB_DEBUG_SM, " %s\n", vals[i].value); + ob_debug_type(OB_DEBUG_SM, " %s", vals[i].value); } vals[i].value = g_strdup("--sm-client-id"); vals[i].length = strlen("--sm-client-id") + 1; vals[i+1].value = ob_sm_id; vals[i+1].length = strlen(ob_sm_id) + 1; - ob_debug_type(OB_DEBUG_SM, " %s\n", vals[i].value); - ob_debug_type(OB_DEBUG_SM, " %s\n", vals[i+1].value); + ob_debug_type(OB_DEBUG_SM, " %s", vals[i].value); + ob_debug_type(OB_DEBUG_SM, " %s", vals[i+1].value); vals[i+2].value = g_strdup("--sm-save-file"); vals[i+2].length = strlen("--sm-save-file") + 1; vals[i+3].value = ob_sm_save_file; vals[i+3].length = strlen(ob_sm_save_file) + 1; - ob_debug_type(OB_DEBUG_SM, " %s\n", vals[i+2].value); - ob_debug_type(OB_DEBUG_SM, " %s\n", vals[i+3].value); + ob_debug_type(OB_DEBUG_SM, " %s", vals[i+2].value); + ob_debug_type(OB_DEBUG_SM, " %s", vals[i+3].value); SmcSetProperties(sm_conn, 1, &list); g_free(prop.name); @@ -370,7 +374,7 @@ static void session_setup_restart_command() g_free(vals); } -static ObSMSaveData *sm_save_get_data() +static ObSMSaveData *sm_save_get_data(void) { ObSMSaveData *savedata = g_new0(ObSMSaveData, 1); /* save the active desktop and client. @@ -388,9 +392,9 @@ static void sm_save_yourself_2(SmcConn conn, SmPointer data) ObSMSaveData *savedata = data; /* save the current state */ - ob_debug_type(OB_DEBUG_SM, "Session save phase 2 requested\n"); + ob_debug_type(OB_DEBUG_SM, "Session save phase 2 requested"); ob_debug_type(OB_DEBUG_SM, - " Saving session to file '%s'\n", ob_sm_save_file); + " Saving session to file '%s'", ob_sm_save_file); if (savedata == NULL) savedata = sm_save_get_data(); success = session_save_to_file(savedata); @@ -399,7 +403,7 @@ static void sm_save_yourself_2(SmcConn conn, SmPointer data) /* tell the session manager how to restore this state */ if (success) session_setup_restart_command(); - ob_debug_type(OB_DEBUG_SM, "Saving is done (success = %d)\n", success); + ob_debug_type(OB_DEBUG_SM, "Saving is done (success = %d)", success); SmcSaveYourselfDone(conn, success); } @@ -415,7 +419,7 @@ static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type, (save_type == SmSaveLocal ? "SmSaveLocal" : (save_type == SmSaveGlobal ? "SmSaveGlobal" : (save_type == SmSaveBoth ? "SmSaveBoth" : "INVALID!!"))); - ob_debug_type(OB_DEBUG_SM, "Session save requested, type %s\n", sname); + ob_debug_type(OB_DEBUG_SM, "Session save requested, type %s", sname); } #endif @@ -427,7 +431,7 @@ static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type, } vendor = SmcVendor(sm_conn); - ob_debug_type(OB_DEBUG_SM, "Session manager's vendor: %s\n", vendor); + ob_debug_type(OB_DEBUG_SM, "Session manager's vendor: %s", vendor); if (!strcmp(vendor, "KDE")) { /* ksmserver guarantees that phase 1 will complete before allowing any @@ -438,7 +442,7 @@ static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type, free(vendor); if (!SmcRequestSaveYourselfPhase2(conn, sm_save_yourself_2, savedata)) { - ob_debug_type(OB_DEBUG_SM, "Requst for phase 2 failed\n"); + ob_debug_type(OB_DEBUG_SM, "Requst for phase 2 failed"); g_free(savedata); SmcSaveYourselfDone(conn, FALSE); } @@ -446,18 +450,18 @@ static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type, static void sm_die(SmcConn conn, SmPointer data) { - ob_debug_type(OB_DEBUG_SM, "Die requested\n"); + ob_debug_type(OB_DEBUG_SM, "Die requested"); ob_exit(0); } static void sm_save_complete(SmcConn conn, SmPointer data) { - ob_debug_type(OB_DEBUG_SM, "Save complete\n"); + ob_debug_type(OB_DEBUG_SM, "Save complete"); } static void sm_shutdown_cancelled(SmcConn conn, SmPointer data) { - ob_debug_type(OB_DEBUG_SM, "Shutdown cancelled\n"); + ob_debug_type(OB_DEBUG_SM, "Shutdown cancelled"); } static gboolean session_save_to_file(const ObSMSaveData *savedata) @@ -519,18 +523,18 @@ static gboolean session_save_to_file(const ObSMSaveData *savedata) if (!c->sm_client_id) { ob_debug_type(OB_DEBUG_SM, "Client %s does not have a " - "session id set\n", + "session id set", c->title); if (!c->wm_command) { ob_debug_type(OB_DEBUG_SM, "Client %s does not have an " "oldskool wm_command set either. We won't " - "be saving its data\n", + "be saving its data", c->title); continue; } } - ob_debug_type(OB_DEBUG_SM, "Saving state for client %s\n", + ob_debug_type(OB_DEBUG_SM, "Saving state for client %s", c->title); prex = c->area.x; @@ -632,20 +636,20 @@ static void session_state_free(ObSessionState *state) static gboolean session_state_cmp(ObSessionState *s, ObClient *c) { - ob_debug_type(OB_DEBUG_SM, "Comparing client against saved state: \n"); - ob_debug_type(OB_DEBUG_SM, " client id: %s \n", c->sm_client_id); - ob_debug_type(OB_DEBUG_SM, " client name: %s \n", c->name); - ob_debug_type(OB_DEBUG_SM, " client class: %s \n", c->class); - ob_debug_type(OB_DEBUG_SM, " client role: %s \n", c->role); - ob_debug_type(OB_DEBUG_SM, " client type: %d \n", c->type); - ob_debug_type(OB_DEBUG_SM, " client command: %s \n", + ob_debug_type(OB_DEBUG_SM, "Comparing client against saved state: "); + ob_debug_type(OB_DEBUG_SM, " client id: %s ", c->sm_client_id); + ob_debug_type(OB_DEBUG_SM, " client name: %s ", c->name); + ob_debug_type(OB_DEBUG_SM, " client class: %s ", c->class); + ob_debug_type(OB_DEBUG_SM, " client role: %s ", c->role); + ob_debug_type(OB_DEBUG_SM, " client type: %d ", c->type); + ob_debug_type(OB_DEBUG_SM, " client command: %s ", c->wm_command ? c->wm_command : "(null)"); - ob_debug_type(OB_DEBUG_SM, " state id: %s \n", s->id); - ob_debug_type(OB_DEBUG_SM, " state name: %s \n", s->name); - ob_debug_type(OB_DEBUG_SM, " state class: %s \n", s->class); - ob_debug_type(OB_DEBUG_SM, " state role: %s \n", s->role); - ob_debug_type(OB_DEBUG_SM, " state type: %d \n", s->type); - ob_debug_type(OB_DEBUG_SM, " state command: %s \n", + ob_debug_type(OB_DEBUG_SM, " state id: %s ", s->id); + ob_debug_type(OB_DEBUG_SM, " state name: %s ", s->name); + ob_debug_type(OB_DEBUG_SM, " state class: %s ", s->class); + ob_debug_type(OB_DEBUG_SM, " state role: %s ", s->role); + ob_debug_type(OB_DEBUG_SM, " state type: %d ", s->type); + ob_debug_type(OB_DEBUG_SM, " state command: %s ", s->command ? s->command : "(null)"); if ((c->sm_client_id && s->id && !strcmp(c->sm_client_id, s->id)) || @@ -680,108 +684,117 @@ GList* session_state_find(ObClient *c) static void session_load_file(const gchar *path) { - xmlDocPtr doc; + ObtParseInst *i; xmlNodePtr node, n, m; GList *it, *inext; - if (!parse_load(path, "openbox_session", &doc, &node)) + i = obt_parse_instance_new(); + + if (!obt_parse_load_file(i, path, "openbox_session")) { + ob_debug_type(OB_DEBUG_SM, "ERROR: session file is missing root node"); + obt_parse_instance_unref(i); return; + } + node = obt_parse_root(i); - if ((n = parse_find_node("desktop", node->children))) - session_desktop = parse_int(doc, n); + if ((n = obt_parse_find_node(node->children, "desktop"))) + session_desktop = obt_parse_node_int(n); - if ((n = parse_find_node("numdesktops", node->children))) - session_num_desktops = parse_int(doc, n); + if ((n = obt_parse_find_node(node->children, "numdesktops"))) + session_num_desktops = obt_parse_node_int(n); - if ((n = parse_find_node("desktoplayout", node->children))) { + if ((n = obt_parse_find_node(node->children, "desktoplayout"))) { /* make sure they are all there for it to be valid */ - if ((m = parse_find_node("orientation", n->children))) - session_desktop_layout.orientation = parse_int(doc, m); - if (m && (m = parse_find_node("startcorner", n->children))) - session_desktop_layout.start_corner = parse_int(doc, m); - if (m && (m = parse_find_node("columns", n->children))) - session_desktop_layout.columns = parse_int(doc, m); - if (m && (m = parse_find_node("rows", n->children))) - session_desktop_layout.rows = parse_int(doc, m); + if ((m = obt_parse_find_node(n->children, "orientation"))) + session_desktop_layout.orientation = obt_parse_node_int(m); + if (m && (m = obt_parse_find_node(n->children, "startcorner"))) + session_desktop_layout.start_corner = obt_parse_node_int(m); + if (m && (m = obt_parse_find_node(n->children, "columns"))) + session_desktop_layout.columns = obt_parse_node_int(m); + if (m && (m = obt_parse_find_node(n->children, "rows"))) + session_desktop_layout.rows = obt_parse_node_int(m); session_desktop_layout_present = m != NULL; } - if ((n = parse_find_node("desktopnames", node->children))) { - for (m = parse_find_node("name", n->children); m; - m = parse_find_node("name", m->next)) + if ((n = obt_parse_find_node(node->children, "desktopnames"))) { + for (m = obt_parse_find_node(n->children, "name"); m; + m = obt_parse_find_node(m->next, "name")) { session_desktop_names = g_slist_append(session_desktop_names, - parse_string(doc, m)); + obt_parse_node_string(m)); } } - for (node = parse_find_node("window", node->children); node != NULL; - node = parse_find_node("window", node->next)) + ob_debug_type(OB_DEBUG_SM, "loading windows"); + for (node = obt_parse_find_node(node->children, "window"); node != NULL; + node = obt_parse_find_node(node->next, "window")) { ObSessionState *state; state = g_new0(ObSessionState, 1); - if (!parse_attr_string("id", node, &state->id)) - if (!parse_attr_string("command", node, &state->command)) + if (!obt_parse_attr_string(node, "id", &state->id)) + if (!obt_parse_attr_string(node, "command", &state->command)) goto session_load_bail; - if (!(n = parse_find_node("name", node->children))) + if (!(n = obt_parse_find_node(node->children, "name"))) goto session_load_bail; - state->name = parse_string(doc, n); - if (!(n = parse_find_node("class", node->children))) + state->name = obt_parse_node_string(n); + if (!(n = obt_parse_find_node(node->children, "class"))) goto session_load_bail; - state->class = parse_string(doc, n); - if (!(n = parse_find_node("role", node->children))) + state->class = obt_parse_node_string(n); + if (!(n = obt_parse_find_node(node->children, "role"))) goto session_load_bail; - state->role = parse_string(doc, n); - if (!(n = parse_find_node("windowtype", node->children))) + state->role = obt_parse_node_string(n); + if (!(n = obt_parse_find_node(node->children, "windowtype"))) goto session_load_bail; - state->type = parse_int(doc, n); - if (!(n = parse_find_node("desktop", node->children))) + state->type = obt_parse_node_int(n); + if (!(n = obt_parse_find_node(node->children, "desktop"))) goto session_load_bail; - state->desktop = parse_int(doc, n); - if (!(n = parse_find_node("x", node->children))) + state->desktop = obt_parse_node_int(n); + if (!(n = obt_parse_find_node(node->children, "x"))) goto session_load_bail; - state->x = parse_int(doc, n); - if (!(n = parse_find_node("y", node->children))) + state->x = obt_parse_node_int(n); + if (!(n = obt_parse_find_node(node->children, "y"))) goto session_load_bail; - state->y = parse_int(doc, n); - if (!(n = parse_find_node("width", node->children))) + state->y = obt_parse_node_int(n); + if (!(n = obt_parse_find_node(node->children, "width"))) goto session_load_bail; - state->w = parse_int(doc, n); - if (!(n = parse_find_node("height", node->children))) + state->w = obt_parse_node_int(n); + if (!(n = obt_parse_find_node(node->children, "height"))) goto session_load_bail; - state->h = parse_int(doc, n); + state->h = obt_parse_node_int(n); state->shaded = - parse_find_node("shaded", node->children) != NULL; + obt_parse_find_node(node->children, "shaded") != NULL; state->iconic = - parse_find_node("iconic", node->children) != NULL; + obt_parse_find_node(node->children, "iconic") != NULL; state->skip_pager = - parse_find_node("skip_pager", node->children) != NULL; + obt_parse_find_node(node->children, "skip_pager") != NULL; state->skip_taskbar = - parse_find_node("skip_taskbar", node->children) != NULL; + obt_parse_find_node(node->children, "skip_taskbar") != NULL; state->fullscreen = - parse_find_node("fullscreen", node->children) != NULL; + obt_parse_find_node(node->children, "fullscreen") != NULL; state->above = - parse_find_node("above", node->children) != NULL; + obt_parse_find_node(node->children, "above") != NULL; state->below = - parse_find_node("below", node->children) != NULL; + obt_parse_find_node(node->children, "below") != NULL; state->max_horz = - parse_find_node("max_horz", node->children) != NULL; + obt_parse_find_node(node->children, "max_horz") != NULL; state->max_vert = - parse_find_node("max_vert", node->children) != NULL; + obt_parse_find_node(node->children, "max_vert") != NULL; state->undecorated = - parse_find_node("undecorated", node->children) != NULL; + obt_parse_find_node(node->children, "undecorated") != NULL; state->focused = - parse_find_node("focused", node->children) != NULL; + obt_parse_find_node(node->children, "focused") != NULL; /* save this. they are in the file in stacking order, so preserve that order here */ session_saved_state = g_list_append(session_saved_state, state); + ob_debug_type(OB_DEBUG_SM, "loaded %s", state->name); continue; session_load_bail: + ob_debug_type(OB_DEBUG_SM, "loading FAILED"); session_state_free(state); } @@ -816,6 +829,7 @@ static void session_load_file(const gchar *path) !strcmp(s1->class, s2->class) && !strcmp(s1->role, s2->role)) { + ob_debug_type(OB_DEBUG_SM, "removing duplicate %s", s2->name); session_state_free(s2); session_saved_state = g_list_delete_link(session_saved_state, jt); @@ -824,12 +838,13 @@ static void session_load_file(const gchar *path) } if (founddup) { + ob_debug_type(OB_DEBUG_SM, "removing duplicate %s", s1->name); session_state_free(s1); session_saved_state = g_list_delete_link(session_saved_state, it); } } - xmlFreeDoc(doc); + obt_parse_instance_unref(i); } void session_request_logout(gboolean silent)