diff options
author | sabetts <sabetts> | 2001-02-19 09:56:37 +0000 |
---|---|---|
committer | sabetts <sabetts> | 2001-02-19 09:56:37 +0000 |
commit | fe1b95fa672387232732507a65565bac8c470c26 (patch) | |
tree | fea1ebe54c235ec19eacebed1b7867bc17e086a2 /src/input.c | |
parent | 4f193c1f4d81f0f583d4db7a00c3cb54967b2058 (diff) | |
download | ratpoison-fe1b95fa672387232732507a65565bac8c470c26.zip |
* manage.c (manage): calls sort_window_list_by_number
* list.h (sort_window_list_by_number): Added prototype
* list.c (swap_list_elements): Added
(sort_window_list_by_number): Added
* input.c (update_input_window): Added
(get_input): calls update_input_window in place of xlib calls.
(get_input): exits if realloc fails
* conf.h: Added INPUT_WINDOW_SIZE
* bar.c (update_window_names): loops through window list from head
to tail.
Diffstat (limited to 'src/input.c')
-rw-r--r-- | src/input.c | 84 |
1 files changed, 49 insertions, 35 deletions
diff --git a/src/input.c b/src/input.c index 835d233..ffba346 100644 --- a/src/input.c +++ b/src/input.c @@ -127,50 +127,70 @@ read_key (KeySym *keysym, unsigned int *modifiers) } while (IsModifierKey (*keysym)); } +static void +update_input_window (screen_info *s, char *prompt, char *input, int input_len) +{ + int prompt_width = XTextWidth (s->font, prompt, strlen (prompt)); + int input_width = XTextWidth (s->font, input, input_len); + int width; + + width = BAR_X_PADDING * 2 + prompt_width + input_width; + + if (width < INPUT_WINDOW_SIZE + prompt_width) + { + width = INPUT_WINDOW_SIZE + prompt_width; + } + + XMoveResizeWindow (dpy, s->input_window, + bar_x (s, width), bar_y (s), width, + (FONT_HEIGHT (s->font) + BAR_Y_PADDING * 2)); + + XClearWindow (dpy, s->input_window); + + XDrawString (dpy, s->input_window, s->normal_gc, + BAR_X_PADDING, + BAR_Y_PADDING + s->font->max_bounds.ascent, prompt, + strlen (prompt)); + + XDrawString (dpy, s->input_window, s->normal_gc, + BAR_X_PADDING + prompt_width, + BAR_Y_PADDING + s->font->max_bounds.ascent, input, + input_len); +} + char * get_input (char *prompt) { screen_info *s = current_screen (); - int cur_len; /* Current length of the string. */ - int allocated_len=100; /* The ammount of memory we allocated for str */ + int cur_len = 0; /* Current length of the string. */ + int allocated_len=100; /* The amount of memory we allocated for str */ KeySym ch; unsigned int modifier; int revert; Window fwin; - int prompt_width = XTextWidth (s->font, prompt, strlen (prompt)); - int width = 200 + prompt_width; char *str; + /* Allocate some memory to start with */ + str = (char *) malloc ( allocated_len ); + if ( str == NULL ) + { + PRINT_ERROR ("Out of memory\n"); + exit (EXIT_FAILURE); + } /* We don't want to draw overtop of the program bar. */ hide_bar (s); XMapWindow (dpy, s->input_window); - XMoveResizeWindow (dpy, s->input_window, - bar_x (s, width), bar_y (s), width, - (FONT_HEIGHT (s->font) + BAR_Y_PADDING * 2)); XClearWindow (dpy, s->input_window); XRaiseWindow (dpy, s->input_window); - /* draw the window prompt. */ - XDrawString (dpy, s->input_window, s->normal_gc, BAR_X_PADDING, - BAR_Y_PADDING + s->font->max_bounds.ascent, prompt, - strlen (prompt)); + update_input_window (s, prompt, str, cur_len); XGetInputFocus (dpy, &fwin, &revert); XSetInputFocus (dpy, s->input_window, RevertToPointerRoot, CurrentTime); /* XSync (dpy, False); */ - cur_len = 0; - - /* Allocate some memory */ - str = (char *) malloc ( 100 ); /* Most of the time people - won't type more than 100 chars, will they ?*/ - if ( str == NULL ) - { - PRINT_ERROR ("Out of memory\n"); - exit (EXIT_FAILURE); - } read_key (&ch, &modifier); while (ch != XK_Return) @@ -179,30 +199,24 @@ get_input (char *prompt) if (ch == XK_BackSpace) { if (cur_len > 0) cur_len--; - XClearWindow (dpy, s->input_window); - XDrawString (dpy, s->input_window, s->normal_gc, BAR_X_PADDING, - BAR_Y_PADDING + s->font->max_bounds.ascent, prompt, - strlen (prompt)); - XDrawString (dpy, s->input_window, s->normal_gc, - BAR_X_PADDING + prompt_width, - BAR_Y_PADDING + s->font->max_bounds.ascent, str, - cur_len); + update_input_window(s, prompt, str, cur_len); } else { if (cur_len > allocated_len - 1) { - str = realloc ( str, allocated_len + 100 ); - /** FIXME: realloc(3) is unlcear to me, how should I check for - its success ? - algernon **/ allocated_len += 100; + str = realloc ( str, allocated_len ); + if (str == NULL) + { + PRINT_ERROR ("Out of memory\n"); + exit (EXIT_FAILURE); + } } str[cur_len] = ch; cur_len++; - XDrawString (dpy, s->input_window, s->normal_gc, - BAR_X_PADDING + prompt_width, - BAR_Y_PADDING + s->font->max_bounds.ascent, str, cur_len); + update_input_window(s, prompt, str, cur_len); } read_key (&ch, &modifier); |