X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fsighandler.c;h=1d3e4ab719979832be0066b2314509e2aa3ec58b;hb=b0e871e0cfdc35f2147c4497136c5b74c9ebafe7;hp=4b5fb103f41526d2bb07c29ee139ceda8d06edd5;hpb=5b6ef3e665eacec38dcbcde93c83090864477eb7;p=i3%2Fi3 diff --git a/src/sighandler.c b/src/sighandler.c index 4b5fb103..1d3e4ab7 100644 --- a/src/sighandler.c +++ b/src/sighandler.c @@ -26,12 +26,7 @@ #include -#include "i3.h" -#include "util.h" -#include "xcb.h" -#include "log.h" -#include "config.h" -#include "randr.h" +#include "all.h" static xcb_gcontext_t pixmap_gc; static xcb_pixmap_t pixmap; @@ -159,22 +154,14 @@ void handle_signal(int sig, siginfo_t *info, void *data) { sigaction(sig, &action, NULL); raised_signal = sig; - /* setup event handler for key presses */ - xcb_event_handlers_t sig_evenths; - memset(&sig_evenths, 0, sizeof(xcb_event_handlers_t)); - xcb_event_handlers_init(conn, &sig_evenths); - xcb_event_set_key_press_handler(&sig_evenths, sig_handle_key_press, NULL); - - i3Font *font = load_font(conn, config.font); - /* width and height of the popup window, so that the text fits in */ int crash_text_num = sizeof(crash_text) / sizeof(char*); - int height = 13 + (crash_text_num * font->height); + int height = 13 + (crash_text_num * config.font.height); /* calculate width for longest text */ int text_len = strlen(crash_text[crash_text_longest]); char *longest_text = convert_utf8_to_ucs2(crash_text[crash_text_longest], &text_len); - int font_width = predict_text_width(conn, config.font, longest_text, text_len); + int font_width = predict_text_width(longest_text, text_len); int width = font_width + 20; /* Open a popup window on each virtual screen */ @@ -192,7 +179,7 @@ void handle_signal(int sig, siginfo_t *info, void *data) { xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0); /* Create graphics context */ - xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, font->id); + xcb_change_gc_single(conn, pixmap_gc, XCB_GC_FONT, config.font.id); /* Grab the keyboard to get all input */ xcb_grab_keyboard(conn, false, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); @@ -201,11 +188,20 @@ void handle_signal(int sig, siginfo_t *info, void *data) { xcb_grab_pointer(conn, false, win, XCB_NONE, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, win, XCB_NONE, XCB_CURRENT_TIME); - sig_draw_window(win, width, height, font->height); + sig_draw_window(win, width, height, config.font.height); xcb_flush(conn); } - xcb_event_wait_for_event_loop(&sig_evenths); + xcb_generic_event_t *event; + /* Yay, more own eventhandlers… */ + while ((event = xcb_wait_for_event(conn))) { + /* Strip off the highest bit (set if the event is generated) */ + int type = (event->response_type & 0x7F); + if (type == XCB_KEY_PRESS) { + sig_handle_key_press(NULL, conn, (xcb_key_press_event_t*)event); + } + free(event); + } } /*