]> Dogcows Code - chaz/openbox/blobdiff - src/screen.cc
speed up workspace switching by causing the minimal number of expose events (none...
[chaz/openbox] / src / screen.cc
index f5cc00922125f9068040504c56bf4ad456531913..16e37df61a731502f4a10349162cf3502f3fe77f 100644 (file)
@@ -2,6 +2,16 @@
 
 #include "config.h"
 
+#include "screen.hh"
+#include "client.hh"
+#include "openbox.hh"
+#include "frame.hh"
+#include "bindings.hh"
+#include "python.hh"
+#include "otk/display.hh"
+#include "otk/property.hh"
+#include "otk/util.hh"
+
 extern "C" {
 #ifdef    HAVE_UNISTD_H
 #  include <sys/types.h>
@@ -12,15 +22,6 @@ extern "C" {
 #define _(str) gettext(str)
 }
 
-#include "screen.hh"
-#include "client.hh"
-#include "openbox.hh"
-#include "frame.hh"
-#include "bindings.hh"
-#include "python.hh"
-#include "otk/display.hh"
-#include "otk/property.hh"
-
 #include <vector>
 #include <algorithm>
 #include <cstdio>
@@ -66,24 +67,6 @@ Screen::Screen(int screen)
   XDefineCursor(**otk::display, _info->rootWindow(),
                 openbox->cursors().session);
 
-  // XXX: initialize the screen's style
-  /*
-  otk::ustring stylepath;
-  python_get_string("THEME", &stylepath);
-  otk::Configuration sconfig(false);
-  sconfig.setFile(otk::expandTilde(stylepath.c_str()));
-  if (!sconfig.load()) {
-    sconfig.setFile(otk::expandTilde(DEFAULTSTYLE));
-    if (!sconfig.load()) {
-      printf(_("Unable to load default style: %s. Aborting.\n"), DEFAULTSTYLE);
-      ::exit(1);
-    }
-  }
-  _style.load(sconfig);
-  */
-  otk::display->renderControl(_number)->
-    drawRoot(*otk::RenderStyle::style(_number)->rootColor());
-
   // set up notification of netwm support
   changeSupportedAtoms();
 
@@ -94,21 +77,9 @@ Screen::Screen(int screen)
                      otk::Property::atoms.net_desktop_geometry,
                      otk::Property::atoms.cardinal, geometry, 2);
 
-  // Set the net_desktop_names property
-  std::vector<otk::ustring> names;
-  python_get_stringlist("DESKTOP_NAMES", &names);
-  otk::Property::set(_info->rootWindow(),
-                     otk::Property::atoms.net_desktop_names,
-                     otk::Property::utf8, names);
-  // the above set() will cause the updateDesktopNames to fire right away so
-  // we have a list of desktop names
-
   _desktop = 0;
-  
-  if (!python_get_long("NUMBER_OF_DESKTOPS", (long*)&_num_desktops))
-    _num_desktops = 1;
-  changeNumDesktops(_num_desktops); // set the hint
 
+  changeNumDesktops(4); // set the hint
   changeDesktop(0); // set the hint
 
   // don't start in showing-desktop mode
@@ -226,7 +197,7 @@ void Screen::updateDesktopLayout()
                          otk::Property::atoms.net_desktop_layout,
                          otk::Property::atoms.cardinal,
                          &num, &data)) {
-    if (num >= 4) {
+    if (num == 4) {
       if (data[0] == _NET_WM_ORIENTATION_VERT)
         _layout.orientation = DesktopLayout::Vertical;
       if (data[3] == _NET_WM_TOPRIGHT)
@@ -282,7 +253,7 @@ void Screen::updateStruts()
   for (sit = _struts.begin(); sit != send; ++sit)
     sit->left = sit->right = sit->top = sit->bottom = 0;
 
-  ClientList::const_iterator it, end = clients.end();
+  std::list<Client*>::const_iterator it, end = clients.end();
   for (it = clients.begin(); it != end; ++it) {
     if ((*it)->iconic()) continue; // these dont count in the strut
     
@@ -346,7 +317,7 @@ void Screen::changeWorkArea()
 */
     if (old_area != _area[i]) {
       // the area has changed, adjust all the maximized windows
-      ClientList::iterator it, end = clients.end();
+      std::list<Client*>::iterator it, end = clients.end();
       for (it = clients.begin(); it != end; ++it)
         if (i < _num_desktops) {
           if ((*it)->desktop() == i)
@@ -470,8 +441,8 @@ void Screen::changeClientList()
     
     windows = new Window[size];
     win_it = windows;
-    ClientList::const_iterator it = clients.begin();
-    const ClientList::const_iterator end = clients.end();
+    std::list<Client*>::const_iterator it = clients.begin();
+    const std::list<Client*>::const_iterator end = clients.end();
     for (; it != end; ++it, ++win_it)
       *win_it = (*it)->window();
   } else
@@ -501,8 +472,8 @@ void Screen::changeStackingList()
     
     windows = new Window[size];
     win_it = windows;
-    ClientList::const_reverse_iterator it = _stacking.rbegin();
-    const ClientList::const_reverse_iterator end = _stacking.rend();
+    std::list<Client*>::const_reverse_iterator it = _stacking.rbegin();
+    const std::list<Client*>::const_reverse_iterator end = _stacking.rend();
     for (; it != end; ++it, ++win_it)
       *win_it = (*it)->window();
   } else
@@ -686,7 +657,7 @@ void Screen::unmanageWindow(Client *client)
   client->_modal = false;
   
   // unfocus the client (calls the focus callbacks)
-  client->unfocus();
+  if (client->focused()) client->unfocus();
 
 #ifdef DEBUG
   printf("Unmanaged window 0x%lx frame 0x%lx\n", client->window(), framewin);
@@ -704,8 +675,8 @@ void Screen::lowerWindow(Client *client)
 
   assert(!_stacking.empty()); // this would be bad
 
-  ClientList::iterator it = --_stacking.end();
-  const ClientList::iterator end = _stacking.begin();
+  std::list<Client*>::iterator it = --_stacking.end();
+  const std::list<Client*>::iterator end = _stacking.begin();
 
   if (client->modal() && client->transientFor()) {
     // don't let a modal window lower below its transient_for
@@ -713,7 +684,8 @@ void Screen::lowerWindow(Client *client)
     assert(it != _stacking.end());
 
     wins[0] = (it == _stacking.begin() ? _focuswindow :
-               ((*(--ClientList::const_iterator(it)))->frame->window()));
+               ((*(--std::list<Client*>::const_iterator(it)))->
+                frame->window()));
     wins[1] = client->frame->window();
     if (wins[0] == wins[1]) return; // already right above the window
 
@@ -747,8 +719,8 @@ void Screen::raiseWindow(Client *client)
   // remove the client before looking so we can't run into ourselves
   _stacking.remove(client);
   
-  ClientList::iterator it = _stacking.begin();
-  const ClientList::iterator end = _stacking.end();
+  std::list<Client*>::iterator it = _stacking.begin();
+  const std::list<Client*>::iterator end = _stacking.end();
 
   // the stacking list is from highest to lowest
   for (; it != end && ((*it)->layer() > client->layer() || m == *it); ++it);
@@ -758,7 +730,7 @@ void Screen::raiseWindow(Client *client)
     otherwise, we want to stack under the previous window in the stack.
   */
   wins[0] = (it == _stacking.begin() ? _focuswindow :
-             ((*(--ClientList::const_iterator(it)))->frame->window()));
+             ((*(--std::list<Client*>::const_iterator(it)))->frame->window()));
   wins[1] = client->frame->window();
 
   _stacking.insert(it, client);
@@ -783,7 +755,7 @@ void Screen::changeDesktop(unsigned int desktop)
 
   if (old == _desktop) return;
 
-  ClientList::iterator it, end = clients.end();
+  std::list<Client*>::iterator it, end = clients.end();
   for (it = clients.begin(); it != end; ++it)
     (*it)->showhide();
 
@@ -799,7 +771,7 @@ void Screen::changeNumDesktops(unsigned int num)
   if (!(num > 0)) return;
 
   // move windows on desktops that will no longer exist!
-  ClientList::iterator it, end = clients.end();
+  std::list<Client*>::iterator it, end = clients.end();
   for (it = clients.begin(); it != end; ++it) {
     unsigned int d = (*it)->desktop();
     if (d >= num && d != 0xffffffff) {
@@ -810,7 +782,7 @@ void Screen::changeNumDesktops(unsigned int num)
       ce.xclient.window = (*it)->window();
       ce.xclient.format = 32;
       ce.xclient.data.l[0] = num - 1;
-      XSendEvent(**otk::display, _info->rootWindow(), False,
+      XSendEvent(**otk::display, _info->rootWindow(), false,
                  SubstructureNotifyMask | SubstructureRedirectMask, &ce);
     }
   }
@@ -837,6 +809,9 @@ void Screen::changeNumDesktops(unsigned int num)
   // the number of rows/columns will differ
   updateDesktopLayout();
 
+  // may be some unnamed desktops that we need to fill in with names
+  updateDesktopNames();
+
   // change our desktop if we're on one that no longer exists!
   if (_desktop >= _num_desktops)
     changeDesktop(_num_desktops - 1);
@@ -845,7 +820,7 @@ void Screen::changeNumDesktops(unsigned int num)
 
 void Screen::updateDesktopNames()
 {
-  unsigned long num = (unsigned) -1;
+  unsigned long num;
   
   if (!otk::Property::get(_info->rootWindow(),
                           otk::Property::atoms.net_desktop_names,
@@ -856,23 +831,6 @@ void Screen::updateDesktopNames()
 }
 
 
-void Screen::setDesktopName(unsigned int i, const otk::ustring &name)
-{
-  if (i >= _num_desktops) return;
-
-  otk::Property::StringVect newnames = _desktop_names;
-  newnames[i] = name;
-  otk::Property::set(_info->rootWindow(),
-                     otk::Property::atoms.net_desktop_names,
-                     otk::Property::utf8, newnames);
-}
-
-otk::ustring Screen::desktopName(unsigned int i) const
-{
-  if (i >= _num_desktops) return "";
-  return _desktop_names[i];
-}
-
 const otk::Rect& Screen::area(unsigned int desktop) const {
   assert(desktop < _num_desktops || desktop == 0xffffffff);
   if (desktop < _num_desktops)
@@ -902,7 +860,7 @@ void Screen::showDesktop(bool show)
   
   _showing_desktop = show;
 
-  ClientList::iterator it, end = clients.end();
+  std::list<Client*>::iterator it, end = clients.end();
   for (it = clients.begin(); it != end; ++it) {
     if ((*it)->type() == Client::Type_Desktop) {
       if (show)
This page took 0.031761 seconds and 4 git commands to generate.