From 0b8592b203c5da0fee069801e8413a5cc7c2eb64 Mon Sep 17 00:00:00 2001 From: rathnor <rathnor> Date: Wed, 14 Apr 2004 15:17:20 +0000 Subject: hopefully fix strange hang, plus tab drag fixes --- ChangeLog | 4 +++ src/Window.cc | 90 ++++++++++++++++++++++++++--------------------------------- 2 files changed, 43 insertions(+), 51 deletions(-) diff --git a/ChangeLog b/ChangeLog index b9055ac..3e8e1b5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ (Format: Year/Month/Day) Changes for 0.9.9: *04/04/14: + * Hopefully fix the "stange" hang on restart (Simon) + - remove big sync-ed grab on all Button1 events + - Also tidy and fix tab moving + Window.cc * Fixed a menu title bug (Thanks Mathias Gumz) Menu.cc *04/04/12: diff --git a/src/Window.cc b/src/Window.cc index faeec93..b7913c1 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Window.cc,v 1.277 2004/04/12 23:03:34 fluxgen Exp $ +// $Id: Window.cc,v 1.278 2004/04/14 15:17:20 rathnor Exp $ #include "Window.hh" @@ -974,9 +974,6 @@ void FluxboxWindow::associateClientWindow(bool use_attrs, int x, int y, unsigned void FluxboxWindow::grabButtons() { - XGrabButton(display, Button1, AnyModifier, - frame().window().window(), True, ButtonPressMask, - GrabModeSync, GrabModeSync, None, None); XUngrabButton(display, Button1, Mod1Mask|Mod2Mask|Mod3Mask, frame().window().window()); if (Fluxbox::instance()->useMod1()) { @@ -2387,7 +2384,7 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { if (Fluxbox::instance()->getIgnoreBorder() && !(me.state & Mod1Mask) // really should check for exact matches - && !(isMoving() || isResizing())) { + && !(isMoving() || isResizing() || m_attaching_tab != 0)) { int borderw = frame().window().borderWidth(); if (me.x_root < (frame().x() + borderw) || me.y_root < (frame().y() + borderw) || @@ -2416,6 +2413,11 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { if (! isMoving()) { startMoving(me.window); + // save first event point + m_last_resize_x = me.x_root; + m_last_resize_y = me.y_root; + m_button_grab_x = me.x_root - frame().x() - frame().window().borderWidth(); + m_button_grab_y = me.y_root - frame().y() - frame().window().borderWidth(); } else { int dx = me.x_root - m_button_grab_x, dy = me.y_root - m_button_grab_y; @@ -2539,67 +2541,56 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { screen().showGeometry(gx, gy); } - } else if ((me.state & Button2Mask) && inside_titlebar && client != 0) { - if (s_num_grabs > 0) - return; + } else if ((me.state & Button2Mask) && inside_titlebar && (client != 0 || m_attaching_tab != 0)) { // // drag'n'drop code for tabs // + FbTk::TextButton &active_button = *m_labelbuttons[(m_attaching_tab==0)?client:m_attaching_tab]; +; if (m_attaching_tab == 0) { + if (s_num_grabs > 0) + return; // start drag'n'drop for tab m_attaching_tab = client; - grabPointer(me.window, False, Button2MotionMask | + grabPointer(me.window, False, ButtonMotionMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, - None, frame().theme().moveCursor(), CurrentTime); - m_last_move_x = me.x_root - 1; - m_last_move_y = me.y_root - 1; - + None, frame(). theme().moveCursor(), CurrentTime); + int borderw = active_button.borderWidth(); + // relative position on button + m_button_grab_x = me.x; + m_button_grab_y = me.y; + // last known root mouse position + m_last_move_x = me.x_root - me.x; + m_last_move_y = me.y_root - me.y; + // hijack extra vars for initial grab location + m_last_resize_x = me.x_root; + m_last_resize_y = me.y_root; + + Fluxbox::instance()->grab(); + parent().drawRectangle(screen().rootTheme().opGC(), m_last_move_x, m_last_move_y, - m_labelbuttons[client]->width(), - m_labelbuttons[client]->height()); + active_button.width(), + active_button.height()); } else { // we already grabed and started to drag'n'drop tab // so we update drag'n'drop-rectangle - int dx = me.x_root - 1, dy = me.y_root - 1; - - dx -= frame().window().borderWidth(); - dy -= frame().window().borderWidth(); + int dx = me.x_root - m_button_grab_x, dy = me.y_root - m_button_grab_y; - if (screen().getEdgeSnapThreshold()) { - int drx = screen().width() - (dx + 1); - - if (dx > 0 && dx < drx && dx < screen().getEdgeSnapThreshold()) - dx = 0; - else if (drx > 0 && drx < screen().getEdgeSnapThreshold()) - dx = screen().width() - 1; - - int dty, dby; - - dty = dy; - dby = -dy - 1; - - if (dy > 0 && dty < screen().getEdgeSnapThreshold()) - dy = 0; - else if (dby > 0 && dby < screen().getEdgeSnapThreshold()) - dy = - 1; - - } - //erase rectangle parent().drawRectangle(screen().rootTheme().opGC(), m_last_move_x, m_last_move_y, - m_labelbuttons[client]->width(), - m_labelbuttons[client]->height()); + active_button.width(), + active_button.height()); // redraw rectangle at new pos m_last_move_x = dx; - m_last_move_y = dy; + m_last_move_y = dy; parent().drawRectangle(screen().rootTheme().opGC(), m_last_move_x, m_last_move_y, - m_labelbuttons[client]->width(), - m_labelbuttons[client]->height()); + active_button.width(), + active_button.height()); } @@ -3073,7 +3064,7 @@ void FluxboxWindow::attachTo(int x, int y) { m_last_move_x, m_last_move_y, m_labelbuttons[m_attaching_tab]->width(), m_labelbuttons[m_attaching_tab]->height()); - + Fluxbox::instance()->ungrab(); int dest_x = 0, dest_y = 0; Window child = 0; @@ -3086,10 +3077,6 @@ void FluxboxWindow::attachTo(int x, int y) { if (client) attach_to_win = client->fbwindow(); - cerr<<"client = "<<client<<", child = "<<hex<<child<<dec<<", fbwin = "<<attach_to_win<<endl; - - cerr<<"client = "<<client<<", child = "<<hex<<child<<dec<<", fbwin = "<<attach_to_win<<endl; - if (attach_to_win != this && attach_to_win != 0) { @@ -3099,9 +3086,10 @@ void FluxboxWindow::attachTo(int x, int y) { // disconnect client if we didn't drop on a window WinClient &client = *m_attaching_tab; detachClient(*m_attaching_tab); - // move to drop zone + // move window by relative amount of mouse movement + // since just detached, move relative to old location if (client.m_win != 0) - client.m_win->move(x, y); + client.m_win->move(frame().x() - m_last_resize_x + x, frame().y() - m_last_resize_y + y); } -- cgit v0.11.2