]> Dogcows Code - chaz/openbox/blobdiff - util/epist/window.cc
make epist compile with the new code base
[chaz/openbox] / util / epist / window.cc
index 628bcebac79758b5abaaefe086f1cf92ca22e3eb..505a0f87c393c18353c312c740615a2fb8184ea7 100644 (file)
@@ -1,5 +1,5 @@
-// -*- mode: C++; indent-tabs-mode: nil; -*-
-// window.cc for Epistophy - a key handler for NETWM/EWMH window managers.
+// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
+// window.cc for Epistrophy - a key handler for NETWM/EWMH window managers.
 // Copyright (c) 2002 - 2002 Ben Jansens <ben at orodu.net>
 //
 // Permission is hereby granted, free of charge, to any person obtaining a
@@ -34,7 +34,14 @@ using std::dec;
 #include "epist.hh"
 #include "screen.hh"
 #include "window.hh"
-#include "../../src/XAtom.hh"
+#include "../../src/xatom.hh"
+
+  // defined by black/openbox
+const unsigned long XWindow::PropBlackboxAttributesElements;
+const unsigned long XWindow::AttribDecoration;
+const unsigned long XWindow::DecorNone;
+const unsigned long XWindow::DecorNormal;
+
 
 XWindow::XWindow(epist *epist, screen *screen, Window window)
   : _epist(epist), _screen(screen), _xatom(epist->xatom()), _window(window) {
@@ -44,7 +51,9 @@ XWindow::XWindow(epist *epist, screen *screen, Window window)
   XSelectInput(_epist->getXDisplay(), _window,
                PropertyChangeMask | StructureNotifyMask);
 
-  updateHints();
+  updateBlackboxAttributes();
+  updateNormalHints();
+  updateWMHints();
   updateDimentions();
   updateState();
   updateDesktop();
@@ -77,7 +86,24 @@ void XWindow::updateDimentions() {
 }
 
 
-void XWindow::updateHints() {
+void XWindow::updateBlackboxAttributes() {
+  unsigned long *data;
+  unsigned long num = PropBlackboxAttributesElements;
+
+  _decorated = true;
+
+  if (_xatom->getValue(_window,
+                       XAtom::blackbox_attributes, XAtom::blackbox_attributes,
+                       num, &data)) {
+    if (num == PropBlackboxAttributesElements)
+      if (data[0] & AttribDecoration)
+        _decorated = (data[4] != DecorNone);
+    delete data;
+  }
+}
+
+
+void XWindow::updateNormalHints() {
   XSizeHints size;
   long ret;
 
@@ -101,6 +127,20 @@ void XWindow::updateHints() {
 }
 
 
+void XWindow::updateWMHints() {
+  XWMHints *hints;
+
+  // assume a window takes input if it doesnt specify
+  _can_focus = True;
+  
+  if ((hints = XGetWMHints(_epist->getXDisplay(), _window)) != NULL) {
+    if (hints->flags & InputHint)
+      _can_focus = hints->input;
+    XFree(hints);
+  }
+}
+
+
 void XWindow::updateState() {
   // set the defaults
   _shaded = _iconic = _max_vert = _max_horz = false;
@@ -170,7 +210,11 @@ void XWindow::processEvent(const XEvent &e) {
     break;
   case PropertyNotify:
     if (e.xproperty.atom == XA_WM_NORMAL_HINTS)
-      updateHints();
+      updateNormalHints();
+    else if (e.xproperty.atom == XA_WM_HINTS)
+      updateWMHints();
+    else if (e.xproperty.atom == _xatom->getAtom(XAtom::blackbox_attributes))
+      updateBlackboxAttributes();
     else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_state))
       updateState();
     else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_desktop))
@@ -218,10 +262,15 @@ void XWindow::iconify() const {
 }
 
 
-void XWindow::focus() const {
-  // this will also unshade the window..
-  _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_active_window,
-                            _window);
+void XWindow::focus(bool raise) const {
+  // this will cause the window to be uniconified also
+
+  if (raise) {
+    _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_active_window,
+                              _window);
+  } else {
+    XSetInputFocus(_epist->getXDisplay(), _window, None, CurrentTime);
+  }
 }
 
 
@@ -318,7 +367,18 @@ void XWindow::move(int x, int y) const {
 }
 
 
-void XWindow::resize(unsigned int width, unsigned int height) const {
+void XWindow::resizeRel(int dwidth, int dheight) const {
+  // resize in increments if requested by the window
+  unsigned int width = _rect.width(), height = _rect.height();
+  
+  unsigned int wdest = width + (dwidth * _inc_x) / _inc_x * _inc_x + _base_x;
+  unsigned int hdest = height + (dheight * _inc_y) / _inc_y * _inc_y + _base_y;
+
+  XResizeWindow(_epist->getXDisplay(), _window, wdest, hdest);
+}
+
+
+void XWindow::resizeAbs(unsigned int width, unsigned int height) const {
   // resize in increments if requested by the window
 
   unsigned int wdest = width / _inc_x * _inc_x + _base_x;
@@ -407,3 +467,11 @@ void XWindow::maximize(Max max) const {
     break;
   }
 }
+
+
+void XWindow::decorate(bool d) const {
+  _xatom->sendClientMessage(_screen->rootWindow(),
+                            XAtom::blackbox_change_attributes,
+                            _window, AttribDecoration,
+                            0, 0, 0, (d ? DecorNormal : DecorNone));
+}
This page took 0.023157 seconds and 4 git commands to generate.