summaryrefslogtreecommitdiff
path: root/Libraries/LibGUI
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibGUI')
-rw-r--r--Libraries/LibGUI/Event.h18
-rw-r--r--Libraries/LibGUI/Widget.cpp12
-rw-r--r--Libraries/LibGUI/Widget.h1
-rw-r--r--Libraries/LibGUI/Window.cpp10
-rw-r--r--Libraries/LibGUI/WindowServerConnection.cpp12
5 files changed, 47 insertions, 6 deletions
diff --git a/Libraries/LibGUI/Event.h b/Libraries/LibGUI/Event.h
index 7b6b472176..c518a694a1 100644
--- a/Libraries/LibGUI/Event.h
+++ b/Libraries/LibGUI/Event.h
@@ -60,6 +60,7 @@ public:
WindowCloseRequest,
ContextMenu,
EnabledChange,
+ DragMove,
Drop,
__Begin_WM_Events,
@@ -306,6 +307,23 @@ private:
int m_wheel_delta { 0 };
};
+class DragEvent final : public Event {
+public:
+ DragEvent(Type type, const Gfx::Point& position, const String& data_type)
+ : Event(type)
+ , m_position(position)
+ , m_data_type(data_type)
+ {
+ }
+
+ const Gfx::Point& position() const { return m_position; }
+ const String& data_type() const { return m_data_type; }
+
+private:
+ Gfx::Point m_position;
+ String m_data_type;
+};
+
class DropEvent final : public Event {
public:
DropEvent(const Gfx::Point& position, const String& text, const String& data_type, const String& data)
diff --git a/Libraries/LibGUI/Widget.cpp b/Libraries/LibGUI/Widget.cpp
index b4b2ccc084..0997b52773 100644
--- a/Libraries/LibGUI/Widget.cpp
+++ b/Libraries/LibGUI/Widget.cpp
@@ -26,8 +26,6 @@
#include <AK/Assertions.h>
#include <AK/JsonObject.h>
-#include <LibGfx/Bitmap.h>
-#include <LibGfx/Palette.h>
#include <LibGUI/Action.h>
#include <LibGUI/Application.h>
#include <LibGUI/Button.h>
@@ -46,6 +44,8 @@
#include <LibGUI/Widget.h>
#include <LibGUI/Window.h>
#include <LibGUI/WindowServerConnection.h>
+#include <LibGfx/Bitmap.h>
+#include <LibGfx/Palette.h>
#include <unistd.h>
namespace GUI {
@@ -182,6 +182,8 @@ void Widget::event(Core::Event& event)
return handle_mouseup_event(static_cast<MouseEvent&>(event));
case Event::MouseWheel:
return mousewheel_event(static_cast<MouseEvent&>(event));
+ case Event::DragMove:
+ return drag_move_event(static_cast<DragEvent&>(event));
case Event::Drop:
return drop_event(static_cast<DropEvent&>(event));
case Event::Enter:
@@ -379,6 +381,12 @@ void Widget::change_event(Event&)
{
}
+void Widget::drag_move_event(DragEvent& event)
+{
+ dbg() << class_name() << "{" << this << "} DRAG MOVE position: " << event.position() << ", data_type: '" << event.data_type() << "'";
+ event.ignore();
+}
+
void Widget::drop_event(DropEvent& event)
{
dbg() << class_name() << "{" << this << "} DROP position: " << event.position() << ", text: '" << event.text() << "'";
diff --git a/Libraries/LibGUI/Widget.h b/Libraries/LibGUI/Widget.h
index 9ecb8fe8c1..d294673dca 100644
--- a/Libraries/LibGUI/Widget.h
+++ b/Libraries/LibGUI/Widget.h
@@ -303,6 +303,7 @@ protected:
virtual void leave_event(Core::Event&);
virtual void child_event(Core::ChildEvent&) override;
virtual void change_event(Event&);
+ virtual void drag_move_event(DragEvent&);
virtual void drop_event(DropEvent&);
private:
diff --git a/Libraries/LibGUI/Window.cpp b/Libraries/LibGUI/Window.cpp
index c93e9d00e8..a0b5dc87c2 100644
--- a/Libraries/LibGUI/Window.cpp
+++ b/Libraries/LibGUI/Window.cpp
@@ -319,6 +319,16 @@ void Window::event(Core::Event& event)
if (event.type() > Event::__Begin_WM_Events && event.type() < Event::__End_WM_Events)
return wm_event(static_cast<WMEvent&>(event));
+ if (event.type() == Event::DragMove) {
+ if (!m_main_widget)
+ return;
+ auto& drag_event = static_cast<DragEvent&>(event);
+ auto result = m_main_widget->hit_test(drag_event.position());
+ auto local_event = make<DragEvent>(static_cast<Event::Type>(drag_event.type()), result.local_position, drag_event.data_type());
+ ASSERT(result.widget);
+ return result.widget->dispatch_event(*local_event, this);
+ }
+
Core::Object::event(event);
}
diff --git a/Libraries/LibGUI/WindowServerConnection.cpp b/Libraries/LibGUI/WindowServerConnection.cpp
index 3ea6a6a572..bfcc000f2e 100644
--- a/Libraries/LibGUI/WindowServerConnection.cpp
+++ b/Libraries/LibGUI/WindowServerConnection.cpp
@@ -24,8 +24,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <LibGfx/Palette.h>
-#include <LibGfx/SystemTheme.h>
#include <LibGUI/Action.h>
#include <LibGUI/Application.h>
#include <LibGUI/Clipboard.h>
@@ -36,6 +34,8 @@
#include <LibGUI/Widget.h>
#include <LibGUI/Window.h>
#include <LibGUI/WindowServerConnection.h>
+#include <LibGfx/Palette.h>
+#include <LibGfx/SystemTheme.h>
//#define GEVENTLOOP_DEBUG
@@ -217,8 +217,12 @@ void WindowServerConnection::handle(const Messages::WindowClient::MouseMove& mes
dbgprintf("WID=%d MouseMove %d,%d,%d\n", message.window_id(), message.mouse_position().x(), message.mouse_position().y(), message.wheel_delta();
#endif
- if (auto* window = Window::from_window_id(message.window_id()))
- Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseMove, message.mouse_position(), message.buttons(), to_gmousebutton(message.button()), message.modifiers(), message.wheel_delta()));
+ if (auto* window = Window::from_window_id(message.window_id())) {
+ if (message.is_drag())
+ Core::EventLoop::current().post_event(*window, make<DragEvent>(Event::DragMove, message.mouse_position(), message.drag_data_type()));
+ else
+ Core::EventLoop::current().post_event(*window, make<MouseEvent>(Event::MouseMove, message.mouse_position(), message.buttons(), to_gmousebutton(message.button()), message.modifiers(), message.wheel_delta()));
+ }
}
void WindowServerConnection::handle(const Messages::WindowClient::MouseDoubleClick& message)