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.
This commit is contained in:
Orestis Floros 2018-09-06 02:21:10 +03:00
parent 633583de4a
commit fed059a2b7
No known key found for this signature in database
GPG Key ID: E9AD9F32E401E38F
1 changed files with 5 additions and 8 deletions

View File

@ -500,13 +500,12 @@ void handle_button(xcb_button_press_event_t *event) {
/* If the child asked for click events, /* If the child asked for click events,
* check if a status block has been clicked. */ * check if a status block has been clicked. */
int tray_width = get_tray_width(walk->trayclients); 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); int offset = walk->rect.w - walk->statusline_width - tray_width - logical_px((tray_width > 0) * sb_hoff_px);
int32_t statusline_x = x - offset; int32_t statusline_x = x - offset;
if (statusline_x >= 0 && statusline_x < walk->statusline_width) { if (statusline_x >= 0 && statusline_x < walk->statusline_width) {
struct status_block *block; struct status_block *block;
int sep_offset_remainder = 0;
TAILQ_FOREACH(block, &statusline_head, blocks) { TAILQ_FOREACH(block, &statusline_head, blocks) {
i3String *text = block->full_text; 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) if (i3string_get_num_bytes(text) == 0)
continue; continue;
last_block_x = block_x; const int relative_x = statusline_x - last_block_x;
block_x += render->width + render->x_offset + render->x_append + get_sep_offset(block) + sep_offset_remainder; if (relative_x >= 0 && (uint32_t)relative_x <= render->width) {
if (statusline_x <= block_x && statusline_x >= last_block_x) {
send_block_clicked(event->detail, block->name, block->instance, 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; 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;
} }
} }
} }