fixed slit client resize bug and a bug in slit client list menu

This commit is contained in:
fluxgen 2003-02-20 16:41:22 +00:00
parent 318c6e02c5
commit ab62678bc6

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Slit.cc,v 1.35 2003/02/18 15:11:08 rathnor Exp $
// $Id: Slit.cc,v 1.36 2003/02/20 16:41:22 fluxgen Exp $
#include "Slit.hh"
@ -146,10 +146,14 @@ public:
visible = true;
}
void disableEvents() {
if (window == 0)
return;
Display *disp = FbTk::App::instance()->display();
XSelectInput(disp, window, NoEventMask);
}
void enableEvents() {
if (window == 0)
return;
Display *disp = FbTk::App::instance()->display();
XSelectInput(disp, window, StructureNotifyMask |
SubstructureNotifyMask | EnterWindowMask);
@ -231,7 +235,7 @@ private:
}; // End anonymous namespace
Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
: m_screen(&scr), timer(this),
: m_screen(scr), timer(this),
slitmenu(*scr.menuTheme(),
scr.getScreenNumber(),
*scr.getImageControl()),
@ -245,11 +249,11 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
m_layeritem(0)
{
slit_layermenu = new LayerMenu<Slit>(*scr.menuTheme(),
slit_layermenu.reset(new LayerMenu<Slit>(*scr.menuTheme(),
scr.getScreenNumber(),
*scr.getImageControl(),
*scr.layerManager().getLayer(Fluxbox::instance()->getMenuLayer()),
this);
this));
// default placement and direction
m_direction = HORIZONTAL;
@ -266,8 +270,8 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
CWColormap | CWOverrideRedirect | CWEventMask;
attrib.background_pixmap = None;
attrib.background_pixel = attrib.border_pixel =
screen()->getBorderColor()->pixel();
attrib.colormap = screen()->colormap();
screen().getBorderColor()->pixel();
attrib.colormap = screen().colormap();
attrib.override_redirect = True;
attrib.event_mask = SubstructureRedirectMask | ButtonPressMask |
EnterWindowMask | LeaveWindowMask;
@ -276,13 +280,14 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
frame.width = frame.height = 1;
Display *disp = FbTk::App::instance()->display();
frame.window =
XCreateWindow(disp, screen()->getRootWindow(), frame.x, frame.y,
frame.width, frame.height, screen()->getBorderWidth(),
screen()->getDepth(), InputOutput, screen()->getVisual(),
XCreateWindow(disp, screen().getRootWindow(), frame.x, frame.y,
frame.width, frame.height, screen().getBorderWidth(),
screen().getDepth(), InputOutput, screen().getVisual(),
create_mask, &attrib);
FbTk::EventManager::instance()->add(*this, frame.window);
m_layeritem = new FbTk::XLayerItem(frame.window, layer);
m_layeritem.reset(new FbTk::XLayerItem(frame.window, layer));
//For KDE dock applets
kwm1_dockwindow = XInternAtom(disp, "KWM_DOCKWINDOW", False); //KDE v1.x
@ -299,15 +304,14 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
Slit::~Slit() {
if (frame.pixmap != 0)
screen()->getImageControl()->removeImage(frame.pixmap);
if (m_layeritem) delete m_layeritem;
if (slit_layermenu) delete slit_layermenu;
screen().getImageControl()->removeImage(frame.pixmap);
}
void Slit::addClient(Window w) {
#ifdef DEBUG
cerr<<"Slit::addClient()"<<endl;
cerr<<__FILE__": addClient(w = 0x"<<hex<<w<<dec<<")"<<endl;
#endif // DEBUG
//Can't add non existent window
if (w == None)
@ -316,7 +320,7 @@ void Slit::addClient(Window w) {
// Look for slot in client list by name
SlitClient *client = 0;
std::string match_name;
::getWMName(screen(), w, match_name);
::getWMName(&screen(), w, match_name);
SlitClients::iterator it = clientList.begin();
SlitClients::iterator it_end = clientList.end();
bool found_match = false;
@ -326,7 +330,7 @@ void Slit::addClient(Window w) {
// Use the slot if no window is assigned
if ((*it)->window == None) {
client = (*it);
client->initialize(screen(), w);
client->initialize(&screen(), w);
break;
}
// Otherwise keep looking for an unused match or a non-match
@ -334,14 +338,14 @@ void Slit::addClient(Window w) {
} else if (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);
break;
}
}
// Append to client list?
if (client == 0) {
client = new SlitClient(screen(), w);
client = new SlitClient(&screen(), w);
clientList.push_back(client);
}
@ -351,8 +355,8 @@ void Slit::addClient(Window w) {
if (wmhints != 0) {
if ((wmhints->flags & IconWindowHint) &&
(wmhints->icon_window != None)) {
XMoveWindow(disp, client->client_window, screen()->getWidth() + 10,
screen()->getHeight() + 10);
XMoveWindow(disp, client->client_window, screen().getWidth() + 10,
screen().getHeight() + 10);
XMapWindow(disp, client->client_window);
client->icon_window = wmhints->icon_window;
client->window = client->icon_window;
@ -373,10 +377,10 @@ void Slit::addClient(Window w) {
//Check and see if new client is a KDE dock applet
//If so force reasonable size
bool iskdedockapp=false;
bool iskdedockapp = false;
Atom ajunk;
int ijunk;
unsigned long *data = (unsigned long *) 0, uljunk;
unsigned long *data = 0, uljunk;
// Check if KDE v2.x dock applet
if (XGetWindowProperty(disp, w,
@ -424,13 +428,16 @@ void Slit::addClient(Window w) {
XReparentWindow(disp, client->window, frame.window.window(), 0, 0);
XMapRaised(disp, client->window);
XChangeSaveSet(disp, client->window, SetModeInsert);
// reactivate events for frame.window
frame.window.setEventMask(SubstructureRedirectMask |
ButtonPressMask | EnterWindowMask | LeaveWindowMask);
// setup event for slit client window
client->enableEvents();
// flush events
XFlush(disp);
// add slit client to eventmanager
FbTk::EventManager::instance()->add(*this, client->client_window);
FbTk::EventManager::instance()->add(*this, client->icon_window);
@ -457,11 +464,14 @@ void Slit::setPlacement(Placement place) {
void Slit::removeClient(SlitClient *client, bool remap, bool destroy) {
#ifdef DEBUG
cerr<<"Slit::removeClient()"<<endl;
cerr<<"Slit::removeClient( client->client_window = 0x"<<hex<<client->client_window<<
", client->icon_window)"<<endl;
#endif // DEBUG
// remove from event manager
FbTk::EventManager::instance()->remove(client->client_window);
FbTk::EventManager::instance()->remove(client->icon_window);
if (client->client_window != 0)
FbTk::EventManager::instance()->remove(client->client_window);
if (client->icon_window != 0)
FbTk::EventManager::instance()->remove(client->icon_window);
// Destructive removal?
if (destroy)
@ -469,16 +479,18 @@ void Slit::removeClient(SlitClient *client, bool remap, bool destroy) {
else // Clear the window info, but keep around to help future sorting?
client->initialize();
screen()->removeNetizen(client->window);
screen().removeNetizen(client->window);
if (remap) {
if (remap && client->window != 0) {
Display *disp = FbTk::App::instance()->display();
if (!client->visible)
XMapWindow(disp, client->window);
client->disableEvents();
// stop events to frame.window temporarly
frame.window.setEventMask(NoEventMask);
XReparentWindow(disp, client->window, screen()->getRootWindow(),
XReparentWindow(disp, client->window, screen().getRootWindow(),
client->x, client->y);
XChangeSaveSet(disp, client->window, SetModeDelete);
// reactivate events to frame.window
@ -532,7 +544,7 @@ void Slit::reconfigure() {
//client created window?
if ((*it)->window != None && (*it)->visible) {
num_windows++;
frame.height += (*it)->height + screen()->getBevelWidth();
frame.height += (*it)->height + screen().getBevelWidth();
//frame width < client window?
if (frame.width < (*it)->width)
@ -544,12 +556,12 @@ void Slit::reconfigure() {
if (frame.width < 1)
frame.width = 1;
else
frame.width += (screen()->getBevelWidth() * 2);
frame.width += (screen().getBevelWidth() * 2);
if (frame.height < 1)
frame.height = 1;
else
frame.height += screen()->getBevelWidth();
frame.height += screen().getBevelWidth();
break;
@ -561,7 +573,7 @@ void Slit::reconfigure() {
//client created window?
if ((*it)->window != None && (*it)->visible) {
num_windows++;
frame.width += (*it)->width + screen()->getBevelWidth();
frame.width += (*it)->width + screen().getBevelWidth();
//frame height < client height?
if (frame.height < (*it)->height)
frame.height = (*it)->height;
@ -572,12 +584,12 @@ void Slit::reconfigure() {
if (frame.width < 1)
frame.width = 1;
else
frame.width += screen()->getBevelWidth();
frame.width += screen().getBevelWidth();
if (frame.height < 1)
frame.height = 1;
else
frame.height += (screen()->getBevelWidth() * 2);
frame.height += (screen().getBevelWidth() * 2);
break;
}
@ -585,8 +597,8 @@ void Slit::reconfigure() {
reposition();
Display *disp = FbTk::App::instance()->display();
frame.window.setBorderWidth(screen()->getBorderWidth());
frame.window.setBorderColor(*screen()->getBorderColor());
frame.window.setBorderWidth(screen().getBorderWidth());
frame.window.setBorderColor(*screen().getBorderColor());
//did we actually use slit slots
if (num_windows == 0)
frame.window.hide();
@ -594,8 +606,8 @@ void Slit::reconfigure() {
frame.window.show();
Pixmap tmp = frame.pixmap;
FbTk::ImageControl *image_ctrl = screen()->getImageControl();
const FbTk::Texture &texture = screen()->getTheme()->getSlitTexture();
FbTk::ImageControl *image_ctrl = screen().getImageControl();
const FbTk::Texture &texture = screen().getTheme()->getSlitTexture();
if (texture.type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.pixmap = None;
frame.window.setBackgroundColor(texture.color());
@ -615,7 +627,7 @@ void Slit::reconfigure() {
switch (direction()) {
case VERTICAL:
x = 0;
y = screen()->getBevelWidth();
y = screen().getBevelWidth();
{
SlitClients::iterator it = clientList.begin();
@ -660,14 +672,14 @@ void Slit::reconfigure() {
XSendEvent(disp, (*it)->window, False, StructureNotifyMask,
&event);
y += (*it)->height + screen()->getBevelWidth();
y += (*it)->height + screen().getBevelWidth();
}
}
break;
case HORIZONTAL:
x = screen()->getBevelWidth();
x = screen().getBevelWidth();
y = 0;
{
@ -706,8 +718,8 @@ void Slit::reconfigure() {
event.xconfigure.display = disp;
event.xconfigure.event = (*it)->window;
event.xconfigure.window = (*it)->window;
event.xconfigure.x = frame.x + x + screen()->getBorderWidth();
event.xconfigure.y = frame.y + y + screen()->getBorderWidth();
event.xconfigure.x = frame.x + x + screen().getBorderWidth();
event.xconfigure.y = frame.y + y + screen().getBorderWidth();
event.xconfigure.width = (*it)->width;
event.xconfigure.height = (*it)->height;
event.xconfigure.border_width = 0;
@ -717,7 +729,7 @@ void Slit::reconfigure() {
XSendEvent(disp, (*it)->window, False, StructureNotifyMask,
&event);
x += (*it)->width + screen()->getBevelWidth();
x += (*it)->width + screen().getBevelWidth();
}
}
@ -735,8 +747,8 @@ void Slit::reposition() {
head_w,
head_h;
head_w = screen()->getWidth();
head_h = screen()->getHeight();
head_w = screen().getWidth();
head_h = screen().getHeight();
// place the slit in the appropriate place
switch (placement()) {
@ -744,35 +756,35 @@ void Slit::reposition() {
frame.x = head_x;
frame.y = head_y;
if (direction() == VERTICAL) {
frame.x_hidden = screen()->getBevelWidth() -
screen()->getBorderWidth() - frame.width;
frame.x_hidden = screen().getBevelWidth() -
screen().getBorderWidth() - frame.width;
frame.y_hidden = head_y;
} else {
frame.x_hidden = head_x;
frame.y_hidden = screen()->getBevelWidth() -
screen()->getBorderWidth() - frame.height;
frame.y_hidden = screen().getBevelWidth() -
screen().getBorderWidth() - frame.height;
}
break;
case CENTERLEFT:
frame.x = head_x;
frame.y = head_y + (head_h - frame.height) / 2;
frame.x_hidden = head_x + screen()->getBevelWidth() -
screen()->getBorderWidth() - frame.width;
frame.x_hidden = head_x + screen().getBevelWidth() -
screen().getBorderWidth() - frame.width;
frame.y_hidden = frame.y;
break;
case BOTTOMLEFT:
frame.x = head_x;
frame.y = head_h - frame.height - screen()->getBorderWidth2x();
frame.y = head_h - frame.height - screen().getBorderWidth2x();
if (direction() == VERTICAL) {
frame.x_hidden = head_x + screen()->getBevelWidth() -
screen()->getBorderWidth() - frame.width;
frame.x_hidden = head_x + screen().getBevelWidth() -
screen().getBorderWidth() - frame.width;
frame.y_hidden = frame.y;
} else {
frame.x_hidden = head_x;
frame.y_hidden = head_y + head_h -
screen()->getBevelWidth() - screen()->getBorderWidth();
screen().getBevelWidth() - screen().getBorderWidth();
}
break;
@ -780,52 +792,52 @@ void Slit::reposition() {
frame.x = head_x + ((head_w - frame.width) / 2);
frame.y = head_y;
frame.x_hidden = frame.x;
frame.y_hidden = head_y + screen()->getBevelWidth() -
screen()->getBorderWidth() - frame.height;
frame.y_hidden = head_y + screen().getBevelWidth() -
screen().getBorderWidth() - frame.height;
break;
case BOTTOMCENTER:
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.y_hidden = head_y + head_h -
screen()->getBevelWidth() - screen()->getBorderWidth();
screen().getBevelWidth() - screen().getBorderWidth();
break;
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;
if (direction() == VERTICAL) {
frame.x_hidden = head_x + head_w -
screen()->getBevelWidth() - screen()->getBorderWidth();
screen().getBevelWidth() - screen().getBorderWidth();
frame.y_hidden = head_y;
} else {
frame.x_hidden = frame.x;
frame.y_hidden = head_y + screen()->getBevelWidth() -
screen()->getBorderWidth() - frame.height;
frame.y_hidden = head_y + screen().getBevelWidth() -
screen().getBorderWidth() - frame.height;
}
break;
case CENTERRIGHT:
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.x_hidden = head_x + head_w -
screen()->getBevelWidth() - screen()->getBorderWidth();
screen().getBevelWidth() - screen().getBorderWidth();
frame.y_hidden = frame.y;
break;
case BOTTOMRIGHT:
frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x = head_x + head_w - frame.width - screen().getBorderWidth2x();
frame.y = head_y + head_h - frame.height - screen().getBorderWidth2x();
if (direction() == VERTICAL) {
frame.x_hidden = head_x + head_w -
screen()->getBevelWidth() - screen()->getBorderWidth();
screen().getBevelWidth() - screen().getBorderWidth();
frame.y_hidden = frame.y;
} else {
frame.x_hidden = frame.x;
frame.y_hidden = head_y + head_h -
screen()->getBevelWidth() - screen()->getBorderWidth();
screen().getBevelWidth() - screen().getBorderWidth();
}
break;
}
@ -870,7 +882,9 @@ void Slit::cycleClientsDown() {
}
void Slit::handleEvent(XEvent &event) {
if (event.type == DestroyNotify) {
if (event.type == ConfigureRequest) {
configureRequestEvent(event.xconfigurerequest);
} else if (event.type == DestroyNotify) {
removeClient(event.xdestroywindow.window, false);
} else if (event.type == UnmapNotify) {
removeClient(event.xany.window);
@ -926,13 +940,13 @@ void Slit::buttonPressEvent(XButtonEvent &e) {
if (x < 0)
x = 0;
else if (x + slitmenu.width() > screen()->getWidth())
x = screen()->getWidth() - slitmenu.width();
else if (x + slitmenu.width() > screen().getWidth())
x = screen().getWidth() - slitmenu.width();
if (y < 0)
y = 0;
else if (y + slitmenu.height() > screen()->getHeight())
y = screen()->getHeight() - slitmenu.height();
else if (y + slitmenu.height() > screen().getHeight())
y = screen().getHeight() - slitmenu.height();
slitmenu.move(x, y);
slitmenu.show();
@ -1054,7 +1068,7 @@ void Slit::updateClientmenu() {
FbTk::RefCount<FbTk::Command> reconfig(new FbTk::SimpleCommand<Slit>(*this, &Slit::reconfigure));
SlitClients::iterator it = clientList.begin();
for (; it != clientList.end(); ++it) {
if ((*it) != 0)
if ((*it) != 0 && (*it)->window != 0)
clientlist_menu.insert(new SlitClientMenuItem(*(*it), reconfig));
}
@ -1094,7 +1108,7 @@ void Slit::setupMenu() {
"Placement"),
&placement_menu);
slitmenu.insert("Layer...", slit_layermenu);
slitmenu.insert("Layer...", slit_layermenu.get());
slitmenu.insert(new BoolMenuItem(i18n->getMessage(
CommonSet, CommonAutoHide,