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

Reply via email to