]> git.sur5r.net Git - i3/i3/blobdiff - src/handlers.c
i3bar: compile with yajl < 2
[i3/i3] / src / handlers.c
index 00adc0e5ed62dd6a4f768c940835077169cc39b7..596d15a6e40f532afdff76623cc0eebe181b4ed9 100644 (file)
@@ -2,7 +2,7 @@
  * vim:ts=4:sw=4:expandtab
  *
  * i3 - an improved dynamic tiling window manager
- * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE)
  *
  * handlers.c: Small handlers for various events (keypresses, focus changes,
  *             …).
@@ -118,9 +118,12 @@ static void handle_key_press(xcb_key_press_event_t *event) {
         }
     }
 
-    char *json_result = parse_cmd(bind->command);
-    FREE(json_result);
-    return;
+    struct CommandResult *command_output = parse_command(bind->command);
+
+    if (command_output->needs_tree_render)
+        tree_render();
+
+    free(command_output->json_output);
 }
 
 /*
@@ -461,6 +464,7 @@ static void handle_screen_change(xcb_generic_event_t *e) {
  */
 static void handle_unmap_notify_event(xcb_unmap_notify_event_t *event) {
     DLOG("UnmapNotify for 0x%08x (received from 0x%08x), serial %d\n", event->window, event->event, event->sequence);
+    xcb_get_input_focus_cookie_t cookie;
     Con *con = con_by_window_id(event->window);
     if (con == NULL) {
         /* This could also be an UnmapNotify for the frame. We need to
@@ -473,10 +477,15 @@ static void handle_unmap_notify_event(xcb_unmap_notify_event_t *event) {
 
         if (con->ignore_unmap > 0)
             con->ignore_unmap--;
+        /* See the end of this function. */
+        cookie = xcb_get_input_focus(conn);
         DLOG("ignore_unmap = %d for frame of container %p\n", con->ignore_unmap, con);
         goto ignore_end;
     }
 
+    /* See the end of this function. */
+    cookie = xcb_get_input_focus(conn);
+
     if (con->ignore_unmap > 0) {
         DLOG("ignore_unmap = %d, dec\n", con->ignore_unmap);
         con->ignore_unmap--;
@@ -502,6 +511,13 @@ ignore_end:
      * Therefore, we ignore all EnterNotify events which have the same sequence
      * as an UnmapNotify event. */
     add_ignore_event(event->sequence, XCB_ENTER_NOTIFY);
+
+    /* Since we just ignored the sequence of this UnmapNotify, we want to make
+     * sure that following events use a different sequence. When putting xterm
+     * into fullscreen and moving the pointer to a different window, without
+     * using GetInputFocus, subsequent (legitimate) EnterNotify events arrived
+     * with the same sequence and thus were ignored (see ticket #609). */
+    free(xcb_get_input_focus_reply(conn, cookie, NULL));
 }
 
 /*
@@ -828,12 +844,20 @@ static bool handle_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_
 
     if (!con->urgent && focused == con) {
         DLOG("Ignoring urgency flag for current client\n");
+        con->window->urgent = 0;
         goto end;
     }
 
     /* Update the flag on the client directly */
     con->urgent = (xcb_icccm_wm_hints_get_urgency(&hints) != 0);
     //CLIENT_LOG(con);
+    if (con->window) {
+        if (con->urgent) {
+            con->window->urgent = time(NULL);
+        } else {
+            con->window->urgent = 0;
+        }
+    }
     LOG("Urgency flag changed to %d\n", con->urgent);
 
     Con *ws;