annotate src/xsmfns.c @ 49645:4e94855c037e

Change dates for the entries concerning the 2.0.29 Tramp commit such that they all reflect the commit date, instead of the date of the individual changes. This is deemed better than keeping the original change date because it makes sure that the ChangeLog dates have more or less sequential order.
author Kai Großjohann <kgrossjo@eu.uu.net>
date Fri, 07 Feb 2003 17:53:05 +0000
parents 381ccbf15cd9
children 03e0aadb68a0 d7ddb3e565de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
1 /* Session management module for systems which understand the X Session
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
2 management protocol.
49421
381ccbf15cd9 *** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents: 47942
diff changeset
3 Copyright (C) 2002 Free Software Foundation, Inc.
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
4
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
5 This file is part of GNU Emacs.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
6
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
7 GNU Emacs is free software; you can redistribute it and/or modify
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
10 any later version.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
11
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
15 GNU General Public License for more details.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
16
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
18 along with GNU Emacs; see the file COPYING. If not, write to
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
21
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
22 #include <config.h>
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
23
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
24 #ifdef HAVE_X_SM
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
25
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
26 #include <X11/SM/SMlib.h>
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
27 #ifdef HAVE_STRING_H
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
28 #include <string.h>
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
29 #else
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
30 #ifdef HAVE_STRINGS_H
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
31 #include <strings.h>
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
32 #endif
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
33 #endif
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
34
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
35 #ifdef HAVE_UNISTD_H
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
36 #include <unistd.h>
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
37 #endif
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
38 #ifdef HAVE_STDLIB_H
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
39 #include <stdlib.h>
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
40 #endif
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
41
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
42 #include <sys/param.h>
43848
1690ab476469 Include stdio.h because termhooks.h needs it.
Gerd Moellmann <gerd@gnu.org>
parents: 43810
diff changeset
43 #include <stdio.h>
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
44
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
45 #include "systime.h"
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
46 #include "sysselect.h"
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
47 #include "lisp.h"
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
48 #include "termhooks.h"
43848
1690ab476469 Include stdio.h because termhooks.h needs it.
Gerd Moellmann <gerd@gnu.org>
parents: 43810
diff changeset
49 #include "termopts.h"
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
50
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
51 #ifndef MAXPATHLEN
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
52 #define MAXPATHLEN 1024
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
53 #endif /* not MAXPATHLEN */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
54
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
55
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
56 /* The user login name. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
57
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
58 extern Lisp_Object Vuser_login_name;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
59
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
60 /* This is the event used when SAVE_SESSION_EVENT occurs. */
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
61
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
62 static struct input_event emacs_event;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
63
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
64 /* The descriptor that we use to check for data from the session manager. */
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
65
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
66 static int ice_fd = -1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
67
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
68 /* A flag that says if we are in shutdown interactions or not. */
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
69
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
70 static int doing_interact = False;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
71
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
72 /* The session manager object for the session manager connection */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
73
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
74 static SmcConn smc_conn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
75
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
76 /* The client session id for this session */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
77 static char *client_id;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
78
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
79 /* The full path name to the Emacs program */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
80 static char *emacs_program;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
81
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
82 /* The client session id for this session as a lisp object. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
83
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
84 Lisp_Object Vx_session_id;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
85
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
86 /* The id we had the previous session. This is only available if we
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
87 have been started by the session manager with SMID_OPT. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
88
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
89 Lisp_Object Vx_session_previous_id;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
90
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
91 /* The option we tell the session manager to start Emacs with when
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
92 restarting Emacs. The client_id is appended. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
93
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
94 #define SMID_OPT "--smid="
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
95
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
96
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
97 /* Handle any messages from the session manager. If no connection is
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
98 open to a session manager, just return 0.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
99 Otherwise returns the number of events stored in buffer BUFP,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
100 which can hold up to *NUMCHARS characters. At most one event is
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
101 stored, a SAVE_SESSION_EVENT. */
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
102 int
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
103 x_session_check_input (bufp, numchars)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
104 struct input_event *bufp;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
105 int *numchars;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
106 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
107 SELECT_TYPE read_fds;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
108 EMACS_TIME tmout;
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
109
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
110 if (ice_fd == -1) return 0;
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
111
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
112 FD_ZERO (&read_fds);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
113 FD_SET (ice_fd, &read_fds);
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
114
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
115 tmout.tv_sec = 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
116 tmout.tv_usec = 0;
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
117
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
118 /* Reset this so wo can check kind after callbacks have been called by
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
119 IceProcessMessages. The smc_interact_CB sets the kind to
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
120 SAVE_SESSION_EVENT, but we don't know beforehand if that callback
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
121 will be called. */
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
122 emacs_event.kind = NO_EVENT;
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
123
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
124 if (select (ice_fd+1, &read_fds,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
125 (SELECT_TYPE *)0, (SELECT_TYPE *)0, &tmout) < 0)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
126 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
127 ice_fd = -1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
128 return 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
129 }
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
130
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
131
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
132 if (FD_ISSET (ice_fd, &read_fds))
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
133 IceProcessMessages (SmcGetIceConnection (smc_conn),
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
134 (IceReplyWaitInfo *)0, (Bool *)0);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
135
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
136
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
137 /* Check if smc_interact_CB was called and we shall generate a
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
138 SAVE_SESSION_EVENT. */
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
139 if (*numchars > 0 && emacs_event.kind != NO_EVENT)
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
140 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
141 bcopy (&emacs_event, bufp, sizeof (struct input_event));
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
142 bufp++;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
143 (*numchars)--;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
144
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
145 return 1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
146 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
147
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
148 return 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
149 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
150
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
151 /* Return non-zero if we have a connection to a session manager.*/
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
152 int
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
153 x_session_have_connection ()
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
154 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
155 return ice_fd != -1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
156 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
157
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
158 /* This is called when the session manager says it is OK to interact with the
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
159 user. Here we set the kind to SAVE_SESSION_EVENT so an event is generated.
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
160 Then lisp code can interact with the user. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
161 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
162 smc_interact_CB (smcConn, clientData)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
163 SmcConn smcConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
164 SmPointer clientData;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
165 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
166 doing_interact = True;
45803
9484de301252 Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents: 43919
diff changeset
167 emacs_event.kind = SAVE_SESSION_EVENT;
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
168 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
169
49421
381ccbf15cd9 *** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents: 47942
diff changeset
170 /* This is called when the session manager tells us to save ourselves.
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
171 We set the required properties so the session manager can restart us,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
172 plus the current working directory property (not mandatory) so we
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
173 are started in the correct directory.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
174
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
175 If this is a shutdown and we can request to interact with the user,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
176 we do so, because we don't know what the lisp code might do. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
177 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
178 smc_save_yourself_CB (smcConn,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
179 clientData,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
180 saveType,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
181 shutdown,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
182 interactStyle,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
183 fast)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
184 SmcConn smcConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
185 SmPointer clientData;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
186 int saveType;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
187 Bool shutdown;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
188 int interactStyle;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
189 Bool fast;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
190 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
191 #define NR_PROPS 5
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
192
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
193 SmProp *props[NR_PROPS];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
194 SmProp prop_ptr[NR_PROPS];
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
195
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
196 SmPropValue values[20];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
197 int val_idx = 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
198 int props_idx = 0;
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
199
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
200 char cwd[MAXPATHLEN+1];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
201 char *smid_opt;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
202
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
203 /* How to start a new instance of Emacs */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
204 props[props_idx] = &prop_ptr[props_idx];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
205 props[props_idx]->name = SmCloneCommand;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
206 props[props_idx]->type = SmLISTofARRAY8;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
207 props[props_idx]->num_vals = 1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
208 props[props_idx]->vals = &values[val_idx++];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
209 props[props_idx]->vals[0].length = strlen (emacs_program);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
210 props[props_idx]->vals[0].value = emacs_program;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
211 ++props_idx;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
212
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
213 /* The name of the program */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
214 props[props_idx] = &prop_ptr[props_idx];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
215 props[props_idx]->name = SmProgram;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
216 props[props_idx]->type = SmARRAY8;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
217 props[props_idx]->num_vals = 1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
218 props[props_idx]->vals = &values[val_idx++];
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
219 props[props_idx]->vals[0].length = strlen (SDATA (Vinvocation_name));
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
220 props[props_idx]->vals[0].value = SDATA (Vinvocation_name);
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
221 ++props_idx;
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
222
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
223 /* How to restart Emacs (i.e.: /path/to/emacs --smid=xxxx). */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
224 props[props_idx] = &prop_ptr[props_idx];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
225 props[props_idx]->name = SmRestartCommand;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
226 props[props_idx]->type = SmLISTofARRAY8;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
227 props[props_idx]->num_vals = 2; /* 2 values: /path/to/emacs, --smid=xxx */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
228 props[props_idx]->vals = &values[val_idx];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
229 props[props_idx]->vals[0].length = strlen (emacs_program);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
230 props[props_idx]->vals[0].value = emacs_program;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
231
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
232 smid_opt = xmalloc (strlen (SMID_OPT) + strlen (client_id) + 1);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
233 strcpy (smid_opt, SMID_OPT);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
234 strcat (smid_opt, client_id);
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
235
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
236 props[props_idx]->vals[1].length = strlen (smid_opt);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
237 props[props_idx]->vals[1].value = smid_opt;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
238 val_idx += 2;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
239 ++props_idx;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
240
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
241 /* User id */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
242 props[props_idx] = &prop_ptr[props_idx];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
243 props[props_idx]->name = SmUserID;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
244 props[props_idx]->type = SmARRAY8;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
245 props[props_idx]->num_vals = 1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
246 props[props_idx]->vals = &values[val_idx++];
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
247 props[props_idx]->vals[0].length = strlen (SDATA (Vuser_login_name));
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
248 props[props_idx]->vals[0].value = SDATA (Vuser_login_name);
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
249 ++props_idx;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
250
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
251 /* The current directory property, not mandatory */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
252 #ifdef HAVE_GETCWD
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
253 if (getcwd (cwd, MAXPATHLEN+1) != 0)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
254 #else
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
255 if (getwd (cwd) != 0)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
256 #endif
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
257 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
258 props[props_idx] = &prop_ptr[props_idx];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
259 props[props_idx]->name = SmCurrentDirectory;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
260 props[props_idx]->type = SmARRAY8;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
261 props[props_idx]->num_vals = 1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
262 props[props_idx]->vals = &values[val_idx++];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
263 props[props_idx]->vals[0].length = strlen (cwd);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
264 props[props_idx]->vals[0].value = cwd;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
265 ++props_idx;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
266 }
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
267
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
268
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
269 SmcSetProperties (smcConn, props_idx, props);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
270
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
271 xfree (smid_opt);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
272
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
273 /* See if we maybe shall interact with the user. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
274 if (interactStyle != SmInteractStyleAny
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
275 || ! shutdown
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
276 || saveType == SmSaveLocal
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
277 || ! SmcInteractRequest (smcConn, SmDialogNormal, smc_interact_CB, 0))
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
278 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
279 /* No interaction, we are done saving ourself. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
280 SmcSaveYourselfDone (smcConn, True);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
281 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
282 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
283
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
284 /* According to the SM specification, this shall close the connection */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
285 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
286 smc_die_CB (smcConn, clientData)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
287 SmcConn smcConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
288 SmPointer clientData;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
289 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
290 SmcCloseConnection (smcConn, 0, 0);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
291 ice_fd = -1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
292 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
293
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
294 /* We don't use the next two but they are mandatory, leave them empty.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
295 According to the SM specification, we should not interact with the
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
296 user between smc_save_yourself_CB is called and until smc_save_complete_CB
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
297 is called. It seems like a lot of job to implement this and it doesn't
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
298 even seem necessary. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
299 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
300 smc_save_complete_CB (smcConn, clientData)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
301 SmcConn smcConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
302 SmPointer clientData;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
303 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
304 /* Empty */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
305 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
306
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
307 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
308 smc_shutdown_cancelled_CB (smcConn, clientData)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
309 SmcConn smcConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
310 SmPointer clientData;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
311 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
312 /* Empty */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
313 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
314
49421
381ccbf15cd9 *** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents: 47942
diff changeset
315 /* Error handlers for SM and ICE. We don't want to exit Emacs just
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
316 because there is some error in the session management. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
317 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
318 smc_error_handler (smcConn,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
319 swap,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
320 offendingMinorOpcode,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
321 offendingSequence,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
322 errorClass,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
323 severity,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
324 values)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
325 SmcConn smcConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
326 Bool swap;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
327 int offendingMinorOpcode;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
328 unsigned long offendingSequence;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
329 int errorClass;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
330 int severity;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
331 SmPointer values;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
332 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
333 /* Empty */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
334 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
335
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
336 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
337 ice_error_handler (iceConn,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
338 swap,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
339 offendingMinorOpcode,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
340 offendingSequence,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
341 errorClass,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
342 severity,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
343 values)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
344 IceConn iceConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
345 Bool swap;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
346 int offendingMinorOpcode;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
347 unsigned long offendingSequence;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
348 int errorClass;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
349 int severity;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
350 IcePointer values;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
351 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
352 /* Empty */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
353 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
354
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
355
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
356 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
357 ice_io_error_handler (iceConn)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
358 IceConn iceConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
359 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
360 /* Connection probably gone. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
361 ice_fd = -1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
362 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
363
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
364 /* This is called when the ICE connection is created or closed. The SM library
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
365 uses ICE as it transport protocol. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
366 static void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
367 ice_conn_watch_CB (iceConn, clientData, opening, watchData)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
368 IceConn iceConn;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
369 IcePointer clientData;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
370 Bool opening;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
371 IcePointer *watchData;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
372 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
373 if (! opening)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
374 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
375 ice_fd = -1;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
376 return;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
377 }
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
378
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
379 ice_fd = IceConnectionNumber (iceConn);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
380 #ifndef F_SETOWN_BUG
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
381 #ifdef F_SETOWN
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
382 #ifdef F_SETOWN_SOCK_NEG
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
383 /* stdin is a socket here */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
384 fcntl (ice_fd, F_SETOWN, -getpid ());
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
385 #else /* ! defined (F_SETOWN_SOCK_NEG) */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
386 fcntl (ice_fd, F_SETOWN, getpid ());
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
387 #endif /* ! defined (F_SETOWN_SOCK_NEG) */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
388 #endif /* ! defined (F_SETOWN) */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
389 #endif /* F_SETOWN_BUG */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
390
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
391 #ifdef SIGIO
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
392 if (interrupt_input)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
393 init_sigio (ice_fd);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
394 #endif /* ! defined (SIGIO) */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
395 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
396
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
397 /* Try to open a connection to the session manager. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
398 void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
399 x_session_initialize ()
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
400 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
401 #define SM_ERRORSTRING_LEN 512
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
402 char errorstring[SM_ERRORSTRING_LEN];
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
403 char* previous_id = NULL;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
404 SmcCallbacks callbacks;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
405 int name_len = 0;
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
406
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
407 /* Check if we where started by the session manager. If so, we will
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
408 have a previous id. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
409 if (! EQ (Vx_session_previous_id, Qnil) && STRINGP (Vx_session_previous_id))
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
410 previous_id = SDATA (Vx_session_previous_id);
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
411
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
412 /* Construct the path to the Emacs program. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
413 if (! EQ (Vinvocation_directory, Qnil))
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
414 name_len += strlen (SDATA (Vinvocation_directory));
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
415 name_len += strlen (SDATA (Vinvocation_name));
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
416
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
417 /* This malloc will not be freed, but it is only done once, and hopefully
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
418 not very large */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
419 emacs_program = xmalloc (name_len + 1);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
420 emacs_program[0] = '\0';
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
421
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
422 if (! EQ (Vinvocation_directory, Qnil))
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
423 strcpy (emacs_program, SDATA (Vinvocation_directory));
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 45803
diff changeset
424 strcat (emacs_program, SDATA (Vinvocation_name));
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
425
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
426 /* The SM protocol says all callbacks are mandatory, so set up all
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
427 here and in the mask passed to SmcOpenConnection */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
428 callbacks.save_yourself.callback = smc_save_yourself_CB;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
429 callbacks.save_yourself.client_data = 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
430 callbacks.die.callback = smc_die_CB;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
431 callbacks.die.client_data = 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
432 callbacks.save_complete.callback = smc_save_complete_CB;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
433 callbacks.save_complete.client_data = 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
434 callbacks.shutdown_cancelled.callback = smc_shutdown_cancelled_CB;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
435 callbacks.shutdown_cancelled.client_data = 0;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
436
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
437 /* Set error handlers. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
438 SmcSetErrorHandler (smc_error_handler);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
439 IceSetErrorHandler (ice_error_handler);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
440 IceSetIOErrorHandler (ice_io_error_handler);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
441
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
442 /* Install callback for when connection status changes. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
443 IceAddConnectionWatch (ice_conn_watch_CB, 0);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
444
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
445 /* Open the connection to the session manager. A failure is not
49421
381ccbf15cd9 *** empty log message ***
Juanma Barranquero <lekktu@gmail.com>
parents: 47942
diff changeset
446 critical, it usually means that no session manager is running.
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
447 The errorstring is here for debugging. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
448 smc_conn = SmcOpenConnection (NULL, NULL, 1, 0,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
449 (SmcSaveYourselfProcMask|
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
450 SmcDieProcMask|
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
451 SmcSaveCompleteProcMask|
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
452 SmcShutdownCancelledProcMask),
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
453 &callbacks,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
454 previous_id,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
455 &client_id,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
456 SM_ERRORSTRING_LEN,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
457 errorstring);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
458
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
459 if (smc_conn != 0)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
460 Vx_session_id = make_string (client_id, strlen (client_id));
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
461 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
462
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
463
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
464 DEFUN ("handle-save-session", Fhandle_save_session,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
465 Shandle_save_session, 1, 1, "e",
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
466 doc: /* Handle the save_yourself event from a session manager.
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
467 A session manager can tell Emacs that the window system is shutting down
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
468 by sending Emacs a save_yourself message. Emacs executes this function when
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
469 such an event occurs. This function then executes `emacs-session-save'.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
470 After that, this function informs the session manager that it can continue
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
471 or abort shutting down the window system depending on the return value
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
472 from `emacs-session-save' If the return value is non-nil the session manager
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
473 is told to abort the window system shutdown.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
474
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
475 Do not call this function yourself. */)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
476 (event)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
477 Lisp_Object event;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
478 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
479 /* Check doing_interact so that we don't do anything if someone called
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
480 this at the wrong time. */
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
481 if (doing_interact)
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
482 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
483 Bool cancel_shutdown = False;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
484
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
485 cancel_shutdown = ! EQ (call0 (intern ("emacs-session-save")), Qnil);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
486
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
487 SmcInteractDone (smc_conn, cancel_shutdown);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
488 SmcSaveYourselfDone (smc_conn, True);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
489
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
490 doing_interact = False;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
491 }
43919
833c0585a612 Added return value to Fhandle_save_session to avoid compiler warning.
Jan Djärv <jan.h.d@swipnet.se>
parents: 43848
diff changeset
492
833c0585a612 Added return value to Fhandle_save_session to avoid compiler warning.
Jan Djärv <jan.h.d@swipnet.se>
parents: 43848
diff changeset
493 return Qnil;
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
494 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
495
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
496
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
497 /***********************************************************************
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
498 Initialization
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
499 ***********************************************************************/
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
500 void
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
501 syms_of_xsmfns ()
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
502 {
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
503 DEFVAR_LISP ("x-session-id", &Vx_session_id,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
504 doc: /* The session id Emacs got from the session manager for this session.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
505 Changing the value does not change the session id used by Emacs.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
506 The value is nil if no session manager is running.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
507 See also `x-session-previous-id', `emacs-save-session-functions',
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
508 `emacs-session-save' and `emacs-session-restore'." */);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
509 Vx_session_id = Qnil;
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
510
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
511 DEFVAR_LISP ("x-session-previous-id", &Vx_session_previous_id,
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
512 doc: /* The previous session id Emacs got from session manager.
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
513 If Emacs is running on a window system that has a session manager, the
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
514 session manager gives Emacs a session id. It is feasible for Emacs lisp
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
515 code to use the session id to save configuration in, for example, a file
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
516 with a file name based on the session id. If Emacs is running when the
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
517 window system is shut down, the session manager remembers that Emacs was
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
518 running and saves the session id Emacs had.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
519
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
520 When the window system is started again, the session manager restarts
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
521 Emacs and hands Emacs the session id it had the last time it was
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
522 running. This is now the previous session id and the value of this
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
523 variable. If configuration was saved in a file as stated above, the
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
524 previous session id shall be used to reconstruct the file name.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
525
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
526 The session id Emacs has while it is running is in the variable
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
527 `x-session-id'. The value of this variable and `x-session-id' may be the
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
528 same, depending on how the session manager works.
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
529
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
530 See also `emacs-save-session-functions', `emacs-session-save' and
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
531 `emacs-session-restore'." */);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
532 Vx_session_previous_id = Qnil;
47942
080b4586492b Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
533
43810
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
534 defsubr (&Shandle_save_session);
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
535 }
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
536
3d8039f847f5 New file for X session management.
Jan Djärv <jan.h.d@swipnet.se>
parents:
diff changeset
537 #endif /* HAVE_X_SM */