From: Deiz Date: Thu, 26 Mar 2015 19:34:37 +0000 (-0400) Subject: Make wizard window size and click coordinates dependent on font X-Git-Tag: 4.10.1~3^2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=refs%2Fpull%2F1592%2Fhead;p=i3%2Fi3 Make wizard window size and click coordinates dependent on font This guarantees the whole visible area of the pixmap is reinitialized, and ensures that the click bounding boxes are properly aligned with the displayed text. --- diff --git a/i3-config-wizard/main.c b/i3-config-wizard/main.c index b3404424..35770dc9 100644 --- a/i3-config-wizard/main.c +++ b/i3-config-wizard/main.c @@ -67,6 +67,11 @@ #include "xcb.h" #include "libi3.h" +#define row_y(row) \ + (((row)-1) * font.height + logical_px(4)) +#define window_height() \ + (row_y(15) + font.height) + enum { STEP_WELCOME, STEP_GENERATE } current_step = STEP_WELCOME; enum { MOD_Mod1, @@ -80,6 +85,7 @@ xcb_screen_t *root_screen; static xcb_get_modifier_mapping_reply_t *modmap_reply; static i3Font font; static i3Font bold_font; +static int char_width; static char *socket_path; static xcb_window_t win; static xcb_pixmap_t pixmap; @@ -493,7 +499,7 @@ static char *resolve_tilde(const char *path) { */ static int handle_expose() { /* re-draw the background */ - xcb_rectangle_t border = {0, 0, logical_px(300), (logical_px(15) * font.height) + logical_px(8)}; + xcb_rectangle_t border = {0, 0, logical_px(300), window_height()}; xcb_change_gc(conn, pixmap_gc, XCB_GC_FOREGROUND, (uint32_t[]){get_colorpixel("#000000")}); xcb_poly_fill_rectangle(conn, pixmap, pixmap_gc, 1, &border); @@ -501,7 +507,7 @@ static int handle_expose() { #define txt(x, row, text) \ draw_text_ascii(text, pixmap, pixmap_gc, \ - x, (row - 1) * font.height + logical_px(4), logical_px(500) - x * 2) + x, row_y(row), logical_px(500) - x * 2) if (current_step == STEP_WELCOME) { /* restore font color */ @@ -643,14 +649,16 @@ static void handle_button_press(xcb_button_press_event_t *event) { if (current_step != STEP_GENERATE) return; - if (event->event_x >= logical_px(32) && event->event_x <= logical_px(68) && - event->event_y >= logical_px(45) && event->event_y <= logical_px(54)) { + if (event->event_x < logical_px(32) || + event->event_x > (logical_px(32) + char_width * 5)) + return; + + if (event->event_y >= row_y(4) && event->event_y <= (row_y(4) + font.height)) { modifier = MOD_Mod4; handle_expose(); } - if (event->event_x >= logical_px(32) && event->event_x <= logical_px(68) && - event->event_y >= logical_px(56) && event->event_y <= logical_px(70)) { + if (event->event_y >= row_y(5) && event->event_y <= (row_y(5) + font.height)) { modifier = MOD_Mod1; handle_expose(); } @@ -864,6 +872,10 @@ int main(int argc, char *argv[]) { font = load_font(pattern, true); bold_font = load_font(patternbold, true); + /* Determine character width in the default font. */ + set_font(&font); + char_width = predict_text_width(i3string_from_utf8("a")); + /* Open an input window */ win = xcb_generate_id(conn); xcb_create_window( @@ -871,7 +883,7 @@ int main(int argc, char *argv[]) { XCB_COPY_FROM_PARENT, win, /* the window id */ root, /* parent == root */ - logical_px(490), logical_px(297), logical_px(300), logical_px(205), /* dimensions */ + logical_px(490), logical_px(297), logical_px(300), window_height(), /* dimensions */ 0, /* X11 border = 0, we draw our own */ XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */