Handle input area set to full screen or reset during start-up
info->pending_input_region needed to be destroyed in mutter_set_stage_input_region() before it was set to something else or before it was reset to be full screen (region == None). Set the initial input area to an empty region by setting info->pending_input_region to an empty region by default and setting it to None or a new region if a new input region is specified. Remove show_overlay_window() function that was used to set an empty input region on start-up, and uses a call to do_set_stage_input_region() with info->pending_input_region as an argument instead.
This commit is contained in:
parent
c012105b90
commit
0a863b8c2b
@ -1738,21 +1738,6 @@ process_property_notify (Mutter *compositor,
|
|||||||
DEBUG_TRACE ("process_property_notify: unknown\n");
|
DEBUG_TRACE ("process_property_notify: unknown\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
show_overlay_window (Display *xdisplay, Window xstage, Window xoverlay)
|
|
||||||
{
|
|
||||||
XserverRegion region;
|
|
||||||
|
|
||||||
region = XFixesCreateRegion (xdisplay, NULL, 0);
|
|
||||||
|
|
||||||
XFixesSetWindowShapeRegion (xdisplay, xoverlay, ShapeBounding, 0, 0, 0);
|
|
||||||
|
|
||||||
XFixesSetWindowShapeRegion (xdisplay, xoverlay, ShapeInput, 0, 0, region);
|
|
||||||
XFixesSetWindowShapeRegion (xdisplay, xstage, ShapeInput, 0, 0, region);
|
|
||||||
|
|
||||||
XFixesDestroyRegion (xdisplay, region);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Window
|
static Window
|
||||||
get_output_window (MetaScreen *screen)
|
get_output_window (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
@ -1828,6 +1813,19 @@ mutter_get_windows (MetaScreen *screen)
|
|||||||
return info->windows;
|
return info->windows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_set_stage_input_region (MetaScreen *screen,
|
||||||
|
XserverRegion region)
|
||||||
|
{
|
||||||
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
|
Display *xdpy = meta_display_get_xdisplay (display);
|
||||||
|
Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||||
|
|
||||||
|
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
|
||||||
|
XFixesSetWindowShapeRegion (xdpy, info->output, ShapeInput, 0, 0, region);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mutter_set_stage_input_region (MetaScreen *screen,
|
mutter_set_stage_input_region (MetaScreen *screen,
|
||||||
XserverRegion region)
|
XserverRegion region)
|
||||||
@ -1838,16 +1836,23 @@ mutter_set_stage_input_region (MetaScreen *screen,
|
|||||||
|
|
||||||
if (info->stage && info->output)
|
if (info->stage && info->output)
|
||||||
{
|
{
|
||||||
Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
do_set_stage_input_region (screen, region);
|
||||||
|
|
||||||
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
|
|
||||||
XFixesSetWindowShapeRegion (xdpy, info->output, ShapeInput, 0, 0, region);
|
|
||||||
}
|
}
|
||||||
else if (region != None)
|
else
|
||||||
{
|
{
|
||||||
info->pending_input_region = XFixesCreateRegion (xdpy, NULL, 0);
|
/* Reset info->pending_input_region if one existed before and set the new
|
||||||
XFixesCopyRegion (xdpy, info->pending_input_region, region);
|
* one to use it later. */
|
||||||
}
|
if (info->pending_input_region)
|
||||||
|
{
|
||||||
|
XFixesDestroyRegion (xdpy, info->pending_input_region);
|
||||||
|
info->pending_input_region = None;
|
||||||
|
}
|
||||||
|
if (region != None)
|
||||||
|
{
|
||||||
|
info->pending_input_region = XFixesCreateRegion (xdpy, NULL, 0);
|
||||||
|
XFixesCopyRegion (xdpy, info->pending_input_region, region);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1898,6 +1903,14 @@ clutter_cmp_manage_screen (MetaCompositor *compositor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
info = g_new0 (MetaCompScreen, 1);
|
info = g_new0 (MetaCompScreen, 1);
|
||||||
|
/*
|
||||||
|
* We use an empty input region for Clutter as a default because that allows
|
||||||
|
* the user to interact with all the windows displayed on the screen.
|
||||||
|
* We have to initialize info->pending_input_region to an empty region explicitly,
|
||||||
|
* because None value is used to mean that the whole screen is an input region.
|
||||||
|
*/
|
||||||
|
info->pending_input_region = XFixesCreateRegion (xdisplay, NULL, 0);
|
||||||
|
|
||||||
info->screen = screen;
|
info->screen = screen;
|
||||||
|
|
||||||
meta_screen_set_compositor_data (screen, info);
|
meta_screen_set_compositor_data (screen, info);
|
||||||
@ -1962,11 +1975,19 @@ clutter_cmp_manage_screen (MetaCompositor *compositor,
|
|||||||
info->output = get_output_window (screen);
|
info->output = get_output_window (screen);
|
||||||
XReparentWindow (xdisplay, xwin, info->output, 0, 0);
|
XReparentWindow (xdisplay, xwin, info->output, 0, 0);
|
||||||
|
|
||||||
show_overlay_window (xdisplay, xwin, info->output);
|
/* Make sure there isn't any left-over output shape on the
|
||||||
|
* overlay window by setting the whole screen to be an
|
||||||
|
* output region.
|
||||||
|
*
|
||||||
|
* Note: there doesn't seem to be any real chance of that
|
||||||
|
* because the X server will destroy the overlay window
|
||||||
|
* when the last client using it exits.
|
||||||
|
*/
|
||||||
|
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, None);
|
||||||
|
|
||||||
|
do_set_stage_input_region (screen, info->pending_input_region);
|
||||||
if (info->pending_input_region != None)
|
if (info->pending_input_region != None)
|
||||||
{
|
{
|
||||||
mutter_set_stage_input_region (screen, info->pending_input_region);
|
|
||||||
XFixesDestroyRegion (xdisplay, info->pending_input_region);
|
XFixesDestroyRegion (xdisplay, info->pending_input_region);
|
||||||
info->pending_input_region = None;
|
info->pending_input_region = None;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user