Moved window manager detection code from keybindings capplet to common
This commit is contained in:
parent
ebc124d248
commit
cfeb09ab46
6 changed files with 183 additions and 149 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2002-06-21 Stephen Browne <stephen.browne@sun.com>
|
||||||
|
|
||||||
|
* wm-common.[ch] : added new files to expose
|
||||||
|
wm_common_get_current_window_manager and
|
||||||
|
wm_common_register_window_manager_change
|
||||||
|
|
||||||
2002-06-13 Jody Goldberg <jody@gnome.org>
|
2002-06-13 Jody Goldberg <jody@gnome.org>
|
||||||
|
|
||||||
* capplet-util.c (capplet_help) : Use the new utility.
|
* capplet-util.c (capplet_help) : Use the new utility.
|
||||||
|
|
|
@ -17,6 +17,7 @@ libcommon_la_SOURCES = \
|
||||||
gconf-property-editor.c gconf-property-editor.h \
|
gconf-property-editor.c gconf-property-editor.h \
|
||||||
gconf-property-editor-marshal.c gconf-property-editor-marshal.h \
|
gconf-property-editor-marshal.c gconf-property-editor-marshal.h \
|
||||||
file-transfer-dialog.c file-transfer-dialog.h \
|
file-transfer-dialog.c file-transfer-dialog.h \
|
||||||
theme-common.c theme-common.h
|
theme-common.c theme-common.h \
|
||||||
|
wm-common.c wm-common.h
|
||||||
|
|
||||||
libcommon_la_LIBADD = $(top_builddir)/libbackground/libbackground.la
|
libcommon_la_LIBADD = $(top_builddir)/libbackground/libbackground.la
|
||||||
|
|
149
capplets/common/wm-common.c
Normal file
149
capplets/common/wm-common.c
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
|
#include <gdk/gdk.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <glib.h>
|
||||||
|
#include <glib-object.h>
|
||||||
|
#include "wm-common.h"
|
||||||
|
|
||||||
|
typedef struct _WMCallbackData
|
||||||
|
{
|
||||||
|
GFunc func;
|
||||||
|
gpointer data;
|
||||||
|
} WMCallbackData;
|
||||||
|
|
||||||
|
/* Our WM Window */
|
||||||
|
static Window wm_window = None;
|
||||||
|
|
||||||
|
char*
|
||||||
|
wm_common_get_current_window_manager (void)
|
||||||
|
{
|
||||||
|
Atom utf8_string, atom, type;
|
||||||
|
int result;
|
||||||
|
char *retval;
|
||||||
|
int format;
|
||||||
|
gulong nitems;
|
||||||
|
gulong bytes_after;
|
||||||
|
guchar *val;
|
||||||
|
|
||||||
|
if (wm_window == None)
|
||||||
|
return WM_COMMON_UNKNOWN;
|
||||||
|
|
||||||
|
utf8_string = XInternAtom (GDK_DISPLAY (), "UTF8_STRING", False);
|
||||||
|
atom = XInternAtom (GDK_DISPLAY (), "_NET_WM_NAME", False);
|
||||||
|
|
||||||
|
gdk_error_trap_push ();
|
||||||
|
|
||||||
|
result = XGetWindowProperty (GDK_DISPLAY (),
|
||||||
|
wm_window,
|
||||||
|
atom,
|
||||||
|
0, G_MAXLONG,
|
||||||
|
False, utf8_string,
|
||||||
|
&type, &format, &nitems,
|
||||||
|
&bytes_after, (guchar **)&val);
|
||||||
|
|
||||||
|
if (gdk_error_trap_pop () || result != Success)
|
||||||
|
return WM_COMMON_UNKNOWN;
|
||||||
|
|
||||||
|
if (type != utf8_string ||
|
||||||
|
format !=8 ||
|
||||||
|
nitems == 0)
|
||||||
|
{
|
||||||
|
if (val)
|
||||||
|
XFree (val);
|
||||||
|
return WM_COMMON_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_utf8_validate (val, nitems, NULL))
|
||||||
|
{
|
||||||
|
XFree (val);
|
||||||
|
return WM_COMMON_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = g_strndup (val, nitems);
|
||||||
|
|
||||||
|
XFree (val);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_wm_window (void)
|
||||||
|
{
|
||||||
|
Window *xwindow;
|
||||||
|
Atom type;
|
||||||
|
gint format;
|
||||||
|
gulong nitems;
|
||||||
|
gulong bytes_after;
|
||||||
|
|
||||||
|
XGetWindowProperty (GDK_DISPLAY (), GDK_ROOT_WINDOW (),
|
||||||
|
XInternAtom (GDK_DISPLAY (), "_NET_SUPPORTING_WM_CHECK", False),
|
||||||
|
0, G_MAXLONG, False, XA_WINDOW, &type, &format,
|
||||||
|
&nitems, &bytes_after, (guchar **) &xwindow);
|
||||||
|
|
||||||
|
if (type != XA_WINDOW)
|
||||||
|
{
|
||||||
|
wm_window = None;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdk_error_trap_push ();
|
||||||
|
XSelectInput (GDK_DISPLAY (), *xwindow, StructureNotifyMask | PropertyChangeMask);
|
||||||
|
XSync (GDK_DISPLAY (), False);
|
||||||
|
|
||||||
|
if (gdk_error_trap_pop ())
|
||||||
|
{
|
||||||
|
XFree (xwindow);
|
||||||
|
wm_window = None;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wm_window = *xwindow;
|
||||||
|
XFree (xwindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdkFilterReturn
|
||||||
|
wm_window_event_filter (GdkXEvent *xev,
|
||||||
|
GdkEvent *event,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
WMCallbackData *ncb_data = (WMCallbackData*) data;
|
||||||
|
XEvent *xevent = (XEvent *)xev;
|
||||||
|
|
||||||
|
if ((xevent->type == DestroyNotify &&
|
||||||
|
wm_window != None && xevent->xany.window == wm_window) ||
|
||||||
|
(xevent->type == PropertyNotify &&
|
||||||
|
xevent->xany.window == GDK_ROOT_WINDOW () &&
|
||||||
|
xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY (), "_NET_SUPPORTING_WM_CHECK", False))) ||
|
||||||
|
(xevent->type == PropertyNotify &&
|
||||||
|
wm_window != None && xevent->xany.window == wm_window &&
|
||||||
|
xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY (), "_NET_WM_NAME", False))))
|
||||||
|
{
|
||||||
|
update_wm_window ();
|
||||||
|
(* ncb_data->func) ((gpointer)wm_common_get_current_window_manager(),
|
||||||
|
ncb_data->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wm_common_register_window_manager_change (GFunc func,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
WMCallbackData *ncb_data;
|
||||||
|
|
||||||
|
ncb_data = g_new0 (WMCallbackData, 1);
|
||||||
|
|
||||||
|
ncb_data->func = func;
|
||||||
|
ncb_data->data = data;
|
||||||
|
|
||||||
|
gdk_window_add_filter (NULL, wm_window_event_filter, ncb_data);
|
||||||
|
|
||||||
|
update_wm_window ();
|
||||||
|
|
||||||
|
XSelectInput (GDK_DISPLAY (), GDK_ROOT_WINDOW (), PropertyChangeMask);
|
||||||
|
XSync (GDK_DISPLAY (), False);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
13
capplets/common/wm-common.h
Normal file
13
capplets/common/wm-common.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef WM_COMMON_H
|
||||||
|
#define WM_COMMON_H
|
||||||
|
|
||||||
|
#define WM_COMMON_METACITY "Metacity"
|
||||||
|
#define WM_COMMON_SAWFISH "Sawfish"
|
||||||
|
#define WM_COMMON_UNKNOWN "Unknown"
|
||||||
|
|
||||||
|
gchar *wm_common_get_current_window_manager (void);
|
||||||
|
void wm_common_register_window_manager_change (GFunc func,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
|
#endif /* WM_COMMON_H */
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
2002-06-21 Stephen Browne <stephen.bronwe@sun.com>
|
||||||
|
|
||||||
|
* gnome-keybinding-properties.c : moved metacity detection
|
||||||
|
out of here and into a more generic API in capplets/common/wm-common.c
|
||||||
|
|
||||||
|
|
||||||
2002-06-17 Jody Goldberg <jody@gnome.org>
|
2002-06-17 Jody Goldberg <jody@gnome.org>
|
||||||
|
|
||||||
* Release 2.0.0
|
* Release 2.0.0
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
|
|
||||||
#include "theme-common.h"
|
#include "theme-common.h"
|
||||||
|
#include "wm-common.h"
|
||||||
#include "capplet-util.h"
|
#include "capplet-util.h"
|
||||||
#include "eggcellrendererkeys.h"
|
#include "eggcellrendererkeys.h"
|
||||||
#include "activate-settings-daemon.h"
|
#include "activate-settings-daemon.h"
|
||||||
|
@ -107,149 +108,7 @@ typedef struct
|
||||||
guint gconf_cnxn;
|
guint gconf_cnxn;
|
||||||
} KeyEntry;
|
} KeyEntry;
|
||||||
|
|
||||||
static void reload_key_entries (GladeXML *dialog);
|
static void reload_key_entries (gpointer wm_name, GladeXML *dialog);
|
||||||
|
|
||||||
/* Our WM Window */
|
|
||||||
static Window wm_window = None;
|
|
||||||
|
|
||||||
static char *
|
|
||||||
get_wm_name (void)
|
|
||||||
{
|
|
||||||
Atom utf8_string, atom, type;
|
|
||||||
int result;
|
|
||||||
char *retval;
|
|
||||||
int format;
|
|
||||||
gulong nitems;
|
|
||||||
gulong bytes_after;
|
|
||||||
guchar *val;
|
|
||||||
|
|
||||||
if (wm_window == None)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
utf8_string = XInternAtom (GDK_DISPLAY (), "UTF8_STRING", False);
|
|
||||||
atom = XInternAtom (GDK_DISPLAY (), "_NET_WM_NAME", False);
|
|
||||||
|
|
||||||
gdk_error_trap_push ();
|
|
||||||
|
|
||||||
result = XGetWindowProperty (GDK_DISPLAY (),
|
|
||||||
wm_window,
|
|
||||||
atom,
|
|
||||||
0, G_MAXLONG,
|
|
||||||
False, utf8_string,
|
|
||||||
&type, &format, &nitems,
|
|
||||||
&bytes_after, (guchar **)&val);
|
|
||||||
|
|
||||||
if (gdk_error_trap_pop () || result != Success)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (type != utf8_string ||
|
|
||||||
format != 8 ||
|
|
||||||
nitems == 0)
|
|
||||||
{
|
|
||||||
if (val)
|
|
||||||
XFree (val);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!g_utf8_validate (val, nitems, NULL))
|
|
||||||
{
|
|
||||||
XFree (val);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
retval = g_strndup (val, nitems);
|
|
||||||
|
|
||||||
XFree (val);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
is_metacity_running (void)
|
|
||||||
{
|
|
||||||
char *wm_name;
|
|
||||||
|
|
||||||
wm_name = get_wm_name ();
|
|
||||||
|
|
||||||
if (wm_name &&
|
|
||||||
strcmp (wm_name, "Metacity") == 0)
|
|
||||||
{
|
|
||||||
g_free (wm_name);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (wm_name);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_wm_window (void)
|
|
||||||
{
|
|
||||||
Window *xwindow;
|
|
||||||
Atom type;
|
|
||||||
gint format;
|
|
||||||
gulong nitems;
|
|
||||||
gulong bytes_after;
|
|
||||||
|
|
||||||
XGetWindowProperty (GDK_DISPLAY (), GDK_ROOT_WINDOW (),
|
|
||||||
XInternAtom (GDK_DISPLAY (), "_NET_SUPPORTING_WM_CHECK", False),
|
|
||||||
0, G_MAXLONG, False, XA_WINDOW, &type, &format,
|
|
||||||
&nitems, &bytes_after, (guchar **) &xwindow);
|
|
||||||
|
|
||||||
if (type != XA_WINDOW)
|
|
||||||
{
|
|
||||||
wm_window = None;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gdk_error_trap_push ();
|
|
||||||
XSelectInput (GDK_DISPLAY (), *xwindow, StructureNotifyMask | PropertyChangeMask);
|
|
||||||
XSync (GDK_DISPLAY (), False);
|
|
||||||
|
|
||||||
if (gdk_error_trap_pop ())
|
|
||||||
{
|
|
||||||
XFree (xwindow);
|
|
||||||
wm_window = None;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wm_window = *xwindow;
|
|
||||||
XFree (xwindow);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFilterReturn
|
|
||||||
wm_window_event_filter (GdkXEvent *xev,
|
|
||||||
GdkEvent *event,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
XEvent *xevent = (XEvent *)xev;
|
|
||||||
|
|
||||||
if ((xevent->type == DestroyNotify &&
|
|
||||||
wm_window != None && xevent->xany.window == wm_window) ||
|
|
||||||
(xevent->type == PropertyNotify &&
|
|
||||||
xevent->xany.window == GDK_ROOT_WINDOW () &&
|
|
||||||
xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY (), "_NET_SUPPORTING_WM_CHECK", False))) ||
|
|
||||||
(xevent->type == PropertyNotify &&
|
|
||||||
wm_window != None && xevent->xany.window == wm_window &&
|
|
||||||
xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY (), "_NET_WM_NAME", False))))
|
|
||||||
{
|
|
||||||
update_wm_window ();
|
|
||||||
reload_key_entries (data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GDK_FILTER_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
initialize_wm_handling (GladeXML *dialog)
|
|
||||||
{
|
|
||||||
gdk_window_add_filter (NULL, wm_window_event_filter, dialog);
|
|
||||||
|
|
||||||
update_wm_window ();
|
|
||||||
|
|
||||||
XSelectInput (GDK_DISPLAY (), GDK_ROOT_WINDOW (), PropertyChangeMask);
|
|
||||||
XSync (GDK_DISPLAY (), False);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
menu_item_activate (GtkWidget *menu_item,
|
menu_item_activate (GtkWidget *menu_item,
|
||||||
|
@ -591,13 +450,13 @@ append_keys_to_tree (GladeXML *dialog,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reload_key_entries (GladeXML *dialog)
|
reload_key_entries (gpointer wm_name, GladeXML *dialog)
|
||||||
{
|
{
|
||||||
clear_old_model (dialog, WID ("shortcut_treeview"));
|
clear_old_model (dialog, WID ("shortcut_treeview"));
|
||||||
|
|
||||||
append_keys_to_tree (dialog, _("Desktop"), desktop_key_list);
|
append_keys_to_tree (dialog, _("Desktop"), desktop_key_list);
|
||||||
|
|
||||||
if (is_metacity_running ())
|
if (strcmp((char *) wm_name, WM_COMMON_METACITY) == 0)
|
||||||
{
|
{
|
||||||
append_keys_to_tree (dialog, _("Window Management"), metacity_key_list);
|
append_keys_to_tree (dialog, _("Window Management"), metacity_key_list);
|
||||||
}
|
}
|
||||||
|
@ -609,7 +468,7 @@ key_entry_controlling_key_changed (GConfClient *client,
|
||||||
GConfEntry *entry,
|
GConfEntry *entry,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
reload_key_entries (user_data);
|
reload_key_entries (wm_common_get_current_window_manager(), user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -896,7 +755,7 @@ setup_dialog (GladeXML *dialog)
|
||||||
dialog, NULL, NULL);
|
dialog, NULL, NULL);
|
||||||
|
|
||||||
/* set up the dialog */
|
/* set up the dialog */
|
||||||
reload_key_entries (dialog);
|
reload_key_entries (wm_common_get_current_window_manager(), dialog);
|
||||||
|
|
||||||
widget = WID ("gnome-keybinding-dialog");
|
widget = WID ("gnome-keybinding-dialog");
|
||||||
filename = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP, "keyboard-shortcut.png", TRUE, NULL);
|
filename = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP, "keyboard-shortcut.png", TRUE, NULL);
|
||||||
|
@ -929,7 +788,7 @@ main (int argc, char *argv[])
|
||||||
activate_settings_daemon ();
|
activate_settings_daemon ();
|
||||||
|
|
||||||
dialog = create_dialog ();
|
dialog = create_dialog ();
|
||||||
initialize_wm_handling (dialog);
|
wm_common_register_window_manager_change ((GFunc)(reload_key_entries), dialog);
|
||||||
setup_dialog (dialog);
|
setup_dialog (dialog);
|
||||||
|
|
||||||
gtk_main ();
|
gtk_main ();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue