summaryrefslogtreecommitdiff
path: root/src/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/session.c')
-rw-r--r--src/session.c1081
1 files changed, 495 insertions, 586 deletions
diff --git a/src/session.c b/src/session.c
index a908efc..ed8bb33 100644
--- a/src/session.c
+++ b/src/session.c
@@ -26,7 +26,7 @@ Author: Ralph Mor, X Consortium
******************************************************************************/
#ifdef HAVE_CONFIG_H
-# include "config.h"
+#include "config.h"
#endif
#include <X11/Xos.h>
@@ -39,7 +39,7 @@ Author: Ralph Mor, X Consortium
#include <limits.h>
#undef _POSIX_SOURCE
#endif
-#endif /* X_NOT_POSIX */
+#endif /* X_NOT_POSIX */
#ifndef PATH_MAX
#include <sys/param.h>
#ifndef PATH_MAX
@@ -49,7 +49,7 @@ Author: Ralph Mor, X Consortium
#define PATH_MAX 1024
#endif
#endif
-#endif /* PATH_MAX */
+#endif /* PATH_MAX */
#ifdef HAVE_MKSTEMP
#include <unistd.h>
#endif
@@ -71,14 +71,13 @@ static Bool sent_save_done = 0;
#define SAVEFILE_VERSION 2
#ifndef HAVE_MKSTEMP
-static char *unique_filename ( const char *path, const char *prefix );
+static char *unique_filename(const char *path, const char *prefix);
#else
-static char *unique_filename ( const char *path, const char *prefix, int *pFd );
+static char *unique_filename(const char *path, const char *prefix, int *pFd);
#endif
-
static char *
-GetClientID (Window window)
+GetClientID(Window window)
{
char *client_id = NULL;
Window client_leader;
@@ -89,310 +88,285 @@ GetClientID (Window window)
unsigned long bytes_after;
unsigned char *prop = NULL;
- if (XGetWindowProperty (dpy, window, _XA_WM_CLIENT_LEADER,
- 0L, 1L, False, AnyPropertyType, &actual_type, &actual_format,
- &nitems, &bytes_after, &prop) == Success)
- {
- if (actual_type == XA_WINDOW && actual_format == 32 &&
- nitems == 1 && bytes_after == 0)
- {
- client_leader = *((Window *) prop);
-
- if (XGetTextProperty (dpy, client_leader, &tp, _XA_SM_CLIENT_ID))
- {
- if (tp.encoding == XA_STRING &&
- tp.format == 8 && tp.nitems != 0)
- client_id = (char *) tp.value;
- }
- }
-
- if (prop)
- XFree (prop);
+ if (XGetWindowProperty(dpy, window, _XA_WM_CLIENT_LEADER,
+ 0L, 1L, False, AnyPropertyType, &actual_type,
+ &actual_format, &nitems, &bytes_after,
+ &prop) == Success) {
+ if (actual_type == XA_WINDOW && actual_format == 32 && nitems == 1 &&
+ bytes_after == 0) {
+ client_leader = *((Window *) prop);
+
+ if (XGetTextProperty(dpy, client_leader, &tp, _XA_SM_CLIENT_ID)) {
+ if (tp.encoding == XA_STRING &&
+ tp.format == 8 && tp.nitems != 0)
+ client_id = (char *) tp.value;
+ }
+ }
+
+ if (prop)
+ XFree(prop);
}
return client_id;
}
-
-
static char *
-GetWindowRole (Window window)
+GetWindowRole(Window window)
{
XTextProperty tp;
- if (XGetTextProperty (dpy, window, &tp, _XA_WM_WINDOW_ROLE))
- {
- if (tp.encoding == XA_STRING && tp.format == 8 && tp.nitems != 0)
- return ((char *) tp.value);
+ if (XGetTextProperty(dpy, window, &tp, _XA_WM_WINDOW_ROLE)) {
+ if (tp.encoding == XA_STRING && tp.format == 8 && tp.nitems != 0)
+ return ((char *) tp.value);
}
return NULL;
}
-
-
static int
-write_byte (FILE *file, unsigned char b)
+write_byte(FILE *file, unsigned char b)
{
- if (fwrite ((char *) &b, 1, 1, file) != 1)
- return 0;
+ if (fwrite((char *) &b, 1, 1, file) != 1)
+ return 0;
return 1;
}
-
static int
-write_ushort (FILE *file, unsigned short s)
+write_ushort(FILE *file, unsigned short s)
{
- unsigned char file_short[2];
+ unsigned char file_short[2];
- file_short[0] = (unsigned char)((s & (unsigned)0xff00) >> 8);
- file_short[1] = (unsigned char)(s & 0xff);
- if (fwrite ((char *) file_short, (int) sizeof (file_short), 1, file) != 1)
- return 0;
+ file_short[0] = (unsigned char) ((s & (unsigned) 0xff00) >> 8);
+ file_short[1] = (unsigned char) (s & 0xff);
+ if (fwrite((char *) file_short, (int) sizeof(file_short), 1, file) != 1)
+ return 0;
return 1;
}
-
static int
-write_short (FILE *file, short s)
+write_short(FILE *file, short s)
{
- unsigned char file_short[2];
+ unsigned char file_short[2];
- file_short[0] = (unsigned char)(((unsigned)s & (unsigned)0xff00) >> 8);
- file_short[1] = (unsigned char)(s & 0xff);
- if (fwrite ((char *) file_short, (int) sizeof (file_short), 1, file) != 1)
- return 0;
+ file_short[0] = (unsigned char) (((unsigned) s & (unsigned) 0xff00) >> 8);
+ file_short[1] = (unsigned char) (s & 0xff);
+ if (fwrite((char *) file_short, (int) sizeof(file_short), 1, file) != 1)
+ return 0;
return 1;
}
-
static int
-write_counted_string (FILE *file, char *string)
+write_counted_string(FILE *file, char *string)
{
- if (string)
- {
- unsigned char count = (unsigned char)strlen (string);
-
- if (write_byte (file, count) == 0)
- return 0;
- if (fwrite (string, (int) sizeof (char), (int) count, file) != count)
- return 0;
+ if (string) {
+ unsigned char count = (unsigned char) strlen(string);
+
+ if (write_byte(file, count) == 0)
+ return 0;
+ if (fwrite(string, (int) sizeof(char), (int) count, file) != count)
+ return 0;
}
- else
- {
- if (write_byte (file, 0) == 0)
- return 0;
+ else {
+ if (write_byte(file, 0) == 0)
+ return 0;
}
return 1;
}
-
-
static int
-read_byte (FILE *file, unsigned char *bp)
+read_byte(FILE *file, unsigned char *bp)
{
- if (fread ((char *) bp, 1, 1, file) != 1)
- return 0;
+ if (fread((char *) bp, 1, 1, file) != 1)
+ return 0;
return 1;
}
-
static int
-read_ushort (FILE *file, unsigned short *shortp)
+read_ushort(FILE *file, unsigned short *shortp)
{
- unsigned char file_short[2];
+ unsigned char file_short[2];
- if (fread ((char *) file_short, (int) sizeof (file_short), 1, file) != 1)
- return 0;
- *shortp = (unsigned short)(file_short[0] * 256 + file_short[1]);
+ if (fread((char *) file_short, (int) sizeof(file_short), 1, file) != 1)
+ return 0;
+ *shortp = (unsigned short) (file_short[0] * 256 + file_short[1]);
return 1;
}
-
static int
-read_short (FILE *file, short *shortp)
+read_short(FILE *file, short *shortp)
{
- unsigned char file_short[2];
+ unsigned char file_short[2];
- if (fread ((char *) file_short, (int) sizeof (file_short), 1, file) != 1)
- return 0;
- *shortp = (short)(file_short[0] * 256 + file_short[1]);
+ if (fread((char *) file_short, (int) sizeof(file_short), 1, file) != 1)
+ return 0;
+ *shortp = (short) (file_short[0] * 256 + file_short[1]);
return 1;
}
-
static int
-read_counted_string (FILE *file, char **stringp)
+read_counted_string(FILE *file, char **stringp)
{
- unsigned char len;
- char *data;
+ unsigned char len;
+ char *data;
- if (read_byte (file, &len) == 0)
- return 0;
+ if (read_byte(file, &len) == 0)
+ return 0;
if (len == 0) {
- data = 0;
- } else {
- data = malloc ((unsigned) len + 1);
- if (!data)
- return 0;
- if (fread (data, (int) sizeof (char), (int) len, file) != len) {
- free (data);
- return 0;
- }
- data[len] = '\0';
+ data = 0;
+ }
+ else {
+ data = malloc((unsigned) len + 1);
+ if (!data)
+ return 0;
+ if (fread(data, (int) sizeof(char), (int) len, file) != len) {
+ free(data);
+ return 0;
+ }
+ data[len] = '\0';
}
*stringp = data;
return 1;
}
-
-
/*
* An entry in the saved window config file looks like this:
*
- * FIELD BYTES
+ * FIELD BYTES
* ----- ----
- * SM_CLIENT_ID ID len 1 (may be 0)
- * SM_CLIENT_ID LIST of bytes (may be NULL)
+ * SM_CLIENT_ID ID len 1 (may be 0)
+ * SM_CLIENT_ID LIST of bytes (may be NULL)
*
- * WM_WINDOW_ROLE length 1 (may be 0)
- * WM_WINDOW_ROLE LIST of bytes (may be NULL)
+ * WM_WINDOW_ROLE length 1 (may be 0)
+ * WM_WINDOW_ROLE LIST of bytes (may be NULL)
*
* if no WM_WINDOW_ROLE (length = 0)
*
- * WM_CLASS "res name" length 1
- * WM_CLASS "res name" LIST of bytes
+ * WM_CLASS "res name" length 1
+ * WM_CLASS "res name" LIST of bytes
* WM_CLASS "res class" length 1
* WM_CLASS "res class" LIST of bytes
- * WM_NAME length 1 (0 if name changed)
- * WM_NAME LIST of bytes
- * WM_COMMAND arg count 1 (0 if no SM_CLIENT_ID)
+ * WM_NAME length 1 (0 if name changed)
+ * WM_NAME LIST of bytes
+ * WM_COMMAND arg count 1 (0 if no SM_CLIENT_ID)
* For each arg in WM_COMMAND
- * arg length 1
- * arg LIST of bytes
+ * arg length 1
+ * arg LIST of bytes
*
- * Iconified bool 1
- * Icon info present bool 1
+ * Iconified bool 1
+ * Icon info present bool 1
*
* if icon info present
- * icon x 2
- * icon y 2
+ * icon x 2
+ * icon y 2
*
- * Geom x 2
- * Geom y 2
- * Geom width 2
- * Geom height 2
+ * Geom x 2
+ * Geom y 2
+ * Geom width 2
+ * Geom height 2
*
- * Width ever changed by user 1
- * Height ever changed by user 1
+ * Width ever changed by user 1
+ * Height ever changed by user 1
*/
static int
-WriteWinConfigEntry (FILE *configFile, TwmWindow *theWindow,
- char *clientId, char *windowRole)
+WriteWinConfigEntry(FILE *configFile, TwmWindow *theWindow,
+ char *clientId, char *windowRole)
{
char **wm_command;
int wm_command_count, i;
- if (!write_counted_string (configFile, clientId))
- return 0;
-
- if (!write_counted_string (configFile, windowRole))
- return 0;
-
- if (!windowRole)
- {
- if (!write_counted_string (configFile, theWindow->class.res_name))
- return 0;
- if (!write_counted_string (configFile, theWindow->class.res_class))
- return 0;
- if (theWindow->nameChanged)
- {
- /*
- * If WM_NAME changed on this window, we can't use it as
- * a criteria for looking up window configurations. See the
- * longer explanation in the GetWindowConfig() function below.
- */
-
- if (!write_counted_string (configFile, NULL))
- return 0;
- }
- else
- {
- if (!write_counted_string (configFile, theWindow->name))
- return 0;
- }
-
- wm_command = NULL;
- wm_command_count = 0;
- XGetCommand (dpy, theWindow->w, &wm_command, &wm_command_count);
-
- if (clientId || !wm_command || wm_command_count == 0)
- {
- if (!write_byte (configFile, 0))
- return 0;
- }
- else
- {
- if (!write_byte (configFile, (unsigned char) wm_command_count))
- return 0;
- for (i = 0; i < wm_command_count; i++)
- if (!write_counted_string (configFile, wm_command[i]))
- return 0;
- XFreeStringList (wm_command);
- }
+ if (!write_counted_string(configFile, clientId))
+ return 0;
+
+ if (!write_counted_string(configFile, windowRole))
+ return 0;
+
+ if (!windowRole) {
+ if (!write_counted_string(configFile, theWindow->class.res_name))
+ return 0;
+ if (!write_counted_string(configFile, theWindow->class.res_class))
+ return 0;
+ if (theWindow->nameChanged) {
+ /*
+ * If WM_NAME changed on this window, we can't use it as
+ * a criteria for looking up window configurations. See the
+ * longer explanation in the GetWindowConfig() function below.
+ */
+
+ if (!write_counted_string(configFile, NULL))
+ return 0;
+ }
+ else {
+ if (!write_counted_string(configFile, theWindow->name))
+ return 0;
+ }
+
+ wm_command = NULL;
+ wm_command_count = 0;
+ XGetCommand(dpy, theWindow->w, &wm_command, &wm_command_count);
+
+ if (clientId || !wm_command || wm_command_count == 0) {
+ if (!write_byte(configFile, 0))
+ return 0;
+ }
+ else {
+ if (!write_byte(configFile, (unsigned char) wm_command_count))
+ return 0;
+ for (i = 0; i < wm_command_count; i++)
+ if (!write_counted_string(configFile, wm_command[i]))
+ return 0;
+ XFreeStringList(wm_command);
+ }
}
- if (!write_byte (configFile, theWindow->icon ? 1 : 0)) /* iconified */
- return 0;
+ if (!write_byte(configFile, theWindow->icon ? 1 : 0)) /* iconified */
+ return 0;
- if (!write_byte (configFile, theWindow->icon_w ? 1 : 0)) /* icon exists */
- return 0;
+ if (!write_byte(configFile, theWindow->icon_w ? 1 : 0)) /* icon exists */
+ return 0;
- if (theWindow->icon_w)
- {
- int icon_x, icon_y;
+ if (theWindow->icon_w) {
+ int icon_x, icon_y;
- XGetGeometry (dpy, theWindow->icon_w, &JunkRoot, &icon_x,
- &icon_y, &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth);
+ XGetGeometry(dpy, theWindow->icon_w, &JunkRoot, &icon_x,
+ &icon_y, &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth);
- if (!write_short (configFile, (short) icon_x))
- return 0;
- if (!write_short (configFile, (short) icon_y))
- return 0;
+ if (!write_short(configFile, (short) icon_x))
+ return 0;
+ if (!write_short(configFile, (short) icon_y))
+ return 0;
}
- if (!write_short (configFile, (short) theWindow->frame_x))
- return 0;
- if (!write_short (configFile, (short) theWindow->frame_y))
- return 0;
- if (!write_ushort (configFile, (unsigned short) theWindow->attr.width))
- return 0;
- if (!write_ushort (configFile, (unsigned short) theWindow->attr.height))
- return 0;
+ if (!write_short(configFile, (short) theWindow->frame_x))
+ return 0;
+ if (!write_short(configFile, (short) theWindow->frame_y))
+ return 0;
+ if (!write_ushort(configFile, (unsigned short) theWindow->attr.width))
+ return 0;
+ if (!write_ushort(configFile, (unsigned short) theWindow->attr.height))
+ return 0;
- if (!write_byte (configFile, theWindow->widthEverChangedByUser ? 1 : 0))
- return 0;
+ if (!write_byte(configFile, theWindow->widthEverChangedByUser ? 1 : 0))
+ return 0;
- if (!write_byte (configFile, theWindow->heightEverChangedByUser ? 1 : 0))
- return 0;
+ if (!write_byte(configFile, theWindow->heightEverChangedByUser ? 1 : 0))
+ return 0;
return 1;
}
-
static int
-ReadWinConfigEntry (FILE *configFile, unsigned short version,
- TWMWinConfigEntry **pentry)
+ReadWinConfigEntry(FILE *configFile, unsigned short version,
+ TWMWinConfigEntry **pentry)
{
TWMWinConfigEntry *entry;
unsigned char byte;
int i;
- *pentry = entry = malloc (sizeof (TWMWinConfigEntry));
+ *pentry = entry = malloc(sizeof(TWMWinConfigEntry));
if (!*pentry)
- return 0;
+ return 0;
entry->tag = 0;
entry->client_id = NULL;
@@ -403,156 +377,142 @@ ReadWinConfigEntry (FILE *configFile, unsigned short version,
entry->wm_command = NULL;
entry->wm_command_count = 0;
- if (!read_counted_string (configFile, &entry->client_id))
- goto give_up;
-
- if (!read_counted_string (configFile, &entry->window_role))
- goto give_up;
-
- if (!entry->window_role)
- {
- if (!read_counted_string (configFile, &entry->class.res_name))
- goto give_up;
- if (!read_counted_string (configFile, &entry->class.res_class))
- goto give_up;
- if (!read_counted_string (configFile, &entry->wm_name))
- goto give_up;
-
- if (!read_byte (configFile, &byte))
- goto give_up;
- entry->wm_command_count = byte;
-
- if (entry->wm_command_count == 0)
- entry->wm_command = NULL;
- else
- {
- entry->wm_command = malloc ((size_t)entry->wm_command_count *
- sizeof (char *));
-
- if (!entry->wm_command)
- goto give_up;
-
- for (i = 0; i < entry->wm_command_count; i++)
- if (!read_counted_string (configFile, &entry->wm_command[i]))
- goto give_up;
- }
+ if (!read_counted_string(configFile, &entry->client_id))
+ goto give_up;
+
+ if (!read_counted_string(configFile, &entry->window_role))
+ goto give_up;
+
+ if (!entry->window_role) {
+ if (!read_counted_string(configFile, &entry->class.res_name))
+ goto give_up;
+ if (!read_counted_string(configFile, &entry->class.res_class))
+ goto give_up;
+ if (!read_counted_string(configFile, &entry->wm_name))
+ goto give_up;
+
+ if (!read_byte(configFile, &byte))
+ goto give_up;
+ entry->wm_command_count = byte;
+
+ if (entry->wm_command_count == 0)
+ entry->wm_command = NULL;
+ else {
+ entry->wm_command = malloc((size_t) entry->wm_command_count *
+ sizeof(char *));
+
+ if (!entry->wm_command)
+ goto give_up;
+
+ for (i = 0; i < entry->wm_command_count; i++)
+ if (!read_counted_string(configFile, &entry->wm_command[i]))
+ goto give_up;
+ }
}
- if (!read_byte (configFile, &byte))
- goto give_up;
+ if (!read_byte(configFile, &byte))
+ goto give_up;
entry->iconified = byte;
- if (!read_byte (configFile, &byte))
- goto give_up;
+ if (!read_byte(configFile, &byte))
+ goto give_up;
entry->icon_info_present = byte;
- if (entry->icon_info_present)
- {
- if (!read_short (configFile, (short *) &entry->icon_x))
- goto give_up;
- if (!read_short (configFile, (short *) &entry->icon_y))
- goto give_up;
+ if (entry->icon_info_present) {
+ if (!read_short(configFile, (short *) &entry->icon_x))
+ goto give_up;
+ if (!read_short(configFile, (short *) &entry->icon_y))
+ goto give_up;
}
- if (!read_short (configFile, (short *) &entry->x))
- goto give_up;
- if (!read_short (configFile, (short *) &entry->y))
- goto give_up;
- if (!read_ushort (configFile, &entry->width))
- goto give_up;
- if (!read_ushort (configFile, &entry->height))
- goto give_up;
-
- if (version > 1)
- {
- if (!read_byte (configFile, &byte))
- goto give_up;
- entry->width_ever_changed_by_user = byte;
-
- if (!read_byte (configFile, &byte))
- goto give_up;
- entry->height_ever_changed_by_user = byte;
+ if (!read_short(configFile, (short *) &entry->x))
+ goto give_up;
+ if (!read_short(configFile, (short *) &entry->y))
+ goto give_up;
+ if (!read_ushort(configFile, &entry->width))
+ goto give_up;
+ if (!read_ushort(configFile, &entry->height))
+ goto give_up;
+
+ if (version > 1) {
+ if (!read_byte(configFile, &byte))
+ goto give_up;
+ entry->width_ever_changed_by_user = byte;
+
+ if (!read_byte(configFile, &byte))
+ goto give_up;
+ entry->height_ever_changed_by_user = byte;
}
- else
- {
- entry->width_ever_changed_by_user = False;
- entry->height_ever_changed_by_user = False;
+ else {
+ entry->width_ever_changed_by_user = False;
+ entry->height_ever_changed_by_user = False;
}
return 1;
-give_up:
+ give_up:
if (entry->client_id)
- free (entry->client_id);
+ free(entry->client_id);
if (entry->window_role)
- free (entry->window_role);
+ free(entry->window_role);
if (entry->class.res_name)
- free (entry->class.res_name);
+ free(entry->class.res_name);
if (entry->class.res_class)
- free (entry->class.res_class);
+ free(entry->class.res_class);
if (entry->wm_name)
- free (entry->wm_name);
- if (entry->wm_command_count && entry->wm_command)
- {
- for (i = 0; i < entry->wm_command_count; i++)
- if (entry->wm_command[i])
- free (entry->wm_command[i]);
+ free(entry->wm_name);
+ if (entry->wm_command_count && entry->wm_command) {
+ for (i = 0; i < entry->wm_command_count; i++)
+ if (entry->wm_command[i])
+ free(entry->wm_command[i]);
}
if (entry->wm_command)
- free (entry->wm_command);
+ free(entry->wm_command);
- free (entry);
+ free(entry);
*pentry = NULL;
return 0;
}
-
void
-ReadWinConfigFile (char *filename)
+ReadWinConfigFile(char *filename)
{
FILE *configFile;
TWMWinConfigEntry *entry;
int done = 0;
unsigned short version = 0;
- configFile = fopen (filename, "rb");
+ configFile = fopen(filename, "rb");
if (!configFile)
- return;
+ return;
- if (!read_ushort (configFile, &version) ||
- version > SAVEFILE_VERSION)
- {
- done = 1;
+ if (!read_ushort(configFile, &version) || version > SAVEFILE_VERSION) {
+ done = 1;
}
- while (!done)
- {
- if (ReadWinConfigEntry (configFile, version, &entry))
- {
- entry->next = winConfigHead;
- winConfigHead = entry;
- }
- else
- done = 1;
+ while (!done) {
+ if (ReadWinConfigEntry(configFile, version, &entry)) {
+ entry->next = winConfigHead;
+ winConfigHead = entry;
+ }
+ else
+ done = 1;
}
- fclose (configFile);
+ fclose(configFile);
}
-
-
int
-GetWindowConfig (
- TwmWindow *theWindow,
- short *x, short *y,
- unsigned short *width, unsigned short *height,
- Bool *iconified,
- Bool *icon_info_present,
- short *icon_x, short *icon_y,
- Bool *width_ever_changed_by_user,
- Bool *height_ever_changed_by_user)
+GetWindowConfig(TwmWindow *theWindow,
+ short *x, short *y,
+ unsigned short *width, unsigned short *height,
+ Bool *iconified,
+ Bool *icon_info_present,
+ short *icon_x, short *icon_y,
+ Bool *width_ever_changed_by_user,
+ Bool *height_ever_changed_by_user)
{
char *clientId, *windowRole;
TWMWinConfigEntry *ptr;
@@ -561,166 +521,146 @@ GetWindowConfig (
ptr = winConfigHead;
if (!ptr)
- return 0;
-
- clientId = GetClientID (theWindow->w);
- windowRole = GetWindowRole (theWindow->w);
-
- while (ptr && !found)
- {
- int client_id_match = (!clientId && !ptr->client_id) ||
- (clientId && ptr->client_id &&
- strcmp (clientId, ptr->client_id) == 0);
-
- if (!ptr->tag && client_id_match)
- {
- if (windowRole || ptr->window_role)
- {
- found = (windowRole && ptr->window_role &&
- strcmp (windowRole, ptr->window_role) == 0);
- }
- else
- {
- /*
- * Compare WM_CLASS + only compare WM_NAME if the
- * WM_NAME in the saved file is non-NULL. If the
- * WM_NAME in the saved file is NULL, this means that
- * the client changed the value of WM_NAME during the
- * session, and we can not use it as a criteria for
- * our search. For example, with xmh, at save time
- * the window name might be "xmh: folderY". However,
- * if xmh does not properly restore state when it is
- * restarted, the initial window name might be
- * "xmh: folderX". This would cause the window manager
- * to fail in finding the saved window configuration.
- * The best we can do is ignore WM_NAME if its value
- * changed in the previous session.
- */
-
- if (strcmp (theWindow->class.res_name,
- ptr->class.res_name) == 0 &&
- strcmp (theWindow->class.res_class,
- ptr->class.res_class) == 0 &&
- (ptr->wm_name == NULL ||
- strcmp (theWindow->name, ptr->wm_name) == 0))
- {
- if (clientId)
- {
- /*
- * If a client ID was present, we should not check
- * WM_COMMAND because Xt will put a -xtsessionID arg
- * on the command line.
- */
-
- found = 1;
- }
- else
- {
- /*
- * For non-XSMP clients, also check WM_COMMAND.
- */
-
- char **wm_command = NULL;
- int wm_command_count = 0, i;
-
- XGetCommand (dpy, theWindow->w,
- &wm_command, &wm_command_count);
-
- if (wm_command_count == ptr->wm_command_count)
- {
- for (i = 0; i < wm_command_count; i++)
- if (strcmp (wm_command[i],
- ptr->wm_command[i]) != 0)
- break;
-
- if (i == wm_command_count)
- found = 1;
- }
- }
- }
- }
- }
-
- if (!found)
- ptr = ptr->next;
+ return 0;
+
+ clientId = GetClientID(theWindow->w);
+ windowRole = GetWindowRole(theWindow->w);
+
+ while (ptr && !found) {
+ int client_id_match = (!clientId && !ptr->client_id) ||
+ (clientId && ptr->client_id &&
+ strcmp(clientId, ptr->client_id) == 0);
+
+ if (!ptr->tag && client_id_match) {
+ if (windowRole || ptr->window_role) {
+ found = (windowRole && ptr->window_role &&
+ strcmp(windowRole, ptr->window_role) == 0);
+ }
+ else {
+ /*
+ * Compare WM_CLASS + only compare WM_NAME if the
+ * WM_NAME in the saved file is non-NULL. If the
+ * WM_NAME in the saved file is NULL, this means that
+ * the client changed the value of WM_NAME during the
+ * session, and we can not use it as a criteria for
+ * our search. For example, with xmh, at save time
+ * the window name might be "xmh: folderY". However,
+ * if xmh does not properly restore state when it is
+ * restarted, the initial window name might be
+ * "xmh: folderX". This would cause the window manager
+ * to fail in finding the saved window configuration.
+ * The best we can do is ignore WM_NAME if its value
+ * changed in the previous session.
+ */
+
+ if (strcmp(theWindow->class.res_name,
+ ptr->class.res_name) == 0 &&
+ strcmp(theWindow->class.res_class,
+ ptr->class.res_class) == 0 &&
+ (ptr->wm_name == NULL ||
+ strcmp(theWindow->name, ptr->wm_name) == 0)) {
+ if (clientId) {
+ /*
+ * If a client ID was present, we should not check
+ * WM_COMMAND because Xt will put a -xtsessionID arg
+ * on the command line.
+ */
+
+ found = 1;
+ }
+ else {
+ /*
+ * For non-XSMP clients, also check WM_COMMAND.
+ */
+
+ char **wm_command = NULL;
+ int wm_command_count = 0, i;
+
+ XGetCommand(dpy, theWindow->w,
+ &wm_command, &wm_command_count);
+
+ if (wm_command_count == ptr->wm_command_count) {
+ for (i = 0; i < wm_command_count; i++)
+ if (strcmp(wm_command[i],
+ ptr->wm_command[i]) != 0)
+ break;
+
+ if (i == wm_command_count)
+ found = 1;
+ }
+ }
+ }
+ }
+ }
+
+ if (!found)
+ ptr = ptr->next;
}
- if (found)
- {
- *x = ptr->x;
- *y = ptr->y;
- *width = ptr->width;
- *height = ptr->height;
- *iconified = ptr->iconified;
- *icon_info_present = ptr->icon_info_present;
- *width_ever_changed_by_user = ptr->width_ever_changed_by_user;
- *height_ever_changed_by_user = ptr->height_ever_changed_by_user;
-
- if (*icon_info_present)
- {
- *icon_x = ptr->icon_x;
- *icon_y = ptr->icon_y;
- }
- ptr->tag = 1;
+ if (found) {
+ *x = ptr->x;
+ *y = ptr->y;
+ *width = ptr->width;
+ *height = ptr->height;
+ *iconified = ptr->iconified;
+ *icon_info_present = ptr->icon_info_present;
+ *width_ever_changed_by_user = ptr->width_ever_changed_by_user;
+ *height_ever_changed_by_user = ptr->height_ever_changed_by_user;
+
+ if (*icon_info_present) {
+ *icon_x = ptr->icon_x;
+ *icon_y = ptr->icon_y;
+ }
+ ptr->tag = 1;
}
else
- *iconified = 0;
+ *iconified = 0;
if (clientId)
- XFree (clientId);
+ XFree(clientId);
if (windowRole)
- XFree (windowRole);
+ XFree(windowRole);
return found;
}
-
-
#ifndef HAVE_MKSTEMP
static char *
-unique_filename (
- const char *path,
- const char *prefix)
+unique_filename(const char *path, const char *prefix)
#else
static char *
-unique_filename (
- const char *path,
- const char *prefix,
- int *pFd)
+unique_filename(const char *path, const char *prefix, int *pFd)
#endif
-
{
#ifndef HAVE_MKSTEMP
#ifndef X_NOT_POSIX
- return ((char *) tempnam (path, prefix));
+ return ((char *) tempnam(path, prefix));
#else
char tempFile[PATH_MAX];
char *tmp;
- snprintf (tempFile, sizeof(tempFile), "%s/%sXXXXXX", path, prefix);
- tmp = (char *) mktemp (tempFile);
+ snprintf(tempFile, sizeof(tempFile), "%s/%sXXXXXX", path, prefix);
+ tmp = (char *) mktemp(tempFile);
if (tmp)
- return strdup (tmp);
+ return strdup(tmp);
else
- return (NULL);
+ return (NULL);
#endif
#else
char tempFile[PATH_MAX];
char *ptr;
- snprintf (tempFile, sizeof(tempFile), "%s/%sXXXXXX", path, prefix);
- ptr = strdup (tempFile);
+ snprintf(tempFile, sizeof(tempFile), "%s/%sXXXXXX", path, prefix);
+ ptr = strdup(tempFile);
if (ptr != NULL)
- *pFd = mkstemp (ptr);
+ *pFd = mkstemp(ptr);
return ptr;
#endif
}
-
-
static void
-SaveYourselfPhase2CB (SmcConn smcConn2, SmPointer clientData _X_UNUSED)
+SaveYourselfPhase2CB(SmcConn smcConn2, SmPointer clientData _X_UNUSED)
{
int scrnum;
ScreenInfo *theScreen;
@@ -735,229 +675,206 @@ SaveYourselfPhase2CB (SmcConn smcConn2, SmPointer clientData _X_UNUSED)
char discardCommand[80];
int numVals, i;
static int first_time = 1;
+
#ifdef HAVE_MKSTEMP
int fd;
#endif
- if (first_time)
- {
- char userId[20];
- char hint = SmRestartIfRunning;
-
- prop1.name = strdup(SmProgram);
- prop1.type = strdup(SmARRAY8);
- prop1.num_vals = 1;
- prop1.vals = &prop1val;
- prop1val.value = Argv[0];
- prop1val.length = (int)strlen (Argv[0]);
-
- snprintf (userId, sizeof(userId), "%ld", (long)getuid());
- prop2.name = strdup(SmUserID);
- prop2.type = strdup(SmARRAY8);
- prop2.num_vals = 1;
- prop2.vals = &prop2val;
- prop2val.value = (SmPointer) userId;
- prop2val.length = (int)strlen (userId);
-
- prop3.name = strdup(SmRestartStyleHint);
- prop3.type = strdup(SmCARD8);
- prop3.num_vals = 1;
- prop3.vals = &prop3val;
- prop3val.value = (SmPointer) &hint;
- prop3val.length = 1;
-
- props[0] = &prop1;
- props[1] = &prop2;
- props[2] = &prop3;
-
- SmcSetProperties (smcConn2, 3, props);
-
- first_time = 0;
+ if (first_time) {
+ char userId[20];
+ char hint = SmRestartIfRunning;
+
+ prop1.name = strdup(SmProgram);
+ prop1.type = strdup(SmARRAY8);
+ prop1.num_vals = 1;
+ prop1.vals = &prop1val;
+ prop1val.value = Argv[0];
+ prop1val.length = (int) strlen(Argv[0]);
+
+ snprintf(userId, sizeof(userId), "%ld", (long) getuid());
+ prop2.name = strdup(SmUserID);
+ prop2.type = strdup(SmARRAY8);
+ prop2.num_vals = 1;
+ prop2.vals = &prop2val;
+ prop2val.value = (SmPointer) userId;
+ prop2val.length = (int) strlen(userId);
+
+ prop3.name = strdup(SmRestartStyleHint);
+ prop3.type = strdup(SmCARD8);
+ prop3.num_vals = 1;
+ prop3.vals = &prop3val;
+ prop3val.value = (SmPointer) & hint;
+ prop3val.length = 1;
+
+ props[0] = &prop1;
+ props[1] = &prop2;
+ props[2] = &prop3;
+
+ SmcSetProperties(smcConn2, 3, props);
+
+ first_time = 0;
}
- path = getenv ("SM_SAVE_DIR");
- if (!path)
- {
- path = getenv ("HOME");
- if (!path)
- path = ".";
+ path = getenv("SM_SAVE_DIR");
+ if (!path) {
+ path = getenv("HOME");
+ if (!path)
+ path = ".";
}
#ifndef HAVE_MKSTEMP
- if ((filename = unique_filename (path, ".twm")) == NULL)
- goto bad;
+ if ((filename = unique_filename(path, ".twm")) == NULL)
+ goto bad;
- if (!(configFile = fopen (filename, "wb")))
- goto bad;
+ if (!(configFile = fopen(filename, "wb")))
+ goto bad;
#else
- if ((filename = unique_filename (path, ".twm", &fd)) == NULL)
- goto bad;
+ if ((filename = unique_filename(path, ".twm", &fd)) == NULL)
+ goto bad;
if (!(configFile = fdopen(fd, "wb")))
- goto bad;
+ goto bad;
#endif
- if (!write_ushort (configFile, SAVEFILE_VERSION))
- goto bad;
+ if (!write_ushort(configFile, SAVEFILE_VERSION))
+ goto bad;
success = True;
- for (scrnum = 0; scrnum < NumScreens && success; scrnum++)
- {
- if (ScreenList[scrnum] != NULL)
- {
- theScreen = ScreenList[scrnum];
- theWindow = theScreen->TwmRoot.next;
+ for (scrnum = 0; scrnum < NumScreens && success; scrnum++) {
+ if (ScreenList[scrnum] != NULL) {
+ theScreen = ScreenList[scrnum];
+ theWindow = theScreen->TwmRoot.next;
- while (theWindow && success)
- {
- clientId = GetClientID (theWindow->w);
- windowRole = GetWindowRole (theWindow->w);
+ while (theWindow && success) {
+ clientId = GetClientID(theWindow->w);
+ windowRole = GetWindowRole(theWindow->w);
- if (!WriteWinConfigEntry (configFile, theWindow,
- clientId, windowRole))
- success = False;
+ if (!WriteWinConfigEntry(configFile, theWindow,
+ clientId, windowRole))
+ success = False;
- if (clientId)
- XFree (clientId);
+ if (clientId)
+ XFree(clientId);
- if (windowRole)
- XFree (windowRole);
+ if (windowRole)
+ XFree(windowRole);
- theWindow = theWindow->next;
- }
- }
+ theWindow = theWindow->next;
+ }
+ }
}
prop1.name = strdup(SmRestartCommand);
prop1.type = strdup(SmLISTofARRAY8);
- prop1.vals = malloc ((size_t)(Argc + 4) * sizeof (SmPropValue));
+ prop1.vals = malloc((size_t) (Argc + 4) * sizeof(SmPropValue));
- if (!prop1.vals)
- {
- success = False;
- goto bad;
+ if (!prop1.vals) {
+ success = False;
+ goto bad;
}
numVals = 0;
- for (i = 0; i < Argc; i++)
- {
- if (strcmp (Argv[i], "-clientId") == 0 ||
- strcmp (Argv[i], "-restore") == 0)
- {
- i++;
- }
- else
- {
- prop1.vals[numVals].value = (SmPointer) Argv[i];
- prop1.vals[numVals++].length = (int)strlen (Argv[i]);
- }
+ for (i = 0; i < Argc; i++) {
+ if (strcmp(Argv[i], "-clientId") == 0 ||
+ strcmp(Argv[i], "-restore") == 0) {
+ i++;
+ }
+ else {
+ prop1.vals[numVals].value = (SmPointer) Argv[i];
+ prop1.vals[numVals++].length = (int) strlen(Argv[i]);
+ }
}
prop1.vals[numVals].value = strdup("-clientId");
prop1.vals[numVals++].length = 9;
prop1.vals[numVals].value = strdup(twm_clientId);
- prop1.vals[numVals++].length = (int)strlen (twm_clientId);
+ prop1.vals[numVals++].length = (int) strlen(twm_clientId);
prop1.vals[numVals].value = strdup("-restore");
prop1.vals[numVals++].length = 8;
prop1.vals[numVals].value = strdup(filename);
- prop1.vals[numVals++].length = (int)strlen (filename);
+ prop1.vals[numVals++].length = (int) strlen(filename);
prop1.num_vals = numVals;
- snprintf (discardCommand, sizeof(discardCommand), "rm %s", filename);
+ snprintf(discardCommand, sizeof(discardCommand), "rm %s", filename);
prop2.name = strdup(SmDiscardCommand);
prop2.type = strdup(SmARRAY8);
prop2.num_vals = 1;
prop2.vals = &prop2val;
prop2val.value = (SmPointer) discardCommand;
- prop2val.length = (int)strlen (discardCommand);
+ prop2val.length = (int) strlen(discardCommand);
props[0] = &prop1;
props[1] = &prop2;
- SmcSetProperties (smcConn2, 2, props);
- free (prop1.vals);
+ SmcSetProperties(smcConn2, 2, props);
+ free(prop1.vals);
bad:
- SmcSaveYourselfDone (smcConn2, success);
+ SmcSaveYourselfDone(smcConn2, success);
sent_save_done = 1;
if (configFile)
- fclose (configFile);
+ fclose(configFile);
if (filename)
- free (filename);
+ free(filename);
}
-
-
static void
-SaveYourselfCB (
- SmcConn smcConn2,
- SmPointer clientData _X_UNUSED,
- int saveType _X_UNUSED,
- Bool shutdown _X_UNUSED,
- int interactStyle _X_UNUSED,
- Bool fast _X_UNUSED)
+SaveYourselfCB(SmcConn smcConn2,
+ SmPointer clientData _X_UNUSED,
+ int saveType _X_UNUSED,
+ Bool shutdown _X_UNUSED,
+ int interactStyle _X_UNUSED, Bool fast _X_UNUSED)
{
- if (!SmcRequestSaveYourselfPhase2 (smcConn2, SaveYourselfPhase2CB, NULL))
- {
- SmcSaveYourselfDone (smcConn2, False);
- sent_save_done = 1;
+ if (!SmcRequestSaveYourselfPhase2(smcConn2, SaveYourselfPhase2CB, NULL)) {
+ SmcSaveYourselfDone(smcConn2, False);
+ sent_save_done = 1;
}
else
- sent_save_done = 0;
+ sent_save_done = 0;
}
-
-
static void
-DieCB (SmcConn smcConn2, SmPointer clientData _X_UNUSED)
+DieCB(SmcConn smcConn2, SmPointer clientData _X_UNUSED)
{
- SmcCloseConnection (smcConn2, 0, NULL);
- XtRemoveInput (iceInputId);
+ SmcCloseConnection(smcConn2, 0, NULL);
+ XtRemoveInput(iceInputId);
Done(NULL, NULL);
}
-
-
static void
-SaveCompleteCB (SmcConn smcConnm _X_UNUSED, SmPointer clientData _X_UNUSED)
+SaveCompleteCB(SmcConn smcConnm _X_UNUSED, SmPointer clientData _X_UNUSED)
{
;
}
-
-
static void
-ShutdownCancelledCB (SmcConn smcConn2, SmPointer clientData _X_UNUSED)
+ShutdownCancelledCB(SmcConn smcConn2, SmPointer clientData _X_UNUSED)
{
- if (!sent_save_done)
- {
- SmcSaveYourselfDone (smcConn2, False);
- sent_save_done = 1;
+ if (!sent_save_done) {
+ SmcSaveYourselfDone(smcConn2, False);
+ sent_save_done = 1;
}
}
-
-
static void
-ProcessIceMsgProc (XtPointer client_data, int *source _X_UNUSED, XtInputId *id _X_UNUSED)
+ProcessIceMsgProc(XtPointer client_data, int *source _X_UNUSED,
+ XtInputId *id _X_UNUSED)
{
- IceConn ice_conn = (IceConn) client_data;
+ IceConn ice_conn = (IceConn) client_data;
- IceProcessMessages (ice_conn, NULL, NULL);
+ IceProcessMessages(ice_conn, NULL, NULL);
}
-
-
void
-ConnectToSessionManager (char *previous_id)
+ConnectToSessionManager(char *previous_id)
{
char errorMsg[256];
unsigned long mask;
@@ -965,7 +882,7 @@ ConnectToSessionManager (char *previous_id)
IceConn iceConn;
mask = SmcSaveYourselfProcMask | SmcDieProcMask |
- SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask;
+ SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask;
callbacks.save_yourself.callback = SaveYourselfCB;
callbacks.save_yourself.client_data = (SmPointer) NULL;
@@ -979,29 +896,21 @@ ConnectToSessionManager (char *previous_id)
callbacks.shutdown_cancelled.callback = ShutdownCancelledCB;
callbacks.shutdown_cancelled.client_data = (SmPointer) NULL;
- smcConn = SmcOpenConnection (
- NULL, /* use SESSION_MANAGER env */
- (SmPointer) appContext,
- SmProtoMajor,
- SmProtoMinor,
- mask,
- &callbacks,
- previous_id,
- &twm_clientId,
- 256, errorMsg);
+ smcConn = SmcOpenConnection(NULL, /* use SESSION_MANAGER env */
+ (SmPointer) appContext,
+ SmProtoMajor,
+ SmProtoMinor,
+ mask,
+ &callbacks,
+ previous_id, &twm_clientId, 256, errorMsg);
if (smcConn == NULL)
- return;
+ return;
- iceConn = SmcGetIceConnection (smcConn);
+ iceConn = SmcGetIceConnection(smcConn);
- iceInputId = XtAppAddInput (
- appContext,
- IceConnectionNumber (iceConn),
- (XtPointer) XtInputReadMask,
- ProcessIceMsgProc,
- (XtPointer) iceConn);
+ iceInputId = XtAppAddInput(appContext,
+ IceConnectionNumber(iceConn),
+ (XtPointer) XtInputReadMask,
+ ProcessIceMsgProc, (XtPointer) iceConn);
}
-
-
-