]> Dogcows Code - chaz/openbox/blobdiff - util/epist/window.cc
dont pass bound keys through to the application
[chaz/openbox] / util / epist / window.cc
index 62087283b4de9152ed74cce24544775455edcc2a..1d5a219dfc92af1ec8201f28276e21a9a7bc40e8 100644 (file)
@@ -1,5 +1,5 @@
 // -*- mode: C++; indent-tabs-mode: nil; -*-
-// window.cc for Epistory - a key handler for NETWM/EWMH window managers.
+// window.cc for Epistophy - 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
 #  include "../../config.h"
 #endif // HAVE_CONFIG_H
 
-#include "window.hh"
-#include "epist.hh"
-#include "../../src/XAtom.hh"
-
 #include <iostream>
 
 using std::cout;
@@ -35,20 +31,31 @@ using std::endl;
 using std::hex;
 using std::dec;
 
-XWindow::XWindow(Window window) : _window(window) {
+#include "epist.hh"
+#include "screen.hh"
+#include "window.hh"
+#include "../../src/XAtom.hh"
+
+XWindow::XWindow(epist *epist, screen *screen, Window window)
+  : _epist(epist), _screen(screen), _xatom(epist->xatom()), _window(window) {
+
   _unmapped = false;
 
-  XSelectInput(_display, _window, PropertyChangeMask | StructureNotifyMask);
+  XSelectInput(_epist->getXDisplay(), _window,
+               PropertyChangeMask | StructureNotifyMask);
   updateState();
   updateDesktop();
   updateTitle();
   updateClass();
+
+  _epist->addWindow(this);
 }
 
 
 XWindow::~XWindow() {
   if (! _unmapped)
-    XSelectInput(_display, _window, None);
+    XSelectInput(_epist->getXDisplay(), _window, None);
+  _epist->removeWindow(this);
 }
 
 
@@ -110,3 +117,33 @@ void XWindow::updateClass() {
   if (num > 0) _app_name = v[0];
   if (num > 1) _app_class = v[1];
 }
+
+
+void XWindow::processEvent(const XEvent &e) {
+  assert(e.xany.window == _window);
+
+  switch (e.type) {
+  case PropertyNotify:
+    // a client window
+    if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_state))
+      updateState();
+    else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_desktop))
+      updateDesktop();
+    else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_name) ||
+             e.xproperty.atom == _xatom->getAtom(XAtom::wm_name))
+      updateTitle();
+    else if (e.xproperty.atom == _xatom->getAtom(XAtom::wm_class))
+      updateClass();
+    break;
+  case DestroyNotify:
+  case UnmapNotify:
+    _unmapped = true;
+    break;
+  }
+}
+  
+
+void XWindow::shade(const bool sh) const {
+  _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_wm_state,
+                            _window, (sh ? 1 : 0), XAtom::net_wm_state_shaded);
+}
This page took 0.022935 seconds and 4 git commands to generate.