moved some events in process_event to eventhandling functions

This commit is contained in:
fluxgen 2002-02-06 17:12:09 +00:00
parent 42fa67144f
commit 532d0eb203

View file

@ -22,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: fluxbox.cc,v 1.27 2002/02/06 10:17:30 fluxgen Exp $ // $Id: fluxbox.cc,v 1.28 2002/02/06 17:12:09 fluxgen Exp $
//Use some GNU extensions //Use some GNU extensions
#ifndef _GNU_SOURCE #ifndef _GNU_SOURCE
@ -305,7 +305,7 @@ m_rc_cache_life(m_resourcemanager, 5, "session.cacheLife", "Session.CacheLife"),
m_rc_cache_max(m_resourcemanager, 200, "session.cacheMax", "Session.CacheMax"), m_rc_cache_max(m_resourcemanager, 200, "session.cacheMax", "Session.CacheMax"),
focused_window(0), focused_window(0),
masked_window(0), masked_window(0),
no_focus(False), no_focus(false),
rc_file(rc), rc_file(rc),
argv(m_argv), argc(m_argc), argv(m_argv), argc(m_argc),
key(0) key(0)
@ -388,7 +388,7 @@ key(0)
XSynchronize(getXDisplay(), False); XSynchronize(getXDisplay(), False);
XSync(getXDisplay(), False); XSync(getXDisplay(), False);
reconfigure_wait = reread_menu_wait = False; reconfigure_wait = reread_menu_wait = false;
timer = new BTimer(this, this); timer = new BTimer(this, this);
timer->setTimeout(0); timer->setTimeout(0);
@ -446,142 +446,10 @@ void Fluxbox::process_event(XEvent *e) {
} }
switch (e->type) { switch (e->type) {
case ButtonPress:
{
last_time = e->xbutton.time;
FluxboxWindow *win = (FluxboxWindow *) 0;
Basemenu *menu = (Basemenu *) 0;
#ifdef SLIT
Slit *slit = (Slit *) 0;
#endif // SLIT
Toolbar *tbar = (Toolbar *) 0;
Tab *tab = 0;
if ((win = searchWindow(e->xbutton.window))) {
win->buttonPressEvent(&e->xbutton);
if (e->xbutton.button == 1)
win->installColormap(True);
} else if ((menu = searchMenu(e->xbutton.window))) {
menu->buttonPressEvent(&e->xbutton);
#ifdef SLIT
} else if ((slit = searchSlit(e->xbutton.window))) {
slit->buttonPressEvent(&e->xbutton);
#endif // SLIT
} else if ((tbar = searchToolbar(e->xbutton.window))) {
tbar->buttonPressEvent(&e->xbutton);
} else if ((tab = searchTab(e->xbutton.window))) {
tab->buttonPressEvent(&e->xbutton);
} else {
LinkedListIterator<BScreen> it(screenList);
for (; it.current(); it++) {
BScreen *screen = it.current();
//if ( e->xbutton.button == 1 &&
// (win = screen->getIconBar()->findWindow(e->xbutton.window)) ) {
// win->deiconify();
if (e->xbutton.window == screen->getRootWindow()) {
if (e->xbutton.button == 1) {
if (! screen->isRootColormapInstalled())
screen->getImageControl()->installRootColormap();
if (screen->getWorkspacemenu()->isVisible())
screen->getWorkspacemenu()->hide();
if (screen->getRootmenu()->isVisible())
screen->getRootmenu()->hide();
} else if (e->xbutton.button == 2) {
int mx = e->xbutton.x_root -
(screen->getWorkspacemenu()->getWidth() / 2);
int my = e->xbutton.y_root -
(screen->getWorkspacemenu()->getTitleHeight() / 2);
if (mx < 0) mx = 0;
if (my < 0) my = 0;
if (mx + screen->getWorkspacemenu()->getWidth() >
screen->getWidth())
mx = screen->getWidth() -
screen->getWorkspacemenu()->getWidth() -
screen->getBorderWidth();
if (my + screen->getWorkspacemenu()->getHeight() >
screen->getHeight())
my = screen->getHeight() -
screen->getWorkspacemenu()->getHeight() -
screen->getBorderWidth();
screen->getWorkspacemenu()->move(mx, my);
if (! screen->getWorkspacemenu()->isVisible()) {
screen->getWorkspacemenu()->removeParent();
screen->getWorkspacemenu()->show();
}
} else if (e->xbutton.button == 3) {
int mx = e->xbutton.x_root -
(screen->getRootmenu()->getWidth() / 2);
int my = e->xbutton.y_root -
(screen->getRootmenu()->getTitleHeight() / 2);
if (mx < 0) mx = 0;
if (my < 0) my = 0;
if (mx + screen->getRootmenu()->getWidth() > screen->getWidth())
mx = screen->getWidth() -
screen->getRootmenu()->getWidth() -
screen->getBorderWidth();
if (my + screen->getRootmenu()->getHeight() >
screen->getHeight())
my = screen->getHeight() -
screen->getRootmenu()->getHeight() -
screen->getBorderWidth();
screen->getRootmenu()->move(mx, my);
if (! screen->getRootmenu()->isVisible()) {
checkMenu();
screen->getRootmenu()->show();
}
}
}
}
}
break;
}
case ButtonRelease: case ButtonRelease:
{ case ButtonPress:
last_time = e->xbutton.time; handleButtonEvent(e->xbutton);
FluxboxWindow *win = (FluxboxWindow *) 0;
Basemenu *menu = (Basemenu *) 0;
Toolbar *tbar = (Toolbar *) 0;
Tab *tab = 0;
if ((win = searchWindow(e->xbutton.window)))
win->buttonReleaseEvent(&e->xbutton);
else if ((menu = searchMenu(e->xbutton.window)))
menu->buttonReleaseEvent(&e->xbutton);
else if ((tbar = searchToolbar(e->xbutton.window)))
tbar->buttonReleaseEvent(&e->xbutton);
else if ((tab = searchTab(e->xbutton.window)))
tab->buttonReleaseEvent(&e->xbutton);
break; break;
}
case ConfigureRequest: case ConfigureRequest:
{ {
FluxboxWindow *win = (FluxboxWindow *) 0; FluxboxWindow *win = (FluxboxWindow *) 0;
@ -619,9 +487,8 @@ void Fluxbox::process_event(XEvent *e) {
ungrab(); ungrab();
} }
break;
} }
break;
case MapRequest: case MapRequest:
{ {
#ifdef DEBUG #ifdef DEBUG
@ -696,49 +563,46 @@ void Fluxbox::process_event(XEvent *e) {
if ((win = searchWindow(e->xmaprequest.window))) if ((win = searchWindow(e->xmaprequest.window)))
win->mapRequestEvent(&e->xmaprequest); win->mapRequestEvent(&e->xmaprequest);
break;
} }
break;
case MapNotify: case MapNotify:
{ {
#ifdef DEBUG
cerr<<__FILE__<<"("<<__LINE__<<"): MapNotify:"<<hex<<e->xmap.window<<endl;
#endif
FluxboxWindow *win = searchWindow(e->xmap.window); FluxboxWindow *win = searchWindow(e->xmap.window);
XMapWindow(getXDisplay(), e->xmap.window);
if (win) if (win!=0)
win->mapNotifyEvent(&e->xmap); win->mapNotifyEvent(&e->xmap);
break;
} }
break;
case UnmapNotify: case UnmapNotify:
{ {
#ifdef DEBUG
cerr<<__FILE__<<"("<<__LINE__<<"): UnmapNotify:"<<hex<<e->xunmap.window<<endl;
#endif
FluxboxWindow *win = (FluxboxWindow *) 0; FluxboxWindow *win = (FluxboxWindow *) 0;
#ifdef SLIT #ifdef SLIT
Slit *slit = (Slit *) 0; Slit *slit = (Slit *) 0;
#endif // SLIT #endif // SLIT
if ((win = searchWindow(e->xunmap.window))) { if ((win = searchWindow(e->xunmap.window))!=0 ) {
// only process windows with StructureNotify selected // only process windows with StructureNotify selected
// (ignore SubstructureNotify) // (ignore SubstructureNotify)
// if (win->windowFor(e->xunmap.window))
if (win->getClientWindow() != e->xunmap.window || if (win->getClientWindow() != e->xunmap.window ||
win->isTransient()) win->isTransient())
win->unmapNotifyEvent(&e->xunmap); win->unmapNotifyEvent(&e->xunmap);
#ifdef SLIT #ifdef SLIT
} else if ((slit = searchSlit(e->xunmap.window))) { } else if ((slit = searchSlit(e->xunmap.window))!=0) {
slit->removeClient(e->xunmap.window); slit->removeClient(e->xunmap.window);
#ifdef DEBUG
cerr<<__FILE__<<"("<<__LINE__<<"): Here"<<endl;
#endif
#endif // SLIT #endif // SLIT
} }
break;
} }
break;
case CreateNotify: case CreateNotify:
break; break;
case DestroyNotify: case DestroyNotify:
@ -760,9 +624,8 @@ void Fluxbox::process_event(XEvent *e) {
#endif // SLIT #endif // SLIT
} }
break;
} }
break;
case MotionNotify: case MotionNotify:
{ {
last_time = e->xmotion.time; last_time = e->xmotion.time;
@ -771,16 +634,16 @@ void Fluxbox::process_event(XEvent *e) {
Basemenu *menu = 0; Basemenu *menu = 0;
Tab *tab = 0; Tab *tab = 0;
if ((win = searchWindow(e->xmotion.window))) if ((win = searchWindow(e->xmotion.window)) !=0)
win->motionNotifyEvent(&e->xmotion); win->motionNotifyEvent(&e->xmotion);
else if ((menu = searchMenu(e->xmotion.window))) else if ((menu = searchMenu(e->xmotion.window)) !=0)
menu->motionNotifyEvent(&e->xmotion); menu->motionNotifyEvent(&e->xmotion);
else if ((tab = searchTab(e->xmotion.window))) else if ((tab = searchTab(e->xmotion.window)) !=0)
tab->motionNotifyEvent(&e->xmotion); tab->motionNotifyEvent(&e->xmotion);
break;
}
}
break;
case PropertyNotify: case PropertyNotify:
{ {
last_time = e->xproperty.time; last_time = e->xproperty.time;
@ -792,9 +655,8 @@ void Fluxbox::process_event(XEvent *e) {
win->propertyNotifyEvent(e->xproperty.atom); win->propertyNotifyEvent(e->xproperty.atom);
} }
break;
} }
break;
case EnterNotify: case EnterNotify:
{ {
last_time = e->xcrossing.time; last_time = e->xcrossing.time;
@ -858,9 +720,9 @@ void Fluxbox::process_event(XEvent *e) {
slit->enterNotifyEvent(&e->xcrossing); slit->enterNotifyEvent(&e->xcrossing);
#endif // SLIT #endif // SLIT
break;
}
}
break;
case LeaveNotify: case LeaveNotify:
{ {
last_time = e->xcrossing.time; last_time = e->xcrossing.time;
@ -884,9 +746,9 @@ void Fluxbox::process_event(XEvent *e) {
slit->leaveNotifyEvent(&e->xcrossing); slit->leaveNotifyEvent(&e->xcrossing);
#endif // SLIT #endif // SLIT
break;
}
}
break;
case Expose: case Expose:
{ {
FluxboxWindow *win = (FluxboxWindow *) 0; FluxboxWindow *win = (FluxboxWindow *) 0;
@ -902,22 +764,282 @@ void Fluxbox::process_event(XEvent *e) {
tbar->exposeEvent(&e->xexpose); tbar->exposeEvent(&e->xexpose);
else if ((tab = searchTab(e->xexpose.window))) else if ((tab = searchTab(e->xexpose.window)))
tab->exposeEvent(&e->xexpose); tab->exposeEvent(&e->xexpose);
}
break; break;
case KeyPress:
handleKeyEvent(e->xkey);
break;
case ColormapNotify:
{
BScreen *screen = searchScreen(e->xcolormap.window);
if (screen)
screen->setRootColormapInstalled((e->xcolormap.state ==
ColormapInstalled) ? True : False);
}
break;
case FocusIn:
{
if (e->xfocus.mode == NotifyUngrab ||
e->xfocus.detail == NotifyPointer)
break;
FluxboxWindow *win = searchWindow(e->xfocus.window);
if (win && ! win->isFocused())
setFocusedWindow(win);
}
break;
case FocusOut:
break;
case ClientMessage:
handleClientMessage(e->xclient);
break;
default:
{
#ifdef SHAPE
if (e->type == getShapeEventBase()) {
XShapeEvent *shape_event = (XShapeEvent *) e;
FluxboxWindow *win = (FluxboxWindow *) 0;
if ((win = searchWindow(e->xany.window)) ||
(shape_event->kind != ShapeBounding))
win->shapeEvent(shape_event);
}
#endif // SHAPE
}
}
} }
void Fluxbox::handleButtonEvent(XButtonEvent &be) {
switch (be.type) {
case ButtonPress:
{
last_time = be.time;
FluxboxWindow *win = (FluxboxWindow *) 0;
Basemenu *menu = (Basemenu *) 0;
#ifdef SLIT
Slit *slit = (Slit *) 0;
#endif // SLIT
Toolbar *tbar = (Toolbar *) 0;
Tab *tab = 0;
if ((win = searchWindow(be.window))) {
win->buttonPressEvent(&be);
if (be.button == 1)
win->installColormap(True);
} else if ((menu = searchMenu(be.window))) {
menu->buttonPressEvent(&be);
#ifdef SLIT
} else if ((slit = searchSlit(be.window))) {
slit->buttonPressEvent(&be);
#endif // SLIT
} else if ((tbar = searchToolbar(be.window))) {
tbar->buttonPressEvent(&be);
} else if ((tab = searchTab(be.window))) {
tab->buttonPressEvent(&be);
} else {
LinkedListIterator<BScreen> it(screenList);
for (; it.current(); it++) {
BScreen *screen = it.current();
if (be.window != screen->getRootWindow())
continue;
if (be.button == 1) {
if (! screen->isRootColormapInstalled())
screen->getImageControl()->installRootColormap();
if (screen->getWorkspacemenu()->isVisible())
screen->getWorkspacemenu()->hide();
if (screen->getRootmenu()->isVisible())
screen->getRootmenu()->hide();
} else if (be.button == 2) {
int mx = be.x_root -
(screen->getWorkspacemenu()->getWidth() / 2);
int my = be.y_root -
(screen->getWorkspacemenu()->getTitleHeight() / 2);
if (mx < 0) mx = 0;
if (my < 0) my = 0;
if (mx + screen->getWorkspacemenu()->getWidth() >
screen->getWidth()) {
mx = screen->getWidth() -
screen->getWorkspacemenu()->getWidth() -
screen->getBorderWidth();
}
if (my + screen->getWorkspacemenu()->getHeight() >
screen->getHeight()) {
my = screen->getHeight() -
screen->getWorkspacemenu()->getHeight() -
screen->getBorderWidth();
}
screen->getWorkspacemenu()->move(mx, my);
if (! screen->getWorkspacemenu()->isVisible()) {
screen->getWorkspacemenu()->removeParent();
screen->getWorkspacemenu()->show();
}
} else if (be.button == 3) {
//calculate placement of workspace menu
//and show/hide it
int mx = be.x_root -
(screen->getRootmenu()->getWidth() / 2);
int my = be.y_root -
(screen->getRootmenu()->getTitleHeight() / 2);
if (mx < 0) mx = 0;
if (my < 0) my = 0;
if (mx + screen->getRootmenu()->getWidth() > screen->getWidth()) {
mx = screen->getWidth() -
screen->getRootmenu()->getWidth() -
screen->getBorderWidth();
}
if (my + screen->getRootmenu()->getHeight() >
screen->getHeight()) {
my = screen->getHeight() -
screen->getRootmenu()->getHeight() -
screen->getBorderWidth();
}
screen->getRootmenu()->move(mx, my);
if (! screen->getRootmenu()->isVisible()) {
checkMenu();
screen->getRootmenu()->show();
}
} // end button == 3
}
}
}
break;
case ButtonRelease:
{
last_time = be.time;
FluxboxWindow *win = (FluxboxWindow *) 0;
Basemenu *menu = (Basemenu *) 0;
Toolbar *tbar = (Toolbar *) 0;
Tab *tab = 0;
if ((win = searchWindow(be.window)))
win->buttonReleaseEvent(&be);
else if ((menu = searchMenu(be.window)))
menu->buttonReleaseEvent(&be);
else if ((tbar = searchToolbar(be.window)))
tbar->buttonReleaseEvent(&be);
else if ((tab = searchTab(be.window)))
tab->buttonReleaseEvent(&be);
}
break;
default:
break;
}
}
//------------ handleClientMessage --------
// Handles XClientMessageEvent
//-----------------------------------------
void Fluxbox::handleClientMessage(XClientMessageEvent &ce) {
#ifdef DEBUG
cerr<<__FILE__<<"("<<__LINE__<<"): ClientMessage. data.l[0]="<<ce.data.l[0]<<endl;
#endif
if (ce.format != 32)
return;
if (ce.message_type == getWMChangeStateAtom()) {
FluxboxWindow *win = searchWindow(ce.window);
if (! win || ! win->validateClient())
return;
if (ce.data.l[0] == IconicState)
win->iconify();
if (ce.data.l[0] == NormalState)
win->deiconify();
} else if (ce.message_type == getFluxboxChangeWorkspaceAtom()) {
BScreen *screen = searchScreen(ce.window);
if (screen && ce.data.l[0] >= 0 &&
ce.data.l[0] < screen->getCount())
screen->changeWorkspaceID(ce.data.l[0]);
} else if (ce.message_type == getFluxboxChangeWindowFocusAtom()) {
FluxboxWindow *win = searchWindow(ce.window);
if (win && win->isVisible() && win->setInputFocus())
win->installColormap(True);
} else if (ce.message_type == getFluxboxCycleWindowFocusAtom()) {
BScreen *screen = searchScreen(ce.window);
if (screen) {
if (! ce.data.l[0])
screen->prevFocus();
else
screen->nextFocus();
}
} else if (ce.message_type == getFluxboxChangeAttributesAtom()) {
FluxboxWindow *win = searchWindow(ce.window);
if (win && win->validateClient()) {
BlackboxHints net;
net.flags = ce.data.l[0];
net.attrib = ce.data.l[1];
net.workspace = ce.data.l[2];
net.stack = ce.data.l[3];
net.decoration = static_cast<BaseDisplay::Decor>(ce.data.l[4]);
win->changeBlackboxHints(&net);
}
} else {
bool val = false;
#ifdef GNOME
val = checkGnomeAtoms(ce);
#endif //!GNOME
#ifdef NEWWMSPEC
if (!val)
val = checkNETWMAtoms(ce);
#endif //!NEWWMSPEC
}
}
//----------- handleKeyEvent ---------------
// Handles KeyRelease and KeyPress events
//------------------------------------------
void Fluxbox::handleKeyEvent(XKeyEvent &ke) {
switch (ke.type) {
case KeyPress: case KeyPress:
{ {
Toolbar *tbar = searchToolbar(e->xkey.window); Toolbar *tbar = searchToolbar(ke.window);
BScreen *screen = searchScreen(e->xkey.window); BScreen *screen = searchScreen(ke.window);
if (tbar && tbar->isEditing()) if (tbar && tbar->isEditing())
tbar->keyPressEvent(&e->xkey); tbar->keyPressEvent(&ke);
else if (screen) { else if (screen) {
#ifdef DEBUG #ifdef DEBUG
cerr<<"KeyEvent"<<endl; cerr<<"KeyEvent"<<endl;
#endif #endif
//find action //find action
Keys::KeyAction action = key->getAction(&e->xkey); Keys::KeyAction action = key->getAction(&ke);
#ifdef DEBUG #ifdef DEBUG
const char *actionstr = key->getActionStr(action); const char *actionstr = key->getActionStr(action);
if (actionstr) if (actionstr)
@ -975,7 +1097,6 @@ void Fluxbox::process_event(XEvent *e) {
case Keys::RIGHTWORKSPACE: case Keys::RIGHTWORKSPACE:
screen->rightWorkspace(); screen->rightWorkspace();
break; break;
case Keys::KILLWINDOW: //kill the current window case Keys::KILLWINDOW: //kill the current window
XKillClient(screen->getBaseDisplay()->getXDisplay(), XKillClient(screen->getBaseDisplay()->getXDisplay(),
focused_window->getClientWindow()); focused_window->getClientWindow());
@ -1031,8 +1152,9 @@ void Fluxbox::process_event(XEvent *e) {
spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", item->exec(), NULL); spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", item->exec(), NULL);
#endif // !__EMX__ #endif // !__EMX__
break;
} }
break;
default: //try to see if its a window action default: //try to see if its a window action
doWindowAction(action); doWindowAction(action);
} }
@ -1040,141 +1162,12 @@ void Fluxbox::process_event(XEvent *e) {
break; break;
} }
case ColormapNotify:
{
BScreen *screen = searchScreen(e->xcolormap.window);
if (screen)
screen->setRootColormapInstalled((e->xcolormap.state ==
ColormapInstalled) ? True : False);
break;
}
case FocusIn:
{
if (e->xfocus.mode == NotifyUngrab ||
e->xfocus.detail == NotifyPointer)
break;
FluxboxWindow *win = searchWindow(e->xfocus.window);
if (win && ! win->isFocused())
setFocusedWindow(win);
break;
}
case FocusOut:
break;
case ClientMessage:
{
#ifdef DEBUG
cerr<<__FILE__<<"("<<__LINE__<<"): ClientMessage. data.l[0]="<<e->xclient.data.l[0]<<endl;
#endif
if (e->xclient.format == 32) {
if (e->xclient.message_type == getWMChangeStateAtom()) {
FluxboxWindow *win = searchWindow(e->xclient.window);
if (! win || ! win->validateClient())
return;
if (e->xclient.data.l[0] == IconicState)
win->iconify();
if (e->xclient.data.l[0] == NormalState)
win->deiconify();
} else if (e->xclient.message_type == getFluxboxChangeWorkspaceAtom()) {
BScreen *screen = searchScreen(e->xclient.window);
if (screen && e->xclient.data.l[0] >= 0 &&
e->xclient.data.l[0] < screen->getCount())
screen->changeWorkspaceID(e->xclient.data.l[0]);
} else if (e->xclient.message_type == getFluxboxChangeWindowFocusAtom()) {
FluxboxWindow *win = searchWindow(e->xclient.window);
if (win && win->isVisible() && win->setInputFocus())
win->installColormap(True);
} else if (e->xclient.message_type == getFluxboxCycleWindowFocusAtom()) {
BScreen *screen = searchScreen(e->xclient.window);
if (screen)
if (! e->xclient.data.l[0])
screen->prevFocus();
else
screen->nextFocus();
} else if (e->xclient.message_type == getFluxboxChangeAttributesAtom()) {
FluxboxWindow *win = searchWindow(e->xclient.window);
if (win && win->validateClient()) {
BlackboxHints net;
net.flags = e->xclient.data.l[0];
net.attrib = e->xclient.data.l[1];
net.workspace = e->xclient.data.l[2];
net.stack = e->xclient.data.l[3];
net.decoration = static_cast<BaseDisplay::Decor>(e->xclient.data.l[4]);
win->changeBlackboxHints(&net);
}
}
#ifdef GNOME
else if (e->xclient.message_type == getGnomeWorkspaceAtom()) {
#ifdef DEBUG
cerr<<__FILE__<<"("<<__LINE__<<"): Got workspace atom="<<e->xclient.data.l[0]<<endl;
#endif//!DEBUG
BScreen *screen = 0;
FluxboxWindow *win = 0;
if ( (win = searchWindow(e->xclient.window))!=0 &&
win->getScreen() && e->xclient.data.l[0] >= 0 &&
e->xclient.data.l[0] < win->getScreen()->getCount()) {
win->getScreen()->changeWorkspaceID(e->xclient.data.l[0]);
} else if ((screen = searchScreen(e->xclient.window))!=0 &&
e->xclient.data.l[0] >= 0 &&
e->xclient.data.l[0] < screen->getCount()) {
screen->changeWorkspaceID(e->xclient.data.l[0]);
}
}
#endif //!GNOME
#ifdef NEWWMSPEC
else if (e->xclient.message_type == getNETWMDesktopAtom()) {
BScreen *screen = searchScreen(e->xclient.window);
if (screen && e->xclient.data.l[0] >= 0 &&
e->xclient.data.l[0] < screen->getCount())
screen->changeWorkspaceID(e->xclient.data.l[0]);
}
#endif //!NEWWMSPEC
}
break;
}
default: default:
{ break;
#ifdef SHAPE
if (e->type == getShapeEventBase()) {
XShapeEvent *shape_event = (XShapeEvent *) e;
FluxboxWindow *win = (FluxboxWindow *) 0;
if ((win = searchWindow(e->xany.window)) ||
(shape_event->kind != ShapeBounding))
win->shapeEvent(shape_event);
}
#endif // SHAPE
}
}
} }
}
void Fluxbox::doWindowAction(Keys::KeyAction action) { void Fluxbox::doWindowAction(Keys::KeyAction action) {
if (!focused_window) if (!focused_window)
return; return;
@ -1320,6 +1313,55 @@ void Fluxbox::doWindowAction(Keys::KeyAction action) {
} }
} }
#ifdef GNOME
//---------------- checkGnomeAtoms ---------------
// Tries to find Gnome atoms in message
// Returns true on success else false
//---------------------------------------------
bool Fluxbox::checkGnomeAtoms(XClientMessageEvent &ce) {
if (ce.message_type == getGnomeWorkspaceAtom()) {
#ifdef DEBUG
cerr<<__FILE__<<"("<<__LINE__<<"): Got workspace atom="<<ce.data.l[0]<<endl;
#endif//!DEBUG
BScreen *screen = 0;
FluxboxWindow *win = 0;
if ( (win = searchWindow(ce.window))!=0 && // the message sent to client window?
win->getScreen() && ce.data.l[0] >= 0 &&
ce.data.l[0] < win->getScreen()->getCount()) {
win->getScreen()->changeWorkspaceID(ce.data.l[0]);
} else if ((screen = searchScreen(ce.window))!=0 && //the message sent to root window?
ce.data.l[0] >= 0 &&
ce.data.l[0] < screen->getCount()) {
screen->changeWorkspaceID(ce.data.l[0]);
}
} else
return false; //no gnome atom
return true;
}
#endif //!GNOME
#ifdef NEWWMSPEC
//----------- checkNETWMAtoms -------------------
// Tries to find NEWWM atom in clientmessage
// Returns true on success else false
//-----------------------------------------------
bool Fluxbox::checkNETWMAtoms(XClientMessageEvent &ce) {
if (ce.message_type == getNETWMDesktopAtom()) { //_NET_WM_DESKTOP
BScreen *screen = searchScreen(ce.window);
if (screen && ce.data.l[0] >= 0 &&
ce.data.l[0] < screen->getCount())
screen->changeWorkspaceID(ce.data.l[0]);
} else return false;
return true;
}
#endif //!NEWWMSPEC
Bool Fluxbox::handleSignal(int sig) { Bool Fluxbox::handleSignal(int sig) {
switch (sig) { switch (sig) {
@ -2148,7 +2190,7 @@ void Fluxbox::reload_rc(void) {
void Fluxbox::reconfigure(void) { void Fluxbox::reconfigure(void) {
reconfigure_wait = True; reconfigure_wait = true;
if (! timer->isTiming()) timer->start(); if (! timer->isTiming()) timer->start();
} }
@ -2301,16 +2343,16 @@ void Fluxbox::timeout(void) {
if (reread_menu_wait) if (reread_menu_wait)
real_rereadMenu(); real_rereadMenu();
reconfigure_wait = reread_menu_wait = False; reconfigure_wait = reread_menu_wait = false;
} }
void Fluxbox::setFocusedWindow(FluxboxWindow *win) { void Fluxbox::setFocusedWindow(FluxboxWindow *win) {
BScreen *old_screen = (BScreen *) 0, *screen = (BScreen *) 0; BScreen *old_screen = 0, *screen = 0;
FluxboxWindow *old_win = (FluxboxWindow *) 0; FluxboxWindow *old_win = 0;
Toolbar *old_tbar = (Toolbar *) 0, *tbar = (Toolbar *) 0; Toolbar *old_tbar = 0, *tbar = 0;
Workspace *old_wkspc = (Workspace *) 0, *wkspc = (Workspace *) 0; Workspace *old_wkspc = 0, *wkspc = 0;
if (focused_window) { if (focused_window) {
old_win = focused_window; old_win = focused_window;