]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
dont start a move/resize on clients that cant do it
[chaz/openbox] / openbox / event.c
index 2df720b048381075d12a5159f86e3364376a1874..6503ba0af288e058c8b99ff1b7246d186ac5490d 100644 (file)
@@ -69,7 +69,7 @@ static void event_handle_client(ObClient *c, XEvent *e);
 static void event_handle_group(ObGroup *g, XEvent *e);
 
 static gboolean focus_delay_func(gpointer data);
-static void focus_delay_client_dest(gpointer data);
+static void focus_delay_client_dest(ObClient *client, gpointer data);
 
 static gboolean menu_hide_delay_func(gpointer data);
 
@@ -157,7 +157,7 @@ void event_startup(gboolean reconfig)
     IceAddConnectionWatch(ice_watch, NULL);
 #endif
 
-    client_add_destructor(focus_delay_client_dest);
+    client_add_destructor(focus_delay_client_dest, NULL);
 }
 
 void event_shutdown(gboolean reconfig)
@@ -1166,14 +1166,25 @@ static void event_handle_dockapp(ObDockApp *app, XEvent *e)
 ObMenuFrame* find_active_menu()
 {
     GList *it;
-    ObMenuFrame *f;
+    ObMenuFrame *ret = NULL;
 
     for (it = menu_frame_visible; it; it = g_list_next(it)) {
-        f = it->data;
-        if (f->selected)
+        ret = it->data;
+        if (ret->selected)
             break;
+        ret = NULL;
     }
-    return it ? it->data : NULL;
+    return ret;
+}
+
+ObMenuFrame* find_active_or_last_menu()
+{
+    ObMenuFrame *ret = NULL;
+
+    ret = find_active_menu();
+    if (!ret && menu_frame_visible)
+        ret = menu_frame_visible->data;
+    return ret;
 }
 
 static void event_handle_menu(XEvent *ev)
@@ -1183,11 +1194,13 @@ static void event_handle_menu(XEvent *ev)
 
     switch (ev->type) {
     case ButtonRelease:
-        if ((e = menu_entry_frame_under(ev->xbutton.x_root,
-                                        ev->xbutton.y_root)))
-            menu_entry_frame_execute(e, ev->xbutton.state);
-        else if (menu_can_hide)
-            menu_frame_hide_all();
+        if (menu_can_hide) {
+            if ((e = menu_entry_frame_under(ev->xbutton.x_root,
+                                            ev->xbutton.y_root)))
+                menu_entry_frame_execute(e, ev->xbutton.state);
+            else
+                menu_frame_hide_all();
+        }
         break;
     case MotionNotify:
         if ((f = menu_frame_under(ev->xmotion.x_root,
@@ -1217,19 +1230,19 @@ static void event_handle_menu(XEvent *ev)
                 menu_entry_frame_execute(f->selected, ev->xkey.state);
         } else if (ev->xkey.keycode == ob_keycode(OB_KEY_LEFT)) {
             ObMenuFrame *f;
-            if ((f = find_active_menu()) && f->parent)
+            if ((f = find_active_or_last_menu()) && f->parent)
                 menu_frame_select(f, NULL);
         } else if (ev->xkey.keycode == ob_keycode(OB_KEY_RIGHT)) {
             ObMenuFrame *f;
-            if ((f = find_active_menu()) && f->child)
+            if ((f = find_active_or_last_menu()) && f->child)
                 menu_frame_select_next(f->child);
         } else if (ev->xkey.keycode == ob_keycode(OB_KEY_UP)) {
             ObMenuFrame *f;
-            if ((f = find_active_menu()))
+            if ((f = find_active_or_last_menu()))
                 menu_frame_select_previous(f);
         } else if (ev->xkey.keycode == ob_keycode(OB_KEY_DOWN)) {
             ObMenuFrame *f;
-            if ((f = find_active_menu()))
+            if ((f = find_active_or_last_menu()))
                 menu_frame_select_next(f);
         }
         break;
@@ -1252,11 +1265,9 @@ static gboolean focus_delay_func(gpointer data)
     return FALSE; /* no repeat */
 }
 
-static void focus_delay_client_dest(gpointer data)
+static void focus_delay_client_dest(ObClient *client, gpointer data)
 {
-    ObClient *c = data;
-
-    ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, c);
+    ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, client);
 }
 
 void event_ignore_queued_enters()
This page took 0.025283 seconds and 4 git commands to generate.