diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index fe126be7c..fb7a648a1 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -179,9 +179,9 @@ static void _e_comp_x_focus_setup(E_Client *ec) { if (_e_comp_x_client_data_get(ec)->button_grabbed) return; - if (!((e_client_focus_policy_click(ec)) || + if ((!e_client_focus_policy_click(ec)) || (e_config->always_click_to_raise) || - (e_config->always_click_to_focus))) return; + (e_config->always_click_to_focus)) return; ecore_x_window_button_grab(_e_comp_x_client_util_win_get(ec), 1, ECORE_X_EVENT_MASK_MOUSE_DOWN | ECORE_X_EVENT_MASK_MOUSE_UP | @@ -2117,14 +2117,20 @@ _e_comp_x_mapping_change(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_E Ecore_X_Window win; if (e_pixmap_type_get(ec->pixmap) != E_PIXMAP_TYPE_X) continue; - win = _e_comp_x_client_util_pwin_get(ec); + win = _e_comp_x_client_util_win_get(ec); if ((!_e_comp_x_client_data_get(ec)->first_map) || (!_e_comp_x_client_data_get(ec)->reparented)) continue; - _e_comp_x_focus_setdown(ec); - e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, win); - e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, win); - e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, win); - e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, win); - _e_comp_x_focus_setup(ec); + if (ec->focused) + { + _e_comp_x_focus_setup(ec); + _e_comp_x_focus_setdown(ec); + } + else + { + _e_comp_x_focus_setdown(ec); + _e_comp_x_focus_setup(ec); + e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, win); + e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, win); + } } e_comp_canvas_keys_grab(); return ECORE_CALLBACK_PASS_ON; @@ -2899,9 +2905,14 @@ _e_comp_x_hook_client_pre_frame_assign(void *d EINA_UNUSED, E_Client *ec) ecore_x_window_show(pwin); } - _e_comp_x_focus_setup(ec); - e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, pwin); - e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, pwin); + if (ec->focused) + _e_comp_x_focus_setdown(ec); + else + { + _e_comp_x_focus_setup(ec); + e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, win); + e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, win); + } _e_comp_x_client_evas_init(ec); if (ec->netwm.ping && (!ec->ping_poller)) e_client_ping(ec); @@ -3145,7 +3156,10 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) else if (ec->netwm.type == E_WINDOW_TYPE_DESKTOP) { ec->focus_policy_override = E_FOCUS_CLICK; + _e_comp_x_focus_setdown(ec); _e_comp_x_focus_setup(ec); + e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, win); + e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, win); if (!ec->netwm.state.skip_pager) { ec->netwm.state.skip_pager = 1; @@ -4218,6 +4232,7 @@ static void _e_comp_x_hook_client_focus_unset(void *d EINA_UNUSED, E_Client *ec) { E_COMP_X_PIXMAP_CHECK; + _e_comp_x_focus_setup(ec); _e_comp_x_focus_check(); } @@ -4225,6 +4240,7 @@ static void _e_comp_x_hook_client_focus_set(void *d EINA_UNUSED, E_Client *ec) { focus_time = ecore_x_current_time_get(); + _e_comp_x_focus_setdown(ec); if (!_e_comp_x_client_has_xwindow(ec)) { e_grabinput_focus(e_comp->ee_win, E_FOCUS_METHOD_PASSIVE); @@ -4307,9 +4323,9 @@ _e_comp_x_hook_client_del(void *d EINA_UNUSED, E_Client *ec) ecore_x_window_prop_card32_set(win, E_ATOM_MANAGED, &visible, 1); if ((!ec->already_unparented) && cd && cd->reparented) { + _e_comp_x_focus_setdown(ec); e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, pwin); e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, pwin); - _e_comp_x_focus_setdown(ec); if (!cd->deleted) { if (stopping) @@ -4906,9 +4922,14 @@ _e_comp_x_bindings_grab_cb(void) EINA_LIST_FOREACH(e_comp->clients, l, ec) { if (e_client_util_ignored_get(ec)) continue; - _e_comp_x_focus_setup(ec); - e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, _e_comp_x_client_util_pwin_get(ec)); - e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, _e_comp_x_client_util_pwin_get(ec)); + if (ec->focused) + _e_comp_x_focus_setdown(ec); + else + { + _e_comp_x_focus_setup(ec); + e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, _e_comp_x_client_util_win_get(ec)); + e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, _e_comp_x_client_util_win_get(ec)); + } } } @@ -4920,10 +4941,16 @@ _e_comp_x_bindings_ungrab_cb(void) EINA_LIST_FOREACH(e_comp->clients, l, ec) { + Ecore_X_Window win; + if (e_client_util_ignored_get(ec)) continue; - _e_comp_x_focus_setdown(ec); - e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, _e_comp_x_client_util_pwin_get(ec)); - e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, _e_comp_x_client_util_pwin_get(ec)); + win = _e_comp_x_client_util_win_get(ec); + ecore_x_window_button_ungrab(win, 1, 0, 1); + ecore_x_window_button_ungrab(win, 2, 0, 1); + ecore_x_window_button_ungrab(win, 3, 0, 1); + e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, win); + e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, win); + _e_comp_x_client_data_get(ec)->button_grabbed = 0; } } diff --git a/src/bin/e_focus.c b/src/bin/e_focus.c index fc4cfbc3b..04f8bed04 100644 --- a/src/bin/e_focus.c +++ b/src/bin/e_focus.c @@ -61,50 +61,13 @@ e_focus_event_mouse_up(E_Client *ec EINA_UNUSED) } E_API void -e_focus_event_focus_in(E_Client *ec) +e_focus_event_focus_in(E_Client *ec EINA_UNUSED) { - if ((e_client_focus_policy_click(ec)) && - (!e_config->always_click_to_raise) && - (!e_config->always_click_to_focus)) - { - if (!ec->button_grabbed) return; - e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec)); - e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec)); -#ifndef HAVE_WAYLAND_ONLY - ecore_x_window_button_ungrab(e_client_util_win_get(ec), 1, 0, 1); - ecore_x_window_button_ungrab(e_client_util_win_get(ec), 2, 0, 1); - ecore_x_window_button_ungrab(e_client_util_win_get(ec), 3, 0, 1); -#endif - e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec)); - e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, e_client_util_pwin_get(ec)); - ec->button_grabbed = 0; - } } E_API void -e_focus_event_focus_out(E_Client *ec) +e_focus_event_focus_out(E_Client *ec EINA_UNUSED) { - if ((e_client_focus_policy_click(ec)) && - (!e_config->always_click_to_raise) && - (!e_config->always_click_to_focus)) - { - if (ec->button_grabbed) return; -#ifndef HAVE_WAYLAND_ONLY - ecore_x_window_button_grab(e_client_util_win_get(ec), 1, - ECORE_X_EVENT_MASK_MOUSE_DOWN | - ECORE_X_EVENT_MASK_MOUSE_UP | - ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1); - ecore_x_window_button_grab(e_client_util_win_get(ec), 2, - ECORE_X_EVENT_MASK_MOUSE_DOWN | - ECORE_X_EVENT_MASK_MOUSE_UP | - ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1); - ecore_x_window_button_grab(e_client_util_win_get(ec), 3, - ECORE_X_EVENT_MASK_MOUSE_DOWN | - ECORE_X_EVENT_MASK_MOUSE_UP | - ECORE_X_EVENT_MASK_MOUSE_MOVE, 0, 1); -#endif - ec->button_grabbed = 1; - } } /* local subsystem functions */