commit c758d8da5386433d70d0e60af3fb27aba6bf0ad5 from: Omar Polo date: Fri Oct 18 19:05:41 2019 UTC fmt commit - 4d9326de341c1021e1d9c22f65cb09b5a2cdd586 commit + c758d8da5386433d70d0e60af3fb27aba6bf0ad5 blob - 3318fa78c0fe36b7212ae7cbdf145d2ec1f00b2b blob + b1ca5bebfe22066876f87458f66bdf95d8bb9cac --- mymenu.c +++ mymenu.c @@ -1,31 +1,30 @@ +#include /* isalnum */ +#include +#include +#include /* setlocale */ +#include #include #include -#include /* strdup, strlen */ -#include /* isalnum */ -#include /* setlocale */ -#include +#include /* strdup, strlen */ #include -#include -#include #include -#include +#include #include -#include #include -#include +#include #include #ifdef USE_XINERAMA -# include +#include #endif #ifdef USE_XFT -# include +#include #endif #ifndef VERSION -# define VERSION "unknown" +#define VERSION "unknown" #endif #define resname "MyMenu" @@ -34,9 +33,9 @@ #define SYM_BUF_SIZE 4 #ifdef USE_XFT -# define default_fontname "monospace" +#define default_fontname "monospace" #else -# define default_fontname "fixed" +#define default_fontname "fixed" #endif #define ARGS "Aahmve:p:P:l:f:W:H:x:y:b:B:t:T:c:C:s:S:d:G:g:I:i:J:j:" @@ -51,7 +50,7 @@ * style, fall back to `strstr(3)` */ #ifndef USE_STRCASESTR -# define strcasestr strstr +#define strcasestr strstr #endif /* The number of char to read */ @@ -61,24 +60,25 @@ #define LINES_CHUNK 64 /* Abort on NULL */ -#define check_allocation(a) { \ - if (a == NULL) { \ - fprintf(stderr, "Could not allocate memory\n"); \ - abort(); \ - } \ - } +#define check_allocation(a) \ + { \ + if (a == NULL) { \ + fprintf(stderr, "Could not allocate memory\n"); \ + abort(); \ + } \ + } #define inner_height(r) (r->height - r->borders[0] - r->borders[2]) -#define inner_width(r) (r->width - r->borders[1] - r->borders[3]) +#define inner_width(r) (r->width - r->borders[1] - r->borders[3]) /* The states of the event loop */ -enum state {LOOPING, OK_LOOP, OK, ERR}; +enum state { LOOPING, OK_LOOP, OK, ERR }; -/* +/* * For the drawing-related function. The text to be rendere could be * the prompt, a completion or a highlighted completion */ -enum obj_type {PROMPT, COMPL, COMPL_HIGH}; +enum obj_type { PROMPT, COMPL, COMPL_HIGH }; /* These are the possible action to be performed after user input. */ enum action { @@ -97,82 +97,83 @@ enum action { /* A big set of values that needs to be carried around for drawing. A big struct to rule them all */ struct rendering { - Display *d; /* Connection to xorg */ - Window w; - XIM xim; - int width; - int height; - int p_padding[4]; - int c_padding[4]; - int ch_padding[4]; - int x_zero; /* the "zero" on the x axis (may not be exactly 0 'cause the borders) */ - int y_zero; /* like x_zero but for the y axis */ + Display *d; /* Connection to xorg */ + Window w; + XIM xim; + int width; + int height; + int p_padding[4]; + int c_padding[4]; + int ch_padding[4]; + int x_zero; /* the "zero" on the x axis (may not be exactly 0 'cause + the borders) */ + int y_zero; /* like x_zero but for the y axis */ - size_t offset; /* scroll offset */ + size_t offset; /* scroll offset */ - short free_text; - short first_selected; - short multiple_select; + short free_text; + short first_selected; + short multiple_select; /* four border width */ - int borders[4]; - int p_borders[4]; - int c_borders[4]; - int ch_borders[4]; + int borders[4]; + int p_borders[4]; + int c_borders[4]; + int ch_borders[4]; - short horizontal_layout; + short horizontal_layout; /* prompt */ - char *ps1; - int ps1len; - int ps1w; /* ps1 width */ - int ps1h; /* ps1 height */ + char *ps1; + int ps1len; + int ps1w; /* ps1 width */ + int ps1h; /* ps1 height */ - int text_height; /* cache for the vertical layout */ + int text_height; /* cache for the vertical layout */ - XIC xic; + XIC xic; /* colors */ - GC fgs[4]; - GC bgs[4]; - GC borders_bg[4]; - GC p_borders_bg[4]; - GC c_borders_bg[4]; - GC ch_borders_bg[4]; + GC fgs[4]; + GC bgs[4]; + GC borders_bg[4]; + GC p_borders_bg[4]; + GC c_borders_bg[4]; + GC ch_borders_bg[4]; #ifdef USE_XFT - XftFont *font; - XftDraw *xftdraw; - XftColor xft_colors[3]; + XftFont *font; + XftDraw *xftdraw; + XftColor xft_colors[3]; #else - XFontSet font; + XFontSet font; #endif }; struct completion { - char *completion; - char *rcompletion; + char *completion; + char *rcompletion; }; /* Wrap the linked list of completions */ struct completions { - struct completion *completions; - ssize_t selected; - size_t length; + struct completion *completions; + ssize_t selected; + size_t length; }; /* idea stolen from lemonbar. ty lemonboy */ typedef union { struct { - uint8_t b; - uint8_t g; - uint8_t r; - uint8_t a; + uint8_t b; + uint8_t g; + uint8_t r; + uint8_t a; } rgba; - uint32_t v; + uint32_t v; } rgba_t; -extern char *optarg; -extern int optind; +extern char *optarg; +extern int optind; /* Return a newly allocated (and empty) completion list */ struct completions * @@ -205,7 +206,7 @@ compls_delete(struct completions *cs) free(cs); } -/* +/* * Create a completion list from a text and the list of possible * completions (null terminated). Expects a non-null `cs'. `lines' and * `vlines' should have the same length OR `vlines' is NULL. @@ -213,9 +214,9 @@ compls_delete(struct completions *cs) void filter(struct completions *cs, char *text, char **lines, char **vlines) { - size_t index = 0; - size_t matching = 0; - char *l; + size_t index = 0; + size_t matching = 0; + char *l; if (vlines == NULL) vlines = lines; @@ -228,7 +229,7 @@ filter(struct completions *cs, char *text, char **line if (strcasestr(l, text) != NULL) { struct completion *c = &cs->completions[matching]; - c->completion = l; + c->completion = l; c->rcompletion = lines[index]; matching++; } @@ -241,7 +242,8 @@ filter(struct completions *cs, char *text, char **line /* Update the given completion */ void -update_completions(struct completions *cs, char *text, char **lines, char **vlines, short first_selected) +update_completions(struct completions *cs, char *text, char **lines, + char **vlines, short first_selected) { filter(cs, text, lines, vlines); if (first_selected && cs->length > 0) @@ -255,10 +257,11 @@ update_completions(struct completions *cs, char *text, * set to `ERR'. */ void -complete(struct completions *cs, short first_selected, short p, char **text, int *textlen, enum state *status) +complete(struct completions *cs, short first_selected, short p, char **text, + int *textlen, enum state *status) { - struct completion *n; - int index; + struct completion *n; + int index; if (cs == NULL || cs->length == 0) return; @@ -267,10 +270,8 @@ complete(struct completions *cs, short first_selected, * If the first is always selected and the first entry is * different from the text, expand the text and return */ - if (first_selected - && cs->selected == 0 - && strcmp(cs->completions->completion, *text) != 0 - && !p) { + if (first_selected && cs->selected == 0 + && strcmp(cs->completions->completion, *text) != 0 && !p) { free(*text); *text = strdup(cs->completions->completion); if (text == NULL) { @@ -285,7 +286,8 @@ complete(struct completions *cs, short first_selected, if (index == -1 && p) index = 0; - index = cs->selected = (cs->length + (p ? index - 1 : index + 1)) % cs->length; + index = cs->selected + = (cs->length + (p ? index - 1 : index + 1)) % cs->length; n = &cs->completions[cs->selected]; @@ -303,10 +305,10 @@ complete(struct completions *cs, short first_selected, int pushc(char **p, int maxlen, char c) { - int len; + int len; len = strnlen(*p, maxlen); - if (!(len < maxlen -2)) { + if (!(len < maxlen - 2)) { char *newptr; maxlen += maxlen >> 1; @@ -317,11 +319,11 @@ pushc(char **p, int maxlen, char c) } (*p)[len] = c; - (*p)[len+1] = '\0'; + (*p)[len + 1] = '\0'; return maxlen; } -/* +/* * Remove the last rune from the *UTF-8* string! This is different * from just setting the last byte to 0 (in some cases ofc). Return a * pointer (e) to the last nonzero char. If e < p then p is empty! @@ -358,8 +360,8 @@ popc(char *p) void popw(char *w) { - int len; - short in_word = 1; + int len; + short in_word = 1; if ((len = strlen(w)) == 0) return; @@ -378,15 +380,15 @@ popw(char *w) } } -/* +/* * If the string is surrounded by quates (`"') remove them and replace * every `\"' in the string with a single double-quote. */ char * normalize_str(const char *str) { - int len, p; - char *s; + int len, p; + char *s; if ((len = strlen(str)) == 0) return NULL; @@ -408,7 +410,7 @@ normalize_str(const char *str) break; } if (c == '"') { - str++; /* skip only this char */ + str++; /* skip only this char */ continue; } s[p] = c; @@ -422,8 +424,8 @@ normalize_str(const char *str) size_t read_stdin(char **buf) { - size_t offset = 0; - size_t len = STDIN_CHUNKS; + size_t offset = 0; + size_t len = STDIN_CHUNKS; *buf = malloc(len * sizeof(char)); if (*buf == NULL) @@ -449,7 +451,7 @@ read_stdin(char **buf) (*buf)[i] = '\0'; } - err: +err: fprintf(stderr, "Error in allocating memory for stdin.\n"); exit(EX_UNAVAILABLE); } @@ -457,8 +459,8 @@ read_stdin(char **buf) size_t readlines(char ***lns, char **buf) { - size_t i, len, ll, lines; - short in_line = 0; + size_t i, len, ll, lines; + short in_line = 0; lines = 0; @@ -466,7 +468,7 @@ readlines(char ***lns, char **buf) len = read_stdin(buf); ll = LINES_CHUNK; - *lns = malloc(ll * sizeof(char*)); + *lns = malloc(ll * sizeof(char *)); if (*lns == NULL) goto err; @@ -490,7 +492,7 @@ readlines(char ***lns, char **buf) if (lines == ll) { /* resize */ ll += LINES_CHUNK; - *lns = realloc(*lns, ll * sizeof(char*)); + *lns = realloc(*lns, ll * sizeof(char *)); if (*lns == NULL) goto err; } @@ -501,7 +503,7 @@ readlines(char ***lns, char **buf) return lines; - err: +err: fprintf(stderr, "Error in memory allocation.\n"); exit(EX_UNAVAILABLE); } @@ -511,40 +513,50 @@ readlines(char ***lns, char **buf) * It'll return the width and set ret_width and ret_height if not NULL */ int -text_extents(char *str, int len, struct rendering *r, int *ret_width, int *ret_height) +text_extents(char *str, int len, struct rendering *r, int *ret_width, + int *ret_height) { - int height, width; + int height, width; #ifdef USE_XFT - XGlyphInfo gi; + XGlyphInfo gi; XftTextExtentsUtf8(r->d, r->font, str, len, &gi); height = r->font->ascent - r->font->descent; width = gi.width - gi.x; #else - XRectangle rect; + XRectangle rect; XmbTextExtents(r->font, str, len, NULL, &rect); height = rect.height; width = rect.width; #endif - if (ret_width != NULL) *ret_width = width; - if (ret_height != NULL) *ret_height = height; + if (ret_width != NULL) + *ret_width = width; + if (ret_height != NULL) + *ret_height = height; return width; } void -draw_string(char *str, int len, int x, int y, struct rendering *r, enum obj_type tt) +draw_string(char *str, int len, int x, int y, struct rendering *r, + enum obj_type tt) { #ifdef USE_XFT XftColor xftcolor; - if (tt == PROMPT) xftcolor = r->xft_colors[0]; - if (tt == COMPL) xftcolor = r->xft_colors[1]; - if (tt == COMPL_HIGH) xftcolor = r->xft_colors[2]; + if (tt == PROMPT) + xftcolor = r->xft_colors[0]; + if (tt == COMPL) + xftcolor = r->xft_colors[1]; + if (tt == COMPL_HIGH) + xftcolor = r->xft_colors[2]; XftDrawStringUtf8(r->xftdraw, &xftcolor, r->font, x, y, str, len); #else GC gc; - if (tt == PROMPT) gc = r->fgs[0]; - if (tt == COMPL) gc = r->fgs[1]; - if (tt == COMPL_HIGH) gc = r->fgs[2]; + if (tt == PROMPT) + gc = r->fgs[0]; + if (tt == COMPL) + gc = r->fgs[1]; + if (tt == COMPL_HIGH) + gc = r->fgs[2]; Xutf8DrawString(r->d, r->w, r->font, gc, x, y, str, len); #endif } @@ -553,8 +565,8 @@ draw_string(char *str, int len, int x, int y, struct r char * strdupn(char *str) { - int len, i; - char *dup; + int len, i; + char *dup; len = strlen(str); @@ -572,49 +584,56 @@ strdupn(char *str) } int -draw_v_box(struct rendering *r, int y, char *prefix, int prefix_width, enum obj_type t, char *text) +draw_v_box(struct rendering *r, int y, char *prefix, int prefix_width, + enum obj_type t, char *text) { - GC *border_color, bg; - int *padding, *borders; - int ret = 0, inner_width, inner_height, x; + GC *border_color, bg; + int *padding, *borders; + int ret = 0, inner_width, inner_height, x; switch (t) { case PROMPT: - border_color = r->p_borders_bg; - padding = r->p_padding; - borders = r->p_borders; - bg = r->bgs[0]; + border_color = r->p_borders_bg; + padding = r->p_padding; + borders = r->p_borders; + bg = r->bgs[0]; break; case COMPL: - border_color = r->c_borders_bg; - padding = r->c_padding; - borders = r->c_borders; - bg = r->bgs[1]; + border_color = r->c_borders_bg; + padding = r->c_padding; + borders = r->c_borders; + bg = r->bgs[1]; break; case COMPL_HIGH: - border_color = r->ch_borders_bg; - padding = r->ch_padding; - borders = r->ch_borders; - bg = r->bgs[2]; + border_color = r->ch_borders_bg; + padding = r->ch_padding; + borders = r->ch_borders; + bg = r->bgs[2]; break; } - ret = borders[0] + padding[0] + r->text_height + padding[2] + borders[2]; + ret = borders[0] + padding[0] + r->text_height + padding[2] + + borders[2]; inner_width = inner_width(r) - borders[1] - borders[3]; inner_height = padding[0] + r->text_height + padding[2]; /* Border top */ - XFillRectangle(r->d, r->w, border_color[0], r->x_zero, y, r->width, borders[0]); + XFillRectangle(r->d, r->w, border_color[0], r->x_zero, y, r->width, + borders[0]); /* Border right */ - XFillRectangle(r->d, r->w, border_color[1], r->x_zero + inner_width(r) - borders[1] , y, borders[1], ret); + XFillRectangle(r->d, r->w, border_color[1], + r->x_zero + inner_width(r) - borders[1], y, borders[1], ret); /* Border bottom */ - XFillRectangle(r->d, r->w, border_color[2], r->x_zero, y + borders[0] + padding[0] + r->text_height + padding[2], r->width, borders[2]); + XFillRectangle(r->d, r->w, border_color[2], r->x_zero, + y + borders[0] + padding[0] + r->text_height + padding[2], + r->width, borders[2]); /* Border left */ - XFillRectangle(r->d, r->w, border_color[3], r->x_zero, y, borders[3], ret); + XFillRectangle( + r->d, r->w, border_color[3], r->x_zero, y, borders[3], ret); /* bg */ x = r->x_zero + borders[3]; @@ -634,35 +653,39 @@ draw_v_box(struct rendering *r, int y, char *prefix, i } int -draw_h_box(struct rendering *r, int x, char *prefix, int prefix_width, enum obj_type t, char *text) +draw_h_box(struct rendering *r, int x, char *prefix, int prefix_width, + enum obj_type t, char *text) { - GC *border_color, bg; - int *padding, *borders; - int ret = 0, inner_width, inner_height, y, text_width; + GC *border_color, bg; + int *padding, *borders; + int ret = 0, inner_width, inner_height, y, text_width; switch (t) { case PROMPT: - border_color = r->p_borders_bg; - padding = r->p_padding; - borders = r->p_borders; - bg = r->bgs[0]; + border_color = r->p_borders_bg; + padding = r->p_padding; + borders = r->p_borders; + bg = r->bgs[0]; break; case COMPL: - border_color = r->c_borders_bg; - padding = r->c_padding; - borders = r->c_borders; - bg = r->bgs[1]; + border_color = r->c_borders_bg; + padding = r->c_padding; + borders = r->c_borders; + bg = r->bgs[1]; break; case COMPL_HIGH: - border_color = r->ch_borders_bg; - padding = r->ch_padding; - borders = r->ch_borders; - bg = r->bgs[2]; + border_color = r->ch_borders_bg; + padding = r->ch_padding; + borders = r->ch_borders; + bg = r->bgs[2]; break; } if (padding[0] < 0 || padding[2] < 0) - padding[0] = padding[2] = (inner_height(r) - borders[0] - borders[2] - r->text_height)/2; + padding[0] = padding[2] + = (inner_height(r) - borders[0] - borders[2] + - r->text_height) + / 2; /* If they are still lesser than 0, set 'em to 0 */ if (padding[0] < 0 || padding[2] < 0) @@ -679,16 +702,21 @@ draw_h_box(struct rendering *r, int x, char *prefix, i inner_height = inner_height(r) - borders[0] - borders[2]; /* Border top */ - XFillRectangle(r->d, r->w, border_color[0], x, r->y_zero, ret, borders[0]); + XFillRectangle( + r->d, r->w, border_color[0], x, r->y_zero, ret, borders[0]); /* Border right */ - XFillRectangle(r->d, r->w, border_color[1], x + borders[3] + inner_width, r->y_zero, borders[1], inner_height(r)); + XFillRectangle(r->d, r->w, border_color[1], + x + borders[3] + inner_width, r->y_zero, borders[1], + inner_height(r)); /* Border bottom */ - XFillRectangle(r->d, r->w, border_color[2], x, r->y_zero + inner_height(r) - borders[2], ret, borders[2]); + XFillRectangle(r->d, r->w, border_color[2], x, + r->y_zero + inner_height(r) - borders[2], ret, borders[2]); /* Border left */ - XFillRectangle(r->d, r->w, border_color[3], x, r->y_zero, borders[3], inner_height(r)); + XFillRectangle(r->d, r->w, border_color[3], x, r->y_zero, borders[3], + inner_height(r)); /* bg */ x += borders[3]; @@ -713,16 +741,18 @@ draw_h_box(struct rendering *r, int x, char *prefix, i void draw_horizontally(struct rendering *r, char *text, struct completions *cs) { - size_t i; - int x = r->x_zero; + size_t i; + int x = r->x_zero; /* Draw the prompt */ x += draw_h_box(r, x, r->ps1, r->ps1w, PROMPT, text); for (i = r->offset; i < cs->length; ++i) { - enum obj_type t = cs->selected == (ssize_t)i ? COMPL_HIGH : COMPL; + enum obj_type t + = cs->selected == (ssize_t)i ? COMPL_HIGH : COMPL; - x += draw_h_box(r, x, NULL, 0, t, cs->completions[i].completion); + x += draw_h_box( + r, x, NULL, 0, t, cs->completions[i].completion); if (x > inner_width(r)) break; @@ -739,15 +769,17 @@ draw_horizontally(struct rendering *r, char *text, str void draw_vertically(struct rendering *r, char *text, struct completions *cs) { - size_t i; - int y = r->y_zero; + size_t i; + int y = r->y_zero; y += draw_v_box(r, y, r->ps1, r->ps1w, PROMPT, text); for (i = r->offset; i < cs->length; ++i) { - enum obj_type t = cs->selected == (ssize_t)i ? COMPL_HIGH : COMPL; + enum obj_type t + = cs->selected == (ssize_t)i ? COMPL_HIGH : COMPL; - y += draw_v_box(r, y, NULL, 0, t, cs->completions[i].completion); + y += draw_v_box( + r, y, NULL, 0, t, cs->completions[i].completion); if (y > inner_height(r)) break; @@ -758,7 +790,8 @@ void draw(struct rendering *r, char *text, struct completions *cs) { /* Draw the background */ - XFillRectangle(r->d, r->w, r->bgs[1], r->x_zero, r->y_zero, inner_width(r), inner_height(r)); + XFillRectangle(r->d, r->w, r->bgs[1], r->x_zero, r->y_zero, + inner_width(r), inner_height(r)); /* Draw the contents */ if (r->horizontal_layout) @@ -768,16 +801,21 @@ draw(struct rendering *r, char *text, struct completio /* Draw the borders */ if (r->borders[0] != 0) - XFillRectangle(r->d, r->w, r->borders_bg[0], 0, 0, r->width, r->borders[0]); + XFillRectangle(r->d, r->w, r->borders_bg[0], 0, 0, r->width, + r->borders[0]); if (r->borders[1] != 0) - XFillRectangle(r->d, r->w, r->borders_bg[1], r->width - r->borders[1], 0, r->borders[1], r->height); + XFillRectangle(r->d, r->w, r->borders_bg[1], + r->width - r->borders[1], 0, r->borders[1], + r->height); if (r->borders[2] != 0) - XFillRectangle(r->d, r->w, r->borders_bg[2], 0, r->height - r->borders[2], r->width, r->borders[2]); + XFillRectangle(r->d, r->w, r->borders_bg[2], 0, + r->height - r->borders[2], r->width, r->borders[2]); if (r->borders[3] != 0) - XFillRectangle(r->d, r->w, r->borders_bg[3], 0, 0, r->borders[3], r->height); + XFillRectangle(r->d, r->w, r->borders_bg[3], 0, 0, + r->borders[3], r->height); /* render! */ XFlush(r->d); @@ -787,43 +825,25 @@ draw(struct rendering *r, char *text, struct completio void set_win_atoms_hints(Display *d, Window w, int width, int height) { - Atom type; - XClassHint *class_hint; - XSizeHints *size_hint; + Atom type; + XClassHint *class_hint; + XSizeHints *size_hint; type = XInternAtom(d, "_NET_WM_WINDOW_TYPE_DOCK", 0); - XChangeProperty(d, - w, - XInternAtom(d, "_NET_WM_WINDOW_TYPE", 0), - XInternAtom(d, "ATOM", 0), - 32, - PropModeReplace, - (unsigned char *)&type, - 1 - ); + XChangeProperty(d, w, XInternAtom(d, "_NET_WM_WINDOW_TYPE", 0), + XInternAtom(d, "ATOM", 0), 32, PropModeReplace, + (unsigned char *)&type, 1); /* some window managers honor this properties */ type = XInternAtom(d, "_NET_WM_STATE_ABOVE", 0); - XChangeProperty(d, - w, - XInternAtom(d, "_NET_WM_STATE", 0), - XInternAtom(d, "ATOM", 0), - 32, - PropModeReplace, - (unsigned char *)&type, - 1 - ); + XChangeProperty(d, w, XInternAtom(d, "_NET_WM_STATE", 0), + XInternAtom(d, "ATOM", 0), 32, PropModeReplace, + (unsigned char *)&type, 1); type = XInternAtom(d, "_NET_WM_STATE_FOCUSED", 0); - XChangeProperty(d, - w, - XInternAtom(d, "_NET_WM_STATE", 0), - XInternAtom(d, "ATOM", 0), - 32, - PropModeAppend, - (unsigned char *)&type, - 1 - ); + XChangeProperty(d, w, XInternAtom(d, "_NET_WM_STATE", 0), + XInternAtom(d, "ATOM", 0), 32, PropModeAppend, + (unsigned char *)&type, 1); /* Setting window hints */ class_hint = XAllocClassHint(); @@ -866,7 +886,7 @@ get_wh(Display *d, Window *w, int *width, int *height) int grabfocus(Display *d, Window w) { - int i; + int i; for (i = 0; i < 100; ++i) { Window focuswin; int revert_to_win; @@ -882,7 +902,7 @@ grabfocus(Display *d, Window w) return 0; } -/* +/* * I know this may seem a little hackish BUT is the only way I managed * to actually grab that goddam keyboard. Only one call to * XGrabKeyboard does not always end up with the keyboard grabbed! @@ -892,7 +912,9 @@ take_keyboard(Display *d, Window w) { int i; for (i = 0; i < 100; i++) { - if (XGrabKeyboard(d, w, 1, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) + if (XGrabKeyboard(d, w, 1, GrabModeAsync, GrabModeAsync, + CurrentTime) + == GrabSuccess) return 1; usleep(1000); } @@ -915,7 +937,7 @@ parse_color(const char *str, const char *def) /* +1 for the # ath the start */ if (*str != '#' || len > 9 || len < 4) goto invc; - ++str; /* skip the # */ + ++str; /* skip the # */ errno = 0; tmp = (rgba_t)(uint32_t)strtoul(str, &ep, 16); @@ -923,11 +945,10 @@ parse_color(const char *str, const char *def) if (errno) goto invc; - switch (len-1) { + switch (len - 1) { case 3: /* expand #rgb -> #rrggbb */ - tmp.v = (tmp.v & 0xf00) * 0x1100 - | (tmp.v & 0x0f0) * 0x0110 + tmp.v = (tmp.v & 0xf00) * 0x1100 | (tmp.v & 0x0f0) * 0x0110 | (tmp.v & 0x00f) * 0x0011; case 6: /* assume 0xff opacity */ @@ -945,7 +966,7 @@ parse_color(const char *str, const char *def) return 0U; - invc: +invc: fprintf(stderr, "Invalid color: \"%s\".\n", str); if (def != NULL) return parse_color(def, NULL); @@ -953,45 +974,49 @@ parse_color(const char *str, const char *def) return 0U; } -/* +/* * Given a string try to parse it as a number or return `default_value'. */ int parse_integer(const char *str, int default_value) { - long lval; - char *ep; + long lval; + char *ep; errno = 0; lval = strtol(str, &ep, 10); if (str[0] == '\0' || *ep != '\0') { /* NaN */ - fprintf(stderr, "'%s' is not a valid number! Using %d as default.\n", str, default_value); + fprintf(stderr, + "'%s' is not a valid number! Using %d as default.\n", + str, default_value); return default_value; } - if ((errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) || - (lval > INT_MAX || lval < INT_MIN)) { - fprintf(stderr, "%s out of range! Using %d as default.\n", str, default_value); + if ((errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) + || (lval > INT_MAX || lval < INT_MIN)) { + fprintf(stderr, "%s out of range! Using %d as default.\n", + str, default_value); return default_value; } return lval; } -/* Like parse_integer but recognize the percentages (i.e. strings ending with `%') */ +/* Like parse_integer but recognize the percentages (i.e. strings ending with + * `%') */ int parse_int_with_percentage(const char *str, int default_value, int max) { int len = strlen(str); - if (len > 0 && str[len-1] == '%') { + if (len > 0 && str[len - 1] == '%') { int val; char *cpy; cpy = strdup(str); check_allocation(cpy); - cpy[len-1] = '\0'; + cpy[len - 1] = '\0'; val = parse_integer(cpy, default_value); free(cpy); return val * max / 100; @@ -1000,7 +1025,7 @@ parse_int_with_percentage(const char *str, int default return parse_integer(str, default_value); } -/* +/* * Like parse_int_with_percentage but understands some special values: * - middle that is (max-self)/2 * - start that is 0 @@ -1012,9 +1037,9 @@ parse_int_with_pos(const char *str, int default_value, if (!strcmp(str, "start")) return 0; if (!strcmp(str, "middle")) - return (max - self)/2; + return (max - self) / 2; if (!strcmp(str, "end")) - return max-self; + return max - self; return parse_int_with_percentage(str, default_value, max); } @@ -1023,15 +1048,15 @@ parse_int_with_pos(const char *str, int default_value, char ** parse_csslike(const char *str) { - int i, j; - char *s, *token, **ret; - short any_null; + int i, j; + char *s, *token, **ret; + short any_null; s = strdup(str); if (s == NULL) return NULL; - ret = malloc(4 * sizeof(char*)); + ret = malloc(4 * sizeof(char *)); if (ret == NULL) { free(s); return NULL; @@ -1052,7 +1077,8 @@ parse_csslike(const char *str) if (i == 3) ret[3] = strdup(ret[1]); - /* before we didn't check for the return type of strdup, here we will */ + /* before we didn't check for the return type of strdup, here we will + */ any_null = 0; for (i = 0; i < 4; ++i) @@ -1072,16 +1098,16 @@ parse_csslike(const char *str) return ret; } -/* +/* * Given an event, try to understand what the users wants. If the * return value is ADD_CHAR then `input' is a pointer to a string that * will need to be free'ed later. */ -enum -action parse_event(Display *d, XKeyPressedEvent *ev, XIC xic, char **input) +enum action +parse_event(Display *d, XKeyPressedEvent *ev, XIC xic, char **input) { - char str[SYM_BUF_SIZE] = {0}; - Status s; + char str[SYM_BUF_SIZE] = { 0 }; + Status s; if (ev->keycode == XKeysymToKeycode(d, XK_BackSpace)) return DEL_CHAR; @@ -1099,7 +1125,9 @@ action parse_event(Display *d, XKeyPressedEvent *ev, X s = 0; Xutf8LookupString(xic, ev, str, SYM_BUF_SIZE, 0, &s); if (s == XBufferOverflow) { - fprintf(stderr, "Buffer overflow when trying to create keyboard symbol map.\n"); + fprintf(stderr, + "Buffer overflow when trying to create keyboard " + "symbol map.\n"); return EXIT; } @@ -1132,7 +1160,8 @@ action parse_event(Display *d, XKeyPressedEvent *ev, X } void -confirm(enum state *status, struct rendering *r, struct completions *cs, char **text, int *textlen) +confirm(enum state *status, struct rendering *r, struct completions *cs, + char **text, int *textlen) { if ((cs->selected != -1) || (cs->length > 0 && r->first_selected)) { /* if there is something selected expand it and return */ @@ -1166,7 +1195,8 @@ confirm(enum state *status, struct rendering *r, struc /* event loop */ enum state -loop(struct rendering *r, char **text, int *textlen, struct completions *cs, char **lines, char **vlines) +loop(struct rendering *r, char **text, int *textlen, struct completions *cs, + char **lines, char **vlines) { enum state status = LOOPING; @@ -1199,7 +1229,7 @@ loop(struct rendering *r, char **text, int *textlen, s break; case KeyPress: { - XKeyPressedEvent *ev = (XKeyPressedEvent*)&e; + XKeyPressedEvent *ev = (XKeyPressedEvent *)&e; char *input; switch (parse_event(r->d, ev, r->xic, &input)) { @@ -1220,26 +1250,30 @@ loop(struct rendering *r, char **text, int *textlen, s } case PREV_COMPL: { - complete(cs, r->first_selected, 1, text, textlen, &status); + complete(cs, r->first_selected, 1, text, + textlen, &status); r->offset = cs->selected; break; } case NEXT_COMPL: { - complete(cs, r->first_selected, 0, text, textlen, &status); + complete(cs, r->first_selected, 0, text, + textlen, &status); r->offset = cs->selected; break; } case DEL_CHAR: popc(*text); - update_completions(cs, *text, lines, vlines, r->first_selected); + update_completions(cs, *text, lines, vlines, + r->first_selected); r->offset = 0; break; case DEL_WORD: { popw(*text); - update_completions(cs, *text, lines, vlines, r->first_selected); + update_completions(cs, *text, lines, vlines, + r->first_selected); break; } @@ -1247,7 +1281,8 @@ loop(struct rendering *r, char **text, int *textlen, s int i; for (i = 0; i < *textlen; ++i) *(*text + i) = 0; - update_completions(cs, *text, lines, vlines, r->first_selected); + update_completions(cs, *text, lines, vlines, + r->first_selected); r->offset = 0; break; } @@ -1267,16 +1302,20 @@ loop(struct rendering *r, char **text, int *textlen, s break; for (i = 0; i < str_len; ++i) { - *textlen = pushc(text, *textlen, input[i]); + *textlen = pushc( + text, *textlen, input[i]); if (*textlen == -1) { - fprintf(stderr, "Memory allocation error\n"); + fprintf(stderr, + "Memory allocation " + "error\n"); status = ERR; break; } } if (status != ERR) { - update_completions(cs, *text, lines, vlines, r->first_selected); + update_completions(cs, *text, lines, + vlines, r->first_selected); free(input); } @@ -1295,7 +1334,7 @@ loop(struct rendering *r, char **text, int *textlen, s } case ButtonPress: { - XButtonPressedEvent *ev = (XButtonPressedEvent*)&e; + XButtonPressedEvent *ev = (XButtonPressedEvent *)&e; /* if (ev->button == Button1) { /\* click *\/ */ /* int x = ev->x - r.border_w; */ /* int y = ev->y - r.border_n; */ @@ -1306,7 +1345,8 @@ loop(struct rendering *r, char **text, int *textlen, s r->offset = MAX((ssize_t)r->offset - 1, 0); if (ev->button == Button5) /* scroll down */ - r->offset = MIN(r->offset + 1, cs->length - 1); + r->offset + = MIN(r->offset + 1, cs->length - 1); break; } @@ -1328,7 +1368,8 @@ load_font(struct rendering *r, const char *fontname) char **missing_charset_list; int missing_charset_count; - r->font = XCreateFontSet(r->d, fontname, &missing_charset_list, &missing_charset_count, NULL); + r->font = XCreateFontSet(r->d, fontname, &missing_charset_list, + &missing_charset_count, NULL); if (r->font != NULL) return 0; @@ -1344,9 +1385,9 @@ load_font(struct rendering *r, const char *fontname) void xim_init(struct rendering *r, XrmDatabase *xdb) { - XIMStyle best_match_style; - XIMStyles *xis; - int i; + XIMStyle best_match_style; + XIMStyles *xis; + int i; /* Open the X input method */ r->xim = XOpenIM(r->d, *xdb, resname, resclass); @@ -1368,33 +1409,33 @@ xim_init(struct rendering *r, XrmDatabase *xdb) XFree(xis); if (!best_match_style) - fprintf(stderr, "No matching input style could be determined\n"); + fprintf(stderr, + "No matching input style could be determined\n"); - r->xic = XCreateIC(r->xim, XNInputStyle, best_match_style, XNClientWindow, r->w, XNFocusWindow, r->w, NULL); + r->xic = XCreateIC(r->xim, XNInputStyle, best_match_style, + XNClientWindow, r->w, XNFocusWindow, r->w, NULL); check_allocation(r->xic); } void -create_window(struct rendering *r, Window parent_window, Colormap cmap, XVisualInfo vinfo, int x, int y, int ox, int oy, unsigned long background_pixel) +create_window(struct rendering *r, Window parent_window, Colormap cmap, + XVisualInfo vinfo, int x, int y, int ox, int oy, + unsigned long background_pixel) { - XSetWindowAttributes attr; + XSetWindowAttributes attr; /* Create the window */ attr.colormap = cmap; attr.override_redirect = 1; attr.border_pixel = 0; attr.background_pixel = background_pixel; - attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask | KeymapStateMask | ButtonPress | VisibilityChangeMask; + attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask + | KeymapStateMask | ButtonPress | VisibilityChangeMask; - r->w = XCreateWindow(r->d, - parent_window, - x + ox, y + oy, - r->width, r->height, - 0, - vinfo.depth, - InputOutput, - vinfo.visual, - CWBorderPixel | CWBackPixel | CWColormap | CWEventMask | CWOverrideRedirect, + r->w = XCreateWindow(r->d, parent_window, x + ox, y + oy, r->width, + r->height, 0, vinfo.depth, InputOutput, vinfo.visual, + CWBorderPixel | CWBackPixel | CWColormap | CWEventMask + | CWOverrideRedirect, &attr); } @@ -1403,7 +1444,8 @@ ps1extents(struct rendering *r) { char *dup; dup = strdupn(r->ps1); - text_extents(dup == NULL ? r->ps1 : dup, r->ps1len, r, &r->ps1w, &r->ps1h); + text_extents( + dup == NULL ? r->ps1 : dup, r->ps1len, r, &r->ps1w, &r->ps1h); free(dup); } @@ -1412,32 +1454,37 @@ usage(char *prgname) { fprintf(stderr, "%s [-Aahmv] [-B colors] [-b size] [-C color] [-c color]\n" - " [-d separator] [-e window] [-f font] [-G color] [-g size]\n" - " [-H height] [-I color] [-i size] [-J color] [-j size] [-l layout]\n" - " [-P padding] [-p prompt] [-S color] [-s color] [-T color]\n" - " [-t color] [-W width] [-x coord] [-y coord]\n", prgname); + " [-d separator] [-e window] [-f font] [-G color] [-g " + "size]\n" + " [-H height] [-I color] [-i size] [-J color] [-j " + "size] [-l layout]\n" + " [-P padding] [-p prompt] [-S color] [-s color] [-T " + "color]\n" + " [-t color] [-W width] [-x coord] [-y coord]\n", + prgname); } int main(int argc, char **argv) { - struct completions *cs; - struct rendering r; - XVisualInfo vinfo; - Colormap cmap; - size_t nlines, i; - Window parent_window; - XrmDatabase xdb; - unsigned long fgs[3], bgs[3]; /* prompt, compl, compl_highlighted */ - unsigned long borders_bg[4], p_borders_bg[4], c_borders_bg[4], ch_borders_bg[4]; /* N E S W */ - enum state status; - int ch; - int offset_x, offset_y, x, y; - int textlen, d_width, d_height; - short embed; - char *sep, *parent_window_id; - char **lines, *buf, **vlines; - char *fontname, *text, *xrm; + struct completions *cs; + struct rendering r; + XVisualInfo vinfo; + Colormap cmap; + size_t nlines, i; + Window parent_window; + XrmDatabase xdb; + unsigned long fgs[3], bgs[3]; /* prompt, compl, compl_highlighted */ + unsigned long borders_bg[4], p_borders_bg[4], c_borders_bg[4], + ch_borders_bg[4]; /* N E S W */ + enum state status; + int ch; + int offset_x, offset_y, x, y; + int textlen, d_width, d_height; + short embed; + char *sep, *parent_window_id; + char **lines, *buf, **vlines; + char *fontname, *text, *xrm; #ifdef __OpenBSD__ /* stdio & rpath: to read/write stdio/stdout/stderr */ @@ -1455,13 +1502,13 @@ main(int argc, char **argv) while ((ch = getopt(argc, argv, ARGS)) != -1) { switch (ch) { - case 'h': /* help */ + case 'h': /* help */ usage(*argv); return 0; - case 'v': /* version */ + case 'v': /* version */ fprintf(stderr, "%s version: %s\n", *argv, VERSION); return 0; - case 'e': /* embed */ + case 'e': /* embed */ parent_window_id = strdup(optarg); check_allocation(parent_window_id); break; @@ -1488,7 +1535,7 @@ main(int argc, char **argv) if (sep != NULL) { int l; l = strlen(sep); - vlines = calloc(nlines, sizeof(char*)); + vlines = calloc(nlines, sizeof(char *)); check_allocation(vlines); for (i = 0; i < nlines; i++) { @@ -1553,7 +1600,8 @@ main(int argc, char **argv) } embed = 1; - if (! (parent_window_id && (parent_window = strtol(parent_window_id, NULL, 0)))) { + if (!(parent_window_id + && (parent_window = strtol(parent_window_id, NULL, 0)))) { parent_window = DefaultRootWindow(r.d); embed = 0; } @@ -1564,17 +1612,18 @@ main(int argc, char **argv) #ifdef USE_XINERAMA if (!embed && XineramaIsActive(r.d)) { /* find the mice */ XineramaScreenInfo *info; - Window rr; - Window root; - int number_of_screens, monitors, i; - int root_x, root_y, win_x, win_y; - unsigned int mask; - short res; + Window rr; + Window root; + int number_of_screens, monitors, i; + int root_x, root_y, win_x, win_y; + unsigned int mask; + short res; number_of_screens = XScreenCount(r.d); for (i = 0; i < number_of_screens; ++i) { root = XRootWindow(r.d, i); - res = XQueryPointer(r.d, root, &rr, &rr, &root_x, &root_y, &win_x, &win_y, &mask); + res = XQueryPointer(r.d, root, &rr, &rr, &root_x, + &root_y, &win_x, &win_y, &mask); if (res) break; } @@ -1589,8 +1638,12 @@ main(int argc, char **argv) info = XineramaQueryScreens(r.d, &monitors); if (info) { for (i = 0; i < monitors; ++i) { - if (info[i].x_org <= root_x && root_x <= (info[i].x_org + info[i].width) - && info[i].y_org <= root_y && root_y <= (info[i].y_org + info[i].height)) { + if (info[i].x_org <= root_x + && root_x <= (info[i].x_org + + info[i].width) + && info[i].y_org <= root_y + && root_y <= (info[i].y_org + + info[i].height)) { offset_x = info[i].x_org; offset_y = info[i].y_org; d_width = info[i].width; @@ -1604,7 +1657,8 @@ main(int argc, char **argv) #endif XMatchVisualInfo(r.d, DefaultScreen(r.d), 32, TrueColor, &vinfo); - cmap = XCreateColormap(r.d, XDefaultRootWindow(r.d), vinfo.visual, AllocNone); + cmap = XCreateColormap( + r.d, XDefaultRootWindow(r.d), vinfo.visual, AllocNone); fgs[0] = fgs[1] = parse_color("#fff", NULL); fgs[2] = parse_color("#000", NULL); @@ -1612,11 +1666,15 @@ main(int argc, char **argv) bgs[0] = bgs[1] = parse_color("#000", NULL); bgs[2] = parse_color("#fff", NULL); - borders_bg[0] = borders_bg[1] = borders_bg[2] = borders_bg[3] = parse_color("#000", NULL); + borders_bg[0] = borders_bg[1] = borders_bg[2] = borders_bg[3] + = parse_color("#000", NULL); - p_borders_bg[0] = p_borders_bg[1] = p_borders_bg[2] = p_borders_bg[3] = parse_color("#000", NULL); - c_borders_bg[0] = c_borders_bg[1] = c_borders_bg[2] = c_borders_bg[3] = parse_color("#000", NULL); - ch_borders_bg[0] = ch_borders_bg[1] = ch_borders_bg[2] = ch_borders_bg[3] = parse_color("#000", NULL); + p_borders_bg[0] = p_borders_bg[1] = p_borders_bg[2] = p_borders_bg[3] + = parse_color("#000", NULL); + c_borders_bg[0] = c_borders_bg[1] = c_borders_bg[2] = c_borders_bg[3] + = parse_color("#000", NULL); + ch_borders_bg[0] = ch_borders_bg[1] = ch_borders_bg[2] + = ch_borders_bg[3] = parse_color("#000", NULL); r.horizontal_layout = 1; @@ -1630,177 +1688,278 @@ main(int argc, char **argv) xdb = XrmGetStringDatabase(xrm); - if (XrmGetResource(xdb, "MyMenu.font", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, "MyMenu.font", "*", datatype, &value) + == 1) { free(fontname); fontname = strdup(value.addr); check_allocation(fontname); } else { - fprintf(stderr, "no font defined, using %s\n", fontname); + fprintf(stderr, "no font defined, using %s\n", + fontname); } - if (XrmGetResource(xdb, "MyMenu.layout", "*", datatype, &value) == 1) - r.horizontal_layout = !strcmp(value.addr, "horizontal"); + if (XrmGetResource( + xdb, "MyMenu.layout", "*", datatype, &value) + == 1) + r.horizontal_layout + = !strcmp(value.addr, "horizontal"); else - fprintf(stderr, "no layout defined, using horizontal\n"); + fprintf(stderr, + "no layout defined, using horizontal\n"); - if (XrmGetResource(xdb, "MyMenu.prompt", "*", datatype, &value) == 1) { + if (XrmGetResource( + xdb, "MyMenu.prompt", "*", datatype, &value) + == 1) { free(r.ps1); r.ps1 = normalize_str(value.addr); } else { - fprintf(stderr, "no prompt defined, using \"%s\" as default\n", r.ps1); + fprintf(stderr, + "no prompt defined, using \"%s\" as " + "default\n", + r.ps1); } - if (XrmGetResource(xdb, "MyMenu.prompt.border.size", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, "MyMenu.prompt.border.size", "*", + datatype, &value) + == 1) { char **sizes; sizes = parse_csslike(value.addr); if (sizes != NULL) for (i = 0; i < 4; ++i) - r.p_borders[i] = parse_integer(sizes[i], 0); + r.p_borders[i] + = parse_integer(sizes[i], 0); else - fprintf(stderr, "error while parsing MyMenu.prompt.border.size"); + fprintf(stderr, + "error while parsing " + "MyMenu.prompt.border.size"); } - if (XrmGetResource(xdb, "MyMenu.prompt.border.color", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, "MyMenu.prompt.border.color", "*", + datatype, &value) + == 1) { char **colors; colors = parse_csslike(value.addr); if (colors != NULL) for (i = 0; i < 4; ++i) - p_borders_bg[i] = parse_color(colors[i], "#000"); + p_borders_bg[i] = parse_color( + colors[i], "#000"); else - fprintf(stderr, "error while parsing MyMenu.prompt.border.color"); + fprintf(stderr, + "error while parsing " + "MyMenu.prompt.border.color"); } - if (XrmGetResource(xdb, "MyMenu.prompt.padding", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, "MyMenu.prompt.padding", "*", + datatype, &value) + == 1) { char **colors; colors = parse_csslike(value.addr); if (colors != NULL) for (i = 0; i < 4; ++i) - r.p_padding[i] = parse_integer(colors[i], 0); + r.p_padding[i] + = parse_integer(colors[i], 0); else - fprintf(stderr, "error while parsing MyMenu.prompt.padding"); + fprintf(stderr, + "error while parsing " + "MyMenu.prompt.padding"); } - if (XrmGetResource(xdb, "MyMenu.width", "*", datatype, &value) == 1) - r.width = parse_int_with_percentage(value.addr, r.width, d_width); + if (XrmGetResource(xdb, "MyMenu.width", "*", datatype, &value) + == 1) + r.width = parse_int_with_percentage( + value.addr, r.width, d_width); else - fprintf(stderr, "no width defined, using %d\n", r.width); + fprintf(stderr, "no width defined, using %d\n", + r.width); - if (XrmGetResource(xdb, "MyMenu.height", "*", datatype, &value) == 1) - r.height = parse_int_with_percentage(value.addr, r.height, d_height); + if (XrmGetResource( + xdb, "MyMenu.height", "*", datatype, &value) + == 1) + r.height = parse_int_with_percentage( + value.addr, r.height, d_height); else - fprintf(stderr, "no height defined, using %d\n", r.height); + fprintf(stderr, "no height defined, using %d\n", + r.height); - if (XrmGetResource(xdb, "MyMenu.x", "*", datatype, &value) == 1) - x = parse_int_with_pos(value.addr, x, d_width, r.width); + if (XrmGetResource(xdb, "MyMenu.x", "*", datatype, &value) + == 1) + x = parse_int_with_pos( + value.addr, x, d_width, r.width); - if (XrmGetResource(xdb, "MyMenu.y", "*", datatype, &value) == 1) - y = parse_int_with_pos(value.addr, y, d_height, r.height); + if (XrmGetResource(xdb, "MyMenu.y", "*", datatype, &value) + == 1) + y = parse_int_with_pos( + value.addr, y, d_height, r.height); - if (XrmGetResource(xdb, "MyMenu.border.size", "*", datatype, &value) == 1) { + if (XrmGetResource( + xdb, "MyMenu.border.size", "*", datatype, &value) + == 1) { char **borders; borders = parse_csslike(value.addr); if (borders != NULL) for (i = 0; i < 4; ++i) - r.borders[i] = parse_int_with_percentage(borders[i], 0, (i % 2) == 0 ? d_height : d_width); + r.borders[i] + = parse_int_with_percentage( + borders[i], 0, + (i % 2) == 0 + ? d_height + : d_width); else - fprintf(stderr, "error while parsing MyMenu.border.size\n"); + fprintf(stderr, + "error while parsing " + "MyMenu.border.size\n"); } /* Prompt */ - if (XrmGetResource(xdb, "MyMenu.prompt.foreground", "*", datatype, &value) == 1) + if (XrmGetResource(xdb, "MyMenu.prompt.foreground", "*", + datatype, &value) + == 1) fgs[0] = parse_color(value.addr, "#fff"); - if (XrmGetResource(xdb, "MyMenu.prompt.background", "*", datatype, &value) == 1) + if (XrmGetResource(xdb, "MyMenu.prompt.background", "*", + datatype, &value) + == 1) bgs[0] = parse_color(value.addr, "#000"); /* Completions */ - if (XrmGetResource(xdb, "MyMenu.completion.foreground", "*", datatype, &value) == 1) + if (XrmGetResource(xdb, "MyMenu.completion.foreground", "*", + datatype, &value) + == 1) fgs[1] = parse_color(value.addr, "#fff"); - if (XrmGetResource(xdb, "MyMenu.completion.background", "*", datatype, &value) == 1) + if (XrmGetResource(xdb, "MyMenu.completion.background", "*", + datatype, &value) + == 1) bgs[1] = parse_color(value.addr, "#000"); - if (XrmGetResource(xdb, "MyMenu.completion.padding", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, "MyMenu.completion.padding", "*", + datatype, &value) + == 1) { char **paddings; paddings = parse_csslike(value.addr); if (paddings != NULL) for (i = 0; i < 4; ++i) - r.c_padding[i] = parse_integer(paddings[i], 0); + r.c_padding[i] = parse_integer( + paddings[i], 0); else - fprintf(stderr, "Error while parsing MyMenu.completion.padding"); + fprintf(stderr, + "Error while parsing " + "MyMenu.completion.padding"); } - if (XrmGetResource(xdb, "MyMenu.completion.border.size", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, "MyMenu.completion.border.size", "*", + datatype, &value) + == 1) { char **sizes; sizes = parse_csslike(value.addr); if (sizes != NULL) for (i = 0; i < 4; ++i) - r.c_borders[i] = parse_integer(sizes[i], 0); + r.c_borders[i] + = parse_integer(sizes[i], 0); else - fprintf(stderr, "Error while parsing MyMenu.completion.border.size"); + fprintf(stderr, + "Error while parsing " + "MyMenu.completion.border.size"); } - if (XrmGetResource(xdb, "MyMenu.completion.border.color", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, "MyMenu.completion.border.color", "*", + datatype, &value) + == 1) { char **sizes; sizes = parse_csslike(value.addr); if (sizes != NULL) for (i = 0; i < 4; ++i) - c_borders_bg[i] = parse_color(sizes[i], "#000"); + c_borders_bg[i] = parse_color( + sizes[i], "#000"); else - fprintf(stderr, "Error while parsing MyMenu.completion.border.color"); + fprintf(stderr, + "Error while parsing " + "MyMenu.completion.border.color"); } /* Completion Highlighted */ - if (XrmGetResource(xdb, "MyMenu.completion_highlighted.foreground", "*", datatype, &value) == 1) + if (XrmGetResource(xdb, + "MyMenu.completion_highlighted.foreground", "*", + datatype, &value) + == 1) fgs[2] = parse_color(value.addr, "#000"); - if (XrmGetResource(xdb, "MyMenu.completion_highlighted.background", "*", datatype, &value) == 1) + if (XrmGetResource(xdb, + "MyMenu.completion_highlighted.background", "*", + datatype, &value) + == 1) bgs[2] = parse_color(value.addr, "#fff"); - if (XrmGetResource(xdb, "MyMenu.completion_highlighted.padding", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, + "MyMenu.completion_highlighted.padding", "*", + datatype, &value) + == 1) { char **paddings; paddings = parse_csslike(value.addr); if (paddings != NULL) for (i = 0; i < 4; ++i) - r.ch_padding[i] = parse_integer(paddings[i], 0); + r.ch_padding[i] = parse_integer( + paddings[i], 0); else - fprintf(stderr, "Error while parsing MyMenu.completion_highlighted.padding"); + fprintf(stderr, + "Error while parsing " + "MyMenu.completion_highlighted." + "padding"); } - if (XrmGetResource(xdb, "MyMenu.completion_highlighted.border.size", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, + "MyMenu.completion_highlighted.border.size", "*", + datatype, &value) + == 1) { char **sizes; sizes = parse_csslike(value.addr); if (sizes != NULL) for (i = 0; i < 4; ++i) - r.ch_borders[i] = parse_integer(sizes[i], 0); + r.ch_borders[i] + = parse_integer(sizes[i], 0); else - fprintf(stderr, "Error while parsing MyMenu.completion_highlighted.border.size"); + fprintf(stderr, + "Error while parsing " + "MyMenu.completion_highlighted." + "border.size"); } - if (XrmGetResource(xdb, "MyMenu.completion_highlighted.border.color", "*", datatype, &value) == 1) { + if (XrmGetResource(xdb, + "MyMenu.completion_highlighted.border.color", "*", + datatype, &value) + == 1) { char **colors; colors = parse_csslike(value.addr); if (colors != NULL) for (i = 0; i < 4; ++i) - ch_borders_bg[i] = parse_color(colors[i], "#000"); + ch_borders_bg[i] = parse_color( + colors[i], "#000"); else - fprintf(stderr, "Error while parsing MyMenu.completion_highlighted.border.color"); + fprintf(stderr, + "Error while parsing " + "MyMenu.completion_highlighted." + "border.color"); } /* Border */ - if (XrmGetResource(xdb, "MyMenu.border.color", "*", datatype, &value) == 1) { + if (XrmGetResource( + xdb, "MyMenu.border.color", "*", datatype, &value) + == 1) { char **colors; colors = parse_csslike(value.addr); if (colors != NULL) for (i = 0; i < 4; ++i) - borders_bg[i] = parse_color(colors[i], "#000"); + borders_bg[i] = parse_color( + colors[i], "#000"); else - fprintf(stderr, "error while parsing MyMenu.border.color\n"); + fprintf(stderr, + "error while parsing " + "MyMenu.border.color\n"); } } /* Second round of args parsing */ - optind = 0; /* reset the option index */ + optind = 0; /* reset the option index */ while ((ch = getopt(argc, argv, ARGS)) != -1) { switch (ch) { case 'a': @@ -1813,7 +1972,8 @@ main(int argc, char **argv) case 'e': /* embedding mymenu this case was already catched. */ case 'm': - /* multiple selection this case was already catched. */ + /* multiple selection this case was already catched. + */ break; case 'p': { char *newprompt; @@ -1834,49 +1994,56 @@ main(int argc, char **argv) char **paddings; if ((paddings = parse_csslike(optarg)) != NULL) for (i = 0; i < 4; ++i) - r.p_padding[i] = parse_integer(paddings[i], 0); + r.p_padding[i] = parse_integer( + paddings[i], 0); break; } case 'G': { char **colors; if ((colors = parse_csslike(optarg)) != NULL) for (i = 0; i < 4; ++i) - p_borders_bg[i] = parse_color(colors[i], "#000"); + p_borders_bg[i] = parse_color( + colors[i], "#000"); break; } case 'g': { char **sizes; if ((sizes = parse_csslike(optarg)) != NULL) for (i = 0; i < 4; ++i) - r.p_borders[i] = parse_integer(sizes[i], 0); + r.p_borders[i] + = parse_integer(sizes[i], 0); break; } case 'I': { char **colors; if ((colors = parse_csslike(optarg)) != NULL) for (i = 0; i < 4; ++i) - c_borders_bg[i] = parse_color(colors[i], "#000"); + c_borders_bg[i] = parse_color( + colors[i], "#000"); break; } case 'i': { char **sizes; if ((sizes = parse_csslike(optarg)) != NULL) for (i = 0; i < 4; ++i) - r.c_borders[i] = parse_integer(sizes[i], 0); + r.c_borders[i] + = parse_integer(sizes[i], 0); break; } case 'J': { char **colors; if ((colors = parse_csslike(optarg)) != NULL) for (i = 0; i < 4; ++i) - ch_borders_bg[i] = parse_color(colors[i], "#000"); + ch_borders_bg[i] = parse_color( + colors[i], "#000"); break; } case 'j': { char **sizes; if ((sizes = parse_csslike(optarg)) != NULL) for (i = 0; i < 4; ++i) - r.ch_borders[i] = parse_integer(sizes[i], 0); + r.ch_borders[i] + = parse_integer(sizes[i], 0); break; } case 'l': @@ -1891,16 +2058,19 @@ main(int argc, char **argv) break; } case 'W': - r.width = parse_int_with_percentage(optarg, r.width, d_width); + r.width = parse_int_with_percentage( + optarg, r.width, d_width); break; case 'H': - r.height = parse_int_with_percentage(optarg, r.height, d_height); + r.height = parse_int_with_percentage( + optarg, r.height, d_height); break; case 'b': { char **borders; if ((borders = parse_csslike(optarg)) != NULL) { for (i = 0; i < 4; ++i) - r.borders[i] = parse_integer(borders[i], 0); + r.borders[i] = parse_integer( + borders[i], 0); } else fprintf(stderr, "Error parsing b option\n"); break; @@ -1909,9 +2079,11 @@ main(int argc, char **argv) char **colors; if ((colors = parse_csslike(optarg)) != NULL) { for (i = 0; i < 4; ++i) - borders_bg[i] = parse_color(colors[i], "#000"); + borders_bg[i] = parse_color( + colors[i], "#000"); } else - fprintf(stderr, "error while parsing B option\n"); + fprintf(stderr, + "error while parsing B option\n"); break; } case 't': @@ -1948,23 +2120,29 @@ main(int argc, char **argv) * update the completion here */ update_completions(cs, text, lines, vlines, r.first_selected); - /* update the prompt lenght, only now we surely know the length of it */ + /* update the prompt lenght, only now we surely know the length of it + */ r.ps1len = strlen(r.ps1); /* Create the window */ - create_window(&r, parent_window, cmap, vinfo, x, y, offset_x, offset_y, bgs[1]); + create_window(&r, parent_window, cmap, vinfo, x, y, offset_x, + offset_y, bgs[1]); set_win_atoms_hints(r.d, r.w, r.width, r.height); XMapRaised(r.d, r.w); /* If embed, listen for other events as well */ if (embed) { - Window *children, parent, root; - unsigned int children_no; + Window *children, parent, root; + unsigned int children_no; XSelectInput(r.d, parent_window, FocusChangeMask); - if (XQueryTree(r.d, parent_window, &root, &parent, &children, &children_no) && children) { - for (i = 0; i < children_no && children[i] != r.w; ++i) - XSelectInput(r.d, children[i], FocusChangeMask); + if (XQueryTree(r.d, parent_window, &root, &parent, &children, + &children_no) + && children) { + for (i = 0; i < children_no && children[i] != r.w; + ++i) + XSelectInput( + r.d, children[i], FocusChangeMask); XFree(children); } grabfocus(r.d, r.w); @@ -1976,7 +2154,7 @@ main(int argc, char **argv) r.y_zero = r.borders[0]; { - XGCValues values; + XGCValues values; for (i = 0; i < 3; ++i) { r.fgs[i] = XCreateGC(r.d, r.w, 0, &values); @@ -2011,15 +2189,16 @@ main(int argc, char **argv) r.xftdraw = XftDrawCreate(r.d, r.w, vinfo.visual, cmap); for (i = 0; i < 3; ++i) { - rgba_t c; - XRenderColor xrcolor; + rgba_t c; + XRenderColor xrcolor; - c = *(rgba_t*)&fgs[i]; - xrcolor.red = EXPANDBITS(c.rgba.r); - xrcolor.green = EXPANDBITS(c.rgba.g); - xrcolor.blue = EXPANDBITS(c.rgba.b); - xrcolor.alpha = EXPANDBITS(c.rgba.a); - XftColorAllocValue(r.d, vinfo.visual, cmap, &xrcolor, &r.xft_colors[i]); + c = *(rgba_t *)&fgs[i]; + xrcolor.red = EXPANDBITS(c.rgba.r); + xrcolor.green = EXPANDBITS(c.rgba.g); + xrcolor.blue = EXPANDBITS(c.rgba.b); + xrcolor.alpha = EXPANDBITS(c.rgba.a); + XftColorAllocValue( + r.d, vinfo.visual, cmap, &xrcolor, &r.xft_colors[i]); } #endif