diff options
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | ChangeLog | 38 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/actions.c | 68 | ||||
-rw-r--r-- | src/bar.c | 26 | ||||
-rw-r--r-- | src/data.h | 2 | ||||
-rw-r--r-- | src/globals.c | 2 | ||||
-rw-r--r-- | src/globals.h | 7 | ||||
-rw-r--r-- | src/input.c | 28 | ||||
-rw-r--r-- | src/main.c | 33 | ||||
-rw-r--r-- | src/manage.c | 46 | ||||
-rw-r--r-- | src/ratpoison.h | 4 | ||||
-rw-r--r-- | src/screen.c | 3 | ||||
-rw-r--r-- | src/split.c | 10 |
14 files changed, 173 insertions, 98 deletions
@@ -36,3 +36,4 @@ jesus c. meyendriesch <jesus at qplay dot org> Bernhard R. Link <brlink at debian dot org> Tobias C. Rittweiler <tcr at freebits dot de> Antti Nykänen <aon at iki dot fi> +rubikitch <rubikitch at ruby-lang org> @@ -1,3 +1,41 @@ +2006-04-19 Shawn Betts <sabetts@vcn.bc.ca> + + * src/split.c (show_frame_message): use XmbDrawString and XmbTextEscapement + + * src/screen.c (init_screen): don't include the font in the gc + + * src/ratpoison.h: include Xlocale.h + + * src/manage.c (get_wmname): support i18n characters + + * src/main.c (init_defaults): call load_query_font_set and set_extents_of_fontset + (main): call setlocale + (clean_up): call XFreeFontSet + (set_extents_of_fontset): new function + (load_query_font_set): likewise + + * src/input.c (update_input_window): use XmbTextEscapement and XmbDrawString + + * src/globals.h (FONT_HEIGHT): use rp_font_ascent and rp_font_descent + (MAX_FONT_WIDTH): use rp_font_width + new globals rp_font_ascent, rp_font_descent, rp_font_width + + * src/globals.c: new globals rp_font_ascent, rp_font_descent, rp_font_width + + * src/data.h (struct rp_defaults): font is a XFontSet + + * src/bar.c (max_line_length): call XmbTextEscapement + (draw_string): call XmbDrawString + (get_mark_box): call XmbTextEscapement + + * src/actions.c (read_frame): call XmbTextEscapement + (cmd_license): likewise + (read_frame): call XmbDrawString + (cmd_license): likewise + (cmd_help): likewise + (update_gc): don't include the font + (set_font): call load_query_font_set + 2006-04-18 Shawn Betts <sabetts@vcn.bc.ca> * src/hook.c (hook_run): echo the result of each command. free the @@ -6,6 +6,9 @@ Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. +* Changes since 1.4.0 +** support for i18n fonts + * Changes since 1.4.0-beta4 ** new parameters in frame dumps :screenh and :screenw specify the size of the screen the frame was diff --git a/src/actions.c b/src/actions.c index 666bfb5..78736b1 100644 --- a/src/actions.c +++ b/src/actions.c @@ -1650,7 +1650,7 @@ read_frame (struct argspec *spec, struct sbuf *s, struct cmdarg **arg) determine the height and width of the window. */ /* num = xsprintf (" %d ", cur->number); */ num = frame_selector (cur->number); - width = defaults.bar_x_padding * 2 + XTextWidth (defaults.font, num, strlen (num)); + width = defaults.bar_x_padding * 2 + XmbTextEscapement (defaults.font, num, strlen (num)); height = (FONT_HEIGHT (defaults.font) + defaults.bar_y_padding * 2); /* Create and map the window. */ @@ -1662,10 +1662,10 @@ read_frame (struct argspec *spec, struct sbuf *s, struct cmdarg **arg) XClearWindow (dpy, wins[i]); /* Display the frame's number inside the window. */ - XDrawString (dpy, wins[i], s->normal_gc, - defaults.bar_x_padding, - defaults.bar_y_padding + defaults.font->max_bounds.ascent, - num, strlen (num)); + XmbDrawString (dpy, wins[i], defaults.font, s->normal_gc, + defaults.bar_x_padding, + defaults.bar_y_padding + rp_font_ascent, + num, strlen (num)); free (num); i++; @@ -3093,7 +3093,7 @@ cmd_license (int interactive, struct cmdarg **args) { int tmp; - tmp = XTextWidth (defaults.font, license_text[i], strlen (license_text[i])); + tmp = XmbTextEscapement (defaults.font, license_text[i], strlen (license_text[i])); if (tmp > max_width) max_width = tmp; } @@ -3107,9 +3107,9 @@ cmd_license (int interactive, struct cmdarg **args) /* Print the text. */ for(i=0; license_text[i]; i++) { - XDrawString (dpy, s->help_window, s->normal_gc, - x, y + defaults.font->max_bounds.ascent, - license_text[i], strlen (license_text[i])); + XmbDrawString (dpy, s->help_window, defaults.font, s->normal_gc, + x, y + rp_font_ascent, + license_text[i], strlen (license_text[i])); y += FONT_HEIGHT (defaults.font); } @@ -3152,21 +3152,21 @@ cmd_help (int interactive, struct cmdarg **args) XMapRaised (dpy, s->help_window); XGrabKeyboard (dpy, s->help_window, False, GrabModeSync, GrabModeAsync, CurrentTime); - XDrawString (dpy, s->help_window, s->normal_gc, - 10, y + defaults.font->max_bounds.ascent, - "ratpoison key bindings", strlen ("ratpoison key bindings")); + XmbDrawString (dpy, s->help_window, defaults.font, s->normal_gc, + 10, y + rp_font_ascent, + "ratpoison key bindings", strlen ("ratpoison key bindings")); y += FONT_HEIGHT (defaults.font) * 2; - XDrawString (dpy, s->help_window, s->normal_gc, - 10, y + defaults.font->max_bounds.ascent, - "Command key: ", strlen ("Command key: ")); + XmbDrawString (dpy, s->help_window, defaults.font, s->normal_gc, + 10, y + rp_font_ascent, + "Command key: ", strlen ("Command key: ")); keysym_name = keysym_to_string (prefix_key.sym, prefix_key.state); - XDrawString (dpy, s->help_window, s->normal_gc, - 10 + XTextWidth (defaults.font, "Command key: ", strlen ("Command key: ")), - y + defaults.font->max_bounds.ascent, - keysym_name, strlen (keysym_name)); + XmbDrawString (dpy, s->help_window, defaults.font, s->normal_gc, + 10 + XmbTextEscapement (defaults.font, "Command key: ", strlen ("Command key: ")), + y + rp_font_ascent, + keysym_name, strlen (keysym_name)); free (keysym_name); y += FONT_HEIGHT (defaults.font) * 2; @@ -3179,24 +3179,24 @@ cmd_help (int interactive, struct cmdarg **args) { keysym_name = keysym_to_string (map->actions[i].key, map->actions[i].state); - XDrawString (dpy, s->help_window, s->normal_gc, - x, y + defaults.font->max_bounds.ascent, - keysym_name, strlen (keysym_name)); + XmbDrawString (dpy, s->help_window, defaults.font, s->normal_gc, + x, y + rp_font_ascent, + keysym_name, strlen (keysym_name)); - if (XTextWidth (defaults.font, keysym_name, strlen (keysym_name)) > max_width) - max_width = XTextWidth (defaults.font, keysym_name, strlen (keysym_name)); + if (XmbTextEscapement (defaults.font, keysym_name, strlen (keysym_name)) > max_width) + max_width = XmbTextEscapement (defaults.font, keysym_name, strlen (keysym_name)); free (keysym_name); } else { - XDrawString (dpy, s->help_window, s->normal_gc, - x, y + defaults.font->max_bounds.ascent, - map->actions[i].data, strlen (map->actions[i].data)); + XmbDrawString (dpy, s->help_window, defaults.font, s->normal_gc, + x, y + rp_font_ascent, + map->actions[i].data, strlen (map->actions[i].data)); - if (XTextWidth (defaults.font, map->actions[i].data, strlen (map->actions[i].data)) > max_width) + if (XmbTextEscapement (defaults.font, map->actions[i].data, strlen (map->actions[i].data)) > max_width) { - max_width = XTextWidth (defaults.font, map->actions[i].data, strlen (map->actions[i].data)); + max_width = XmbTextEscapement (defaults.font, map->actions[i].data, strlen (map->actions[i].data)); } } @@ -3419,12 +3419,11 @@ update_gc (rp_screen *s) gv.function = GXcopy; gv.line_width = 1; gv.subwindow_mode = IncludeInferiors; - gv.font = defaults.font->fid; XFreeGC (dpy, s->normal_gc); s->normal_gc = XCreateGC(dpy, s->root, GCForeground | GCBackground | GCFunction | GCLineWidth - | GCSubwindowMode | GCFont, &gv); + | GCSubwindowMode, &gv); } static void @@ -3441,18 +3440,19 @@ update_all_gcs () static cmdret * set_font (struct cmdarg **args) { - XFontStruct *font; + XFontSet font; if (args[0] == NULL) return cmdret_new (RET_SUCCESS, "%s", defaults.font_string); - font = XLoadQueryFont (dpy, ARG_STRING(0)); + font = load_query_font_set (dpy, ARG_STRING(0)); if (font == NULL) return cmdret_new (RET_FAILURE, "deffont: unknown font"); /* Save the font as the default. */ - XFreeFont (dpy, defaults.font); + XFreeFontSet (dpy, defaults.font); defaults.font = font; + set_extents_of_fontset(font); update_all_gcs(); free (defaults.font_string); @@ -231,7 +231,7 @@ max_line_length (char* msg) int current_width; /* Check if this line is the longest so far. */ - current_width = XTextWidth (defaults.font, msg + start, i - start); + current_width = XmbTextEscapement (defaults.font, msg + start, i - start); if(current_width > ret) { ret = current_width; @@ -306,22 +306,22 @@ draw_string (rp_screen *s, char *msg) line, and move down one line. */ if (msg[i] == '\n') { - XDrawString (dpy, s->bar_window, s->normal_gc, - defaults.bar_x_padding, - defaults.bar_y_padding + defaults.font->max_bounds.ascent - + line_no * line_height, - msg + start, i - start); + XmbDrawString (dpy, s->bar_window, defaults.font, s->normal_gc, + defaults.bar_x_padding, + defaults.bar_y_padding + rp_font_ascent + + line_no * line_height, + msg + start, i - start); line_no++; start = i + 1; } } /* Print the last line. */ - XDrawString (dpy, s->bar_window, s->normal_gc, - defaults.bar_x_padding, - defaults.bar_y_padding + defaults.font->max_bounds.ascent - + line_no * line_height, - msg + start, strlen (msg) - start); + XmbDrawString (dpy, s->bar_window, defaults.font, s->normal_gc, + defaults.bar_x_padding, + defaults.bar_y_padding + rp_font_ascent + + line_no * line_height, + msg + start, strlen (msg) - start); XSync (dpy, False); } @@ -412,11 +412,11 @@ get_mark_box (char *msg, size_t mark_start, size_t mark_end, if (mark_start == 0 || start_pos_in_line == 0) start = 0; else - start = XTextWidth (defaults.font, + start = XmbTextEscapement (defaults.font, &msg[start_line_beginning], start_pos_in_line) + defaults.bar_x_padding; - end = XTextWidth (defaults.font, + end = XmbTextEscapement (defaults.font, &msg[end_line_beginning], end_pos_in_line) + defaults.bar_x_padding * 2; @@ -220,7 +220,7 @@ struct rp_defaults int padding_top; int padding_bottom; - XFontStruct *font; + XFontSet font; char *font_string; char *fgcolor_string; diff --git a/src/globals.c b/src/globals.c index cff1646..6534cc8 100644 --- a/src/globals.c +++ b/src/globals.c @@ -32,6 +32,8 @@ int rat_visible = 1; /* rat is visible by default */ char *rp_exec_newwm = NULL; +int rp_font_ascent, rp_font_descent, rp_font_width; + Atom wm_name; Atom wm_state; Atom wm_change_state; diff --git a/src/globals.h b/src/globals.h index a2d466f..d80e31a 100644 --- a/src/globals.h +++ b/src/globals.h @@ -27,8 +27,8 @@ #define RET_SUCCESS 1 #define RET_FAILURE 0 -#define FONT_HEIGHT(f) ((f)->max_bounds.ascent + (f)->max_bounds.descent) -#define MAX_FONT_WIDTH(f) ((f)->max_bounds.width) +#define FONT_HEIGHT(f) (rp_font_ascent + rp_font_descent) +#define MAX_FONT_WIDTH(f) (rp_font_width) #define WIN_EVENTS (StructureNotifyMask | PropertyChangeMask | ColormapChangeMask | FocusChangeMask) /* EMPTY is used when a frame doesn't contain a window, or a window @@ -67,6 +67,9 @@ extern struct list_head rp_children; extern struct rp_defaults defaults; +/* Cached font info. */ +extern int rp_font_ascent, rp_font_descent, rp_font_width; + /* The prefix key also known as the command character under screen. */ extern struct rp_key prefix_key; diff --git a/src/input.c b/src/input.c index 5fcb303..6a51dd1 100644 --- a/src/input.c +++ b/src/input.c @@ -319,8 +319,8 @@ read_key (KeySym *keysym, unsigned int *modifiers, char *keysym_name, int len) static void update_input_window (rp_screen *s, rp_input_line *line) { - int prompt_width = XTextWidth (defaults.font, line->prompt, strlen (line->prompt)); - int input_width = XTextWidth (defaults.font, line->buffer, line->length); + int prompt_width = XmbTextEscapement (defaults.font, line->prompt, strlen (line->prompt)); + int input_width = XmbTextEscapement (defaults.font, line->buffer, line->length); int total_width; GC lgc; XGCValues gv; @@ -341,17 +341,17 @@ update_input_window (rp_screen *s, rp_input_line *line) XClearWindow (dpy, s->input_window); XSync (dpy, False); - XDrawString (dpy, s->input_window, s->normal_gc, - defaults.bar_x_padding, - defaults.bar_y_padding + defaults.font->max_bounds.ascent, - line->prompt, - strlen (line->prompt)); + XmbDrawString (dpy, s->input_window, defaults.font, s->normal_gc, + defaults.bar_x_padding, + defaults.bar_y_padding + rp_font_ascent, + line->prompt, + strlen (line->prompt)); - XDrawString (dpy, s->input_window, s->normal_gc, - defaults.bar_x_padding + prompt_width, - defaults.bar_y_padding + defaults.font->max_bounds.ascent, - line->buffer, - line->length); + XmbDrawString (dpy, s->input_window, defaults.font, s->normal_gc, + defaults.bar_x_padding + prompt_width, + defaults.bar_y_padding + rp_font_ascent, + line->buffer, + line->length); gv.function = GXxor; gv.foreground = s->fg_color ^ s->bg_color; @@ -359,9 +359,9 @@ update_input_window (rp_screen *s, rp_input_line *line) /* Draw a cheap-o cursor - MkII */ XFillRectangle (dpy, s->input_window, lgc, - defaults.bar_x_padding + prompt_width + XTextWidth (defaults.font, line->buffer, line->position), + defaults.bar_x_padding + prompt_width + XmbTextEscapement (defaults.font, line->buffer, line->position), defaults.bar_y_padding, - XTextWidth (defaults.font, &line->buffer[line->position], 1), + XmbTextEscapement (defaults.font, &line->buffer[line->position], 1), FONT_HEIGHT (defaults.font)); XFlush (dpy); @@ -485,13 +485,14 @@ init_defaults () defaults.padding_top = 0; defaults.padding_bottom = 0; - defaults.font = XLoadQueryFont (dpy, DEFAULT_FONT); + defaults.font = load_query_font_set (dpy, DEFAULT_FONT); if (defaults.font == NULL) { fprintf (stderr, "ratpoison: Cannot load font %s.\n", DEFAULT_FONT); exit (EXIT_FAILURE); } defaults.font_string = xstrdup (DEFAULT_FONT); + set_extents_of_fontset (defaults.font); defaults.fgcolor_string = xstrdup ("black"); defaults.bgcolor_string = xstrdup ("white"); @@ -525,6 +526,7 @@ main (int argc, char *argv[]) char *alt_rcfile = NULL; myargv = argv; + setlocale(LC_CTYPE, ""); /* Parse the arguments */ while (1) @@ -753,9 +755,36 @@ clean_up () free_xinerama(); - XFreeFont (dpy, defaults.font); + XFreeFontSet (dpy, defaults.font); free (defaults.window_fmt); XSetInputFocus (dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XCloseDisplay (dpy); } + +void +set_extents_of_fontset (XFontSet font) +{ + XFontSetExtents *extent; + extent = XExtentsOfFontSet(font); + rp_font_ascent = extent->max_logical_extent.height * 9 / 10; + rp_font_descent = extent->max_logical_extent.height / 5; + rp_font_width = extent->max_logical_extent.width; +} + +XFontSet load_query_font_set (Display *disp, const char *fontset_name) +{ + XFontSet fontset; + int missing_charset_count; + char **missing_charset_list; + char *def_string; + + fontset = XCreateFontSet(disp, fontset_name, + &missing_charset_list, &missing_charset_count, + &def_string); + if (missing_charset_count) { + PRINT_DEBUG (("Missing charsets in FontSet(%s) creation.\n", fontset_name)); + XFreeStringList(missing_charset_list); + } + return fontset; +} diff --git a/src/manage.c b/src/manage.c index dd5eae9..d757cb4 100644 --- a/src/manage.c +++ b/src/manage.c @@ -198,33 +198,29 @@ update_normal_hints (rp_window *win) static char * get_wmname (Window w) { - Atom actual_type; - int actual_format; - int status; - unsigned long n; - unsigned long bytes_after; unsigned char *name = NULL; char *ret; - - status = XGetWindowProperty (dpy, w, wm_name, 0L, 100L, False, - XA_STRING, &actual_type, &actual_format, - &n, &bytes_after, &name); - - PRINT_DEBUG (("XGetWindowProperty: %d %ld %d %ld %ld '%s'\n", status, actual_type, - actual_format, n, bytes_after, name)); - - if (status != Success || name == NULL) - { - PRINT_DEBUG (("I can't get the WMName.\n")); - return NULL; - } - - if (n == 0) - { - PRINT_DEBUG (("I can't get the WMName.\n")); - XFree (name); - return NULL; - } + XTextProperty text_prop; + int n; + char** cl; + + if (XGetWMName(dpy, w, &text_prop) != 0) { + if (text_prop.encoding == XA_STRING) { + name = (char *)text_prop.value; + } else { + XmbTextPropertyToTextList(dpy, &text_prop, &cl, &n); + if (cl) { + name = strdup(cl[0]); + XFreeStringList(cl); + } else { + PRINT_DEBUG (("I can't get the WMName.\n")); + return NULL; + } + } + } else { + PRINT_DEBUG (("I can't get the WMName.\n")); + return NULL; + } PRINT_DEBUG (("WM_NAME: '%s'\n", name)); diff --git a/src/ratpoison.h b/src/ratpoison.h index 614abc5..1825eca 100644 --- a/src/ratpoison.h +++ b/src/ratpoison.h @@ -32,6 +32,7 @@ #include <string.h> #include <X11/Xlib.h> #include <X11/Xatom.h> +#include <X11/Xlocale.h> #include <fcntl.h> /* Some systems don't define the close-on-exec flag in fcntl.h */ @@ -106,5 +107,8 @@ int str_comp (char *s1, char *s2, int len); void check_child_procs (); void chld_handler (int signum); void set_sig_handler (int sig, void (*action)(int)); +/* Font functions. */ +void set_extents_of_fontset (XFontSet font); +XFontSet load_query_font_set (Display *disp, const char *fontset_name); #endif /* ! _RATPOISON_H */ diff --git a/src/screen.c b/src/screen.c index e4cc8d3..7d2fc6e 100644 --- a/src/screen.c +++ b/src/screen.c @@ -308,10 +308,9 @@ init_screen (rp_screen *s, int screen_num) gv.function = GXcopy; gv.line_width = 1; gv.subwindow_mode = IncludeInferiors; - gv.font = defaults.font->fid; s->normal_gc = XCreateGC(dpy, s->root, GCForeground | GCBackground | GCFunction - | GCLineWidth | GCSubwindowMode | GCFont, + | GCLineWidth | GCSubwindowMode, &gv); /* Create the program bar window. */ diff --git a/src/split.c b/src/split.c index 109740f..a93d3a0 100644 --- a/src/split.c +++ b/src/split.c @@ -918,7 +918,7 @@ show_frame_message (char *msg) frame = current_frame(); - width = defaults.bar_x_padding * 2 + XTextWidth (defaults.font, msg, strlen (msg)); + width = defaults.bar_x_padding * 2 + XmbTextEscapement (defaults.font, msg, strlen (msg)); height = (FONT_HEIGHT (defaults.font) + defaults.bar_y_padding * 2); /* We don't want another frame indicator to be displayed on another @@ -935,10 +935,10 @@ show_frame_message (char *msg) XClearWindow (dpy, s->frame_window); XSync (dpy, False); - XDrawString (dpy, s->frame_window, s->normal_gc, - defaults.bar_x_padding, - defaults.bar_y_padding + defaults.font->max_bounds.ascent, - msg, strlen (msg)); + XmbDrawString (dpy, s->frame_window, defaults.font, s->normal_gc, + defaults.bar_x_padding, + defaults.bar_y_padding + rp_font_ascent, + msg, strlen (msg)); } rp_frame * |