]> Dogcows Code - chaz/openbox/commitdiff
make iconified windows uniconify on an XMapRequestEvent.
authorDana Jansens <danakj@orodu.net>
Fri, 5 Jul 2002 01:24:32 +0000 (01:24 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 5 Jul 2002 01:24:32 +0000 (01:24 +0000)
sync with blackbox cvs.

13 files changed:
src/BaseDisplay.cc
src/Configmenu.cc
src/Screen.cc
src/Screen.hh
src/Slit.cc
src/Slit.hh
src/Toolbar.cc
src/Toolbar.hh
src/Window.cc
src/Window.hh
src/Workspace.cc
src/Workspace.hh
src/blackbox.cc

index 21f9ab532a46a3faf29dec38748443d04f7f656f..aa2d974ee83b2ef17e0f2b356d9e26e3caefc3e4 100644 (file)
@@ -78,7 +78,7 @@ extern "C" {
 #endif // HAVE_SYS_WAIT_H
 }
 
-#include <sstream>
+#include <string>
 using std::string;
 
 #include "i18n.hh"
@@ -468,7 +468,6 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) {
   if (pos != string::npos)
     default_string.resize(pos);
 
-  std::ostringstream formatter;
-  formatter << "DISPLAY=" << default_string << '.' << screen_number;
-  display_string = formatter.str();
+  display_string = string("DISPLAY=") + default_string + '.' +
+    itostring(static_cast<unsigned long>(screen_number));
 }
index 3a8a6e453a0ea50eb0cfe5491d949f2703f8aaa7..d78d3da943ee521e7615cc5fc7b25232fd6fb94e 100644 (file)
@@ -200,7 +200,8 @@ void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
 
   case 4: // click raise with sloppy focus
     getScreen()->saveClickRaise(! getScreen()->doClickRaise());
-    getScreen()->updateFocusModel();
+    // make sure the appropriate mouse buttons are grabbed on the windows
+    getScreen()->toggleFocusModel(BScreen::SloppyFocus);
     break;
   }
   setValues();
index a05c23865ee8380d0a1f565d2bd3e45ebad79069..1879976f645521c16bbe4f900e10d1f5c687c1ae 100644 (file)
@@ -132,6 +132,8 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
   resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font =
     resource.wstyle.font = (BFont *) 0;
 
+  geom_pixmap = None;
+
   xatom->setSupported(this);    // set-up netwm support
 #ifdef    HAVE_GETPID
   xatom->setValue(getRootWindow(), XAtom::blackbox_pid, XAtom::cardinal,
@@ -2006,7 +2008,7 @@ Workspace* BScreen::getWorkspace(unsigned int index) {
 }
 
 
-void BScreen::buttonPressEvent(XButtonEvent *xbutton) {
+void BScreen::buttonPressEvent(const XButtonEvent *xbutton) {
   if (xbutton->button == 1) {
     if (! isRootColormapInstalled())
       image_control->installRootColormap();
@@ -2071,6 +2073,9 @@ void BScreen::buttonPressEvent(XButtonEvent *xbutton) {
 
 
 void BScreen::toggleFocusModel(FocusModel model) {
+  std::for_each(windowList.begin(), windowList.end(),
+                std::mem_fun(&BlackboxWindow::ungrabButtons));
+
   if (model == SloppyFocus) {
     saveSloppyFocus(True);
   } else {
@@ -2080,14 +2085,8 @@ void BScreen::toggleFocusModel(FocusModel model) {
     saveSloppyFocus(False);
   }
 
-  updateFocusModel();
-}
-
-
-void BScreen::updateFocusModel()
-{
-  std::for_each(workspacesList.begin(), workspacesList.end(),
-                std::mem_fun(&Workspace::updateFocusModel));
+  std::for_each(windowList.begin(), windowList.end(),
+                std::mem_fun(&BlackboxWindow::grabButtons));
 }
 
 
index 60418cd708eeb4ae569f2952a900c1545ba589ce..3ce57db3db03cfcea9e1f8ed619a907cdf575b9d 100644 (file)
@@ -331,14 +331,13 @@ public:
   void save_rc(void);
   void reconfigure(void);
   void toggleFocusModel(FocusModel model);
-  void updateFocusModel(void);
   void rereadMenu(void);
   void shutdown(void);
   void showPosition(int x, int y);
   void showGeometry(unsigned int gx, unsigned int gy);
   void hideGeometry(void);
 
-  void buttonPressEvent(XButtonEvent *xbutton);
+  void buttonPressEvent(const XButtonEvent *xbutton);
 
   void updateNetizenCurrentWorkspace(void);
   void updateNetizenWorkspaceCount(void);
index 171432af9b2be2be84509313c6c40c807a8553cf..336daeb33ab6abdd7bf0f93cffc15810d38d82f0 100644 (file)
@@ -625,7 +625,7 @@ void Slit::shutdown(void) {
 }
 
 
-void Slit::buttonPressEvent(XButtonEvent *e) {
+void Slit::buttonPressEvent(const XButtonEvent *e) {
   if (e->window != frame.window) return;
 
   if (e->button == Button1 && (! on_top)) {
@@ -659,7 +659,7 @@ void Slit::buttonPressEvent(XButtonEvent *e) {
 }
 
 
-void Slit::enterNotifyEvent(XCrossingEvent *) {
+void Slit::enterNotifyEvent(const XCrossingEvent *) {
   if (! do_auto_hide)
     return;
 
@@ -671,7 +671,7 @@ void Slit::enterNotifyEvent(XCrossingEvent *) {
 }
 
 
-void Slit::leaveNotifyEvent(XCrossingEvent *) {
+void Slit::leaveNotifyEvent(const XCrossingEvent *) {
   if (! do_auto_hide)
     return;
 
@@ -683,7 +683,7 @@ void Slit::leaveNotifyEvent(XCrossingEvent *) {
 }
 
 
-void Slit::configureRequestEvent(XConfigureRequestEvent *e) {
+void Slit::configureRequestEvent(const XConfigureRequestEvent *e) {
   if (! blackbox->validateWindow(e->window))
     return;
 
@@ -737,7 +737,7 @@ void Slit::toggleAutoHide(void) {
 }
 
 
-void Slit::unmapNotifyEvent(XUnmapEvent *e) {
+void Slit::unmapNotifyEvent(const XUnmapEvent *e) {
   removeClient(e->window);
 }
 
index 85b49d7d06532260c8ebd160c55de89d724da363..798ccb24b22ac6f93efcd87e1fc0a2b4fcaf29d5 100644 (file)
@@ -188,11 +188,11 @@ public:
   void shutdown(void);
   void toggleAutoHide(void);
 
-  void buttonPressEvent(XButtonEvent *e);
-  void enterNotifyEvent(XCrossingEvent * /*unused*/);
-  void leaveNotifyEvent(XCrossingEvent * /*unused*/);
-  void configureRequestEvent(XConfigureRequestEvent *e);
-  void unmapNotifyEvent(XUnmapEvent *e);
+  void buttonPressEvent(const XButtonEvent *e);
+  void enterNotifyEvent(const XCrossingEvent * /*unused*/);
+  void leaveNotifyEvent(const XCrossingEvent * /*unused*/);
+  void configureRequestEvent(const XConfigureRequestEvent *e);
+  void unmapNotifyEvent(const XUnmapEvent *e);
 
   virtual void timeout(void);
 
index f6ff130a8d633bdf6f381d7e6c982e90d19c2bd3..2890fa26fb6ca7d14cc2dfa6cd7f0a6f6083232f 100644 (file)
@@ -777,7 +777,7 @@ void Toolbar::edit(void) {
 }
 
 
-void Toolbar::buttonPressEvent(XButtonEvent *be) {
+void Toolbar::buttonPressEvent(const XButtonEvent *be) {
   if (be->button == 1) {
     if (be->window == frame.psbutton)
       redrawPrevWorkspaceButton(True, True);
@@ -826,7 +826,7 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) {
 
 
 
-void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
+void Toolbar::buttonReleaseEvent(const XButtonEvent *re) {
   if (re->button == 1) {
     if (re->window == frame.psbutton) {
       redrawPrevWorkspaceButton(False, True);
@@ -873,7 +873,7 @@ void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
 }
 
 
-void Toolbar::enterNotifyEvent(XCrossingEvent *) {
+void Toolbar::enterNotifyEvent(const XCrossingEvent *) {
   if (! do_auto_hide)
     return;
 
@@ -884,7 +884,7 @@ void Toolbar::enterNotifyEvent(XCrossingEvent *) {
   }
 }
 
-void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
+void Toolbar::leaveNotifyEvent(const XCrossingEvent *) {
   if (! do_auto_hide)
     return;
 
@@ -896,7 +896,7 @@ void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
 }
 
 
-void Toolbar::exposeEvent(XExposeEvent *ee) {
+void Toolbar::exposeEvent(const XExposeEvent *ee) {
   if (ee->window == frame.clock) checkClock(True);
   else if (ee->window == frame.workspace_label && (! editing))
     redrawWorkspaceLabel();
@@ -908,7 +908,7 @@ void Toolbar::exposeEvent(XExposeEvent *ee) {
 }
 
 
-void Toolbar::keyPressEvent(XKeyEvent *ke) {
+void Toolbar::keyPressEvent(const XKeyEvent *ke) {
   if (ke->window == frame.workspace_label && editing) {
     if (new_workspace_name.empty()) {
       new_name_pos = 0;
@@ -916,7 +916,7 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) {
 
     KeySym ks;
     char keychar[1];
-    XLookupString(ke, keychar, 1, &ks, 0);
+    XLookupString(const_cast<XKeyEvent*>(ke), keychar, 1, &ks, 0);
 
     // either we are told to end with a return or we hit 127 chars
     if (ks == XK_Return || new_name_pos == 127) {
index f9dd54816557d18c223d922c7eb30476942fd2f3..ae8353baec7d9f30f51962a1e2028cbe45cb88a1 100644 (file)
@@ -172,12 +172,12 @@ public:
   inline int getY(void) const
   { return ((hidden) ? frame.y_hidden : frame.rect.y()); }
 
-  void buttonPressEvent(XButtonEvent *be);
-  void buttonReleaseEvent(XButtonEvent *re);
-  void enterNotifyEvent(XCrossingEvent * /*unused*/);
-  void leaveNotifyEvent(XCrossingEvent * /*unused*/);
-  void exposeEvent(XExposeEvent *ee);
-  void keyPressEvent(XKeyEvent *ke);
+  void buttonPressEvent(const XButtonEvent *be);
+  void buttonReleaseEvent(const XButtonEvent *re);
+  void enterNotifyEvent(const XCrossingEvent * /*unused*/);
+  void leaveNotifyEvent(const XCrossingEvent * /*unused*/);
+  void exposeEvent(const XExposeEvent *ee);
+  void keyPressEvent(const XKeyEvent *ke);
 
   void edit(void);
   void reconfigure(void);
index 803cd9af12a3c3f08620e885bfa1b262fb0352c8..f1dfe6e8b85d716bd60e97ae9e443aba4fad7308 100644 (file)
@@ -134,13 +134,14 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
     frame.fgrip_pixel = 0;
   frame.utitle = frame.ftitle = frame.uhandle = frame.fhandle = None;
   frame.ulabel = frame.flabel = frame.ubutton = frame.fbutton = None;
-  frame.pbutton = frame.ugrip = frame.fgrip = decorations;
+  frame.pbutton = frame.ugrip = frame.fgrip = None;
 
   decorations = Decor_Titlebar | Decor_Border | Decor_Handle |
                 Decor_Iconify | Decor_Maximize;
   functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
 
   client.wm_hint_flags = client.normal_hint_flags = 0;
+  client.window_group = None;
   client.transient_for = 0;
 
   /*
@@ -271,32 +272,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
   }
 #endif // SHAPE
 
-  if ((! screen->isSloppyFocus()) || screen->doClickRaise()) {
-    // grab button 1 for changing focus/raising
-    blackbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
-                         GrabModeSync, GrabModeSync, None, None);
-  }
-
-  if (functions & Func_Move)
-    blackbox->grabButton(Button1, Mod1Mask, frame.window, True,
-                         ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
-                         GrabModeAsync, frame.window,
-                         blackbox->getMoveCursor());
-  blackbox->grabButton(Button2, Mod1Mask, frame.window, True,
-                       ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
-                       None, None);
-  if (functions & Func_Resize)
-    blackbox->grabButton(Button3, Mod1Mask, frame.window, True,
-                         ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
-                         GrabModeAsync, None,
-                         blackbox->getLowerRightAngleCursor());
-
-  positionWindows();
-  decorate();
-
-  if (decorations & Decor_Titlebar)
-    XMapSubwindows(blackbox->getXDisplay(), frame.title);
-  XMapSubwindows(blackbox->getXDisplay(), frame.window);
+  grabButtons();
 
   windowmenu = new Windowmenu(this);
 
@@ -329,16 +305,15 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
 
   if (flags.shaded) {
     flags.shaded = False;
+    unsigned long orig_state = current_state;
     shade();
 
     /*
-      Because the iconic'ness of shaded windows is lost, we need to set the
-      state to NormalState so that shaded windows on other workspaces will not
-      get shown on the first workspace.
       At this point in the life of a window, current_state should only be set
       to IconicState if the window was an *icon*, not if it was shaded.
     */
-    current_state = NormalState;
+    if (orig_state != IconicState)
+      current_state = NormalState;
   }
 
   if (flags.stuck) {
@@ -359,6 +334,11 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
     fact never set to Iconic since there is no way for us to tell if a sticky
     window was iconified previously.
   */
+  positionWindows();
+  decorate();
+
+  XMapSubwindows(blackbox->getXDisplay(), frame.window);
 
   redrawWindowFrame();
 }
@@ -838,17 +818,11 @@ void BlackboxWindow::positionButtons(bool redecorate_label) {
 void BlackboxWindow::reconfigure(void) {
   upsize();
 
-  client.rect.setPos(frame.rect.left() + frame.margin.left,
-                     frame.rect.top() + frame.margin.top);
-
   positionWindows();
   decorate();
 
   redrawWindowFrame();
 
-  configure(frame.rect.x(), frame.rect.y(),
-            frame.rect.width(), frame.rect.height());
-
   if (windowmenu) {
     windowmenu->move(windowmenu->getX(), frame.rect.y() + frame.title_h);
     windowmenu->reconfigure();
@@ -856,14 +830,31 @@ void BlackboxWindow::reconfigure(void) {
 }
 
 
-void BlackboxWindow::updateFocusModel(void) {
-  if ((! screen->isSloppyFocus()) || screen->doClickRaise()) {
+void BlackboxWindow::grabButtons(void) {
+  if ((! screen->isSloppyFocus()) || screen->doClickRaise())
     // grab button 1 for changing focus/raising
     blackbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
-                         GrabModeSync, GrabModeSync, None, None);
-  } else {
+                         GrabModeSync, GrabModeSync, frame.plate, None);
+
+  if (functions & Func_Move)
+    blackbox->grabButton(Button1, Mod1Mask, frame.window, True,
+                         ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+                         GrabModeAsync, frame.window,
+                         blackbox->getMoveCursor());
+  if (functions & Func_Resize)
+    blackbox->grabButton(Button3, Mod1Mask, frame.window, True,
+                         ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
+                         GrabModeAsync, frame.window,
+                         blackbox->getLowerRightAngleCursor());
+}
+
+
+void BlackboxWindow::ungrabButtons(void) {
+  if ((! screen->isSloppyFocus()) || screen->doClickRaise())
     blackbox->ungrabButton(Button1, 0, frame.plate);
-  }
+
+  blackbox->ungrabButton(Button1, Mod1Mask, frame.window);
+  blackbox->ungrabButton(Button3, Mod1Mask, frame.window);
 }
 
 
@@ -881,6 +872,11 @@ void BlackboxWindow::positionWindows(void) {
                     client.rect.width(), client.rect.height());
   XMoveResizeWindow(blackbox->getXDisplay(), client.window,
                     0, 0, client.rect.width(), client.rect.height());
+  // ensure client.rect contains the real location
+  client.rect.setCoords(frame.rect.left() + frame.margin.left,
+                        frame.rect.top() + frame.margin.top,
+                        frame.rect.right() - frame.margin.right,
+                        frame.rect.bottom() - frame.margin.bottom);
 
   if (decorations & Decor_Titlebar) {
     if (frame.title == None) createTitlebar();
@@ -1435,9 +1431,15 @@ BlackboxWindow *BlackboxWindow::getTransientFor(void) const {
 }
 
 
+/*
+ * This function is responsible for updating both the client and the frame
+ * rectangles.
+ * According to the ICCCM a client message is not sent for a resize, only a
+ * move.
+ */
 void BlackboxWindow::configure(int dx, int dy,
                                unsigned int dw, unsigned int dh) {
-  bool send_event = False;
+  bool send_event = (frame.rect.x() != dx || frame.rect.y() != dy);
 
   if (dw != frame.rect.width() || dh != frame.rect.height()) {
     frame.rect.setRect(dx, dy, dw, dh);
@@ -1461,9 +1463,7 @@ void BlackboxWindow::configure(int dx, int dy,
     positionWindows();
     decorate();
     redrawWindowFrame();
-  } else if (frame.rect.x() != dx || frame.rect.y() != dy) {
-    send_event = True;
-
+  } else {
     frame.rect.setPos(dx, dy);
 
     XMoveWindow(blackbox->getXDisplay(), frame.window,
@@ -1471,6 +1471,7 @@ void BlackboxWindow::configure(int dx, int dy,
   }
 
   if (send_event && ! flags.moving) {
+    // if moving, the update and event will occur when the move finishes
     client.rect.setPos(frame.rect.left() + frame.margin.left,
                        frame.rect.top() + frame.margin.top);
 
@@ -1490,7 +1491,6 @@ void BlackboxWindow::configure(int dx, int dy,
 
     XSendEvent(blackbox->getXDisplay(), client.window, False,
                StructureNotifyMask, &event);
-
     screen->updateNetizenConfigNotify(&event);
   }
 }
@@ -1532,8 +1532,10 @@ void BlackboxWindow::configureShape(void) {
 bool BlackboxWindow::setInputFocus(void) {
   if (flags.focused) return True;
 
-  assert(! flags.iconic);
-
+  assert(! flags.iconic &&
+         (flags.stuck ||  // window must be on the current workspace or sticky
+          blackbox_attrib.workspace == screen->getCurrentWorkspaceID()));
+#if 0
   // if the window is not visible, mark the window as wanting focus rather
   // than give it focus.
   if (! flags.visible) {
@@ -1541,7 +1543,7 @@ bool BlackboxWindow::setInputFocus(void) {
     wkspc->setLastFocusedWindow(this);
     return True;
   }
-
+#endif
   if (! frame.rect.intersects(screen->getRect())) {
     // client is outside the screen, move it to the center
     configure((screen->getWidth() - frame.rect.width()) / 2,
@@ -1653,13 +1655,24 @@ void BlackboxWindow::show(void) {
   XMapWindow(blackbox->getXDisplay(), client.window);
   XMapSubwindows(blackbox->getXDisplay(), frame.window);
   XMapWindow(blackbox->getXDisplay(), frame.window);
+
+#ifdef DEBUG
+  int real_x, real_y;
+  Window child;
+  XTranslateCoordinates(blackbox->getXDisplay(), client.window,
+                        screen->getRootWindow(),
+                        0, 0, &real_x, &real_y, &child);
+  fprintf(stderr, "%s -- assumed: (%d, %d), real: (%d, %d)\n", getTitle(),
+          client.rect.left(), client.rect.top(), real_x, real_y);
+  assert(client.rect.left() == real_x && client.rect.top() == real_y);
+#endif
 }
 
 
 void BlackboxWindow::deiconify(bool reassoc, bool raise) {
   if (flags.iconic || reassoc)
     screen->reassociateWindow(this, BSENTINEL, False);
-  else if (blackbox_attrib.workspace != screen->getCurrentWorkspace()->getID())
+  else if (blackbox_attrib.workspace != screen->getCurrentWorkspaceID())
     return;
 
   show();
@@ -2116,20 +2129,19 @@ void BlackboxWindow::restoreAttributes(void) {
 
   if (net->flags & AttribShaded && net->attrib & AttribShaded) {
     flags.shaded = False;
+    unsigned long orig_state = current_state;
     shade();
 
     /*
-      Because the iconic'ness of shaded windows is lost, we need to set the
-      state to NormalState so that shaded windows on other workspaces will not
-      get shown on the first workspace.
       At this point in the life of a window, current_state should only be set
       to IconicState if the window was an *icon*, not if it was shaded.
     */
-    current_state = NormalState;
+    if (orig_state != IconicState)
+      current_state = WithdrawnState;
  }
 
-  if ((net->workspace != screen->getCurrentWorkspaceID()) &&
-      (net->workspace < screen->getWorkspaceCount()))
+  if (net->workspace != screen->getCurrentWorkspaceID() &&
+      net->workspace < screen->getWorkspaceCount())
     screen->reassociateWindow(this, net->workspace, True);
 
   if ((blackbox_attrib.workspace != screen->getCurrentWorkspaceID()) &&
@@ -2521,8 +2533,16 @@ void BlackboxWindow::reparentNotifyEvent(const XReparentEvent *re) {
 }
 
 
-void BlackboxWindow::propertyNotifyEvent(Atom atom) {
-  switch(atom) {
+void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
+  if (pe->state == PropertyDelete)
+    return;
+
+#ifdef    DEBUG
+  fprintf(stderr, "BlackboxWindow::propertyNotifyEvent(): for 0x%lx\n",
+          client.window);
+#endif
+
+  switch(pe->atom) {
   case XA_WM_CLASS:
   case XA_WM_CLIENT_MACHINE:
   case XA_WM_COMMAND:
@@ -2567,6 +2587,9 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
 
     if ((client.normal_hint_flags & PMinSize) &&
         (client.normal_hint_flags & PMaxSize)) {
+      // the window now can/can't resize itself, so the buttons need to be
+      // regrabbed.
+      ungrabButtons();
       if (client.max_width <= client.min_width &&
           client.max_height <= client.min_height) {
         decorations &= ~(Decor_Maximize | Decor_Handle);
@@ -2575,6 +2598,7 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
         decorations |= Decor_Maximize | Decor_Handle;
         functions |= Func_Resize | Func_Maximize;
       }
+      grabButtons();
       setAllowedActions();
     }
 
@@ -2589,7 +2613,7 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
   }
 
   default:
-    if (atom == xatom->getAtom(XAtom::wm_protocols)) {
+    if (pe->atom == xatom->getAtom(XAtom::wm_protocols)) {
       getWMProtocols();
 
       if ((decorations & Decor_Close) && (! frame.close_button)) {
@@ -2600,7 +2624,7 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
         }
         if (windowmenu) windowmenu->reconfigure();
       }
-    } else if (atom == xatom->getAtom(XAtom::net_wm_strut)) {
+    } else if (pe->atom == xatom->getAtom(XAtom::net_wm_strut)) {
       updateStrut();
     }
 
@@ -2610,6 +2634,10 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
 
 
 void BlackboxWindow::exposeEvent(const XExposeEvent *ee) {
+#ifdef DEBUG
+  fprintf(stderr, "BlackboxWindow::exposeEvent() for 0x%lx\n", client.window);
+#endif
+
   if (frame.label == ee->window && (decorations & Decor_Titlebar))
     redrawLabel();
   else if (frame.close_button == ee->window)
@@ -2667,6 +2695,11 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
 
 
 void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) {
+#ifdef DEBUG
+  fprintf(stderr, "BlackboxWindow::buttonPressEvent() for 0x%lx\n",
+          client.window);
+#endif
+
   if (frame.maximize_button == be->window) {
     redrawMaximizeButton(True);
   } else if (be->button == 1 || (be->button == 3 && be->state == Mod1Mask)) {
@@ -2705,51 +2738,42 @@ void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) {
   } else if (windowmenu && be->button == 3 &&
              (frame.title == be->window || frame.label == be->window ||
               frame.handle == be->window || frame.window == be->window)) {
-    int mx = 0, my = 0;
-
-    if (frame.title == be->window || frame.label == be->window) {
-      mx = be->x_root - (windowmenu->getWidth() / 2);
-      my = frame.rect.y() + frame.title_h + frame.border_w;
-    } else if (frame.handle == be->window) {
-      mx = be->x_root - (windowmenu->getWidth() / 2);
-      my = frame.rect.bottom() - frame.handle_h - (frame.border_w * 3) -
-           windowmenu->getHeight();
+    if (windowmenu->isVisible()) {
+      windowmenu->hide();
     } else {
-      mx = be->x_root - (windowmenu->getWidth() / 2);
-
-      if (be->y <= static_cast<signed>(frame.bevel_w))
-        my = frame.rect.y() + frame.title_h;
-      else
-        my = be->y_root - (windowmenu->getHeight() / 2);
-    }
-
-    // snap the window menu into a corner if necessary - we check the
-    // position of the menu with the coordinates of the client to
-    // make the comparisions easier.
-    // XXX: this needs some work!
-    if (mx > client.rect.right() -
-        static_cast<signed>(windowmenu->getWidth()))
-      mx = frame.rect.right() - windowmenu->getWidth() - frame.border_w + 1;
-    if (mx < client.rect.left())
-      mx = frame.rect.x();
-
-    if (my > client.rect.bottom() -
-        static_cast<signed>(windowmenu->getHeight()))
-      my = frame.rect.bottom() - windowmenu->getHeight() - frame.border_w + 1;
-    if (my < client.rect.top())
-      my = frame.rect.y() + ((decorations & Decor_Titlebar) ?
-                             frame.title_h : 0);
-
-    if (windowmenu) {
-      if (! windowmenu->isVisible()) {
-        windowmenu->move(mx, my);
-        windowmenu->show();
-        XRaiseWindow(blackbox->getXDisplay(), windowmenu->getWindowID());
-        XRaiseWindow(blackbox->getXDisplay(),
-                     windowmenu->getSendToMenu()->getWindowID());
-      } else {
-        windowmenu->hide();
-      }
+      int mx = be->x_root - windowmenu->getWidth() / 2,
+          my = be->y_root - windowmenu->getHeight() / 2;
+
+      // snap the window menu into a corner/side if necessary
+      int left_edge, right_edge, top_edge, bottom_edge;
+
+      /*
+         the " + (frame.border_w * 2) - 1" bits are to get the proper width
+         and height of the menu, as the sizes returned by it do not include
+         the borders.
+       */
+      left_edge = frame.rect.x();
+      right_edge = frame.rect.right() -
+        (windowmenu->getWidth() + (frame.border_w * 2) - 1);
+      top_edge = client.rect.top() - (frame.border_w + frame.mwm_border_w);
+      bottom_edge = client.rect.bottom() -
+        (windowmenu->getHeight() + (frame.border_w * 2) - 1) +
+        (frame.border_w + frame.mwm_border_w);
+
+      if (mx < left_edge)
+        mx = left_edge;
+      if (mx > right_edge)
+        mx = right_edge;
+      if (my < top_edge)
+        my = top_edge;
+      if (my > bottom_edge)
+        my = bottom_edge;
+
+      windowmenu->move(mx, my);
+      windowmenu->show();
+      XRaiseWindow(blackbox->getXDisplay(), windowmenu->getWindowID());
+      XRaiseWindow(blackbox->getXDisplay(),
+                   windowmenu->getSendToMenu()->getWindowID());
     }
   // mouse wheel up
   } else if (be->button == 4) {
@@ -2768,6 +2792,11 @@ void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) {
 
 
 void BlackboxWindow::buttonReleaseEvent(const XButtonEvent *re) {
+#ifdef DEBUG
+  fprintf(stderr, "BlackboxWindow::buttonReleaseEvent() for 0x%lx\n",
+          client.window);
+#endif
+
   if (re->window == frame.maximize_button) {
     if ((re->x >= 0 && re->x <= static_cast<signed>(frame.button_w)) &&
         (re->y >= 0 && re->y <= static_cast<signed>(frame.button_w))) {
@@ -2791,9 +2820,6 @@ void BlackboxWindow::buttonReleaseEvent(const XButtonEvent *re) {
     endMove();
   } else if (flags.resizing) {
     endResize();
-  } else if (re->window == frame.window) {
-    if (re->button == 2 && re->state == Mod1Mask)
-      XUngrabPointer(blackbox->getXDisplay(), CurrentTime);
   }
 }
 
@@ -3190,6 +3216,11 @@ void BlackboxWindow::endResize(void) {
 
 
 void BlackboxWindow::motionNotifyEvent(const XMotionEvent *me) {
+#ifdef DEBUG
+  fprintf(stderr, "BlackboxWindow::motionNotifyEvent() for 0x%lx\n",
+          client.window);
+#endif
+
   if (flags.moving) {
     doMove(me->x_root, me->y_root);
   } else if (flags.resizing) {
@@ -3244,6 +3275,9 @@ void BlackboxWindow::restore(bool remap) {
   XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask);
   XSelectInput(blackbox->getXDisplay(), frame.plate, NoEventMask);
 
+  // do not leave a shaded window as an icon unless it was an icon
+  if (flags.shaded && ! flags.iconic) setState(NormalState);
+
   restoreGravity(client.rect);
 
   XUnmapWindow(blackbox->getXDisplay(), frame.window);
index 0f3fb14d3cf25df166f906629bcefc3b3c040e90..64ad1c34982542500a906215f63d3d0c8ff3d4e3 100644 (file)
@@ -379,7 +379,8 @@ public:
   void shade(void);
   void stick(void);
   void reconfigure(void);
-  void updateFocusModel(void);
+  void grabButtons(void);
+  void ungrabButtons(void);
   void installColormap(bool install);
   void restore(bool remap);
   void configure(int dx, int dy, unsigned int dw, unsigned int dh);
@@ -394,7 +395,7 @@ public:
   void mapRequestEvent(const XMapRequestEvent *mre);
   void unmapNotifyEvent(const XUnmapEvent */*unused*/);
   void reparentNotifyEvent(const XReparentEvent */*unused*/);
-  void propertyNotifyEvent(Atom atom);
+  void propertyNotifyEvent(const XPropertyEvent *pe);
   void exposeEvent(const XExposeEvent *ee);
   void configureRequestEvent(const XConfigureRequestEvent *cr);
 
index 60efba1e3845badb92d84e937b1b09f8346ce3ac..90a83b2678a43a531dd78f214b668b2fb1055299 100644 (file)
@@ -103,8 +103,13 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
   if ((w->isFocused() || w == lastfocus) &&
       ! screen->getBlackbox()->doShutdown()) {
     BlackboxWindow *newfocus = 0;
-    if (w->isTransient())
+    if (w->isTransient()) {
       newfocus = w->getTransientFor();
+      if (newfocus &&
+          (newfocus->isIconic() ||                // do not focus icons
+           newfocus->getWorkspaceNumber() != id)) // or other workspaces
+        newfocus = 0;
+    }
     if (! newfocus && ! stackingList.empty())
       newfocus = stackingList.front();
 
@@ -115,7 +120,7 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
         if the window is on the visible workspace, then try focus it, and fall
         back to the default focus target if the window won't focus.
       */
-      if (! newfocus || ! newfocus->setInputFocus())
+      if (! (newfocus && newfocus->setInputFocus()))
         screen->getBlackbox()->setFocusedWindow(0);
     } else if (lastfocus == w) {
       /*
@@ -320,12 +325,6 @@ void Workspace::reconfigure(void) {
 }
 
 
-void Workspace::updateFocusModel(void) {
-  std::for_each(windowList.begin(), windowList.end(),
-                std::mem_fun(&BlackboxWindow::updateFocusModel));
-}
-
-
 BlackboxWindow *Workspace::getWindow(unsigned int index) {
   if (index < windowList.size()) {
     BlackboxWindowList::iterator it = windowList.begin();
index 31ddace817c49dbe2dd991172b1cfe72ae1fa41d..0059e293fdcd4c46d59b7e94a2b5f0dbda7be1dd 100644 (file)
@@ -102,7 +102,6 @@ public:
   void raiseWindow(BlackboxWindow *w);
   void lowerWindow(BlackboxWindow *w);
   void reconfigure(void);
-  void updateFocusModel(void);
   void setCurrent(void);
   void setName(const std::string& new_name);
 };
index 6af1d2d3181cd6b70d0b8c2cefa599d0ef578b88..0865b681f6e50fb1ed330294ea55c1f3a6925d4b 100644 (file)
@@ -322,7 +322,12 @@ void Blackbox::process_event(XEvent *e) {
 
     BlackboxWindow *win = searchWindow(e->xmaprequest.window);
 
-    if (! win) {
+    if (win) {
+      if (win->isIconic()) {
+        win->deiconify();
+        win->setInputFocus();
+      }
+    } else {
       BScreen *screen = searchScreen(e->xmaprequest.parent);
 
       if (! screen) {
@@ -444,13 +449,9 @@ void Blackbox::process_event(XEvent *e) {
   case PropertyNotify: {
     last_time = e->xproperty.time;
 
-    if (e->xproperty.state != PropertyDelete) {
-      BlackboxWindow *win = searchWindow(e->xproperty.window);
-
-      if (win)
-        win->propertyNotifyEvent(e->xproperty.atom);
-    }
-
+    BlackboxWindow *win = searchWindow(e->xproperty.window);
+    if (win)
+      win->propertyNotifyEvent(&e->xproperty);
     break;
   }
 
This page took 0.049617 seconds and 4 git commands to generate.