#include #include #include #include #include #include #define cmd_workspace 1 #define cmd_move 2 #define cmd_kill 3 #define cmd_bar_position 4 #define cmd_bar_margin_x 5 #define cmd_bar_margin_y 6 #define cmd_reload 7 #define cmd_bar_nf 8 #define cmd_bar_nb 9 #define cmd_bar_sf 10 #define cmd_bar_sb 11 #define cmd_bar_sa 12 #define cmd_gap_inner 13 #define cmd_gap_outer 14 #define cmd_gap_top 15 #define cmd_tile_focused 16 #define cmd_bar_height 17 #define cmd_bar_font 18 #define cmd_bar_showempty 19 int main(int argc, char **argv) { Display *display; Window root_window; XEvent event; Atom control_atom; int command, workspace, value; char *end_ptr; command = cmd_workspace; workspace = 0; value = 0; if (argc == 2 && !strcmp(argv[1], "kill")) command = cmd_kill; else if (argc == 2 && !strcmp(argv[1], "tile")) command = cmd_tile_focused; else if (argc == 2 && !strcmp(argv[1], "reload")) command = cmd_reload; else if (argc == 3 && !strcmp(argv[1], "bar")) { if (!strcmp(argv[2], "top")) { command = cmd_bar_position; value = 0; } else if (!strcmp(argv[2], "bottom")) { command = cmd_bar_position; value = 1; } else if (!strcmp(argv[2], "showempty")) { command = cmd_bar_showempty; value = 0; } else { fprintf(stderr, "usage: wmc bar top|bottom|showempty\n"); return 1; } } else if (argc == 4 && !strcmp(argv[1], "bar")) { if (!strcmp(argv[2], "height")) { value = (int)strtol(argv[3], &end_ptr, 10); if (*end_ptr != '\0' || value < 1) return 1; command = cmd_bar_height; } else if (!strcmp(argv[2], "font")) { command = cmd_bar_font; value = 0; } else { if (!strcmp(argv[2], "nf")) command = cmd_bar_nf; else if (!strcmp(argv[2], "nb")) command = cmd_bar_nb; else if (!strcmp(argv[2], "sf")) command = cmd_bar_sf; else if (!strcmp(argv[2], "sb")) command = cmd_bar_sb; else if (!strcmp(argv[2], "sa")) command = cmd_bar_sa; if (command >= cmd_bar_nf && command <= cmd_bar_sa) { value = 0; } else { value = (int)strtol(argv[3], &end_ptr, 10); if (*end_ptr != '\0' || value < 0) return 1; if (!strcmp(argv[2], "mx")) command = cmd_bar_margin_x; else if (!strcmp(argv[2], "my")) command = cmd_bar_margin_y; else { fprintf(stderr, "usage: wmc bar mx | wmc bar my | " "wmc bar height | wmc bar font | " "wmc bar nf|nb|sf|sb|sa \n"); return 1; } } } } else if (argc == 4 && !strcmp(argv[1], "gap")) { value = (int)strtol(argv[3], &end_ptr, 10); if (*end_ptr != '\0' || value < 0) return 1; if (!strcmp(argv[2], "inner")) command = cmd_gap_inner; else if (!strcmp(argv[2], "outer")) command = cmd_gap_outer; else if (!strcmp(argv[2], "top")) command = cmd_gap_top; else { fprintf(stderr, "usage: wmc gap inner | wmc gap outer | wmc gap top \n"); return 1; } } else if (argc == 2) workspace = (int)strtol(argv[1], &end_ptr, 10); else if (argc == 3 && !strcmp(argv[1], "move")) { command = cmd_move; workspace = (int)strtol(argv[2], &end_ptr, 10); } else if (argc == 3 && !strcmp(argv[1], "ws")) workspace = (int)strtol(argv[2], &end_ptr, 10); else { fprintf(stderr, "usage: wmc [ws] 1-9 | wmc move 1-9 | wmc kill | wmc reload | " "wmc tile | " "wmc bar top|bottom|showempty | wmc bar mx | wmc bar my | " "wmc bar height | wmc bar font | " "wmc bar nf|nb|sf|sb|sa | wmc gap inner|outer|top \n"); return 1; } if ((command == cmd_workspace || command == cmd_move) && (*end_ptr != '\0' || workspace < 1 || workspace > 9)) return 1; if (command == cmd_bar_position || command == cmd_bar_showempty || command == cmd_bar_margin_x || command == cmd_bar_margin_y || command == cmd_bar_height || command == cmd_gap_inner || command == cmd_gap_outer || command == cmd_gap_top) workspace = value; if ((display = XOpenDisplay(NULL)) == NULL) return 1; root_window = DefaultRootWindow(display); control_atom = XInternAtom(display, "_WM_CTL", False); memset(&event, 0, sizeof(event)); event.xclient.type = ClientMessage; event.xclient.window = root_window; event.xclient.message_type = control_atom; event.xclient.format = 32; event.xclient.data.l[0] = command; if (command == cmd_workspace || command == cmd_move) event.xclient.data.l[1] = workspace > 0 ? workspace - 1 : 0; else if (command == cmd_bar_font || (command >= cmd_bar_nf && command <= cmd_bar_sa)) { Atom payload_atom; char atom_name[64]; static unsigned long seq; seq++; snprintf(atom_name, sizeof(atom_name), "_WM_CTL_PAYLOAD_%lu", seq); payload_atom = XInternAtom(display, atom_name, False); XChangeProperty(display, root_window, payload_atom, XA_STRING, 8, PropModeReplace, (unsigned char *)argv[3], (int)strlen(argv[3])); event.xclient.data.l[1] = (long)payload_atom; } else event.xclient.data.l[1] = workspace; XSendEvent(display, root_window, False, SubstructureNotifyMask, &event); XFlush(display); _exit(0); }