Explorar el Código

WindowServer: Don't de-maximize windows immediately (#756)

At least 5 pixels of dragging in some direction needed until a window
gets de-maximized.
masi456 hace 5 años
padre
commit
7e7451c427
Se han modificado 2 ficheros con 32 adiciones y 10 borrados
  1. 10 0
      Libraries/LibDraw/Point.h
  2. 22 10
      Servers/WindowServer/WSWindowManager.cpp

+ 10 - 0
Libraries/LibDraw/Point.h

@@ -110,6 +110,16 @@ public:
             set_y(value);
     }
 
+    // Returns pixels moved from other in either direction
+    int pixels_moved(const Point &other) const
+    {
+        auto pixels_moved = max(
+            abs(other.x() - x()),
+            abs(other.y() - y())
+        );
+        return pixels_moved;
+    }
+
 private:
     int m_x { 0 };
     int m_y { 0 };

+ 22 - 10
Servers/WindowServer/WSWindowManager.cpp

@@ -419,11 +419,6 @@ void WSWindowManager::start_window_drag(WSWindow& window, const WSMouseEvent& ev
     move_to_front_and_make_active(window);
     m_drag_window = window.make_weak_ptr();
     m_drag_origin = event.position();
-    if (window.is_maximized()) {
-        auto width_before_resize = window.width();
-        window.set_maximized(false);
-        window.move_to(m_drag_origin.x() - (window.width() * ((float)m_drag_origin.x() / width_before_resize)), m_drag_origin.y());
-    }
     m_drag_window_origin = window.position();
     invalidate(window);
 }
@@ -489,14 +484,31 @@ bool WSWindowManager::process_ongoing_window_drag(WSMouseEvent& event, WSWindow*
         return true;
     }
     if (event.type() == WSEvent::MouseMove) {
+        
 #ifdef DRAG_DEBUG
         dbg() << "[WM] Dragging, origin: " << m_drag_origin << ", now: " << event.position();
+        if (m_drag_window->is_maximized()) {
+            dbg() << "  [!] The window is still maximized. Not dragging yet.";
+        }
 #endif
-        Point pos = m_drag_window_origin.translated(event.position() - m_drag_origin);
-        m_drag_window->set_position_without_repaint(pos);
-        if (m_drag_window->rect().contains(event.position()))
-            hovered_window = m_drag_window;
-        return true;
+        if (m_drag_window->is_maximized()) {
+            auto pixels_moved_from_start = event.position().pixels_moved(m_drag_origin);
+            // dbg() << "[WM] " << pixels_moved_from_start << " moved since start of drag";
+            if (pixels_moved_from_start > 5) {
+                // dbg() << "[WM] de-maximizing window";
+                m_drag_origin = event.position();
+                auto width_before_resize = m_drag_window->width();
+                m_drag_window->set_maximized(false);
+                m_drag_window->move_to(m_drag_origin.x() - (m_drag_window->width() * ((float)m_drag_origin.x() / width_before_resize)), m_drag_origin.y());
+                m_drag_window_origin = m_drag_window->position();
+            }
+        } else {
+            Point pos = m_drag_window_origin.translated(event.position() - m_drag_origin);
+            m_drag_window->set_position_without_repaint(pos);
+            if (m_drag_window->rect().contains(event.position()))
+                hovered_window = m_drag_window;
+            return true;
+        }
     }
     return false;
 }