Bugfix for #9 Cut off fonts in titles
authorEugene Doudine <dudinea@gmail.com>
Mon, 17 Feb 2014 22:12:19 +0000 (00:12 +0200)
committerJon Trulson <jon@radscan.com>
Tue, 18 Feb 2014 07:24:35 +0000 (00:24 -0700)
cde/programs/dtwm/WmResource.c

index a92d8aa8d27635322839515100d9c46892685784..59eaa0fb4a6ca38e3858543bbbdf6065d52ba7c5 100644 (file)
@@ -4391,6 +4391,70 @@ ProcessAppearanceResources (WmScreenData *pSD)
 
 } /* END OF FUNCTION ProcessAppearanceResources */
 
+
+\f
+/*************************************<->*************************************
+ *
+ *  FallbackMakeTitleHeight (pAData)
+ *
+ *
+ *  Description:
+ *  -----------
+ *  This function makes title hight for AppearanceData
+ *  (using XExtentsOfFontSet on pAData->fontList)
+ *
+ *  Inputs:
+ *  ------
+ *
+ *  pAData = pointer to appearance data structure containing resource info
+ *
+ *
+ *  Outputs:
+ *  -------
+ *  *pAData - pAData->titleHeight is updated
+ *  return = 1 on success, 0 on failure (pAData->titleHeight is intact)
+ *
+ *************************************<->***********************************/
+
+int
+FallbackMakeTitleHeight (AppearanceData *pAData) {
+  XmFontContext       fc;
+  XmFontType          type;
+  XmFontListEntry     entry;
+  XtPointer           pFont;
+  XFontSetExtents     *pExtents;
+  int                 result = 0;
+
+  XmFontListInitFontContext ( &fc, pAData->fontList);
+  pAData->titleHeight = 0;
+  entry = XmFontListNextEntry (fc);
+  while (entry)
+  {
+    pFont = XmFontListEntryGetFont (entry, &type);
+    switch (type)
+    {
+    case XmFONT_IS_FONT:
+      /* does not really happen since XmeRenderTableGetDefaultFont
+        seems to fail only on fontsets */
+      break;
+    case XmFONT_IS_FONTSET:
+      if (!(pExtents = XExtentsOfFontSet ((XFontSet) pFont))) {
+       break;
+      }
+      if (WM_TITLE_BAR_PADDING + pExtents->max_logical_extent.height > pAData->titleHeight) {
+       pAData->titleHeight = WM_TITLE_BAR_PADDING + pExtents->max_logical_extent.height;
+       result = 1;
+      }
+      break;
+    default:
+      break;
+    }
+    entry = XmFontListNextEntry (fc);
+  }
+  XmFontListFreeFontContext (fc);
+  return result;
+}
+
 \f
 /*************************************<->*************************************
  *
@@ -4433,24 +4497,35 @@ MakeAppearanceResources (WmScreenData *pSD, AppearanceData *pAData, Boolean make
        Warning((char *)wmGD.tmpBuffer);
 #if defined(CSRG_BASED) || defined(linux)
        /* HACK to try get _some_ font anyway (fontList seems to end up as an empty list on
-         * some modern systems; investigate) */
-        pAData->font = XLoadQueryFont(wmGD.display, "fixed");
-       if (pAData->font == NULL) {
-           ExitWM(WM_ERROR_EXIT_VALUE);
+        * some modern systems; investigate) */
+       pAData->font = XLoadQueryFont(wmGD.display, "fixed");
+       if (pAData->font == NULL)
+       {
+         ExitWM(WM_ERROR_EXIT_VALUE);
+       }
+       /* try to get right title hight using XExtentsOfFontSet: on UTF-8
+        * locales XmeRenderTableGetDefaultFont does not return anything
+        * when font is a compound fontset*/
+       if (!FallbackMakeTitleHeight(pAData))
+       {
+         /* failed to get height from fontList - falling back to fixed */
+         pAData->titleHeight = (pAData->font)->ascent + (pAData->font)->descent
+           + WM_TITLE_BAR_PADDING;
        }
 #else
        ExitWM(WM_ERROR_EXIT_VALUE);
 #endif
-
-    }
-
+    } else {
+       /* got default font successfully, hack was not needed */
 #ifndef NO_MULTIBYTE
-    /*
-     *  Calculate title bar's height and store it in pAData.
-     */
-    pAData->titleHeight = (pAData->font)->ascent + (pAData->font)->descent
-        + WM_TITLE_BAR_PADDING;
+       /*
+        *  Calculate title bar's height (using selected font) and store it in pAData.
+        */
+       pAData->titleHeight = (pAData->font)->ascent + (pAData->font)->descent
+       + WM_TITLE_BAR_PADDING;
 #endif
+    }
+
 
 
     /*