Patch for utf-8 window title. Based on former opensuse patch: https://build.opensuse.org/package/view_file/DISCONTINUED:openSUSE:11.2/xpdf-poppler/xpdf-poppler-settitle.patch?expand=1 Original one relies upon setlocale(), which isn't in stock xpdf. To minimize possible impact, I don't import all suse' locale stuff, replacing it by non-intrusive check for "UTF-8" in environment variable.
Besides of this, the patch uses standard procedure to set _NET_WM_ICON_NAME(UTF8_STRING) and _NET_WM_NAME(UTF8_STRING) hints using XmbTextListToTextProperty() with XStdICCTextStyle argument.
Works for me in Jessie and Sid. sa
diff --git a/xpdf/XPDFViewer.cc b/xpdf/XPDFViewer.cc index 2de349d..7a70563 100644 --- a/xpdf/XPDFViewer.cc +++ b/xpdf/XPDFViewer.cc @@ -258,7 +258,8 @@ XPDFViewer::XPDFViewer(XPDFApp *appA, GString *fileName, outlineLabelsLength = outlineLabelsSize = 0; outlinePaneWidth = 175; #endif - + viewerTitle = NULL; + // do Motif-specific initialization and create the window; // this also creates the core object initWindow(fullScreen); @@ -318,6 +319,7 @@ XPDFViewer::XPDFViewer(XPDFApp *appA, PDFDoc *doc, int pageA, outlineLabelsLength = outlineLabelsSize = 0; outlinePaneWidth = 175; #endif + viewerTitle = NULL; // do Motif-specific initialization and create the window; // this also creates the core object @@ -409,6 +411,8 @@ void XPDFViewer::clear() { title = app->getTitle() ? app->getTitle()->getCString() : (char *)xpdfAppName; XtVaSetValues(win, XmNtitle, title, XmNiconName, title, NULL); + setTitle(title,0); + setTitle(title,1); if (toolBar != None) { @@ -2303,6 +2307,10 @@ void XPDFViewer::mapWindow() { about_height, fg, arm, depth), NULL); + if (viewerTitle) { + setTitle(viewerTitle->getCString(),0); + setTitle(viewerTitle->getCString(),1); + } } } @@ -2635,6 +2643,63 @@ void XPDFViewer::pageNumCbk(Widget widget, XtPointer ptr, XmTextFieldSetString(viewer->pageNumText, buf); } +void XPDFViewer::setTitle(char *title, int icon) { + Atom net_wm_name; + Atom net_wm_icon_name; + Atom utf8_string; + char* ev; + + ev = getenv ("LANG"); + if ((!ev) || (strcasestr (ev, "UTF-8") == NULL)) + return; + + net_wm_name = XInternAtom (display, "_NET_WM_NAME", False); + net_wm_icon_name = XInternAtom (display, "_NET_WM_ICON_NAME", False); + utf8_string = XInternAtom (display, "UTF8_STRING" ,False); + Window w; + + if (!win) return; + w = XtWindow(win); + if (!w) return; + + if (icon) { + XSetWMIconName (display, w, char_to_xtp (display,title)); + XChangeProperty (display, w, net_wm_icon_name, utf8_string, 8, + PropModeReplace, (unsigned char *)title, + strlen (title)); + } else { + XSetWMName (display, w, char_to_xtp (display,title)); + XChangeProperty (display, w, net_wm_name, utf8_string, 8, + PropModeReplace, (unsigned char *)title, + strlen (title)); + } +} + +XTextProperty* XPDFViewer::char_to_xtp(Display* dpy, char* s ) { + static XTextProperty tp = { 0, 0, 0, 0 }; + static int free_prop = True; + int errCode = 0; + char* tl[2]; + if ( tp.value ) { + if ( free_prop ) { + XFree( tp.value ); + } + tp.value = 0; + free_prop = True; + } + tl[0] = s; + tl[1] = 0; + errCode = XmbTextListToTextProperty (dpy,tl, 1, XStdICCTextStyle, &tp); + if ( errCode < 0 ) { + tp.value = (unsigned char*)s; + tp.encoding = XA_STRING; + tp.format = 8; + tp.nitems = strlen (s); + free_prop = False; + } + return &tp; +} + void XPDFViewer::updateCbk(void *data, GString *fileName, int pageNum, int numPages, const char *linkString) { XPDFViewer *viewer = (XPDFViewer *)data; @@ -2645,9 +2710,14 @@ void XPDFViewer::updateCbk(void *data, GString *fileName, if (fileName) { if (!(title = viewer->app->getTitle())) { title = (new GString(xpdfAppName))->append(": ")->append(fileName); + if (viewer->viewerTitle) + delete viewer->viewerTitle; + viewer->viewerTitle = title->copy(); } XtVaSetValues(viewer->win, XmNtitle, title->getCString(), XmNiconName, title->getCString(), NULL); + viewer->setTitle(title->getCString(),0); + viewer->setTitle(title->getCString(),1); if (!viewer->app->getTitle()) { delete title; } diff --git a/xpdf/XPDFViewer.h b/xpdf/XPDFViewer.h index 8a345e8..2d3f646 100644 --- a/xpdf/XPDFViewer.h +++ b/xpdf/XPDFViewer.h @@ -290,6 +290,11 @@ private: static XPDFViewerCmd cmdTab[]; + //----- setting Window and Icon titles: + void setTitle(char *title, int icon); + XTextProperty* char_to_xtp ( Display* dpy, char* s ); + GString* viewerTitle; + XPDFApp *app; GBool ok;