X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=f4c3dcadbee13b1c2bc5237535b1f0ef38a54dc0;hb=fb613db29ffcf1539c91f0ac0ca5d25cb4e593b5;hp=eb81f0ca901e185777c902a01573982777f379fa;hpb=f2ecfb623b54dacec13d23260a3c6512632c0eef;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index eb81f0ca..f4c3dcad 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -205,17 +205,19 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { iconmenu = new Iconmenu(this); configmenu = new Configmenu(this); - Workspace *wkspc = (Workspace *) 0; if (resource.workspaces != 0) { for (unsigned int i = 0; i < resource.workspaces; ++i) { - wkspc = new Workspace(this, workspacesList.size()); + Workspace *wkspc = new Workspace(this, workspacesList.size()); workspacesList.push_back(wkspc); - workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); + workspacemenu->insertWorkspace(wkspc); + workspacemenu->update(); + } } else { - wkspc = new Workspace(this, workspacesList.size()); + Workspace *wkspc = new Workspace(this, workspacesList.size()); workspacesList.push_back(wkspc); - workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); + workspacemenu->insertWorkspace(wkspc); + workspacemenu->update(); } saveWorkspaceNames(); @@ -310,6 +312,12 @@ BScreen::~BScreen(void) { std::for_each(netizenList.begin(), netizenList.end(), PointerAssassin()); + while (! desktopWindowList.empty()) + removeDesktopWindow(desktopWindowList[0]); + + while (! systrayWindowList.empty()) + removeSystrayWindow(systrayWindowList[0]); + delete rootmenu; delete workspacemenu; delete iconmenu; @@ -412,6 +420,12 @@ void BScreen::saveWindowToWindowSnap(bool s) { } +void BScreen::saveResizeZones(unsigned int z) { + resource.resize_zones = z; + config->setValue(screenstr + "resizeZones", resource.resize_zones); +} + + void BScreen::saveWindowCornerSnap(bool s) { resource.window_corner_snap = s; config->setValue(screenstr + "windowCornerSnap", @@ -476,7 +490,7 @@ void BScreen::saveDateFormat(int f) { } -void BScreen::saveClock24Hour(Bool c) { +void BScreen::saveClock24Hour(bool c) { resource.clock24hour = c; config->setValue(screenstr + "clockFormat", resource.clock24hour ? 24 : 12); } @@ -484,27 +498,38 @@ void BScreen::saveClock24Hour(Bool c) { void BScreen::saveWorkspaceNames() { - XAtom::StringVect nameList; - unsigned long numnames = (unsigned) -1; string names; - if (numnames > 0 && - xatom->getValue(getRootWindow(), XAtom::net_desktop_names, XAtom::utf8, - numnames, nameList)) { - for (unsigned int i = 0; i < nameList.size(); ++i) { - if (i > 0) names += ","; - names += nameList[i]; - } + for (unsigned int i = 0; i < workspacesList.size(); ++i) { + names += workspacesList[i]->getName(); + if (i < workspacesList.size() - 1) + names += ','; } + config->setValue(screenstr + "workspaceNames", names); } +void BScreen::savePlaceIgnoreShaded(bool i) { + resource.ignore_shaded = i; + config->setValue(screenstr + "placementIgnoreShaded", + resource.ignore_shaded); +} + + +void BScreen::savePlaceIgnoreMaximized(bool i) { + resource.ignore_maximized = i; + config->setValue(screenstr + "placementIgnoreMaximized", + resource.ignore_maximized); +} + + void BScreen::save_rc(void) { saveSloppyFocus(resource.sloppy_focus); saveAutoRaise(resource.auto_raise); saveImageDither(doImageDither()); saveAAFonts(resource.aa_fonts); + saveResizeZones(resource.resize_zones); saveOpaqueMove(resource.opaque_move); saveFullMax(resource.full_max); saveFocusNew(resource.focus_new); @@ -523,6 +548,8 @@ void BScreen::save_rc(void) { saveDateFormat(resource.date_format); savwClock24Hour(resource.clock24hour); #endif // HAVE_STRFTIME + savePlaceIgnoreShaded(resource.ignore_shaded); + savePlaceIgnoreMaximized(resource.ignore_maximized); toolbar->save_rc(); slit->save_rc(); @@ -551,6 +578,11 @@ void BScreen::load_rc(void) { if (! config->getValue(screenstr + "antialiasFonts", resource.aa_fonts)) resource.aa_fonts = true; + if (! config->getValue(screenstr + "resizeZones", resource.resize_zones) || + (resource.resize_zones != 1 && resource.resize_zones != 2 && + resource.resize_zones != 4)) + resource.resize_zones = 4; + if (! config->getValue(screenstr + "hideToolbar", resource.hide_toolbar)) resource.hide_toolbar = false; @@ -623,9 +655,8 @@ void BScreen::load_rc(void) { resource.placement_policy = RowSmartPlacement; #ifdef HAVE_STRFTIME - if (config->getValue(screenstr + "strftimeFormat", s)) - resource.strftime_format = s; - else + if (! config->getValue(screenstr + "strftimeFormat", + resource.strftime_format)) resource.strftime_format = "%I:%M %p"; #else // !HAVE_STRFTIME long l; @@ -639,6 +670,14 @@ void BScreen::load_rc(void) { l = 12; resource.clock24hour = l == 24; #endif // HAVE_STRFTIME + + if (! config->getValue(screenstr + "placementIgnoreShaded", + resource.ignore_shaded)) + resource.ignore_shaded = true; + + if (! config->getValue(screenstr + "placementIgnoreMaximized", + resource.ignore_maximized)) + resource.ignore_maximized = true; } @@ -921,10 +960,7 @@ void BScreen::LoadStyle(void) { void BScreen::addIcon(BlackboxWindow *w) { if (! w) return; - // we set the workspace to 'all workspaces' so that taskbars will show the - // window. otherwise, it made uniconifying a window impoosible without the - // blackbox workspace menu - w->setWorkspace(0xffffffff); + w->setWorkspace(BSENTINEL); w->setWindowNumber(iconList.size()); iconList.push_back(w); @@ -965,9 +1001,9 @@ unsigned int BScreen::addWorkspace(void) { Workspace *wkspc = new Workspace(this, workspacesList.size()); workspacesList.push_back(wkspc); saveWorkspaces(getWorkspaceCount()); + saveWorkspaceNames(); - workspacemenu->insert(wkspc->getName(), wkspc->getMenu(), - wkspc->getID() + 2); + workspacemenu->insertWorkspace(wkspc); workspacemenu->update(); toolbar->reconfigure(); @@ -989,13 +1025,14 @@ unsigned int BScreen::removeLastWorkspace(void) { wkspc->removeAll(); - workspacemenu->remove(wkspc->getID() + 2); + workspacemenu->removeWorkspace(wkspc); workspacemenu->update(); workspacesList.pop_back(); delete wkspc; saveWorkspaces(getWorkspaceCount()); + saveWorkspaceNames(); toolbar->reconfigure(); @@ -1006,41 +1043,38 @@ unsigned int BScreen::removeLastWorkspace(void) { void BScreen::changeWorkspaceID(unsigned int id) { - if (! current_workspace) return; - - if (id != current_workspace->getID()) { - 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); - } else { - // if no window had focus, no need to store a last focus - current_workspace->setLastFocusedWindow((BlackboxWindow *) 0); - } - // when we switch workspaces, unfocus whatever was focused - blackbox->setFocusedWindow((BlackboxWindow *) 0); + if (! current_workspace || id == current_workspace->getID()) return; + + BlackboxWindow *focused = blackbox->getFocusedWindow(); + if (focused && focused->getScreen() == this) { + assert(focused->isStuck() || + focused->getWorkspaceNumber() == current_workspace->getID()); + + current_workspace->setLastFocusedWindow(focused); + } else { + // if no window had focus, no need to store a last focus + current_workspace->setLastFocusedWindow((BlackboxWindow *) 0); + } + + // when we switch workspaces, unfocus whatever was focused + blackbox->setFocusedWindow((BlackboxWindow *) 0); - current_workspace->hideAll(); - workspacemenu->setItemSelected(current_workspace->getID() + 2, False); + current_workspace->hideAll(); + workspacemenu->setItemSelected(current_workspace->getID() + 2, False); - current_workspace = getWorkspace(id); + current_workspace = getWorkspace(id); - xatom->setValue(getRootWindow(), XAtom::net_current_desktop, - XAtom::cardinal, id); + xatom->setValue(getRootWindow(), XAtom::net_current_desktop, + XAtom::cardinal, id); - workspacemenu->setItemSelected(current_workspace->getID() + 2, True); - toolbar->redrawWorkspaceLabel(True); + workspacemenu->setItemSelected(current_workspace->getID() + 2, True); + toolbar->redrawWorkspaceLabel(True); - current_workspace->showAll(); + current_workspace->showAll(); - if (resource.focus_last && current_workspace->getLastFocusedWindow()) { - XSync(blackbox->getXDisplay(), False); - current_workspace->getLastFocusedWindow()->setInputFocus(); - } + if (resource.focus_last && current_workspace->getLastFocusedWindow()) { + XSync(blackbox->getXDisplay(), False); + current_workspace->getLastFocusedWindow()->setInputFocus(); } updateNetizenCurrentWorkspace(); @@ -1155,7 +1189,7 @@ void BScreen::manageWindow(Window w) { BlackboxWindow *win = blackbox->searchWindow(w); if (! win) return; - if (win->isDesktop()) { + if (win->windowType() == BlackboxWindow::Type_Desktop) { // desktop windows cant do anything, so we remove all the normal window // stuff from them, they are only kept around so that we can keep them on // the bottom of the z-order @@ -1368,13 +1402,27 @@ void BScreen::raiseWindows(Window *workspace_stack, unsigned int num) { } -void BScreen::lowerDesktops(void) { - if (desktopWindowList.empty()) return; +void BScreen::lowerWindows(Window *workspace_stack, unsigned int num) { + assert(num > 0); // this would cause trouble in the XRaiseWindow call + + Window *session_stack = new Window[(num + desktopWindowList.size())]; + unsigned int i = 0, k = num; + + XLowerWindow(blackbox->getXDisplay(), workspace_stack[0]); + + while (k--) + *(session_stack + i++) = *(workspace_stack + k); + + WindowList::iterator dit = desktopWindowList.begin(); + const WindowList::iterator d_end = desktopWindowList.end(); + for (; dit != d_end; ++dit) + *(session_stack + i++) = *dit; + + XRestackWindows(blackbox->getXDisplay(), session_stack, i); + + delete [] session_stack; - XLowerWindow(blackbox->getXDisplay(), desktopWindowList[0]); - if (desktopWindowList.size() > 1) - XRestackWindows(blackbox->getXDisplay(), &desktopWindowList[0], - desktopWindowList.size()); + updateStackingList(); } @@ -2092,6 +2140,23 @@ void BScreen::buttonPressEvent(const XButtonEvent *xbutton) { } +void BScreen::propertyNotifyEvent(const XPropertyEvent *pe) { + if (pe->atom == xatom->getAtom(XAtom::net_desktop_names)) { + // _NET_WM_DESKTOP_NAMES + fprintf(stderr, "UPDATING WORKSPACE NAMES\n"); + WorkspaceList::iterator it = workspacesList.begin(); + const WorkspaceList::iterator end = workspacesList.end(); + for (; it != end; ++it) { + (*it)->readName(); // re-read its name from the window property + workspacemenu->changeWorkspaceLabel((*it)->getID(), (*it)->getName()); + } + workspacemenu->update(); + toolbar->reconfigure(); + saveWorkspaceNames(); + } +} + + void BScreen::toggleFocusModel(FocusModel model) { std::for_each(windowList.begin(), windowList.end(), std::mem_fun(&BlackboxWindow::ungrabButtons));