Draw the workspace-buttons
This commit is contained in:
parent
72b55fdd4f
commit
8a274bd279
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -21,5 +21,6 @@ void clean_xcb();
|
|||
void get_atoms();
|
||||
void destroy_windows();
|
||||
void create_windows();
|
||||
void draw_buttons();
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue