Complete.Org: Mailing Lists: Archives: freeciv-dev: November 2004:
[Freeciv-Dev] (PR#11163) Xaw I18N patch
Home

[Freeciv-Dev] (PR#11163) Xaw I18N patch

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
Subject: [Freeciv-Dev] (PR#11163) Xaw I18N patch
From: "Vasco Alexandre da Silva Costa" <vasc@xxxxxxxxxxxxxx>
Date: Tue, 23 Nov 2004 12:44:17 -0800
Reply-to: rt@xxxxxxxxxxx

<URL: http://rt.freeciv.org/Ticket/Display.html?id=11163 >

The gui-xaw client doesn't work with Japanese EUC-JP or any other
multibyte charset like UTF-8. This patch adds XFontSet support, enabling
the correct display of such texts, like on gui-gtk.

Note: I got a lot of useful information for these changes from here:
http://www.debian.org/doc/manuals/intro-i18n/ch-examples.en.html

Index: client/gui-xaw/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-xaw/chatline.c,v
retrieving revision 1.24
diff -u -r1.24 chatline.c
--- client/gui-xaw/chatline.c   10 Aug 2004 01:40:32 -0000      1.24
+++ client/gui-xaw/chatline.c   23 Nov 2004 20:43:23 -0000
@@ -77,36 +77,9 @@
    *
    * Now uses window's font size and width.  Assumes fixed-width font.  --jjm
    */
-  static int m_width=0;
-
-  Dimension windowwth;
-  int maxlinelen;
   String theoutput;
   char *newout, *rmcr, *astring2 = mystrdup(astring);
 
-  if (!m_width) {
-    /* Sometimes XtVaGetValues has garbage for the XtNfont; see PR#6452.
-     * In this case it's safest if the value is initialized to NULL. */
-    XFontStruct *out_font = NULL;
-
-    XtVaGetValues(outputwindow_text, XtNfont, &out_font, NULL);
-    if (out_font)
-      m_width=XTextWidth(out_font, "M", 1);
-    else
-      m_width=10;
-  }
-
-  XtVaGetValues(outputwindow_text, XtNwidth, &windowwth, NULL);
-  maxlinelen=(windowwth/m_width)-1;
-  if (maxlinelen<32) maxlinelen=32;
-
-  freelog(LOG_DEBUG, "m_width %d windowwth %d maxlinelen %d",
-         m_width, (int)windowwth, maxlinelen);
-
-  if (strlen(astring2) > maxlinelen) {
-    wordwrap_string(astring2, maxlinelen);
-  }
-  
   XtVaGetValues(outputwindow_text, XtNstring, &theoutput, NULL);
   newout=fc_malloc(strlen(astring2)+strlen(theoutput)+2);
   sprintf(newout, "%s\n%s", theoutput, astring2);
Index: client/gui-xaw/graphics.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-xaw/graphics.c,v
retrieving revision 1.53
diff -u -r1.53 graphics.c
--- client/gui-xaw/graphics.c   27 Jul 2004 17:53:37 -0000      1.53
+++ client/gui-xaw/graphics.c   23 Nov 2004 20:43:23 -0000
@@ -93,10 +93,12 @@
   XColor face;
   int have_face;
   const char *motto = freeciv_motto();
+  XFontSetExtents *exts;
 
   /* metrics */
 
-  lin=main_font_struct->ascent+main_font_struct->descent;
+  exts = XExtentsOfFontSet(main_font_set);
+  lin = exts->max_logical_extent.height;
 
   /* get colors */
 
@@ -115,9 +117,10 @@
 
   y=intro_gfx_sprite->height-(2*lin);
 
-  w=XTextWidth(main_font_struct, motto, strlen(motto));
+  w = XmbTextEscapement(main_font_set, motto, strlen(motto));
   XSetForeground(display, font_gc, face.pixel);
-  XDrawString(display, intro_gfx_sprite->pixmap, font_gc, 
+  XmbDrawString(display, intro_gfx_sprite->pixmap,
+             main_font_set, font_gc, 
              tot/2-w/2, y, 
              motto, strlen(motto));
 
@@ -126,15 +129,18 @@
   radar_gfx_sprite=load_gfxfile(minimap_intro_filename);
   tot=radar_gfx_sprite->width;
 
-  y=radar_gfx_sprite->height-(lin+((int)(1.5*main_font_struct->descent)));
+  y = radar_gfx_sprite->height - (lin +
+      1.5 * (exts->max_logical_extent.height + exts->max_logical_extent.y));
 
-  w=XTextWidth(main_font_struct, word_version(), strlen(word_version()));
+  w = XmbTextEscapement(main_font_set, word_version(), strlen(word_version()));
   XSetForeground(display, font_gc, colors_standard[COLOR_STD_BLACK]);
-  XDrawString(display, radar_gfx_sprite->pixmap, font_gc, 
+  XmbDrawString(display, radar_gfx_sprite->pixmap,
+             main_font_set, font_gc, 
              (tot/2-w/2)+1, y+1, 
              word_version(), strlen(word_version()));
   XSetForeground(display, font_gc, colors_standard[COLOR_STD_WHITE]);
-  XDrawString(display, radar_gfx_sprite->pixmap, font_gc, 
+  XmbDrawString(display, radar_gfx_sprite->pixmap,
+             main_font_set, font_gc, 
              tot/2-w/2, y, 
              word_version(), strlen(word_version()));
 
@@ -143,12 +149,14 @@
   my_snprintf(s, sizeof(s), "%d.%d.%d%s",
              MAJOR_VERSION, MINOR_VERSION,
              PATCH_VERSION, VERSION_LABEL);
-  w=XTextWidth(main_font_struct, s, strlen(s));
+  w = XmbTextEscapement(main_font_set, s, strlen(s));
   XSetForeground(display, font_gc, colors_standard[COLOR_STD_BLACK]);
-  XDrawString(display, radar_gfx_sprite->pixmap, font_gc, 
+  XmbDrawString(display, radar_gfx_sprite->pixmap,
+             main_font_set, font_gc, 
              (tot/2-w/2)+1, y+1, s, strlen(s));
   XSetForeground(display, font_gc, colors_standard[COLOR_STD_WHITE]);
-  XDrawString(display, radar_gfx_sprite->pixmap, font_gc, 
+  XmbDrawString(display, radar_gfx_sprite->pixmap,
+             main_font_set, font_gc, 
              tot/2-w/2, y, s, strlen(s));
 
   /* free colors */
Index: client/gui-xaw/gui_main.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-xaw/gui_main.c,v
retrieving revision 1.95.2.1
diff -u -r1.95.2.1 gui_main.c
--- client/gui-xaw/gui_main.c   13 Nov 2004 09:27:23 -0000      1.95.2.1
+++ client/gui-xaw/gui_main.c   23 Nov 2004 20:43:23 -0000
@@ -175,10 +175,10 @@
 
 /* overall font GC                                    */
 GC font_gc;
-XFontStruct *main_font_struct;
+XFontSet main_font_set;
 /* productions font GC                                */
 GC prod_font_gc;
-XFontStruct *prod_font_struct;
+XFontSet prod_font_set;
 
 Widget toplevel, main_form, menu_form, below_menu_form, left_column_form;
 Widget bottom_form;
@@ -276,7 +276,7 @@
   parse_options(argc, argv);
 
   /* include later - pain to see the warning at every run */
-  /* XtSetLanguageProc(NULL, (XtLanguageProc)NULL, NULL); */
+  XtSetLanguageProc(NULL, NULL, NULL);
   
   toplevel = XtVaAppInitialize(
               &app_context,               /* Application context */
@@ -342,32 +342,55 @@
 
   {
     XGCValues values;
+    char **missing_charset_list_return;
+    int missing_charset_count_return;
+    char *def_string_return;
 
     values.graphics_exposures = False;
     civ_gc = XCreateGC(display, root_window, GCGraphicsExposures, &values);
 
-    main_font_struct=XLoadQueryFont(display, city_names_font);
-    if(main_font_struct==0) {
-      freelog(LOG_FATAL, _("Failed loading font: %s"), city_names_font);
+    free(city_names_font);
+    city_names_font = mystrdup("-*-*-*-*-*--14-*");
+
+    free(city_productions_font_name);
+    city_productions_font_name = mystrdup("-*-*-*-*-*--14-*");
+
+    main_font_set = XCreateFontSet(display, city_names_font,
+       &missing_charset_list_return,
+       &missing_charset_count_return,
+       &def_string_return);
+    if(!main_font_set) {
+      freelog(LOG_FATAL, _("Unable to open fontset: %s"),
+         city_names_font);
       exit(EXIT_FAILURE);
     }
+    for(i = 0; i < missing_charset_count_return; i++) {
+      freelog(LOG_ERROR, _("Font for charset %s is lacking"),
+         missing_charset_list_return[i]);
+    }
     values.foreground = colors_standard[COLOR_STD_WHITE];
     values.background = colors_standard[COLOR_STD_BLACK];
-    values.font = main_font_struct->fid;
     font_gc= XCreateGC(display, root_window, 
-                      GCForeground|GCBackground|GCFont|GCGraphicsExposures, 
+                      GCForeground|GCBackground|GCGraphicsExposures, 
                       &values);
 
-    prod_font_struct=XLoadQueryFont(display, city_productions_font_name);
-    if(prod_font_struct==0) {
-      freelog(LOG_FATAL, _("Failed loading font: %s"), 
city_productions_font_name);
+    prod_font_set = XCreateFontSet(display, city_productions_font_name,
+       &missing_charset_list_return,
+       &missing_charset_count_return,
+       &def_string_return);
+    if(!prod_font_set) {
+      freelog(LOG_FATAL, _("Unable to open fontset: %s"),
+         city_productions_font_name);
       exit(EXIT_FAILURE);
     }
+    for(i = 0; i < missing_charset_count_return; i++) {
+      freelog(LOG_ERROR, _("Font for charset %s is lacking"),
+         missing_charset_list_return[i]);
+    }
     values.foreground = colors_standard[COLOR_STD_WHITE];
     values.background = colors_standard[COLOR_STD_BLACK];
-    values.font = prod_font_struct->fid;
     prod_font_gc= XCreateGC(display, root_window,
-                           
GCForeground|GCBackground|GCFont|GCGraphicsExposures,
+                           GCForeground|GCBackground|GCGraphicsExposures,
                            &values);
 
     values.line_width = BORDER_WIDTH;
Index: client/gui-xaw/gui_main.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-xaw/gui_main.h,v
retrieving revision 1.14
diff -u -r1.14 gui_main.h
--- client/gui-xaw/gui_main.h   8 Mar 2004 02:24:35 -0000       1.14
+++ client/gui-xaw/gui_main.h   23 Nov 2004 20:43:23 -0000
@@ -56,8 +56,8 @@
 extern Window       root_window;
 extern Widget       inputline_text;
 extern Widget       outputwindow_text;
-extern XFontStruct *main_font_struct;
-extern XFontStruct *prod_font_struct;
+extern XFontSet     main_font_set;
+extern XFontSet     prod_font_set;
 extern XtAppContext app_context;
 
 #endif  /* FC__GUI_MAIN_H */
Index: client/gui-xaw/mapview.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-xaw/mapview.c,v
retrieving revision 1.182.2.3
diff -u -r1.182.2.3 mapview.c
--- client/gui-xaw/mapview.c    17 Nov 2004 19:26:53 -0000      1.182.2.3
+++ client/gui-xaw/mapview.c    23 Nov 2004 20:43:24 -0000
@@ -667,20 +667,22 @@
 Draw at x = left of string, y = top of string.
 **************************************************************************/
 static void draw_shadowed_string(struct canvas *pcanvas,
-                                XFontStruct * font, GC font_gc,
+                                XFontSet fontset, GC font_gc,
                                 enum color_std foreground,
                                 enum color_std shadow,
                                 int x, int y, const char *string)
 {
   size_t len = strlen(string);
 
-  y += font->ascent;
+  y -= XExtentsOfFontSet(fontset)->max_logical_extent.y;
 
   XSetForeground(display, font_gc, colors_standard[shadow]);
-  XDrawString(display, pcanvas->pixmap, font_gc, x + 1, y + 1, string, len);
+  XmbDrawString(display, pcanvas->pixmap, fontset, font_gc,
+      x + 1, y + 1, string, len);
 
   XSetForeground(display, font_gc, colors_standard[foreground]);
-  XDrawString(display, pcanvas->pixmap, font_gc, x, y, string, len);
+  XmbDrawString(display, pcanvas->pixmap, fontset, font_gc,
+      x, y, string, len);
 }
 
 /****************************************************************************
@@ -701,6 +703,8 @@
   char buffer[512], buffer2[512];
   enum color_std color;
   int w, w2;
+  XFontSetExtents *main_exts = XExtentsOfFontSet(main_font_set);
+  XFontSetExtents *prod_exts = XExtentsOfFontSet(prod_font_set);
 
   canvas_x += NORMAL_TILE_WIDTH / 2;
   canvas_y += NORMAL_TILE_HEIGHT;
@@ -708,41 +712,41 @@
   get_city_mapview_name_and_growth(pcity, buffer, sizeof(buffer),
                                   buffer2, sizeof(buffer2), &color);
 
-  w = XTextWidth(main_font_struct, buffer, strlen(buffer));
+  w = XmbTextEscapement(main_font_set, buffer, strlen(buffer));
   if (buffer2[0] != '\0') {
     /* HACK: put a character's worth of space between the two strings. */
-    w += XTextWidth(main_font_struct, "M", 1);
+    w += XmbTextEscapement(main_font_set, "M", 1);
   }
-  w2 = XTextWidth(main_font_struct, buffer2, strlen(buffer2));
+  w2 = XmbTextEscapement(main_font_set, buffer2, strlen(buffer2));
 
-  draw_shadowed_string(pcanvas, main_font_struct, font_gc,
+  draw_shadowed_string(pcanvas, main_font_set, font_gc,
                       COLOR_STD_WHITE, COLOR_STD_BLACK,
                       canvas_x - (w + w2) / 2,
                       canvas_y, buffer);
 
-  draw_shadowed_string(pcanvas, prod_font_struct, prod_font_gc, color,
+  draw_shadowed_string(pcanvas, prod_font_set, prod_font_gc, color,
                       COLOR_STD_BLACK,
                       canvas_x - (w + w2) / 2 + w,
                       canvas_y, buffer2);
 
   *width = w + w2;
-  *height = main_font_struct->ascent + main_font_struct->descent;
+  *height = main_exts->max_logical_extent.height;
 
   if (draw_city_productions && (pcity->owner == game.player_idx)) {
     if (draw_city_names) {
-      canvas_y += main_font_struct->ascent + main_font_struct->descent;
+      canvas_y += main_exts->max_logical_extent.height;
     }
 
     get_city_mapview_production(pcity, buffer, sizeof(buffer));
-    w = XTextWidth(prod_font_struct, buffer, strlen(buffer));
+    w = XmbTextEscapement(prod_font_set, buffer, strlen(buffer));
 
-    draw_shadowed_string(pcanvas, prod_font_struct, prod_font_gc,
+    draw_shadowed_string(pcanvas, prod_font_set, prod_font_gc,
                         COLOR_STD_WHITE, COLOR_STD_BLACK,
                         canvas_x - w / 2,
                         canvas_y, buffer);
 
     *width = MAX(*width, w);
-    *height += prod_font_struct->ascent + prod_font_struct->descent;
+    *height += prod_exts->max_logical_extent.height;
   }
 }
 

[Prev in Thread] Current Thread [Next in Thread]
  • [Freeciv-Dev] (PR#11163) Xaw I18N patch, Vasco Alexandre da Silva Costa <=