Draw the workspace-buttons
This commit is contained in:
parent
72b55fdd4f
commit
8a274bd279
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue