]> Dogcows Code - chaz/openbox/blobdiff - src/frame.cc
use the correct size for buttons even when there is no iconify button in use. (oops)
[chaz/openbox] / src / frame.cc
index 4f466b46d26edbaf053bfc0cae138102cc36e701..7a99f9a06e20652e2612eae73c81c4f3d88094e6 100644 (file)
@@ -13,6 +13,8 @@ extern "C" {
 #include "openbox.hh"
 #include "frame.hh"
 #include "client.hh"
+#include "python.hh"
+#include "bindings.hh"
 #include "otk/display.hh"
 
 #include <string>
@@ -22,7 +24,7 @@ namespace ob {
 const long OBFrame::event_mask;
 
 OBFrame::OBFrame(OBClient *client, otk::Style *style)
-  : otk::OtkWidget(Openbox::instance, style),
+  : otk::OtkWidget(Openbox::instance, style, Horizontal, 0, 1, true),
     OBWidget(Type_Frame),
     _client(client),
     _screen(otk::OBDisplay::screenInfo(client->screen())),
@@ -41,8 +43,8 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style)
   assert(client);
   assert(style);
 
-  XSelectInput(otk::OBDisplay::display, window(), OBFrame::event_mask);
-  
+  XSelectInput(otk::OBDisplay::display, _window, OBFrame::event_mask);
+
   _grip_left.setCursor(Openbox::instance->cursors().ll_angle);
   _grip_right.setCursor(Openbox::instance->cursors().lr_angle);
   
@@ -103,7 +105,6 @@ void OBFrame::focus()
 {
   otk::OtkWidget::focus();
   update();
-  _handle.update();
 }
 
 
@@ -124,11 +125,13 @@ void OBFrame::adjustSize()
 {
   // XXX: only if not overridden or something!!! MORE LOGIC HERE!!
   _decorations = _client->decorations();
-  _decorations = 0xffffffff;
-  
+
+  // true/false for whether to show each element of the titlebar
+  bool tit_i = false, tit_m = false, tit_s = false, tit_c = false;
   int width;   // the width of the client and its border
   int bwidth;  // width to make borders
   int cbwidth; // width of the inner client border
+  int butsize=0; // width and height of the titlebar buttons
   const int bevel = _style->getBevelWidth();
   
   if (_decorations & OBClient::Decor_Border) {
@@ -159,37 +162,78 @@ void OBFrame::adjustSize()
     // set the label size
     _label.setGeometry(0, bevel, width, _style->getFont()->height());
     // set the buttons sizes
+    butsize = _label.height() - 2;
     if (_decorations & OBClient::Decor_Iconify)
-      _button_iconify.setGeometry(0, bevel + 1,
-                                  _label.height() - 2,
-                                  _label.height() - 2);
+      _button_iconify.setGeometry(0, bevel + 1, butsize, butsize);
     if (_decorations & OBClient::Decor_Maximize)
-      _button_max.setGeometry(0, bevel + 1,
-                              _label.height() - 2,
-                              _label.height() - 2);
+      _button_max.setGeometry(0, bevel + 1, butsize, butsize);
     if (_decorations & OBClient::Decor_Sticky)
-      _button_stick.setGeometry(0, bevel + 1,
-                                _label.height() - 2,
-                                _label.height() - 2);
+      _button_stick.setGeometry(0, bevel + 1, butsize, butsize);
     if (_decorations & OBClient::Decor_Close)
-      _button_close.setGeometry(0, bevel + 1,
-                                _label.height() - 2,
-                                _label.height() - 2);
+      _button_close.setGeometry(0, bevel + 1, butsize, butsize);
 
     // separation between titlebar elements
     const int sep = bevel + 1;
 
-    std::string layout = "SLIMC"; // XXX: get this from somewhere
-    // XXX: it is REQUIRED that by this point, the string only has one of each
-    // possible letter, all of the letters are valid, and L exists somewhere in
-    // the string!
+    std::string layout;
+    if (!python_get_string("titlebar_layout", &layout))
+      layout = "ILMC";
 
+    // this code ensures that the string only has one of each possible
+    // letter, all of the letters are valid, and L exists somewhere in the
+    // string!
+    bool tit_l = false;
+  
+    for (std::string::size_type i = 0; i < layout.size(); ++i) {
+      switch (layout[i]) {
+      case 'i':
+      case 'I':
+        if (!tit_i && (_decorations & OBClient::Decor_Iconify)) {
+          tit_i = true;
+          continue;
+        }
+        break;
+      case 'l':
+      case 'L':
+        if (!tit_l) {
+          tit_l = true;
+          continue;
+        }
+        break;
+      case 'm':
+      case 'M':
+        if (!tit_m && (_decorations & OBClient::Decor_Maximize)) {
+          tit_m = true;
+          continue;
+        }
+        break;
+      case 's':
+      case 'S':
+        if (!tit_s && (_decorations & OBClient::Decor_Sticky)) {
+          tit_s = true;
+          continue;
+        }
+        break;
+      case 'c':
+      case 'C':
+        if (!tit_c && (_decorations & OBClient::Decor_Close)) {
+          tit_c = true;
+          continue;
+        }
+        break;
+      }
+      // if we get here then we don't want the letter, kill it
+      layout.erase(i--, 1);
+    }
+    if (!tit_l)
+      layout.append(1, 'L');
+    
     // the size of the label. this ASSUMES the layout has only buttons other
     // that the ONE LABEL!!
     // adds an extra sep so that there's a space on either side of the
     // titlebar.. note: x = sep, below.
     int lwidth = width - sep * 2 -
-      (_button_iconify.width() + sep) * (layout.size() - 1);
+      (butsize + sep) * (layout.size() - 1);
     // quick sanity check for really small windows. if this is needed, its
     // obviously not going to be displayed right...
     // XXX: maybe we should make this look better somehow? constraints?
@@ -197,24 +241,29 @@ void OBFrame::adjustSize()
     _label.setWidth(lwidth);
 
     int x = sep;
-    for (int i = 0, len = layout.size(); i < len; ++i) {
+    for (std::string::size_type i = 0, len = layout.size(); i < len; ++i) {
       switch (layout[i]) {
+      case 'i':
       case 'I':
         _button_iconify.move(x, _button_iconify.rect().y());
         x += _button_iconify.width();
         break;
+      case 'l':
       case 'L':
         _label.move(x, _label.rect().y());
         x += _label.width();
         break;
+      case 'm':
       case 'M':
         _button_max.move(x, _button_max.rect().y());
         x += _button_max.width();
         break;
+      case 's':
       case 'S':
         _button_stick.move(x, _button_stick.rect().y());
         x += _button_stick.width();
         break;
+      case 'c':
       case 'C':
         _button_close.move(x, _button_close.rect().y());
         x += _button_close.width();
@@ -234,14 +283,14 @@ void OBFrame::adjustSize()
                            -bwidth,
                            // XXX: get a Point class in otk and use that for
                            // the 'buttons size' since theyre all the same
-                           _button_iconify.width() * 2,
+                           butsize * 2,
                            _handle.height());
     _grip_right.setGeometry(((_handle.rect().right() + 1) -
-                             _button_iconify.width() * 2),
+                             butsize * 2),
                             -bwidth,
                             // XXX: get a Point class in otk and use that for
                             // the 'buttons size' since theyre all the same
-                            _button_iconify.width() * 2,
+                            butsize * 2,
                             _handle.height());
     _innersize.bottom += _handle.height() + bwidth;
   }
@@ -249,8 +298,12 @@ void OBFrame::adjustSize()
 
   // position/size all the windows
 
-  resize(_innersize.left + _innersize.right + _client->area().width(),
-         _innersize.top + _innersize.bottom + _client->area().height());
+  if (_client->shaded())
+    resize(_innersize.left + _innersize.right + _client->area().width(),
+           _titlebar.height());
+  else
+    resize(_innersize.left + _innersize.right + _client->area().width(),
+           _innersize.top + _innersize.bottom + _client->area().height());
 
   _plate.setGeometry(_innersize.left - cbwidth, _innersize.top - cbwidth,
                      _client->area().width(), _client->area().height());
@@ -258,19 +311,19 @@ void OBFrame::adjustSize()
   // map/unmap all the windows
   if (_decorations & OBClient::Decor_Titlebar) {
     _label.show();
-    if (_decorations & OBClient::Decor_Iconify)
+    if (tit_i)
       _button_iconify.show();
     else
       _button_iconify.hide();
-    if (_decorations & OBClient::Decor_Maximize)
+    if (tit_m)
       _button_max.show();
     else
       _button_max.hide();
-    if (_decorations & OBClient::Decor_Sticky)
+    if (tit_s)
       _button_stick.show();
     else
       _button_stick.hide();
-    if (_decorations & OBClient::Decor_Close)
+    if (tit_c)
       _button_close.show();
     else
       _button_close.hide();
This page took 0.028757 seconds and 4 git commands to generate.