5
#include <X11/SM/SMlib.h>
8
static IceConn iceconn = NULL;
10
static int closed = 0;
13
session_died (SmcConn conn, SmPointer client_data)
15
SmcCloseConnection (conn, 0, NULL);
16
kill (getpid (), SIGTERM);
20
save_yourself (SmcConn conn, SmPointer client_data, int save_type, Bool shutdown, int interact_style, Bool fast)
22
SmcSaveYourselfDone (conn, True);
26
save_complete (SmcConn conn, SmPointer client_data)
31
shutdown_cancelled (SmcConn conn, SmPointer client_data)
36
ice_watch (IceConn ice_conn, IcePointer client_data, Bool opening, IcePointer *watch_data)
46
if (iceconn != NULL) {
48
write (pipes[1], "closed", 7);
56
SmcCallbacks callbacks;
61
IceAddConnectionWatch (ice_watch, NULL);
63
bzero (&callbacks, sizeof (SmcCallbacks));
64
callbacks.die.callback = session_died;
65
callbacks.save_yourself.callback = save_yourself;
66
callbacks.save_complete.callback = save_complete;
67
callbacks.shutdown_cancelled.callback = shutdown_cancelled;
69
conn = SmcOpenConnection (NULL, NULL, 1, 0, SmcDieProcMask | SmcSaveYourselfProcMask |
70
SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, &callbacks,
72
IceRemoveConnectionWatch (ice_watch, NULL);
78
FD_SET (IceConnectionNumber (iceconn), &rfds);
81
FD_SET (pipes[0], &rfds);
84
while (select (pipes[0] + 1, &rfds, NULL, NULL, NULL) > 0) {
86
SmcConn smcconn = (SmcConn) iceconn;
89
SmcCloseConnection (smcconn, 0, NULL);
91
} else if (IceProcessMessages (iceconn, NULL, NULL) == IceProcessMessagesConnectionClosed) {