Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        E.h focus.c 


Log Message:
Attempt to improve focusing of new windows.
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v
retrieving revision 1.443
retrieving revision 1.444
diff -u -3 -r1.443 -r1.444
--- E.h 29 May 2005 17:52:02 -0000      1.443
+++ E.h 29 May 2005 18:58:38 -0000      1.444
@@ -1734,17 +1734,18 @@
 EWin              **ListGroupMembers(Window win, int *num);
 
 /* focus.c */
-#define FOCUS_SET         0
-#define FOCUS_NONE        1
-#define FOCUS_ENTER       2
-#define FOCUS_LEAVE       3
-#define FOCUS_EWIN_NEW    4
-#define FOCUS_EWIN_GONE   5
-#define FOCUS_DESK_ENTER  6
-#define FOCUS_DESK_LEAVE  7
-#define FOCUS_NEXT        8
-#define FOCUS_PREV        9
-#define FOCUS_CLICK      10
+#define FOCUS_NOP         0
+#define FOCUS_SET         1
+#define FOCUS_NONE        2
+#define FOCUS_ENTER       3
+#define FOCUS_LEAVE       4
+#define FOCUS_EWIN_NEW    5
+#define FOCUS_EWIN_GONE   6
+#define FOCUS_DESK_ENTER  7
+#define FOCUS_DESK_LEAVE  8
+#define FOCUS_NEXT        9
+#define FOCUS_PREV       10
+#define FOCUS_CLICK      11
 
 void                FocusEnable(int on);
 void                FocusGetNextEwin(void);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/focus.c,v
retrieving revision 1.99
retrieving revision 1.100
diff -u -3 -r1.99 -r1.100
--- focus.c     29 May 2005 14:59:16 -0000      1.99
+++ focus.c     29 May 2005 18:58:38 -0000      1.100
@@ -24,7 +24,9 @@
 #include "E.h"
 
 static int          focus_inhibit = 1;
-static int          focus_new_desk_nesting = 0;
+static int          focus_pending_why = 0;
+static EWin        *focus_pending_ewin = NULL;
+static EWin        *focus_pending_new = NULL;
 
 void
 FocusEnable(int on)
@@ -48,11 +50,17 @@
  * on_screen: Require window to be on-screen now
  */
 static int
-FocusEwinValid(EWin * ewin, int on_screen)
+FocusEwinValid(EWin * ewin, int want_on_screen, int click, int want_visible)
 {
    if (!ewin)
       return 0;
 
+#if 0
+   Eprintf("FocusEwinValid %#lx %s: cl=%d(%d) vis=%d(%d)\n", ewin->client.win,
+          EwinGetName(ewin), click, ewin->focusclick, want_visible,
+          ewin->visibility);
+#endif
+
    if (ewin->neverfocus || ewin->iconified)
       return 0;
 
@@ -62,7 +70,13 @@
    if (!EwinIsMapped(ewin) || !EoIsShown(ewin))
       return 0;
 
-   return !on_screen || EwinIsOnScreen(ewin);
+   if (ewin->focusclick && !click)
+      return 0;
+
+   if (want_visible && ewin->visibility == VisibilityFullyObscured)
+      return 0;
+
+   return !want_on_screen || EwinIsOnScreen(ewin);
 }
 
 /*
@@ -83,7 +97,7 @@
 
      case MODE_FOCUS_SLOPPY:
        ewin = GetEwinPointerInClient();
-       if (ewin && FocusEwinValid(ewin, 1) && !ewin->focusclick)
+       if (ewin && FocusEwinValid(ewin, 1, 0, 1))
           break;
        goto do_select;
 
@@ -95,8 +109,7 @@
        lst = EwinListFocusGet(&num);
        for (i = 0; i < num; i++)
          {
-            if (!FocusEwinValid(lst[i], 1) || lst[i]->skipfocus ||
-                lst[i]->focusclick)
+            if (!FocusEwinValid(lst[i], 1, 0, 1) || lst[i]->skipfocus)
                continue;
             ewin = lst[i];
             break;
@@ -144,7 +157,7 @@
    ewin = NULL;
    for (i = num - 1; i >= 0; i--)
      {
-       if (lst[i]->skipfocus || !FocusEwinValid(lst[i], 1))
+       if (lst[i]->skipfocus || !FocusEwinValid(lst[i], 1, 0, 0))
           continue;
        ewin = lst[i];
        break;
@@ -168,7 +181,7 @@
    ewin = NULL;
    for (i = 0; i < num; i++)
      {
-       if (lst[i]->skipfocus || !FocusEwinValid(lst[i], 1))
+       if (lst[i]->skipfocus || !FocusEwinValid(lst[i], 1, 0, 0))
           continue;
        ewin = lst[i];
        break;
@@ -227,8 +240,8 @@
      }
 }
 
-void
-FocusToEWin(EWin * ewin, int why)
+static void
+doFocusToEwin(EWin * ewin, int why)
 {
    int                 do_follow = 0;
    int                 do_raise = 0, do_warp = 0;
@@ -237,13 +250,9 @@
       return;
 
    if (EventDebug(EDBUG_TYPE_FOCUS))
-     {
-       if (ewin)
-          Eprintf("FocusToEWin %#lx %s why=%d\n", ewin->client.win,
-                  EwinGetName(ewin), why);
-       else
-          Eprintf("FocusToEWin None why=%d\n", why);
-     }
+      Eprintf("doFocusToEWin %#lx %s why=%d\n",
+             (ewin) ? ewin->client.win : 0,
+             (ewin) ? EwinGetName(ewin) : "None", why);
 
    switch (why)
      {
@@ -263,7 +272,7 @@
           return;
        if (ewin == NULL)       /* Unfocus */
           break;
-       if (!FocusEwinValid(ewin, 1))
+       if (!FocusEwinValid(ewin, 1, why == FOCUS_CLICK, 0))
           return;
        break;
 
@@ -316,7 +325,7 @@
           return;
        if (ewin == Mode.focuswin)
           return;
-       if (!FocusEwinValid(ewin, 0))
+       if (!FocusEwinValid(ewin, 0, 0, 0))
           return;
        break;
      }
@@ -394,6 +403,49 @@
 }
 
 void
+FocusToEWin(EWin * ewin, int why)
+{
+   if (EventDebug(EDBUG_TYPE_FOCUS))
+      Eprintf("FocusToEWin(%d) %#lx %s why=%d\n", focus_inhibit,
+             (ewin) ? ewin->client.win : 0,
+             (ewin) ? EwinGetName(ewin) : "None", why);
+
+   switch (why)
+     {
+     case FOCUS_EWIN_NEW:
+       focus_pending_new = ewin;
+       /* Fall-thru */
+     default:
+       focus_pending_why = why;
+       focus_pending_ewin = ewin;
+       break;
+
+     case FOCUS_EWIN_GONE:
+       focus_pending_why = FOCUS_DESK_ENTER;
+       if (ewin == Mode.focuswin)
+          Mode.focuswin = NULL;
+       if (ewin == focus_pending_ewin)
+          focus_pending_ewin = NULL;
+       if (ewin == focus_pending_new)
+          focus_pending_new = NULL;
+       break;
+     }
+}
+
+static void
+FocusSet(void)
+{
+   if (focus_pending_new && Conf.focus.all_new_windows_get_focus)
+      doFocusToEwin(focus_pending_new, FOCUS_EWIN_NEW);
+   else
+      doFocusToEwin(focus_pending_ewin, focus_pending_why);
+   focus_pending_why = 0;
+   focus_pending_ewin = focus_pending_new = NULL;
+}
+
+static int          focus_new_desk_nesting = 0;        /* Obsolete? */
+
+void
 FocusNewDeskBegin(void)
 {
    if (focus_new_desk_nesting++)
@@ -407,46 +459,46 @@
    DesksEventsConfigure(0);
 }
 
-static void
-FocusInit(void)
+void
+FocusNewDesk(void)
 {
    EWin               *ewin;
 
-   /* Start focusing windows */
-   FocusEnable(1);
+   if (--focus_new_desk_nesting)
+      return;
+
+   /* we flipped - re-enable enter and leave events */
+   EwinsEventsConfigure(1);
+   DesksEventsConfigure(1);
 
    /* Set the mouse-over window */
    ewin = GetEwinByCurrentPointer();
    Mode.mouse_over_ewin = ewin;
 
    FocusToEWin(NULL, FOCUS_DESK_ENTER);
-
-   /* Enable window placement features */
-   Mode.place.enable_features = 1;
 }
 
 static void
-FocusExit(void)
-{
-}
-
-void
-FocusNewDesk(void)
+FocusInit(void)
 {
    EWin               *ewin;
 
-   if (--focus_new_desk_nesting)
-      return;
-
-   /* we flipped - re-enable enter and leave events */
-   EwinsEventsConfigure(1);
-   DesksEventsConfigure(1);
+   /* Start focusing windows */
+   FocusEnable(1);
 
    /* Set the mouse-over window */
    ewin = GetEwinByCurrentPointer();
    Mode.mouse_over_ewin = ewin;
 
    FocusToEWin(NULL, FOCUS_DESK_ENTER);
+
+   /* Enable window placement features */
+   Mode.place.enable_features = 1;
+}
+
+static void
+FocusExit(void)
+{
 }
 
 /*
@@ -478,14 +530,12 @@
      case MODE_FOCUS_CLICK:
        break;
      case MODE_FOCUS_SLOPPY:
-       if (!ewin || ewin->focusclick)
-          break;
-       FocusToEWin(ewin, FOCUS_ENTER);
+       if (FocusEwinValid(ewin, 1, 0, 0))
+          FocusToEWin(ewin, FOCUS_ENTER);
        break;
      case MODE_FOCUS_POINTER:
-       if (ewin && ewin->focusclick)
-          break;
-       FocusToEWin(ewin, FOCUS_ENTER);
+       if (!ewin || FocusEwinValid(ewin, 1, 0, 0))
+          FocusToEWin(ewin, FOCUS_ENTER);
        break;
      }
 }
@@ -889,6 +939,12 @@
      case ESIGNAL_EXIT:
        FocusExit();
        break;
+
+     case ESIGNAL_IDLE:
+       if (focus_inhibit || !focus_pending_why)
+          break;
+       FocusSet();
+       break;
      }
 }
 




-------------------------------------------------------
This SF.Net email is sponsored by Yahoo.
Introducing Yahoo! Search Developer Network - Create apps using Yahoo!
Search APIs Find out how you can build Yahoo! directly into your own
Applications - visit http://developer.yahoo.net/?fr=offad-ysdn-ostg-q22005
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to