summaryrefslogtreecommitdiff
path: root/src/xsmfns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xsmfns.c')
-rw-r--r--src/xsmfns.c69
1 files changed, 53 insertions, 16 deletions
diff --git a/src/xsmfns.c b/src/xsmfns.c
index 5e712fa1b38..e486e5c6e32 100644
--- a/src/xsmfns.c
+++ b/src/xsmfns.c
@@ -24,6 +24,9 @@ Boston, MA 02111-1307, USA. */
#ifdef HAVE_X_SM
#include <X11/SM/SMlib.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
#ifdef HAVE_STRING_H
#include <string.h>
#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
@@ -102,13 +106,10 @@ Lisp_Object Vx_session_previous_id;
/* Handle any messages from the session manager. If no connection is
open to a session manager, just return 0.
- Otherwise returns the number of events stored in buffer BUFP,
- which can hold up to *NUMCHARS characters. At most one event is
- stored, a SAVE_SESSION_EVENT. */
+ Otherwise returns 1 if SAVE_SESSION_EVENT is stored in buffer BUFP. */
int
-x_session_check_input (bufp, numchars)
+x_session_check_input (bufp)
struct input_event *bufp;
- int *numchars;
{
SELECT_TYPE read_fds;
EMACS_TIME tmout;
@@ -142,16 +143,11 @@ x_session_check_input (bufp, numchars)
/* Check if smc_interact_CB was called and we shall generate a
SAVE_SESSION_EVENT. */
- if (*numchars > 0 && emacs_event.kind != NO_EVENT)
- {
- bcopy (&emacs_event, bufp, sizeof (struct input_event));
- bufp++;
- (*numchars)--;
+ if (emacs_event.kind == NO_EVENT)
+ return 0;
- return 1;
- }
-
- return 0;
+ bcopy (&emacs_event, bufp, sizeof (struct input_event));
+ return 1;
}
/* Return non-zero if we have a connection to a session manager.*/
@@ -403,9 +399,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 +490,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
+ }
}
@@ -544,3 +578,6 @@ See also `emacs-save-session-functions', `emacs-session-save' and
}
#endif /* HAVE_X_SM */
+
+/* arch-tag: 56a2c58c-adfa-430a-b772-130abd29fd2e
+ (do not change this comment) */