// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
-#ifdef HAVE_CONFIG_H
-# include "../config.h"
-#endif // HAVE_CONFIG_H
+#include "../config.h"
extern "C" {
#include <X11/Xatom.h>
#endif // HAVE_STDARG_H
}
+#include <assert.h>
+
#include <algorithm>
#include <functional>
+#include <string>
using std::string;
#include "i18n.hh"
#include "Window.hh"
#include "Workspace.hh"
#include "Workspacemenu.hh"
+#include "XAtom.hh"
#ifndef FONT_ELEMENT_SIZE
#define FONT_ELEMENT_SIZE 50
blackbox = bb;
screenstr = (string)"session.screen" + itostring(scrn) + '.';
config = blackbox->getConfig();
+ xatom = blackbox->getXAtom();
event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask |
SubstructureRedirectMask | ButtonPressMask | ButtonReleaseMask;
resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font =
resource.wstyle.font = (XFontStruct *) 0;
+ xatom->setSupported(this); // set-up netwm support
#ifdef HAVE_GETPID
- pid_t bpid = getpid();
-
- XChangeProperty(blackbox->getXDisplay(), getRootWindow(),
- blackbox->getBlackboxPidAtom(), XA_CARDINAL,
- sizeof(pid_t) * 8, PropModeReplace,
- (unsigned char *) &bpid, 1);
+ xatom->setValue(getRootWindow(), XAtom::blackbox_pid, XAtom::cardinal,
+ (unsigned long) getpid());
#endif // HAVE_GETPID
XDefineCursor(blackbox->getXDisplay(), getRootWindow(),
}
saveWorkspaceNames();
+ updateNetizenWorkspaceCount();
+
workspacemenu->insert(i18n(IconSet, IconIcons, "Icons"), iconmenu);
workspacemenu->update();
current_workspace = workspacesList.front();
+
+ xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
+ XAtom::cardinal, 0); //first workspace
+
workspacemenu->setItemSelected(2, True);
toolbar = new Toolbar(this);
}
+void BScreen::saveHideToolbar(bool h) {
+ resource.hide_toolbar = h;
+ if (resource.hide_toolbar)
+ toolbar->unmapToolbar();
+ else
+ toolbar->mapToolbar();
+ config->setValue(screenstr + "hideToolbar", resource.hide_toolbar);
+}
+
+
+void BScreen::saveWindowToWindowSnap(bool s) {
+ resource.window_to_window_snap = s;
+ config->setValue(screenstr + "windowToWindowSnap",
+ resource.window_to_window_snap);
+}
+
+
+void BScreen::saveWindowCornerSnap(bool s) {
+ resource.window_corner_snap = s;
+ config->setValue(screenstr + "windowCornerSnap",
+ resource.window_corner_snap);
+}
+
+
void BScreen::saveWorkspaces(unsigned int w) {
resource.workspaces = w;
config->setValue(screenstr + "workspaces", resource.workspaces);
saveFullMax(resource.full_max);
saveFocusNew(resource.focus_new);
saveFocusLast(resource.focus_last);
+ saveHideToolbar(resource.hide_toolbar);
+ saveWindowToWindowSnap(resource.window_to_window_snap);
+ saveWindowCornerSnap(resource.window_corner_snap);
saveWorkspaces(resource.workspaces);
savePlacementPolicy(resource.placement_policy);
saveEdgeSnapThreshold(resource.edge_snap_threshold);
if (! config->getValue(screenstr + "opaqueMove", resource.opaque_move))
resource.opaque_move = false;
+ if (! config->getValue(screenstr + "hideToolbar", resource.hide_toolbar))
+ resource.hide_toolbar = false;
+
+ if (! config->getValue(screenstr + "windowToWindowSnap",
+ resource.window_to_window_snap))
+ resource.window_to_window_snap = true;
+
+ if (! config->getValue(screenstr + "windowCornerSnap",
+ resource.window_corner_snap))
+ resource.window_corner_snap = true;
+
if (! config->getValue(screenstr + "imageDither", b))
b = true;
image_control->setDither(b);
workspacemenu->reconfigure();
iconmenu->reconfigure();
- int remember_sub = rootmenu->getCurrentSubmenu();
+ typedef std::vector<int> SubList;
+ SubList remember_subs;
+
+ // save the current open menus
+ Basemenu *menu = rootmenu;
+ int submenu;
+ while ((submenu = menu->getCurrentSubmenu()) >= 0) {
+ remember_subs.push_back(submenu);
+ menu = menu->find(submenu)->submenu();
+ assert(menu);
+ }
+
InitMenu();
raiseWindows(0, 0);
rootmenu->reconfigure();
- rootmenu->drawSubmenu(remember_sub);
+
+ // reopen the saved menus
+ menu = rootmenu;
+ const SubList::iterator subs_end = remember_subs.end();
+ for (SubList::iterator it = remember_subs.begin(); it != subs_end; ++it) {
+ menu->drawSubmenu(*it);
+ menu = menu->find(*it)->submenu();
+ if (! menu)
+ break;
+ }
configmenu->reconfigure();
unsigned int BScreen::addWorkspace(void) {
Workspace *wkspc = new Workspace(this, workspacesList.size());
workspacesList.push_back(wkspc);
- saveWorkspaces(getWorkspaceCount() + 1);
+ saveWorkspaces(getWorkspaceCount());
saveWorkspaceNames();
workspacemenu->insert(wkspc->getName(), wkspc->getMenu(),
workspacesList.pop_back();
delete wkspc;
- saveWorkspaces(getWorkspaceCount() - 1);
+ saveWorkspaces(getWorkspaceCount());
saveWorkspaceNames();
toolbar->reconfigure();
workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
- if (blackbox->getFocusedWindow() &&
- blackbox->getFocusedWindow()->getScreen() == this &&
- (! blackbox->getFocusedWindow()->isStuck())) {
- current_workspace->setLastFocusedWindow(blackbox->getFocusedWindow());
+ BlackboxWindow *focused = blackbox->getFocusedWindow();
+ if (focused && focused->getScreen() == this && ! focused->isStuck()) {
+ if (focused->getWorkspaceNumber() != current_workspace->getID()) {
+ fprintf(stderr, "%s is on the wrong workspace, aborting\n",
+ focused->getTitle());
+ abort();
+ }
+ current_workspace->setLastFocusedWindow(focused);
blackbox->setFocusedWindow((BlackboxWindow *) 0);
}
current_workspace = getWorkspace(id);
+ xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
+ XAtom::cardinal, id);
+ printf("%d\n", id);
+
workspacemenu->setItemSelected(current_workspace->getID() + 2, True);
toolbar->redrawWorkspaceLabel(True);
XMapRequestEvent mre;
mre.window = w;
- win->restoreAttributes();
+ if (blackbox->isStartup()) win->restoreAttributes();
win->mapRequestEvent(&mre);
}
removeNetizen(w->getClientWindow());
+ /*
+ some managed windows can also be window group controllers. when
+ unmanaging such windows, we should also delete the window group.
+ */
+ BWindowGroup *group = blackbox->searchGroup(w->getClientWindow());
+ delete group;
+
delete w;
}
void BScreen::updateNetizenWorkspaceCount(void) {
+ xatom->setValue(getRootWindow(), XAtom::net_number_of_desktops,
+ XAtom::cardinal, workspacesList.size());
+
std::for_each(netizenList.begin(), netizenList.end(),
std::mem_fun(&Netizen::sendWorkspaceCount));
}
blackbox->checkMenu();
rootmenu->show();
}
+ // mouse wheel up
+ } else if (xbutton->button == 4) {
+ if (getCurrentWorkspaceID() >= getWorkspaceCount() - 1)
+ changeWorkspaceID(0);
+ else
+ changeWorkspaceID(getCurrentWorkspaceID() + 1);
+ // mouse wheel down
+ } else if (xbutton->button == 5) {
+ if (getCurrentWorkspaceID() == 0)
+ changeWorkspaceID(getWorkspaceCount() - 1);
+ else
+ changeWorkspaceID(getCurrentWorkspaceID() - 1);
}
}