diff -Naurp gnome-session-2.22.1.1/gnome-session/main.c gnome-session-2.22.1.1-patched/gnome-session/main.c --- gnome-session-2.22.1.1/gnome-session/main.c 2008-04-10 16:32:20.000000000 +0200 +++ gnome-session-2.22.1.1-patched/gnome-session/main.c 2008-04-21 12:38:40.112936000 +0200 @@ -41,12 +41,16 @@ #include #include +#include + #include "manager.h" #include "ice.h" #include "save.h" #include "command.h" #include "splash-widget.h" #include "util.h" +#include "prop.h" +#include "session.h" #include "gsm-dbus.h" #include "gsm-sound.h" #include "gsm-gsd.h" @@ -600,6 +604,84 @@ gsm_shutdown_gconfd (void) g_free (command); } +static void +fix_wm (Session *session) +{ + GSList *cl, *p; + Client *client = NULL; + SmProp *prop = NULL; + + for (cl = session->client_list; cl; cl = cl->next) + { + client = cl->data; + if (client->match_rule != MATCH_ID) + continue; + + prop = find_property_by_name (client, SmRestartCommand); + if (!prop) + continue; + + if (!strcmp (prop->vals[0].value, "gnome-wm")) + return; + else if (!strcmp (prop->vals[0].value, "metacity") || + !strcmp (prop->vals[0].value, "compiz")) + break; + } + + if (!cl) + return; + + if (VendorRelease (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())) != 70000001) + { + /* Xorg */ + if (!strcmp (prop->vals[0].value, "metacity")) + return; + } + else + { + /* Xgl */ + if (!strcmp (prop->vals[0].value, "compiz")) + return; + } + + /* At this point, either client is compiz and we're using Xorg, or + * client is metacity and we're using Xgl. Either way, replace it + * with gnome-wm. + */ + + for (p = client->properties; p; p = p->next) + SmFreeProperty (p->data); + g_slist_free (client->properties); + + client->properties = NULL; + + prop = malloc (sizeof (SmProp)); + prop->name = strdup (SmRestartCommand); + prop->type = strdup (SmLISTofARRAY8); + prop->num_vals = 5; + prop->vals = malloc (5 * sizeof (SmPropValue)); + prop->vals[0].value = strdup ("gnome-wm"); + prop->vals[0].length = strlen (prop->vals[0].value); + prop->vals[1].value = strdup ("--default-wm"); + prop->vals[1].length = strlen (prop->vals[1].value); + prop->vals[2].value = strdup ("gnome-wm"); + prop->vals[2].length = strlen (prop->vals[2].value); + prop->vals[3].value = strdup ("--sm-client-id"); + prop->vals[3].length = strlen (prop->vals[3].value); + prop->vals[4].value = strdup (client->id); + prop->vals[4].length = strlen (prop->vals[4].value); + client->properties = g_slist_prepend (client->properties, prop); + + prop = malloc (sizeof (SmProp)); + prop->name = strdup (GsmPriority); + prop->type = strdup (SmCARD8); + prop->num_vals = 1; + prop->vals = malloc (sizeof (SmPropValue)); + prop->vals[0].value = calloc (2, 1); + prop->vals[0].length = 1; + client->properties = g_slist_prepend (client->properties, prop); +} + int main (int argc, char *argv[]) { @@ -777,6 +859,8 @@ main (int argc, char *argv[]) g_setenv ("GNOME_DESKTOP_SESSION_ID", session_name, TRUE); the_session = read_session (session_name); + fix_wm (the_session); + gsm_remote_desktop_start (); if (splashing)