make click to focus behave a bit better - previously focused windwo gets the

focus now always - even in pointer focus. if flippign desktosp last window
focused on that desktop is focused bakc when u flip - they are options too :)


SVN revision: 15746
This commit is contained in:
Carsten Haitzler 2005-07-12 11:07:57 +00:00
parent 97902d95a3
commit b0b86dde57
6 changed files with 69 additions and 22 deletions

View File

@ -576,13 +576,6 @@ e_border_hide(E_Border *bd, int manage)
_e_border_resize_end(bd); _e_border_resize_end(bd);
} }
if (!bd->need_reparent)
{
if (bd->focused)
// ecore_x_window_focus(bd->zone->container->manager->root);
e_grabinput_focus(bd->zone->container->bg_win, E_FOCUS_METHOD_PASSIVE);
ecore_x_window_hide(bd->client.win);
}
e_container_shape_hide(bd->shape); e_container_shape_hide(bd->shape);
/* FIXME: If the client unmaps itself, the border should be /* FIXME: If the client unmaps itself, the border should be
* withdrawn, not iconic */ * withdrawn, not iconic */
@ -592,6 +585,17 @@ e_border_hide(E_Border *bd, int manage)
bd->visible = 0; bd->visible = 0;
bd->changes.visible = 1; bd->changes.visible = 1;
if (!bd->need_reparent)
{
if (bd->focused)
{
e_border_focus_set(bd, 0, 1);
if (e_config->focus_revert_on_hide_or_close)
e_desk_last_focused_focus(bd->desk);
}
ecore_x_window_hide(bd->client.win);
}
visible = 0; visible = 0;
ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_MAPPED, &visible, 1); ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_MAPPED, &visible, 1);
if (!manage) if (!manage)
@ -853,6 +857,12 @@ e_border_focus_set(E_Border *bd, int focus, int set)
E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
if ((focus) && (!bd->focused)) if ((focus) && (!bd->focused))
{ {
if ((bd->visible) && (bd->changes.visible))
{
bd->want_focus = 1;
bd->changed = 1;
return;
}
if (!e_winlist_active_get()) if (!e_winlist_active_get())
{ {
focus_stack = evas_list_remove(focus_stack, bd); focus_stack = evas_list_remove(focus_stack, bd);
@ -1901,6 +1911,11 @@ e_border_immortal_windows_get(void)
static void static void
_e_border_free(E_Border *bd) _e_border_free(E_Border *bd)
{ {
if (bd->focused)
{
if (e_config->focus_revert_on_hide_or_close)
e_desk_last_focused_focus(bd->desk);
}
if (resize == bd) if (resize == bd)
_e_border_resize_end(bd); _e_border_resize_end(bd);
if (move == bd) if (move == bd)
@ -2908,10 +2923,7 @@ _e_border_cb_pointer_warp(void *data, int ev_type, void *ev)
e = ev; e = ev;
if (!move) return 1; if (!move) return 1;
printf("warp: %d %d %d %d\n", e->curr.x, e->prev.x, e->curr.y, e->prev.y);
e_border_move(move, move->x + (e->curr.x - e->prev.x), move->y + (e->curr.y - e->prev.y)); e_border_move(move, move->x + (e->curr.x - e->prev.x), move->y + (e->curr.y - e->prev.y));
return 1; return 1;
} }
@ -4709,16 +4721,15 @@ _e_border_eval(E_Border *bd)
} }
bd->need_shape_export = 0; bd->need_shape_export = 0;
} }
if (bd->take_focus) if ((bd->take_focus) || (bd->want_focus))
{ {
if (e_config->focus_setting == E_FOCUS_NEW_WINDOW) if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
(bd->want_focus))
{ {
if (!bd->lock_focus_out) if (!bd->lock_focus_out)
{ e_border_focus_set(bd, 1, 1);
printf("noo\n"); bd->want_focus = 0;
e_border_focus_set(bd, 1, 1);
}
} }
else else
{ {
@ -4732,7 +4743,6 @@ _e_border_eval(E_Border *bd)
{ {
if (!bd->lock_focus_out) if (!bd->lock_focus_out)
{ {
printf("noo2\n");
e_border_focus_set(bd, 1, 1); e_border_focus_set(bd, 1, 1);
} }
} }

View File

@ -285,6 +285,7 @@ struct _E_Border
unsigned int ping_ok : 1; unsigned int ping_ok : 1;
unsigned int hung : 1; unsigned int hung : 1;
unsigned int take_focus : 1; unsigned int take_focus : 1;
unsigned int want_focus : 1;
unsigned int user_skip_winlist : 1; unsigned int user_skip_winlist : 1;
E_Maximize maximized; E_Maximize maximized;

View File

@ -244,8 +244,10 @@ e_config_init(void)
E_CONFIG_VAL(D, T, transition_desk, STR); /**/ E_CONFIG_VAL(D, T, transition_desk, STR); /**/
E_CONFIG_VAL(D, T, transition_change, STR); /**/ E_CONFIG_VAL(D, T, transition_change, STR); /**/
E_CONFIG_LIST(D, T, remembers, _e_config_remember_edd); E_CONFIG_LIST(D, T, remembers, _e_config_remember_edd);
E_CONFIG_VAL(D, T, move_info_follows, INT); /**/ E_CONFIG_VAL(D, T, move_info_follows, INT);
E_CONFIG_VAL(D, T, resize_info_follows, INT); /**/ E_CONFIG_VAL(D, T, resize_info_follows, INT);
E_CONFIG_VAL(D, T, focus_last_focused_per_desktop, INT);
E_CONFIG_VAL(D, T, focus_revert_on_hide_or_close, INT);
e_config = e_config_domain_load("e", _e_config_edd); e_config = e_config_domain_load("e", _e_config_edd);
if (e_config) if (e_config)
@ -348,6 +350,9 @@ e_config_init(void)
e_config->transition_change = strdup("crossfade"); e_config->transition_change = strdup("crossfade");
e_config->move_info_follows = 1; e_config->move_info_follows = 1;
e_config->resize_info_follows = 1; e_config->resize_info_follows = 1;
e_config->focus_last_focused_per_desktop = 1;
e_config->focus_revert_on_hide_or_close = 1;
{ {
E_Config_Module *em; E_Config_Module *em;
@ -877,6 +882,10 @@ e_config_init(void)
E_CONFIG_LIMIT(e_config->kill_timer_wait, 0.0, 120.0); E_CONFIG_LIMIT(e_config->kill_timer_wait, 0.0, 120.0);
E_CONFIG_LIMIT(e_config->ping_clients, 0, 1); E_CONFIG_LIMIT(e_config->ping_clients, 0, 1);
E_CONFIG_LIMIT(e_config->ping_clients_wait, 0.0, 120.0); E_CONFIG_LIMIT(e_config->ping_clients_wait, 0.0, 120.0);
E_CONFIG_LIMIT(e_config->move_info_follows, 0, 1);
E_CONFIG_LIMIT(e_config->resize_info_follows, 0, 1);
E_CONFIG_LIMIT(e_config->focus_last_focused_per_desktop, 0, 1);
E_CONFIG_LIMIT(e_config->focus_revert_on_hide_or_close, 0, 1);
/* apply lang config - exception because config is loaded after intl setup */ /* apply lang config - exception because config is loaded after intl setup */

View File

@ -47,7 +47,7 @@ typedef Eet_Data_Descriptor E_Config_DD;
* defaults for e to work - started at 100 when we introduced this config * defaults for e to work - started at 100 when we introduced this config
* versioning feature * versioning feature
*/ */
#define E_CONFIG_FILE_VERSION 118 #define E_CONFIG_FILE_VERSION 119
#define E_EVAS_ENGINE_DEFAULT 0 #define E_EVAS_ENGINE_DEFAULT 0
#define E_EVAS_ENGINE_SOFTWARE_X11 1 #define E_EVAS_ENGINE_SOFTWARE_X11 1
@ -137,6 +137,8 @@ struct _E_Config
Evas_List *remembers; Evas_List *remembers;
int move_info_follows; int move_info_follows;
int resize_info_follows; int resize_info_follows;
int focus_last_focused_per_desktop;
int focus_revert_on_hide_or_close;
}; };
struct _E_Config_Module struct _E_Config_Module

View File

@ -83,6 +83,7 @@ e_desk_show(E_Desk *desk)
int was_zone = 0; int was_zone = 0;
int x, y; int x, y;
E_Event_Desk_Show *ev; E_Event_Desk_Show *ev;
Evas_List *l;
E_OBJECT_CHECK(desk); E_OBJECT_CHECK(desk);
E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE); E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
@ -118,7 +119,10 @@ e_desk_show(E_Desk *desk)
} }
} }
e_container_border_list_free(bl); e_container_border_list_free(bl);
if (e_config->focus_last_focused_per_desktop)
e_desk_last_focused_focus(desk);
desk->zone->desk_x_current = desk->x; desk->zone->desk_x_current = desk->x;
desk->zone->desk_y_current = desk->y; desk->zone->desk_y_current = desk->y;
if (desk->fullscreen) if (desk->fullscreen)
@ -141,6 +145,26 @@ e_desk_show(E_Desk *desk)
} }
void
e_desk_last_focused_focus(E_Desk *desk)
{
Evas_List *l;
E_Border *bd;
for (l = e_border_focus_stack_get(); l; l = l->next)
{
bd = l->data;
if ((!bd->iconic) && (bd->visible) &&
(((bd->desk == desk) ||
((bd->sticky) && (bd->zone == desk->zone)))))
{
/* this was the window last focused in this desktop */
e_border_focus_set(bd, 1, 1);
break;
}
}
}
void void
e_desk_fullscreen_set(E_Desk *desk, E_Border *bd) e_desk_fullscreen_set(E_Desk *desk, E_Border *bd)
{ {

View File

@ -39,6 +39,7 @@ EAPI int e_desk_shutdown(void);
EAPI E_Desk *e_desk_new(E_Zone *zone, int x, int y); EAPI E_Desk *e_desk_new(E_Zone *zone, int x, int y);
EAPI void e_desk_name_set(E_Desk *desk, const char *name); EAPI void e_desk_name_set(E_Desk *desk, const char *name);
EAPI void e_desk_show(E_Desk *desk); EAPI void e_desk_show(E_Desk *desk);
EAPI void e_desk_last_focused_focus(E_Desk *desk);
EAPI void e_desk_fullscreen_set(E_Desk *desk, E_Border *bd); EAPI void e_desk_fullscreen_set(E_Desk *desk, E_Border *bd);
EAPI E_Desk *e_desk_current_get(E_Zone *zone); EAPI E_Desk *e_desk_current_get(E_Zone *zone);
EAPI E_Desk *e_desk_at_xy_get(E_Zone *zone, int x, int y); EAPI E_Desk *e_desk_at_xy_get(E_Zone *zone, int x, int y);