From fed059a2b77a6a12f4b1fe65c8e4914e4a61b372 Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Thu, 6 Sep 2018 02:21:10 +0300 Subject: [PATCH] Fix "relative_x" and "width" of click events Now clicks begin at the start of the "actual" block, offsets and separators don't trigger click events. The width property is now just the width of the block, including border. Fixes #3380. --- i3bar/src/xcb.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 0719576d..f4509c26 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -500,13 +500,12 @@ void handle_button(xcb_button_press_event_t *event) { /* If the child asked for click events, * check if a status block has been clicked. */ int tray_width = get_tray_width(walk->trayclients); - int block_x = 0, last_block_x; + int last_block_x = 0; int offset = walk->rect.w - walk->statusline_width - tray_width - logical_px((tray_width > 0) * sb_hoff_px); int32_t statusline_x = x - offset; if (statusline_x >= 0 && statusline_x < walk->statusline_width) { struct status_block *block; - int sep_offset_remainder = 0; TAILQ_FOREACH(block, &statusline_head, blocks) { i3String *text = block->full_text; @@ -519,16 +518,14 @@ void handle_button(xcb_button_press_event_t *event) { if (i3string_get_num_bytes(text) == 0) continue; - last_block_x = block_x; - 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) { + const int relative_x = statusline_x - last_block_x; + if (relative_x >= 0 && (uint32_t)relative_x <= render->width) { 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); + event->root_x, event->root_y, relative_x, event->event_y, render->width, bar_height); return; } - sep_offset_remainder = block->sep_block_width - get_sep_offset(block); + last_block_x += render->width + render->x_append + render->x_offset + block->sep_block_width; } } }