From: Axel Wagner Date: Mon, 21 Feb 2011 14:47:58 +0000 (+0100) Subject: Implement dock-positioning X-Git-Tag: 4.0.1~7^2~3^2~26 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=64f2a7561d885ab64905851626268d72051fe59f;p=i3%2Fi3 Implement dock-positioning --- diff --git a/i3bar/CHANGELOG b/i3bar/CHANGELOG index cbacfb99..0b6958d2 100644 --- a/i3bar/CHANGELOG +++ b/i3bar/CHANGELOG @@ -1,3 +1,5 @@ +- Implement different dock-positions +- Hide-on-modifier is now the default behavior - Bugfix: Recover from closed socket v0.6 diff --git a/i3bar/doc/i3bar.man b/i3bar/doc/i3bar.man index f47108dd..41a80bfa 100644 --- a/i3bar/doc/i3bar.man +++ b/i3bar/doc/i3bar.man @@ -9,7 +9,7 @@ i3bar - xcb-based status- and ws-bar == SYNOPSIS -*i3bar* [*-s* 'sock_path'] [*-c* 'command'] [*-m*] [*-f* 'font'] [*-V*] [*-h*] +*i3bar* [*-s* 'sock_path'] [*-c* 'command'] [*-m*|*-d*['pos']] [*-f* 'font'] [*-V*] [*-h*] == OPTIONS @@ -21,7 +21,12 @@ Execute '' to get 'stdin'. You can also simply pipe into 'stdin', but s *-m, --hide*:: Hide the bar, when 'mod4' is not pressed. With this, dockmode will not be set, and the bar is out of the way most of the time so you have more room. -If *-c* is specified, the childprocess is sent a 'SIGSTOP' on hiding and a 'SIGCONT' on unhiding of the bars +If *-c* is specified, the childprocess is sent a 'SIGSTOP' on hiding and a 'SIGCONT' on unhiding of the bars. +This is the default behavior of i3bar. + +*-d*['pos']*, --dock*[*=*'pos']:: +Put i3bar in dockmode. This will reserve some space for it, so it does not overlap other clients. +You can specify either *bottom* (default) or *top* as 'pos'. *-f, --font* 'font':: Specifies a 'X-core-font' to use. You can choose one with *xfontsel*(1). Defaults to '-misc-fixed-medium-r-semicondensed--12-110-75-75-c-60-iso10646-1'. @@ -66,11 +71,15 @@ to connect to i3. To get a docked bar with some statusinformation, you use -*i3status | i3bar* +*i3status | i3bar --dock* + +If you rather have it displayed at the top of the screen, you use + +*i3status | i3bar --dock=top* -If you want it to hide when not needed, you should instead use +If you want it to hide when not needed, you should instead simply use -*i3bar -c i3status -m* +*i3bar -c i3status* == SEE ALSO diff --git a/i3bar/include/config.h b/i3bar/include/config.h index 2dd0f532..d6abb45c 100644 --- a/i3bar/include/config.h +++ b/i3bar/include/config.h @@ -3,8 +3,15 @@ #include "common.h" +typedef enum { + DOCKPOS_NONE = 0, + DOCKPOS_TOP, + DOCKPOS_BOT +} dockpos_t; + typedef struct config_t { int hide_on_modifier; + dockpos_t dockpos; int verbose; xcb_colors_t *colors; } config_t; diff --git a/i3bar/include/xcb_atoms.def b/i3bar/include/xcb_atoms.def index 5084231c..2ac94acb 100644 --- a/i3bar/include/xcb_atoms.def +++ b/i3bar/include/xcb_atoms.def @@ -1,4 +1,4 @@ -ATOM_DO(ATOM) ATOM_DO(_NET_WM_WINDOW_TYPE) ATOM_DO(_NET_WM_WINDOW_TYPE_DOCK) +ATOM_DO(_NET_WM_STRUT_PARTIAL) #undef ATOM_DO diff --git a/i3bar/src/main.c b/i3bar/src/main.c index 9771d2a3..d33ddb4f 100644 --- a/i3bar/src/main.c +++ b/i3bar/src/main.c @@ -79,10 +79,11 @@ static void free_colors(struct xcb_color_strings_t *colors) { } void print_usage(char *elf_name) { - printf("Usage: %s [-s sock_path] [-c command] [-m] [-f font] [-V] [-h]\n", elf_name); + printf("Usage: %s [-s sock_path] [-c command] [-m|-d[pos]] [-f font] [-V] [-h]\n", elf_name); printf("-s \tConnect to i3 via \n"); printf("-c \tExecute to get stdin\n"); printf("-m\t\tHide the bars, when mod4 is not pressed.\n"); + printf("-d[]\tEnable dockmode. is \"top\" or \"bottom\". Default is bottom\n"); printf("\t\tIf -c is specified, the childprocess is sent a SIGSTOP on hiding,\n"); printf("\t\tand a SIGCONT on unhiding of the bars\n"); printf("-f \tUse X-Core-Font for display\n"); @@ -121,11 +122,13 @@ int main(int argc, char **argv) { /* Definition of the standard-config */ config.hide_on_modifier = 0; + config.dockpos = DOCKPOS_NONE; static struct option long_opt[] = { { "socket", required_argument, 0, 's' }, { "command", required_argument, 0, 'c' }, { "hide", no_argument, 0, 'm' }, + { "dock", optional_argument, 0, 'd' }, { "font", required_argument, 0, 'f' }, { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'v' }, @@ -141,7 +144,7 @@ int main(int argc, char **argv) { { NULL, 0, 0, 0} }; - while ((opt = getopt_long(argc, argv, "s:c:mf:hvVA:B:C:D:E:F:G:H:", long_opt, &option_index)) != -1) { + while ((opt = getopt_long(argc, argv, "s:c:d::mf:hvVA:B:C:D:E:F:G:H:", long_opt, &option_index)) != -1) { switch (opt) { case 's': socket_path = expand_path(optarg); @@ -152,6 +155,20 @@ int main(int argc, char **argv) { case 'm': config.hide_on_modifier = 1; break; + case 'd': + if (optarg == NULL) { + config.dockpos = DOCKPOS_BOT; + break; + } + if (!strcmp(optarg, "top")) { + config.dockpos = DOCKPOS_TOP; + } else if (!strcmp(optarg, "bottom")) { + config.dockpos = DOCKPOS_BOT; + } else { + print_usage(argv[0]); + exit(EXIT_FAILURE); + } + break; case 'f': fontname = strdup(optarg); break; @@ -205,6 +222,15 @@ int main(int argc, char **argv) { socket_path = expand_path(i3_default_sock_path); } + if (config.dockpos != DOCKPOS_NONE) { + if (config.hide_on_modifier) { + ELOG("--dock and --hide are mutually exclusive!\n"); + exit(EXIT_FAILURE); + } + } else { + config.hide_on_modifier = 1; + } + main_loop = ev_default_loop(0); init_colors(&colors); diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 60b88fc8..f33a69cd 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -10,6 +10,7 @@ */ #include #include +#include #include #include #include @@ -688,15 +689,57 @@ void reconfig_windows() { /* 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 dock_cookie = xcb_change_property(xcb_connection, XCB_PROP_MODE_REPLACE, walk->bar, atoms[_NET_WM_WINDOW_TYPE], - atoms[ATOM], + XCB_ATOM_ATOM, 32, 1, (unsigned char*) &atoms[_NET_WM_WINDOW_TYPE_DOCK]); + /* We need to tell i3, where to reserve space for i3bar */ + /* left, right, top, bottom, left_start_y, left_end_y, + * right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, + * bottom_end_x */ + /* A local struct to save the strut_partial property */ + struct { + uint32_t left; + uint32_t right; + uint32_t top; + uint32_t bottom; + uint32_t left_start_y; + uint32_t left_end_y; + uint32_t right_start_y; + uint32_t right_end_y; + uint32_t top_start_x; + uint32_t top_end_x; + uint32_t bottom_start_x; + uint32_t bottom_end_x; + } __attribute__((__packed__)) strut_partial = {0,}; + switch (config.dockpos) { + case DOCKPOS_NONE: + break; + case DOCKPOS_TOP: + strut_partial.top = font_height + 6; + strut_partial.top_start_x = walk->rect.x; + strut_partial.top_end_x = walk->rect.x + walk->rect.w; + break; + case DOCKPOS_BOT: + strut_partial.bottom = font_height + 6; + strut_partial.bottom_start_x = walk->rect.x; + strut_partial.bottom_end_x = walk->rect.x + walk->rect.w; + break; + } + xcb_void_cookie_t strut_cookie = xcb_change_property(xcb_connection, + XCB_PROP_MODE_REPLACE, + walk->bar, + atoms[_NET_WM_STRUT_PARTIAL], + XCB_ATOM_CARDINAL, + 32, + 12, + &strut_partial); + /* 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); @@ -714,10 +757,11 @@ void reconfig_windows() { map_cookie = xcb_map_window_checked(xcb_connection, walk->bar); } - if (xcb_request_failed(win_cookie, "Could not create window") || - xcb_request_failed(pm_cookie, "Could not create pixmap") || - xcb_request_failed(prop_cookie, "Could not set dock mode") || - xcb_request_failed(gc_cookie, "Could not create graphical context") || + if (xcb_request_failed(win_cookie, "Could not create window") || + xcb_request_failed(pm_cookie, "Could not create pixmap") || + xcb_request_failed(dock_cookie, "Could not set dock mode") || + xcb_request_failed(strut_cookie, "Could not set strut") || + xcb_request_failed(gc_cookie, "Could not create graphical context") || (!config.hide_on_modifier && xcb_request_failed(map_cookie, "Could not map window"))) { exit(EXIT_FAILURE); }