]> Dogcows Code - chaz/openbox/commitdiff
don't try pass focus off to windows that dont take it
authorDana Jansens <danakj@orodu.net>
Wed, 24 Jul 2002 17:49:57 +0000 (17:49 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 24 Jul 2002 17:49:57 +0000 (17:49 +0000)
util/epist/screen.cc
util/epist/window.cc
util/epist/window.hh

index 281a093e3aa10745bee6978eb301b5a6b6302670..80a579cc2d0e0c5fdeacb9249a8f513af8260691 100644 (file)
@@ -489,11 +489,10 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
     classname = (*_active)->appClass();
 
   WindowList::const_iterator target = _active,
-                             first = _active,
                              begin = _clients.begin(),
                              end = _clients.end();
  
-  do {
+  while (1) {
     if (forward) {
       if (target == end) {
         target = begin;
@@ -509,18 +508,22 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
     }
 
     // must be no window to focus
-    if (target == first)
+    if (target == _active)
       return;
-  } while ((*target)->iconic() ||
-           (! allscreens && (*target)->getScreen() != this) ||
-           (! alldesktops &&
-            (*target)->desktop() != _active_desktop &&
-            (*target)->desktop() != 0xffffffff) ||
-           (sameclass && ! classname.empty() &&
-            (*target)->appClass() != classname));
-  
-  if (target != _clients.end())
-    (*target)->focus();
+
+    // determine if this window is invalid for cycling to
+    const XWindow *t = *target;
+    if (t->iconic()) continue;
+    if (! allscreens && t->getScreen() != this) continue;
+    if (! alldesktops && ! (t->desktop() == _active_desktop ||
+                            t->desktop() == 0xffffffff)) continue;
+    if (sameclass && ! classname.empty() &&
+        t->appClass() != classname) continue;
+    if (! t->canFocus()) continue;
+
+    // found a good window!
+    t->focus();
+  }
 }
 
 
index 0d33a2f6d641487409bd5621e5e9039a9b6eb391..695322729ad0288f20772f97b2cc16ebdfc1ff72 100644 (file)
@@ -44,7 +44,8 @@ XWindow::XWindow(epist *epist, screen *screen, Window window)
   XSelectInput(_epist->getXDisplay(), _window,
                PropertyChangeMask | StructureNotifyMask);
 
-  updateHints();
+  updateNormalHints();
+  updateWMHints();
   updateDimentions();
   updateState();
   updateDesktop();
@@ -77,7 +78,7 @@ void XWindow::updateDimentions() {
 }
 
 
-void XWindow::updateHints() {
+void XWindow::updateNormalHints() {
   XSizeHints size;
   long ret;
 
@@ -101,6 +102,19 @@ void XWindow::updateHints() {
 }
 
 
+void XWindow::updateWMHints() {
+  XWMHints *hints;
+
+  if ((hints = XGetWMHints(_epist->getXDisplay(), _window)) != NULL) {
+    _can_focus = hints->input;
+    XFree(hints);
+  } else {
+    // assume a window takes input if it doesnt specify
+    _can_focus = True;
+  }
+}
+
+
 void XWindow::updateState() {
   // set the defaults
   _shaded = _iconic = _max_vert = _max_horz = false;
@@ -170,7 +184,9 @@ void XWindow::processEvent(const XEvent &e) {
     break;
   case PropertyNotify:
     if (e.xproperty.atom == XA_WM_NORMAL_HINTS)
-      updateHints();
+      updateNormalHints();
+    if (e.xproperty.atom == XA_WM_HINTS)
+      updateWMHints();
     else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_state))
       updateState();
     else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_desktop))
@@ -219,6 +235,7 @@ void XWindow::iconify() const {
 
 
 void XWindow::focus() const {
+  cout << "Focusing window: 0x" << hex << _window << dec << endl;
   // this will cause the window to be uniconified also
   _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_active_window,
                             _window);
index fdf2223ef663a3d54b7c746078f7bad297e345a4..65ceda7bebf2302ff5c9c9b80c6110229ac46d03 100644 (file)
@@ -60,6 +60,7 @@ private:
   int _inc_x, _inc_y; // resize increments
   int _base_x, _base_y; // base size
   int _gravity;
+  bool _can_focus;
 
   // states
   bool _shaded;
@@ -70,7 +71,8 @@ private:
   bool _unmapped;
 
   void updateDimentions();
-  void updateHints();
+  void updateNormalHints();
+  void updateWMHints();
   void updateState();
   void updateDesktop();
   void updateTitle();
@@ -87,6 +89,7 @@ public:
   inline const std::string &title() const { return _title; }
   inline const std::string &appName() const { return _app_name; }
   inline const std::string &appClass() const { return _app_class; }
+  inline bool canFocus() const { return _can_focus; }
   
   inline bool shaded() const { return _shaded; }
   inline bool iconic() const { return _iconic; }
This page took 0.028412 seconds and 4 git commands to generate.