all repos — openbox @ 373a4584d603a4dc14c64d5f27653c83a1fe686b

openbox fork - make it a bit more like ryudo

make session management optional
Dana Jansens danakj@orodu.net
commit

373a4584d603a4dc14c64d5f27653c83a1fe686b

parent

9befe65a657c2f36f4ba6a2b94a180c55abf8f26

5 files changed, 175 insertions(+), 83 deletions(-)

jump to
M configure.acconfigure.ac

@@ -93,6 +93,9 @@ ]

) 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
M m4/x11.m4m4/x11.m4

@@ -13,8 +13,8 @@ OLDLIBS=$LIBS

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_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 @@ OLDLIBS=$LIBS

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 @@ OLDLIBS=$LIBS

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 @@ OLDLIBS=$LIBS

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 @@ OLDLIBS=$LIBS

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 @@ OLDLIBS=$LIBS

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 @@ else

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 +])
M openbox/Makefile.amopenbox/Makefile.am

@@ -5,8 +5,9 @@

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 @@ -DG_LOG_DOMAIN=\"Openbox\" \

-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)
M openbox/event.copenbox/event.c

@@ -32,7 +32,9 @@ #ifdef HAVE_SIGNAL_H

# include <signal.h> #endif +#ifdef USE_SM #include <X11/ICE/ICElib.h> +#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 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 @@ ice_fd = -1;

} find_max_fd(); } +#endif void event_startup() {

@@ -120,8 +129,10 @@ FD_ZERO(&allset);

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 @@ /* handle the X events as soon as possible? */

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 @@ {

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)
M openbox/openbox.copenbox/openbox.c

@@ -42,13 +42,17 @@ # include <sys/stat.h>

# include <sys/types.h> #endif +#ifdef USE_SM #include <X11/SM/SMlib.h> -#include <X11/cursorfont.h> +#endif -#define SM_ERR_LEN 1024 +#include <X11/cursorfont.h> +#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 @@ sigset_t sigset;

char *path; xmlDocPtr doc; xmlNodePtr node; - SmcCallbacks cb; - char sm_err[SM_ERR_LEN]; ob_state = State_Starting;

@@ -128,67 +136,7 @@ exit_with_error("Failed to open the display.");

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 @@

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 @@

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 @@

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); }