From 830e53f25cb8e48b50c8404b32e36708d335decc Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 28 Apr 2002 11:26:55 +0000 Subject: [PATCH] moved the 'moving window' logic into separate functions "startMove" "doMove" and "endMove" --- src/Window.cc | 216 +++++++++++++++++++++++++++----------------------- src/Window.h | 144 +++++++++++++++++---------------- 2 files changed, 192 insertions(+), 168 deletions(-) diff --git a/src/Window.cc b/src/Window.cc index 115b8c0f..51e2b41b 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -2483,8 +2483,6 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { // alt + left/right click begins interactively moving/resizing the window // when the mouse is moved if (be->state == Mod1Mask && (be->button == 1 || be->button == 3)) { - frame.grab_x = be->x_root - frame.x - frame.border_w; - frame.grab_y = be->y_root - frame.y - frame.border_w; if (be->button == 3) { if (screen->getWindowZones() == 4 && be->y < (signed) frame.height / 2) { @@ -2699,21 +2697,7 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { // when the window is being interactively moved, a button release stops the // move where it is if (flags.moving) { - flags.moving = False; - - openbox.maskWindowEvents(0, (OpenboxWindow *) 0); - if (!screen->opaqueMove()) { - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); - - configure(frame.move_x, frame.move_y, frame.width, frame.height); - openbox.ungrab(); - } else { - configure(frame.x, frame.y, frame.width, frame.height); - } - screen->hideGeometry(); - XUngrabPointer(display, CurrentTime); + endMove(); // when the window is being interactively resized, a button release stops the // resizing } else if (flags.resizing) { @@ -2745,101 +2729,137 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { } -void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { - if (!flags.resizing && (me->state & Button1Mask) && functions.move && - (frame.title == me->window || frame.label == me->window || - frame.handle == me->window || frame.window == me->window)) { - if (! flags.moving) { - XGrabPointer(display, me->window, False, Button1MotionMask | - ButtonReleaseMask, GrabModeAsync, GrabModeAsync, - None, openbox.getMoveCursor(), CurrentTime); +void OpenboxWindow::startMove(int x, int y) { + ASSERT(!flags.moving); - if (windowmenu && windowmenu->isVisible()) - windowmenu->hide(); + XGrabPointer(display, frame.window, False, Button1MotionMask | + ButtonReleaseMask, GrabModeAsync, GrabModeAsync, + None, openbox.getMoveCursor(), CurrentTime); - flags.moving = True; + if (windowmenu && windowmenu->isVisible()) + windowmenu->hide(); - openbox.maskWindowEvents(client.window, this); + flags.moving = True; - if (! screen->opaqueMove()) { - openbox.grab(); + openbox.maskWindowEvents(client.window, this); - frame.move_x = frame.x; - frame.move_y = frame.y; - frame.resize_w = frame.width + (frame.border_w * 2); - frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) + - (frame.border_w * 2); + if (! screen->opaqueMove()) { + openbox.grab(); - screen->showPosition(frame.x, frame.y); + frame.move_x = frame.x; + frame.move_y = frame.y; + frame.resize_w = frame.width + (frame.border_w * 2); + frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) + + (frame.border_w * 2); - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, - frame.resize_w - 1, frame.resize_h - 1); - } - } else { - int dx = me->x_root - frame.grab_x, dy = me->y_root - frame.grab_y; - - dx -= frame.border_w; - dy -= frame.border_w; - - int snap_distance = screen->edgeSnapThreshold(); - // width/height of the snapping window - unsigned int snap_w = frame.width + (frame.border_w * 2); - unsigned int snap_h = area().h() + (frame.border_w * 2); - if (snap_distance) { - int drx = screen->size().w() - (dx + snap_w); - - if (dx < drx && (dx > 0 && dx < snap_distance) || - (dx < 0 && dx > -snap_distance) ) - dx = 0; - else if ( (drx > 0 && drx < snap_distance) || - (drx < 0 && drx > -snap_distance) ) - dx = screen->size().w() - snap_w; - - int dtty, dbby, dty, dby; - switch (screen->getToolbar()->placement()) { - case Toolbar::TopLeft: - case Toolbar::TopCenter: - case Toolbar::TopRight: - dtty = screen->getToolbar()->getExposedHeight() + - frame.border_w; - dbby = screen->size().h(); - break; - - default: - dtty = 0; - dbby = screen->getToolbar()->area().y(); - break; - } + screen->showPosition(frame.x, frame.y); - dty = dy - dtty; - dby = dbby - (dy + snap_h); + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, + frame.resize_w - 1, frame.resize_h - 1); + } + frame.grab_x = x - frame.x - frame.border_w; + frame.grab_y = y - frame.y - frame.border_w; +} - if ( (dy > 0 && dty < snap_distance) || - (dy < 0 && dty > -snap_distance) ) - dy = dtty; - else if ( (dby > 0 && dby < snap_distance) || - (dby < 0 && dby > -snap_distance) ) - dy = dbby - snap_h; - } - if (screen->opaqueMove()) { - configure(dx, dy, frame.width, frame.height); - } else { - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); +void OpenboxWindow::doMove(int x, int y) { + ASSERT(flags.moving); - frame.move_x = dx; - frame.move_y = dy; + int dx = x - frame.grab_x, dy = y - frame.grab_y; - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); - } + dx -= frame.border_w; + dy -= frame.border_w; + + int snap_distance = screen->edgeSnapThreshold(); + // width/height of the snapping window + unsigned int snap_w = frame.width + (frame.border_w * 2); + unsigned int snap_h = area().h() + (frame.border_w * 2); + if (snap_distance) { + int drx = screen->size().w() - (dx + snap_w); - screen->showPosition(dx, dy); + if (dx < drx && (dx > 0 && dx < snap_distance) || + (dx < 0 && dx > -snap_distance) ) + dx = 0; + else if ( (drx > 0 && drx < snap_distance) || + (drx < 0 && drx > -snap_distance) ) + dx = screen->size().w() - snap_w; + + int dtty, dbby, dty, dby; + switch (screen->getToolbar()->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + dtty = screen->getToolbar()->getExposedHeight() + + frame.border_w; + dbby = screen->size().h(); + break; + + default: + dtty = 0; + dbby = screen->getToolbar()->area().y(); + break; } + + dty = dy - dtty; + dby = dbby - (dy + snap_h); + + if ( (dy > 0 && dty < snap_distance) || + (dy < 0 && dty > -snap_distance) ) + dy = dtty; + else if ( (dby > 0 && dby < snap_distance) || + (dby < 0 && dby > -snap_distance) ) + dy = dbby - snap_h; + } + + if (screen->opaqueMove()) { + configure(dx, dy, frame.width, frame.height); + } else { + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + + frame.move_x = dx; + frame.move_y = dy; + + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + } + + screen->showPosition(dx, dy); +} + + +void OpenboxWindow::endMove() { + ASSERT(flags.moving); + + flags.moving = False; + + openbox.maskWindowEvents(0, (OpenboxWindow *) 0); + if (!screen->opaqueMove()) { + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + + configure(frame.move_x, frame.move_y, frame.width, frame.height); + openbox.ungrab(); + } else { + configure(frame.x, frame.y, frame.width, frame.height); + } + screen->hideGeometry(); + XUngrabPointer(display, CurrentTime); +} + + +void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { + if (!flags.resizing && (me->state & Button1Mask) && functions.move && + (frame.title == me->window || frame.label == me->window || + frame.handle == me->window || frame.window == me->window)) { + if (!flags.moving) + startMove(me->x_root, me->y_root); + else + doMove(me->x_root, me->y_root); } else if (functions.resize && (((me->state & Button1Mask) && (me->window == frame.right_grip || me->window == frame.left_grip)) || diff --git a/src/Window.h b/src/Window.h index b916ca67..faaf9a00 100644 --- a/src/Window.h +++ b/src/Window.h @@ -203,93 +203,94 @@ private: } frame; protected: - Bool getState(void); + Bool getState(); Window createToplevelWindow(int x, int y, unsigned int width, unsigned int height, unsigned int borderwidth); Window createChildWindow(Window parent, Cursor = None); - void getWMName(void); - void getWMIconName(void); - void getWMNormalHints(void); - void getWMProtocols(void); - void getWMHints(void); - void getMWMHints(void); - void getOpenboxHints(void); - void setNetWMAttributes(void); - void associateClientWindow(void); - void decorate(void); - void decorateLabel(void); + void getWMName(); + void getWMIconName(); + void getWMNormalHints(); + void getWMProtocols(); + void getWMHints(); + void getMWMHints(); + void getOpenboxHints(); + void setNetWMAttributes(); + void associateClientWindow(); + void decorate(); + void decorateLabel(); void positionButtons(Bool redecorate_label = False); - void positionWindows(void); - void createCloseButton(void); - void createIconifyButton(void); - void createMaximizeButton(void); - void redrawLabel(void); - void redrawAllButtons(void); + void positionWindows(); + void createCloseButton(); + void createIconifyButton(); + void createMaximizeButton(); + void redrawLabel(); + void redrawAllButtons(); void redrawCloseButton(Bool); void redrawIconifyButton(Bool); void redrawMaximizeButton(Bool); - void restoreGravity(void); - void setGravityOffsets(void); + void restoreGravity(); + void setGravityOffsets(); void setState(unsigned long); - void upsize(void); - void downsize(void); + void upsize(); + void downsize(); void right_fixsize(int *gx = 0, int *gy = 0); void left_fixsize(int *gx = 0, int *gy = 0); + void doMove(int x, int y); public: OpenboxWindow(Openbox &b, Window w, BScreen *s = (BScreen *) 0); - virtual ~OpenboxWindow(void); - - inline Bool isTransient(void) const { return flags.transient; } - inline Bool isFocused(void) const { return flags.focused; } - inline Bool isVisible(void) const { return flags.visible; } - inline Bool isIconic(void) const { return flags.iconic; } - inline Bool isShaded(void) const { return flags.shaded; } - inline Bool isMaximized(void) const { return flags.maximized; } - inline Bool isMaximizedFull(void) const { return flags.maximized == 1; } - inline Bool isStuck(void) const { return flags.stuck; } - inline Bool isIconifiable(void) const { return functions.iconify; } - inline Bool isMaximizable(void) const { return functions.maximize; } - inline Bool isResizable(void) const { return functions.resize; } - inline Bool isClosable(void) const { return functions.close; } - - inline Bool hasTitlebar(void) const { return decorations.titlebar; } - inline Bool hasTransient(void) const + virtual ~OpenboxWindow(); + + inline Bool isTransient() const { return flags.transient; } + inline Bool isFocused() const { return flags.focused; } + inline Bool isVisible() const { return flags.visible; } + inline Bool isIconic() const { return flags.iconic; } + inline Bool isShaded() const { return flags.shaded; } + inline Bool isMaximized() const { return flags.maximized; } + inline Bool isMaximizedFull() const { return flags.maximized == 1; } + inline Bool isStuck() const { return flags.stuck; } + inline Bool isIconifiable() const { return functions.iconify; } + inline Bool isMaximizable() const { return functions.maximize; } + inline Bool isResizable() const { return functions.resize; } + inline Bool isClosable() const { return functions.close; } + + inline Bool hasTitlebar() const { return decorations.titlebar; } + inline Bool hasTransient() const { return ((client.transient) ? True : False); } - inline OpenboxWindow *getTransient(void) { return client.transient; } - inline OpenboxWindow *getTransientFor(void) { return client.transient_for; } + inline OpenboxWindow *getTransient() { return client.transient; } + inline OpenboxWindow *getTransientFor() { return client.transient_for; } - inline BScreen *getScreen(void) { return screen; } + inline BScreen *getScreen() { return screen; } - inline const Window &getFrameWindow(void) const { return frame.window; } - inline const Window &getClientWindow(void) const { return client.window; } + inline const Window &getFrameWindow() const { return frame.window; } + inline const Window &getClientWindow() const { return client.window; } - inline Windowmenu * getWindowmenu(void) { return windowmenu; } + inline Windowmenu * getWindowmenu() { return windowmenu; } - inline char **getTitle(void) { return &client.title; } - inline char **getIconTitle(void) { return &client.icon_title; } - //inline const int &getXFrame(void) const { return frame.x; } - //inline const int &getYFrame(void) const { return frame.y; } - //inline const int &getXClient(void) const { return client.x; } - //inline const int &getYClient(void) const { return client.y; } - inline const int &getWorkspaceNumber(void) const { return workspace_number; } - inline const int &getWindowNumber(void) const { return window_number; } + inline char **getTitle() { return &client.title; } + inline char **getIconTitle() { return &client.icon_title; } + //inline const int &getXFrame() const { return frame.x; } + //inline const int &getYFrame() const { return frame.y; } + //inline const int &getXClient() const { return client.x; } + //inline const int &getYClient() const { return client.y; } + inline const int &getWorkspaceNumber() const { return workspace_number; } + inline const int &getWindowNumber() const { return window_number; } - //inline const unsigned int &getWidth(void) const { return frame.width; } - //inline const unsigned int &getHeight(void) const { + //inline const unsigned int &getWidth() const { return frame.width; } + //inline const unsigned int &getHeight() const { // if (!flags.shaded) // return frame.height; // else // return frame.title_h; //} - //inline const unsigned int &getClientHeight(void) const + //inline const unsigned int &getClientHeight() const //{ return client.height; } - //inline const unsigned int &getClientWidth(void) const + //inline const unsigned int &getClientWidth() const //{ return client.width; } - inline const unsigned int &getTitleHeight(void) const + inline const unsigned int &getTitleHeight() const { return frame.title_h; } //inline const Point origin() const { @@ -314,26 +315,29 @@ public: inline void setWindowNumber(int n) { window_number = n; } - Bool validateClient(void); - Bool setInputFocus(void); + Bool validateClient(); + Bool setInputFocus(); void setFocusFlag(Bool); - void iconify(void); + void iconify(); void deiconify(Bool reassoc = True, Bool raise = True); - void close(void); - void withdraw(void); + void close(); + void withdraw(); void maximize(unsigned int button); - void shade(void); - void stick(void); - void unstick(void); - void reconfigure(void); + void shade(); + void stick(); + void unstick(); + void reconfigure(); void installColormap(Bool); - void restore(void); + void restore(); void configure(int dx, int dy, unsigned int dw, unsigned int dh); void setWorkspace(int n); void changeOpenboxHints(OpenboxHints *); - void restoreAttributes(void); + void restoreAttributes(); + void startMove(int x, int y); + void endMove(); + void buttonPressEvent(XButtonEvent *); void buttonReleaseEvent(XButtonEvent *); void motionNotifyEvent(XMotionEvent *); @@ -349,7 +353,7 @@ public: void shapeEvent(XShapeEvent *); #endif // SHAPE - virtual void timeout(void); + virtual void timeout(); }; -- 2.45.2