Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate i3-config-wizard to draw_util #2654

Merged
merged 1 commit into from Jan 25, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
113 changes: 54 additions & 59 deletions i3-config-wizard/main.c
Expand Up @@ -69,10 +69,16 @@
#include "xcb.h"
#include "libi3.h"

#define TEXT_PADDING logical_px(4)
#define WIN_POS_X logical_px(490)
#define WIN_POS_Y logical_px(297)
#define WIN_WIDTH logical_px(300)
#define WIN_HEIGHT (15 * font.height + TEXT_PADDING)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is now 1 * font.height more than it was before, no?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, previously it was a bit indirect: row_y(15) + font.height = 14 * font.height + logical_px(4) + font.height

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. :-)


#define col_x(col) \
(((col)-1) * char_width + TEXT_PADDING)
#define row_y(row) \
(((row)-1) * font.height + logical_px(4))
#define window_height() \
(row_y(15) + font.height)
(((row)-1) * font.height + TEXT_PADDING)

enum { STEP_WELCOME,
STEP_GENERATE } current_step = STEP_WELCOME;
Expand All @@ -90,8 +96,7 @@ static i3Font bold_font;
static int char_width;
static char *socket_path;
static xcb_window_t win;
static xcb_pixmap_t pixmap;
static xcb_gcontext_t pixmap_gc;
static surface_t surface;
static xcb_key_symbols_t *symbols;
xcb_window_t root;
static struct xkb_keymap *xkb_keymap;
Expand Down Expand Up @@ -463,82 +468,73 @@ void errorlog(char *fmt, ...) {
void debuglog(char *fmt, ...) {
}

static void txt(int col, int row, char *text, color_t fg, color_t bg) {
int x = col_x(col);
int y = row_y(row);
i3String *string = i3string_from_utf8(text);
draw_util_text(string, &surface, fg, bg, x, y, WIN_WIDTH - x - TEXT_PADDING);
i3string_free(string);
}

/*
* Handles expose events, that is, draws the window contents.
*
*/
static int handle_expose() {
/* re-draw the background */
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);
const color_t black = draw_util_hex_to_color("#000000");
const color_t white = draw_util_hex_to_color("#FFFFFF");
const color_t green = draw_util_hex_to_color("#00FF00");
const color_t red = draw_util_hex_to_color("#FF0000");

set_font(&font);
/* draw background */
draw_util_clear_surface(&surface, black);

#define txt(x, row, text) \
draw_text_ascii(text, pixmap, pixmap_gc, \
x, row_y(row), logical_px(500) - x * 2)
set_font(&font);

if (current_step == STEP_WELCOME) {
/* restore font color */
set_font_colors(pixmap_gc, draw_util_hex_to_color("#FFFFFF"), draw_util_hex_to_color("#000000"));

txt(logical_px(10), 2, "You have not configured i3 yet.");
txt(logical_px(10), 3, "Do you want me to generate a config at");
txt(2, 2, "You have not configured i3 yet.", white, black);
txt(2, 3, "Do you want me to generate a config at", white, black);

char *msg;
sasprintf(&msg, "%s?", config_path);
txt(logical_px(10), 4, msg);
txt(2, 4, msg, white, black);
free(msg);

txt(logical_px(85), 6, "Yes, generate the config");
txt(logical_px(85), 8, "No, I will use the defaults");
txt(13, 6, "Yes, generate the config", white, black);
txt(13, 8, "No, I will use the defaults", white, black);

/* green */
set_font_colors(pixmap_gc, draw_util_hex_to_color("#00FF00"), draw_util_hex_to_color("#000000"));
txt(logical_px(25), 6, "<Enter>");
txt(4, 6, "<Enter>", green, black);

/* red */
set_font_colors(pixmap_gc, draw_util_hex_to_color("#FF0000"), draw_util_hex_to_color("#000000"));
txt(logical_px(31), 8, "<ESC>");
txt(5, 8, "<ESC>", red, black);
}

if (current_step == STEP_GENERATE) {
set_font_colors(pixmap_gc, draw_util_hex_to_color("#FFFFFF"), draw_util_hex_to_color("#000000"));

txt(logical_px(10), 2, "Please choose either:");
txt(logical_px(85), 4, "Win as default modifier");
txt(logical_px(85), 5, "Alt as default modifier");
txt(logical_px(10), 7, "Afterwards, press");
txt(logical_px(85), 9, "to write the config");
txt(logical_px(85), 10, "to abort");
txt(2, 2, "Please choose either:", white, black);
txt(13, 4, "Win as default modifier", white, black);
txt(13, 5, "Alt as default modifier", white, black);
txt(2, 7, "Afterwards, press", white, black);
txt(13, 9, "to write the config", white, black);
txt(13, 10, "to abort", white, black);

/* the not-selected modifier */
if (modifier == MOD_Mod4)
txt(logical_px(31), 5, "<Alt>");
txt(5, 5, "<Alt>", white, black);
else
txt(logical_px(31), 4, "<Win>");
txt(5, 4, "<Win>", white, black);

/* the selected modifier */
set_font(&bold_font);
set_font_colors(pixmap_gc, draw_util_hex_to_color("#FFFFFF"), draw_util_hex_to_color("#000000"));
if (modifier == MOD_Mod4)
txt(logical_px(10), 4, "-> <Win>");
txt(2, 4, "-> <Win>", white, black);
else
txt(logical_px(10), 5, "-> <Alt>");
txt(2, 5, "-> <Alt>", white, black);

/* green */
set_font(&font);
set_font_colors(pixmap_gc, draw_util_hex_to_color("#00FF00"), draw_util_hex_to_color("#000000"));
txt(logical_px(25), 9, "<Enter>");
txt(4, 9, "<Enter>", green, black);

/* red */
set_font_colors(pixmap_gc, draw_util_hex_to_color("#FF0000"), draw_util_hex_to_color("#000000"));
txt(logical_px(31), 10, "<ESC>");
txt(5, 10, "<ESC>", red, black);
}

/* Copy the contents of the pixmap to the real window */
xcb_copy_area(conn, pixmap, win, pixmap_gc, 0, 0, 0, 0, logical_px(500), logical_px(500));
xcb_flush(conn);

return 1;
Expand Down Expand Up @@ -625,8 +621,7 @@ 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(32) + char_width * 5))
if (event->event_x < col_x(5) || event->event_x > col_x(10))
return;

if (event->event_y >= row_y(4) && event->event_y <= (row_y(4) + font.height)) {
Expand Down Expand Up @@ -867,10 +862,10 @@ int main(int argc, char *argv[]) {
xcb_create_window(
conn,
XCB_COPY_FROM_PARENT,
win, /* the window id */
root, /* parent == root */
logical_px(490), logical_px(297), logical_px(300), window_height(), /* dimensions */
0, /* X11 border = 0, we draw our own */
win, /* the window id */
root, /* parent == root */
WIN_POS_X, WIN_POS_Y, WIN_WIDTH, WIN_HEIGHT, /* dimensions */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like the hardcoded position, but it was like this before. We should fix this and while we're at it move mapping the window further down since we're currently violating the specifications. But that's for a separate PR, so this is just FYI.

0, /* X11 border = 0, we draw our own */
XCB_WINDOW_CLASS_INPUT_OUTPUT,
XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK,
Expand Down Expand Up @@ -915,11 +910,8 @@ int main(int argc, char *argv[]) {
strlen("i3: first configuration"),
"i3: first configuration");

/* Create pixmap */
pixmap = xcb_generate_id(conn);
pixmap_gc = xcb_generate_id(conn);
xcb_create_pixmap(conn, root_screen->root_depth, pixmap, win, logical_px(500), logical_px(500));
xcb_create_gc(conn, pixmap_gc, pixmap, 0, 0);
/* Initialize drawable surface */
draw_util_surface_init(conn, &surface, win, get_visualtype(root_screen), WIN_WIDTH, WIN_HEIGHT);

/* Grab the keyboard to get all input */
xcb_flush(conn);
Expand Down Expand Up @@ -976,5 +968,8 @@ int main(int argc, char *argv[]) {
free(event);
}

/* Dismiss drawable surface */
draw_util_surface_free(conn, &surface);

return 0;
}