summaryrefslogtreecommitdiff
path: root/libwindow-settings/mate-window-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'libwindow-settings/mate-window-manager.c')
-rw-r--r--libwindow-settings/mate-window-manager.c273
1 files changed, 273 insertions, 0 deletions
diff --git a/libwindow-settings/mate-window-manager.c b/libwindow-settings/mate-window-manager.c
new file mode 100644
index 00000000..a5ffcf53
--- /dev/null
+++ b/libwindow-settings/mate-window-manager.c
@@ -0,0 +1,273 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+
+/* mate-window-manager.h
+ * Copyright (C) 2002 Seth Nickell
+ * Copyright (C) 2002 Red Hat, Inc.
+ *
+ * Written by: Seth Nickell <[email protected]>,
+ * Havoc Pennington <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#include "mate-window-manager.h"
+
+#include <gmodule.h>
+
+static GObjectClass *parent_class;
+
+struct _MateWindowManagerPrivate {
+ char *window_manager_name;
+ MateDesktopItem *ditem;
+};
+
+GObject *
+mate_window_manager_new (MateDesktopItem *it)
+{
+ const char *settings_lib;
+ char *module_name;
+ MateWindowManagerNewFunc wm_new_func = NULL;
+ GObject *wm;
+ GModule *module;
+ gboolean success;
+
+ settings_lib = mate_desktop_item_get_string (it, "X-MATE-WMSettingsModule");
+
+ module_name = g_module_build_path (MATE_WINDOW_MANAGER_MODULE_PATH,
+ settings_lib);
+
+ module = g_module_open (module_name, G_MODULE_BIND_LAZY);
+ if (module == NULL) {
+ g_warning ("Couldn't load window manager settings module `%s' (%s)", module_name, g_module_error ());
+ g_free (module_name);
+ return NULL;
+ }
+
+ success = g_module_symbol (module, "window_manager_new",
+ (gpointer *) &wm_new_func);
+
+ if ((!success) || wm_new_func == NULL) {
+ g_warning ("Couldn't load window manager settings module `%s`, couldn't find symbol \'window_manager_new\'", module_name);
+ g_free (module_name);
+ return NULL;
+ }
+
+ g_free (module_name);
+
+ wm = (* wm_new_func) (MATE_WINDOW_MANAGER_INTERFACE_VERSION);
+
+ if (wm == NULL)
+ return NULL;
+
+ (MATE_WINDOW_MANAGER (wm))->p->window_manager_name = g_strdup (mate_desktop_item_get_string (it, MATE_DESKTOP_ITEM_NAME));
+ (MATE_WINDOW_MANAGER (wm))->p->ditem = mate_desktop_item_ref (it);
+
+ return wm;
+}
+
+const char *
+mate_window_manager_get_name (MateWindowManager *wm)
+{
+ return wm->p->window_manager_name;
+}
+
+MateDesktopItem *
+mate_window_manager_get_ditem (MateWindowManager *wm)
+{
+ return mate_desktop_item_ref (wm->p->ditem);
+}
+
+GList *
+mate_window_manager_get_theme_list (MateWindowManager *wm)
+{
+ MateWindowManagerClass *klass = MATE_WINDOW_MANAGER_GET_CLASS (wm);
+ if (klass->get_theme_list)
+ return klass->get_theme_list (wm);
+ else
+ return NULL;
+}
+
+char *
+mate_window_manager_get_user_theme_folder (MateWindowManager *wm)
+{
+ MateWindowManagerClass *klass = MATE_WINDOW_MANAGER_GET_CLASS (wm);
+ if (klass->get_user_theme_folder)
+ return klass->get_user_theme_folder (wm);
+ else
+ return NULL;
+}
+
+void
+mate_window_manager_get_double_click_actions (MateWindowManager *wm,
+ const MateWMDoubleClickAction **actions,
+ int *n_actions)
+{
+ MateWindowManagerClass *klass = MATE_WINDOW_MANAGER_GET_CLASS (wm);
+
+ *actions = NULL;
+ *n_actions = 0;
+
+ if (klass->get_double_click_actions)
+ klass->get_double_click_actions (wm, actions, n_actions);
+}
+
+void
+mate_window_manager_change_settings (MateWindowManager *wm,
+ const MateWMSettings *settings)
+{
+ MateWindowManagerClass *klass = MATE_WINDOW_MANAGER_GET_CLASS (wm);
+
+ (* klass->change_settings) (wm, settings);
+}
+
+void
+mate_window_manager_get_settings (MateWindowManager *wm,
+ MateWMSettings *settings)
+{
+ MateWindowManagerClass *klass = MATE_WINDOW_MANAGER_GET_CLASS (wm);
+ int mask;
+
+ mask = (* klass->get_settings_mask) (wm);
+ settings->flags &= mask; /* avoid back compat issues by not returning
+ * fields to the caller that the WM module
+ * doesn't know about
+ */
+
+ (* klass->get_settings) (wm, settings);
+}
+
+static void
+mate_window_manager_init (MateWindowManager *mate_window_manager, MateWindowManagerClass *class)
+{
+ mate_window_manager->p = g_new0 (MateWindowManagerPrivate, 1);
+}
+
+static void
+mate_window_manager_finalize (GObject *object)
+{
+ MateWindowManager *mate_window_manager;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (IS_MATE_WINDOW_MANAGER (object));
+
+ mate_window_manager = MATE_WINDOW_MANAGER (object);
+
+ g_free (mate_window_manager->p);
+
+ parent_class->finalize (object);
+}
+
+enum {
+ SETTINGS_CHANGED,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static void
+mate_window_manager_class_init (MateWindowManagerClass *class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (class);
+
+ object_class->finalize = mate_window_manager_finalize;
+
+ parent_class = g_type_class_peek_parent (class);
+
+
+ signals[SETTINGS_CHANGED] =
+ g_signal_new ("settings_changed",
+ G_OBJECT_CLASS_TYPE (class),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
+ G_STRUCT_OFFSET (MateWindowManagerClass, settings_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+}
+
+
+GType
+mate_window_manager_get_type (void)
+{
+ static GType mate_window_manager_type = 0;
+
+ if (!mate_window_manager_type) {
+ static GTypeInfo mate_window_manager_info = {
+ sizeof (MateWindowManagerClass),
+ NULL, /* GBaseInitFunc */
+ NULL, /* GBaseFinalizeFunc */
+ (GClassInitFunc) mate_window_manager_class_init,
+ NULL, /* GClassFinalizeFunc */
+ NULL, /* user-supplied data */
+ sizeof (MateWindowManager),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) mate_window_manager_init,
+ NULL
+ };
+
+ mate_window_manager_type =
+ g_type_register_static (G_TYPE_OBJECT,
+ "MateWindowManager",
+ &mate_window_manager_info, 0);
+ }
+
+ return mate_window_manager_type;
+}
+
+
+void
+mate_window_manager_settings_changed (MateWindowManager *wm)
+{
+ g_signal_emit (wm, signals[SETTINGS_CHANGED], 0);
+}
+
+/* Helper functions for MateWMSettings */
+MateWMSettings *
+mate_wm_settings_copy (MateWMSettings *settings)
+{
+ MateWMSettings *retval;
+
+ g_return_val_if_fail (settings != NULL, NULL);
+
+ retval = g_new (MateWMSettings, 1);
+ *retval = *settings;
+
+ if (retval->flags & MATE_WM_SETTING_FONT)
+ retval->font = g_strdup (retval->font);
+ if (retval->flags & MATE_WM_SETTING_MOUSE_MOVE_MODIFIER)
+ retval->mouse_move_modifier = g_strdup (retval->mouse_move_modifier);
+ if (retval->flags & MATE_WM_SETTING_THEME)
+ retval->theme = g_strdup (retval->theme);
+
+ return retval;
+}
+
+void
+mate_wm_settings_free (MateWMSettings *settings)
+{
+ g_return_if_fail (settings != NULL);
+
+ if (settings->flags & MATE_WM_SETTING_FONT)
+ g_free ((void *) settings->font);
+ if (settings->flags & MATE_WM_SETTING_MOUSE_MOVE_MODIFIER)
+ g_free ((void *) settings->mouse_move_modifier);
+ if (settings->flags & MATE_WM_SETTING_THEME)
+ g_free ((void *)settings->theme);
+
+ g_free (settings);
+}
+