forked from enlightenment/enlightenment
e17: set focus at the end of border_idler_before to the last focused window.
No need to sync ecore_x_window_focus then. in next mainloop iteration all requests should have been processed by X, or doesnt it? SVN revision: 57647
This commit is contained in:
parent
a22406c43c
commit
c51acd3708
|
@ -206,6 +206,8 @@ static Eina_List *handlers = NULL;
|
||||||
static Eina_List *borders = NULL;
|
static Eina_List *borders = NULL;
|
||||||
static Eina_Hash *borders_hash = NULL;
|
static Eina_Hash *borders_hash = NULL;
|
||||||
static E_Border *focused = NULL;
|
static E_Border *focused = NULL;
|
||||||
|
static Eina_List *focus_next = NULL;
|
||||||
|
static Ecore_X_Time focus_time = 0;
|
||||||
|
|
||||||
static E_Border *resize = NULL;
|
static E_Border *resize = NULL;
|
||||||
static E_Border *move = NULL;
|
static E_Border *move = NULL;
|
||||||
|
@ -1902,36 +1904,18 @@ e_border_focus_set(E_Border *bd,
|
||||||
{
|
{
|
||||||
E_Event_Border_Focus_In *ev;
|
E_Event_Border_Focus_In *ev;
|
||||||
|
|
||||||
if ((bd->visible) && (bd->changes.visible))
|
|
||||||
{
|
|
||||||
bd->want_focus = 1;
|
|
||||||
bd->changed = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (set)
|
if (set)
|
||||||
{
|
{
|
||||||
if ((bd->client.icccm.take_focus) &&
|
focus_next = eina_list_prepend(focus_next, bd);
|
||||||
(bd->client.icccm.accepts_focus))
|
|
||||||
{
|
|
||||||
e_grabinput_focus(bd->client.win, E_FOCUS_METHOD_LOCALLY_ACTIVE);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (!bd->client.icccm.accepts_focus)
|
|
||||||
{
|
|
||||||
e_grabinput_focus(bd->client.win, E_FOCUS_METHOD_GLOBALLY_ACTIVE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (!bd->client.icccm.take_focus)
|
|
||||||
{
|
|
||||||
e_grabinput_focus(bd->client.win, E_FOCUS_METHOD_PASSIVE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (focused)
|
if (focused)
|
||||||
unfocus = focused;
|
unfocus = focused;
|
||||||
|
|
||||||
bd->focused = 1;
|
bd->focused = 1;
|
||||||
focused = bd;
|
focused = bd;
|
||||||
|
|
||||||
e_focus_event_focus_in(bd);
|
e_focus_event_focus_in(bd);
|
||||||
e_border_focus_latest_set(bd);
|
e_border_focus_latest_set(bd);
|
||||||
e_hints_active_window_set(bd->zone->container->manager, bd);
|
e_hints_active_window_set(bd->zone->container->manager, bd);
|
||||||
|
@ -2957,6 +2941,36 @@ e_border_idler_before(void)
|
||||||
e_container_border_list_free(bl);
|
e_container_border_list_free(bl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (focus_next)
|
||||||
|
{
|
||||||
|
E_Border *bd = NULL, *bd2;
|
||||||
|
|
||||||
|
EINA_LIST_FREE(focus_next, bd2)
|
||||||
|
if ((!bd) && (bd2->visible)) bd = bd2;
|
||||||
|
|
||||||
|
if (!bd)
|
||||||
|
{
|
||||||
|
/* TODO revert focus when lost here ? */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
focus_time = ecore_x_current_time_get();
|
||||||
|
|
||||||
|
if ((bd->client.icccm.take_focus) &&
|
||||||
|
(bd->client.icccm.accepts_focus))
|
||||||
|
{
|
||||||
|
e_grabinput_focus(bd->client.win, E_FOCUS_METHOD_LOCALLY_ACTIVE);
|
||||||
|
}
|
||||||
|
else if (!bd->client.icccm.accepts_focus)
|
||||||
|
{
|
||||||
|
e_grabinput_focus(bd->client.win, E_FOCUS_METHOD_GLOBALLY_ACTIVE);
|
||||||
|
}
|
||||||
|
else if (!bd->client.icccm.take_focus)
|
||||||
|
{
|
||||||
|
e_grabinput_focus(bd->client.win, E_FOCUS_METHOD_PASSIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI Eina_List *
|
EAPI Eina_List *
|
||||||
|
@ -4163,6 +4177,11 @@ _e_border_del(E_Border *bd)
|
||||||
E_Event_Border_Remove *ev;
|
E_Event_Border_Remove *ev;
|
||||||
E_Border *child;
|
E_Border *child;
|
||||||
|
|
||||||
|
if (bd == focused)
|
||||||
|
focused = NULL;
|
||||||
|
|
||||||
|
focus_next = eina_list_remove(focus_next, bd);
|
||||||
|
|
||||||
if (bd->fullscreen) bd->desk->fullscreen_borders--;
|
if (bd->fullscreen) bd->desk->fullscreen_borders--;
|
||||||
|
|
||||||
if ((drag_border) && (drag_border->data == bd))
|
if ((drag_border) && (drag_border->data == bd))
|
||||||
|
@ -5001,6 +5020,7 @@ _e_border_cb_window_focus_in(void *data __UNUSED__,
|
||||||
{
|
{
|
||||||
if (e->detail == ECORE_X_EVENT_DETAIL_POINTER) return ECORE_CALLBACK_PASS_ON;
|
if (e->detail == ECORE_X_EVENT_DETAIL_POINTER) return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
if (e->time >= focus_time)
|
||||||
e_border_focus_set(bd, 1, 0);
|
e_border_focus_set(bd, 1, 0);
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include "e.h"
|
#include "e.h"
|
||||||
|
|
||||||
/* local subsystem functions */
|
/* local subsystem functions */
|
||||||
static void _e_grabinput_focus_job(void *data);
|
|
||||||
static void _e_grabinput_focus(Ecore_X_Window win, E_Focus_Method method);
|
static void _e_grabinput_focus(Ecore_X_Window win, E_Focus_Method method);
|
||||||
|
|
||||||
/* local subsystem globals */
|
/* local subsystem globals */
|
||||||
|
@ -9,9 +8,6 @@ static Ecore_X_Window grab_mouse_win = 0;
|
||||||
static Ecore_X_Window grab_key_win = 0;
|
static Ecore_X_Window grab_key_win = 0;
|
||||||
static Ecore_X_Window focus_win = 0;
|
static Ecore_X_Window focus_win = 0;
|
||||||
static E_Focus_Method focus_method = E_FOCUS_METHOD_NO_INPUT;
|
static E_Focus_Method focus_method = E_FOCUS_METHOD_NO_INPUT;
|
||||||
static Ecore_X_Window do_focus_win = 0;
|
|
||||||
static E_Focus_Method do_focus_method = E_FOCUS_METHOD_NO_INPUT;
|
|
||||||
static Ecore_Job *focus_job = NULL;
|
|
||||||
static double last_focus_time = 0.0;
|
static double last_focus_time = 0.0;
|
||||||
|
|
||||||
/* externally accessible functions */
|
/* externally accessible functions */
|
||||||
|
@ -102,11 +98,7 @@ e_grabinput_focus(Ecore_X_Window win, E_Focus_Method method)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
do_focus_win = win;
|
_e_grabinput_focus(win, method);
|
||||||
do_focus_method = method;
|
|
||||||
if (!focus_job)
|
|
||||||
focus_job = ecore_job_add(_e_grabinput_focus_job, NULL);
|
|
||||||
//_e_grabinput_focus(win, method);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,15 +108,6 @@ e_grabinput_last_focus_time_get(void)
|
||||||
return last_focus_time;
|
return last_focus_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* local subsystem functions */
|
|
||||||
static void
|
|
||||||
_e_grabinput_focus_job(void *data __UNUSED__)
|
|
||||||
{
|
|
||||||
focus_job = NULL;
|
|
||||||
_e_grabinput_focus(do_focus_win, do_focus_method);
|
|
||||||
do_focus_win = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_grabinput_focus(Ecore_X_Window win, E_Focus_Method method)
|
_e_grabinput_focus(Ecore_X_Window win, E_Focus_Method method)
|
||||||
{
|
{
|
||||||
|
@ -134,17 +117,13 @@ _e_grabinput_focus(Ecore_X_Window win, E_Focus_Method method)
|
||||||
break;
|
break;
|
||||||
case E_FOCUS_METHOD_LOCALLY_ACTIVE:
|
case E_FOCUS_METHOD_LOCALLY_ACTIVE:
|
||||||
ecore_x_window_focus(win);
|
ecore_x_window_focus(win);
|
||||||
ecore_x_sync(); // let x actually get the x focus request
|
|
||||||
ecore_x_icccm_take_focus_send(win, ecore_x_current_time_get());
|
ecore_x_icccm_take_focus_send(win, ecore_x_current_time_get());
|
||||||
ecore_x_sync(); // let x actually get the x focus request
|
|
||||||
break;
|
break;
|
||||||
case E_FOCUS_METHOD_GLOBALLY_ACTIVE:
|
case E_FOCUS_METHOD_GLOBALLY_ACTIVE:
|
||||||
ecore_x_icccm_take_focus_send(win, ecore_x_current_time_get());
|
ecore_x_icccm_take_focus_send(win, ecore_x_current_time_get());
|
||||||
ecore_x_sync(); // let x actually get the x focus request
|
|
||||||
break;
|
break;
|
||||||
case E_FOCUS_METHOD_PASSIVE:
|
case E_FOCUS_METHOD_PASSIVE:
|
||||||
ecore_x_window_focus(win);
|
ecore_x_window_focus(win);
|
||||||
ecore_x_sync(); // let x actually get the x focus request
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue