This commit is contained in:
fluxgen 2002-11-14 00:23:19 +00:00
parent cade394b91
commit e13cb99bd0

View file

@ -1,3 +1,6 @@
// Slit.cc for fluxbox
// Copyright (c) 2002 Henrik Kinnunen (fluxgen at linuxmail.org)
//
// Slit.cc for Blackbox - an X11 Window manager // Slit.cc for Blackbox - an X11 Window manager
// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
// //
@ -19,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
// $Id: Slit.cc,v 1.23 2002/10/29 15:59:35 fluxgen Exp $ // $Id: Slit.cc,v 1.24 2002/11/14 00:23:19 fluxgen Exp $
//use GNU extensions //use GNU extensions
#ifndef _GNU_SOURCE #ifndef _GNU_SOURCE
@ -32,8 +35,6 @@
#ifdef SLIT #ifdef SLIT
#include <X11/keysym.h>
#include "i18n.hh" #include "i18n.hh"
#include "fluxbox.hh" #include "fluxbox.hh"
#include "Image.hh" #include "Image.hh"
@ -50,14 +51,18 @@
# include <sys/stat.h> # include <sys/stat.h>
#endif // HAVE_SYS_STAT_H #endif // HAVE_SYS_STAT_H
#include <X11/keysym.h>
// Utility method for extracting name from window // Utility method for extracting name from window
namespace { namespace {
void getWMName(BScreen *screen, Window window, std::string& name) {
void getWMName(BScreen *screen, Window window, std::string& name) {
name = ""; name = "";
if (screen != 0 && window != None) { if (screen == 0 || window == None)
Display *display = screen->getBaseDisplay()->getXDisplay(); return;
Display *display = BaseDisplay::getXDisplay();
XTextProperty text_prop; XTextProperty text_prop;
char **list; char **list;
@ -80,27 +85,30 @@ namespace {
} else } else
name = (char *)text_prop.value; name = (char *)text_prop.value;
} else } else { // default name
name = i18n->getMessage( name = i18n->getMessage(
FBNLS::WindowSet, FBNLS::WindowUnnamed, FBNLS::WindowSet, FBNLS::WindowUnnamed,
"Unnamed"); "Unnamed");
}
} else { } else {
// default name
name = i18n->getMessage( name = i18n->getMessage(
FBNLS::WindowSet, FBNLS::WindowUnnamed, FBNLS::WindowSet, FBNLS::WindowUnnamed,
"Unnamed"); "Unnamed");
} }
}
} }
}; // End anonymous namespace }; // End anonymous namespace
Slit::Slit(BScreen *scr):screen(scr), timer(this), slitmenu(*this) { Slit::Slit(BScreen *scr):m_screen(scr), timer(this), slitmenu(*this) {
assert(scr); assert(scr);
fluxbox = Fluxbox::instance(); Fluxbox * const fluxbox = Fluxbox::instance();
on_top = screen()->isSlitOnTop();
hidden = do_auto_hide = screen()->doSlitAutoHide();
on_top = screen->isSlitOnTop();
hidden = do_auto_hide = screen->doSlitAutoHide();
display = screen->getBaseDisplay()->getXDisplay();
frame.window = frame.pixmap = None; frame.window = frame.pixmap = None;
@ -112,8 +120,8 @@ Slit::Slit(BScreen *scr):screen(scr), timer(this), slitmenu(*this) {
CWColormap | CWOverrideRedirect | CWEventMask; CWColormap | CWOverrideRedirect | CWEventMask;
attrib.background_pixmap = None; attrib.background_pixmap = None;
attrib.background_pixel = attrib.border_pixel = attrib.background_pixel = attrib.border_pixel =
screen->getBorderColor()->pixel(); screen()->getBorderColor()->pixel();
attrib.colormap = screen->colormap(); attrib.colormap = screen()->colormap();
attrib.override_redirect = True; attrib.override_redirect = True;
attrib.event_mask = SubstructureRedirectMask | ButtonPressMask | attrib.event_mask = SubstructureRedirectMask | ButtonPressMask |
EnterWindowMask | LeaveWindowMask; EnterWindowMask | LeaveWindowMask;
@ -122,9 +130,9 @@ Slit::Slit(BScreen *scr):screen(scr), timer(this), slitmenu(*this) {
frame.width = frame.height = 1; frame.width = frame.height = 1;
frame.window = frame.window =
XCreateWindow(display, screen->getRootWindow(), frame.x, frame.y, XCreateWindow(BaseDisplay::getXDisplay(), screen()->getRootWindow(), frame.x, frame.y,
frame.width, frame.height, screen->getBorderWidth(), frame.width, frame.height, screen()->getBorderWidth(),
screen->getDepth(), InputOutput, screen->getVisual(), screen()->getDepth(), InputOutput, screen()->getVisual(),
create_mask, &attrib); create_mask, &attrib);
fluxbox->saveSlitSearch(frame.window, this); fluxbox->saveSlitSearch(frame.window, this);
@ -136,15 +144,11 @@ Slit::Slit(BScreen *scr):screen(scr), timer(this), slitmenu(*this) {
Slit::~Slit() { Slit::~Slit() {
fluxbox->grab(); screen()->getImageControl()->removeImage(frame.pixmap);
screen->getImageControl()->removeImage(frame.pixmap); Fluxbox::instance()->removeSlitSearch(frame.window);
fluxbox->removeSlitSearch(frame.window); XDestroyWindow(BaseDisplay::getXDisplay(), frame.window);
XDestroyWindow(display, frame.window);
fluxbox->ungrab();
} }
@ -153,12 +157,13 @@ void Slit::addClient(Window w) {
if (w == None) if (w == None)
return; return;
fluxbox->grab(); if (!Fluxbox::instance()->validateWindow(w))
if (fluxbox->validateWindow(w)) { return;
// Look for slot in client list by name // Look for slot in client list by name
SlitClient *client = 0; SlitClient *client = 0;
std::string match_name; std::string match_name;
::getWMName(screen, w, match_name); ::getWMName(screen(), w, match_name);
SlitClients::iterator it = clientList.begin(); SlitClients::iterator it = clientList.begin();
SlitClients::iterator it_end = clientList.end(); SlitClients::iterator it_end = clientList.end();
bool found_match = false; bool found_match = false;
@ -168,7 +173,7 @@ void Slit::addClient(Window w) {
// Use the slot if no window is assigned // Use the slot if no window is assigned
if ((*it)->window == None) { if ((*it)->window == None) {
client = (*it); client = (*it);
client->initialize(screen, w); client->initialize(screen(), w);
break; break;
} }
// Otherwise keep looking for an unused match or a non-match // Otherwise keep looking for an unused match or a non-match
@ -176,25 +181,25 @@ void Slit::addClient(Window w) {
} else if (found_match) { } else if (found_match) {
// Insert before first non-match after a previously found match? // Insert before first non-match after a previously found match?
client = new SlitClient(screen, w); client = new SlitClient(screen(), w);
clientList.insert(it, client); clientList.insert(it, client);
break; break;
} }
} }
// Append to client list? // Append to client list?
if (client == 0) { if (client == 0) {
client = new SlitClient(screen, w); client = new SlitClient(screen(), w);
clientList.push_back(client); clientList.push_back(client);
} }
Display *disp = BaseDisplay::getXDisplay();
XWMHints *wmhints = XGetWMHints(display, w); XWMHints *wmhints = XGetWMHints(disp, w);
if (wmhints) { if (wmhints) {
if ((wmhints->flags & IconWindowHint) && if ((wmhints->flags & IconWindowHint) &&
(wmhints->icon_window != None)) { (wmhints->icon_window != None)) {
XMoveWindow(display, client->client_window, screen->getWidth() + 10, XMoveWindow(disp, client->client_window, screen()->getWidth() + 10,
screen->getHeight() + 10); screen()->getHeight() + 10);
XMapWindow(display, client->client_window); XMapWindow(disp, client->client_window);
client->icon_window = wmhints->icon_window; client->icon_window = wmhints->icon_window;
client->window = client->icon_window; client->window = client->icon_window;
} else { } else {
@ -208,7 +213,7 @@ void Slit::addClient(Window w) {
client->window = client->client_window; client->window = client->client_window;
} }
XWindowAttributes attrib; XWindowAttributes attrib;
#ifdef KDE #ifdef KDE
//Check and see if new client is a KDE dock applet //Check and see if new client is a KDE dock applet
//If so force reasonable size //If so force reasonable size
bool iskdedockapp=false; bool iskdedockapp=false;
@ -217,7 +222,7 @@ void Slit::addClient(Window w) {
unsigned long *data = (unsigned long *) 0, uljunk; unsigned long *data = (unsigned long *) 0, uljunk;
// Check if KDE v2.x dock applet // Check if KDE v2.x dock applet
if (XGetWindowProperty(fluxbox->getXDisplay(), w, if (XGetWindowProperty(disp, w,
fluxbox->getKWM2DockwindowAtom(), 0l, 1l, False, fluxbox->getKWM2DockwindowAtom(), 0l, 1l, False,
fluxbox->getKWM2DockwindowAtom(), fluxbox->getKWM2DockwindowAtom(),
&ajunk, &ijunk, &uljunk, &uljunk, &ajunk, &ijunk, &uljunk, &uljunk,
@ -228,7 +233,7 @@ void Slit::addClient(Window w) {
// Check if KDE v1.x dock applet // Check if KDE v1.x dock applet
if (!iskdedockapp) { if (!iskdedockapp) {
if (XGetWindowProperty(fluxbox->getXDisplay(), w, if (XGetWindowProperty(disp, w,
fluxbox->getKWM1DockwindowAtom(), 0l, 1l, False, fluxbox->getKWM1DockwindowAtom(), 0l, 1l, False,
fluxbox->getKWM1DockwindowAtom(), fluxbox->getKWM1DockwindowAtom(),
&ajunk, &ijunk, &uljunk, &uljunk, &ajunk, &ijunk, &uljunk, &uljunk,
@ -241,9 +246,9 @@ void Slit::addClient(Window w) {
if (iskdedockapp) if (iskdedockapp)
client->width = client->height = 24; client->width = client->height = 24;
else else
#endif // KDE #endif // KDE
{ {
if (XGetWindowAttributes(display, client->window, &attrib)) { if (XGetWindowAttributes(disp, client->window, &attrib)) {
client->width = attrib.width; client->width = attrib.width;
client->height = attrib.height; client->height = attrib.height;
} else { } else {
@ -251,35 +256,33 @@ void Slit::addClient(Window w) {
} }
} }
XSetWindowBorderWidth(display, client->window, 0); XSetWindowBorderWidth(disp, client->window, 0);
XSelectInput(display, frame.window, NoEventMask); XSelectInput(disp, frame.window, NoEventMask);
XSelectInput(display, client->window, NoEventMask); XSelectInput(disp, client->window, NoEventMask);
XReparentWindow(display, client->window, frame.window, 0, 0); XReparentWindow(disp, client->window, frame.window, 0, 0);
XMapRaised(display, client->window); XMapRaised(disp, client->window);
XChangeSaveSet(display, client->window, SetModeInsert); XChangeSaveSet(disp, client->window, SetModeInsert);
XSelectInput(display, frame.window, SubstructureRedirectMask | XSelectInput(disp, frame.window, SubstructureRedirectMask |
ButtonPressMask | EnterWindowMask | LeaveWindowMask); ButtonPressMask | EnterWindowMask | LeaveWindowMask);
XSelectInput(display, client->window, StructureNotifyMask | XSelectInput(disp, client->window, StructureNotifyMask |
SubstructureNotifyMask | EnterWindowMask); SubstructureNotifyMask | EnterWindowMask);
XFlush(display); XFlush(disp);
fluxbox->saveSlitSearch(client->client_window, this); Fluxbox::instance()->saveSlitSearch(client->client_window, this);
fluxbox->saveSlitSearch(client->icon_window, this); Fluxbox::instance()->saveSlitSearch(client->icon_window, this);
reconfigure(); reconfigure();
saveClientList(); saveClientList();
}
fluxbox->ungrab();
} }
void Slit::removeClient(SlitClient *client, bool remap, bool destroy) { void Slit::removeClient(SlitClient *client, bool remap, bool destroy) {
fluxbox->removeSlitSearch(client->client_window); Fluxbox::instance()->removeSlitSearch(client->client_window);
fluxbox->removeSlitSearch(client->icon_window); Fluxbox::instance()->removeSlitSearch(client->icon_window);
// Destructive removal? // Destructive removal?
if (destroy) if (destroy)
@ -287,17 +290,18 @@ void Slit::removeClient(SlitClient *client, bool remap, bool destroy) {
else // Clear the window info, but keep around to help future sorting? else // Clear the window info, but keep around to help future sorting?
client->initialize(); client->initialize();
screen->removeNetizen(client->window); screen()->removeNetizen(client->window);
if (remap && fluxbox->validateWindow(client->window)) { if (remap && Fluxbox::instance()->validateWindow(client->window)) {
XSelectInput(display, frame.window, NoEventMask); Display *disp = BaseDisplay::getXDisplay();
XSelectInput(display, client->window, NoEventMask); XSelectInput(disp, frame.window, NoEventMask);
XReparentWindow(display, client->window, screen->getRootWindow(), XSelectInput(disp, client->window, NoEventMask);
XReparentWindow(disp, client->window, screen()->getRootWindow(),
client->x, client->y); client->x, client->y);
XChangeSaveSet(display, client->window, SetModeDelete); XChangeSaveSet(disp, client->window, SetModeDelete);
XSelectInput(display, frame.window, SubstructureRedirectMask | XSelectInput(disp, frame.window, SubstructureRedirectMask |
ButtonPressMask | EnterWindowMask | LeaveWindowMask); ButtonPressMask | EnterWindowMask | LeaveWindowMask);
XFlush(display); XFlush(disp);
} }
// Destructive removal? // Destructive removal?
@ -307,7 +311,6 @@ void Slit::removeClient(SlitClient *client, bool remap, bool destroy) {
void Slit::removeClient(Window w, bool remap) { void Slit::removeClient(Window w, bool remap) {
fluxbox->grab();
bool reconf = false; bool reconf = false;
@ -321,13 +324,13 @@ void Slit::removeClient(Window w, bool remap) {
break; break;
} }
} }
if (reconf) reconfigure(); if (reconf)
reconfigure();
fluxbox->ungrab();
} }
void Slit::reconfigure(void) { void Slit::reconfigure() {
frame.width = 0; frame.width = 0;
frame.height = 0; frame.height = 0;
@ -335,7 +338,7 @@ void Slit::reconfigure(void) {
// actually correspond to mapped windows. // actually correspond to mapped windows.
int num_windows = 0; int num_windows = 0;
switch (screen->getSlitDirection()) { switch (screen()->getSlitDirection()) {
case VERTICAL: case VERTICAL:
{ {
SlitClients::iterator it = clientList.begin(); SlitClients::iterator it = clientList.begin();
@ -344,7 +347,7 @@ void Slit::reconfigure(void) {
//client created window? //client created window?
if ((*it)->window != None) { if ((*it)->window != None) {
num_windows++; num_windows++;
frame.height += (*it)->height + screen->getBevelWidth(); frame.height += (*it)->height + screen()->getBevelWidth();
//frame width < client window? //frame width < client window?
if (frame.width < (*it)->width) if (frame.width < (*it)->width)
@ -356,12 +359,12 @@ void Slit::reconfigure(void) {
if (frame.width < 1) if (frame.width < 1)
frame.width = 1; frame.width = 1;
else else
frame.width += (screen->getBevelWidth() * 2); frame.width += (screen()->getBevelWidth() * 2);
if (frame.height < 1) if (frame.height < 1)
frame.height = 1; frame.height = 1;
else else
frame.height += screen->getBevelWidth(); frame.height += screen()->getBevelWidth();
break; break;
@ -373,7 +376,7 @@ void Slit::reconfigure(void) {
//client created window? //client created window?
if ((*it)->window != None) { if ((*it)->window != None) {
num_windows++; num_windows++;
frame.width += (*it)->width + screen->getBevelWidth(); frame.width += (*it)->width + screen()->getBevelWidth();
//frame height < client height? //frame height < client height?
if (frame.height < (*it)->height) if (frame.height < (*it)->height)
frame.height = (*it)->height; frame.height = (*it)->height;
@ -384,51 +387,52 @@ void Slit::reconfigure(void) {
if (frame.width < 1) if (frame.width < 1)
frame.width = 1; frame.width = 1;
else else
frame.width += screen->getBevelWidth(); frame.width += screen()->getBevelWidth();
if (frame.height < 1) if (frame.height < 1)
frame.height = 1; frame.height = 1;
else else
frame.height += (screen->getBevelWidth() * 2); frame.height += (screen()->getBevelWidth() * 2);
break; break;
} }
reposition(); reposition();
Display *disp = BaseDisplay::getXDisplay();
XSetWindowBorderWidth(display ,frame.window, screen->getBorderWidth()); XSetWindowBorderWidth(disp, frame.window, screen()->getBorderWidth());
XSetWindowBorder(display, frame.window, XSetWindowBorder(disp, frame.window,
screen->getBorderColor()->pixel()); screen()->getBorderColor()->pixel());
//did we actually use slit slots //did we actually use slit slots
if (num_windows == 0) if (num_windows == 0)
XUnmapWindow(display, frame.window); XUnmapWindow(disp, frame.window);
else else
XMapWindow(display, frame.window); XMapWindow(disp, frame.window);
Pixmap tmp = frame.pixmap; Pixmap tmp = frame.pixmap;
BImageControl *image_ctrl = screen->getImageControl(); BImageControl *image_ctrl = screen()->getImageControl();
const FbTk::Texture *texture = &(screen->getTheme()->getSlitTexture()); const FbTk::Texture *texture = &(screen()->getTheme()->getSlitTexture());
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.pixmap = None; frame.pixmap = None;
XSetWindowBackground(display, frame.window, XSetWindowBackground(disp, frame.window,
texture->color().pixel()); texture->color().pixel());
} else { } else {
frame.pixmap = image_ctrl->renderImage(frame.width, frame.height, frame.pixmap = image_ctrl->renderImage(frame.width, frame.height,
texture); texture);
XSetWindowBackgroundPixmap(display, frame.window, frame.pixmap); XSetWindowBackgroundPixmap(disp, frame.window, frame.pixmap);
} }
if (tmp) if (tmp)
image_ctrl->removeImage(tmp); image_ctrl->removeImage(tmp);
XClearWindow(display, frame.window); XClearWindow(disp, frame.window);
int x, y; int x, y;
switch (screen->getSlitDirection()) { switch (screen()->getSlitDirection()) {
case VERTICAL: case VERTICAL:
x = 0; x = 0;
y = screen->getBevelWidth(); y = screen()->getBevelWidth();
{ {
SlitClients::iterator it = clientList.begin(); SlitClients::iterator it = clientList.begin();
@ -439,10 +443,10 @@ void Slit::reconfigure(void) {
continue; continue;
x = (frame.width - (*it)->width) / 2; x = (frame.width - (*it)->width) / 2;
Display *disp = BaseDisplay::getXDisplay();
XMoveResizeWindow(display, (*it)->window, x, y, XMoveResizeWindow(disp, (*it)->window, x, y,
(*it)->width, (*it)->height); (*it)->width, (*it)->height);
XMapWindow(display, (*it)->window); XMapWindow(disp, (*it)->window);
// for ICCCM compliance // for ICCCM compliance
(*it)->x = x; (*it)->x = x;
@ -451,7 +455,7 @@ void Slit::reconfigure(void) {
XEvent event; XEvent event;
event.type = ConfigureNotify; event.type = ConfigureNotify;
event.xconfigure.display = display; event.xconfigure.display = disp;
event.xconfigure.event = (*it)->window; event.xconfigure.event = (*it)->window;
event.xconfigure.window = (*it)->window; event.xconfigure.window = (*it)->window;
event.xconfigure.x = x; event.xconfigure.x = x;
@ -462,17 +466,17 @@ void Slit::reconfigure(void) {
event.xconfigure.above = frame.window; event.xconfigure.above = frame.window;
event.xconfigure.override_redirect = False; event.xconfigure.override_redirect = False;
XSendEvent(display, (*it)->window, False, StructureNotifyMask, XSendEvent(disp, (*it)->window, False, StructureNotifyMask,
&event); &event);
y += (*it)->height + screen->getBevelWidth(); y += (*it)->height + screen()->getBevelWidth();
} }
} }
break; break;
case HORIZONTAL: case HORIZONTAL:
x = screen->getBevelWidth(); x = screen()->getBevelWidth();
y = 0; y = 0;
{ {
@ -485,9 +489,9 @@ void Slit::reconfigure(void) {
y = (frame.height - (*it)->height) / 2; y = (frame.height - (*it)->height) / 2;
XMoveResizeWindow(display, (*it)->window, x, y, XMoveResizeWindow(disp, (*it)->window, x, y,
(*it)->width, (*it)->height); (*it)->width, (*it)->height);
XMapWindow(display, (*it)->window); XMapWindow(disp, (*it)->window);
// for ICCCM compliance // for ICCCM compliance
(*it)->x = x; (*it)->x = x;
@ -496,21 +500,21 @@ void Slit::reconfigure(void) {
XEvent event; XEvent event;
event.type = ConfigureNotify; event.type = ConfigureNotify;
event.xconfigure.display = display; event.xconfigure.display = disp;
event.xconfigure.event = (*it)->window; event.xconfigure.event = (*it)->window;
event.xconfigure.window = (*it)->window; event.xconfigure.window = (*it)->window;
event.xconfigure.x = frame.x + x + screen->getBorderWidth(); event.xconfigure.x = frame.x + x + screen()->getBorderWidth();
event.xconfigure.y = frame.y + y + screen->getBorderWidth(); event.xconfigure.y = frame.y + y + screen()->getBorderWidth();
event.xconfigure.width = (*it)->width; event.xconfigure.width = (*it)->width;
event.xconfigure.height = (*it)->height; event.xconfigure.height = (*it)->height;
event.xconfigure.border_width = 0; event.xconfigure.border_width = 0;
event.xconfigure.above = frame.window; event.xconfigure.above = frame.window;
event.xconfigure.override_redirect = False; event.xconfigure.override_redirect = False;
XSendEvent(display, (*it)->window, False, StructureNotifyMask, XSendEvent(disp, (*it)->window, False, StructureNotifyMask,
&event); &event);
x += (*it)->width + screen->getBevelWidth(); x += (*it)->width + screen()->getBevelWidth();
} }
} }
@ -527,57 +531,57 @@ void Slit::reposition() {
head_w, head_w,
head_h; head_h;
#ifdef XINERAMA #ifdef XINERAMA
if (screen->hasXinerama()) { if (screen()->hasXinerama()) {
unsigned int head = screen->getSlitOnHead(); unsigned int head = screen()->getSlitOnHead();
head_x = screen->getHeadX(head); head_x = screen()->getHeadX(head);
head_y = screen->getHeadY(head); head_y = screen()->getHeadY(head);
head_w = screen->getHeadWidth(head); head_w = screen()->getHeadWidth(head);
head_h = screen->getHeadHeight(head); head_h = screen()->getHeadHeight(head);
} else { } else {
head_w = screen->getWidth(); head_w = screen()->getWidth();
head_h = screen->getHeight(); head_h = screen()->getHeight();
} }
#else // !XINERAMA #else // !XINERAMA
head_w = screen->getWidth(); head_w = screen()->getWidth();
head_h = screen->getHeight(); head_h = screen()->getHeight();
#endif // XINERAMA #endif // XINERAMA
// place the slit in the appropriate place // place the slit in the appropriate place
switch (screen->getSlitPlacement()) { switch (screen()->getSlitPlacement()) {
case TOPLEFT: case TOPLEFT:
frame.x = head_x; frame.x = head_x;
frame.y = head_y; frame.y = head_y;
if (screen->getSlitDirection() == VERTICAL) { if (screen()->getSlitDirection() == VERTICAL) {
frame.x_hidden = screen->getBevelWidth() - frame.x_hidden = screen()->getBevelWidth() -
screen->getBorderWidth() - frame.width; screen()->getBorderWidth() - frame.width;
frame.y_hidden = head_y; frame.y_hidden = head_y;
} else { } else {
frame.x_hidden = head_x; frame.x_hidden = head_x;
frame.y_hidden = screen->getBevelWidth() - frame.y_hidden = screen()->getBevelWidth() -
screen->getBorderWidth() - frame.height; screen()->getBorderWidth() - frame.height;
} }
break; break;
case CENTERLEFT: case CENTERLEFT:
frame.x = head_x; frame.x = head_x;
frame.y = head_y + (head_h - frame.height) / 2; frame.y = head_y + (head_h - frame.height) / 2;
frame.x_hidden = head_x + screen->getBevelWidth() - frame.x_hidden = head_x + screen()->getBevelWidth() -
screen->getBorderWidth() - frame.width; screen()->getBorderWidth() - frame.width;
frame.y_hidden = frame.y; frame.y_hidden = frame.y;
break; break;
case BOTTOMLEFT: case BOTTOMLEFT:
frame.x = head_x; frame.x = head_x;
frame.y = head_h - frame.height - screen->getBorderWidth2x(); frame.y = head_h - frame.height - screen()->getBorderWidth2x();
if (screen->getSlitDirection() == VERTICAL) { if (screen()->getSlitDirection() == VERTICAL) {
frame.x_hidden = head_x + screen->getBevelWidth() - frame.x_hidden = head_x + screen()->getBevelWidth() -
screen->getBorderWidth() - frame.width; screen()->getBorderWidth() - frame.width;
frame.y_hidden = frame.y; frame.y_hidden = frame.y;
} else { } else {
frame.x_hidden = head_x; frame.x_hidden = head_x;
frame.y_hidden = head_y + head_h - frame.y_hidden = head_y + head_h -
screen->getBevelWidth() - screen->getBorderWidth(); screen()->getBevelWidth() - screen()->getBorderWidth();
} }
break; break;
@ -585,85 +589,88 @@ void Slit::reposition() {
frame.x = head_x + ((head_w - frame.width) / 2); frame.x = head_x + ((head_w - frame.width) / 2);
frame.y = head_y; frame.y = head_y;
frame.x_hidden = frame.x; frame.x_hidden = frame.x;
frame.y_hidden = head_y + screen->getBevelWidth() - frame.y_hidden = head_y + screen()->getBevelWidth() -
screen->getBorderWidth() - frame.height; screen()->getBorderWidth() - frame.height;
break; break;
case BOTTOMCENTER: case BOTTOMCENTER:
frame.x = head_x + ((head_w - frame.width) / 2); frame.x = head_x + ((head_w - frame.width) / 2);
frame.y = head_y + head_h - frame.height - screen->getBorderWidth2x(); frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x_hidden = frame.x; frame.x_hidden = frame.x;
frame.y_hidden = head_y + head_h - frame.y_hidden = head_y + head_h -
screen->getBevelWidth() - screen->getBorderWidth(); screen()->getBevelWidth() - screen()->getBorderWidth();
break; break;
case TOPRIGHT: case TOPRIGHT:
frame.x = head_x + head_w - frame.width - screen->getBorderWidth2x(); frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y; frame.y = head_y;
if (screen->getSlitDirection() == VERTICAL) { if (screen()->getSlitDirection() == VERTICAL) {
frame.x_hidden = head_x + head_w - frame.x_hidden = head_x + head_w -
screen->getBevelWidth() - screen->getBorderWidth(); screen()->getBevelWidth() - screen()->getBorderWidth();
frame.y_hidden = head_y; frame.y_hidden = head_y;
} else { } else {
frame.x_hidden = frame.x; frame.x_hidden = frame.x;
frame.y_hidden = head_y + screen->getBevelWidth() - frame.y_hidden = head_y + screen()->getBevelWidth() -
screen->getBorderWidth() - frame.height; screen()->getBorderWidth() - frame.height;
} }
break; break;
case CENTERRIGHT: case CENTERRIGHT:
default: default:
frame.x = head_x + head_w - frame.width - screen->getBorderWidth2x(); frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y + ((head_h - frame.height) / 2); frame.y = head_y + ((head_h - frame.height) / 2);
frame.x_hidden = head_x + head_w - frame.x_hidden = head_x + head_w -
screen->getBevelWidth() - screen->getBorderWidth(); screen()->getBevelWidth() - screen()->getBorderWidth();
frame.y_hidden = frame.y; frame.y_hidden = frame.y;
break; break;
case BOTTOMRIGHT: case BOTTOMRIGHT:
frame.x = head_x + head_w - frame.width - screen->getBorderWidth2x(); frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y + head_h - frame.height - screen->getBorderWidth2x(); frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
if (screen->getSlitDirection() == VERTICAL) { if (screen()->getSlitDirection() == VERTICAL) {
frame.x_hidden = head_x + head_w - frame.x_hidden = head_x + head_w -
screen->getBevelWidth() - screen->getBorderWidth(); screen()->getBevelWidth() - screen()->getBorderWidth();
frame.y_hidden = frame.y; frame.y_hidden = frame.y;
} else { } else {
frame.x_hidden = frame.x; frame.x_hidden = frame.x;
frame.y_hidden = head_y + head_h - frame.y_hidden = head_y + head_h -
screen->getBevelWidth() - screen->getBorderWidth(); screen()->getBevelWidth() - screen()->getBorderWidth();
} }
break; break;
} }
const Toolbar * const tbar = screen->getToolbar(); const Toolbar * const tbar = screen()->getToolbar();
int sw = frame.width + screen->getBorderWidth2x(), int sw = frame.width + screen()->getBorderWidth2x(),
sh = frame.height + screen->getBorderWidth2x(), sh = frame.height + screen()->getBorderWidth2x(),
tw = tbar->width() + screen->getBorderWidth(), tw = tbar->width() + screen()->getBorderWidth(),
th = tbar->height() + screen->getBorderWidth(); th = tbar->height() + screen()->getBorderWidth();
if (tbar->x() < frame.x + sw && tbar->x() + tw > frame.x && if (tbar->x() < frame.x + sw && tbar->x() + tw > frame.x &&
tbar->y() < frame.y + sh && tbar->y() + th > frame.y) { tbar->y() < frame.y + sh && tbar->y() + th > frame.y) {
if (frame.y < th) { if (frame.y < th) {
frame.y += tbar->getExposedHeight(); frame.y += tbar->getExposedHeight();
if (screen->getSlitDirection() == VERTICAL) if (screen()->getSlitDirection() == VERTICAL)
frame.y_hidden += tbar->getExposedHeight(); frame.y_hidden += tbar->getExposedHeight();
else else
frame.y_hidden = frame.y; frame.y_hidden = frame.y;
} else { } else {
frame.y -= tbar->getExposedHeight(); frame.y -= tbar->getExposedHeight();
if (screen->getSlitDirection() == VERTICAL) if (screen()->getSlitDirection() == VERTICAL)
frame.y_hidden -= tbar->getExposedHeight(); frame.y_hidden -= tbar->getExposedHeight();
else else
frame.y_hidden = frame.y; frame.y_hidden = frame.y;
} }
} }
if (hidden) Display *disp = BaseDisplay::getXDisplay();
XMoveResizeWindow(display, frame.window, frame.x_hidden,
if (hidden) {
XMoveResizeWindow(disp, frame.window, frame.x_hidden,
frame.y_hidden, frame.width, frame.height); frame.y_hidden, frame.width, frame.height);
else } else {
XMoveResizeWindow(display, frame.window, frame.x, XMoveResizeWindow(disp, frame.window, frame.x,
frame.y, frame.width, frame.height); frame.y, frame.width, frame.height);
}
} }
@ -675,14 +682,15 @@ void Slit::shutdown() {
void Slit::buttonPressEvent(XButtonEvent *e) { void Slit::buttonPressEvent(XButtonEvent *e) {
if (e->window != frame.window) return; if (e->window != frame.window)
return;
if (e->button == Button1 && (! on_top)) { if (e->button == Button1 && (! on_top)) {
Workspace::Stack st; Workspace::Stack st;
st.push_back(frame.window); st.push_back(frame.window);
screen->raiseWindows(st); screen()->raiseWindows(st);
} else if (e->button == Button2 && (! on_top)) { } else if (e->button == Button2 && (! on_top)) {
XLowerWindow(display, frame.window); XLowerWindow(BaseDisplay::getXDisplay(), frame.window);
} else if (e->button == Button3) { } else if (e->button == Button3) {
if (! slitmenu.isVisible()) { if (! slitmenu.isVisible()) {
int x = e->x_root - (slitmenu.width() / 2), int x = e->x_root - (slitmenu.width() / 2),
@ -690,13 +698,13 @@ void Slit::buttonPressEvent(XButtonEvent *e) {
if (x < 0) if (x < 0)
x = 0; x = 0;
else if (x + slitmenu.width() > screen->getWidth()) else if (x + slitmenu.width() > screen()->getWidth())
x = screen->getWidth() - slitmenu.width(); x = screen()->getWidth() - slitmenu.width();
if (y < 0) if (y < 0)
y = 0; y = 0;
else if (y + slitmenu.height() > screen->getHeight()) else if (y + slitmenu.height() > screen()->getHeight())
y = screen->getHeight() - slitmenu.height(); y = screen()->getHeight() - slitmenu.height();
slitmenu.move(x, y); slitmenu.move(x, y);
slitmenu.show(); slitmenu.show();
@ -735,9 +743,10 @@ void Slit::leaveNotifyEvent(XCrossingEvent *) {
void Slit::configureRequestEvent(XConfigureRequestEvent *e) { void Slit::configureRequestEvent(XConfigureRequestEvent *e) {
fluxbox->grab();
if (fluxbox->validateWindow(e->window)) { if (!Fluxbox::instance()->validateWindow(e->window))
return;
bool reconf = false; bool reconf = false;
XWindowChanges xwc; XWindowChanges xwc;
@ -749,43 +758,43 @@ void Slit::configureRequestEvent(XConfigureRequestEvent *e) {
xwc.sibling = e->above; xwc.sibling = e->above;
xwc.stack_mode = e->detail; xwc.stack_mode = e->detail;
XConfigureWindow(display, e->window, e->value_mask, &xwc); XConfigureWindow(BaseDisplay::getXDisplay(), e->window, e->value_mask, &xwc);
SlitClients::iterator it = clientList.begin(); SlitClients::iterator it = clientList.begin();
SlitClients::iterator it_end = clientList.end(); SlitClients::iterator it_end = clientList.end();
for (; it != it_end; ++it) for (; it != it_end; ++it) {
if ((*it)->window == e->window) if ((*it)->window == e->window) {
if ((*it)->width != ((unsigned) e->width) || if ((*it)->width != ((unsigned) e->width) ||
(*it)->height != ((unsigned) e->height)) { (*it)->height != ((unsigned) e->height)) {
(*it)->width = (unsigned) e->width; (*it)->width = (unsigned) e->width;
(*it)->height = (unsigned) e->height; (*it)->height = (unsigned) e->height;
reconf = true; reconf = true; //requires reconfiguration
break; break;
} }
}
if (reconf) reconfigure();
} }
fluxbox->ungrab(); if (reconf)
reconfigure();
} }
void Slit::timeout() { void Slit::timeout() {
hidden = ! hidden; hidden = ! hidden;
Display *disp = BaseDisplay::getXDisplay();
if (hidden) if (hidden)
XMoveWindow(display, frame.window, frame.x_hidden, frame.y_hidden); XMoveWindow(disp, frame.window, frame.x_hidden, frame.y_hidden);
else else
XMoveWindow(display, frame.window, frame.x, frame.y); XMoveWindow(disp, frame.window, frame.x, frame.y);
} }
void Slit::loadClientList() { void Slit::loadClientList() {
const std::string &filename = fluxbox->getSlitlistFilename(); const std::string &filename = Fluxbox::instance()->getSlitlistFilename();
struct stat buf; struct stat buf;
if (!stat(filename.c_str(), &buf)) { if (!stat(filename.c_str(), &buf)) {
std::ifstream file(fluxbox->getSlitlistFilename().c_str()); std::ifstream file(Fluxbox::instance()->getSlitlistFilename().c_str());
std::string name; std::string name;
while (! file.eof()) { while (! file.eof()) {
name = ""; name = "";
@ -798,8 +807,8 @@ void Slit::loadClientList() {
} }
} }
void Slit::saveClientList(void) { void Slit::saveClientList() {
const std::string &filename = fluxbox->getSlitlistFilename(); const std::string &filename = Fluxbox::instance()->getSlitlistFilename();
std::ofstream file(filename.c_str()); std::ofstream file(filename.c_str());
SlitClients::iterator it = clientList.begin(); SlitClients::iterator it = clientList.begin();
SlitClients::iterator it_end = clientList.end(); SlitClients::iterator it_end = clientList.end();
@ -813,10 +822,28 @@ void Slit::saveClientList(void) {
prevName = name; prevName = name;
} }
} }
void Slit::setOnTop(bool val) {
on_top = val;
screen()->saveSlitOnTop(val);
if (isOnTop())
screen()->raiseWindows(Workspace::Stack());
}
Slitmenu::Slitmenu(Slit &sl) : Basemenu(sl.screen), void Slit::setAutoHide(bool val) {
slit(sl) { do_auto_hide = val;
screen()->saveSlitAutoHide(val);
}
Slitmenu::Slitmenu(Slit &sl) : Basemenu(sl.screen()),
slit(sl),
#ifdef XINERAMA
m_headmenu(0),
#endif // XINERAMA
m_placementmenu(*this),
m_directionmenu(*this) {
I18n *i18n = I18n::instance(); I18n *i18n = I18n::instance();
using namespace FBNLS; using namespace FBNLS;
@ -825,27 +852,25 @@ slit(sl) {
"Slit")); "Slit"));
setInternalMenu(); setInternalMenu();
directionmenu = new Directionmenu(this);
placementmenu = new Placementmenu(this);
#ifdef XINERAMA #ifdef XINERAMA
if (screen()->hasXinerama()) { // only create if we need if (screen()->hasXinerama()) { // only create if we need
headmenu = new Headmenu(this); m_headmenu.reset(new Headmenu(this));
} }
#endif // XINERAMA #endif // XINERAMA
insert(i18n->getMessage( insert(i18n->getMessage(
CommonSet, CommonDirectionTitle, CommonSet, CommonDirectionTitle,
"Direction"), "Direction"),
directionmenu); &m_directionmenu);
insert(i18n->getMessage( insert(i18n->getMessage(
CommonSet, CommonPlacementTitle, CommonSet, CommonPlacementTitle,
"Placement"), "Placement"),
placementmenu); &m_placementmenu);
#ifdef XINERAMA #ifdef XINERAMA
//TODO: NLS
if (screen()->hasXinerama()) { if (screen()->hasXinerama()) {
insert(i18n->getMessage(0, 0, "Place on Head"), headmenu); insert(i18n->getMessage(0, 0, "Place on Head"), m_headmenu.get());
} }
#endif // XINERAMA #endif // XINERAMA
@ -865,13 +890,7 @@ slit(sl) {
Slitmenu::~Slitmenu() { Slitmenu::~Slitmenu() {
delete directionmenu;
delete placementmenu;
#ifdef XINERAMA
if (screen()->hasXinerama()) {
delete headmenu;
}
#endif // XINERAMA
} }
@ -881,28 +900,17 @@ void Slitmenu::itemSelected(int button, unsigned int index) {
if (! item) return; if (! item) return;
switch (item->function()) { switch (item->function()) {
case 1: // always on top case 1:
{ // toggle on top
bool change = ((slit.isOnTop()) ? false : true); slit.setOnTop(slit.isOnTop() ? false : true);
slit.on_top = change; setItemSelected(2, slit.isOnTop());
screen()->saveSlitOnTop(change);
setItemSelected(2, change);
if (slit.isOnTop())
screen()->raiseWindows(Workspace::Stack());
break; break;
}
case 2: // auto hide case 2: // auto hide
{ slit.setAutoHide(slit.doAutoHide() ? false : true);
bool change = (slit.doAutoHide() ? false : true); setItemSelected(3, slit.doAutoHide());
slit.do_auto_hide = change;
screen()->saveSlitAutoHide(change);
setItemSelected(3, change);
break; break;
} }
}
//save the new configuration //save the new configuration
Fluxbox::instance()->save_rc(); Fluxbox::instance()->save_rc();
update(); update();
@ -910,19 +918,19 @@ void Slitmenu::itemSelected(int button, unsigned int index) {
} }
void Slitmenu::internal_hide(void) { void Slitmenu::internal_hide() {
Basemenu::internal_hide(); Basemenu::internal_hide();
if (slit.doAutoHide()) if (slit.doAutoHide())
slit.timeout(); slit.timeout();
} }
void Slitmenu::reconfigure(void) { void Slitmenu::reconfigure() {
directionmenu->reconfigure(); m_directionmenu.reconfigure();
placementmenu->reconfigure(); m_placementmenu.reconfigure();
#ifdef XINERAMA #ifdef XINERAMA
if (screen()->hasXinerama()) { if (m_headmenu.get() != 0) {
headmenu->reconfigure(); m_headmenu->reconfigure();
} }
#endif // XINERAMA #endif // XINERAMA
setItemSelected(2, slit.isOnTop()); setItemSelected(2, slit.isOnTop());
@ -932,7 +940,7 @@ void Slitmenu::reconfigure(void) {
} }
Slitmenu::Directionmenu::Directionmenu(Slitmenu *sm) : Basemenu(sm->screen()), Slitmenu::Directionmenu::Directionmenu(Slitmenu &sm) : Basemenu(sm.screen()),
slitmenu(sm) { slitmenu(sm) {
I18n *i18n = I18n::instance(); I18n *i18n = I18n::instance();
@ -963,7 +971,8 @@ slitmenu(sm) {
void Slitmenu::Directionmenu::itemSelected(int button, unsigned int index) { void Slitmenu::Directionmenu::itemSelected(int button, unsigned int index) {
if (button == 1) { if (button == 1) {
BasemenuItem *item = find(index); BasemenuItem *item = find(index);
if (! item) return; if (item == 0)
return;
screen()->saveSlitDirection(item->function()); screen()->saveSlitDirection(item->function());
@ -976,12 +985,12 @@ void Slitmenu::Directionmenu::itemSelected(int button, unsigned int index) {
} }
Fluxbox::instance()->save_rc(); Fluxbox::instance()->save_rc();
hide(); hide();
slitmenu->slit.reconfigure(); slitmenu.slit.reconfigure();
} }
} }
Slitmenu::Placementmenu::Placementmenu(Slitmenu *sm) : Basemenu(sm->screen()), Slitmenu::Placementmenu::Placementmenu(Slitmenu &sm) : Basemenu(sm.screen()),
slitmenu(sm) { slitmenu(sm) {
I18n *i18n = I18n::instance(); I18n *i18n = I18n::instance();
@ -1038,7 +1047,7 @@ void Slitmenu::Placementmenu::itemSelected(int button, unsigned int index) {
if (item->function()) { if (item->function()) {
screen()->saveSlitPlacement(item->function()); screen()->saveSlitPlacement(item->function());
hide(); hide();
slitmenu->slit.reconfigure(); slitmenu.slit.reconfigure();
Fluxbox::instance()->save_rc(); Fluxbox::instance()->save_rc();
} }
} }
@ -1080,14 +1089,12 @@ void Slitmenu::Headmenu::itemSelected(int button, unsigned int index) {
#endif // XINERAMA #endif // XINERAMA
Slit::SlitClient::SlitClient(const char *name) Slit::SlitClient::SlitClient(const char *name) {
{
initialize(); initialize();
match_name = name; match_name = (name == 0 ? "" : name);
} }
Slit::SlitClient::SlitClient(BScreen *screen, Window w) Slit::SlitClient::SlitClient(BScreen *screen, Window w) {
{
initialize(screen, w); initialize(screen, w);
} }