summaryrefslogtreecommitdiff
path: root/capplets
diff options
context:
space:
mode:
authorSeth Nickell <snickell@stanford.edu>2002-06-03 00:27:15 +0000
committerSeth Nickell <seth@src.gnome.org>2002-06-03 00:27:15 +0000
commit0a5695f294b30d5aa7c70f5d2f745a8a740145b1 (patch)
treed808a55808b19195cbadb79bb64c428094d4fb79 /capplets
parenta1465dd2fc7b34f55558c63f27f52f0b4f3007a4 (diff)
downloadgnome-control-center-0a5695f294b30d5aa7c70f5d2f745a8a740145b1.tar.gz
Split code for changing window managers into libgnome-window-settings.
2002-06-02 Seth Nickell <snickell@stanford.edu> * Makefile.am: * gnome-window-properties.c: (wm_selection_changed), (wm_widget_add_wm), (update_gui), (apply_wm), (create_dialog), (main): Split code for changing window managers into libgnome-window-settings. This is so in the future we can potentially move this into gnome-settings-daemon, though for now its not robust enough that we really want to do that. * metacity-window-manager.c: (window_manager_new), (metacity_window_manager_init), (metacity_window_manager_finalize), (metacity_window_manager_class_init), (metacity_window_manager_get_type): * metacity-window-manager.h: Update to match changes to gnome-window-manager.h * wm-exec.c: * wm-list.c: * wm-properties.h: Move these into libgnome-window-settings. (Jacob, I did make dist, and then built the resulting tarball, hope I don't cause problems this time :-/)
Diffstat (limited to 'capplets')
-rw-r--r--capplets/windows/ChangeLog28
-rw-r--r--capplets/windows/Makefile.am10
-rw-r--r--capplets/windows/gnome-window-properties.c677
-rw-r--r--capplets/windows/metacity-window-manager.c83
-rw-r--r--capplets/windows/metacity-window-manager.h26
-rw-r--r--capplets/windows/wm-exec.c331
-rw-r--r--capplets/windows/wm-list.c575
-rw-r--r--capplets/windows/wm-properties.h63
8 files changed, 133 insertions, 1660 deletions
diff --git a/capplets/windows/ChangeLog b/capplets/windows/ChangeLog
index 4f1e16c68..19a9a64a8 100644
--- a/capplets/windows/ChangeLog
+++ b/capplets/windows/ChangeLog
@@ -1,3 +1,31 @@
+2002-06-02 Seth Nickell <snickell@stanford.edu>
+
+ * Makefile.am:
+ * gnome-window-properties.c: (wm_selection_changed),
+ (wm_widget_add_wm), (update_gui), (apply_wm), (create_dialog),
+ (main):
+
+ Split code for changing window managers into libgnome-window-settings.
+ This is so in the future we can potentially move this into gnome-settings-daemon,
+ though for now its not robust enough that we really want to do that.
+
+ * metacity-window-manager.c: (window_manager_new),
+ (metacity_window_manager_init), (metacity_window_manager_finalize),
+ (metacity_window_manager_class_init),
+ (metacity_window_manager_get_type):
+ * metacity-window-manager.h:
+
+ Update to match changes to gnome-window-manager.h
+
+ * wm-exec.c:
+ * wm-list.c:
+ * wm-properties.h:
+
+ Move these into libgnome-window-settings.
+
+ (Jacob, I did make dist, and then built the resulting tarball, hope I
+ don't cause problems this time :-/)
+
2002-05-30 Kjartan Maraas <kmaraas@gnome.org>
* gnome-window-properties.c (main): Use GETTEXT_PACKAGE, not PACKAGE.
diff --git a/capplets/windows/Makefile.am b/capplets/windows/Makefile.am
index a00ad7242..8ef608930 100644
--- a/capplets/windows/Makefile.am
+++ b/capplets/windows/Makefile.am
@@ -1,13 +1,11 @@
bin_PROGRAMS = gnome-window-properties
gnome_window_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS) \
- $(top_builddir)/libwindow-settings/libwindow-settings.la
+ -L$(top_builddir)/libwindow-settings/ -lgnome-window-settings
gnome_window_properties_SOURCES = \
- gnome-window-properties.c \
- wm-properties.h \
- wm-exec.c \
- wm-list.c
+ gnome-window-properties.c
+
wms_flags = -export_dynamic -avoid-version
wmsdir = $(libdir)/window-manager-settings/
@@ -21,7 +19,7 @@ libmetacity_la_SOURCES = \
libmetacity_la_LDFLAGS = $(wms_flags)
-libmetacity_la_LIBADD =
+#libmetacity_la_LIBADD = $(top_builddir)/libwindow-settings/libwindow-settings.la
@INTLTOOL_DESKTOP_RULE@
diff --git a/capplets/windows/gnome-window-properties.c b/capplets/windows/gnome-window-properties.c
index d40645ad6..a19982a66 100644
--- a/capplets/windows/gnome-window-properties.c
+++ b/capplets/windows/gnome-window-properties.c
@@ -13,20 +13,18 @@
#include <glade/glade.h>
#include <ctype.h>
+#include <gmodule.h>
+
#include "capplet-util.h"
#include "gconf-property-editor.h"
-#include "wm-properties.h"
-//#include "gnome-startup.h"
+#include <gnome-wm-manager.h>
#define THEME_KEY "/desktop/gnome/applications/window_manager/theme"
#define TITLEBAR_FONT_KEY "/desktop/gnome/applications/window_manager/titlebar_font"
#define FOCUS_FOLLOWS_MOUSE_KEY "/desktop/gnome/applications/window_manager/focus_follows_mouse"
-/* prototypes */
-static void restart (gboolean force);
-static void revert_callback (void);
-static void cancel_callback (void);
+GnomeClient *client = NULL;
/* structures */
@@ -39,116 +37,28 @@ typedef struct {
} WMDialog;
/* vars. */
-static GtkWidget *capplet;
static GtkWidget *wm_widget;
static GtkWidget *apply_now_button;
static GtkWidget *properties_box;
-static WindowManager *selected_wm = NULL;
-
-static GtkWidget *restart_dialog = NULL;
-static GtkWidget *restart_label = NULL;
-guint restart_dialog_timeout;
-gchar *restart_name = NULL;
-
-/* Time until dialog times out */
-gdouble restart_remaining_time;
-gint restart_displayed_time;
-
-GnomeClient *client = NULL;
-gchar *argv0;
-
-/* Enumeration describing the current state of the capplet.
- * in any other state than idle, all controls are !sensitive.
- */
-typedef enum {
- STATE_IDLE,
- STATE_TRY,
- STATE_REVERT,
- STATE_OK,
- STATE_CANCEL,
- STATE_TRY_REVERT, /* Currently trying, revert afterwards */
- STATE_TRY_CANCEL /* Currently trying, cancel afterwards */
-} StateType;
-
-/* The possible transitions between states are described below.
- *
-
- * operation | try revert ok cancel finish
- * ===========+=================================================
- * IDLE | TRY REVERT OK CANCEL
- * TRY | TRY_REVERT OK TRY_CANCEL IDLE
- * REVERT | CANCEL CANCEL IDLE
- * OK | (quit)
- * CANCEL | (quit)
- * TRY_REVERT | TRY_CANCEL TRY_CANCEL REVERT
- * TRY_CANCEL | CANCEL
- *
- * When a restart fails, there are three cases
- *
- * (1) The failure was because the current window manager didn't
- * die. We inform the user of the situation, and then
- * abort the operation.
- *
- * (2) The window manager didn't start, and we don't have a
- * a fallback. We pop up a error dialog, tell the user
- * to start a new window manager, and abort the operation.
- *
- * (3) The window manager didn't start, and we previously had a
- * window manager runnning. We pop up a warning dialog,
- * then try to go back to the old window manager.
- *
- * operation | (1) (2) (3)
- * ===========+=================================================
- * IDLE |
- * TRY | IDLE IDLE TRY
- * REVERT | IDLE IDLE REVERT
- * OK | (quit) (quit) OK
- * CANCEL | (quit) (quit) CANCEL
- * TRY_REVERT | REVERT REVERT REVERT
- * TRY_CANCEL | CANCEL CANCEL CANCEL
- */
-
-
-
-/* Current state
- */
-StateType state = STATE_IDLE;
-
-/* Set TRUE when we've exited the main loop, but restart_pending
- */
-gboolean quit_pending = FALSE;
-
-/* Set TRUE when we're waiting for the WM to restart
- */
-gboolean restart_pending = FALSE;
-
-/* Set TRUE while we are filling in the list
- */
-gboolean in_fill = FALSE;
-
-static gint cap_session_init = 0;
-static struct poptOption cap_options[] = {
- {"init-session-settings", '\0', POPT_ARG_NONE, &cap_session_init, 0,
- N_("Initialize session settings"), NULL},
- {NULL, '\0', 0, NULL, 0}
-};
-
static void state_changed (void);
-static void update_session (void);
static GtkWidget *wm_menu;
static GtkWidget *option_menu;
static GList *wm_menu_window_managers;
+GnomeWindowManager *selected_wm;
+
+gboolean in_fill;
+
static void
wm_selection_changed (GtkOptionMenu *option_menu, gpointer data)
{
int index;
- WindowManager *wm;
+ GnomeWindowManager *wm;
index = gtk_option_menu_get_history (option_menu);
- wm = (WindowManager *) g_list_nth (wm_menu_window_managers, index)->data;
+ wm = (GnomeWindowManager *) g_list_nth (wm_menu_window_managers, index)->data;
if (!in_fill) {
if (wm != selected_wm) {
@@ -182,9 +92,12 @@ wm_widget_new ()
}
static void
-wm_widget_add_wm (WindowManager *wm, const char *row_text)
+wm_widget_add_wm (GnomeWindowManager *wm)
{
GtkWidget *menu_item;
+ const char *row_text;
+
+ row_text = gnome_window_manager_get_name (wm);
menu_item = gtk_menu_item_new_with_label (row_text);
gtk_widget_show_all (menu_item);
@@ -222,511 +135,32 @@ state_changed (void)
}
static void
-restart_label_update (void)
-{
- gchar *tmp;
-
- if ((gint)restart_remaining_time != restart_displayed_time) {
- restart_displayed_time = restart_remaining_time;
-
- tmp = g_strdup_printf (_("Starting %s\n"
- "(%d seconds left before operation times out)"),
- restart_name,
- restart_displayed_time);
- gtk_label_set_text (GTK_LABEL (restart_label), tmp);
- g_free (tmp);
- }
-}
-
-static gboolean
-restart_dialog_raise (gpointer data)
-{
- if (restart_dialog && GTK_WIDGET_REALIZED (restart_dialog)) {
- restart_remaining_time -= 0.25;
- restart_label_update();
- gdk_window_raise (restart_dialog->window);
- }
- return TRUE;
-}
-
-static void
-restart_dialog_destroyed (GtkWidget *widget)
-{
- if (restart_dialog_timeout) {
- gtk_timeout_remove (restart_dialog_timeout);
- restart_dialog_timeout = 0;
- }
-
- restart_dialog = NULL;
-}
-
-static void
-show_restart_dialog (gchar *name)
-{
- GtkWidget *hbox;
- GtkWidget *frame;
- GtkWidget *pixmap;
- gchar *tmp;
-
- if (!restart_dialog) {
- restart_dialog = gtk_window_new (GTK_WINDOW_POPUP);
- gtk_window_set_position (GTK_WINDOW (restart_dialog),
- GTK_WIN_POS_CENTER);
-
- gtk_signal_connect (GTK_OBJECT (restart_dialog), "destroy",
- GTK_SIGNAL_FUNC (restart_dialog_destroyed),
- &restart_dialog);
- frame = gtk_frame_new (NULL);
- gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
- gtk_container_add (GTK_CONTAINER (restart_dialog), frame);
-
- hbox = gtk_hbox_new (FALSE, GNOME_PAD);
- gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD);
- gtk_container_add (GTK_CONTAINER (frame), hbox);
-
- tmp = gnome_unconditional_pixmap_file("gnome-info.png");
- if (tmp) {
- pixmap = gnome_pixmap_new_from_file(tmp);
- g_free(tmp);
- gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, FALSE, 0);
- }
-
- restart_label = gtk_label_new ("");
- gtk_box_pack_start (GTK_BOX (hbox), restart_label, FALSE, FALSE, GNOME_PAD);
- }
-
- if (!restart_dialog_timeout) {
- restart_dialog_timeout = gtk_timeout_add (250, restart_dialog_raise, NULL);
- }
-
- restart_remaining_time = 10.0;
- restart_displayed_time = -1;
- if (restart_name)
- g_free (restart_name);
-
- restart_name = g_strdup (name);
- restart_label_update ();
-
- gtk_widget_show_all (restart_dialog);
-}
-
-static void
-hide_restart_dialog (void)
-{
- if (restart_dialog)
- gtk_widget_destroy (restart_dialog);
-}
-
-static void
-update_session (void)
-{
- WindowManager *current_wm = wm_list_get_current();
- gchar *session_args[3];
-
- if (!current_wm)
- return;
-
- if (current_wm->session_managed) {
- gnome_client_set_restart_style (client,
- GNOME_RESTART_NEVER);
-
- } else {
- session_args[0] = argv0;
- session_args[1] = "--init-session-settings";
- session_args[2] = NULL;
- /* We use a priority of 15 so that we start after
- * session-managed WM's (priority 10), for safety.
- */
- gnome_client_set_priority (client, 15);
- gnome_client_set_restart_style (client,
- GNOME_RESTART_ANYWAY);
- gnome_client_set_restart_command (client, 2,
- session_args);
- }
-
- gnome_client_flush (client);
-}
-
-static void
-init_session (void)
-{
- GnomeClientFlags flags;
- gint token;
-
- return;
-
- client = gnome_master_client ();
- flags = gnome_client_get_flags (client);
-
- if (flags & GNOME_CLIENT_IS_CONNECTED) {
- /*token = gnome_startup_acquire_token("GNOME_WM_PROPERTIES",
- gnome_client_get_id(client));*/
-
- if (token)
- update_session();
- else {
- gnome_client_set_restart_style (client,
- GNOME_RESTART_NEVER);
- gnome_client_flush (client);
- }
- }
-}
-
-static void
update_gui (void)
{
GList *tmp_list;
+ GnomeWindowManager *wm;
wm_widget_clear ();
in_fill = TRUE;
- tmp_list = window_managers;
- while (tmp_list) {
- gchar *row_text;
- WindowManager *wm;
-
- wm = tmp_list->data;
+ tmp_list = gnome_wm_manager_get_list ();
- if (wm->is_user && !wm->is_present) {
- row_text = g_strconcat (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_NAME),
- _(" (Not found)"), NULL);
- } else {
- row_text = g_strdup (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_NAME));
- }
+ printf ("got a list of %d wms\n", g_list_length (tmp_list));
- wm_widget_add_wm (wm, row_text);
-
- g_free (row_text);
-
- tmp_list = tmp_list->next;
+ for (tmp_list = gnome_wm_manager_get_list (); tmp_list != NULL; tmp_list = tmp_list->next) {
+ wm = tmp_list->data;
+ wm_widget_add_wm (wm);
}
in_fill = FALSE;
}
-static void
-init_callback (WMResult result, gpointer data)
-{
- switch (result) {
- case WM_SUCCESS:
- break;
- case WM_ALREADY_RUNNING:
- g_warning (_("wm-properties-capplet: Unable to initialize window manager.\n"
- "\tAnother window manager is already running and could not be killed\n"));
- break;
- case WM_CANT_START:
- g_warning (_("wm-properties-capplet: Unable to initialize window manager.\n"
- "\t'%s' didn't start\n"), (gchar *)data);
- break;
- }
-
- g_free (data);
- gtk_main_quit ();
-}
-
-static void
-restart_finalize ()
-{
- wm_list_set_current (selected_wm);
- hide_restart_dialog();
-
- switch (state) {
- case STATE_TRY:
- case STATE_REVERT:
- gtk_widget_set_sensitive (capplet, TRUE);
- update_gui();
- state = STATE_IDLE;
- break;
-
- case STATE_OK:
- case STATE_CANCEL:
- if (quit_pending)
- gtk_main_quit();
- break;
- default:
- g_warning ("Finalize in state %d!!!\n", state);
- return;
- }
-
- restart_pending = FALSE;
-}
-
-static void
-restart_failure (WMResult reason)
-{
- GtkWidget *msgbox;
- WindowManager *current_wm;
- gchar *msg = NULL;
- gboolean modal = FALSE;
-
- current_wm = wm_list_get_current ();
-
- /* Did the previous window manager not die?
- */
- if (reason == WM_ALREADY_RUNNING) {
- msg = g_strdup (_("Previous window manager did not die\n"));
-
- switch (state) {
- case STATE_TRY:
- case STATE_REVERT:
- case STATE_OK:
- case STATE_CANCEL:
- selected_wm = current_wm;
- restart_finalize ();
- break;
-
- case STATE_TRY_REVERT:
- revert_callback ();
- break;
-
- case STATE_TRY_CANCEL:
- cancel_callback ();
- break;
-
- default:
- g_warning ("Failure in state %d!!!\n", state);
- return;
- }
- }
- /* Is there something reasonable to try to fall back to?
- */
- else if (current_wm != selected_wm) {
-
- switch (state) {
- case STATE_TRY:
- case STATE_REVERT:
- case STATE_OK:
- case STATE_CANCEL:
- msg = g_strdup_printf (_("Could not start '%s'.\n"
- "Falling back to previous window manager '%s'\n"),
- selected_wm?gnome_desktop_item_get_string (selected_wm->dentry, GNOME_DESKTOP_ITEM_NAME):"Unknown",
- current_wm?gnome_desktop_item_get_string (current_wm->dentry, GNOME_DESKTOP_ITEM_NAME):"Unknown");
- selected_wm = current_wm;
- restart(TRUE);
- break;
-
- case STATE_TRY_REVERT:
- revert_callback ();
- break;
-
- case STATE_TRY_CANCEL:
- cancel_callback ();
- break;
-
- default:
- g_warning ("Failure in state %d!!!\n", state);
- return;
- }
-
- /* Give up */
- } else {
-
- switch (state) {
- case STATE_OK:
- case STATE_CANCEL:
- modal = TRUE; /* prevent an immediate exit */
- /* Fall through */
- case STATE_TRY:
- case STATE_REVERT:
- msg = g_strdup (_("Could not start fallback window manager.\n"
- "Please run a window manager manually. You can\n"
- "do this by selecting \"Run Program\" in the\n"
- "foot menu\n"));
-
- restart_finalize();
- break;
-
- case STATE_TRY_REVERT:
- revert_callback ();
- break;
-
- case STATE_TRY_CANCEL:
- cancel_callback ();
- break;
-
- default:
- g_warning ("Failure in state %d!!!\n", state);
- return;
- }
- }
-
- if (msg) {
- msgbox = gnome_message_box_new (msg,
- GNOME_MESSAGE_BOX_ERROR,
- _("OK"), NULL);
- if (modal)
- gnome_dialog_run (GNOME_DIALOG (msgbox));
- else
- gtk_widget_show (msgbox);
- g_free (msg);
- }
-}
-
-static void
-show_restart_info (void)
-{
- gchar *save_session;
-
- save_session = gnome_is_program_in_path ("save-session");
-
- if (save_session != NULL) {
- system (save_session);
- }
-
- g_free (save_session);
-}
-
-static void
-restart_finish (void)
-{
- switch (state) {
- case STATE_TRY:
- case STATE_REVERT:
- case STATE_OK:
- case STATE_CANCEL:
- hide_restart_dialog();
- show_restart_info ();
- restart_finalize();
- break;
-
- case STATE_TRY_REVERT:
- revert_callback ();
- break;
-
- case STATE_TRY_CANCEL:
- cancel_callback ();
- break;
-
- default:
- g_warning ("Finished in state %d!!!\n", state);
- return;
- }
-}
-
-static void
-restart_callback (WMResult result, gpointer data)
-{
- if (result == WM_SUCCESS)
- restart_finish ();
- else
- restart_failure (result);
-}
-
-static void
-restart (gboolean force)
-{
- WindowManager *current_wm = wm_list_get_current(), *mywm;
- static gboolean last_try_was_twm = FALSE;
- GnomeDesktopItem *twm_dentry = gnome_desktop_item_new ();
- WindowManager twm_fallback = {twm_dentry, "twm", "twm", 0, 0, 1, 0};
-
- gnome_desktop_item_set_entry_type (twm_dentry, GNOME_DESKTOP_ITEM_TYPE_APPLICATION);
- gnome_desktop_item_set_string (twm_dentry,
- GNOME_DESKTOP_ITEM_NAME, "twm");
- gnome_desktop_item_set_string (twm_dentry,
- GNOME_DESKTOP_ITEM_COMMENT, "twm");
- gnome_desktop_item_set_string (twm_dentry,
- GNOME_DESKTOP_ITEM_EXEC, "twm");
-
- if(selected_wm) {
- last_try_was_twm = FALSE;
- mywm = selected_wm;
- } else if(!last_try_was_twm) {
- last_try_was_twm = TRUE;
- mywm = (WindowManager*)&twm_fallback;
- } else {
- restart_finalize();
- gnome_desktop_item_unref (twm_dentry);
- return;
- }
-
- if (force || current_wm != mywm) {
- show_restart_dialog (g_strdup (gnome_desktop_item_get_string (mywm->dentry, GNOME_DESKTOP_ITEM_NAME)));
- if (state != STATE_OK && state != STATE_CANCEL)
- gtk_widget_set_sensitive (capplet, FALSE);
- restart_pending = TRUE;
- wm_restart (mywm,
- capplet->window,
- restart_callback,
- NULL);
- } else {
- restart_finalize ();
- }
-
- gnome_desktop_item_unref (twm_dentry);
-}
-
-static void
-revert_callback (void)
-{
- StateType old_state = state;
-
- switch (state) {
- case STATE_IDLE:
- case STATE_TRY_REVERT:
- wm_list_revert();
- selected_wm = wm_list_get_revert();
- state = STATE_REVERT;
-
- restart (old_state == STATE_TRY_REVERT);
- update_gui();
-
- break;
-
- case STATE_TRY:
- state = STATE_TRY_REVERT;
- break;
-
- default:
- g_warning ("revert callback in state %d!!!\n", state);
- return;
- }
-}
-
-static void
-cancel_callback (void)
-{
- StateType old_state = state;
-
- switch (state) {
- case STATE_IDLE:
- case STATE_TRY_CANCEL:
- wm_list_revert();
- selected_wm = wm_list_get_revert();
- state = STATE_CANCEL;
-
- restart (old_state == STATE_TRY_CANCEL);
-
- break;
-
- case STATE_TRY:
- state = STATE_TRY_CANCEL;
- break;
-
- case STATE_REVERT:
- state = STATE_CANCEL;
- break;
-
- case STATE_TRY_REVERT:
- state = STATE_TRY_CANCEL;
- break;
-
- default:
- g_warning ("ok callback in state %d!!!\n", state);
- return;
- }
-}
-
static void
apply_wm (GObject *object, gpointer data)
{
- state = STATE_TRY;
- restart(FALSE);
- wm_list_set_current (selected_wm);
- wm_list_save ();
- update_session ();
+ gnome_wm_manager_set_current (selected_wm);
}
static GladeXML *
@@ -747,8 +181,6 @@ create_dialog (void)
gtk_box_pack_start (GTK_BOX (WID ("wm_widget_box")), wm_widget, TRUE, TRUE, 0);
- update_gui();
-
return dialog;
}
@@ -766,6 +198,8 @@ setup_dialog (GladeXML *dialog)
NULL);
}
+
+
int
main (int argc, char **argv)
{
@@ -776,53 +210,34 @@ main (int argc, char **argv)
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
- argv0 = g_strdup (argv[0]);
gnome_program_init ("wm-properties", VERSION,
LIBGNOMEUI_MODULE, argc, argv,
- GNOME_PARAM_POPT_TABLE, &cap_options,
+ GNOME_PARAM_POPT_TABLE,
NULL);
- /* Read in the list of window managers, and the current
- * window manager
- */
- wm_list_init();
- selected_wm = wm_list_get_current();
-
- if (!cap_session_init)
- {
- init_session();
- dialog = create_dialog ();
- setup_dialog (dialog);
-
- dialog_win = gtk_dialog_new_with_buttons
- (_("Window Preferences"), NULL, -1,
- GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
- NULL);
- g_signal_connect (G_OBJECT (dialog_win), "response", (GCallback)response_cb, NULL);
-
- capplet = dialog_win;
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_win)->vbox), WID ("prefs_widget"), TRUE, TRUE, GNOME_PAD_SMALL);
- gtk_widget_show_all (dialog_win);
+ dialog = create_dialog ();
+ setup_dialog (dialog);
- gtk_main ();
-
- if (restart_pending) {
- quit_pending = TRUE;
- gtk_main();
- }
- }
- else {
- if (selected_wm &&
- !selected_wm->session_managed &&
- !wm_is_running()) {
-
- wm_restart (selected_wm, NULL, init_callback,
- g_strdup (gnome_desktop_item_get_string (selected_wm->dentry, GNOME_DESKTOP_ITEM_NAME)));
- gtk_main ();
- }
-
- init_session();
- }
+ dialog_win = gtk_dialog_new_with_buttons
+ (_("Window Preferences"), NULL, -1,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+ NULL);
+ g_signal_connect (G_OBJECT (dialog_win), "response", (GCallback)response_cb, NULL);
+
+ gnome_wm_manager_init (dialog_win);
+ update_gui ();
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_win)->vbox), WID ("prefs_widget"), TRUE, TRUE, GNOME_PAD_SMALL);
+ gtk_widget_show_all (dialog_win);
+
+ gtk_main ();
+
+ /* FIXME: we need to handle this through the library somehow
+ if (restart_pending) {
+ quit_pending = TRUE;
+ gtk_main();
+ }
+ */
return 0;
}
diff --git a/capplets/windows/metacity-window-manager.c b/capplets/windows/metacity-window-manager.c
index 7e34133ba..12d887b97 100644
--- a/capplets/windows/metacity-window-manager.c
+++ b/capplets/windows/metacity-window-manager.c
@@ -1,6 +1,6 @@
#include "metacity-window-manager.h"
-static GnomeWindowManagerClass *parent_class = NULL;
+static GnomeWindowManagerClass *parent_class;
struct _MetacityWindowManagerPrivate {
};
@@ -15,7 +15,6 @@ window_manager_new (void)
return wm;
}
-
static void
metacity_set_theme (const char *theme_name)
{
@@ -46,65 +45,75 @@ metacity_set_focus_follows_mouse (gboolean focus_follows_mouse)
}
+
static void
-finalize (GObject *object)
+metacity_window_manager_init (MetacityWindowManager *metacity_window_manager, MetacityWindowManagerClass *class)
{
- MetacityWindowManager *wm;
-
- wm = METACITY_WINDOW_MANAGER (object);
- if (wm->private == NULL) {
- return;
- }
-
- g_free (wm->private);
- wm->private = NULL;
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ metacity_window_manager->p = g_new0 (MetacityWindowManagerPrivate, 1);
}
static void
-class_init (MetacityWindowManagerClass *klass)
-
+metacity_window_manager_finalize (GObject *object)
{
- GObjectClass *object_class;
- GnomeWindowManagerClass *wm_class;
+ MetacityWindowManager *metacity_window_manager;
- object_class = G_OBJECT_CLASS (klass);
- wm_class = GNOME_WINDOW_MANAGER_CLASS (klass);
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (IS_METACITY_WINDOW_MANAGER (object));
- object_class->finalize = finalize;
+ metacity_window_manager = METACITY_WINDOW_MANAGER (object);
- wm_class->set_theme = metacity_set_theme;
- wm_class->get_theme_list = metacity_get_theme_list;
- wm_class->set_font = metacity_set_font;
- wm_class->get_focus_follows_mouse = metacity_get_focus_follows_mouse;
- wm_class->set_focus_follows_mouse = metacity_set_focus_follows_mouse;
+ g_free (metacity_window_manager->p);
- parent_class = g_type_class_peek_parent (klass);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
}
+
static void
-init (MetacityWindowManager *wm)
+metacity_window_manager_class_init (MetacityWindowManagerClass *class)
{
- wm->private = g_new (MetacityWindowManagerPrivate, 1);
+ GObjectClass *object_class;
+ GnomeWindowManagerClass *wm_class;
+
+ object_class = G_OBJECT_CLASS (class);
+ wm_class = GNOME_WINDOW_MANAGER_CLASS (class);
+
+ object_class->finalize = metacity_window_manager_finalize;
+
+ wm_class->set_theme = metacity_set_theme;
+ wm_class->get_theme_list = metacity_get_theme_list;
+ wm_class->set_font = metacity_set_font;
+ wm_class->get_focus_follows_mouse = metacity_get_focus_follows_mouse;
+ wm_class->set_focus_follows_mouse = metacity_set_focus_follows_mouse;
+
+ parent_class = g_type_class_peek_parent (class);
}
-/* API */
GType
metacity_window_manager_get_type (void)
{
- static GType type = 0;
+ static GType metacity_window_manager_type = 0;
- if (type == 0) {
- GTypeInfo info = {
+ if (!metacity_window_manager_type) {
+ static GTypeInfo metacity_window_manager_info = {
sizeof (MetacityWindowManagerClass),
- NULL, NULL, (GClassInitFunc) class_init, NULL, NULL,
- sizeof (MetacityWindowManager), 0, (GInstanceInitFunc) init,
+ NULL, /* GBaseInitFunc */
+ NULL, /* GBaseFinalizeFunc */
+ (GClassInitFunc) metacity_window_manager_class_init,
+ NULL, /* GClassFinalizeFunc */
+ NULL, /* user-supplied data */
+ sizeof (MetacityWindowManager),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) metacity_window_manager_init,
+ NULL
};
- type = g_type_register_static (METACITY_WINDOW_MANAGER_TYPE, "MetacityWindowManager", &info, 0);
+ metacity_window_manager_type =
+ g_type_register_static (gnome_window_manager_get_type (),
+ "MetacityWindowManager",
+ &metacity_window_manager_info, 0);
}
- return type;
+ return metacity_window_manager_type;
}
+
diff --git a/capplets/windows/metacity-window-manager.h b/capplets/windows/metacity-window-manager.h
index 793ef0bae..fb31463b5 100644
--- a/capplets/windows/metacity-window-manager.h
+++ b/capplets/windows/metacity-window-manager.h
@@ -1,37 +1,29 @@
#ifndef METACITY_WINDOW_MANAGER_H
#define METACITY_WINDOW_MANAGER_H
-#include <glib/gerror.h>
#include <glib-object.h>
-
#include "gnome-window-manager.h"
-G_BEGIN_DECLS
-
-#define METACITY_WINDOW_MANAGER_TYPE (metacity_window_manager_get_type ())
-#define METACITY_WINDOW_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), METACITY_WINDOW_MANAGER_TYPE, MetacityWindowManager))
-#define METACITY_WINDOW_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), METACITY_WINDOW_MANAGER_TYPE, MetacityWindowManagerClass))
-#define IS_METACITY_WINDOW_MANAGER(obj) (GTK_TYPE_CHECK_INSTANCE_TYPE ((obj), METACITY_WINDOW_MANAGER_TYPE))
-#define IS_METACITY_WINDOW_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), METACITY_WINDOW_MANAGER_TYPE))
-#define METACITY_WINDOW_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), METACITY_WINDOW_MANAGER_TYPE, MetacityWindowManagerClass))
+#define METACITY_WINDOW_MANAGER(obj) G_TYPE_CHECK_INSTANCE_CAST (obj, metacity_window_manager_get_type (), MetacityWindowManager)
+#define METACITY_WINDOW_MANAGER_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, metacity_window_manager_get_type (), MetacityWindowManagerClass)
+#define IS_METACITY_WINDOW_MANAGER(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, metacity_window_manager_get_type ())
typedef struct _MetacityWindowManager MetacityWindowManager;
typedef struct _MetacityWindowManagerClass MetacityWindowManagerClass;
+
typedef struct _MetacityWindowManagerPrivate MetacityWindowManagerPrivate;
struct _MetacityWindowManager
{
- GnomeWindowManager parent_instance;
- MetacityWindowManagerPrivate *private;
+ GnomeWindowManager parent;
+ MetacityWindowManagerPrivate *p;
};
struct _MetacityWindowManagerClass
{
- GnomeWindowManagerClass parent_class;
+ GnomeWindowManagerClass klass;
};
-GType metacity_window_manager_get_type (void);
-
-G_END_DECLS
+GType metacity_window_manager_get_type (void);
-#endif /* METACITY_WINDOW_MANAGER_H */
+#endif
diff --git a/capplets/windows/wm-exec.c b/capplets/windows/wm-exec.c
deleted file mode 100644
index f8d9356bf..000000000
--- a/capplets/windows/wm-exec.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-/* Copyright (C) 1998 Redhat Software Inc.
- * Code available under the Gnu GPL.
- * Authors: Owen Taylor <otaylor@redhat.com>
- */
-
-#include <gtk/gtk.h>
-#include <gdk/gdkx.h>
-#include <libgnome/libgnome.h>
-#include "wm-properties.h"
-
-typedef struct _RestartInfo RestartInfo;
-
-struct _RestartInfo {
- GnomeDesktopItem *dentry;
- gint retries;
- WMResultFunc callback;
- gpointer data;
-};
-
-gboolean
-wm_is_running (void)
-{
- gboolean result;
- guint old_mask;
- XWindowAttributes attrs;
-
- gdk_error_trap_push ();
-
- XGetWindowAttributes (GDK_DISPLAY(), GDK_ROOT_WINDOW(), &attrs);
-
- XSelectInput (GDK_DISPLAY(), GDK_ROOT_WINDOW(),
- SubstructureRedirectMask);
- XSync (GDK_DISPLAY(), False);
- if (gdk_error_trap_pop () == 0) {
- result = FALSE;
- XSelectInput (GDK_DISPLAY(), GDK_ROOT_WINDOW(),
- attrs.your_event_mask);
- } else
- result = TRUE;
-
-
- return result;
-}
-
-/* Cut and paste from gnome-libs/gnome_win_hints_wm_exists, except that we
- * return the xid instead of a window
- */
-static Window
-find_gnome_wm_window(void)
-{
- Atom r_type;
- int r_format;
- unsigned long count;
- unsigned long bytes_remain;
- unsigned char *prop, *prop2;
- GdkAtom cardinal_atom = gdk_atom_intern ("CARDINAL", FALSE);
-
- gdk_error_trap_push ();
- if (XGetWindowProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
- gdk_x11_atom_to_xatom (gdk_atom_intern ("_WIN_SUPPORTING_WM_CHECK", FALSE)),
- 0, 1, False, gdk_x11_atom_to_xatom (cardinal_atom),
- &r_type, &r_format,
- &count, &bytes_remain, &prop) == Success && prop)
- {
- if (r_type == gdk_x11_atom_to_xatom (cardinal_atom) && r_format == 32 && count == 1)
- {
- Window n = *(long *)prop;
- if (XGetWindowProperty(GDK_DISPLAY(), n,
- gdk_x11_atom_to_xatom (gdk_atom_intern ("_WIN_SUPPORTING_WM_CHECK", FALSE)),
- 0, 1, False, gdk_x11_atom_to_xatom (cardinal_atom),
- &r_type, &r_format, &count, &bytes_remain,
- &prop2) == Success && prop)
- {
- if (r_type == gdk_x11_atom_to_xatom (cardinal_atom) && r_format == 32 && count == 1)
- {
- XFree(prop);
- XFree(prop2);
- gdk_error_trap_pop ();
- return n;
- }
- XFree(prop2);
- }
- }
- XFree(prop);
- }
- gdk_error_trap_pop ();
- return None;
-}
-
-static Window
-find_wm_window_from_client (GdkWindow *client)
-{
- Window window, frame, parent, root;
- Window *children;
- unsigned int nchildren;
- gboolean needs_pop = TRUE;
-
- if (!client)
- return None;
-
- frame = None;
- window = GDK_WINDOW_XWINDOW (client);
-
- gdk_error_trap_push ();
-
- while (XQueryTree (GDK_DISPLAY(), window,
- &root, &parent, &children, &nchildren))
- {
- if (gdk_error_trap_pop != 0)
- {
- needs_pop = FALSE;
- break;
- }
-
- gdk_error_trap_push ();
-
- if (children)
- XFree(children);
-
- if (window == root)
- break;
-
- if (root == parent) {
- frame = window;
- break;
- }
- window = parent;
- }
-
- if (needs_pop)
- gdk_error_trap_pop ();
-
- return frame;
-}
-
-static gboolean
-window_has_wm_state (Window window)
-{
- Atom r_type;
- int r_format;
- unsigned long count;
- unsigned long bytes_remain;
- unsigned char *prop;
-
- if (XGetWindowProperty(GDK_DISPLAY(), window,
- gdk_x11_atom_to_xatom (gdk_atom_intern ("WM_STATE", FALSE)),
- 0, 0, False, AnyPropertyType,
- &r_type, &r_format,
- &count, &bytes_remain, &prop) == Success) {
-
- if (r_type != None) {
- XFree(prop);
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static gboolean
-descendent_has_wm_state (Window window)
-{
- gboolean result = FALSE;
- Window parent, root;
- Window *children;
- unsigned int nchildren;
- gint i;
-
- if (!XQueryTree (GDK_DISPLAY(), window,
- &root, &parent, &children, &nchildren))
- return FALSE;
-
- for (i=0; i<nchildren; i++) {
- if (window_has_wm_state (children[i]) ||
- descendent_has_wm_state (children[i])) {
- result = TRUE;
- break;
- }
- }
-
- if (children)
- XFree (children);
-
- return result;
-}
-
-/* This function tries to find a window manager frame by
- * hunting all the children of the root window
- */
-static Window
-find_wm_window_from_hunt (void)
-{
- Window parent, root, frame;
- Window *children;
- unsigned int nchildren;
- gint i;
-
- frame = None;
-
- gdk_error_trap_push ();
-
- XQueryTree (GDK_DISPLAY(), GDK_ROOT_WINDOW (),
- &root, &parent, &children, &nchildren);
-
- /* We are looking for a window that doesn't have WIN_STATE
- * set on it, but does have a child with WIN_STATE set
- */
- for (i=0; i<nchildren; i++) {
- if (!window_has_wm_state (children[i]) &&
- descendent_has_wm_state (children[i])) {
- frame = children[i];
- break;
- }
- }
-
- if (children)
- XFree (children);
-
- gdk_error_trap_pop ();
-
- return frame;
-}
-
-static Window
-find_wm_window (GdkWindow *client)
-{
- Window wm_window = None;
-
- /* First, try to find a GNOME compliant WM */
-
- wm_window = find_gnome_wm_window();
-
- if (!wm_window) {
- wm_window = find_wm_window_from_client (client);
- }
-
- if (!wm_window) {
- wm_window = find_wm_window_from_hunt ();
- }
-
- return wm_window;
-}
-
-static gboolean
-start_timeout (gpointer data)
-{
- RestartInfo *info = data;
- if (wm_is_running ()) {
- info->callback(WM_SUCCESS, info->data);
- gnome_desktop_item_unref (info->dentry);
- g_free (info);
- return FALSE;
- } else {
- info->retries--;
- if (info->retries > 0)
- return TRUE;
- else {
- info->callback(WM_CANT_START, info->data);
- gnome_desktop_item_unref (info->dentry);
- g_free (info);
- return FALSE;
- }
- }
-}
-
-static void
-start_do (RestartInfo *info)
-{
- gnome_desktop_item_launch (info->dentry, 0, 0, NULL);
-
- info->retries = 10;
- gtk_timeout_add (1000, start_timeout, info);
-}
-
-static gboolean
-kill_timeout (gpointer data)
-{
- RestartInfo *info = data;
- if (!wm_is_running ()) {
- start_do (info);
- return FALSE;
- } else {
- info->retries--;
- if (info->retries > 0)
- return TRUE;
- else {
- info->callback(WM_ALREADY_RUNNING, info->data);
- gnome_desktop_item_unref (info->dentry);
- g_free (info);
- return FALSE;
- }
- }
-}
-
-void
-wm_restart (WindowManager *new,
- GdkWindow *client,
- WMResultFunc callback,
- gpointer data)
-{
- Window wm_window;
- RestartInfo *info;
-
- g_return_if_fail (new->is_present);
-
- info = g_new (RestartInfo, 1);
- info->dentry = gnome_desktop_item_copy (new->dentry);
- info->callback = callback;
- info->data = data;
- info->retries = 10;
-
- if (wm_is_running ()) {
- wm_window = find_wm_window (client);
- if (!wm_window) {
- (*callback) (WM_ALREADY_RUNNING, data);
- gnome_desktop_item_unref (info->dentry);
- g_free (info);
- } else {
- XKillClient (GDK_DISPLAY(), wm_window);
- gtk_timeout_add (1000, kill_timeout, info);
- }
- } else {
- start_do (info);
- }
-}
-
-WindowManager *
-wm_guess_current (void)
-{
- return NULL;
-}
diff --git a/capplets/windows/wm-list.c b/capplets/windows/wm-list.c
deleted file mode 100644
index f074d41a0..000000000
--- a/capplets/windows/wm-list.c
+++ /dev/null
@@ -1,575 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-/* Copyright (C) 1998 Redhat Software Inc.
- * Code available under the Gnu GPL.
- * Authors: Owen Taylor <otaylor@redhat.com>,
- * Bradford Hovinen <hovinen@helixcode.com>
- */
-
-#include <sys/types.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <string.h>
-#include <libgnome/libgnome.h>
-#include <gconf/gconf-client.h>
-#include "wm-properties.h"
-
-#define CONFIG_PREFIX "/desktop/gnome/applications/window_manager"
-
-/* Current list of window managers */
-GList *window_managers = NULL;
-
-/* List on startup */
-static GList *window_managers_save = NULL;
-
-/* Current window manager */
-static WindowManager *current_wm = NULL;
-
-/* Window manager on startup */
-static WindowManager *current_wm_save = NULL;
-
-static gboolean xml_read_bool (xmlNodePtr node);
-static xmlNodePtr xml_write_bool (gchar *name,
- gboolean value);
-
-gboolean
-is_blank (gchar *str)
-{
- while (*str) {
- if (!isspace(*str))
- return FALSE;
- str++;
- }
- return TRUE;
-}
-
-static gint
-wm_compare (gconstpointer a, gconstpointer b)
-{
- const WindowManager *wm_a = (const WindowManager *)a;
- const WindowManager *wm_b = (const WindowManager *)b;
-
- return g_strcasecmp (gnome_desktop_item_get_string (wm_a->dentry, GNOME_DESKTOP_ITEM_NAME), gnome_desktop_item_get_string (wm_b->dentry, GNOME_DESKTOP_ITEM_NAME));
-}
-
-static void
-wm_free (WindowManager *wm)
-{
- gnome_desktop_item_unref (wm->dentry);
- g_free (wm->config_exec);
- g_free (wm->config_tryexec);;
- g_free (wm);
-}
-
-void
-wm_check_present (WindowManager *wm)
-{
- gchar *path;
-
- if (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_EXEC)) {
- if (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_TRY_EXEC)) {
- path = gnome_is_program_in_path (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_TRY_EXEC));
- wm->is_present = (path != NULL);
- if (path)
- g_free (path);
- } else
- wm->is_present = TRUE;
- } else
- wm->is_present = FALSE;
-
- if (wm->config_exec) {
- if (wm->config_tryexec) {
- path = gnome_is_program_in_path (wm->config_tryexec);
- wm->is_config_present = (path != NULL);
- if (path)
- g_free (path);
- } else {
- path = gnome_is_program_in_path (wm->config_exec);
- wm->is_config_present = (path != NULL);
- if (path)
- g_free (path);
- }
- } else
- wm->is_config_present = FALSE;
-
-}
-
-static WindowManager *
-wm_copy (WindowManager *wm)
-{
- WindowManager *result = g_new (WindowManager, 1);
-
- result->dentry = gnome_desktop_item_copy (wm->dentry);
- result->config_exec = g_strdup (wm->config_exec);
- result->config_tryexec = g_strdup (wm->config_tryexec);
-
- result->session_managed = wm->session_managed;
- result->is_user = wm->is_user;
- result->is_present = wm->is_present;
- result->is_config_present = wm->is_config_present;
-
- return result;
-}
-
-
-static WindowManager *
-wm_list_find (GList *list, const char *name)
-{
- GList *tmp_list = list;
- while (tmp_list) {
- WindowManager *wm = tmp_list->data;
- if (strcmp (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_EXEC), name) == 0)
- return wm;
-
- tmp_list = tmp_list->next;
- }
-
- return NULL;
-}
-
-static WindowManager *
-wm_list_find_exec (GList *list, const char *name)
-{
- GList *tmp_list = list;
- while (tmp_list) {
- WindowManager *wm = tmp_list->data;
- if (!gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_EXEC))
- continue;
- if (strcmp (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_EXEC), name) == 0)
- return wm;
-
- tmp_list = tmp_list->next;
- }
-
- return NULL;
-}
-
-static GList *
-wm_list_find_files (gchar *directory)
-{
- DIR *dir;
- struct dirent *child;
- GList *result = NULL;
- gchar *suffix;
-
- dir = opendir (directory);
- if (dir == NULL)
- return NULL;
-
- while ((child = readdir (dir)) != NULL) {
- /* Ignore files without .desktop suffix, and ignore
- * .desktop files with no prefix
- */
- suffix = child->d_name + strlen (child->d_name) - 8;
- /* strlen(".desktop") == 8 */
-
- if (suffix <= child->d_name ||
- strcmp (suffix, ".desktop") != 0)
- continue;
-
- result = g_list_prepend (result,
- g_concat_dir_and_file (directory,
- child->d_name));
- }
- closedir (dir);
-
- return result;
-}
-
-static void
-wm_list_read_dir (gchar *directory, gboolean is_user)
-{
- WindowManager *wm;
- GList *tmp_list;
- GList *files;
- gchar *prefix;
-
- files = wm_list_find_files (directory);
-
- tmp_list = files;
- while (tmp_list) {
- wm = g_new (WindowManager, 1);
-
- wm->dentry = gnome_desktop_item_new_from_file (tmp_list->data, GNOME_DESKTOP_ITEM_TYPE_APPLICATION, NULL);
- gnome_desktop_item_set_entry_type (wm->dentry, GNOME_DESKTOP_ITEM_TYPE_APPLICATION);
-
- if (!wm->dentry) {
- g_free (wm);
- tmp_list = tmp_list->next;
- continue;
- }
-
- prefix = g_strconcat ("=", gnome_desktop_item_get_location (wm->dentry), "=/Window Manager/", NULL);
- gnome_config_push_prefix (prefix);
- g_free (prefix);
-
- wm->config_exec = gnome_config_get_string ("ConfigExec");
- wm->config_tryexec = gnome_config_get_string ("ConfigTryExec");
- wm->session_managed = gnome_config_get_bool ("SessionManaged=0");
- wm->is_user = is_user;
-
- if (wm->config_exec && is_blank (wm->config_exec)) {
- g_free (wm->config_exec);
- wm->config_exec = NULL;
- }
-
- if (wm->config_tryexec && is_blank (wm->config_tryexec)) {
- g_free (wm->config_tryexec);
- wm->config_tryexec = NULL;
- }
-
- gnome_config_pop_prefix ();
-
- wm_check_present (wm);
-
- if (gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_NAME) && gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_EXEC) &&
- (wm->is_user || wm->is_present)) {
- window_managers =
- g_list_insert_sorted (window_managers,
- wm,
- wm_compare);
- window_managers_save =
- g_list_insert_sorted (window_managers_save,
- wm_copy (wm),
- wm_compare);
- } else {
- wm_free (wm);
- }
-
-
- tmp_list = tmp_list->next;
- }
- g_list_free (files);
-}
-
-void
-wm_list_init (void)
-{
- gchar *tempdir;
- gchar *name;
- GConfClient *client;
-
- tempdir = gnome_unconditional_datadir_file ("gnome/wm-properties/");
- wm_list_read_dir (tempdir, FALSE);
- g_free (tempdir);
-
- tempdir = gnome_util_home_file("wm-properties/");
- wm_list_read_dir (tempdir, TRUE);
- g_free (tempdir);
-
- client = gconf_client_get_default ();
- name = gconf_client_get_string (client, CONFIG_PREFIX "/current", NULL);
- if (name) {
- current_wm = wm_list_find (window_managers, name);
- g_free (name);
- }
-
- if (!current_wm) {
- name = gconf_client_get_string (client, CONFIG_PREFIX "/default", NULL);
-
- if (name) {
- current_wm = wm_list_find_exec (window_managers, name);
- g_free (name);
- }
- }
-
- if (!current_wm) {
- gchar *wmfile, *prefix;
-
- wmfile = gnome_unconditional_datadir_file ("default.wm");
- prefix = g_strconcat ("=", wmfile, "=/Default/WM", NULL);
- name = gnome_config_get_string (prefix);
-
- g_free (wmfile);
- g_free (prefix);
-
- if (name) {
- current_wm = wm_list_find_exec (window_managers, name);
- g_free (name);
- }
- }
-
- if (!current_wm && window_managers)
- current_wm = window_managers->data;
-
- if(current_wm)
- current_wm_save = wm_list_find (window_managers_save, gnome_desktop_item_get_string (current_wm->dentry, GNOME_DESKTOP_ITEM_NAME));
-
- g_object_unref (G_OBJECT (client));
-}
-
-void
-wm_list_save (void)
-{
- GList *old_files;
- GList *tmp_list;
- gchar *tempdir;
- gchar *prefix;
- WindowManager *wm;
-
- /* Clean out the current contents of .gnome/wm-desktops
- */
-
- tempdir = gnome_util_home_file("wm-properties/");
- old_files = wm_list_find_files (tempdir);
- g_free (tempdir);
-
- tmp_list = old_files;
- while (tmp_list) {
- prefix = g_strconcat ("=", tmp_list->data, "=", NULL);
- gnome_config_clean_file (prefix);
- gnome_config_sync_file (prefix);
- g_free (prefix);
-
- tmp_list = tmp_list->next;
- }
- g_list_free (old_files);
-
-
- /* Save the user's desktops
- */
-
- tmp_list = window_managers;
- while (tmp_list) {
- wm = tmp_list->data;
-
- if (wm->is_user) {
- gnome_desktop_item_save (wm->dentry, NULL, TRUE, NULL);
-
- prefix = g_strconcat ("=", gnome_desktop_item_get_location (wm->dentry), "=/Window Manager/", NULL);
- gnome_config_push_prefix (prefix);
- g_free (prefix);
-
- if (wm->config_exec)
- gnome_config_set_string ("ConfigExec", wm->config_exec);
- if (wm->config_tryexec)
- gnome_config_set_string ("ConfigTryExec", wm->config_tryexec);
- gnome_config_set_bool ("SessionManaged=0", wm->session_managed);
- gnome_config_pop_prefix ();
-
- }
- tmp_list = tmp_list->next;
- }
-
- /* Save the current window manager
- */
- if(current_wm)
- {
- GConfClient *client = gconf_client_get_default ();
- gconf_client_set_string (client, CONFIG_PREFIX "/current",
- gnome_desktop_item_get_string (current_wm->dentry, GNOME_DESKTOP_ITEM_EXEC),
- NULL);
- g_object_unref (G_OBJECT (client));
- }
-
- gnome_config_sync ();
-}
-
-void
-wm_list_revert (void)
-{
- GList *tmp_list;
- gchar *old_name = NULL;
-
- if(current_wm)
- old_name = g_strdup (gnome_desktop_item_get_string (current_wm->dentry, GNOME_DESKTOP_ITEM_NAME));
-
- g_list_foreach (window_managers, (GFunc)wm_free, NULL);
- g_list_free (window_managers);
- window_managers = NULL;
-
- tmp_list = window_managers_save;
- while (tmp_list) {
- window_managers = g_list_prepend (window_managers,
- wm_copy (tmp_list->data));
- tmp_list = tmp_list->next;
- }
- window_managers = g_list_reverse (window_managers);
- current_wm = wm_list_find (window_managers, old_name);
- g_free (old_name);
-}
-
-void
-wm_list_add (WindowManager *wm)
-{
- g_return_if_fail (wm != NULL);
-
- window_managers = g_list_insert_sorted (window_managers, wm,
- wm_compare);
-}
-
-void
-wm_list_delete (WindowManager *wm)
-{
- GList *node;
-
- g_return_if_fail (wm != NULL);
- g_return_if_fail (wm != current_wm);
-
- node = g_list_find (window_managers, wm);
- g_return_if_fail (node != NULL);
-
- window_managers = g_list_remove_link (window_managers, node);
- g_list_free_1 (node);
- wm_free (wm);
-}
-
-void
-wm_list_set_current (WindowManager *wm)
-{
- current_wm = wm;
-}
-
-WindowManager *
-wm_list_get_current (void)
-{
- return current_wm;
-}
-
-WindowManager *
-wm_list_get_revert (void)
-{
- if(current_wm_save)
- return wm_list_find (window_managers, gnome_desktop_item_get_string (current_wm_save->dentry, GNOME_DESKTOP_ITEM_NAME));
- else
- return NULL;
-}
-
-static WindowManager *
-wm_read_from_xml (xmlNodePtr wm_node)
-{
- xmlNodePtr node;
- WindowManager *wm;
- gboolean is_current = FALSE;
-
- if (strcmp (wm_node->name, "window-manager")) return NULL;
-
- wm = g_new0 (WindowManager, 1);
-
- wm->dentry = gnome_desktop_item_new_from_file
- (xmlGetProp (wm_node, "desktop-entry"),
- GNOME_DESKTOP_ITEM_TYPE_APPLICATION, NULL);
- gnome_desktop_item_set_entry_type (wm->dentry, GNOME_DESKTOP_ITEM_TYPE_APPLICATION);
-
- for (node = wm_node->children; node; node = node->next) {
- if (!strcmp (node->name, "config-exec"))
- wm->config_exec = xmlNodeGetContent (node);
- else if (!strcmp (node->name, "config-tryexec"))
- wm->config_tryexec = xmlNodeGetContent (node);
- else if (!strcmp (node->name, "session-managed"))
- wm->session_managed = xml_read_bool (node);
- else if (!strcmp (node->name, "is-user"))
- wm->is_user = xml_read_bool (node);
- else if (!strcmp (node->name, "is-current"))
- is_current = xml_read_bool (node); /* FIXME: sanity check */
- }
-
- wm_check_present (wm);
-
- if (wm->dentry == NULL ||
- (wm->config_exec != NULL && is_blank (wm->config_exec)) ||
- gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_NAME) == NULL || gnome_desktop_item_get_string (wm->dentry, GNOME_DESKTOP_ITEM_EXEC) == NULL ||
- !(wm->is_user || wm->is_present))
- {
- g_free (wm);
- return NULL;
- }
-
- if (is_current) current_wm = wm;
-
- return wm;
-}
-
-void
-wm_list_read_from_xml (xmlDocPtr doc)
-{
- xmlNodePtr root_node, node;
- WindowManager *wm;
-
- root_node = xmlDocGetRootElement (doc);
- if (strcmp (root_node->name, "wm-prefs")) return;
-
- for (node = root_node; node; node = node->next) {
- if (!strcmp (node->name, "window-manager")) {
- wm = wm_read_from_xml (node);
- if (wm) window_managers =
- g_list_insert_sorted
- (window_managers, wm, wm_compare);
- }
- }
-}
-
-static xmlNodePtr
-wm_write_to_xml (WindowManager *wm)
-{
- xmlNodePtr node;
-
- node = xmlNewNode (NULL, "window-manager");
-
- xmlNewProp (node, "desktop-entry", gnome_desktop_item_get_location (wm->dentry));
-
- if (wm->config_exec != NULL)
- xmlNewChild (node, NULL, "config-exec", wm->config_exec);
-
- xmlAddChild (node, xml_write_bool ("session-managed",
- wm->session_managed));
-
- xmlAddChild (node, xml_write_bool ("is-user", wm->is_user));
- xmlAddChild (node, xml_write_bool ("is-current", wm == current_wm));
-
- return node;
-}
-
-xmlDocPtr
-wm_list_write_to_xml (void)
-{
- xmlDocPtr doc;
- xmlNodePtr root_node, node;
- GList *wm_node;
-
- doc = xmlNewDoc ("1.0");
- root_node = xmlNewDocNode (doc, NULL, "wm-prefs", NULL);
-
- for (wm_node = window_managers; wm_node; wm_node = wm_node->next) {
- node = wm_write_to_xml ((WindowManager *) wm_node->data);
- if (node) xmlAddChild (root_node, node);
- }
-
- xmlDocSetRootElement (doc, root_node);
-
- return doc;
-}
-
-/* Read a boolean value from a node */
-
-static gboolean
-xml_read_bool (xmlNodePtr node)
-{
- char *text;
-
- text = xmlNodeGetContent (node);
-
- if (!g_strcasecmp (text, "true"))
- return TRUE;
- else
- return FALSE;
-}
-
-/* Write out a boolean value in a node */
-
-static xmlNodePtr
-xml_write_bool (gchar *name, gboolean value)
-{
- xmlNodePtr node;
-
- g_return_val_if_fail (name != NULL, NULL);
-
- node = xmlNewNode (NULL, name);
-
- if (value)
- xmlNodeSetContent (node, "true");
- else
- xmlNodeSetContent (node, "false");
-
- return node;
-}
diff --git a/capplets/windows/wm-properties.h b/capplets/windows/wm-properties.h
deleted file mode 100644
index f14dc4ea5..000000000
--- a/capplets/windows/wm-properties.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-/* Copyright (C) 1998 Redhat Software Inc.
- * Code available under the Gnu GPL.
- * Authors: Owen Taylor <otaylor@redhat.com>,
- * Bradford Hovinen <hovinen@helixcode.com>
- */
-
-#include <gdk/gdk.h>
-#include <libgnome/libgnome.h>
-#include <libgnome/gnome-desktop-item.h>
-
-#include <libxml/tree.h>
-
-typedef struct _WindowManager WindowManager;
-
-struct _WindowManager {
- GnomeDesktopItem *dentry;
- gchar *config_exec;
- gchar *config_tryexec;
- gboolean session_managed : 1;
- gboolean is_user : 1;
- gboolean is_present : 1;
- gboolean is_config_present : 1;
-};
-
-/* Utility functions */
-gboolean is_blank (gchar *str);
-
-/* Fill in the is_present and is_config_present fields */
-void wm_check_present (WindowManager *wm);
-
-/* Management of window manager list */
-
-void wm_list_init (void);
-void wm_list_save (void);
-void wm_list_revert (void);
-void wm_list_add (WindowManager *window_manager);
-void wm_list_delete (WindowManager *window_manager);
-void wm_list_set_current (WindowManager *window_manager);
-WindowManager *wm_list_get_current (void);
-WindowManager *wm_list_get_revert (void);
-
-void wm_list_read_from_xml (xmlDocPtr doc);
-xmlDocPtr wm_list_write_to_xml (void);
-
-extern GList *window_managers;
-
-/* Management of current window manager */
-
-typedef enum {
- WM_SUCCESS,
- WM_ALREADY_RUNNING,
- WM_CANT_START
-} WMResult;
-
-typedef void (*WMResultFunc) (WMResult result, gpointer data);
-
-void wm_restart (WindowManager *new,
- GdkWindow *client,
- WMResultFunc callback,
- gpointer data);
-gboolean wm_is_running (void);
-WindowManager *wm_guess_current (void);