summaryrefslogtreecommitdiff
path: root/libwindow-settings/gnome-wm-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'libwindow-settings/gnome-wm-manager.c')
-rw-r--r--libwindow-settings/gnome-wm-manager.c324
1 files changed, 0 insertions, 324 deletions
diff --git a/libwindow-settings/gnome-wm-manager.c b/libwindow-settings/gnome-wm-manager.c
deleted file mode 100644
index 4d9132f6a..000000000
--- a/libwindow-settings/gnome-wm-manager.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
-
-/* gnome-wm-manager.c
- * Copyright (C) 2002 Seth Nickell
- * Copyright (C) 1998, 2002 Red Hat, Inc.
- *
- * Written by: Seth Nickell <snickell@stanford.edu>,
- * Havoc Pennington <hp@redhat.com>
- * Owen Taylor <otaylor@redhat.com>,
- * Bradford Hovinen <hovinen@helixcode.com>
- *
- * 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 <config.h>
-#include "gnome-wm-manager.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gdk/gdk.h>
-#include <gdk/gdkx.h>
-#include <libgnome/gnome-util.h>
-
-#include <sys/types.h>
-#include <dirent.h>
-#include <string.h>
-
-typedef struct {
- GnomeDesktopItem *ditem;
- char *name; /* human readable, localized */
- char *identify_name; /* name we expect to be set on the screen */
- char *exec;
- char *config_exec;
- char *config_tryexec;
- char *module;
- guint session_managed : 1;
- guint is_user : 1;
- guint is_present : 1;
- guint is_config_present : 1;
- GnomeWindowManager *gnome_wm;
-} AvailableWindowManager;
-
-static gboolean done_scan = FALSE;
-static GList *available_wms;
-
-static void
-wm_free (AvailableWindowManager *wm)
-{
- g_free (wm->name);
- g_free (wm->exec);
- g_free (wm->config_exec);
- g_free (wm->config_tryexec);
- g_free (wm->module);
- g_free (wm->identify_name);
-
- g_free (wm);
-}
-
-static GList *
-list_desktop_files_in_dir (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 gint
-wm_compare (gconstpointer a, gconstpointer b)
-{
- const AvailableWindowManager *wm_a = (const AvailableWindowManager *)a;
- const AvailableWindowManager *wm_b = (const AvailableWindowManager *)b;
-
- /* mmm, sloooow */
-
- return g_utf8_collate (gnome_desktop_item_get_string (wm_a->ditem, GNOME_DESKTOP_ITEM_NAME),
- gnome_desktop_item_get_string (wm_b->ditem, GNOME_DESKTOP_ITEM_NAME));
-}
-
-static AvailableWindowManager*
-wm_load (const char *desktop_file,
- gboolean is_user)
-{
- gchar *path;
- AvailableWindowManager *wm;
-
- wm = g_new0 (AvailableWindowManager, 1);
-
- wm->ditem = gnome_desktop_item_new_from_file (desktop_file,
- GNOME_DESKTOP_ITEM_TYPE_APPLICATION,
- NULL);
-
- if (wm->ditem == NULL) {
- g_free (wm);
- return NULL;
- }
-
- gnome_desktop_item_set_entry_type (wm->ditem, GNOME_DESKTOP_ITEM_TYPE_APPLICATION);
-
- wm->exec = g_strdup (gnome_desktop_item_get_string (wm->ditem,
- GNOME_DESKTOP_ITEM_EXEC));
-
- wm->name = g_strdup (gnome_desktop_item_get_string (wm->ditem,
- GNOME_DESKTOP_ITEM_NAME));
-
- wm->config_exec = g_strdup (gnome_desktop_item_get_string (wm->ditem,
- "ConfigExec"));
- wm->config_tryexec = g_strdup (gnome_desktop_item_get_string (wm->ditem,
- "ConfigTryExec"));
- wm->session_managed = gnome_desktop_item_get_boolean (wm->ditem,
- "SessionManaged");
-
- wm->module = g_strdup (gnome_desktop_item_get_string (wm->ditem,
- "X-GNOME-WMSettingsModule"));
-
- wm->identify_name = g_strdup (gnome_desktop_item_get_string (wm->ditem,
- "X-GNOME-WMName"));
-
- wm->is_user = is_user;
-
- if (gnome_desktop_item_get_string (wm->ditem, GNOME_DESKTOP_ITEM_EXEC)) {
- const char *tryexec;
-
- tryexec = gnome_desktop_item_get_string (wm->ditem, GNOME_DESKTOP_ITEM_TRY_EXEC);
-
- if (tryexec) {
- path = g_find_program_in_path (tryexec);
- 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 = g_find_program_in_path (wm->config_tryexec);
- wm->is_config_present = (path != NULL);
- if (path)
- g_free (path);
- } else {
- path = g_find_program_in_path (wm->config_exec);
- wm->is_config_present = (path != NULL);
- if (path)
- g_free (path);
- }
- } else
- wm->is_config_present = FALSE;
-
- if (wm->name && wm->exec &&
- (wm->is_user || wm->is_present))
- return wm;
- else {
- wm_free (wm);
- return NULL;
- }
-}
-
-static void
-scan_wm_directory (gchar *directory, gboolean is_user)
-{
- GList *tmp_list;
- GList *files;
-
- files = list_desktop_files_in_dir (directory);
-
- tmp_list = files;
- while (tmp_list) {
- AvailableWindowManager *wm;
-
- wm = wm_load (tmp_list->data, is_user);
-
- if (wm != NULL)
- available_wms = g_list_prepend (available_wms, wm);
-
- tmp_list = tmp_list->next;
- }
-
- g_list_foreach (files, (GFunc) g_free, NULL);
- g_list_free (files);
-}
-
-void
-gnome_wm_manager_init (void)
-{
- char *tempdir;
-
- if (done_scan)
- return;
-
- done_scan = TRUE;
-
- tempdir = gnome_unconditional_datadir_file ("gnome/wm-properties/");
- scan_wm_directory (tempdir, FALSE);
- g_free (tempdir);
-
- tempdir = gnome_util_home_file("wm-properties/");
- scan_wm_directory (tempdir, TRUE);
- g_free (tempdir);
-
- available_wms = g_list_sort (available_wms,
- wm_compare);
-}
-
-static AvailableWindowManager*
-get_current_wm (GdkScreen *screen)
-{
- AvailableWindowManager *current_wm;
- const char *name;
- GList *tmp_list;
-
- g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
-
- name = gdk_x11_screen_get_window_manager_name (screen);
-
- current_wm = NULL;
-
- tmp_list = available_wms;
- while (tmp_list != NULL) {
- AvailableWindowManager *wm = tmp_list->data;
-
- if (wm->identify_name &&
- strcmp (wm->identify_name, name) == 0) {
- current_wm = wm;
- break;
- }
- tmp_list = tmp_list->next;
- }
-
- if (current_wm == NULL) {
- /* Try with localized name, sort of crackrock
- * back compat hack
- */
-
- tmp_list = available_wms;
- while (tmp_list != NULL) {
- AvailableWindowManager *wm = tmp_list->data;
-
- if (strcmp (wm->name, name) == 0) {
- current_wm = wm;
- break;
- }
- tmp_list = tmp_list->next;
- }
- }
-
- return current_wm;
-}
-
-GnomeWindowManager*
-gnome_wm_manager_get_current (GdkScreen *screen)
-{
- AvailableWindowManager *wm;
-
- wm = get_current_wm (screen);
-
- if (wm != NULL && wm->module != NULL)
- /* may still return NULL here */
- return (GnomeWindowManager*) gnome_window_manager_new (wm->ditem);
- else
- return NULL;
-}
-
-gboolean
-gnome_wm_manager_spawn_config_tool_for_current (GdkScreen *screen,
- GError **error)
-{
- AvailableWindowManager *wm;
-
- wm = get_current_wm (screen);
-
- if (wm != NULL && wm->config_exec != NULL) {
- return g_spawn_command_line_async (wm->config_exec,
- error);
- } else {
- const char *name;
-
- name = gdk_x11_screen_get_window_manager_name (screen);
-
- g_set_error (error,
- G_SPAWN_ERROR,
- G_SPAWN_ERROR_FAILED,
- _("Window manager \"%s\" has not registered a configuration tool\n"),
- name);
- return FALSE;
- }
-}