From dd7b8b67bd5e8d1dd3945fe64d16d094a017f7ce Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 3 Nov 2002 06:09:05 +0000 Subject: [PATCH] split the screeninfo class out to its own files --- src/Makefile.am | 27 ++--------- src/basedisplay.cc | 105 ----------------------------------------- src/basedisplay.hh | 45 ++---------------- src/screeninfo.cc | 114 +++++++++++++++++++++++++++++++++++++++++++++ src/screeninfo.hh | 52 +++++++++++++++++++++ 5 files changed, 172 insertions(+), 171 deletions(-) create mode 100644 src/screeninfo.cc create mode 100644 src/screeninfo.hh diff --git a/src/Makefile.am b/src/Makefile.am index 9adefeeb..b6e36e05 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,8 +15,9 @@ bin_PROGRAMS= openbox openbox_LDADD=../otk/libotk.a @LIBINTL@ -openbox_SOURCES= basedisplay.cc configuration.cc screen.cc timer.cc util.cc \ - window.cc workspace.cc xatom.cc blackbox.cc main.cc +openbox_SOURCES= basedisplay.cc configuration.cc screen.cc screeninfo.cc \ + timer.cc util.cc window.cc workspace.cc xatom.cc blackbox.cc \ + main.cc MAINTAINERCLEANFILES= Makefile.in @@ -24,25 +25,3 @@ distclean-local: rm -f *\~ *.orig *.rej .\#* # local dependencies -basedisplay.o: basedisplay.cc basedisplay.hh timer.hh util.hh \ - ../otk/gccache.hh ../otk/color.hh -blackbox.o: blackbox.cc blackbox.hh basedisplay.hh timer.hh util.hh \ - configuration.hh xatom.hh ../otk/gccache.hh ../otk/color.hh ../otk/image.hh screen.hh \ - ../otk/texture.hh workspace.hh window.hh -configuration.o: configuration.cc configuration.hh util.hh -main.o: main.cc ../version.h blackbox.hh basedisplay.hh timer.hh \ - util.hh configuration.hh xatom.hh -screen.o: screen.cc blackbox.hh basedisplay.hh timer.hh util.hh \ - configuration.hh xatom.hh ../otk/font.hh screen.hh ../otk/color.hh ../otk/texture.hh \ - ../otk/image.hh workspace.hh ../otk/gccache.hh window.hh -timer.o: timer.cc basedisplay.hh timer.hh util.hh -util.o: util.cc util.hh -window.o: window.cc blackbox.hh basedisplay.hh timer.hh util.hh \ - configuration.hh xatom.hh ../otk/font.hh screen.hh ../otk/color.hh ../otk/texture.hh \ - ../otk/image.hh workspace.hh ../otk/gccache.hh window.hh -workspace.o: workspace.cc blackbox.hh basedisplay.hh timer.hh util.hh \ - configuration.hh xatom.hh ../otk/font.hh screen.hh ../otk/color.hh ../otk/texture.hh \ - ../otk/image.hh workspace.hh window.hh -xatom.o: xatom.cc ../config.h xatom.hh screen.hh ../otk/color.hh ../otk/texture.hh \ - util.hh ../otk/image.hh timer.hh basedisplay.hh workspace.hh blackbox.hh \ - configuration.hh diff --git a/src/basedisplay.cc b/src/basedisplay.cc index a33f95b9..81f8879f 100644 --- a/src/basedisplay.cc +++ b/src/basedisplay.cc @@ -349,108 +349,3 @@ BGCCache* BaseDisplay::gcCache(void) const { return gccache; } - - -ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) { - basedisplay = d; - screen_number = num; - - root_window = RootWindow(basedisplay->getXDisplay(), screen_number); - - rect.setSize(WidthOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), - screen_number)), - HeightOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), - screen_number))); - /* - If the default depth is at least 8 we will use that, - otherwise we try to find the largest TrueColor visual. - Preference is given to 24 bit over larger depths if 24 bit is an option. - */ - - depth = DefaultDepth(basedisplay->getXDisplay(), screen_number); - visual = DefaultVisual(basedisplay->getXDisplay(), screen_number); - colormap = DefaultColormap(basedisplay->getXDisplay(), screen_number); - - if (depth < 8) { - // search for a TrueColor Visual... if we can't find one... - // we will use the default visual for the screen - XVisualInfo vinfo_template, *vinfo_return; - int vinfo_nitems; - int best = -1; - - vinfo_template.screen = screen_number; - vinfo_template.c_class = TrueColor; - - vinfo_return = XGetVisualInfo(basedisplay->getXDisplay(), - VisualScreenMask | VisualClassMask, - &vinfo_template, &vinfo_nitems); - if (vinfo_return) { - int max_depth = 1; - for (int i = 0; i < vinfo_nitems; ++i) { - if (vinfo_return[i].depth > max_depth) { - if (max_depth == 24 && vinfo_return[i].depth > 24) - break; // prefer 24 bit over 32 - max_depth = vinfo_return[i].depth; - best = i; - } - } - if (max_depth < depth) best = -1; - } - - if (best != -1) { - depth = vinfo_return[best].depth; - visual = vinfo_return[best].visual; - colormap = XCreateColormap(basedisplay->getXDisplay(), root_window, - visual, AllocNone); - } - - XFree(vinfo_return); - } - - // get the default display string and strip the screen number - string default_string = DisplayString(basedisplay->getXDisplay()); - const string::size_type pos = default_string.rfind("."); - if (pos != string::npos) - default_string.resize(pos); - - display_string = string("DISPLAY=") + default_string + '.' + - itostring(static_cast(screen_number)); - -#ifdef XINERAMA - xinerama_active = False; - - if (d->hasXineramaExtensions()) { - if (d->getXineramaMajorVersion() == 1) { - // we know the version 1(.1?) protocol - - /* - in this version of Xinerama, we can't query on a per-screen basis, but - in future versions we should be able, so the 'activeness' is checked - on a pre-screen basis anyways. - */ - if (XineramaIsActive(d->getXDisplay())) { - /* - If Xinerama is being used, there there is only going to be one screen - present. We still, of course, want to use the screen class, but that - is why no screen number is used in this function call. There should - never be more than one screen present with Xinerama active. - */ - int num; - XineramaScreenInfo *info = XineramaQueryScreens(d->getXDisplay(), &num); - if (num > 0 && info) { - xinerama_areas.reserve(num); - for (int i = 0; i < num; ++i) { - xinerama_areas.push_back(Rect(info[i].x_org, info[i].y_org, - info[i].width, info[i].height)); - } - XFree(info); - - // if we can't find any xinerama regions, then we act as if it is not - // active, even though it said it was - xinerama_active = True; - } - } - } - } -#endif // XINERAMA -} diff --git a/src/basedisplay.hh b/src/basedisplay.hh index 117c49d7..dde34adc 100644 --- a/src/basedisplay.hh +++ b/src/basedisplay.hh @@ -2,59 +2,20 @@ #ifndef __BaseDisplay_hh #define __BaseDisplay_hh +#include "screeninfo.hh" +#include "timer.hh" + extern "C" { #include #include } #include -#include // forward declaration class BaseDisplay; class BGCCache; -#include "timer.hh" -#include "util.hh" - -class ScreenInfo { -private: - BaseDisplay *basedisplay; - Visual *visual; - Window root_window; - Colormap colormap; - - int depth; - unsigned int screen_number; - std::string display_string; - Rect rect; -#ifdef XINERAMA - RectList xinerama_areas; - bool xinerama_active; -#endif - -public: - ScreenInfo(BaseDisplay *d, unsigned int num); - - inline BaseDisplay *getBaseDisplay(void) const { return basedisplay; } - inline Visual *getVisual(void) const { return visual; } - inline Window getRootWindow(void) const { return root_window; } - inline Colormap getColormap(void) const { return colormap; } - inline int getDepth(void) const { return depth; } - inline unsigned int getScreenNumber(void) const - { return screen_number; } - inline const Rect& getRect(void) const { return rect; } - inline unsigned int getWidth(void) const { return rect.width(); } - inline unsigned int getHeight(void) const { return rect.height(); } - inline const std::string& displayString(void) const - { return display_string; } -#ifdef XINERAMA - inline const RectList &getXineramaAreas(void) const { return xinerama_areas; } - inline bool isXineramaActive(void) const { return xinerama_active; } -#endif -}; - - class BaseDisplay: public TimerQueueManager { private: struct BShape { diff --git a/src/screeninfo.cc b/src/screeninfo.cc new file mode 100644 index 00000000..586b5f30 --- /dev/null +++ b/src/screeninfo.cc @@ -0,0 +1,114 @@ +// -*- mode: C++; indent-tabs-mode: nil; -*- + +#ifdef HAVE_CONFIG_H +# include "../config.h" +#endif // HAVE_CONFIG_H + +#include "screeninfo.hh" +#include "basedisplay.hh" + +using std::string; + +ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) { + basedisplay = d; + screen_number = num; + + root_window = RootWindow(basedisplay->getXDisplay(), screen_number); + + rect.setSize(WidthOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), + screen_number)), + HeightOfScreen(ScreenOfDisplay(basedisplay->getXDisplay(), + screen_number))); + /* + If the default depth is at least 8 we will use that, + otherwise we try to find the largest TrueColor visual. + Preference is given to 24 bit over larger depths if 24 bit is an option. + */ + + depth = DefaultDepth(basedisplay->getXDisplay(), screen_number); + visual = DefaultVisual(basedisplay->getXDisplay(), screen_number); + colormap = DefaultColormap(basedisplay->getXDisplay(), screen_number); + + if (depth < 8) { + // search for a TrueColor Visual... if we can't find one... + // we will use the default visual for the screen + XVisualInfo vinfo_template, *vinfo_return; + int vinfo_nitems; + int best = -1; + + vinfo_template.screen = screen_number; + vinfo_template.c_class = TrueColor; + + vinfo_return = XGetVisualInfo(basedisplay->getXDisplay(), + VisualScreenMask | VisualClassMask, + &vinfo_template, &vinfo_nitems); + if (vinfo_return) { + int max_depth = 1; + for (int i = 0; i < vinfo_nitems; ++i) { + if (vinfo_return[i].depth > max_depth) { + if (max_depth == 24 && vinfo_return[i].depth > 24) + break; // prefer 24 bit over 32 + max_depth = vinfo_return[i].depth; + best = i; + } + } + if (max_depth < depth) best = -1; + } + + if (best != -1) { + depth = vinfo_return[best].depth; + visual = vinfo_return[best].visual; + colormap = XCreateColormap(basedisplay->getXDisplay(), root_window, + visual, AllocNone); + } + + XFree(vinfo_return); + } + + // get the default display string and strip the screen number + string default_string = DisplayString(basedisplay->getXDisplay()); + const string::size_type pos = default_string.rfind("."); + if (pos != string::npos) + default_string.resize(pos); + + display_string = string("DISPLAY=") + default_string + '.' + + itostring(static_cast(screen_number)); + +#ifdef XINERAMA + xinerama_active = False; + + if (d->hasXineramaExtensions()) { + if (d->getXineramaMajorVersion() == 1) { + // we know the version 1(.1?) protocol + + /* + in this version of Xinerama, we can't query on a per-screen basis, but + in future versions we should be able, so the 'activeness' is checked + on a pre-screen basis anyways. + */ + if (XineramaIsActive(d->getXDisplay())) { + /* + If Xinerama is being used, there there is only going to be one screen + present. We still, of course, want to use the screen class, but that + is why no screen number is used in this function call. There should + never be more than one screen present with Xinerama active. + */ + int num; + XineramaScreenInfo *info = XineramaQueryScreens(d->getXDisplay(), &num); + if (num > 0 && info) { + xinerama_areas.reserve(num); + for (int i = 0; i < num; ++i) { + xinerama_areas.push_back(Rect(info[i].x_org, info[i].y_org, + info[i].width, info[i].height)); + } + XFree(info); + + // if we can't find any xinerama regions, then we act as if it is not + // active, even though it said it was + xinerama_active = True; + } + } + } + } +#endif // XINERAMA +} diff --git a/src/screeninfo.hh b/src/screeninfo.hh new file mode 100644 index 00000000..880b4ae5 --- /dev/null +++ b/src/screeninfo.hh @@ -0,0 +1,52 @@ +// -*- mode: C++; indent-tabs-mode: nil; -*- +#ifndef __screeninfo_hh +#define __screeninfo_hh + +#include "util.hh" + +extern "C" { +#include +} + +#include + +class BaseDisplay; + +class ScreenInfo { +private: + BaseDisplay *basedisplay; + Visual *visual; + Window root_window; + Colormap colormap; + + int depth; + unsigned int screen_number; + std::string display_string; + Rect rect; +#ifdef XINERAMA + RectList xinerama_areas; + bool xinerama_active; +#endif + +public: + ScreenInfo(BaseDisplay *d, unsigned int num); + + inline BaseDisplay *getBaseDisplay(void) const { return basedisplay; } + inline Visual *getVisual(void) const { return visual; } + inline Window getRootWindow(void) const { return root_window; } + inline Colormap getColormap(void) const { return colormap; } + inline int getDepth(void) const { return depth; } + inline unsigned int getScreenNumber(void) const + { return screen_number; } + inline const Rect& getRect(void) const { return rect; } + inline unsigned int getWidth(void) const { return rect.width(); } + inline unsigned int getHeight(void) const { return rect.height(); } + inline const std::string& displayString(void) const + { return display_string; } +#ifdef XINERAMA + inline const RectList &getXineramaAreas(void) const { return xinerama_areas; } + inline bool isXineramaActive(void) const { return xinerama_active; } +#endif +}; + +#endif // __screeninfo_hh -- 2.39.2