commit 358efb965c18e850c1dd26a2a6e13384bad87573
parent d85add3a4c3434b51b822b416cfb963c6f878037
Author: falkTX <falktx@falktx.com>
Date: Sat, 14 Aug 2021 23:04:30 +0100
Add preliminar high-dpi support to sofd; Fix build
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
6 files changed, 132 insertions(+), 92 deletions(-)
diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp
@@ -545,7 +545,7 @@ bool Window::PrivateData::openFileBrowser(const Window::FileBrowserOptions& opti
# ifdef HAVE_X11
uint flags = 0x0;
// TODO flags
- return sofdFileDialogShow(view, startDir, title, flags, options.width, options.height);
+ return sofdFileDialogShow(view, startDir, title, flags, autoScaling ? autoScaleFactor : scaleFactor);
# endif
return false;
diff --git a/dgl/src/pugl.cpp b/dgl/src/pugl.cpp
@@ -539,7 +539,7 @@ static char* sofd_filename;
bool sofdFileDialogShow(PuglView* const view,
const char* const startDir, const char* const title,
- const uint flags, const uint width, const uint height)
+ const uint flags, const double scaleFactor)
{
// only one possible at a time
DISTRHO_SAFE_ASSERT_RETURN(sofd_display == nullptr, false);
@@ -556,7 +556,7 @@ bool sofdFileDialogShow(PuglView* const view,
x_fib_cfg_buttons(2, options.buttons.showPlaces-1);
*/
- return (x_fib_show(sofd_display, view->impl->win, width, height) == 0);
+ return (x_fib_show(sofd_display, view->impl->win, 0, 0, scaleFactor) == 0);
}
// --------------------------------------------------------------------------------------------------------------------
diff --git a/dgl/src/pugl.hpp b/dgl/src/pugl.hpp
@@ -126,7 +126,7 @@ puglX11GrabFocus(PuglView* view);
// X11 specific, show file dialog via sofd
PUGL_API bool
-sofdFileDialogShow(PuglView* view, const char* startDir, const char* title, uint flags, uint width, uint height);
+sofdFileDialogShow(PuglView* view, const char* startDir, const char* title, uint flags, double scaleFactor);
// X11 specific, idle sofd file dialog, returns true if dialog was closed (with or without a file selection)
PUGL_API bool
diff --git a/dgl/src/sofd/libsofd.c b/dgl/src/sofd/libsofd.c
@@ -365,6 +365,7 @@ static int _fib_width = 100;
static int _fib_height = 100;
static int _btn_w = 0;
static int _btn_span = 0;
+static double _scalefactor = 1;
static int _fib_font_height = 0;
static int _fib_dir_indent = 0;
@@ -470,7 +471,7 @@ static int (*_fib_filter_function)(const char *filename);
#define PATHBTNTOP _fib_font_vsep //px; offset by (_fib_font_ascent);
#define FAREAMRGB 3 //px; base L+R margin
#define FAREAMRGR (FAREAMRGB + 1) //px; right margin of file-area + 1 (line width)
-#define FAREAMRGL (_fib_show_places ? PLACESW + FAREAMRGB : FAREAMRGB) //px; left margin of file-area
+#define FAREAMRGL (_fib_show_places ? PLACESW / _scalefactor + FAREAMRGB : FAREAMRGB) //px; left margin of file-area
#define TEXTSEP 4 //px;
#define FAREATEXTL (FAREAMRGL + TEXTSEP) //px; filename text-left FAREAMRGL + TEXTSEP
#define SORTBTNOFF -10 //px;
@@ -563,11 +564,11 @@ static void fib_expose (Display *dpy, Window realwin) {
// Top Row: dirs and up navigation
int ppw = 0;
- int ppx = FAREAMRGB;
+ int ppx = FAREAMRGB * _scalefactor;
for (i = _pathparts - 1; i >= 0; --i) {
- ppw += _pathbtn[i].xw + PSEP;
- if (ppw >= _fib_width - PSEP - _pathbtn[0].xw - FAREAMRGB) break; // XXX, first change is from "/" to "<", NOOP
+ ppw += _pathbtn[i].xw + PSEP * _scalefactor;
+ if (ppw >= _fib_width - PSEP * _scalefactor - _pathbtn[0].xw - FAREAMRGB * _scalefactor) break; // XXX, first change is from "/" to "<", NOOP
}
++i;
// border-less "<" parent/up, IFF space is limited
@@ -578,7 +579,7 @@ static void fib_expose (Display *dpy, Window realwin) {
XSetForeground (dpy, _fib_gc, blackColor);
}
XDrawString (dpy, win, _fib_gc, ppx, PATHBTNTOP, "<", 1);
- ppx += _pathbtn[0].xw + PSEP;
+ ppx += _pathbtn[0].xw + PSEP * _scalefactor;
if (i == _pathparts) --i;
}
@@ -599,29 +600,29 @@ static void fib_expose (Display *dpy, Window realwin) {
XDrawString (dpy, win, _fib_gc, ppx + 1 + BTNPADDING, PATHBTNTOP,
_pathbtn[i].name, strlen (_pathbtn[i].name));
_pathbtn[i].x0 = ppx; // current position
- ppx += _pathbtn[i].xw + PSEP;
+ ppx += _pathbtn[i].xw + PSEP * _scalefactor;
++i;
}
// middle, scroll list of file names
const int ltop = LISTTOP * _fib_font_vsep;
const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep;
- const int fsel_height = 4 + llen * _fib_font_vsep;
- const int fsel_width = _fib_width - FAREAMRGL - FAREAMRGR - (llen < _dircount ? SCROLLBARW : 0);
- const int t_x = FAREATEXTL;
- int t_s = FAREATEXTL + fsel_width;
- int t_t = FAREATEXTL + fsel_width;
+ const int fsel_height = 4 * _scalefactor + llen * _fib_font_vsep;
+ const int fsel_width = _fib_width - (FAREAMRGL + FAREAMRGR) * _scalefactor - (llen < _dircount ? SCROLLBARW * _scalefactor : 0);
+ const int t_x = FAREATEXTL * _scalefactor;
+ int t_s = FAREATEXTL * _scalefactor + fsel_width;
+ int t_t = FAREATEXTL * _scalefactor + fsel_width;
// check which colums can be visible
// depending on available width of window.
_columns = 0;
if (fsel_width > FILECOLUMN + _fib_font_size_width + _fib_font_time_width) {
_columns |= 2;
- t_s = FAREAMRGL + fsel_width - _fib_font_time_width - TEXTSEP;
+ t_s = FAREAMRGL * _scalefactor + fsel_width - _fib_font_time_width - TEXTSEP * _scalefactor;
}
if (fsel_width > FILECOLUMN + _fib_font_size_width) {
_columns |= 1;
- t_t = t_s - _fib_font_size_width - TEXTSEP;
+ t_t = t_s - _fib_font_size_width - TEXTSEP * _scalefactor;
}
int fstop = _scrl_f; // first entry in scroll position
@@ -634,46 +635,62 @@ static void fib_expose (Display *dpy, Window realwin) {
// list header
XSetForeground (dpy, _fib_gc, _c_gray3.pixel);
- XFillRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop - _fib_font_vsep, fsel_width, _fib_font_vsep);
+ XFillRectangle (dpy, win, _fib_gc, FAREAMRGL * _scalefactor, ltop - _fib_font_vsep, fsel_width, _fib_font_vsep);
// draw background of file list
XSetForeground (dpy, _fib_gc, _c_gray2.pixel);
- XFillRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop, fsel_width, fsel_height);
+ XFillRectangle (dpy, win, _fib_gc, FAREAMRGL * _scalefactor, ltop, fsel_width, fsel_height);
#ifdef DRAW_OUTLINE
- VDrawRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop - _fib_font_vsep -1, _fib_width - FAREAMRGL - FAREAMRGR, fsel_height + _fib_font_vsep + 1);
+ VDrawRectangle (dpy, win, _fib_gc,
+ FAREAMRGL * _scalefactor,
+ ltop - _fib_font_vsep - 1,
+ _fib_width - (FAREAMRGL + FAREAMRGR) * _scalefactor,
+ fsel_height + _fib_font_vsep + 1);
#endif
switch (_hov_h) {
case 1:
XSetForeground (dpy, _fib_gc, _c_gray0.pixel);
- XFillRectangle (dpy, win, _fib_gc, t_x + _fib_dir_indent - TEXTSEP + 1, ltop - _fib_font_vsep, t_t - t_x - _fib_dir_indent - 1, _fib_font_vsep);
+ XFillRectangle (dpy, win, _fib_gc,
+ t_x + _fib_dir_indent - (TEXTSEP - 1) * _scalefactor,
+ ltop - _fib_font_vsep,
+ t_t - t_x - _fib_dir_indent - 1 * _scalefactor,
+ _fib_font_vsep);
break;
case 2:
XSetForeground (dpy, _fib_gc, _c_gray0.pixel);
- XFillRectangle (dpy, win, _fib_gc, t_t - TEXTSEP + 1, ltop - _fib_font_vsep, _fib_font_size_width + TEXTSEP - 1, _fib_font_vsep);
+ XFillRectangle (dpy, win, _fib_gc,
+ t_t - (TEXTSEP - 1) * _scalefactor,
+ ltop - _fib_font_vsep,
+ _fib_font_size_width + (TEXTSEP - 1) * _scalefactor,
+ _fib_font_vsep);
break;
case 3:
XSetForeground (dpy, _fib_gc, _c_gray0.pixel);
- XFillRectangle (dpy, win, _fib_gc, t_s - TEXTSEP + 1, ltop - _fib_font_vsep, TEXTSEP + TEXTSEP + _fib_font_time_width - 1, _fib_font_vsep);
+ XFillRectangle (dpy, win, _fib_gc,
+ t_s - (TEXTSEP - 1) * _scalefactor,
+ ltop - _fib_font_vsep,
+ TEXTSEP * 2 * _scalefactor + _fib_font_time_width - 1 * _scalefactor,
+ _fib_font_vsep);
break;
default:
break;
}
// column headings and sort order
- int arp = MAX (2, _fib_font_height / 5); // arrow scale
- const int trioff = _fib_font_height - _fib_font_ascent - arp + 1;
- XPoint ptri[4] = { {0, ttop - trioff }, {arp, -arp - arp - 1}, {-arp - arp, 0}, {arp, arp + arp + 1}};
+ int arp = MAX (2 * _scalefactor, _fib_font_height / 5); // arrow scale
+ const int trioff = _fib_font_height - _fib_font_ascent - arp + 1 * _scalefactor;
+ XPoint ptri[4] = { {0, ttop - trioff }, {arp, -arp - arp - 1 * _scalefactor}, {-arp - arp, 0}, {arp, arp + arp + 1 * _scalefactor}};
if (_sort & 1) {
- ptri[0].y = ttop -arp - arp - 1;
- ptri[1].y *= -1;
- ptri[3].y *= -1;
+ ptri[0].y = ttop -arp - arp - 1 * _scalefactor;
+ ptri[1].y *= -1 * _scalefactor;
+ ptri[3].y *= -1 * _scalefactor;
}
switch (_sort) {
case 0:
case 1:
- ptri[0].x = t_t + SORTBTNOFF + 2 - arp;
+ ptri[0].x = t_t + (SORTBTNOFF + 2) * _scalefactor - arp;
XSetForeground (dpy, _fib_gc, _c_gray6.pixel);
XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious);
XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious);
@@ -681,7 +698,7 @@ static void fib_expose (Display *dpy, Window realwin) {
case 2:
case 3:
if (_columns & 1) {
- ptri[0].x = t_s + SORTBTNOFF + 2 - arp;
+ ptri[0].x = t_s + (SORTBTNOFF + 2) * _scalefactor - arp;
XSetForeground (dpy, _fib_gc, _c_gray6.pixel);
XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious);
XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious);
@@ -690,7 +707,7 @@ static void fib_expose (Display *dpy, Window realwin) {
case 4:
case 5:
if (_columns & 2) {
- ptri[0].x = FAREATEXTL + fsel_width + SORTBTNOFF + 2 - arp;
+ ptri[0].x = FAREATEXTL * _scalefactor + fsel_width + (SORTBTNOFF + 2) * _scalefactor - arp;
XSetForeground (dpy, _fib_gc, _c_gray6.pixel);
XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious);
XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious);
@@ -709,8 +726,8 @@ static void fib_expose (Display *dpy, Window realwin) {
XSetForeground (dpy, _fib_gc, _c_gray4.pixel);
XDrawLine (dpy, win, _fib_gc,
- t_x + _fib_dir_indent - TEXTSEP, ltop - _fib_font_vsep + 3,
- t_x + _fib_dir_indent - TEXTSEP, ltop - 3);
+ t_x + _fib_dir_indent - TEXTSEP * _scalefactor, ltop - _fib_font_vsep + 3 * _scalefactor,
+ t_x + _fib_dir_indent - TEXTSEP * _scalefactor, ltop - 3 * _scalefactor);
XSetForeground (dpy, _fib_gc, blackColor);
XDrawString (dpy, win, _fib_gc, t_x + _fib_dir_indent, ttop, "Name", 4);
@@ -718,8 +735,8 @@ static void fib_expose (Display *dpy, Window realwin) {
if (_columns & 1) {
XSetForeground (dpy, _fib_gc, _c_gray4.pixel);
XDrawLine (dpy, win, _fib_gc,
- t_t - TEXTSEP, ltop - _fib_font_vsep + 3,
- t_t - TEXTSEP, ltop - 3);
+ t_t - TEXTSEP * _scalefactor, ltop - _fib_font_vsep + 3 * _scalefactor,
+ t_t - TEXTSEP * _scalefactor, ltop - 3 * _scalefactor);
XSetForeground (dpy, _fib_gc, blackColor);
XDrawString (dpy, win, _fib_gc, t_t, ttop, "Size", 4);
}
@@ -727,8 +744,8 @@ static void fib_expose (Display *dpy, Window realwin) {
if (_columns & 2) {
XSetForeground (dpy, _fib_gc, _c_gray4.pixel);
XDrawLine (dpy, win, _fib_gc,
- t_s - TEXTSEP, ltop - _fib_font_vsep + 3,
- t_s - TEXTSEP, ltop - 3);
+ t_s - TEXTSEP * _scalefactor, ltop - _fib_font_vsep + 3 * _scalefactor,
+ t_s - TEXTSEP * _scalefactor, ltop - 3 * _scalefactor);
XSetForeground (dpy, _fib_gc, blackColor);
if (_pathparts > 0)
XDrawString (dpy, win, _fib_gc, t_s, ttop, "Last Modified", 13);
@@ -738,7 +755,7 @@ static void fib_expose (Display *dpy, Window realwin) {
// scrollbar sep
if (llen < _dircount) {
- const int sx0 = _fib_width - SCROLLBARW - FAREAMRGR;
+ const int sx0 = _fib_width - (SCROLLBARW + FAREAMRGR) * _scalefactor;
XSetForeground (dpy, _fib_gc, _c_gray4.pixel);
XDrawLine (dpy, win, _fib_gc,
sx0 - 1, ltop - _fib_font_vsep,
@@ -751,7 +768,8 @@ static void fib_expose (Display *dpy, Window realwin) {
}
// clip area for file-name
- XRectangle clp = {FAREAMRGL + 1, ltop, t_t - FAREAMRGL - TEXTSEP - TEXTSEP - 1, fsel_height};
+ XRectangle clp = {(FAREAMRGL + 1) * _scalefactor, ltop,
+ t_t - (FAREAMRGL + TEXTSEP * 2 + 1) * _scalefactor, fsel_height};
// list files in view
for (i = 0; i < llen; ++i) {
@@ -764,7 +782,7 @@ static void fib_expose (Display *dpy, Window realwin) {
if (_dirlist[j].flags & 2) {
XSetForeground (dpy, _fib_gc, blackColor);
XFillRectangle (dpy, win, _fib_gc,
- FAREAMRGL, t_y - _fib_font_ascent, fsel_width, _fib_font_height);
+ FAREAMRGL * _scalefactor, t_y - _fib_font_ascent, fsel_width, _fib_font_height);
XSetForeground (dpy, _fib_gc, whiteColor);
}
if (_hov_f == j && !(_dirlist[j].flags & 2)) {
@@ -781,7 +799,7 @@ static void fib_expose (Display *dpy, Window realwin) {
if (_columns & 1) // right-aligned 'size'
XDrawString (dpy, win, _fib_gc,
- t_s - TEXTSEP - 2 - _dirlist[j].ssizew, t_y,
+ t_s - (TEXTSEP + 2) * _scalefactor - _dirlist[j].ssizew, t_y,
_dirlist[j].strsize, strlen (_dirlist[j].strsize));
if (_columns & 2)
XDrawString (dpy, win, _fib_gc,
@@ -791,21 +809,21 @@ static void fib_expose (Display *dpy, Window realwin) {
// scrollbar
if (llen < _dircount) {
- float sl = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH)) / (float) _dircount;
- sl = MAX ((8. / llen), sl); // 8px min height of scroller
+ float sl = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH) * _scalefactor) / (float) _dircount;
+ sl = MAX ((8. * _scalefactor / llen), sl); // 8px min height of scroller
const int sy1 = llen * sl;
- const float mx = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH) - sy1) / (float)(_dircount - llen);
+ const float mx = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH) * _scalefactor - sy1) / (float)(_dircount - llen);
const int sy0 = fstop * mx;
- const int sx0 = _fib_width - SCROLLBARW - FAREAMRGR;
+ const int sx0 = _fib_width - (SCROLLBARW + FAREAMRGR) * _scalefactor;
const int stop = ltop - _fib_font_vsep;
- _scrl_y0 = stop + SCROLLBOXH + sy0;
+ _scrl_y0 = stop + SCROLLBOXH * _scalefactor + sy0;
_scrl_y1 = _scrl_y0 + sy1;
assert (fstop + llen <= _dircount);
// scroll-bar background
XSetForeground (dpy, _fib_gc, _c_gray3.pixel);
- XFillRectangle (dpy, win, _fib_gc, sx0, stop, SCROLLBARW, fsel_height + _fib_font_vsep);
+ XFillRectangle (dpy, win, _fib_gc, sx0, stop, SCROLLBARW * _scalefactor, fsel_height + _fib_font_vsep);
// scroller
if (_hov_s == 0) {
@@ -813,16 +831,16 @@ static void fib_expose (Display *dpy, Window realwin) {
} else {
XSetForeground (dpy, _fib_gc, _c_gray1.pixel);
}
- XFillRectangle (dpy, win, _fib_gc, sx0 + 1, stop + SCROLLBOXH + sy0, SCROLLBARW - 2, sy1);
+ XFillRectangle (dpy, win, _fib_gc, sx0 + 1 * _scalefactor, stop + SCROLLBOXH * _scalefactor + sy0, (SCROLLBARW - 2) * _scalefactor, sy1);
- int scrw = (SCROLLBARW -3) / 2;
+ int scrw = (SCROLLBARW -3) / 2 * _scalefactor;
// arrows top and bottom
if (_hov_s == 1) {
XSetForeground (dpy, _fib_gc, _c_gray0.pixel);
} else {
XSetForeground (dpy, _fib_gc, _c_gray1.pixel);
}
- XPoint ptst[4] = { {sx0 + 1, stop + 8}, {scrw, -7}, {scrw, 7}, {-2 * scrw, 0}};
+ XPoint ptst[4] = { {sx0 + 1 * _scalefactor, stop + 8 * _scalefactor}, {scrw, -7 * _scalefactor}, {scrw, 7 * _scalefactor}, {-2 * scrw, 0}};
XFillPolygon (dpy, win, _fib_gc, ptst, 3, Convex, CoordModePrevious);
XDrawLines (dpy, win, _fib_gc, ptst, 4, CoordModePrevious);
@@ -831,7 +849,7 @@ static void fib_expose (Display *dpy, Window realwin) {
} else {
XSetForeground (dpy, _fib_gc, _c_gray1.pixel);
}
- XPoint ptsb[4] = { {sx0 + 1, ltop + fsel_height - 9}, {2*scrw, 0}, {-scrw, 7}, {-scrw, -7}};
+ XPoint ptsb[4] = { {sx0 + 1 * _scalefactor, ltop + fsel_height - 9 * _scalefactor}, {2*scrw, 0}, {-scrw, 7 * _scalefactor}, {-scrw, -7 * _scalefactor}};
XFillPolygon (dpy, win, _fib_gc, ptsb, 3, Convex, CoordModePrevious);
XDrawLines (dpy, win, _fib_gc, ptsb, 4, CoordModePrevious);
} else {
@@ -843,24 +861,24 @@ static void fib_expose (Display *dpy, Window realwin) {
// heading
XSetForeground (dpy, _fib_gc, _c_gray3.pixel);
- XFillRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop - _fib_font_vsep, PLACESW - TEXTSEP, _fib_font_vsep);
+ XFillRectangle (dpy, win, _fib_gc, FAREAMRGB * _scalefactor, ltop - _fib_font_vsep, PLACESW - TEXTSEP * _scalefactor, _fib_font_vsep);
// body
XSetForeground (dpy, _fib_gc, _c_gray2.pixel);
- XFillRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop, PLACESW - TEXTSEP, fsel_height);
+ XFillRectangle (dpy, win, _fib_gc, FAREAMRGB * _scalefactor, ltop, PLACESW - TEXTSEP * _scalefactor, fsel_height);
#ifdef DRAW_OUTLINE
- VDrawRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop - _fib_font_vsep -1, PLACESW - TEXTSEP, fsel_height + _fib_font_vsep + 1);
+ VDrawRectangle (dpy, win, _fib_gc, FAREAMRGB * _scalefactor, ltop - _fib_font_vsep -1, PLACESW - TEXTSEP * _scalefactor, fsel_height + _fib_font_vsep + 1);
#endif
XSetForeground (dpy, _fib_gc, blackColor);
- XDrawString (dpy, win, _fib_gc, FAREAMRGB + TEXTSEP, ttop, "Places", 6);
+ XDrawString (dpy, win, _fib_gc, (FAREAMRGB + TEXTSEP) * _scalefactor, ttop, "Places", 6);
- XRectangle pclip = {FAREAMRGB + 1, ltop, PLACESW - TEXTSEP -1, fsel_height};
+ XRectangle pclip = {(FAREAMRGB + 1) * _scalefactor, ltop, PLACESW - (TEXTSEP + 1) * _scalefactor, fsel_height};
XSetClipRectangles (dpy, _fib_gc, 0, 0, &pclip, 1, Unsorted);
- const int plx = FAREAMRGB + TEXTSEP;
+ const int plx = (FAREAMRGB + TEXTSEP) * _scalefactor;
for (i = 0; i < llen && i < _placecnt; ++i) {
- const int ply = ltop + (i+1) * _fib_font_vsep - 4;
+ const int ply = ltop + (i+1) * _fib_font_vsep - 4 * _scalefactor;
if (i == _hov_l) {
XSetForeground (dpy, _fib_gc, _c_gray4.pixel);
} else {
@@ -871,9 +889,9 @@ static void fib_expose (Display *dpy, Window realwin) {
_placelist[i].name, strlen (_placelist[i].name));
if (_placelist[i].flags & 4) {
XSetForeground (dpy, _fib_gc, _c_gray3.pixel);
- const int plly = ply - _fib_font_ascent + _fib_font_height;
- const int pllx0 = FAREAMRGB;
- const int pllx1 = FAREAMRGB + (PLACESW - TEXTSEP);
+ const int plly = ply - _fib_font_ascent + _fib_font_height + 1 * _scalefactor;
+ const int pllx0 = FAREAMRGB * _scalefactor;
+ const int pllx1 = FAREAMRGB * _scalefactor + PLACESW - TEXTSEP * _scalefactor;
XDrawLine (dpy, win, _fib_gc, pllx0, plly, pllx1, plly);
}
}
@@ -881,29 +899,31 @@ static void fib_expose (Display *dpy, Window realwin) {
if (_placecnt > llen) {
const int plly = ltop + fsel_height - _fib_font_height + _fib_font_ascent;
- const int pllx0 = FAREAMRGB + (PLACESW - TEXTSEP) * .75;
- const int pllx1 = FAREAMRGB + (PLACESW - TEXTSEP - TEXTSEP);
+ const int pllx0 = FAREAMRGB * _scalefactor + (PLACESW - TEXTSEP * _scalefactor) * .75;
+ const int pllx1 = FAREAMRGB * _scalefactor + PLACESW - TEXTSEP * 2 * _scalefactor;
XSetForeground (dpy, _fib_gc, blackColor);
- XSetLineAttributes (dpy, _fib_gc, 1, LineOnOffDash, CapButt, JoinMiter);
+ XSetLineAttributes (dpy, _fib_gc, 1 * _scalefactor, LineOnOffDash, CapButt, JoinMiter);
XDrawLine (dpy, win, _fib_gc, pllx0, plly, pllx1, plly);
- XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter);
+ XSetLineAttributes (dpy, _fib_gc, 1 * _scalefactor, LineSolid, CapButt, JoinMiter);
}
}
// Bottom Buttons
const int numb = sizeof(_btns) / sizeof(FibButton*);
int xtra = _fib_width - _btn_span;
- const int cbox = _fib_font_ascent - 2;
- const int bbase = _fib_height - BTNBTMMARGIN * _fib_font_vsep - BTNPADDING;
- const int cblw = cbox > 20 ? 5 : ( cbox > 9 ? 3 : 1);
+ const int cbox = _fib_font_ascent - 2 * _scalefactor;
+ const int bbase = _fib_height - BTNBTMMARGIN * _fib_font_vsep - BTNPADDING * _scalefactor;
+ const int cblw = cbox > 20 * _scalefactor
+ ? 5 * _scalefactor
+ : (cbox > 9 * _scalefactor ? 3 : 1) * _scalefactor;
- int bx = FAREAMRGB;
+ int bx = FAREAMRGB * _scalefactor;
for (i = 0; i < numb; ++i) {
if (_btns[i]->flags & 8) { continue; }
if (_btns[i]->flags & 4) {
// checkbutton
- const int cby0 = bbase - cbox + 1 + BTNPADDING;
+ const int cby0 = bbase - cbox + (1 + BTNPADDING) * _scalefactor;
if (i == _hov_b) {
XSetForeground (dpy, _fib_gc, _c_gray4.pixel);
} else {
@@ -917,7 +937,7 @@ static void fib_expose (Display *dpy, Window realwin) {
} else {
XSetForeground (dpy, _fib_gc, blackColor);
}
- XDrawString (dpy, win, _fib_gc, BTNPADDING + bx + _fib_font_ascent, 1 + bbase + BTNPADDING,
+ XDrawString (dpy, win, _fib_gc, BTNPADDING * _scalefactor + bx + _fib_font_ascent, bbase + (BTNPADDING + 1) * _scalefactor,
_btns[i]->text, strlen (_btns[i]->text));
if (i == _hov_b) {
@@ -964,15 +984,15 @@ static void fib_expose (Display *dpy, Window realwin) {
}
XFillRectangle (dpy, win, _fib_gc,
bx + 1, bbase - _fib_font_ascent,
- _btn_w - 1, _fib_font_height + BTNPADDING + BTNPADDING);
+ _btn_w - 1, _fib_font_height + BTNPADDING * 2 * _scalefactor);
VDrawRectangle (dpy, win, _fib_gc,
bx, bbase - _fib_font_ascent,
- _btn_w, _fib_font_height + BTNPADDING + BTNPADDING);
- XDrawString (dpy, win, _fib_gc, bx + (_btn_w - _btns[i]->tw) * .5, 1 + bbase + BTNPADDING,
+ _btn_w, _fib_font_height + BTNPADDING * 2 * _scalefactor);
+ XDrawString (dpy, win, _fib_gc, bx + (_btn_w - _btns[i]->tw) * .5, 1 + bbase + BTNPADDING * _scalefactor,
_btns[i]->text, strlen (_btns[i]->text));
}
_btns[i]->x0 = bx;
- bx += _btns[i]->xw + DSEP;
+ bx += _btns[i]->xw + DSEP * _scalefactor;
}
if (_pixbuffer != None) {
@@ -1894,7 +1914,7 @@ static int x_error_handler (Display *d, XErrorEvent *e) {
(void)d; (void)e;
}
-int x_fib_show (Display *dpy, Window parent, int x, int y) {
+int x_fib_show (Display *dpy, Window parent, int x, int y, double scalefactor) {
if (_fib_win) {
XSetInputFocus (dpy, _fib_win, RevertToParent, CurrentTime);
return -1;
@@ -1932,10 +1952,12 @@ int x_fib_show (Display *dpy, Window parent, int x, int y) {
_fib_win = XCreateWindow (
dpy, DefaultRootWindow (dpy),
- x, y, _fib_width, _fib_height,
+ x, y, _fib_width * scalefactor, _fib_height * scalefactor,
1, CopyFromParent, InputOutput, CopyFromParent,
CWEventMask | CWBorderPixel, &attr);
+ _scalefactor = scalefactor;
+
if (!_fib_win) { return 1; }
if (parent)
@@ -1964,10 +1986,27 @@ int x_fib_show (Display *dpy, Window parent, int x, int y) {
font_err = 1;
if (getenv ("XJFONT")) _XTESTFONT (getenv ("XJFONT"));
if (font_err && strlen (_fib_cfg_custom_font) > 0) _XTESTFONT (_fib_cfg_custom_font);
- if (font_err) _XTESTFONT ("-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*");
- if (font_err) _XTESTFONT ("-*-verdana-medium-r-normal-*-12-*-*-*-*-*-*-*");
- if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*");
- if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*");
+ if (scalefactor >= 2.5) {
+ if (font_err) _XTESTFONT ("-*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-*-verdana-medium-r-normal-*-18-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-20-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-18-*-*-*-*-*-*-*");
+ } else if (scalefactor >= 2) {
+ if (font_err) _XTESTFONT ("-*-helvetica-medium-r-normal-*-16-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-*-verdana-medium-r-normal-*-16-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-18-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-16-*-*-*-*-*-*-*");
+ } else if (scalefactor >= 1.5) {
+ if (font_err) _XTESTFONT ("-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-*-verdana-medium-r-normal-*-14-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-15-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-14-*-*-*-*-*-*-*");
+ } else {
+ if (font_err) _XTESTFONT ("-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-*-verdana-medium-r-normal-*-12-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*");
+ if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*");
+ }
if (font_err) _fibfont = None;
XSync (dpy, False);
XSetErrorHandler (handler);
@@ -1981,9 +2020,9 @@ int x_fib_show (Display *dpy, Window parent, int x, int y) {
_fib_win = 0;
return -1;
}
- _fib_font_height += 3;
- _fib_font_ascent += 2;
- _fib_font_vsep = _fib_font_height + 2;
+ _fib_font_height += 3 * scalefactor;
+ _fib_font_ascent += 2 * scalefactor;
+ _fib_font_vsep = _fib_font_height + 2 * scalefactor;
}
populate_places (dpy);
@@ -2015,7 +2054,7 @@ int x_fib_show (Display *dpy, Window parent, int x, int y) {
if (_btns[i]->flags & 8) { continue; }
query_font_geometry (dpy, _fib_gc, _btns[i]->text, &_btns[i]->tw, NULL, NULL, NULL);
if (_btns[i]->flags & 4) {
- _btn_span += _btns[i]->tw + _fib_font_ascent + TEXTSEP;
+ _btn_span += _btns[i]->tw + _fib_font_ascent + TEXTSEP * scalefactor;
} else {
++btncnt;
if (_btns[i]->tw > _btn_w)
@@ -2023,13 +2062,13 @@ int x_fib_show (Display *dpy, Window parent, int x, int y) {
}
}
- _btn_w += BTNPADDING + BTNPADDING + TEXTSEP + TEXTSEP + TEXTSEP;
- _btn_span += _btn_w * btncnt + DSEP * (i - 1) + FAREAMRGR + FAREAMRGB;
+ _btn_w += (BTNPADDING + BTNPADDING + TEXTSEP + TEXTSEP + TEXTSEP) * scalefactor;
+ _btn_span += _btn_w * btncnt + DSEP * scalefactor * (i - 1) + (FAREAMRGR + FAREAMRGB) * scalefactor;
for (i = 0; i < sizeof(_btns) / sizeof(FibButton*); ++i) {
if (_btns[i]->flags & 8) { continue; }
if (_btns[i]->flags & 4) {
- _btns[i]->xw = _btns[i]->tw + _fib_font_ascent + TEXTSEP;
+ _btns[i]->xw = _btns[i]->tw + _fib_font_ascent + TEXTSEP * scalefactor;
} else {
_btns[i]->xw = _btn_w;
}
@@ -2037,8 +2076,8 @@ int x_fib_show (Display *dpy, Window parent, int x, int y) {
sync_button_states () ;
- _fib_height = _fib_font_vsep * (15.8);
- _fib_width = MAX (_btn_span, 440);
+ _fib_height = _fib_font_vsep * 15.8 * (1.0 + (scalefactor - 1.0) / 2.0);
+ _fib_width = MAX (_btn_span, 440 * scalefactor);
XResizeWindow (dpy, _fib_win, _fib_width, _fib_height);
diff --git a/dgl/src/sofd/libsofd.h b/dgl/src/sofd/libsofd.h
@@ -41,7 +41,7 @@ extern "C" {
* @param y if >0 set explict initial height of the window
* @return 0 on success
*/
-int x_fib_show (Display *dpy, Window parent, int x, int y);
+int x_fib_show (Display *dpy, Window parent, int x, int y, double scalefactor);
/** force close the dialog.
* This is normally not needed, the dialog closes itself
diff --git a/examples/FileHandling/FileHandlingUI.cpp b/examples/FileHandling/FileHandlingUI.cpp
@@ -24,6 +24,7 @@
START_NAMESPACE_DISTRHO
using DGL_NAMESPACE::Button;
+using DGL_NAMESPACE::ButtonEventHandler;
const char* kStateKeys[kStateCount] = {
"file1",