ecore-x: track whether ecore-x is internally "managing" the root window

Summary:
when ecore_x_window_manage is called, this is probably only for the case of
managing the root window, i.e., running a window manager. store this state
internally so that we can avoid calling additional XSelectInput later and
fucking up the expected eventing

Depends on D9899

Reviewers: devilhorns

Reviewed By: devilhorns

Subscribers: devilhorns, cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D10012
This commit is contained in:
Mike Blumenkrantz 2019-09-26 11:23:01 -04:00 committed by Christopher Michael
parent fddc27ed40
commit 2bc6754d39
1 changed files with 5 additions and 6 deletions

View File

@ -779,7 +779,7 @@ ecore_x_init_from_display(Ecore_X_Display *display)
eina_shutdown();
return --_ecore_x_init_count;
}
static Eina_Bool _ecore_x_window_manage_succeeded = EINA_FALSE;
int
_ecore_x_shutdown(void)
{
@ -855,6 +855,7 @@ _ecore_x_shutdown(void)
free(_ecore_x_event_handlers);
_ecore_x_fd_handler_handle = NULL;
_ecore_x_event_handlers = NULL;
_ecore_x_window_manage_succeeded = EINA_FALSE;
_ecore_x_events_shutdown();
_ecore_x_input_shutdown();
_ecore_x_selection_shutdown();
@ -1347,13 +1348,12 @@ ecore_x_window_root_first_get(void)
static void _ecore_x_window_manage_error(void *data);
static int _ecore_x_window_manage_failed = 0;
static void
_ecore_x_window_manage_error(void *data EINA_UNUSED)
{
if ((ecore_x_error_request_get() == X_ChangeWindowAttributes) &&
(ecore_x_error_code_get() == BadAccess))
_ecore_x_window_manage_failed = 1;
_ecore_x_window_manage_succeeded = EINA_FALSE;
}
EAPI Eina_Bool
@ -1367,7 +1367,7 @@ ecore_x_window_manage(Ecore_X_Window win)
return EINA_FALSE;
ecore_x_sync();
_ecore_x_window_manage_failed = 0;
_ecore_x_window_manage_succeeded = EINA_TRUE;
ecore_x_error_handler_set(_ecore_x_window_manage_error, NULL);
XSelectInput(_ecore_x_disp, win,
EnterWindowMask |
@ -1382,9 +1382,8 @@ ecore_x_window_manage(Ecore_X_Window win)
att.your_event_mask);
ecore_x_sync();
ecore_x_error_handler_set(NULL, NULL);
if (_ecore_x_window_manage_failed)
if (!_ecore_x_window_manage_succeeded)
{
_ecore_x_window_manage_failed = 0;
return EINA_FALSE;
}