mirror of
https://github.com/brl/mutter.git
synced 2025-02-23 00:14:09 +00:00
No longer handle ConfigureNotify events directly in mutter
We are now informed of window moves/resizes via callbacks from src/core instead.
This commit is contained in:
parent
6849735e9d
commit
f956853550
@ -79,6 +79,12 @@ struct _MetaCompositor
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
gboolean hidden);
|
||||
void (*sync_window_geometry) (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void (*sync_screen_size) (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
guint width,
|
||||
guint height);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -275,3 +275,25 @@ meta_compositor_set_window_hidden (MetaCompositor *compositor,
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->sync_window_geometry)
|
||||
compositor->sync_window_geometry (compositor, window);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
meta_compositor_sync_screen_size (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
guint width,
|
||||
guint height)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
if (compositor && compositor->sync_screen_size)
|
||||
compositor->sync_screen_size (compositor, screen, width, height);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -59,6 +59,8 @@
|
||||
g_warning ("Integrity check of list failed at %s:%d\n", \
|
||||
__FILE__, __LINE__); }
|
||||
|
||||
/* #define DEBUG_TRACE g_print */
|
||||
#define DEBUG_TRACE(X)
|
||||
|
||||
/*
|
||||
* Register GType wrapper for XWindowAttributes, so we do not have to
|
||||
@ -1450,60 +1452,6 @@ process_shape (Mutter *compositor,
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
process_configure_notify (Mutter *compositor,
|
||||
XConfigureEvent *event)
|
||||
{
|
||||
MetaDisplay *display = compositor->display;
|
||||
MutterWindow *cw;
|
||||
|
||||
/*
|
||||
* We get each configure event twice; once through the WM solicitation of the
|
||||
* events on the root window, and once through solicitation on the window
|
||||
* itself -- we will only handle the latter, in which case the event and
|
||||
* window members of the config event are identical.
|
||||
*/
|
||||
if (event->event != event->window)
|
||||
return;
|
||||
|
||||
cw = find_window_in_display (display, event->window);
|
||||
|
||||
if (cw)
|
||||
{
|
||||
sync_actor_position (cw);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Check for root window geometry change
|
||||
*/
|
||||
GSList *l = meta_display_get_screens (display);
|
||||
|
||||
while (l)
|
||||
{
|
||||
MetaScreen *screen = l->data;
|
||||
Window xroot = meta_screen_get_xroot (screen);
|
||||
|
||||
if (event->window == xroot)
|
||||
{
|
||||
gint width;
|
||||
gint height;
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
meta_screen_get_size (screen, &width, &height);
|
||||
clutter_actor_set_size (info->stage, width, height);
|
||||
|
||||
meta_verbose ("Changed size for stage on screen %d to %dx%d\n",
|
||||
meta_screen_get_screen_number (screen),
|
||||
width, height);
|
||||
break;
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
process_property_notify (Mutter *compositor,
|
||||
XPropertyEvent *event)
|
||||
@ -1526,7 +1474,10 @@ process_property_notify (Mutter *compositor,
|
||||
}
|
||||
|
||||
if (!cw)
|
||||
return;
|
||||
{
|
||||
DEBUG_TRACE ("process_property_notify: opacity, early exit\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (meta_prop_get_cardinal (display, event->window,
|
||||
compositor->atom_net_wm_window_opacity,
|
||||
@ -1548,11 +1499,16 @@ process_property_notify (Mutter *compositor,
|
||||
MutterWindow *cw = find_window_in_display (display, event->window);
|
||||
|
||||
if (!cw)
|
||||
return;
|
||||
{
|
||||
DEBUG_TRACE ("process_property_notify: net_wm_type, early exit\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mutter_window_query_window_type (cw);
|
||||
DEBUG_TRACE ("process_property_notify: net_wm_type\n");
|
||||
return;
|
||||
}
|
||||
DEBUG_TRACE ("process_property_notify: unknown\n");
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1741,6 +1697,7 @@ clutter_cmp_add_window (MetaCompositor *compositor,
|
||||
MetaScreen *screen = meta_window_get_screen (window);
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_add_window\n");
|
||||
meta_error_trap_push (display);
|
||||
|
||||
add_win (window);
|
||||
@ -1756,6 +1713,7 @@ clutter_cmp_remove_window (MetaCompositor *compositor,
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
MutterWindow *cw = NULL;
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_remove_window\n");
|
||||
cw = meta_window_get_compositor_private (window);
|
||||
if (!cw)
|
||||
return;
|
||||
@ -1792,7 +1750,10 @@ clutter_cmp_process_event (MetaCompositor *compositor,
|
||||
|
||||
if (mutter_plugin_manager_xevent_filter (info->plugin_mgr,
|
||||
event) == TRUE)
|
||||
return;
|
||||
{
|
||||
DEBUG_TRACE ("clutter_cmp_process_event (filtered,window==NULL)\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1811,6 +1772,7 @@ clutter_cmp_process_event (MetaCompositor *compositor,
|
||||
if (mutter_plugin_manager_xevent_filter (info->plugin_mgr,
|
||||
event) == TRUE)
|
||||
{
|
||||
DEBUG_TRACE ("clutter_cmp_process_event (filtered,window==NULL)\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1828,10 +1790,6 @@ clutter_cmp_process_event (MetaCompositor *compositor,
|
||||
meta_error_trap_push (xrc->display);
|
||||
switch (event->type)
|
||||
{
|
||||
case ConfigureNotify:
|
||||
process_configure_notify (xrc, (XConfigureEvent *) event);
|
||||
break;
|
||||
|
||||
case PropertyNotify:
|
||||
process_property_notify (xrc, (XPropertyEvent *) event);
|
||||
break;
|
||||
@ -1839,11 +1797,15 @@ clutter_cmp_process_event (MetaCompositor *compositor,
|
||||
default:
|
||||
if (event->type == meta_display_get_damage_event_base (xrc->display) + XDamageNotify)
|
||||
{
|
||||
DEBUG_TRACE ("clutter_cmp_process_event (process_damage)\n");
|
||||
process_damage (xrc, (XDamageNotifyEvent *) event);
|
||||
}
|
||||
#ifdef HAVE_SHAPE
|
||||
else if (event->type == meta_display_get_shape_event_base (xrc->display) + ShapeNotify)
|
||||
process_shape (xrc, (XShapeEvent *) event);
|
||||
{
|
||||
DEBUG_TRACE ("clutter_cmp_process_event (process_shape)\n");
|
||||
process_shape (xrc, (XShapeEvent *) event);
|
||||
}
|
||||
#endif /* HAVE_SHAPE */
|
||||
break;
|
||||
}
|
||||
@ -1879,6 +1841,7 @@ clutter_cmp_map_window (MetaCompositor *compositor, MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
MutterWindow *cw = meta_window_get_compositor_private (window);
|
||||
DEBUG_TRACE ("clutter_cmp_map_window\n");
|
||||
if (!cw)
|
||||
return;
|
||||
|
||||
@ -1891,6 +1854,7 @@ clutter_cmp_unmap_window (MetaCompositor *compositor, MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
MutterWindow *cw = meta_window_get_compositor_private (window);
|
||||
DEBUG_TRACE ("clutter_cmp_unmap_window\n");
|
||||
if (!cw)
|
||||
return;
|
||||
|
||||
@ -1909,6 +1873,8 @@ clutter_cmp_minimize_window (MetaCompositor *compositor,
|
||||
MetaScreen *screen = meta_window_get_screen (window);
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_minimize_window\n");
|
||||
|
||||
g_return_if_fail (info);
|
||||
|
||||
if (!cw)
|
||||
@ -1964,6 +1930,7 @@ clutter_cmp_unminimize_window (MetaCompositor *compositor,
|
||||
}
|
||||
#else
|
||||
MutterWindow *cw = meta_window_get_compositor_private (window);
|
||||
DEBUG_TRACE ("clutter_cmp_unminimize_window\n");
|
||||
if (!cw)
|
||||
return;
|
||||
|
||||
@ -1983,6 +1950,7 @@ clutter_cmp_maximize_window (MetaCompositor *compositor,
|
||||
MetaScreen *screen = meta_window_get_screen (window);
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_maximize_window\n");
|
||||
g_return_if_fail (info);
|
||||
|
||||
if (!cw)
|
||||
@ -2014,6 +1982,7 @@ clutter_cmp_unmaximize_window (MetaCompositor *compositor,
|
||||
|
||||
g_return_if_fail (info);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_unmaximize_window\n");
|
||||
if (!cw)
|
||||
return;
|
||||
|
||||
@ -2040,6 +2009,7 @@ clutter_cmp_update_workspace_geometry (MetaCompositor *compositor,
|
||||
MetaCompScreen *info;
|
||||
MutterPluginManager *mgr;
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_update_workspace_geometry\n");
|
||||
info = meta_screen_get_compositor_data (screen);
|
||||
mgr = info->plugin_mgr;
|
||||
|
||||
@ -2065,6 +2035,7 @@ clutter_cmp_switch_workspace (MetaCompositor *compositor,
|
||||
to_indx = meta_workspace_index (to);
|
||||
from_indx = meta_workspace_index (from);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_switch_workspace\n");
|
||||
if (!meta_prefs_get_live_hidden_windows ())
|
||||
{
|
||||
GList *l;
|
||||
@ -2152,7 +2123,8 @@ clutter_cmp_sync_stack (MetaCompositor *compositor,
|
||||
{
|
||||
GList *tmp;
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_sync_stack\n");
|
||||
/* NB: The first entry in stack, is stacked the highest */
|
||||
|
||||
for (tmp = stack; tmp != NULL; tmp = tmp->next)
|
||||
@ -2183,6 +2155,7 @@ clutter_cmp_set_window_hidden (MetaCompositor *compositor,
|
||||
MutterWindow *cw = window->compositor_private;
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_set_window_hidden\n");
|
||||
if (!cw)
|
||||
return;
|
||||
|
||||
@ -2202,6 +2175,46 @@ clutter_cmp_set_window_hidden (MetaCompositor *compositor,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_cmp_sync_window_geometry (MetaCompositor *compositor,
|
||||
MetaWindow *window)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
MutterWindow *cw = meta_window_get_compositor_private (window);
|
||||
MetaScreen *screen = meta_window_get_screen (window);
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_sync_window_geometry\n");
|
||||
g_return_if_fail (info);
|
||||
|
||||
if (!cw)
|
||||
return;
|
||||
|
||||
sync_actor_position (cw);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_cmp_sync_screen_size (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
guint width,
|
||||
guint height)
|
||||
{
|
||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||
|
||||
DEBUG_TRACE ("clutter_cmp_sync_screen_size\n");
|
||||
g_return_if_fail (info);
|
||||
|
||||
clutter_actor_set_size (info->stage, width, height);
|
||||
|
||||
meta_verbose ("Changed size for stage on screen %d to %dx%d\n",
|
||||
meta_screen_get_screen_number (screen),
|
||||
width, height);
|
||||
#endif
|
||||
}
|
||||
|
||||
static MetaCompositor comp_info = {
|
||||
clutter_cmp_destroy,
|
||||
clutter_cmp_manage_screen,
|
||||
@ -2221,7 +2234,9 @@ static MetaCompositor comp_info = {
|
||||
clutter_cmp_update_workspace_geometry,
|
||||
clutter_cmp_switch_workspace,
|
||||
clutter_cmp_sync_stack,
|
||||
clutter_cmp_set_window_hidden
|
||||
clutter_cmp_set_window_hidden,
|
||||
clutter_cmp_sync_window_geometry,
|
||||
clutter_cmp_sync_screen_size
|
||||
};
|
||||
|
||||
MetaCompositor *
|
||||
|
@ -2353,6 +2353,10 @@ meta_screen_resize (MetaScreen *screen,
|
||||
reload_xinerama_infos (screen);
|
||||
set_desktop_geometry_hint (screen);
|
||||
|
||||
if (screen->display->compositor)
|
||||
meta_compositor_sync_screen_size (screen->display->compositor,
|
||||
screen, width, height);
|
||||
|
||||
/* Queue a resize on all the windows */
|
||||
meta_screen_foreach_window (screen, meta_screen_resize_func, 0);
|
||||
}
|
||||
|
@ -3721,6 +3721,8 @@ meta_window_move_resize_internal (MetaWindow *window,
|
||||
newx, newy, window->rect.width, window->rect.height,
|
||||
window->user_rect.x, window->user_rect.y,
|
||||
window->user_rect.width, window->user_rect.height);
|
||||
meta_compositor_sync_window_geometry (window->display->compositor,
|
||||
window);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3878,6 +3880,8 @@ meta_window_configure_notify (MetaWindow *window, XConfigureEvent *event)
|
||||
window->rect.height = event->height;
|
||||
if (!event->override_redirect && !event->send_event)
|
||||
meta_warning ("Unhandled change of windows override redirect status\n");
|
||||
|
||||
meta_compositor_sync_window_geometry (window->display->compositor, window);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -145,6 +145,15 @@ meta_compositor_set_window_hidden (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
gboolean hidden);
|
||||
|
||||
void
|
||||
meta_compositor_sync_window_geometry (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void
|
||||
meta_compositor_sync_screen_size (MetaCompositor *compositor,
|
||||
MetaScreen *screen,
|
||||
guint width,
|
||||
guint height);
|
||||
#endif
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user