From: Axel Wagner Date: Mon, 26 Jul 2010 15:21:46 +0000 (+0200) Subject: Draw the workspace-buttons X-Git-Tag: 4.0.1~7^2~106 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=8a274bd2790f950635b4908cbe79c29edb30f863;p=i3%2Fi3 Draw the workspace-buttons --- diff --git a/i3bar/include/outputs.h b/i3bar/include/outputs.h index 0c241527..75f0a359 100644 --- a/i3bar/include/outputs.h +++ b/i3bar/include/outputs.h @@ -18,8 +18,8 @@ struct i3_output_t { int ws; rect rect; - xcb_window_t win; - xcb_gcontext_t gctx; + xcb_window_t bar; + xcb_gcontext_t bargc; i3_output* next; }; diff --git a/i3bar/include/xcb.h b/i3bar/include/xcb.h index 16bc2bdf..5bd781c1 100644 --- a/i3bar/include/xcb.h +++ b/i3bar/include/xcb.h @@ -21,5 +21,6 @@ void clean_xcb(); void get_atoms(); void destroy_windows(); void create_windows(); +void draw_buttons(); #endif diff --git a/i3bar/src/ipc.c b/i3bar/src/ipc.c index 5d7a0bab..46c1e8ca 100644 --- a/i3bar/src/ipc.c +++ b/i3bar/src/ipc.c @@ -35,15 +35,18 @@ int get_ipc_fd(const char* socket_path) { } void got_command_reply(char *reply) { + /* FIXME: Error handling for command-replies */ } void got_workspace_reply(char *reply) { printf("Got Workspace-Data!\n"); parse_workspaces_json(reply); + draw_buttons(); } void got_subscribe_reply(char *reply) { printf("Got Subscribe Reply: %s\n", reply); + /* FIXME: Error handling for subscribe-commands */ } void got_output_reply(char *reply) { @@ -51,7 +54,7 @@ void got_output_reply(char *reply) { destroy_windows(); printf("Parsing JSON...\n"); parse_outputs_json(reply); - printf("Creating_Windows,,,\n"); + printf("Creating_Windows...\n"); create_windows(); } diff --git a/i3bar/src/main.c b/i3bar/src/main.c index b42d227c..fbef9cf0 100644 --- a/i3bar/src/main.c +++ b/i3bar/src/main.c @@ -19,6 +19,7 @@ int main(int argc, char **argv) { subscribe_events(); i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL); + i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_WORKSPACES, NULL); ev_loop(main_loop, 0); diff --git a/i3bar/src/outputs.c b/i3bar/src/outputs.c index 6ddfa8c9..2066b3d4 100644 --- a/i3bar/src/outputs.c +++ b/i3bar/src/outputs.c @@ -104,6 +104,7 @@ static int outputs_start_map_cb(void* params_) { new_output->ws = 0, memset(&new_output->rect, 0, sizeof(rect)); new_output->next = NULL; + new_output->bar = XCB_NONE; if (params->outputs == NULL) { params->outputs = new_output; @@ -197,7 +198,7 @@ i3_output* get_output_by_name(char* name) { i3_output* walk; for (walk = outputs; walk != NULL; walk = walk->next) { - if (strcmp(walk->name, name)) { + if (!strcmp(walk->name, name)) { break; } } diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 20cc23c1..fbfc02ad 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -5,11 +5,22 @@ #include "xcb.h" #include "outputs.h" +#include "workspaces.h" xcb_intern_atom_cookie_t atom_cookies[NUM_ATOMS]; +uint32_t get_colorpixel(const char *s) { + char strings[3][3] = { { s[0], s[1], '\0'} , + { s[2], s[3], '\0'} , + { s[4], s[5], '\0'} }; + uint8_t r = strtol(strings[0], NULL, 16); + uint8_t g = strtol(strings[1], NULL, 16); + uint8_t b = strtol(strings[2], NULL, 16); + return (r << 16 | g << 8 | b); +} + void init_xcb() { - /* LEAK: xcb_connect leaks Memory */ + /* FIXME: xcb_connect leaks Memory */ xcb_connection = xcb_connect(NULL, NULL); if (xcb_connection_has_error(xcb_connection)) { printf("Cannot open display\n"); @@ -45,8 +56,11 @@ void get_atoms() { void destroy_windows() { i3_output *walk = outputs; while(walk != NULL) { - xcb_destroy_window(xcb_connection, walk->win); - walk->win = XCB_NONE; + if (walk->bar == XCB_NONE) { + continue; + } + xcb_destroy_window(xcb_connection, walk->bar); + walk->bar = XCB_NONE; } } @@ -62,12 +76,12 @@ void create_windows() { } printf("Creating Window for output %s\n", walk->name); - walk->win = xcb_generate_id(xcb_connection); + walk->bar = xcb_generate_id(xcb_connection); mask = XCB_CW_BACK_PIXEL; values[0] = xcb_screens->black_pixel; xcb_create_window(xcb_connection, xcb_screens->root_depth, - walk->win, + walk->bar, xcb_root, walk->rect.x, walk->rect.y, walk->rect.w, 20, @@ -79,15 +93,84 @@ void create_windows() { xcb_change_property(xcb_connection, XCB_PROP_MODE_REPLACE, - walk->win, + walk->bar, atoms[_NET_WM_WINDOW_TYPE], atoms[ATOM], 32, 1, (unsigned char*) &atoms[_NET_WM_WINDOW_TYPE_DOCK]); - xcb_map_window(xcb_connection, walk->win); + walk->bargc = xcb_generate_id(xcb_connection); + xcb_create_gc(xcb_connection, + walk->bargc, + walk->bar, + 0, + NULL); + + xcb_map_window(xcb_connection, walk->bar); walk = walk->next; } xcb_flush(xcb_connection); } + +void draw_buttons() { + printf("Drawing Buttons...\n"); + i3_output *outputs_walk = outputs; + int i = 0; + while (outputs_walk != NULL) { + if (!outputs_walk->active) { + printf("Output %s inactive, skipping...\n", outputs_walk->name); + outputs_walk = outputs_walk->next; + continue; + } + if (outputs_walk->bar == XCB_NONE) { + create_windows(); + } + uint32_t color = get_colorpixel("000000"); + xcb_change_gc(xcb_connection, + outputs_walk->bargc, + XCB_GC_FOREGROUND, + &color); + xcb_rectangle_t rect = { 0, 0, outputs_walk->rect.w, 20 }; + xcb_poly_fill_rectangle(xcb_connection, + outputs_walk->bar, + outputs_walk->bargc, + 1, + &rect); + i3_ws *ws_walk = workspaces; + while (ws_walk != NULL) { + if (ws_walk->output != outputs_walk) { + printf("WS %s on wrong output, skipping...\n", ws_walk->name); + ws_walk = ws_walk->next; + continue; + } + printf("Drawing Button for WS %s...\n", ws_walk->name); + uint32_t color = get_colorpixel("240000"); + if (ws_walk->visible) { + color = get_colorpixel("480000"); + } + if (ws_walk->urgent) { + color = get_colorpixel("002400"); + } + xcb_change_gc(xcb_connection, + outputs_walk->bargc, + XCB_GC_FOREGROUND, + &color); + xcb_change_gc(xcb_connection, + outputs_walk->bargc, + XCB_GC_BACKGROUND, + &color); + xcb_rectangle_t rect = { i + 1, 1, 18, 18 }; + xcb_poly_fill_rectangle(xcb_connection, + outputs_walk->bar, + outputs_walk->bargc, + 1, + &rect); + i += 20; + ws_walk = ws_walk->next; + } + outputs_walk = outputs_walk->next; + i = 0; + } + xcb_flush(xcb_connection); +}