Draw the workspace-buttons

next
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;
rect rect;
xcb_window_t win;
xcb_gcontext_t gctx;
xcb_window_t bar;
xcb_gcontext_t bargc;
i3_output* next;
};

View File

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

View File

@ -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();
}

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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);
}