]> Dogcows Code - chaz/openbox/commitdiff
add libSM *client* support, so we should work with gnome-session now!
authorDana Jansens <danakj@orodu.net>
Sat, 21 Jun 2003 05:31:54 +0000 (05:31 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 21 Jun 2003 05:31:54 +0000 (05:31 +0000)
openbox/event.c
openbox/openbox.c

index c54c2952c62ae88359fc4bbe4273251b03f32c49..32bfe29f310094b5db0652d44f8222cac3938412 100644 (file)
 #ifdef HAVE_SYS_SELECT_H
 #  include <sys/select.h>
 #endif
+#ifdef HAVE_SIGNAL_H
+#  include <signal.h>
+#endif
+
+#include <X11/ICE/ICElib.h>
 
 static void event_process(XEvent *e);
 static void event_handle_root(XEvent *e);
@@ -35,6 +40,10 @@ static void event_handle_dock(Dock *s, XEvent *e);
 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();
+static void ice_watch(IceConn conn, IcePointer data, Bool opening,
+                      IcePointer *watch_data);
+static void find_max_fd();
 
 #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
                             (e)->xfocus.detail == NotifyAncestor || \
@@ -60,10 +69,25 @@ static const int mask_table[] = {
 static int mask_table_size;
 
 static fd_set selset, allset;
-static int max_fd, x_fd;
+static IceConn ice_conn;
+static int max_fd, x_fd, ice_fd;
 static GData *fd_handler_list;
 
-void fd_event_handle();
+
+static void ice_watch(IceConn conn, IcePointer data, Bool opening,
+                      IcePointer *watch_data)
+{
+    if (opening) {
+        g_assert (ice_fd < 0);
+        ice_conn = conn;
+        ice_fd = IceConnectionNumber(conn);
+        FD_SET(ice_fd, &allset);
+    } else {
+        FD_CLR(ice_fd, &allset);
+        ice_fd = -1;
+    }
+    find_max_fd();
+}
 
 void event_startup()
 {
@@ -95,6 +119,10 @@ void event_startup()
     FD_ZERO(&allset);
     max_fd = x_fd = ConnectionNumber(ob_display);
     FD_SET(x_fd, &allset);
+
+    ice_fd = -1;
+    IceAddConnectionWatch(ice_watch, NULL);
+
     g_datalist_init(&fd_handler_list);
 }
 
@@ -151,6 +179,11 @@ void event_loop()
         if (FD_ISSET(x_fd, &selset))
             return;
 
+        if (ice_fd >= 0 && FD_ISSET(ice_fd, &selset)) {
+            Bool b;
+            IceProcessMessages(ice_conn, NULL, &b);
+        }
+
         fd_event_handle();
     }
 }
@@ -993,21 +1026,27 @@ void event_add_fd_handler(event_fd_handler *h) {
   max_fd = MAX(max_fd, h->fd);
 }
 
-void find_max_fd_foreach(GQuark n, gpointer data, gpointer max)
+static void find_max_fd_foreach(GQuark n, gpointer data, gpointer max)
 {
   *((unsigned int *)max) = MAX(*((unsigned int *)max), n);
 }
 
+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);
+  max_fd = MAX(ice_fd, tmpmax);
+}
+
 void event_remove_fd(int n)
 {
-  int tmpmax = 0;
   FD_CLR(n, &allset);
   g_datalist_id_remove_data(&fd_handler_list, (GQuark)n);
-  g_datalist_foreach(&fd_handler_list, find_max_fd_foreach, (gpointer)&tmpmax);
-  max_fd = MAX(x_fd, tmpmax);
+  find_max_fd();
 }
 
-void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data)
+static void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data)
 {
     if (FD_ISSET( (int)n, &selset)) {
         event_fd_handler *h = (event_fd_handler *)data;
@@ -1016,7 +1055,7 @@ void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data)
     }
 }
 
-void fd_event_handle()
+static void fd_event_handle()
 {
     g_datalist_foreach(&fd_handler_list, fd_event_handle_foreach, NULL);
 }
index 1397d324a3d37ae3990a1ed9e2ba973f947840cd..a5fb7b5f3ba8e72dc14f58c01ae9117b49e14b9e 100644 (file)
 #  include <sys/types.h>
 #endif
 
+#include <X11/SM/SMlib.h>
 #include <X11/cursorfont.h>
 
+#define SM_ERR_LEN 1024
+
+SmcConn     ob_sm_conn;
 RrInstance *ob_rr_inst = NULL;
 RrTheme    *ob_rr_theme = NULL;
 Display    *ob_display = NULL;
@@ -58,8 +62,14 @@ gboolean    ob_sync     = FALSE;
 Cursors     ob_cursors;
 char       *ob_rc_path  = NULL;
 
-void signal_handler(const ObEvent *e, void *data);
-void parse_args(int argc, char **argv);
+static void signal_handler(const ObEvent *e, void *data);
+static void parse_args(int argc, char **argv);
+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);
+static void exit_with_error(gchar *msg);
 
 int main(int argc, char **argv)
 {
@@ -68,6 +78,9 @@ int main(int argc, char **argv)
     char *path;
     xmlDocPtr doc;
     xmlNodePtr node;
+    SmcCallbacks cb;
+    char sm_err[SM_ERR_LEN];
+    char *sm_id;
 
     ob_state = State_Starting;
 
@@ -110,16 +123,34 @@ int main(int argc, char **argv)
     parse_args(argc, argv);
 
     ob_display = XOpenDisplay(NULL);
-    if (ob_display == NULL) {
-       /* print a message and exit */
-       g_critical("Failed to open the display.");
-       exit(1);
-    }
-    if (fcntl(ConnectionNumber(ob_display), F_SETFD, 1) == -1) {
-       /* print a message and exit */
-       g_critical("Failed to set display as close-on-exec.");
-       exit(1);
-    }
+    if (ob_display == NULL)
+       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, NULL, &sm_id, SM_ERR_LEN, sm_err);
+    if (ob_sm_conn == NULL)
+        g_warning("Failed to connect to session manager: %s", sm_err);
+    else
+        g_message("Connected to session manager with id %s", sm_id);
+    g_free (sm_id);
 
 #ifdef USE_LIBSN
     ob_sn_display = sn_display_new(ob_display, NULL, NULL);
@@ -129,10 +160,8 @@ int main(int argc, char **argv)
     ob_root = RootWindow(ob_display, ob_screen);
 
     ob_rr_inst = RrInstanceNew(ob_display, ob_screen);
-    if (ob_rr_inst == NULL) {
-        g_critical("Failed to initialize the render library.");
-        exit(1);
-    }
+    if (ob_rr_inst == NULL)
+        exit_with_error("Failed to initialize the render library.");
 
     /* XXX fork self onto other screens */
      
@@ -192,10 +221,8 @@ int main(int argc, char **argv)
 
         /* load the theme specified in the rc file */
         ob_rr_theme = RrThemeNew(ob_rr_inst, config_theme);
-        if (ob_rr_theme == NULL) {
-            g_critical("Unable to load a theme.");
-            exit(1);
-        }
+        if (ob_rr_theme == NULL)
+            exit_with_error("Unable to load a theme.");
 
         window_startup();
         menu_startup();
@@ -241,6 +268,9 @@ int main(int argc, char **argv)
 
     RrThemeFree(ob_rr_theme);
     RrInstanceFree(ob_rr_inst);
+
+    if (ob_sm_conn)
+        SmcCloseConnection(ob_sm_conn, 0, NULL);
     XCloseDisplay(ob_display);
 
     if (ob_restart) {
@@ -267,7 +297,7 @@ int main(int argc, char **argv)
     return 0;
 }
 
-void signal_handler(const ObEvent *e, void *data)
+static void signal_handler(const ObEvent *e, void *data)
 {
     int s;
 
@@ -293,7 +323,7 @@ void signal_handler(const ObEvent *e, void *data)
     }
 }
 
-void print_version()
+static void print_version()
 {
     g_print("Openbox %s\n\n", PACKAGE_VERSION);
     g_print("This program comes with ABSOLUTELY NO WARRANTY.\n");
@@ -301,7 +331,7 @@ void print_version()
     g_print("under certain conditions. See the file COPYING for details.\n\n");
 }
 
-void print_help()
+static void print_help()
 {
     print_version();
     g_print("Syntax: %s [options]\n\n", BINARY);
@@ -314,7 +344,7 @@ void print_help()
     g_print("\nPlease report bugs at %s\n", PACKAGE_BUGREPORT);
 }
 
-void parse_args(int argc, char **argv)
+static void parse_args(int argc, char **argv)
 {
     int i;
 
@@ -348,3 +378,34 @@ gboolean ob_pointer_pos(int *x, int *y)
 
     return !!XQueryPointer(ob_display, ob_root, &w, &w, x, y, &i, &i, &u);
 }
+
+static void sm_save_yourself(SmcConn conn, SmPointer data, int save_type,
+                             Bool shutdown, int interact_style, Bool fast)
+{
+    g_message("got SAVE YOURSELF from session manager");
+    SmcSaveYourselfDone(conn, TRUE);
+}
+
+static void sm_die(SmcConn conn, SmPointer data)
+{
+    ob_shutdown = TRUE;
+    g_message("got DIE from session manager");
+}
+
+static void sm_save_complete(SmcConn conn, SmPointer data)
+{
+    g_message("got SAVE COMPLETE from session manager");
+}
+
+static void sm_shutdown_cancelled(SmcConn conn, SmPointer data)
+{
+    g_message("got SHUTDOWN CANCELLED from session manager");
+}
+
+static void exit_with_error(gchar *msg)
+{
+    g_critical(msg);
+    if (ob_sm_conn)
+        SmcCloseConnection(ob_sm_conn, 1, &msg);
+    exit(EXIT_FAILURE);
+}
This page took 0.038178 seconds and 4 git commands to generate.