]> git.sur5r.net Git - i3/i3/commitdiff
Add relative coordinates in JSON for i3bar click events (fixes #2767) 3095/head
authorPallav Agarwal <pallavagarwal07@gmail.com>
Wed, 20 Dec 2017 12:19:38 +0000 (17:49 +0530)
committerPallav Agarwal <pallavagarwal07@gmail.com>
Wed, 20 Dec 2017 17:21:14 +0000 (22:51 +0530)
Add support for relative coordinates in i3bar click events

Rename {x,y}_rel to relative_{x,y}

Update i3bar-protocol doc to mention the added fields in click events

docs/i3bar-protocol
i3bar/include/child.h
i3bar/src/child.c
i3bar/src/xcb.c

index b8c2b5ad774be7c700632fb359e2ef5e7c3e92d3..1a302587819347cff696c497725b3ad521647f79 100644 (file)
@@ -236,6 +236,11 @@ x, y::
        X11 root window coordinates where the click occurred
 button::
        X11 button ID (for example 1 to 3 for left/middle/right mouse button)
+relative_x, relative_y::
+    Coordinates where the click occurred, with respect to the top left corner
+    of the block
+width, height::
+    Width and height (in px) of the block
 
 *Example*:
 ------------------------------------------
@@ -244,6 +249,10 @@ button::
  "instance": "eth0",
  "button": 1,
  "x": 1320,
- "y": 1400
+ "y": 1400,
+ "relative_x": 12,
+ "relative_y": 8,
+ "width": 50,
+ "height": 22
 }
 ------------------------------------------
index 0871c7f49efa563529d22aacd56877d9483885fd..9479fac1df8bdfecd0c005000bfd76b7dd10a6e5 100644 (file)
@@ -85,4 +85,4 @@ bool child_want_click_events(void);
  * Generates a click event, if enabled.
  *
  */
-void send_block_clicked(int button, const char *name, const char *instance, int x, int y);
+void send_block_clicked(int button, const char *name, const char *instance, int x, int y, int x_rel, int y_rel, int width, int height);
index 170fcdefc538eddf57ce2c9899c39edc89a3fd1b..1cd7d512aa0e6c128e66996b508d7696add950c1 100644 (file)
@@ -596,7 +596,7 @@ void child_click_events_key(const char *key) {
  * Generates a click event, if enabled.
  *
  */
-void send_block_clicked(int button, const char *name, const char *instance, int x, int y) {
+void send_block_clicked(int button, const char *name, const char *instance, int x, int y, int x_rel, int y_rel, int width, int height) {
     if (!child.click_events) {
         return;
     }
@@ -624,6 +624,18 @@ void send_block_clicked(int button, const char *name, const char *instance, int
     child_click_events_key("y");
     yajl_gen_integer(gen, y);
 
+    child_click_events_key("relative_x");
+    yajl_gen_integer(gen, x_rel);
+
+    child_click_events_key("relative_y");
+    yajl_gen_integer(gen, y_rel);
+
+    child_click_events_key("width");
+    yajl_gen_integer(gen, width);
+
+    child_click_events_key("height");
+    yajl_gen_integer(gen, height);
+
     yajl_gen_map_close(gen);
     child_write_output();
 }
index 77822544e72e5df3de2a0cc532850f965c7b6cfb..542c86c3c645a4c117d15f22775d73fb900476f6 100644 (file)
@@ -523,7 +523,8 @@ void handle_button(xcb_button_press_event_t *event) {
                 block_x += render->width + render->x_offset + render->x_append + get_sep_offset(block) + sep_offset_remainder;
 
                 if (statusline_x <= block_x && statusline_x >= last_block_x) {
-                    send_block_clicked(event->detail, block->name, block->instance, event->root_x, event->root_y);
+                    send_block_clicked(event->detail, block->name, block->instance,
+                                       event->root_x, event->root_y, statusline_x - last_block_x, event->event_y, block_x - last_block_x, bar_height);
                     return;
                 }