]> git.sur5r.net Git - i3/i3/commitdiff
Draw the workspace-buttons
authorAxel Wagner <mail@merovius.de>
Mon, 26 Jul 2010 15:21:46 +0000 (17:21 +0200)
committerAxel Wagner <mail@merovius.de>
Mon, 26 Jul 2010 15:21:46 +0000 (17:21 +0200)
i3bar/include/outputs.h
i3bar/include/xcb.h
i3bar/src/ipc.c
i3bar/src/main.c
i3bar/src/outputs.c
i3bar/src/xcb.c

index 0c24152752ca40472cfcd4cac2b73010ff3e566d..75f0a359e7ff959209fbaba3b41a3445792b9ed0 100644 (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;
 };
index 16bc2bdf09903890ee03934661d7f27ab518502d..5bd781c17cbc39ecf48bd752845e5fe061d9c384 100644 (file)
@@ -21,5 +21,6 @@ void clean_xcb();
 void get_atoms();
 void destroy_windows();
 void create_windows();
+void draw_buttons();
 
 #endif
index 5d7a0bab965164538376fc3a03322d021e1b37b2..46c1e8ca901600a4fbdd5f3da7019b8c6ff6838d 100644 (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();
 }
 
index b42d227cb1e4d29ad39603abb838447841ff28b4..fbef9cf0dae551be9ea337dcddfcf55bc52740af 100644 (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);
 
index 6ddfa8c91e6f8646910e50f4bdfa5c2134b107ac..2066b3d43f605283a7990979927ad40d3d1a4045 100644 (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;
                }
        }
index 20cc23c1f4dbe2ec3b59f4d8b2ad957348835f80..fbfc02adc5a12df1b933e8c1932a91b6584bf166 100644 (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);
+}