Verified Commit e3037aba authored by Alberts Muktupāvels's avatar Alberts Muktupāvels
Browse files

xutils: move event filter to WnckHandle

parent 3316383d
Pipeline #282571 passed with stage
in 1 minute and 14 seconds
......@@ -586,7 +586,6 @@ wnck_screen_get (int index)
if (screens == NULL)
{
screens = g_new0 (WnckScreen*, ScreenCount (display));
_wnck_event_filter_init ();
}
if (screens[index] == NULL)
......
......@@ -833,8 +833,6 @@ _wnck_get_default_display (void)
void
wnck_shutdown (void)
{
_wnck_event_filter_shutdown ();
/* Warning: this is hacky :-)
*
* Shutting down all WnckScreen objects will automatically unreference (and
......
/*
* Copyright (C) 2001 Havoc Pennington
* Copyright (C) 2005-2007 Vincent Untz
* Copyright (C) 2021 Alberts Muktupāvels
*
* This library is free software; you can redistribute it and/or
......@@ -18,7 +20,11 @@
#include "config.h"
#include "wnck-handle-private.h"
#include "private.h"
#include "screen.h"
#include "window.h"
#include "wnck-enum-types.h"
#include "xutils.h"
#define WNCK_TYPE_HANDLE (wnck_handle_get_type ())
G_DECLARE_FINAL_TYPE (WnckHandle, wnck_handle, WNCK, HANDLE, GObject)
......@@ -46,6 +52,101 @@ static GParamSpec *handle_properties[LAST_PROP] = { NULL };
G_DEFINE_TYPE (WnckHandle, wnck_handle, G_TYPE_OBJECT)
static GdkFilterReturn
filter_func (GdkXEvent *gdkxevent,
GdkEvent *event,
gpointer data)
{
XEvent *xevent = gdkxevent;
#ifdef HAVE_STARTUP_NOTIFICATION
int i;
Display *display;
#endif /* HAVE_STARTUP_NOTIFICATION */
switch (xevent->type)
{
case PropertyNotify:
{
WnckScreen *screen;
screen = wnck_screen_get_for_root (xevent->xany.window);
if (screen != NULL)
_wnck_screen_process_property_notify (screen, xevent);
else
{
WnckWindow *window;
WnckApplication *app;
window = wnck_window_get (xevent->xany.window);
app = wnck_application_get (xevent->xany.window);
if (app)
_wnck_application_process_property_notify (app, xevent);
if (window)
_wnck_window_process_property_notify (window, xevent);
}
}
break;
case ConfigureNotify:
{
WnckWindow *window;
window = wnck_window_get (xevent->xconfigure.window);
if (window)
_wnck_window_process_configure_notify (window, xevent);
}
break;
case SelectionClear:
{
_wnck_desktop_layout_manager_process_event (xevent);
}
break;
case ClientMessage:
#ifdef HAVE_STARTUP_NOTIFICATION
/* We're cheating as officially libsn requires
* us to send all events through sn_display_process_event
*/
i = 0;
display = ((XAnyEvent *) xevent)->display;
while (i < ScreenCount (display))
{
WnckScreen *s;
s = _wnck_screen_get_existing (i);
if (s != NULL)
sn_display_process_event (_wnck_screen_get_sn_display (s),
xevent);
++i;
}
#endif /* HAVE_STARTUP_NOTIFICATION */
break;
default:
break;
}
return GDK_FILTER_CONTINUE;
}
static void
wnck_handle_finalize (GObject *object)
{
WnckHandle *self;
self = WNCK_HANDLE (object);
gdk_window_remove_filter (NULL, filter_func, self);
G_OBJECT_CLASS (wnck_handle_parent_class)->finalize (object);
}
static void
wnck_handle_get_property (GObject *object,
guint property_id,
......@@ -114,6 +215,7 @@ wnck_handle_class_init (WnckHandleClass *self_class)
object_class = G_OBJECT_CLASS (self_class);
object_class->finalize = wnck_handle_finalize;
object_class->get_property = wnck_handle_get_property;
object_class->set_property = wnck_handle_set_property;
......@@ -125,6 +227,8 @@ wnck_handle_init (WnckHandle *self)
{
self->default_icon_size = WNCK_DEFAULT_ICON_SIZE;
self->default_mini_icon_size = WNCK_DEFAULT_MINI_ICON_SIZE;
gdk_window_add_filter (NULL, filter_func, self);
}
WnckHandle
......
......@@ -719,113 +719,6 @@ _wnck_error_trap_pop (Display *display)
return gdk_x11_display_error_trap_pop (gdk_display);
}
static GdkFilterReturn
filter_func (GdkXEvent *gdkxevent,
GdkEvent *event,
gpointer data)
{
XEvent *xevent = gdkxevent;
#ifdef HAVE_STARTUP_NOTIFICATION
int i;
Display *display;
#endif /* HAVE_STARTUP_NOTIFICATION */
switch (xevent->type)
{
case PropertyNotify:
{
WnckScreen *screen;
screen = wnck_screen_get_for_root (xevent->xany.window);
if (screen != NULL)
_wnck_screen_process_property_notify (screen, xevent);
else
{
WnckWindow *window;
WnckApplication *app;
window = wnck_window_get (xevent->xany.window);
app = wnck_application_get (xevent->xany.window);
if (app)
_wnck_application_process_property_notify (app, xevent);
if (window)
_wnck_window_process_property_notify (window, xevent);
}
}
break;
case ConfigureNotify:
{
WnckWindow *window;
window = wnck_window_get (xevent->xconfigure.window);
if (window)
_wnck_window_process_configure_notify (window, xevent);
}
break;
case SelectionClear:
{
_wnck_desktop_layout_manager_process_event (xevent);
}
break;
case ClientMessage:
#ifdef HAVE_STARTUP_NOTIFICATION
/* We're cheating as officially libsn requires
* us to send all events through sn_display_process_event
*/
i = 0;
display = ((XAnyEvent *) xevent)->display;
while (i < ScreenCount (display))
{
WnckScreen *s;
s = _wnck_screen_get_existing (i);
if (s != NULL)
sn_display_process_event (_wnck_screen_get_sn_display (s),
xevent);
++i;
}
#endif /* HAVE_STARTUP_NOTIFICATION */
break;
default:
break;
}
return GDK_FILTER_CONTINUE;
}
static gboolean _wnck_event_filter_initialized = FALSE;
void
_wnck_event_filter_init (void)
{
if (!_wnck_event_filter_initialized)
{
gdk_window_add_filter (NULL, filter_func, NULL);
_wnck_event_filter_initialized = TRUE;
}
}
void
_wnck_event_filter_shutdown (void)
{
if (_wnck_event_filter_initialized)
{
gdk_window_remove_filter (NULL, filter_func, NULL);
_wnck_event_filter_initialized = FALSE;
}
}
int
_wnck_xid_equal (gconstpointer v1,
gconstpointer v2)
......
......@@ -87,9 +87,6 @@ int _wnck_error_trap_pop (Display *display);
#define _wnck_atom_get(atom_name) gdk_x11_get_xatom_by_name (atom_name)
#define _wnck_atom_name(atom) gdk_x11_get_xatom_name (atom)
void _wnck_event_filter_init (void);
void _wnck_event_filter_shutdown (void);
int _wnck_xid_equal (gconstpointer v1,
gconstpointer v2);
guint _wnck_xid_hash (gconstpointer v);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment