Draw the workspace-buttons

This commit is contained in:
Axel Wagner 2010-07-26 17:21:46 +02:00
parent 72b55fdd4f
commit 8a274bd279
6 changed files with 100 additions and 11 deletions

View File

@ -18,8 +18,8 @@ struct i3_output_t {
int ws; int ws;
rect rect; rect rect;
xcb_window_t win; xcb_window_t bar;
xcb_gcontext_t gctx; xcb_gcontext_t bargc;
i3_output* next; i3_output* next;
}; };

View File

@ -21,5 +21,6 @@ void clean_xcb();
void get_atoms(); void get_atoms();
void destroy_windows(); void destroy_windows();
void create_windows(); void create_windows();
void draw_buttons();
#endif #endif

View File

@ -35,15 +35,18 @@ int get_ipc_fd(const char* socket_path) {
} }
void got_command_reply(char *reply) { void got_command_reply(char *reply) {
/* FIXME: Error handling for command-replies */
} }
void got_workspace_reply(char *reply) { void got_workspace_reply(char *reply) {
printf("Got Workspace-Data!\n"); printf("Got Workspace-Data!\n");
parse_workspaces_json(reply); parse_workspaces_json(reply);
draw_buttons();
} }
void got_subscribe_reply(char *reply) { void got_subscribe_reply(char *reply) {
printf("Got Subscribe Reply: %s\n", reply); printf("Got Subscribe Reply: %s\n", reply);
/* FIXME: Error handling for subscribe-commands */
} }
void got_output_reply(char *reply) { void got_output_reply(char *reply) {
@ -51,7 +54,7 @@ void got_output_reply(char *reply) {
destroy_windows(); destroy_windows();
printf("Parsing JSON...\n"); printf("Parsing JSON...\n");
parse_outputs_json(reply); parse_outputs_json(reply);
printf("Creating_Windows,,,\n"); printf("Creating_Windows...\n");
create_windows(); create_windows();
} }

View File

@ -19,6 +19,7 @@ int main(int argc, char **argv) {
subscribe_events(); subscribe_events();
i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL); 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); ev_loop(main_loop, 0);

View File

@ -104,6 +104,7 @@ static int outputs_start_map_cb(void* params_) {
new_output->ws = 0, new_output->ws = 0,
memset(&new_output->rect, 0, sizeof(rect)); memset(&new_output->rect, 0, sizeof(rect));
new_output->next = NULL; new_output->next = NULL;
new_output->bar = XCB_NONE;
if (params->outputs == NULL) { if (params->outputs == NULL) {
params->outputs = new_output; params->outputs = new_output;
@ -197,7 +198,7 @@ i3_output* get_output_by_name(char* name) {
i3_output* walk; i3_output* walk;
for (walk = outputs; walk != NULL; walk = walk->next) { for (walk = outputs; walk != NULL; walk = walk->next) {
if (strcmp(walk->name, name)) { if (!strcmp(walk->name, name)) {
break; break;
} }
} }

View File

@ -5,11 +5,22 @@
#include "xcb.h" #include "xcb.h"
#include "outputs.h" #include "outputs.h"
#include "workspaces.h"
xcb_intern_atom_cookie_t atom_cookies[NUM_ATOMS]; 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() { void init_xcb() {
/* LEAK: xcb_connect leaks Memory */ /* FIXME: xcb_connect leaks Memory */
xcb_connection = xcb_connect(NULL, NULL); xcb_connection = xcb_connect(NULL, NULL);
if (xcb_connection_has_error(xcb_connection)) { if (xcb_connection_has_error(xcb_connection)) {
printf("Cannot open display\n"); printf("Cannot open display\n");
@ -45,8 +56,11 @@ void get_atoms() {
void destroy_windows() { void destroy_windows() {
i3_output *walk = outputs; i3_output *walk = outputs;
while(walk != NULL) { while(walk != NULL) {
xcb_destroy_window(xcb_connection, walk->win); if (walk->bar == XCB_NONE) {
walk->win = 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); 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; mask = XCB_CW_BACK_PIXEL;
values[0] = xcb_screens->black_pixel; values[0] = xcb_screens->black_pixel;
xcb_create_window(xcb_connection, xcb_create_window(xcb_connection,
xcb_screens->root_depth, xcb_screens->root_depth,
walk->win, walk->bar,
xcb_root, xcb_root,
walk->rect.x, walk->rect.y, walk->rect.x, walk->rect.y,
walk->rect.w, 20, walk->rect.w, 20,
@ -79,15 +93,84 @@ void create_windows() {
xcb_change_property(xcb_connection, xcb_change_property(xcb_connection,
XCB_PROP_MODE_REPLACE, XCB_PROP_MODE_REPLACE,
walk->win, walk->bar,
atoms[_NET_WM_WINDOW_TYPE], atoms[_NET_WM_WINDOW_TYPE],
atoms[ATOM], atoms[ATOM],
32, 32,
1, 1,
(unsigned char*) &atoms[_NET_WM_WINDOW_TYPE_DOCK]); (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; walk = walk->next;
} }
xcb_flush(xcb_connection); 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);
}