]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
add a 'Switch to...' entry to empty desktops in the client-list-menu
[chaz/openbox] / openbox / event.c
index dbb4ec68eb0b91874309d2ec4712618bf296743c..d3e5ad72d4d1ea44b8ffd0d44a29b5bfd3cdea30 100644 (file)
@@ -1,3 +1,21 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   event.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 "openbox.h"
 #include "dock.h"
 #include <X11/ICE/ICElib.h>
 #endif
 
+typedef struct
+{
+    gboolean ignored;
+} ObEventData;
+
 static void event_process(const XEvent *e, gpointer data);
 static void event_handle_root(XEvent *e);
 static void event_handle_menu(XEvent *e);
@@ -289,8 +312,8 @@ static gboolean event_ignore(XEvent *e, ObClient *client)
        if (INVALID_FOCUSIN(e) ||
             client == NULL) {
 #ifdef DEBUG_FOCUS
-        ob_debug("FocusIn on %lx mode %d detail %d IGNORED\n",
-                 e->xfocus.window, e->xfocus.mode, e->xfocus.detail);
+            ob_debug("FocusIn on %lx mode %d detail %d IGNORED\n",
+                     e->xfocus.window, e->xfocus.mode, e->xfocus.detail);
 #endif
             /* says a client was not found for the event (or a valid FocusIn
                event was not found.
@@ -372,14 +395,20 @@ static gboolean event_ignore(XEvent *e, ObClient *client)
                         }
                     }
 
-                    /* once all the FocusOut's have been dealt with, if there
-                       is a FocusIn still left and it is valid, then use it */
-                    event_process(&fe, NULL);
-                    /* secret magic way of event_process telling us that no
-                       client was found for the FocusIn event. ^_^ */
-                    if (fe.xfocus.window != None) {
-                        fallback = FALSE;
-                        break;
+                    {
+                        ObEventData d;
+
+                        /* once all the FocusOut's have been dealt with, if
+                           there is a FocusIn still left and it is valid, then
+                           use it */
+                        event_process(&fe, &d);
+                        if (!d.ignored) {
+#ifdef DEBUG_FOCUS
+                            ob_debug("FocusIn was OK, so don't fallback\n");
+#endif
+                            fallback = FALSE;
+                            break;
+                        }
                     }
                 }
             }
@@ -432,6 +461,7 @@ static void event_process(const XEvent *ec, gpointer data)
     ObDockApp *dockapp = NULL;
     ObWindow *obwin = NULL;
     XEvent ee, *e;
+    ObEventData *ed = data;
 
     /* make a copy we can mangle */
     ee = *ec;
@@ -461,8 +491,12 @@ static void event_process(const XEvent *ec, gpointer data)
 
     event_set_lasttime(e);
     event_hack_mods(e);
-    if (event_ignore(e, client))
+    if (event_ignore(e, client)) {
+        if (ed)
+            ed->ignored = TRUE;
         return;
+    } else if (ed)
+            ed->ignored = FALSE;
 
     /* deal with it in the kernel */
     if (group)
@@ -507,9 +541,14 @@ static void event_process(const XEvent *ec, gpointer data)
             event_handle_menu(e);
         else {
             if (!keyboard_process_interactive_grab(e, &client)) {
-                if (moveresize_in_progress)
+                if (moveresize_in_progress) {
                     moveresize_event(e);
 
+                    /* make further actions work on the client being
+                       moved/resized */
+                    client = moveresize_client;
+                }
+
                 menu_can_hide = FALSE;
                 ob_main_loop_timeout_add(ob_main_loop,
                                          G_USEC_PER_SEC / 4,
@@ -524,8 +563,7 @@ static void event_process(const XEvent *ec, gpointer data)
                        causes the window which appears to be focused to be
                        the one on which the actions will be executed */
                     keyboard_event((focus_cycle_target ?
-                                    focus_cycle_target :
-                                    (client ? client : focus_client)), e);
+                                    focus_cycle_target : client), e);
             }
         }
     }
@@ -538,7 +576,7 @@ static void event_handle_root(XEvent *e)
     switch(e->type) {
     case SelectionClear:
         ob_debug("Another WM has requested to replace us. Exiting.\n");
-        ob_exit();
+        ob_exit(0);
         break;
 
     case ClientMessage:
@@ -1167,6 +1205,16 @@ static void event_handle_menu(XEvent *ev)
                                             ev->xmotion.y_root)))
                 menu_frame_select(f, e);
         }
+        {
+            ObMenuFrame *a;
+
+            a = find_active_menu();
+            if (a && a != f &&
+                a->selected->entry->type != OB_MENU_ENTRY_TYPE_SUBMENU)
+            {
+                menu_frame_select(a, NULL);
+            }
+        }
         break;
     case KeyPress:
         if (ev->xkey.keycode == ob_keycode(OB_KEY_ESCAPE))
This page took 0.025511 seconds and 4 git commands to generate.