prompt to kill windows when they are not responding
[mikachu/openbox.git] / openbox / prompt.c
index ba5228a..080dc9a 100644 (file)
@@ -348,8 +348,8 @@ void prompt_show(ObPrompt *self, ObClient *parent)
     hints.min_height = hints.max_height = self->height;
     XSetWMNormalHints(ob_display, self->super.window, &hints);
 
-    XSetTransientForHint(ob_display, (parent ? parent->window : 0),
-                         self->super.window);
+    XSetTransientForHint(ob_display, self->super.window,
+                         (parent ? parent->window : 0));
 
     /* set up the dialog and render it */
     prompt_layout(self);
@@ -366,12 +366,12 @@ void prompt_hide(ObPrompt *self)
     self->mapped = FALSE;
 }
 
-void prompt_key_event(ObPrompt *self, XEvent *e)
+gboolean prompt_key_event(ObPrompt *self, XEvent *e)
 {
     gboolean shift;
     guint shift_mask;
 
-    if (e->type != KeyPress) return;
+    if (e->type != KeyPress) return FALSE;
 
     g_print("key 0x%x 0x%x\n", e->xkey.keycode, ob_keycode(OB_KEY_TAB));
 
@@ -380,23 +380,31 @@ void prompt_key_event(ObPrompt *self, XEvent *e)
 
     /* only accept shift */
     if (e->xkey.state != 0 && e->xkey.state != shift_mask)
-        return;
+        return FALSE;
 
     if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE))
         prompt_cancel(self);
-    else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN)) {
+    else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN) ||
+             e->xkey.keycode == ob_keycode(OB_KEY_SPACE))
+    {
         if (self->func) self->func(self, self->focus->result, self->data);
         prompt_hide(self);
     }
-    else if (e->xkey.keycode == ob_keycode(OB_KEY_TAB)) {
+    else if (e->xkey.keycode == ob_keycode(OB_KEY_TAB) ||
+             e->xkey.keycode == ob_keycode(OB_KEY_LEFT) ||
+             e->xkey.keycode == ob_keycode(OB_KEY_RIGHT))
+    {
         gint i;
+        gboolean left;
         ObPromptElement *oldfocus;
 
+        left = e->xkey.keycode == ob_keycode(OB_KEY_LEFT) ||
+            (e->xkey.keycode == ob_keycode(OB_KEY_TAB) && shift);
         oldfocus = self->focus;
 
         for (i = 0; i < self->n_buttons; ++i)
             if (self->focus == &self->button[i]) break;
-        i += (shift ? -1 : 1);
+        i += (left ? -1 : 1);
         if (i < 0) i = self->n_buttons - 1;
         else if (i >= self->n_buttons) i = 0;
         self->focus = &self->button[i];
@@ -404,9 +412,10 @@ void prompt_key_event(ObPrompt *self, XEvent *e)
         if (oldfocus != self->focus) render_button(self, oldfocus);
         render_button(self, self->focus);
     }
+    return TRUE;
 }
 
-void prompt_mouse_event(ObPrompt *self, XEvent *e)
+gboolean prompt_mouse_event(ObPrompt *self, XEvent *e)
 {
     gint i;
     ObPromptElement *but;
@@ -415,6 +424,7 @@ void prompt_mouse_event(ObPrompt *self, XEvent *e)
         e->type != MotionNotify) return;
 
     /* find the button */
+    but = NULL;
     for (i = 0; i < self->n_buttons; ++i)
         if (self->button[i].window ==
             (e->type == MotionNotify ? e->xmotion.window : e->xbutton.window))
@@ -422,7 +432,7 @@ void prompt_mouse_event(ObPrompt *self, XEvent *e)
             but = &self->button[i];
             break;
         }
-    g_assert(but != NULL);
+    if (!but) return FALSE;
 
     if (e->type == ButtonPress) {
         ObPromptElement *oldfocus;
@@ -452,6 +462,7 @@ void prompt_mouse_event(ObPrompt *self, XEvent *e)
             render_button(self, but);
         }
     }
+    return TRUE;
 }
 
 void prompt_cancel(ObPrompt *self)