Moved window manager detection code from keybindings capplet to common

This commit is contained in:
Stephen Browne 2002-06-21 13:29:29 +00:00
parent ebc124d248
commit cfeb09ab46
6 changed files with 183 additions and 149 deletions

View file

@ -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>
* capplet-util.c (capplet_help) : Use the new utility.

View file

@ -17,6 +17,7 @@ libcommon_la_SOURCES = \
gconf-property-editor.c gconf-property-editor.h \
gconf-property-editor-marshal.c gconf-property-editor-marshal.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

149
capplets/common/wm-common.c Normal file
View 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);
}

View 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 */

View file

@ -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>
* Release 2.0.0

View file

@ -12,6 +12,7 @@
#include <X11/Xatom.h>
#include "theme-common.h"
#include "wm-common.h"
#include "capplet-util.h"
#include "eggcellrendererkeys.h"
#include "activate-settings-daemon.h"
@ -107,149 +108,7 @@ typedef struct
guint gconf_cnxn;
} KeyEntry;
static void reload_key_entries (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 reload_key_entries (gpointer wm_name, GladeXML *dialog);
static void
menu_item_activate (GtkWidget *menu_item,
@ -591,13 +450,13 @@ append_keys_to_tree (GladeXML *dialog,
}
static void
reload_key_entries (GladeXML *dialog)
reload_key_entries (gpointer wm_name, GladeXML *dialog)
{
clear_old_model (dialog, WID ("shortcut_treeview"));
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);
}
@ -609,7 +468,7 @@ key_entry_controlling_key_changed (GConfClient *client,
GConfEntry *entry,
gpointer user_data)
{
reload_key_entries (user_data);
reload_key_entries (wm_common_get_current_window_manager(), user_data);
}
static void
@ -896,7 +755,7 @@ setup_dialog (GladeXML *dialog)
dialog, NULL, NULL);
/* set up the dialog */
reload_key_entries (dialog);
reload_key_entries (wm_common_get_current_window_manager(), dialog);
widget = WID ("gnome-keybinding-dialog");
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 ();
dialog = create_dialog ();
initialize_wm_handling (dialog);
wm_common_register_window_manager_change ((GFunc)(reload_key_entries), dialog);
setup_dialog (dialog);
gtk_main ();