Add some more comments
This commit is contained in:
parent
c82556f0f2
commit
93453c64f2
|
@ -114,6 +114,7 @@ void start_child(char *command) {
|
||||||
printf("ERROR: Couldn't fork()");
|
printf("ERROR: Couldn't fork()");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
case 0:
|
case 0:
|
||||||
|
/* Child-process. Reroute stdout and start shell */
|
||||||
close(fd[0]);
|
close(fd[0]);
|
||||||
|
|
||||||
dup2(fd[1], STDOUT_FILENO);
|
dup2(fd[1], STDOUT_FILENO);
|
||||||
|
@ -126,6 +127,7 @@ void start_child(char *command) {
|
||||||
execl(shell, shell, "-c", command, (char*) NULL);
|
execl(shell, shell, "-c", command, (char*) NULL);
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
|
/* Parent-process. Rerout stdin */
|
||||||
close(fd[1]);
|
close(fd[1]);
|
||||||
|
|
||||||
dup2(fd[0], STDIN_FILENO);
|
dup2(fd[0], STDIN_FILENO);
|
||||||
|
@ -134,6 +136,7 @@ void start_child(char *command) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We set O_NONBLOCK because blocking is evil in event-driven software */
|
||||||
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
|
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
|
||||||
|
|
||||||
stdin_io = malloc(sizeof(ev_io));
|
stdin_io = malloc(sizeof(ev_io));
|
||||||
|
|
|
@ -51,7 +51,7 @@ 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 */
|
/* TODO: Error handling for command-replies */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -71,7 +71,7 @@ void got_workspace_reply(char *reply) {
|
||||||
*/
|
*/
|
||||||
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 */
|
/* TODO: Error handling for subscribe-commands */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -134,6 +134,8 @@ void got_data(struct ev_loop *loop, ev_io *watcher, int events) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We first parse the fixed-length IPC-header, to know, how much data
|
||||||
|
* we have to expect */
|
||||||
uint32_t rec = 0;
|
uint32_t rec = 0;
|
||||||
while (rec < header_len) {
|
while (rec < header_len) {
|
||||||
int n = read(fd, header + rec, header_len - rec);
|
int n = read(fd, header + rec, header_len - rec);
|
||||||
|
@ -156,11 +158,13 @@ void got_data(struct ev_loop *loop, ev_io *watcher, int events) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Know we read the rest of the message */
|
|
||||||
char *walk = header + strlen(I3_IPC_MAGIC);
|
char *walk = header + strlen(I3_IPC_MAGIC);
|
||||||
uint32_t size = *((uint32_t*) walk);
|
uint32_t size = *((uint32_t*) walk);
|
||||||
walk += sizeof(uint32_t);
|
walk += sizeof(uint32_t);
|
||||||
uint32_t type = *((uint32_t*) walk);
|
uint32_t type = *((uint32_t*) walk);
|
||||||
|
|
||||||
|
/* Now that we know, what to expect, we can start read()ing the rest
|
||||||
|
* of the message */
|
||||||
char *buffer = malloc(size + 1);
|
char *buffer = malloc(size + 1);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
printf("ERROR: Could not allocate memory!\n");
|
printf("ERROR: Could not allocate memory!\n");
|
||||||
|
@ -205,7 +209,11 @@ int i3_send_msg(uint32_t type, const char *payload) {
|
||||||
len = strlen(payload);
|
len = strlen(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We are a wellbehaved client and send a proper header first */
|
||||||
uint32_t to_write = strlen (I3_IPC_MAGIC) + sizeof(uint32_t)*2 + len;
|
uint32_t to_write = strlen (I3_IPC_MAGIC) + sizeof(uint32_t)*2 + len;
|
||||||
|
/* TODO: I'm not entirely sure if this buffer really has to contain more
|
||||||
|
* than the pure header (why not just write() the payload from *payload?),
|
||||||
|
* but we leave it for now */
|
||||||
char *buffer = malloc(to_write);
|
char *buffer = malloc(to_write);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
printf("ERROR: Could not allocate memory\n");
|
printf("ERROR: Could not allocate memory\n");
|
||||||
|
|
|
@ -18,7 +18,10 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Glob path, i.e. expand ~
|
||||||
|
*
|
||||||
|
*/
|
||||||
char *expand_path(char *path) {
|
char *expand_path(char *path) {
|
||||||
static glob_t globbuf;
|
static glob_t globbuf;
|
||||||
if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0) {
|
if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0) {
|
||||||
|
@ -92,6 +95,9 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fontname == NULL) {
|
if (fontname == NULL) {
|
||||||
|
/* This is a very restrictive default. More sensefull would be something like
|
||||||
|
* "-misc-*-*-*-*--*-*-*-*-*-*-*-*". But since that produces very ugly results
|
||||||
|
* on my machine, let's stick with this until we have a configfile */
|
||||||
fontname = "-misc-fixed-medium-r-semicondensed--12-110-75-75-c-60-iso10646-1";
|
fontname = "-misc-fixed-medium-r-semicondensed--12-110-75-75-c-60-iso10646-1";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,13 +114,21 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
FREE(socket_path);
|
FREE(socket_path);
|
||||||
|
|
||||||
|
/* We subscribe to the i3-events we need */
|
||||||
subscribe_events();
|
subscribe_events();
|
||||||
|
|
||||||
|
/* We initiate the main-function by requesting infos about the outputs and
|
||||||
|
* workspaces. Everything else (creating the bars, showing the right workspace-
|
||||||
|
* buttons and more) is taken care of by the event-driveniness of the code */
|
||||||
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);
|
i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_WORKSPACES, NULL);
|
||||||
|
|
||||||
|
/* The name of this function is actually misleading. Even if no -c is specified,
|
||||||
|
* this function initiates the watchers to listen on stdin and react accordingly */
|
||||||
start_child(command);
|
start_child(command);
|
||||||
|
|
||||||
|
/* From here on everything should run smooth for itself, just start listening for
|
||||||
|
* events. We stop simply stop the event-loop, when we are finished */
|
||||||
ev_loop(main_loop, 0);
|
ev_loop(main_loop, 0);
|
||||||
|
|
||||||
kill_child();
|
kill_child();
|
||||||
|
|
|
@ -441,6 +441,9 @@ void init_xcb(char *fontname) {
|
||||||
query_font_cookie = xcb_query_font(xcb_connection,
|
query_font_cookie = xcb_query_font(xcb_connection,
|
||||||
xcb_font);
|
xcb_font);
|
||||||
|
|
||||||
|
/* To grab modifiers without blocking other applications from receiving key-events
|
||||||
|
* involving that modifier, we sadly have to use xkb which is not yet fully supported
|
||||||
|
* in xcb */
|
||||||
if (config.hide_on_modifier) {
|
if (config.hide_on_modifier) {
|
||||||
int xkb_major, xkb_minor, xkb_errbase, xkb_err;
|
int xkb_major, xkb_minor, xkb_errbase, xkb_err;
|
||||||
xkb_major = XkbMajorVersion;
|
xkb_major = XkbMajorVersion;
|
||||||
|
@ -494,6 +497,8 @@ void init_xcb(char *fontname) {
|
||||||
mask,
|
mask,
|
||||||
vals);
|
vals);
|
||||||
|
|
||||||
|
/* We only generate an id for the pixmap, because the width of it is dependent on the
|
||||||
|
* input we get */
|
||||||
statusline_pm = xcb_generate_id(xcb_connection);
|
statusline_pm = xcb_generate_id(xcb_connection);
|
||||||
|
|
||||||
/* The varios Watchers to communicate with xcb */
|
/* The varios Watchers to communicate with xcb */
|
||||||
|
@ -512,7 +517,7 @@ void init_xcb(char *fontname) {
|
||||||
/* Now we get the atoms and save them in a nice data-structure */
|
/* Now we get the atoms and save them in a nice data-structure */
|
||||||
get_atoms();
|
get_atoms();
|
||||||
|
|
||||||
/* Now we calculate the font-height */
|
/* Now we save the font-infos */
|
||||||
font_info = xcb_query_font_reply(xcb_connection,
|
font_info = xcb_query_font_reply(xcb_connection,
|
||||||
query_font_cookie,
|
query_font_cookie,
|
||||||
&err);
|
&err);
|
||||||
|
@ -637,6 +642,7 @@ void reconfig_windows() {
|
||||||
mask,
|
mask,
|
||||||
values);
|
values);
|
||||||
|
|
||||||
|
/* The double-buffer we use to render stuff off-screen */
|
||||||
xcb_void_cookie_t pm_cookie = xcb_create_pixmap_checked(xcb_connection,
|
xcb_void_cookie_t pm_cookie = xcb_create_pixmap_checked(xcb_connection,
|
||||||
xcb_screens->root_depth,
|
xcb_screens->root_depth,
|
||||||
walk->buffer,
|
walk->buffer,
|
||||||
|
@ -644,7 +650,8 @@ void reconfig_windows() {
|
||||||
walk->rect.w,
|
walk->rect.w,
|
||||||
walk->rect.h);
|
walk->rect.h);
|
||||||
|
|
||||||
/* We want dock-windows (for now) */
|
/* We want dock-windows (for now). When override_redirect is set, i3 is ignoring
|
||||||
|
* this one */
|
||||||
xcb_void_cookie_t prop_cookie = xcb_change_property(xcb_connection,
|
xcb_void_cookie_t prop_cookie = xcb_change_property(xcb_connection,
|
||||||
XCB_PROP_MODE_REPLACE,
|
XCB_PROP_MODE_REPLACE,
|
||||||
walk->bar,
|
walk->bar,
|
||||||
|
@ -653,7 +660,9 @@ void reconfig_windows() {
|
||||||
32,
|
32,
|
||||||
1,
|
1,
|
||||||
(unsigned char*) &atoms[_NET_WM_WINDOW_TYPE_DOCK]);
|
(unsigned char*) &atoms[_NET_WM_WINDOW_TYPE_DOCK]);
|
||||||
/* We also want a graphics-context (the "canvas" on which we draw) */
|
|
||||||
|
/* We also want a graphics-context for the bars (it defines the properties
|
||||||
|
* with which we draw to them) */
|
||||||
walk->bargc = xcb_generate_id(xcb_connection);
|
walk->bargc = xcb_generate_id(xcb_connection);
|
||||||
mask = XCB_GC_FONT;
|
mask = XCB_GC_FONT;
|
||||||
values[0] = xcb_font;
|
values[0] = xcb_font;
|
||||||
|
@ -733,8 +742,10 @@ void draw_bars() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (outputs_walk->bar == XCB_NONE) {
|
if (outputs_walk->bar == XCB_NONE) {
|
||||||
|
/* Oh shit, an active output without an own bar. Create it now! */
|
||||||
reconfig_windows();
|
reconfig_windows();
|
||||||
}
|
}
|
||||||
|
/* First things first: clear the backbuffer */
|
||||||
uint32_t color = get_colorpixel("000000");
|
uint32_t color = get_colorpixel("000000");
|
||||||
xcb_change_gc(xcb_connection,
|
xcb_change_gc(xcb_connection,
|
||||||
outputs_walk->bargc,
|
outputs_walk->bargc,
|
||||||
|
@ -746,9 +757,13 @@ void draw_bars() {
|
||||||
outputs_walk->bargc,
|
outputs_walk->bargc,
|
||||||
1,
|
1,
|
||||||
&rect);
|
&rect);
|
||||||
|
|
||||||
if (statusline != NULL) {
|
if (statusline != NULL) {
|
||||||
printf("Printing statusline!\n");
|
printf("Printing statusline!\n");
|
||||||
|
|
||||||
|
/* Luckily we already prepared a seperate pixmap containing the rendered
|
||||||
|
* statusline, we just have to copy the relevant parts to the relevant
|
||||||
|
* position */
|
||||||
xcb_copy_area(xcb_connection,
|
xcb_copy_area(xcb_connection,
|
||||||
statusline_pm,
|
statusline_pm,
|
||||||
outputs_walk->buffer,
|
outputs_walk->buffer,
|
||||||
|
|
Loading…
Reference in New Issue