]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
dont let focus fall back to strange windows like panels, only to normal windows and...
[chaz/openbox] / src / Screen.cc
index 9922435023e6ebc74dad250b1680ee967cb866ba..f4c3dcadbee13b1c2bc5237535b1f0ef38a54dc0 100644 (file)
@@ -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();
 
@@ -488,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);
 }
@@ -496,22 +498,32 @@ 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);
@@ -536,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();
@@ -641,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;
@@ -657,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;
 }
 
 
@@ -980,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();
@@ -1004,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();
 
@@ -1167,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
@@ -1380,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(), desktopWindowList[0]);
-  if (desktopWindowList.size() > 1)
-    XRestackWindows(blackbox->getXDisplay(), &desktopWindowList[0],
-                    desktopWindowList.size());
+  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;
+
+  updateStackingList();
 }
 
 
@@ -2104,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));
This page took 0.024935 seconds and 4 git commands to generate.