X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=i3bar%2Fsrc%2Fxcb.c;h=39368c88bdd673546572d875e9866a1fad288628;hb=c40c79538e0b9b873f3f921d0a4473d7dad74566;hp=8843edbdc72e4532b8f6d1008be0018bfd9dd4a0;hpb=145ac532aaa09259ff71a8ab2a75c3bf4004a80c;p=i3%2Fi3 diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 8843edbd..39368c88 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -79,7 +79,7 @@ int bar_height; /* These are only relevant for XKB, which we only need for grabbing modifiers */ int xkb_base; -int mod_pressed = 0; +bool mod_pressed = 0; /* Event watchers, to interact with the user */ ev_prepare *xcb_prep; @@ -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 offset = walk->rect.w - walk->statusline_width - tray_width - logical_px(sb_hoff_px); + 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; } } } @@ -604,7 +601,7 @@ void handle_button(xcb_button_press_event_t *event) { const size_t len = namelen + strlen("workspace \"\"") + 1; char *buffer = scalloc(len + num_quotes, 1); - strncpy(buffer, "workspace \"", strlen("workspace \"")); + memcpy(buffer, "workspace \"", strlen("workspace \"")); size_t inpos, outpos; for (inpos = 0, outpos = strlen("workspace \""); inpos < namelen; @@ -1108,49 +1105,18 @@ void xcb_prep_cb(struct ev_loop *loop, ev_prepare *watcher, int revents) { DLOG("received an xkb event\n"); xcb_xkb_state_notify_event_t *state = (xcb_xkb_state_notify_event_t *)event; - if (state->xkbType == XCB_XKB_STATE_NOTIFY && config.modifier != XCB_NONE) { - int modstate = state->mods & config.modifier; - -#define DLOGMOD(modmask, status) \ - do { \ - switch (modmask) { \ - case ShiftMask: \ - DLOG("ShiftMask got " #status "!\n"); \ - break; \ - case ControlMask: \ - DLOG("ControlMask got " #status "!\n"); \ - break; \ - case Mod1Mask: \ - DLOG("Mod1Mask got " #status "!\n"); \ - break; \ - case Mod2Mask: \ - DLOG("Mod2Mask got " #status "!\n"); \ - break; \ - case Mod3Mask: \ - DLOG("Mod3Mask got " #status "!\n"); \ - break; \ - case Mod4Mask: \ - DLOG("Mod4Mask got " #status "!\n"); \ - break; \ - case Mod5Mask: \ - DLOG("Mod5Mask got " #status "!\n"); \ - break; \ - } \ - } while (0) - - if (modstate != mod_pressed) { - if (modstate == 0) { - DLOGMOD(config.modifier, released); - if (!activated_mode) - hide_bars(); - } else { - DLOGMOD(config.modifier, pressed); + const uint32_t mod = (config.modifier & 0xFFFF); + const bool new_mod_pressed = (mod != 0 && (state->mods & mod) == mod); + if (new_mod_pressed != mod_pressed) { + mod_pressed = new_mod_pressed; + if (state->xkbType == XCB_XKB_STATE_NOTIFY && config.modifier != XCB_NONE) { + if (mod_pressed) { activated_mode = false; unhide_bars(); + } else if (!activated_mode) { + hide_bars(); } - mod_pressed = modstate; } -#undef DLOGMOD } free(event); @@ -2039,7 +2005,8 @@ void draw_bars(bool unhide) { DLOG("Printing statusline!\n"); int tray_width = get_tray_width(outputs_walk->trayclients); - uint32_t max_statusline_width = outputs_walk->rect.w - workspace_width - tray_width - 2 * logical_px(sb_hoff_px); + uint32_t hoff = logical_px(((workspace_width > 0) + (tray_width > 0)) * sb_hoff_px); + uint32_t max_statusline_width = outputs_walk->rect.w - workspace_width - tray_width - hoff; uint32_t clip_left = 0; uint32_t statusline_width = full_statusline_width; bool use_short_text = false; @@ -2053,7 +2020,7 @@ void draw_bars(bool unhide) { } int16_t visible_statusline_width = MIN(statusline_width, max_statusline_width); - int x_dest = outputs_walk->rect.w - tray_width - logical_px(sb_hoff_px) - visible_statusline_width; + int x_dest = outputs_walk->rect.w - tray_width - logical_px((tray_width > 0) * sb_hoff_px) - visible_statusline_width; draw_statusline(outputs_walk, clip_left, use_focus_colors, use_short_text); draw_util_copy_surface(&outputs_walk->statusline_buffer, &outputs_walk->buffer, 0, 0, @@ -2101,5 +2068,4 @@ void set_current_mode(struct mode *current) { I3STRING_FREE(binding.name); binding = *current; activated_mode = binding.name != NULL; - return; }