Enlightenment CVS committal
Author : sleuth
Project : e17
Module : apps/e
Dir : e17/apps/e/src
Modified Files:
border.h border.c desktops.c
Log Message:
And fixup desktop switching when windows are closed/loose focus.
Which recreates the focus problem. Try this instead. Cleanup focus switching
on app destruction, plus retain focus when no app is on a desktop.
Kevin Brosius <[EMAIL PROTECTED]>
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/border.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- border.h 15 Jan 2003 18:29:55 -0000 1.21
+++ border.h 7 Feb 2003 17:17:57 -0000 1.22
@@ -258,4 +258,6 @@
Evas_List *e_border_get_borders_list();
void e_borders_scroll_list(Evas_List *borders,
int dx, int dy);
+void e_border_check_select( void );
+
#endif
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/border.c,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -3 -r1.76 -r1.77
--- border.c 6 Feb 2003 04:50:56 -0000 1.76
+++ border.c 7 Feb 2003 17:17:57 -0000 1.77
@@ -79,6 +79,8 @@
static void e_border_poll(int val, void *data);
static void e_border_cleanup(E_Border * b);
+E_Border *e_border_shuffle_last(E_Border *b);
+E_Border *e_border_current_select(void);
static int
e_border_replay_query(Ecore_Event_Mouse_Down * ev)
@@ -129,17 +131,32 @@
}
}
- /* Check for a focused border, else focus the desktop */
- if( !e_border_current_focused())
- {
- if( !e_desktop_raise_next_border())
- e_icccm_send_focus_to( e_desktop_window(), 1);
- }
e_db_runtime_flush();
D_RETURN;
}
+void
+e_border_check_select( void )
+{
+ E_Border *b;
+ E_Desktop *current_desk;
+
+ current_desk = e_desktops_get(e_desktops_get_current());
+
+ /* If no borders exist on present desktop */
+ if (!current_desk || !current_desk->windows)
+ {
+ e_icccm_send_focus_to( e_desktop_window(), 1);
+ D_RETURN_(NULL);
+ }
+
+ if((b = e_border_current_focused()))
+ e_icccm_send_focus_to( b->win.client, 1);
+ else
+ e_border_shuffle_last(b);
+}
+
static void
e_idle(void *data)
{
@@ -348,7 +365,10 @@
border_mouse_x, border_mouse_y);
if (e_object_get_usecount(E_OBJECT(b)) == 1)
- e_border_release(b);
+ {
+ e_border_release(b);
+ e_border_shuffle_last(b);
+ }
e_object_unref(E_OBJECT(b));
}
}
@@ -382,7 +402,10 @@
border_mouse_x, border_mouse_y);
if (e_object_get_usecount(E_OBJECT(b)) == 1)
+ {
e_border_release(b);
+ e_border_shuffle_last(b);
+ }
e_object_unref(E_OBJECT(b));
}
}
@@ -1373,7 +1396,8 @@
ecore_window_reparent(b->win.client, 0, b->current.x + pl,
b->current.y + pt);
e_icccm_release(b->win.client);
-
+ e_icccm_send_focus_to( e_desktop_window(), 1);
+
D_RETURN;
}
@@ -1625,6 +1649,8 @@
e_border_attach_mouse_grabs(b);
+ /* e_icccm_send_focus_to(b->win.client, 1);*/
+
borders = evas_list_prepend(borders, b);
e_observee_notify_all_observers(E_OBSERVEE(b), E_EVENT_BORDER_NEW, NULL);
@@ -2638,6 +2664,30 @@
D_RETURN;
}
+
+E_Border *
+e_border_current_select(void)
+{
+ Evas_List * l;
+ E_Desktop * desk;
+
+ /* Only check for borders on the current desktop */
+ desk = e_desktops_get(e_desktops_get_current());
+
+ D_ENTER;
+ for (l = borders; l; l = l->next)
+ {
+ E_Border *b;
+
+ b = l->data;
+ if (b->current.selected && b->desk == desk)
+ D_RETURN_(b);
+ }
+
+ D_RETURN_(NULL);
+}
+
+
E_Border *
e_border_current_focused(void)
{
@@ -2653,9 +2703,7 @@
E_Border *b;
b = l->data;
- if (b->current.selected &&
- b->desk == desk
- )
+ if (b->current.selected && b->desk == desk)
D_RETURN_(b);
}
for (l = borders; l; l = l->next)
@@ -2663,9 +2711,7 @@
E_Border *b;
b = l->data;
- if (b->current.select_lost_from_grab &&
- b->desk == desk
- )
+ if (b->current.select_lost_from_grab && b->desk == desk)
D_RETURN_(b);
}
@@ -2676,17 +2722,24 @@
e_border_focus_grab_ended(void)
{
Evas_List * l;
+ E_Desktop *desk;
D_ENTER;
+ desk = e_desktops_get(e_desktops_get_current());
+
for (l = borders; l; l = l->next)
{
E_Border *b;
b = l->data;
- b->current.select_lost_from_grab = 0;
- b->current.selected = 0;
- b->changed = 1;
+ /* Only change selection of items on present desktop */
+ if(b->desk == desk)
+ {
+ b->current.select_lost_from_grab = 0;
+ b->current.selected = 0;
+ b->changed = 1;
+ }
}
D_RETURN;
@@ -2804,4 +2857,42 @@
b->changed = 1;
}
}
+}
+
+
+E_Border *
+e_border_shuffle_last(E_Border *b)
+{
+ Evas_List * next;
+ E_Border *start;
+ E_Border *current = NULL;
+ E_Desktop *current_desk;
+
+ D_ENTER;
+
+ current_desk = e_desktops_get(e_desktops_get_current());
+
+ if (!current_desk || !current_desk->windows)
+ {
+ e_icccm_send_focus_to( e_desktop_window(), 1);
+ D_RETURN_(NULL);
+ }
+
+ if(b)
+ current = b;
+ else
+ current = evas_list_last(current_desk->windows)->data;
+
+ /* Find the current border on the list of borders */
+ for (next = current_desk->windows; next && next->data != current; next =
+next->next);
+
+ /* Step to the next border, wrap around the queue if the end is reached */
+ if (next && next->prev)
+ current = next->prev->data;
+ else
+ current = evas_list_last(next)->data;
+
+ e_icccm_send_focus_to(current->win.client, current->client.takes_focus);
+
+ D_RETURN_(current);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/desktops.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -3 -r1.50 -r1.51
--- desktops.c 6 Feb 2003 04:50:56 -0000 1.50
+++ desktops.c 7 Feb 2003 17:18:00 -0000 1.51
@@ -800,6 +800,8 @@
e_desktops_show(desk);
current_desk = desk;
+ e_border_check_select();
+
e_icccm_set_desk_area(0, desk->desk.area.x, desk->desk.area.y);
e_icccm_set_desk(0, desk->desk.desk);
e_observee_notify_observers(E_OBSERVEE(desk), E_EVENT_DESKTOP_SWITCH, NULL);
-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs