From 231d6cfb0c65a7ece2455e7fd0a488851a634778 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Thu, 21 Aug 2003 19:54:47 +0000 Subject: [PATCH] Create and initialize a client leader window so session management doesn't restart Emacs twice. --- src/ChangeLog | 16 ++++++++++++++++ src/Makefile.in | 3 ++- src/xfns.c | 13 +++++++++++++ src/xsmfns.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- src/xterm.c | 17 ++++++++++------- src/xterm.h | 6 +++++- 6 files changed, 90 insertions(+), 11 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 597fb252d88..ee01b86dfd1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,19 @@ +2003-08-21 Jan Dj,Ad(Brv + + * xterm.h (struct x_display_info): New fields: client_leader_window + and Xatom_wm_client_leader. + + * xterm.c (x_initialize): Move call to x_session_initialize to ... + (x_term_init): ... here. Initialize client_leader fields in dpyinfo. + + * xsmfns.c (create_client_leader_window): New function. + (x_session_initialize): Call create_client_leader_window, take + dpyinfo as argument. + + * xfns.c (Fx_create_frame): Set property WM_CLIENT_LEADER. + + * Makefile.in (xsmfns.o): Add more depenedencies. + 2003-08-21 Dave Love * m/iris4d.h: Use _MIPS_SZLONG, not _LP64. diff --git a/src/Makefile.in b/src/Makefile.in index ec244012b28..90605dd669d 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1153,7 +1153,8 @@ xterm.o: xterm.c xterm.h termhooks.h termopts.h termchar.h window.h buffer.h \ xselect.o: xselect.c process.h dispextern.h frame.h xterm.h blockinput.h \ buffer.h atimer.h systime.h $(config_h) xrdb.o: xrdb.c $(config_h) epaths.h -xsmfns.o: xsmfns.c $(config_h) systime.h sysselect.h termhooks.h +xsmfns.o: xsmfns.c $(config_h) systime.h sysselect.h termhooks.h xterm.h \ + lisp.h termopts.h gtkutil.o: gtkutil.c gtkutil.h xterm.h lisp.h frame.h $(config_h) \ blockinput.h window.h atimer.h termhooks.h diff --git a/src/xfns.c b/src/xfns.c index af7ed7473e8..439ddbfec2f 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -3526,6 +3526,19 @@ This function is an internal primitive--use `make-frame' instead. */) ; } + /* Set the WM leader property. GTK does this itself, so this is not + needed when using GTK. */ + if (dpyinfo->client_leader_window != 0) + { + BLOCK_INPUT; + XChangeProperty (FRAME_X_DISPLAY (f), + FRAME_OUTER_WINDOW (f), + dpyinfo->Xatom_wm_client_leader, + XA_WINDOW, 32, PropModeReplace, + (char *) &dpyinfo->client_leader_window, 1); + UNBLOCK_INPUT; + } + UNGCPRO; /* Make sure windows on this frame appear in calls to next-window diff --git a/src/xsmfns.c b/src/xsmfns.c index 5e712fa1b38..b4a612f1544 100644 --- a/src/xsmfns.c +++ b/src/xsmfns.c @@ -24,6 +24,9 @@ Boston, MA 02111-1307, USA. */ #ifdef HAVE_X_SM #include +#include +#include + #ifdef HAVE_STRING_H #include #else @@ -47,6 +50,7 @@ Boston, MA 02111-1307, USA. */ #include "lisp.h" #include "termhooks.h" #include "termopts.h" +#include "xterm.h" #ifndef MAXPATHLEN #define MAXPATHLEN 1024 @@ -403,9 +407,37 @@ ice_conn_watch_CB (iceConn, clientData, opening, watchData) #endif /* ! defined (SIGIO) */ } +/* Create the client leader window. */ +static void +create_client_leader_window (dpyinfo, client_id) + struct x_display_info *dpyinfo; + char *client_id; +{ + Window w; + XClassHint class_hints; + Atom sm_id; + + w = XCreateSimpleWindow (dpyinfo->display, + dpyinfo->root_window, + -1, -1, 1, 1, + CopyFromParent, CopyFromParent, CopyFromParent); + + class_hints.res_name = (char *) SDATA (Vx_resource_name); + class_hints.res_class = (char *) SDATA (Vx_resource_class); + XSetClassHint (dpyinfo->display, w, &class_hints); + XStoreName (dpyinfo->display, w, class_hints.res_name); + + sm_id = XInternAtom (dpyinfo->display, "SM_CLIENT_ID", False); + XChangeProperty (dpyinfo->display, w, sm_id, XA_STRING, 8, PropModeReplace, + client_id, strlen (client_id)); + + dpyinfo->client_leader_window = w; +} + /* Try to open a connection to the session manager. */ void -x_session_initialize () +x_session_initialize (dpyinfo) + struct x_display_info *dpyinfo; { #define SM_ERRORSTRING_LEN 512 char errorstring[SM_ERRORSTRING_LEN]; @@ -466,7 +498,17 @@ x_session_initialize () errorstring); if (smc_conn != 0) - Vx_session_id = make_string (client_id, strlen (client_id)); + { + Vx_session_id = make_string (client_id, strlen (client_id)); + +#ifdef USE_GTK + /* GTK creats a leader window by itself, but we need to tell + it about our client_id. */ + gdk_set_sm_client_id (client_id); +#else + create_client_leader_window (dpyinfo, client_id); +#endif + } } diff --git a/src/xterm.c b/src/xterm.c index 18f225182c8..60bd3cc375c 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -10136,7 +10136,7 @@ x_term_init (display_name, xrm_option, resource_name) if (!x_initialized) { x_initialize (); - x_initialized = 1; + ++x_initialized; } #ifdef USE_GTK @@ -10152,8 +10152,6 @@ x_term_init (display_name, xrm_option, resource_name) if (x_initialized > 1) return 0; - x_initialized++; - for (argc = 0; argc < NUM_ARGV; ++argc) argv[argc] = 0; @@ -10343,6 +10341,7 @@ x_term_init (display_name, xrm_option, resource_name) dpyinfo->height = HeightOfScreen (dpyinfo->screen); dpyinfo->width = WidthOfScreen (dpyinfo->screen); dpyinfo->root_window = RootWindowOfScreen (dpyinfo->screen); + dpyinfo->client_leader_window = 0; dpyinfo->grabbed = 0; dpyinfo->reference_count = 0; dpyinfo->icon_bitmap_id = -1; @@ -10412,6 +10411,8 @@ x_term_init (display_name, xrm_option, resource_name) = XInternAtom (dpyinfo->display, "WM_CONFIGURE_DENIED", False); dpyinfo->Xatom_wm_window_moved = XInternAtom (dpyinfo->display, "WM_MOVED", False); + dpyinfo->Xatom_wm_client_leader + = XInternAtom (dpyinfo->display, "WM_CLIENT_LEADER", False); dpyinfo->Xatom_editres = XInternAtom (dpyinfo->display, "Editres", False); dpyinfo->Xatom_CLIPBOARD @@ -10566,6 +10567,12 @@ x_term_init (display_name, xrm_option, resource_name) #endif } +#ifdef HAVE_X_SM + /* Only do this for the first display. */ + if (x_initialized == 1) + x_session_initialize (dpyinfo); +#endif + UNBLOCK_INPUT; return dpyinfo; @@ -10779,10 +10786,6 @@ x_initialize () #endif /* SIGWINCH */ signal (SIGPIPE, x_connection_signal); - -#ifdef HAVE_X_SM - x_session_initialize (); -#endif } diff --git a/src/xterm.h b/src/xterm.h index fd1e79b9082..03c0dc32acc 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -183,6 +183,9 @@ struct x_display_info /* The root window of this screen. */ Window root_window; + /* Client leader window. */ + Window client_leader_window; + /* The cursor to use for vertical scroll bars. */ Cursor vertical_scroll_bar_cursor; @@ -289,6 +292,7 @@ struct x_display_info /* Other WM communication */ Atom Xatom_wm_configure_denied; /* When our config request is denied */ Atom Xatom_wm_window_moved; /* When the WM moves us. */ + Atom Xatom_wm_client_leader; /* Id of client leader window. */ /* EditRes protocol */ Atom Xatom_editres; @@ -1029,7 +1033,7 @@ extern void widget_store_internal_border P_ ((Widget)); /* Defined in xsmfns.c */ #ifdef HAVE_X_SM -extern void x_session_initialize P_ ((void)); +extern void x_session_initialize P_ ((struct x_display_info *dpyinfo)); extern int x_session_check_input P_ ((struct input_event *bufp, int *numchars)); extern int x_session_have_connection P_ ((void)); -- 2.39.2