Implement (clock-)font handling in GTK
authorH.G. Muller <h.g.muller@hccnet.nl>
Sun, 2 Mar 2014 22:10:50 +0000 (23:10 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 2 Mar 2014 22:10:50 +0000 (23:10 +0100)
The options -clockFont, -coordFont and -messageFont are activated,
and supposed to have string values like "Sans Bold 12". The default
values have the point size as 'wild-card' %d, however "Sans Bold %d",
and are expanded by a printf with the point size taken from the defaults
table. The expanded versions are saved back into the settings file,
prefixed with a size tag, as usual.
 So far -clockFont is the only font that is actually applied while
writing.
 The 'clock kludge' was interfering with the initial sizing, as for some
sizes the initial clock-widget height happened to be equal to the final
height. It was therefore abandoned, and we seem to be able to live without
it.
 Sizes smaller than 49 were dominated (for 8-wide boards) by the menu bar.
Therefore tinyLayout now uses single-letter menu labels.

gtk/xboard.c
gtk/xboard.h
gtk/xoptions.c

index 23e8951..76cd57d 100644 (file)
@@ -384,7 +384,8 @@ ParseFont (char *name, int number)
   if(sscanf(name, "size%d:", &size)) {
     // [HGM] font: font is meant for specific boardSize (likely from settings file);
     //       defer processing it until we know if it matches our board size
-    if(size >= 0 && size<MAX_SIZE) { // for now, fixed limit
+    if(!strstr(name, "-*-") &&       // ignore X-fonts
+       size >= 0 && size<MAX_SIZE) { // for now, fixed limit
        fontTable[number][size] = strdup(strchr(name, ':')+1);
        fontValid[number][size] = True;
     }
@@ -599,7 +600,7 @@ void
 ResizeBoardWindow (int w, int h, int inhibit)
 {
     GtkAllocation a;
-    if(clockKludge) return; // ignore as long as clock does not have final height
+//    if(clockKludge) return; // ignore as long as clock does not have final height
     gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
     w += marginW + 1; // [HGM] not sure why the +1 is (sometimes) needed...
     h += marginH + a.height + 1;
@@ -615,6 +616,18 @@ MakeColors ()
 void
 InitializeFonts (int clockFontPxlSize, int coordFontPxlSize, int fontPxlSize)
 {   // determine what fonts to use, and create them
+
+    if(!fontIsSet[CLOCK_FONT] && fontValid[CLOCK_FONT][squareSize])
+       appData.clockFont = fontTable[CLOCK_FONT][squareSize];
+    if(!fontIsSet[MESSAGE_FONT] && fontValid[MESSAGE_FONT][squareSize])
+       appData.font = fontTable[MESSAGE_FONT][squareSize];
+    if(!fontIsSet[COORD_FONT] && fontValid[COORD_FONT][squareSize])
+       appData.coordFont = fontTable[COORD_FONT][squareSize];
+
+    appData.font = InsertPxlSize(appData.font, fontPxlSize);
+    appData.clockFont = InsertPxlSize(appData.clockFont, clockFontPxlSize);
+    appData.coordFont = InsertPxlSize(appData.coordFont, coordFontPxlSize);
+
 #ifdef TODO_GTK
     XrmValue vTo;
     XrmDatabase xdb;
@@ -987,9 +1000,7 @@ main (int argc, char **argv)
     /*
      * Determine what fonts to use.
      */
-#ifdef TODO_GTK
-    InitializeFonts(clockFontPxlSize, coordFontPxlSize, fontPxlSize);
-#endif
+    InitializeFonts((2*clockFontPxlSize+1)/3, coordFontPxlSize, fontPxlSize);
 
     /*
      * Detect if there are not enough colors available and adapt.
@@ -1216,7 +1227,16 @@ CmailSigHandlerCallBack (InputSourceRef isr, VOIDSTAR closure, char *message, in
 
 #define Abs(n) ((n)<0 ? -(n) : (n))
 
+char *
+InsertPxlSize (char *pattern, int targetPxlSize)
+{
+    char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, pattern, targetPxlSize); // pattern is something like "Sans Bold %d"
+    return strdup(buf);
+}
+
 #ifdef ENABLE_NLS
+#ifdef TODO_GTK
 char *
 InsertPxlSize (char *pattern, int targetPxlSize)
 {
@@ -1267,6 +1287,7 @@ InsertPxlSize (char *pattern, int targetPxlSize)
 
     return base_fnt_lst;
 }
+#endif
 
 #ifdef TODO_GTK
 XFontSet
@@ -1533,11 +1554,7 @@ ReSize (WindowPlacement *wp)
        int sqx, sqy, w, h, hc, lg = lineGap;
        gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
        hc = a.height; // clock height can depend on single / double line clock text!
-        if(clockKludge == a.height) return; // wait for clock to get final size at startup
-       if(clockKludge) { // clock height OK now; calculate desired initial board height
-           clockKludge = 0;
-           wp->height = BOARD_HEIGHT * (squareSize + lineGap) + lineGap + marginH + hc;
-       }
+       wp->height = BOARD_HEIGHT * (squareSize + lineGap) + lineGap + marginH + hc;
        if(wp->width == wpMain.width && wp->height == wpMain.height) return; // not sized
        sqx = (wp->width  - lg - marginW) / BOARD_WIDTH - lg;
        sqy = (wp->height - lg - marginH - hc) / BOARD_HEIGHT - lg;
@@ -1920,11 +1937,15 @@ DisplayTimerLabel (Option *opt, char *color, long timer, int highlight)
     gtk_widget_modify_bg(gtk_widget_get_parent(opt->handle), GTK_STATE_NORMAL, &col);
 
     if (appData.clockMode) {
-        markup = g_markup_printf_escaped("<span size=\"xx-large\" weight=\"heavy\" background=\"%s\" foreground=\"%s\">%s:%s%s</span>",
+        markup = g_markup_printf_escaped("<span font=\"%s\" background=\"%s\" foreground=\"%s\">%s:%s%s</span>", appData.clockFont,
                                         bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer));
+//        markup = g_markup_printf_escaped("<span size=\"xx-large\" weight=\"heavy\" background=\"%s\" foreground=\"%s\">%s:%s%s</span>",
+//                                      bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer));
     } else {
-        markup = g_markup_printf_escaped("<span size=\"xx-large\" weight=\"heavy\" background=\"%s\" foreground=\"%s\">%s  </span>",
+        markup = g_markup_printf_escaped("<span font=\"%s\" background=\"%s\" foreground=\"%s\">%s  </span>", appData.clockFont,
                                         bgcolor, fgcolor, color);
+//        markup = g_markup_printf_escaped("<span size=\"xx-large\" weight=\"heavy\" background=\"%s\" foreground=\"%s\">%s  </span>",
+//                                      bgcolor, fgcolor, color);
     }
     gtk_label_set_markup(GTK_LABEL(w), markup);
     g_free(markup);
index ca8968e..89dcaf7 100644 (file)
 
 #define ICS_LOGON    ".icsrc"
 #define MANPAGE      "xboard.6"
-#if ENABLE_NLS
-#define CLOCK_FONT_NAME \
-  "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*," \
-  "-misc-fixed-bold-r-normal--*-*-*-*-*-*-*-*," \
-  "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
-#define COORD_FONT_NAME \
-  "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*," \
-  "-misc-fixed-bold-r-normal--*-*-*-*-*-*-*-*," \
-  "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
-#define DEFAULT_FONT_NAME \
-  "-*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*," \
-  "-misc-fixed-medium-r-normal--*-*-*-*-*-*-*-*," \
-  "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
-#else
-#define CLOCK_FONT_NAME         "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*"
-#define COORD_FONT_NAME         "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*"
-#define DEFAULT_FONT_NAME       "-*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*"
-#endif
+#define CLOCK_FONT_NAME         "Sans Bold %d"
+#define COORD_FONT_NAME         "Sans Bold %d"
+#define DEFAULT_FONT_NAME       "Sans Normal %d"
 #define COLOR_SHOUT             "green"
 #define COLOR_SSHOUT            "green,black,1"
 #define COLOR_CHANNEL1          "cyan"
@@ -107,11 +92,11 @@ typedef struct {
   { "Moderate", 58, 3, 34, 12, 14, 1, 0, 768 }, \
   { "Average",  54, 2, 30, 11, 12, 1, 0, 600 }, \
   { "Middling", 49, 2, 24, 10, 12, 1, 0, 600 }, \
-  { "Mediocre", 45, 2, 20, 10, 12, 1, 0, 600 }, \
-  { "Small",    40, 2, 20, 10, 12, 1, 0, 480 }, \
-  { "Slim",     37, 2, 20, 10, 12, 1, 0, 480 }, \
-  { "Petite",   33, 1, 15, 9,  11, 1, 0, 480 }, \
-  { "Dinky",    29, 1, 15, 9,  11, 1, 0, 480 }, \
+  { "Mediocre", 45, 2, 20, 10, 12, 1, 1, 600 }, \
+  { "Small",    40, 2, 20, 10, 12, 1, 1, 480 }, \
+  { "Slim",     37, 2, 20, 10, 12, 1, 1, 480 }, \
+  { "Petite",   33, 1, 15, 9,  11, 1, 1, 480 }, \
+  { "Dinky",    29, 1, 15, 9,  11, 1, 1, 480 }, \
   { "Teeny",    25, 1, 12, 8,  11, 1, 1, 480 }, \
   { "Tiny",     21, 1, 12, 8,  11, 1, 1, 0 }, \
   {   NULL,      0, 0,  0, 0,   0, 0, 0, 0 } }
index 46b10ba..c089c9e 100644 (file)
@@ -1549,6 +1549,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
          case DropDown:
            top--;
            msg = _(option[i].name); // write name on the menu button
+           if(tinyLayout) { strncpy(def, msg, 1); msg = def; }
 //         XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name));  j++;
 //         XtSetArg(args[j], XtNlabel, msg);  j++;
            option[i].handle = (void*)