hopefully fix strange hang, plus tab drag fixes
rathnor rathnor
2 files changed,
43 insertions(+),
51 deletions(-)
M
ChangeLog
→
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:
M
src/Window.cc
→
src/Window.cc
@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// 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::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 @@ frame().handle() == me.window || frame().window() == me.window);
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 @@ !isResizing()) {
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 @@ m_last_resize_h - 1 + 2 * frame().window().borderWidth());
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(); - - 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; + int dx = me.x_root - m_button_grab_x, dy = me.y_root - m_button_grab_y; - 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 @@ parent().drawRectangle(screen().rootTheme().opGC(),
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;@@ -3085,10 +3076,6 @@ WinClient *client = Fluxbox::instance()->searchWindow(child);
FluxboxWindow *attach_to_win = 0; 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 @@ } else if (attach_to_win != this) {
// 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); }