]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
add PARTIAL_SRUT_EQUAL
[chaz/openbox] / openbox / focus.c
index a79049106a85ceb0efc1d6282cab7bdc2f1d4811..541cf0101453b461e45726aa42424c7c0cef7d83 100644 (file)
@@ -1,3 +1,21 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   focus.c for the Openbox window manager
+   Copyright (c) 2003        Ben Jansens
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
 #include "debug.h"
 #include "event.h"
 #include "openbox.h"
@@ -101,23 +119,10 @@ void focus_set_client(ObClient *client)
 
 static gboolean focus_under_pointer()
 {
-    int x, y;
-    GList *it;
+    ObClient *c;
 
-    if (screen_pointer_pos(&x, &y)) {
-        for (it = stacking_list; it != NULL; it = it->next) {
-            if (WINDOW_IS_CLIENT(it->data)) {
-                ObClient *c = WINDOW_AS_CLIENT(it->data);
-                if (c->desktop == screen_desktop &&
-                    RECT_CONTAINS(c->frame->area, x, y))
-                    break;
-            }
-        }
-        if (it != NULL) {
-            g_assert(WINDOW_IS_CLIENT(it->data));
-            return client_normal(it->data) && client_focus(it->data);
-        }
-    }
+    if ((c = client_under_pointer()))
+        return client_normal(c) && client_focus(c);
     return FALSE;
 }
 
@@ -162,8 +167,9 @@ void focus_fallback(ObFocusFallbackType type)
     */
     focus_set_client(NULL);
 
-    if (config_focus_follow && focus_under_pointer())
-        return;
+    if (!config_focus_last && config_focus_follow)
+        if (focus_under_pointer())
+            return;
 
     if (type == OB_FOCUS_FALLBACK_UNFOCUSING && old) {
         /* try for transient relations */
@@ -380,11 +386,14 @@ void focus_directional_cycle(ObDirection dir,
             focus_cycle_target = ft;
             frame_adjust_focus(focus_cycle_target->frame, TRUE);
         }
-        popup_cycle(ft, dialog);
+    }
+    if (focus_cycle_target) {
+        popup_cycle(focus_cycle_target, dialog);
         if (dialog)
             return;
     }
 
+
 done_cycle:
     if (done && focus_cycle_target)
         client_activate(focus_cycle_target, FALSE);
This page took 0.02199 seconds and 4 git commands to generate.