diff options
author | John Vogel <jvogel4@stny.rr.com> | 2014-06-24 08:57:40 +0700 |
---|---|---|
committer | Willy Sudiarto Raharjo <willysr@slackbuilds.org> | 2014-06-24 08:57:40 +0700 |
commit | 0b51634b6704d060109fea7b90e1021b101a3921 (patch) | |
tree | e8c33391bf63a016e0834f8358435f26c2ba1c7e | |
parent | d139bc309c5b7840179547a6337968fc1ba772e7 (diff) | |
download | slackbuilds-0b51634b6704d060109fea7b90e1021b101a3921.tar.gz |
desktop/bar: Add upstream patch.
Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
-rw-r--r-- | desktop/bar/bar.SlackBuild | 18 | ||||
-rw-r--r-- | desktop/bar/patches/bar-1.0_970332a.patch | 351 | ||||
-rw-r--r-- | desktop/bar/patches/bar-monitor-option.patch | 300 | ||||
-rw-r--r-- | desktop/bar/slack-desc | 2 |
4 files changed, 361 insertions, 310 deletions
diff --git a/desktop/bar/bar.SlackBuild b/desktop/bar/bar.SlackBuild index 71971ed2a2..4fc0013edd 100644 --- a/desktop/bar/bar.SlackBuild +++ b/desktop/bar/bar.SlackBuild @@ -24,7 +24,7 @@ PRGNAM=bar VERSION=${VERSION:-1.0} -BUILD=${BUILD:-1} +BUILD=${BUILD:-2} TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then @@ -61,26 +61,26 @@ mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf $PRGNAM-$VERSION if [ ! -f $CWD/$PRGNAM-$VERSION.tar.gz ]; then - if [ -f $CWD/v$VERSION.tar.gz ]; then - mv $CWD/v$VERSION.tar.gz $CWD/$PRGNAM-$VERSION.tar.gz - fi + if [ -f $CWD/v$VERSION.tar.gz ]; then + mv $CWD/v$VERSION.tar.gz $CWD/$PRGNAM-$VERSION.tar.gz + fi fi tar xvf $CWD/$PRGNAM-$VERSION.tar.gz cd $PRGNAM-$VERSION chown -R root:root . find -L . \ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ - -o -perm 511 \) -exec chmod 755 {} \; -o \ + -o -perm 511 \) -exec chmod 755 {} \; -o \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; -# add monitor option for ordering and selective inclusion -patch -p1 < $CWD/patches/bar-monitor-option.patch - +# patch to commit 970332a +patch -p1 < $CWD/patches/bar-1.0_970332a.patch # adjust CFLAGS in Makefile to accept SLKCFLAGS patch -p1 < $CWD/patches/bar-Makefile-CFLAGS.patch -CFLAGS="$SLKCFLAGS" make +CFLAGS="$SLKCFLAGS" \ +make make doc install -D -m 755 bar $PKG/usr/bin/bar install -D -m 644 bar.1 $PKG/usr/man/man1/bar.1 diff --git a/desktop/bar/patches/bar-1.0_970332a.patch b/desktop/bar/patches/bar-1.0_970332a.patch new file mode 100644 index 0000000000..39024aeb60 --- /dev/null +++ b/desktop/bar/patches/bar-1.0_970332a.patch @@ -0,0 +1,351 @@ +diff --git a/README.pod b/README.pod +index 565f188..f021f3a 100644 +--- a/README.pod ++++ b/README.pod +@@ -4,7 +4,7 @@ bar - bar ain't recursive + + =head1 SYNOPSIS + +-I<bar> [-h | -g I<width>B<x>I<height>B<+>I<x> | -b | -d | -f I<font> | -p | -u I<pixel> | -B I<color> | -F I<color>] ++I<bar> [-h | -g I<width>B<x>I<height>B<+>I<x>B<+>I<y> | -b | -d | -f I<font> | -p | -u I<pixel> | -B I<color> | -F I<color>] + + =head1 DESCRIPTION + +@@ -18,9 +18,9 @@ B<bar> is a lightweight bar entirely based on XCB. Provides full UTF-8 support, + + Display the help and exit. + +-=item B<-g> I<width>B<x>I<height>B<+>I<x> ++=item B<-g> I<width>B<x>I<height>B<+>I<x>B<+>I<y> + +-Set the window geometry. If a parameter is omitted it's filled with the default value. ++Set the window geometry. If a parameter is omitted it's filled with the default value. If the I<y> parameter is specified along with the B<-b> switch then the position is relative to the bottom of the screen. + + =item B<-b> + +@@ -86,12 +86,14 @@ Set the text foreground color. The parameter I<color> can be I<-> or a color in + + Set the text underline color. The parameter I<color> can be I<-> or a color in one of the formats mentioned before. The special value I<-> resets the color to the default one. + +-=item B<A>:I<command>: ++=item B<A>I<button>:I<command>: + + Create a clickable area starting from the current position, when the area is clicked I<command> is executed. The area is closed when a B<A> token, not followed by : is encountered. + + Eg. I<%{A:reboot:} Click here to reboot %{A}> + ++The I<button> field is optional, it defaults to the left button, and it's a number ranging from 1 to 5 which maps to the left, middle, right, scroll down and scroll up movements. Your mileage may vary. ++ + =item B<S>I<dir> + + Change the monitor bar is rendering to. I<dir> can be either +diff --git a/bar.c b/bar.c +index 1ccc907..1f8c5cf 100644 +--- a/bar.c ++++ b/bar.c +@@ -34,12 +34,12 @@ typedef struct monitor_t { + } monitor_t; + + typedef struct area_t { +- int begin, end, align; ++ int begin, end, align, button; + xcb_window_t window; + char *cmd; + } area_t; + +-#define N 10 ++#define N 20 + + typedef struct area_stack_t { + int pos; +@@ -74,7 +74,7 @@ static font_t *main_font, *alt_font; + static uint32_t attrs = 0; + static bool dock = false; + static bool topbar = true; +-static int bw = -1, bh = -1, bx = 0; ++static int bw = -1, bh = -1, bx = 0, by = 0; + static int bu = 1; /* Underline height */ + static char *mfont, *afont; + static uint32_t fgc, bgc, ugc; +@@ -118,7 +118,7 @@ draw_char (monitor_t *mon, font_t *cur_font, int x, int align, uint16_t ch) + } + + /* Draw the background first */ +- fill_rect(mon->pixmap, gc[GC_CLEAR], x, 0, ch_width, bh); ++ fill_rect(mon->pixmap, gc[GC_CLEAR], x, by, ch_width, bh); + + /* xcb accepts string in UCS-2 BE, so swap */ + ch = (ch >> 8) | (ch << 8); +@@ -156,9 +156,17 @@ parse_color (const char *str, char **end, const uint32_t def) + if (str[0] == '#') { + errno = 0; + uint32_t tmp = strtoul(str + 1, end, 16); +- /* Some error checking it's good */ ++ /* Some error checking is definitely good */ + if (errno) +- return def; ++ tmp = def; ++ /* Xorg uses colors with premultiplied alpha. ++ * Don't do anything if we didn't acquire a rgba visual. */ ++ if (visual != scr->root_visual) { ++ const uint8_t a = ((tmp>>24)&255); ++ const uint32_t t1 = (tmp&0xff00ff) * (0x100-a); ++ const uint32_t t2 = (tmp&0x00ff00) * (0x100-a); ++ tmp = (a<<24)|(t1&0xff00ff)|(t2&0x00ff00); ++ } + return tmp; + } + +@@ -225,7 +233,7 @@ area_shift (xcb_window_t win, const int align, int delta) + } + + bool +-area_add (char *str, const char *optend, char **end, monitor_t *mon, const int x, const int align) ++area_add (char *str, const char *optend, char **end, monitor_t *mon, const int x, const int align, const int button) + { + char *p = str; + area_t *a = &astack.slot[astack.pos]; +@@ -280,6 +288,7 @@ area_add (char *str, const char *optend, char **end, monitor_t *mon, const int x + a->align = align; + a->begin = x; + a->window = mon->window; ++ a->button = button; + + *end = trail + 1; + +@@ -291,8 +300,7 @@ parse (char *text) + { + font_t *cur_font; + monitor_t *cur_mon; +- int pos_x; +- int align; ++ int pos_x, align, button; + char *p = text, *end; + uint32_t tmp; + +@@ -302,7 +310,8 @@ parse (char *text) + + memset(&astack, 0, sizeof(area_stack_t)); + +- fill_rect(cur_mon->pixmap, gc[GC_CLEAR], 0, 0, bw, bh); ++ for (monitor_t *m = monhead; m != NULL; m = m->next) ++ fill_rect(m->pixmap, gc[GC_CLEAR], 0, 0, m->width, bh); + + for (;;) { + if (*p == '\0' || *p == '\n') +@@ -330,7 +339,11 @@ parse (char *text) + case 'r': pos_x = 0; align = ALIGN_R; break; + + case 'A': +- area_add(p, end, &p, cur_mon, pos_x, align); ++ button = XCB_BUTTON_INDEX_1; ++ /* The range is 1-5 */ ++ if (isdigit(*p) && (*p > '0' && *p < '6')) ++ button = *p++ - '0'; ++ area_add(p, end, &p, cur_mon, pos_x, align, button); + break; + + case 'B': bgc = parse_color(p, &p, dbgc); update_gc(); break; +@@ -356,7 +369,6 @@ parse (char *text) + + p++; + pos_x = 0; +- fill_rect(cur_mon->pixmap, gc[GC_CLEAR], 0, 0, cur_mon->width, bh); + break; + + /* In case of error keep parsing after the closing } */ +@@ -513,7 +525,7 @@ monitor_new (int x, int y, int width, int height) + ret->width = width; + ret->next = ret->prev = NULL; + +- int win_y = (topbar ? 0 : height - bh) + y; ++ int win_y = (topbar ? by : height - bh - by) + y; + ret->window = xcb_generate_id(c); + + int depth = (visual == scr->root_visual) ? XCB_COPY_FROM_PARENT : 32; +@@ -562,14 +574,39 @@ rect_sort_cb (const void *p1, const void *p2) + void + monitor_create_chain (xcb_rectangle_t *rects, const int num) + { +- int width = bw; ++ int i; ++ int width = 0, height = 0; + int left = bx; + + /* Sort before use */ + qsort(rects, num, sizeof(xcb_rectangle_t), rect_sort_cb); + ++ for (i = 0; i < num; i++) { ++ int h = rects[i].y + rects[i].height; ++ /* Accumulated width of all monitors */ ++ width += rects[i].width; ++ /* Get height of screen from y_offset + height of lowest monitor */ ++ if (h >= height) ++ height = h; ++ } ++ ++ if (bw < 0) ++ bw = width - bx; ++ ++ if (bh < 0 || bh > height) ++ bh = main_font->height + bu + 2; ++ ++ /* Check the geometry */ ++ if (bx + bw > width || by + bh > height) { ++ fprintf(stderr, "The geometry specified doesn't fit the screen!\n"); ++ exit(EXIT_FAILURE); ++ } ++ + /* Left is a positive number or zero therefore monitors with zero width are excluded */ +- for (int i = 0; i < num; i++) { ++ width = bw; ++ for (i = 0; i < num; i++) { ++ if (rects[i].y + rects[i].height < by) ++ continue; + if (rects[i].width > left) { + monitor_t *mon = monitor_new( + rects[i].x + left, +@@ -598,7 +635,7 @@ get_randr_monitors (void) + { + xcb_randr_get_screen_resources_current_reply_t *rres_reply; + xcb_randr_output_t *outputs; +- int num, valid = 0; ++ int i, j, num, valid = 0; + + rres_reply = xcb_randr_get_screen_resources_current_reply(c, + xcb_randr_get_screen_resources_current(c, scr->root), NULL); +@@ -621,7 +658,7 @@ get_randr_monitors (void) + xcb_rectangle_t rects[num]; + + /* Get all outputs */ +- for (int i = 0; i < num; i++) { ++ for (i = 0; i < num; i++) { + xcb_randr_get_output_info_reply_t *oi_reply; + xcb_randr_get_crtc_info_reply_t *ci_reply; + +@@ -657,11 +694,11 @@ get_randr_monitors (void) + free(rres_reply); + + /* Check for clones and inactive outputs */ +- for (int i = 0; i < num; i++) { ++ for (i = 0; i < num; i++) { + if (rects[i].width == 0) + continue; + +- for (int j = 0; j < num; j++) { ++ for (j = 0; j < num; j++) { + /* Does I countain J ? */ + + if (i != j && rects[j].width) { +@@ -679,7 +716,13 @@ get_randr_monitors (void) + return; + } + +- monitor_create_chain(rects, num); ++ xcb_rectangle_t r[valid]; ++ ++ for (i = j = 0; i < num && j < valid; i++) ++ if (rects[i].width != 0) ++ r[j++] = rects[i]; ++ ++ monitor_create_chain(r, valid); + } + + void +@@ -755,10 +798,6 @@ xconn (void) + void + init (void) + { +- /* If I fits I sits */ +- if (bw < 0) +- bw = scr->width_in_pixels - bx; +- + /* Load the fonts */ + main_font = font_load(mfont ? mfont : "fixed"); + if (!main_font) +@@ -771,10 +810,6 @@ init (void) + /* To make the alignment uniform */ + main_font->height = alt_font->height = max(main_font->height, alt_font->height); + +- /* Adjust the height */ +- if (bh < 0 || bh > scr->height_in_pixels) +- bh = main_font->height + bu + 2; +- + /* Generate a list of screens */ + const xcb_query_extension_reply_t *qe_reply; + +@@ -801,9 +836,24 @@ init (void) + } + } + +- if (!monhead) ++ if (!monhead) { ++ /* If I fits I sits */ ++ if (bw < 0) ++ bw = scr->width_in_pixels - bx; ++ ++ /* Adjust the height */ ++ if (bh < 0 || bh > scr->height_in_pixels) ++ bh = main_font->height + bu + 2; ++ ++ /* Check the geometry */ ++ if (bx + bw > scr->width_in_pixels || by + bh > scr->height_in_pixels) { ++ fprintf(stderr, "The geometry specified doesn't fit the screen!\n"); ++ exit(EXIT_FAILURE); ++ } ++ + /* If no RandR outputs or Xinerama screens, fall back to using whole screen */ + monhead = monitor_new(0, 0, bw, scr->height_in_pixels); ++ } + + if (!monhead) + exit(EXIT_FAILURE); +@@ -949,7 +999,7 @@ main (int argc, char **argv) + xcb_generic_event_t *ev; + xcb_expose_event_t *expose_ev; + xcb_button_press_event_t *press_ev; +- char input[2048] = {0, }; ++ char input[4096] = {0, }; + bool permanent = false; + int geom_v[4] = { -1, -1, 0, 0 }; + +@@ -973,7 +1023,7 @@ main (int argc, char **argv) + case 'h': + printf ("usage: %s [-h | -g | -b | -d | -f | -a | -p | -u | -B | -F]\n" + "\t-h Show this help\n" +- "\t-g Set the bar geometry {width}x{height})\n" ++ "\t-g Set the bar geometry {width}x{height}+{xoffset}+{yoffset}\n" + "\t-b Put bar at the bottom of the screen\n" + "\t-d Force docking (use this if your WM isn't EWMH compliant)\n" + "\t-f Bar font list, comma separated\n" +@@ -997,12 +1047,7 @@ main (int argc, char **argv) + bw = geom_v[0]; + bh = geom_v[1]; + bx = geom_v[2]; +- +- /* Check the geometry */ +- if (bx >= scr->width_in_pixels || bx + bw > scr->width_in_pixels) { +- fprintf(stderr, "The geometry specified doesn't fit the screen!\n"); +- return EXIT_FAILURE; +- } ++ by = geom_v[3]; + + /* Do the heavy lifting */ + init(); +@@ -1035,10 +1080,13 @@ main (int argc, char **argv) + break; + case XCB_BUTTON_PRESS: + press_ev = (xcb_button_press_event_t *)ev; +- /* Respond to left click */ +- if (press_ev->detail == XCB_BUTTON_INDEX_1) { ++ { + area_t *area = area_get(press_ev->event, press_ev->event_x); +- if (area) { write(STDOUT_FILENO, area->cmd, strlen(area->cmd)); write(STDOUT_FILENO, "\n", 1); } ++ /* Respond to the click */ ++ if (area && area->button == press_ev->detail) { ++ write(STDOUT_FILENO, area->cmd, strlen(area->cmd)); ++ write(STDOUT_FILENO, "\n", 1); ++ } + } + break; + } diff --git a/desktop/bar/patches/bar-monitor-option.patch b/desktop/bar/patches/bar-monitor-option.patch deleted file mode 100644 index d5c5fafa0d..0000000000 --- a/desktop/bar/patches/bar-monitor-option.patch +++ /dev/null @@ -1,300 +0,0 @@ -diff --git a/README.pod b/README.pod -index 565f188..2d2075d 100644 ---- a/README.pod -+++ b/README.pod -@@ -4,7 +4,7 @@ bar - bar ain't recursive - - =head1 SYNOPSIS - --I<bar> [-h | -g I<width>B<x>I<height>B<+>I<x> | -b | -d | -f I<font> | -p | -u I<pixel> | -B I<color> | -F I<color>] -+I<bar> [-h | -g I<width>B<x>I<height>B<+>I<x> | -m I<monitor>B<:>I<monitor>B<:>... | -b | -d | -f I<font> | -p | -u I<pixel> | -B I<color> | -F I<color>] - - =head1 DESCRIPTION - -@@ -22,6 +22,10 @@ Display the help and exit. - - Set the window geometry. If a parameter is omitted it's filled with the default value. - -+=item B<-m> I<monitor>B<:>I<monitor>B<:>I<...> -+ -+Set monitors to be used and in what order. Positive numeric arguments only, separated by colons. -+ - =item B<-b> - - Dock the bar at the bottom of the screen. -diff --git a/bar.c b/bar.c -index 1ccc907..0f9f694 100644 ---- a/bar.c -+++ b/bar.c -@@ -17,6 +17,8 @@ - #define max(a,b) ((a) > (b) ? (a) : (b)) - #define min(a,b) ((a) < (b) ? (a) : (b)) - #define indexof(c,s) (strchr((s),(c))-(s)) -+#define MONITORS_MAX 32 -+#define N 10 - - typedef struct font_t { - xcb_font_t ptr; -@@ -39,8 +41,6 @@ typedef struct area_t { - char *cmd; - } area_t; - --#define N 10 -- - typedef struct area_stack_t { - int pos; - area_t slot[N]; -@@ -80,6 +80,9 @@ static char *mfont, *afont; - static uint32_t fgc, bgc, ugc; - static uint32_t dfgc, dbgc; - static area_stack_t astack; -+static uint32_t mons = 0; -+static int nmons = 0; -+static int monlist[MONITORS_MAX]; - - void - update_gc (void) -@@ -302,7 +305,8 @@ parse (char *text) - - memset(&astack, 0, sizeof(area_stack_t)); - -- fill_rect(cur_mon->pixmap, gc[GC_CLEAR], 0, 0, bw, bh); -+ for (monitor_t *m = monhead; m; m = m->next) -+ fill_rect(m->pixmap, gc[GC_CLEAR], 0, 0, bw, bh); - - for (;;) { - if (*p == '\0' || *p == '\n') -@@ -356,7 +360,6 @@ parse (char *text) - - p++; - pos_x = 0; -- fill_rect(cur_mon->pixmap, gc[GC_CLEAR], 0, 0, cur_mon->width, bh); - break; - - /* In case of error keep parsing after the closing } */ -@@ -562,14 +565,40 @@ rect_sort_cb (const void *p1, const void *p2) - void - monitor_create_chain (xcb_rectangle_t *rects, const int num) - { -- int width = bw; -+ int i, cnt; -+ int width = 0; - int left = bx; - - /* Sort before use */ - qsort(rects, num, sizeof(xcb_rectangle_t), rect_sort_cb); - -+ if (nmons) { -+ xcb_rectangle_t r[num]; -+ /* Get combined width of specified monitors and set aside specified monitors */ -+ for (i = cnt = 0; i < nmons; i++) { -+ if (monlist[i] >= num) { -+ fprintf(stderr, "Specified monitor %d not found\n", monlist[i]); -+ continue; -+ } -+ width += rects[monlist[i]].width; -+ memcpy(&r[cnt++], &rects[monlist[i]], sizeof(xcb_rectangle_t)); -+ } -+ memcpy(rects, r, cnt * sizeof(xcb_rectangle_t)); -+ } -+ else { -+ /* Else default to X screen width */ -+ width = scr->width_in_pixels; -+ cnt = num; -+ } -+ -+ /* If I fits I sits */ -+ if (bw < 0) -+ bw = width - bx; -+ else -+ width = bw - bx; -+ - /* Left is a positive number or zero therefore monitors with zero width are excluded */ -- for (int i = 0; i < num; i++) { -+ for (int i = 0; i < cnt; i++) { - if (rects[i].width > left) { - monitor_t *mon = monitor_new( - rects[i].x + left, -@@ -598,7 +627,7 @@ get_randr_monitors (void) - { - xcb_randr_get_screen_resources_current_reply_t *rres_reply; - xcb_randr_output_t *outputs; -- int num, valid = 0; -+ int i, j, num, valid = 0; - - rres_reply = xcb_randr_get_screen_resources_current_reply(c, - xcb_randr_get_screen_resources_current(c, scr->root), NULL); -@@ -621,7 +650,7 @@ get_randr_monitors (void) - xcb_rectangle_t rects[num]; - - /* Get all outputs */ -- for (int i = 0; i < num; i++) { -+ for (i = 0; i < num; i++) { - xcb_randr_get_output_info_reply_t *oi_reply; - xcb_randr_get_crtc_info_reply_t *ci_reply; - -@@ -657,11 +686,11 @@ get_randr_monitors (void) - free(rres_reply); - - /* Check for clones and inactive outputs */ -- for (int i = 0; i < num; i++) { -+ for (i = 0; i < num; i++) { - if (rects[i].width == 0) - continue; - -- for (int j = 0; j < num; j++) { -+ for (j = 0; j < num; j++) { - /* Does I countain J ? */ - - if (i != j && rects[j].width) { -@@ -679,7 +708,20 @@ get_randr_monitors (void) - return; - } - -+ /* Use allocated array to pass to monitor_create_chain, the dynamic will out of scope */ -+ xcb_rectangle_t *r = malloc(valid * sizeof(xcb_rectangle_t)); -+ if (!r) { -+ fprintf(stderr, "Malloc failed!\n"); -+ exit(EXIT_FAILURE); -+ } -+ -+ /* Copy only used monitors */ -+ for (i = j = 0; i < num && j < valid; i++) -+ if (rects[i].width) -+ memcpy(&r[j++], &rects[i], sizeof(xcb_rectangle_t)); -+ - monitor_create_chain(rects, num); -+ free(r); - } - - void -@@ -695,7 +737,11 @@ get_xinerama_monitors (void) - iter = xcb_xinerama_query_screens_screen_info_iterator(xqs_reply); - screens = iter.rem; - -- xcb_rectangle_t rects[screens]; -+ xcb_rectangle_t *rects = malloc(screens * sizeof(xcb_rectangle_t)); -+ if (!rects) { -+ fprintf(stderr, "Malloc failed!\n"); -+ exit(EXIT_FAILURE); -+ } - - /* Fetch all the screens first */ - for (int i = 0; iter.rem; i++) { -@@ -709,6 +755,7 @@ get_xinerama_monitors (void) - free(xqs_reply); - - monitor_create_chain(rects, screens); -+ free(rects); - } - - xcb_visualid_t -@@ -755,10 +802,6 @@ xconn (void) - void - init (void) - { -- /* If I fits I sits */ -- if (bw < 0) -- bw = scr->width_in_pixels - bx; -- - /* Load the fonts */ - main_font = font_load(mfont ? mfont : "fixed"); - if (!main_font) -@@ -801,9 +844,14 @@ init (void) - } - } - -- if (!monhead) -+ if (!monhead) { -+ /* If I fits I sits */ -+ if (bw < 0) -+ bw = scr->width_in_pixels - bx; -+ - /* If no RandR outputs or Xinerama screens, fall back to using whole screen */ - monhead = monitor_new(0, 0, bw, scr->height_in_pixels); -+ } - - if (!monhead) - exit(EXIT_FAILURE); -@@ -921,6 +969,44 @@ parse_geometry_string (char *str, int *tmp) - return true; - } - -+bool -+parse_monitor_string (char *str) -+{ -+ char *p = str; -+ int i = 0, j; -+ -+ if (!str || !*str) -+ return false; -+ -+ while (*p) { -+ /* Skip separator */ -+ if (*p == ':' || *p == ',') -+ if (!*++p) -+ break; -+ /* A digit must follow */ -+ if (!isdigit(*p)) { -+ fprintf(stderr, "Invalid monitor specified\n"); -+ return false; -+ } -+ /* Try to parse the number */ -+ errno = 0; -+ j = strtoul(p, &p, 10); -+ if (errno || j >= MONITORS_MAX) { -+ fprintf(stderr, "Monitor value out of range\n"); -+ return false; -+ } -+ -+ if (j >= MONITORS_MAX || j < 0) { -+ fprintf(stderr, "Invalid monitor specified: %d\n", j); -+ continue; -+ } -+ mons |= 1 << j; -+ monlist[nmons++] = j; -+ } -+ -+ return true; -+} -+ - void - parse_font_list (char *str) - { -@@ -968,12 +1054,13 @@ main (int argc, char **argv) - ugc = fgc; - - char ch; -- while ((ch = getopt(argc, argv, "hg:bdf:a:pu:B:F:")) != -1) { -+ while ((ch = getopt(argc, argv, "hg:m:bdf:a:pu:B:F:")) != -1) { - switch (ch) { - case 'h': -- printf ("usage: %s [-h | -g | -b | -d | -f | -a | -p | -u | -B | -F]\n" -+ printf ("usage: %s [-h | -g | -m | -b | -d | -f | -a | -p | -u | -B | -F]\n" - "\t-h Show this help\n" - "\t-g Set the bar geometry {width}x{height})\n" -+ "\t-m Set monitors to use and in what order {0:2:1...}\n" - "\t-b Put bar at the bottom of the screen\n" - "\t-d Force docking (use this if your WM isn't EWMH compliant)\n" - "\t-f Bar font list, comma separated\n" -@@ -983,6 +1070,7 @@ main (int argc, char **argv) - "\t-F Set foreground color in #AARRGGBB\n", argv[0]); - exit (EXIT_SUCCESS); - case 'g': (void)parse_geometry_string(optarg, geom_v); break; -+ case 'm': (void)parse_monitor_string(optarg); break; - case 'p': permanent = true; break; - case 'b': topbar = false; break; - case 'd': dock = true; break; -@@ -998,12 +1086,6 @@ main (int argc, char **argv) - bh = geom_v[1]; - bx = geom_v[2]; - -- /* Check the geometry */ -- if (bx >= scr->width_in_pixels || bx + bw > scr->width_in_pixels) { -- fprintf(stderr, "The geometry specified doesn't fit the screen!\n"); -- return EXIT_FAILURE; -- } -- - /* Do the heavy lifting */ - init(); - /* Get the fd to Xserver */ diff --git a/desktop/bar/slack-desc b/desktop/bar/slack-desc index 4a206cf45d..e800122ffb 100644 --- a/desktop/bar/slack-desc +++ b/desktop/bar/slack-desc @@ -14,6 +14,6 @@ bar: bar is a lightweight bar entirely based on XCB. Provides full UTF-8 bar: support, basic formatting, RandR and Xinerama support and EWMH bar: compliance without wasting your precious memory. bar: -bar: Homepage: https://github.com/LemonBoy/bar +bar: webpage: https://github.com/LemonBoy/bar bar: bar: |