1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4
* Copyright (C) 2002 Seth Nickell
5
* Copyright (C) 1998, 2002 Red Hat, Inc.
7
* Written by: Seth Nickell <snickell@stanford.edu>,
8
* Havoc Pennington <hp@redhat.com>
9
* Owen Taylor <otaylor@redhat.com>,
10
* Bradford Hovinen <hovinen@helixcode.com>
12
* This program is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2, or (at your option)
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* You should have received a copy of the GNU General Public License
23
* along with this program; if not, write to the Free Software
24
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
29
#include "gnome-wm-manager.h"
32
#include <glib/gi18n.h>
36
#include <sys/types.h>
41
GnomeDesktopItem *ditem;
42
char *name; /* human readable, localized */
43
char *identify_name; /* name we expect to be set on the screen */
48
guint session_managed : 1;
51
guint is_config_present : 1;
52
GnomeWindowManager *gnome_wm;
53
} AvailableWindowManager;
55
static gboolean done_scan = FALSE;
56
static GList *available_wms;
59
wm_free (AvailableWindowManager *wm)
63
g_free (wm->config_exec);
64
g_free (wm->config_tryexec);
66
g_free (wm->identify_name);
72
list_desktop_files_in_dir (gchar *directory)
79
dir = opendir (directory);
83
while ((child = readdir (dir)) != NULL) {
84
/* Ignore files without .desktop suffix, and ignore
85
* .desktop files with no prefix
87
suffix = child->d_name + strlen (child->d_name) - 8;
88
/* strlen(".desktop") == 8 */
90
if (suffix <= child->d_name ||
91
strcmp (suffix, ".desktop") != 0)
94
result = g_list_prepend (result,
95
g_build_filename (directory, child->d_name, NULL));
103
wm_compare (gconstpointer a, gconstpointer b)
105
const AvailableWindowManager *wm_a = (const AvailableWindowManager *)a;
106
const AvailableWindowManager *wm_b = (const AvailableWindowManager *)b;
110
return g_utf8_collate (gnome_desktop_item_get_string (wm_a->ditem, GNOME_DESKTOP_ITEM_NAME),
111
gnome_desktop_item_get_string (wm_b->ditem, GNOME_DESKTOP_ITEM_NAME));
114
static AvailableWindowManager*
115
wm_load (const char *desktop_file,
119
AvailableWindowManager *wm;
121
wm = g_new0 (AvailableWindowManager, 1);
123
wm->ditem = gnome_desktop_item_new_from_file (desktop_file, 0, NULL);
125
if (wm->ditem == NULL) {
130
gnome_desktop_item_set_entry_type (wm->ditem, GNOME_DESKTOP_ITEM_TYPE_APPLICATION);
132
wm->exec = g_strdup (gnome_desktop_item_get_string (wm->ditem,
133
GNOME_DESKTOP_ITEM_EXEC));
135
wm->name = g_strdup (gnome_desktop_item_get_string (wm->ditem,
136
GNOME_DESKTOP_ITEM_NAME));
138
wm->config_exec = g_strdup (gnome_desktop_item_get_string (wm->ditem,
140
wm->config_tryexec = g_strdup (gnome_desktop_item_get_string (wm->ditem,
142
wm->session_managed = gnome_desktop_item_get_boolean (wm->ditem,
145
wm->module = g_strdup (gnome_desktop_item_get_string (wm->ditem,
146
"X-GNOME-WMSettingsModule"));
148
wm->identify_name = g_strdup (gnome_desktop_item_get_string (wm->ditem,
151
wm->is_user = is_user;
153
if (gnome_desktop_item_get_string (wm->ditem, GNOME_DESKTOP_ITEM_EXEC)) {
156
tryexec = gnome_desktop_item_get_string (wm->ditem, GNOME_DESKTOP_ITEM_TRY_EXEC);
159
path = g_find_program_in_path (tryexec);
160
wm->is_present = (path != NULL);
164
wm->is_present = TRUE;
166
wm->is_present = FALSE;
168
if (wm->config_exec) {
169
if (wm->config_tryexec) {
170
path = g_find_program_in_path (wm->config_tryexec);
171
wm->is_config_present = (path != NULL);
175
path = g_find_program_in_path (wm->config_exec);
176
wm->is_config_present = (path != NULL);
181
wm->is_config_present = FALSE;
183
if (wm->name && wm->exec &&
184
(wm->is_user || wm->is_present))
193
scan_wm_directory (gchar *directory, gboolean is_user)
198
files = list_desktop_files_in_dir (directory);
202
AvailableWindowManager *wm;
204
wm = wm_load (tmp_list->data, is_user);
207
available_wms = g_list_prepend (available_wms, wm);
209
tmp_list = tmp_list->next;
212
g_list_foreach (files, (GFunc) g_free, NULL);
217
gnome_wm_manager_init (void)
226
tempdir = g_build_filename (GNOME_WM_PROPERTY_PATH, NULL);
227
scan_wm_directory (tempdir, FALSE);
230
tempdir = g_build_filename (g_get_home_dir(), ".gnome2", "wm-properties", NULL);
231
scan_wm_directory (tempdir, TRUE);
234
available_wms = g_list_sort (available_wms,
238
static AvailableWindowManager*
239
get_current_wm (GdkScreen *screen)
241
AvailableWindowManager *current_wm;
245
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
247
name = gdk_x11_screen_get_window_manager_name (screen);
251
tmp_list = available_wms;
252
while (tmp_list != NULL) {
253
AvailableWindowManager *wm = tmp_list->data;
255
if (wm->identify_name &&
256
strcmp (wm->identify_name, name) == 0) {
260
tmp_list = tmp_list->next;
263
if (current_wm == NULL) {
264
/* Try with localized name, sort of crackrock
268
tmp_list = available_wms;
269
while (tmp_list != NULL) {
270
AvailableWindowManager *wm = tmp_list->data;
272
if (strcmp (wm->name, name) == 0) {
276
tmp_list = tmp_list->next;
284
gnome_wm_manager_get_current (GdkScreen *screen)
286
AvailableWindowManager *wm;
288
wm = get_current_wm (screen);
290
if (wm != NULL && wm->module != NULL)
291
/* may still return NULL here */
292
return (GnomeWindowManager*) gnome_window_manager_new (wm->ditem);
298
gnome_wm_manager_spawn_config_tool_for_current (GdkScreen *screen,
301
AvailableWindowManager *wm;
303
wm = get_current_wm (screen);
305
if (wm != NULL && wm->config_exec != NULL) {
306
return g_spawn_command_line_async (wm->config_exec,
311
name = gdk_x11_screen_get_window_manager_name (screen);
315
G_SPAWN_ERROR_FAILED,
316
_("Window manager \"%s\" has not registered a configuration tool\n"),