From 3ebd631cf09a3d04f7c9606b33dca40176928445 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 30 Oct 2006 14:16:08 +0000 Subject: Fl::x(), Fl::y(), Fl::w(), and Fl::h() did not report the desktop work area on X11 (STR #1482) Fix another "missing sentinel" warning in the Xft code. FL/Fl.H: - Remove in-line x() and y() implementation for X11. src/Fl_x.cxx: - Fl::x(), Fl::y(): Added. - fl_init_workarea(): Added to get _NET_WORKAREA property from the root window; if none, is available, the code falls back to 0, 0, DisplayWidth, and DisplayHeight. src/fl_font_xft.cxx: - Missing sentinel needs cast to void *. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@5535 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- src/Fl_x.cxx | 49 +++++++++++++++++++++++++++++++++++++++++++++---- src/fl_font_xft.cxx | 2 +- 2 files changed, 46 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 57c1719c8..85a43def0 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -367,14 +367,55 @@ void fl_close_display() { XCloseDisplay(fl_display); } -int Fl::h() { +static int fl_workarea_xywh[4] = { -1, -1, -1, -1 }; + +static void fl_init_workarea() { fl_open_display(); - return DisplayHeight(fl_display,fl_screen); + + Atom _NET_WORKAREA = XInternAtom(fl_display, "_NET_WORKAREA", 0); + Atom actual; + unsigned long count, remaining; + int format; + unsigned *xywh; + + if (XGetWindowProperty(fl_display, RootWindow(fl_display, fl_screen), + _NET_WORKAREA, 0, 4 * sizeof(unsigned), False, + XA_CARDINAL, &actual, &format, &count, &remaining, + (unsigned char **)&xywh)) + { + fl_workarea_xywh[0] = 0; + fl_workarea_xywh[1] = 0; + fl_workarea_xywh[2] = DisplayWidth(fl_display, fl_screen); + fl_workarea_xywh[3] = DisplayHeight(fl_display, fl_screen); + } + else + { + fl_workarea_xywh[0] = (int)xywh[0]; + fl_workarea_xywh[1] = (int)xywh[1]; + fl_workarea_xywh[2] = (int)xywh[2]; + fl_workarea_xywh[3] = (int)xywh[3]; + XFree(xywh); + } +} + +int Fl::x() { + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[0]; +} + +int Fl::y() { + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[1]; } int Fl::w() { - fl_open_display(); - return DisplayWidth(fl_display,fl_screen); + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[2]; +} + +int Fl::h() { + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[3]; } void Fl::get_mouse(int &xx, int &yy) { diff --git a/src/fl_font_xft.cxx b/src/fl_font_xft.cxx index 4c87ca23a..d84af32d6 100644 --- a/src/fl_font_xft.cxx +++ b/src/fl_font_xft.cxx @@ -145,7 +145,7 @@ static XftFont* fontopen(const char* name, bool core) { XFT_PIXEL_SIZE, XftTypeDouble, (double)fl_size_, core ? XFT_CORE : 0, XftTypeBool, true, XFT_RENDER, XftTypeBool, false, - 0); + (void *)0); } Fl_FontSize::Fl_FontSize(const char* name) { -- cgit v1.2.3