From 252003dd37cbc039a2e3e910ce7188946c0c6774 Mon Sep 17 00:00:00 2001 From: Mytchel Hammond Date: Wed, 8 Apr 2015 04:45:16 +0000 Subject: [PATCH] stuctural changes, update_position called with every render so when you type you dont end up off screen. --- config.h | 6 +- nenu | Bin 25747 -> 25841 bytes nenu.1 | 2 +- nenu.c | 248 +++++++++++++++++++++++++------------------------------ nenu.h | 46 ++++++----- 5 files changed, 145 insertions(+), 157 deletions(-) diff --git a/config.h b/config.h index d434909..3bdd83a 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ #define MAX_LEN 512 #define TAB_WIDTH 4 -char default_bg[] = "#000000"; -char default_fg[] = "#cccccc"; +char bg_name[] = "#000000"; +char fg_name[] = "#cccccc"; -char default_fontstr[] = "DejaVuSansMono:pixelsize=12:antialias=true:autohint=false"; +char font_str[] = "DejaVuSansMono:pixelsize=12:antialias=true:autohint=false"; diff --git a/nenu b/nenu index 2f2703db144fa83e8fccf3016aafbec49743fca4..efc5f1764a339daaee958224fb1eb887b15dfbbd 100755 GIT binary patch literal 25841 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 - else if (valid) printf("%s\n", valid->text); } else if (exit_on_one) { if (valid) printf("%s\n", valid->text); } else { printf("%s\n", text); } - exit(0); + + clean_resources(); + exit(EXIT_SUCCESS); } int text_width(FcChar8 *str) { @@ -119,6 +130,7 @@ void render() { int cursor_pos; update_size(); + update_position(); XftDrawRect(draw, &bg, 0, 0, w, h); if (input_bar) { @@ -152,6 +164,14 @@ void insert(FcChar8 *str, ssize_t n) { cursor += n; } +void copy_first() { + if (current) { + strcpy(text, current->text); + while (text[cursor] != '\0' && cursor < MAX_LEN - 1) + cursor = nextrune(+1); + update_valid_options(); + } +} // return location of next utf8 rune in the given direction -- thanks dmenu size_t nextrune(int inc) { ssize_t n; @@ -267,8 +287,7 @@ void handle_key(XKeyEvent ke) { break; case XK_Tab: - select_forward_match(); - update_valid_options(); + copy_first(); break; case XK_Left: @@ -348,36 +367,14 @@ void update_valid_options() { current = valid; } -void select_forward_match() { - option *o; - int i, can_move = -1, good = 1; - FcChar8 c; - - if (!valid) - return; - - while (good) { - c = valid->text[++can_move]; - if (!c) break; - for (o = valid; o && good; o = o->next) - if (o->text[can_move] != c) - good = 0; - } - - if (can_move > 0) - for (i = 0; i < can_move; i++) - text[i] = valid->text[i]; - cursor = can_move; -} - -void load_font(FcChar8 *fontstr) { +void load_font(FcChar8 *font_str) { FcPattern *pattern, *match; FcResult result; - if (fontstr[0] == '-') - pattern = XftXlfdParse(fontstr, False, False); + if (font_str[0] == '-') + pattern = XftXlfdParse(font_str, False, False); else - pattern = FcNameParse((FcChar8 *) fontstr); + pattern = FcNameParse((FcChar8 *) font_str); if (!pattern) die("Failed to get font pattern"); @@ -426,6 +423,9 @@ void update_size() { int ow = w, oh = h; option *o; + heading_width = text_width(heading); + cursor_width = text_width("_"); + w = heading_width + cursor_width + text_width(text); h = input_bar ? ascent + descent : 0; @@ -450,7 +450,7 @@ void update_size() { XftDrawChange(draw, buf); } -void set_position() { +void update_position() { Window ww; int c, v; @@ -458,6 +458,9 @@ void set_position() { if (x == -1 && y == -1) XQueryPointer(display, root, &ww, &ww, &x, &y, &c, &c, &v); + if (!absolute_position) + keep_in_screen(); + XMoveWindow(display, win, x, y); } @@ -479,8 +482,6 @@ void keep_in_screen() { if (y + h > info[i].y_org + info[i].height) y = info[i].y_org + info[i].height - h - BORDER_WIDTH - 1; if (y < info[i].y_org) y = info[i].y_org; - - XMoveWindow(display, win, x, y); } } @@ -488,12 +489,10 @@ void read_input() { FcChar8 line[512]; int l; option *o, *head; - head = malloc(sizeof(option)); - head->next = NULL; - o = head; + o = head = calloc(sizeof(option), 1); while (fgets(line, sizeof(line), stdin)) { - o->next = malloc(sizeof(option)); + o->next = calloc(sizeof(option), 1); o->next->prev = o; o = o->next; @@ -501,7 +500,6 @@ void read_input() { o->text = calloc(sizeof(char), l); strncpy(o->text, line, l - 1); o->text[l - 1] = '\0'; - o->next = NULL; } options = head->next; @@ -510,57 +508,12 @@ void read_input() { update_valid_options(); } -int main(int argc, char *argv[]) { +void setup() { XSetWindowAttributes attributes; XWindowAttributes window_attributes; Visual *vis; Colormap cmap; - XEvent ev; - int i; - - char *bg_name = default_bg; - char *fg_name = default_fg; - char *fontstr = default_fontstr; - - cursor = 0; - heading = ""; - text = calloc(MAX_LEN, sizeof(FcChar8)); - valid = NULL; - current = NULL; - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-h") == 0) { - usage(); - return 0; - } else if (strcmp(argv[i], "-a") == 0) { - exit_on_one = 1; - } else if (strcmp(argv[i], "-c") == 0) { - complete_on_exit = 1; - } else if (strcmp(argv[i], "-n") == 0) { - complete_on_exit = 1; - input_bar = 0; - } else if (strcmp(argv[i], "-e") == 0) { - read_options = 0; - } else if (strcmp(argv[i], "-p") == 0) { - i++; - x = atoi(strsep(&argv[i], ",")); - y = atoi(argv[i]); - } else if (strcmp(argv[i], "-ap") == 0) { - absolute_position = 1; - } else if (strcmp(argv[i], "-fg") == 0) { - fg_name = argv[++i]; - } else if (strcmp(argv[i], "-bg") == 0) { - bg_name = argv[++i]; - } else if (strcmp(argv[i], "-fn") == 0) { - fontstr = argv[++i]; - } else { - heading = argv[i]; - } - } - - if (read_options) - read_input(); - + display = XOpenDisplay(NULL); root = RootWindow(display, 0); screen = DefaultScreen(display); @@ -579,7 +532,7 @@ int main(int argc, char *argv[]) { attributes.event_mask = ExposureMask | KeyPressMask | ButtonPressMask; win = XCreateWindow(display, root, - 0, 0, 10, 10, BORDER_WIDTH, + 0, 0, 1, 1, BORDER_WIDTH, DefaultDepth(display, 0), CopyFromParent, CopyFromParent, CWBackPixel | CWOverrideRedirect | CWEventMask @@ -592,18 +545,50 @@ int main(int argc, char *argv[]) { gc = XCreateGC(display, win, 0, 0); - buf = XCreatePixmap(display, win, 10, 10, DefaultDepth(display, screen)); + buf = XCreatePixmap(display, win, 1, 1, DefaultDepth(display, screen)); draw = XftDrawCreate(display, buf, vis, cmap); - load_font(fontstr); + load_font(font_str); +} - heading_width = text_width(heading); - cursor_width = text_width("_"); +int main(int argc, char *argv[]) { + XEvent ev; + int i; - update_size(); - set_position(); - if (!absolute_position) - keep_in_screen(); + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-h") == 0) { + usage(); + exit(EXIT_SUCCESS); + } else if (strcmp(argv[i], "-a") == 0) { + exit_on_one = 1; + } else if (strcmp(argv[i], "-c") == 0) { + complete_on_exit = 1; + } else if (strcmp(argv[i], "-n") == 0) { + complete_on_exit = 1; + input_bar = 0; + } else if (strcmp(argv[i], "-e") == 0) { + read_options = 0; + } else if (strcmp(argv[i], "-p") == 0) { + i++; + x = atoi(strsep(&argv[i], ",")); + y = atoi(argv[i]); + } else if (strcmp(argv[i], "-ap") == 0) { + absolute_position = 1; + } else if (strcmp(argv[i], "-fg") == 0) { + strcpy(fg_name, argv[++i]); + } else if (strcmp(argv[i], "-bg") == 0) { + strcpy(bg_name, argv[++i]); + } else if (strcmp(argv[i], "-fn") == 0) { + strcpy(font_str, argv[++i]); + } else { + strcpy(heading, argv[i]); + } + } + + setup(); + + if (read_options) + read_input(); render(); @@ -622,11 +607,6 @@ int main(int argc, char *argv[]) { } } - XUngrabKeyboard(display, CurrentTime); - XUngrabPointer(display, CurrentTime); - XFreeGC(display, gc); - XFreePixmap(display, buf); - XFreePixmap(display, nullpixmap); - - return 0; -} + clean_resources(); + exit(EXIT_FAILURE); +} \ No newline at end of file diff --git a/nenu.h b/nenu.h index d533e42..28986a1 100644 --- a/nenu.h +++ b/nenu.h @@ -5,29 +5,37 @@ struct option { option *next, *prev; }; -void usage(); -void die(FcChar8 *msg); -void finish(); +static void usage(); +static void die(char *msg); -int text_width(FcChar8 *str); -void draw_string(FcChar8 *str, int x, int y); +static void clean_resources(); -void render_options(int oy); -void render(); +static void finish(); -void insert(FcChar8 *str, ssize_t n); -size_t nextrune(int inc); +static int text_width(FcChar8 *str); +static void draw_string(FcChar8 *str, int x, int y); -void handle_button(XButtonEvent be); -void handle_key(XKeyEvent ke); +static void render_options(int oy); +static void render(); -void update_valid_options(); -void select_forward_match(); +static void insert(FcChar8 *str, ssize_t n); +static size_t nextrune(int inc); -void make_cursor(); -void load_font(FcChar8 *fontstr); -void grab_keyboard_pointer(); -void update_size(); -void set_position(); +static void copy_first(); -void read_input(); +static void handle_button(XButtonEvent be); +static void handle_key(XKeyEvent ke); + +static void update_valid_options(); + +static void make_cursor(); +static void load_font(FcChar8 *fontstr); +static void grab_keyboard_pointer(); + +static void update_size(); +static void update_position(); +static void keep_in_screen(); + +static void read_input(); + +static void setup();