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_LDADD=../otk/libotk.a @LIBINTL@
|
||||||
|
|
||||||
openbox_SOURCES= basedisplay.cc configuration.cc screen.cc timer.cc util.cc \
|
openbox_SOURCES= basedisplay.cc configuration.cc screen.cc screeninfo.cc \
|
||||||
window.cc workspace.cc xatom.cc blackbox.cc main.cc
|
timer.cc util.cc window.cc workspace.cc xatom.cc blackbox.cc \
|
||||||
|
main.cc
|
||||||
|
|
||||||
MAINTAINERCLEANFILES= Makefile.in
|
MAINTAINERCLEANFILES= Makefile.in
|
||||||
|
|
||||||
|
@ -24,25 +25,3 @@ distclean-local:
|
||||||
rm -f *\~ *.orig *.rej .\#*
|
rm -f *\~ *.orig *.rej .\#*
|
||||||
|
|
||||||
# local dependencies
|
# 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;
|
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
|
#ifndef __BaseDisplay_hh
|
||||||
#define __BaseDisplay_hh
|
#define __BaseDisplay_hh
|
||||||
|
|
||||||
|
#include "screeninfo.hh"
|
||||||
|
#include "timer.hh"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
|
||||||
|
|
||||||
// forward declaration
|
// forward declaration
|
||||||
class BaseDisplay;
|
class BaseDisplay;
|
||||||
class BGCCache;
|
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 {
|
class BaseDisplay: public TimerQueueManager {
|
||||||
private:
|
private:
|
||||||
struct BShape {
|
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