From 373a4584d603a4dc14c64d5f27653c83a1fe686b Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 21 Jun 2003 08:45:25 +0000 Subject: [PATCH] make session management optional --- configure.ac | 3 + m4/x11.m4 | 61 +++++++++++++--- openbox/Makefile.am | 11 +-- openbox/event.c | 17 ++++- openbox/openbox.c | 166 ++++++++++++++++++++++++++------------------ 5 files changed, 175 insertions(+), 83 deletions(-) diff --git a/configure.ac b/configure.ac index 5eed9129..e7bc7370 100644 --- a/configure.ac +++ b/configure.ac @@ -93,6 +93,9 @@ PKG_CHECK_MODULES(GTK, [gtk+-2.0], ) AM_CONDITIONAL(OBCONF, [test "$use_gtk" = "yes" && test "$use_glade" = "yes"]) +# Check for session management +X11_SM + # Check for X11 extensions X11_EXT_XKB X11_EXT_XRANDR diff --git a/m4/x11.m4 b/m4/x11.m4 index 65e2ab7f..494014f2 100644 --- a/m4/x11.m4 +++ b/m4/x11.m4 @@ -13,8 +13,8 @@ AC_DEFUN([X11_DEVEL], OLDCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" - X_LIBS="$X_LIBS -lX11" - LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS" + X_LIBS="$X_PRE_LIBS $X_LIBS -lX11" + LIBS="$LIBS $X_LIBS" # Check for required functions in -lX11 AC_CHECK_LIB( @@ -23,7 +23,7 @@ AC_DEFUN([X11_DEVEL], AC_MSG_ERROR([Could not find XOpenDisplay in -lX11.]) ) - # Restore the old values. Use X_CFLAGS and X_PRE_LIBS X_LIBS X_EXTRA_LIBS in + # Restore the old values. Use X_CFLAGS and X_LIBS in # the Makefiles LIBS=$OLDLIBS CPPFLAGS=$OLDCPPFLAGS @@ -192,7 +192,7 @@ AC_DEFUN([X11_EXT_XKB], OLDCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" - LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS" + LIBS="$LIBS $X_LIBS" AC_CHECK_LIB([X11], [XkbBell], AC_MSG_CHECKING([for X11/XKBlib.h]) @@ -248,7 +248,7 @@ AC_DEFUN([X11_EXT_XRANDR], OLDCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" - LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS -lXext -lXrender -lXrandr" + LIBS="$LIBS $X_LIBS -lXext -lXrender -lXrandr" AC_CHECK_LIB([Xrandr], [XRRSelectInput], AC_MSG_CHECKING([for X11/extensions/Xrandr.h]) @@ -305,7 +305,7 @@ AC_DEFUN([X11_EXT_SHAPE], OLDCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" - LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS" + LIBS="$LIBS $X_LIBS" AC_CHECK_LIB([Xext], [XShapeCombineShape], AC_MSG_CHECKING([for X11/extensions/shape.h]) @@ -360,7 +360,7 @@ AC_DEFUN([X11_EXT_XINERAMA], OLDCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" - LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS -lXext" + LIBS="$LIBS $X_LIBS -lXext" AC_CHECK_LIB([Xinerama], [XineramaQueryExtension], [ @@ -411,7 +411,7 @@ AC_DEFUN([X11_EXT_VIDMODE], OLDCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $X_CFLAGS" - LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS -lXext -lXxf86vm" + LIBS="$LIBS $X_LIBS -lXext -lXxf86vm" AC_CHECK_LIB([Xxf86vm], [XF86VidModeGetViewPort], AC_MSG_CHECKING([for X11/extensions/xf86vmode.h]) @@ -452,3 +452,48 @@ AC_DEFUN([X11_EXT_VIDMODE], AC_MSG_RESULT([no]) fi ]) + +# X11_SM() +# +# Check for the presence of SMlib for session management. +# Defines "USE_SM" if SMlib is present. +AC_DEFUN([X11_SM], +[ + AC_REQUIRE([X11_DEVEL]) + + AC_ARG_ENABLE([session-management], + [ --disable-session-management build without support for session managers], + [SM=$enableval], [SM="yes"]) + + if test "$SM" = "yes"; then + # Store these + OLDLIBS=$LIBS + OLDCPPFLAGS=$CPPFLAGS + + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + LIBS="$LIBS $X_LIBS" + + SM="no" + + AC_CHECK_LIB([SM], [SmcSaveYourselfDone], [ + AC_CHECK_HEADERS([X11/SM/SMlib.h], [ + SM_CFLAGS="$X_CFLAGS" + SM_LIBS="-lSM -lICE" + AC_DEFINE(USE_SM) + AC_SUBST(SM_CFLAGS) + AC_SUBST(SM_LIBS) + SM="yes" + ]) + ]) + fi + + LIBS=$OLDLIBS + CPPFLAGS=$OLDCPPFLAGS + + AC_MSG_CHECKING([for session management support]) + if test "$SM" = "yes"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi +]) diff --git a/openbox/Makefile.am b/openbox/Makefile.am index fc9f4ae3..0b1fec9a 100644 --- a/openbox/Makefile.am +++ b/openbox/Makefile.am @@ -5,8 +5,9 @@ plugindir=$(libdir)/openbox/plugins binary=openbox3 url=http://openbox.org/ -CPPFLAGS=$(X_CFLAGS) $(XFT_CFLAGS) $(GLIB_CFLAGS) $(GMODULE_CFLAGS) \ - $(LIBSN_CFLAGS) $(GL_CFLAGS) $(XML_CFLAGS) @CPPFLAGS@ \ +CPPFLAGS=$(X_CFLAGS) $(SM_CFLAGS) $(XFT_CFLAGS) $(GLIB_CFLAGS) \ + $(GMODULE_CFLAGS) $(LIBSN_CFLAGS) $(GL_CFLAGS) $(XML_CFLAGS) \ + @CPPFLAGS@ \ -DLOCALEDIR=\"$(localedir)\" \ -DPLUGINDIR=\"$(plugindir)\" \ -DRCDIR=\"$(rcdir)\" \ @@ -14,9 +15,9 @@ CPPFLAGS=$(X_CFLAGS) $(XFT_CFLAGS) $(GLIB_CFLAGS) $(GMODULE_CFLAGS) \ -DBINARY=\"$(binary)\" INCLUDES=-I.. -LIBS=$(X_LIBS) $(XFT_LIBS) $(XINERAMA_LIBS) $(XKB_LIBS) $(XRANDR_LIBS) \ - $(VIDMODE_LIBS) $(XSHAPE_LIBS) $(GLIB_LIBS) $(GMODULE_LIBS) \ - $(LIBSN_LIBS) $(XML_LIBS) @LIBS@ @LIBINTL@ +LIBS=$(X_LIBS) $(SM_LIBS) $(XFT_LIBS) $(XINERAMA_LIBS) $(XKB_LIBS) \ + $(XRANDR_LIBS) $(VIDMODE_LIBS) $(XSHAPE_LIBS) $(GLIB_LIBS) \ + $(GMODULE_LIBS) $(LIBSN_LIBS) $(XML_LIBS) @LIBS@ @LIBINTL@ bin_PROGRAMS=$(binary) diff --git a/openbox/event.c b/openbox/event.c index 32bfe29f..adc393d0 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -32,7 +32,9 @@ # include #endif +#ifdef USE_SM #include +#endif static void event_process(XEvent *e); static void event_handle_root(XEvent *e); @@ -41,8 +43,10 @@ static void event_handle_dockapp(DockApp *app, XEvent *e); static void event_handle_client(Client *c, XEvent *e); static void event_handle_menu(Menu *menu, Client *c, XEvent *e); static void fd_event_handle(); +#ifdef USE_SM static void ice_watch(IceConn conn, IcePointer data, Bool opening, IcePointer *watch_data); +#endif static void find_max_fd(); #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \ @@ -69,11 +73,15 @@ static const int mask_table[] = { static int mask_table_size; static fd_set selset, allset; +#ifdef USE_SM static IceConn ice_conn; -static int max_fd, x_fd, ice_fd; +static int ice_fd; +#endif +static int max_fd, x_fd; static GData *fd_handler_list; +#ifdef USE_SM static void ice_watch(IceConn conn, IcePointer data, Bool opening, IcePointer *watch_data) { @@ -88,6 +96,7 @@ static void ice_watch(IceConn conn, IcePointer data, Bool opening, } find_max_fd(); } +#endif void event_startup() { @@ -120,8 +129,10 @@ void event_startup() max_fd = x_fd = ConnectionNumber(ob_display); FD_SET(x_fd, &allset); +#ifdef USE_SM ice_fd = -1; IceAddConnectionWatch(ice_watch, NULL); +#endif g_datalist_init(&fd_handler_list); } @@ -179,10 +190,12 @@ void event_loop() if (FD_ISSET(x_fd, &selset)) return; +#ifdef USE_SM if (ice_fd >= 0 && FD_ISSET(ice_fd, &selset)) { Bool b; IceProcessMessages(ice_conn, NULL, &b); } +#endif fd_event_handle(); } @@ -1036,7 +1049,9 @@ static void find_max_fd() int tmpmax = -1; g_datalist_foreach(&fd_handler_list, find_max_fd_foreach, (gpointer)&tmpmax); max_fd = MAX(x_fd, tmpmax); +#ifdef USE_SM max_fd = MAX(ice_fd, tmpmax); +#endif } void event_remove_fd(int n) diff --git a/openbox/openbox.c b/openbox/openbox.c index 35a530b7..0fd67409 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -42,13 +42,17 @@ # include #endif +#ifdef USE_SM #include -#include +#endif -#define SM_ERR_LEN 1024 +#include +#ifdef USE_SM SmcConn ob_sm_conn; gchar *ob_sm_id = NULL; +#endif + RrInstance *ob_rr_inst = NULL; RrTheme *ob_rr_theme = NULL; Display *ob_display = NULL; @@ -65,11 +69,17 @@ char *ob_rc_path = NULL; static void signal_handler(const ObEvent *e, void *data); static void parse_args(int argc, char **argv); + +static void sm_startup(int argc, char **argv); +static void sm_shutdown(); + +#ifdef USE_SM static void sm_save_yourself(SmcConn conn, SmPointer data, int save_type, Bool shutdown, int interact_style, Bool fast); static void sm_die(SmcConn conn, SmPointer data); static void sm_save_complete(SmcConn conn, SmPointer data); static void sm_shutdown_cancelled(SmcConn conn, SmPointer data); +#endif static void exit_with_error(gchar *msg); int main(int argc, char **argv) @@ -79,8 +89,6 @@ int main(int argc, char **argv) char *path; xmlDocPtr doc; xmlNodePtr node; - SmcCallbacks cb; - char sm_err[SM_ERR_LEN]; ob_state = State_Starting; @@ -128,67 +136,7 @@ int main(int argc, char **argv) if (fcntl(ConnectionNumber(ob_display), F_SETFD, 1) == -1) exit_with_error("Failed to set display as close-on-exec."); - cb.save_yourself.callback = sm_save_yourself; - cb.save_yourself.client_data = NULL; - - cb.die.callback = sm_die; - cb.die.client_data = NULL; - - cb.save_complete.callback = sm_save_complete; - cb.save_complete.client_data = NULL; - - cb.shutdown_cancelled.callback = sm_shutdown_cancelled; - cb.shutdown_cancelled.client_data = NULL; - - ob_sm_conn = SmcOpenConnection(NULL, NULL, 1, 0, - SmcSaveYourselfProcMask | - SmcDieProcMask | - SmcSaveCompleteProcMask | - SmcShutdownCancelledProcMask, - &cb, ob_sm_id, &ob_sm_id, - SM_ERR_LEN, sm_err); - if (ob_sm_conn == NULL) - g_warning("Failed to connect to session manager: %s", sm_err); - else { - SmPropValue val_cmd; - SmPropValue val_res; - SmPropValue val_prog; - SmPropValue val_uid; - SmProp prop_cmd = { SmCloneCommand, "SmLISTofARRAY8", 1, }; - SmProp prop_res = { SmRestartCommand, "SmLISTofARRAY8", 1, }; - SmProp prop_prog = { SmProgram, "SmARRAY8", 1, }; - SmProp prop_uid = { SmUserID, "SmARRAY8", 1, }; - SmProp *props[4]; - gchar *user; - - val_cmd.value = argv[0]; - val_cmd.length = strlen(argv[0]); - val_res.value = argv[0]; - val_res.length = strlen(argv[0]); /* XXX -id foo */ - val_prog.value = argv[0]; - val_prog.length = strlen(argv[0]); - - user = g_strdup_printf("%ld", (long)getuid()); - val_uid.value = user; - val_uid.length = strlen(user); - - prop_cmd.vals = &val_cmd; - prop_res.vals = &val_res; - prop_prog.vals = &val_prog; - prop_uid.vals = &val_uid; - - props[0] = &prop_cmd; - props[1] = &prop_res; - props[2] = &prop_prog; - props[3] = &prop_uid; - - SmcSetProperties(ob_sm_conn, 3, props); - - g_free(user); - - g_message("Connected to session manager with id %s", ob_sm_id); - } - g_free (ob_sm_id); + sm_startup(argc, argv); #ifdef USE_LIBSN ob_sn_display = sn_display_new(ob_display, NULL, NULL); @@ -307,8 +255,8 @@ int main(int argc, char **argv) RrThemeFree(ob_rr_theme); RrInstanceFree(ob_rr_inst); - if (ob_sm_conn) - SmcCloseConnection(ob_sm_conn, 0, NULL); + sm_shutdown(); + XCloseDisplay(ob_display); if (ob_restart) { @@ -335,6 +283,85 @@ int main(int argc, char **argv) return 0; } +static void sm_startup(int argc, char **argv) +{ +#ifdef USE_SM + +#define SM_ERR_LEN 1024 + + SmcCallbacks cb; + char sm_err[SM_ERR_LEN]; + + cb.save_yourself.callback = sm_save_yourself; + cb.save_yourself.client_data = NULL; + + cb.die.callback = sm_die; + cb.die.client_data = NULL; + + cb.save_complete.callback = sm_save_complete; + cb.save_complete.client_data = NULL; + + cb.shutdown_cancelled.callback = sm_shutdown_cancelled; + cb.shutdown_cancelled.client_data = NULL; + + ob_sm_conn = SmcOpenConnection(NULL, NULL, 1, 0, + SmcSaveYourselfProcMask | + SmcDieProcMask | + SmcSaveCompleteProcMask | + SmcShutdownCancelledProcMask, + &cb, ob_sm_id, &ob_sm_id, + SM_ERR_LEN, sm_err); + if (ob_sm_conn == NULL) + g_warning("Failed to connect to session manager: %s", sm_err); + else { + SmPropValue val_cmd; + SmPropValue val_res; + SmPropValue val_prog; + SmPropValue val_uid; + SmProp prop_cmd = { SmCloneCommand, "SmLISTofARRAY8", 1, }; + SmProp prop_res = { SmRestartCommand, "SmLISTofARRAY8", 1, }; + SmProp prop_prog = { SmProgram, "SmARRAY8", 1, }; + SmProp prop_uid = { SmUserID, "SmARRAY8", 1, }; + SmProp *props[4]; + + val_cmd.value = argv[0]; + val_cmd.length = strlen(argv[0]); + val_res.value = argv[0]; + val_res.length = strlen(argv[0]); /* XXX -id foo */ + val_prog.value = argv[0]; + val_prog.length = strlen(argv[0]); + + val_uid.value = g_strdup_printf("%ld", (long)getuid()); + val_uid.length = strlen(val_uid.value); + + prop_cmd.vals = &val_cmd; + prop_res.vals = &val_res; + prop_prog.vals = &val_prog; + prop_uid.vals = &val_uid; + + props[0] = &prop_cmd; + props[1] = &prop_res; + props[2] = &prop_prog; + props[3] = &prop_uid; + + SmcSetProperties(ob_sm_conn, 3, props); + + g_free(val_uid.value); + + g_message("Connected to session manager with id %s", ob_sm_id); + } + g_free (ob_sm_id); +#endif +} + +static void sm_shutdown() +{ +#ifdef USE_SM + if (ob_sm_conn) + SmcCloseConnection(ob_sm_conn, 0, NULL); +#endif +} + static void signal_handler(const ObEvent *e, void *data) { int s; @@ -417,6 +444,7 @@ gboolean ob_pointer_pos(int *x, int *y) return !!XQueryPointer(ob_display, ob_root, &w, &w, x, y, &i, &i, &u); } +#ifdef USE_SM static void sm_save_yourself(SmcConn conn, SmPointer data, int save_type, Bool shutdown, int interact_style, Bool fast) { @@ -439,11 +467,11 @@ static void sm_shutdown_cancelled(SmcConn conn, SmPointer data) { g_message("got SHUTDOWN CANCELLED from session manager"); } +#endif static void exit_with_error(gchar *msg) { g_critical(msg); - if (ob_sm_conn) - SmcCloseConnection(ob_sm_conn, 1, &msg); + sm_shutdown(); exit(EXIT_FAILURE); } -- 2.39.2