mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 19:05:08 +00:00
LibGUI+WindowServer: Start fleshing out drag&drop functionality
This patch enables basic drag&drop between applications. You initiate a drag by creating a GDragOperation object and calling exec() on it. This creates a nested event loop in the calling program that only returns once the drag operation has ended. On the receiving side, you get a call to GWidget::drop_event() with a GDropEvent containing information about the dropped data. The only data passed right now is a piece of text that's also used to visually indicate that a drag is happening (by showing the text in a little box that follows the mouse cursor around.) There are things to fix here, but we're off to a nice start. :^)
This commit is contained in:
parent
e09a02ad3f
commit
a7f414bba7
19 changed files with 318 additions and 3 deletions
|
@ -2,6 +2,7 @@
|
|||
#include <LibGUI/GApplication.h>
|
||||
#include <LibGUI/GClipboard.h>
|
||||
#include <LibGUI/GDesktop.h>
|
||||
#include <LibGUI/GDragOperation.h>
|
||||
#include <LibGUI/GEvent.h>
|
||||
#include <LibGUI/GMenu.h>
|
||||
#include <LibGUI/GWidget.h>
|
||||
|
@ -261,3 +262,19 @@ void GWindowServerConnection::handle(const WindowClient::AsyncSetWallpaperFinish
|
|||
{
|
||||
// This is handled manually by GDesktop::set_wallpaper().
|
||||
}
|
||||
|
||||
void GWindowServerConnection::handle(const WindowClient::DragDropped& message)
|
||||
{
|
||||
if (auto* window = GWindow::from_window_id(message.window_id()))
|
||||
CEventLoop::current().post_event(*window, make<GDropEvent>(message.mouse_position(), message.text()));
|
||||
}
|
||||
|
||||
void GWindowServerConnection::handle(const WindowClient::DragAccepted&)
|
||||
{
|
||||
GDragOperation::notify_accepted({});
|
||||
}
|
||||
|
||||
void GWindowServerConnection::handle(const WindowClient::DragCancelled&)
|
||||
{
|
||||
GDragOperation::notify_cancelled({});
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue