all repos — openbox @ 755ec08aa36cbd635a841fe8c374b9b751c20213

openbox fork - make it a bit more like ryudo

move session code out of openbox.c all into session.c
remove --sm-save-file and --sm-client-id from argv so that they dont get reused when doing a restart.
Dana Jansens danakj@orodu.net
commit

755ec08aa36cbd635a841fe8c374b9b751c20213

parent

bb44e8d047b662db15ef8d181cb925e1135d326d

4 files changed, 85 insertions(+), 77 deletions(-)

jump to
M openbox/openbox.copenbox/openbox.c

@@ -53,8 +53,6 @@ RrTheme *ob_rr_theme;

ObMainLoop *ob_main_loop; Display *ob_display; gint ob_screen; -gboolean ob_sm_use = TRUE; -gchar *ob_sm_id; gboolean ob_replace_wm; static ObState state;

@@ -64,7 +62,6 @@ static gboolean restart;

static char *restart_path; static Cursor cursors[OB_NUM_CURSORS]; static KeyCode keys[OB_NUM_KEYS]; -static gchar *sm_save_file; static void signal_handler(int signal, gpointer data); static void parse_args(int argc, char **argv);

@@ -123,9 +120,7 @@ ob_main_loop_signal_add(ob_main_loop, SIGINT, signal_handler, NULL, NULL);

ob_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler, NULL, NULL); ob_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL, NULL); - if (sm_save_file) - session_load(sm_save_file); - session_startup(argc, argv); + session_startup(&argc, &argv); ob_screen = DefaultScreen(ob_display);

@@ -283,7 +278,6 @@ RrThemeFree(ob_rr_theme);

RrInstanceFree(ob_rr_inst); session_shutdown(); - g_free(ob_sm_id); XCloseDisplay(ob_display);

@@ -305,6 +299,7 @@ }

/* re-run me */ execvp(argv[0], argv); /* try how we were run */ + execlp(argv[0], g_path_get_basename(argv[0])); /* last resort */ } return 0;

@@ -372,20 +367,6 @@ } else if (!strcmp(argv[i], "--sync")) {

xsync = TRUE; } else if (!strcmp(argv[i], "--debug")) { ob_debug_show_output(TRUE); -#ifdef USE_SM - } else if (!strcmp(argv[i], "--sm-client-id")) { - if (i == argc - 1) /* no args left */ - g_printerr(_("--sm-client-id requires an argument\n")); - else - ob_sm_id = g_strdup(argv[++i]); - } else if (!strcmp(argv[i], "--sm-save-file")) { - if (i == argc - 1) /* no args left */ - g_printerr(_("--sm-save-file requires an argument\n")); - else - sm_save_file = argv[++i]; - } else if (!strcmp(argv[i], "--sm-disable")) { - ob_sm_use = FALSE; -#endif } else { g_printerr("Invalid option: '%s'\n\n", argv[i]); print_help();
M openbox/session.copenbox/session.c

@@ -7,8 +7,7 @@ #include "client.h"

GList *session_saved_state; -void session_load(char *path) {} -void session_startup(int argc, char **argv) {} +void session_startup(int *argc, char ***argv) {} void session_shutdown() {} GList* session_state_find(ObClient *c) { return NULL; } gboolean session_state_cmp(ObSessionState *s, ObClient *c) { return FALSE; }

@@ -21,6 +20,7 @@ #include "openbox.h"

#include "session.h" #include "client.h" #include "prop.h" +#include "gettext.h" #include "parser/parse.h" #include <time.h>

@@ -36,11 +36,14 @@ #include <X11/SM/SMlib.h>

GList *session_saved_state; +static gboolean sm_disable; static SmcConn sm_conn; static gchar *save_file; +static gchar *sm_id; static gint sm_argc; static gchar **sm_argv; +static void session_load(char *path); static gboolean session_save(); static void sm_save_yourself(SmcConn conn, SmPointer data, int save_type,

@@ -54,54 +57,32 @@ {

SmProp *props[2]; SmProp prop_cmd = { SmCloneCommand, SmLISTofARRAY8, 1, }; SmProp prop_res = { SmRestartCommand, SmLISTofARRAY8, }; - gint i, j, n; - gboolean has_id = FALSE, has_file = FALSE; - - for (i = 1; !has_id && !has_file && i < sm_argc - 1; ++i) { - if (!has_id && strcmp(sm_argv[i], "--sm-client-id") == 0) - has_id = TRUE; - if (!has_file && strcmp(sm_argv[i], "--sm-save-file") == 0) - has_file = TRUE; - } + gint i; - n = (has_file ? sm_argc-2 : sm_argc); - n = (has_id ? n-2 : n); - prop_cmd.vals = g_new(SmPropValue, n); - prop_cmd.num_vals = n; - for (i = 0, j = 0; i < sm_argc; ++i, ++j) { - if (strcmp (sm_argv[i], "--sm-client-id") == 0 || - strcmp (sm_argv[i], "--sm-save-file") == 0) { - ++i, --j; /* skip the next as well, keep j where it is */ - } else { - prop_cmd.vals[j].value = sm_argv[i]; - prop_cmd.vals[j].length = strlen(sm_argv[i]); - } + prop_cmd.vals = g_new(SmPropValue, sm_argc); + prop_cmd.num_vals = sm_argc; + for (i = 0; i < sm_argc; ++i) { + prop_cmd.vals[i].value = sm_argv[i]; + prop_cmd.vals[i].length = strlen(sm_argv[i]); } - n = (has_file ? sm_argc : sm_argc+2); - n = (has_id ? n-2 : n); - prop_res.vals = g_new(SmPropValue, n); - prop_res.num_vals = n; - for (i = 0, j = 0; i < sm_argc; ++i, ++j) { - if (strcmp (sm_argv[i], "--sm-client-id") == 0 || - strcmp (sm_argv[i], "--sm-save-file") == 0) { - ++i, --j; /* skip the next as well, keep j where it is */ - } else { - prop_res.vals[j].value = sm_argv[i]; - prop_res.vals[j].length = strlen(sm_argv[i]); - } + prop_res.vals = g_new(SmPropValue, sm_argc + 2); + prop_res.num_vals = sm_argc + 2; + for (i = 0; i < sm_argc; ++i) { + prop_res.vals[i].value = sm_argv[i]; + prop_res.vals[i].length = strlen(sm_argv[i]); } if (save_file) { - prop_res.vals[j].value = "--sm-save-file"; - prop_res.vals[j++].length = strlen("--sm-save-file"); - prop_res.vals[j].value = save_file; - prop_res.vals[j++].length = strlen(save_file); + prop_res.vals[i].value = "--sm-save-file"; + prop_res.vals[i++].length = strlen("--sm-save-file"); + prop_res.vals[i].value = save_file; + prop_res.vals[i++].length = strlen(save_file); } else { - prop_res.vals[j].value = "--sm-client-id"; - prop_res.vals[j++].length = strlen("--sm-client-id"); - prop_res.vals[j].value = ob_sm_id; - prop_res.vals[j++].length = strlen(ob_sm_id); + prop_res.vals[i].value = "--sm-client-id"; + prop_res.vals[i++].length = strlen("--sm-client-id"); + prop_res.vals[i].value = sm_id; + prop_res.vals[i++].length = strlen(sm_id); } props[0] = &prop_res;

@@ -112,15 +93,59 @@ g_free(prop_res.vals);

g_free(prop_cmd.vals); } -void session_startup(int argc, char **argv) +static void remove_two_args(int *argc, char ***argv, int index) +{ + int i; + + for (i = index; i < index + 2; ++i) + (*argv)[i] = (*argv)[i+2]; + *argc -= 2; +} + +static void parse_args(int *argc, char ***argv) +{ + int i; + + for (i = 1; i < *argc; ++i) { + if (!strcmp((*argv)[i], "--sm-client-id")) { + if (i == *argc - 1) /* no args left */ + g_printerr(_("--sm-client-id requires an argument\n")); + else { + sm_id = g_strdup((*argv)[i+1]); + remove_two_args(argc, argv, i); + ++i; + } + } else if (!strcmp((*argv)[i], "--sm-save-file")) { + if (i == *argc - 1) /* no args left */ + g_printerr(_("--sm-save-file requires an argument\n")); + else { + save_file = g_strdup((*argv)[i+1]); + remove_two_args(argc, argv, i); + ++i; + } + } else if (!strcmp((*argv)[i], "--sm-disable")) { + sm_disable = TRUE; + } + } +} + +void session_startup(int *argc, char ***argv) { #define SM_ERR_LEN 1024 SmcCallbacks cb; char sm_err[SM_ERR_LEN]; - sm_argc = argc; - sm_argv = argv; + parse_args(argc, argv); + + if (sm_disable) + return; + + if (save_file) + session_load(save_file); + + sm_argc = *argc; + sm_argv = *argv; cb.save_yourself.callback = sm_save_yourself; cb.save_yourself.client_data = NULL;

@@ -139,7 +164,7 @@ SmcSaveYourselfProcMask |

SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, - &cb, ob_sm_id, &ob_sm_id, + &cb, sm_id, &sm_id, SM_ERR_LEN, sm_err); if (sm_conn == NULL) g_warning("Failed to connect to session manager: %s", sm_err);

@@ -158,8 +183,8 @@ SmProp *props[6];

gchar hint, pri; gchar pid[32]; - val_prog.value = argv[0]; - val_prog.length = strlen(argv[0]); + val_prog.value = sm_argv[0]; + val_prog.length = strlen(sm_argv[0]); val_uid.value = g_strdup(g_get_user_name()); val_uid.length = strlen(val_uid.value);

@@ -200,6 +225,7 @@

void session_shutdown() { g_free(save_file); + g_free(sm_id); if (sm_conn) { SmPropValue val_hint;

@@ -285,7 +311,7 @@ } else {

guint stack_pos = 0; fprintf(f, "<?xml version=\"1.0\"?>\n\n"); - fprintf(f, "<openbox_session id=\"%s\">\n\n", ob_sm_id); + fprintf(f, "<openbox_session id=\"%s\">\n\n", sm_id); for (it = stacking_list; it; it = g_list_next(it)) { guint num;

@@ -429,18 +455,19 @@ {

return s1->stacking - s2->stacking; } -void session_load(char *path) +static void session_load(char *path) { xmlDocPtr doc; xmlNodePtr node, n; - gchar *sm_id; + gchar *id; if (!parse_load(path, "openbox_session", &doc, &node)) return; - if (!parse_attr_string("id", node, &sm_id)) + if (!parse_attr_string("id", node, &id)) return; - ob_sm_id = g_strdup(sm_id); + g_free(sm_id); + sm_id = id; node = parse_find_node("window", node->xmlChildrenNode); while (node) {
M openbox/session.hopenbox/session.h

@@ -20,8 +20,7 @@ };

extern GList *session_saved_state; -void session_load(char *path); -void session_startup(int argc, char **argv); +void session_startup(int *argc, char ***argv); void session_shutdown(); GList* session_state_find(struct _ObClient *c);
M po/POTFILES.inpo/POTFILES.in

@@ -2,3 +2,4 @@ # List of source files containing translatable strings.

openbox/client_list_menu.c openbox/client_menu.c openbox/openbox.c +openbox/session.c