split the screeninfo class out to its own files
This commit is contained in:
parent
bbdca49193
commit
dd7b8b67bd
5 changed files with 172 additions and 171 deletions
|
@ -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
|
||||
|
|
|
@ -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<unsigned long>(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
|
||||
}
|
||||
|
|
|
@ -2,59 +2,20 @@
|
|||
#ifndef __BaseDisplay_hh
|
||||
#define __BaseDisplay_hh
|
||||
|
||||
#include "screeninfo.hh"
|
||||
#include "timer.hh"
|
||||
|
||||
extern "C" {
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
}
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
// 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 {
|
||||
|
|
114
src/screeninfo.cc
Normal file
114
src/screeninfo.cc
Normal file
|
@ -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<unsigned long>(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
|
||||
}
|
52
src/screeninfo.hh
Normal file
52
src/screeninfo.hh
Normal file
|
@ -0,0 +1,52 @@
|
|||
// -*- mode: C++; indent-tabs-mode: nil; -*-
|
||||
#ifndef __screeninfo_hh
|
||||
#define __screeninfo_hh
|
||||
|
||||
#include "util.hh"
|
||||
|
||||
extern "C" {
|
||||
#include <X11/Xlib.h>
|
||||
}
|
||||
|
||||
#include <string>
|
||||
|
||||
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
|
Loading…
Reference in a new issue