mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:57:43 +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
|
@ -93,6 +93,7 @@ void WSCompositor::compose()
|
|||
|
||||
dirty_rects.add(Rect::intersection(m_last_geometry_label_rect, WSScreen::the().rect()));
|
||||
dirty_rects.add(Rect::intersection(m_last_cursor_rect, WSScreen::the().rect()));
|
||||
dirty_rects.add(Rect::intersection(m_last_dnd_rect, WSScreen::the().rect()));
|
||||
dirty_rects.add(Rect::intersection(current_cursor_rect(), WSScreen::the().rect()));
|
||||
#ifdef DEBUG_COUNTERS
|
||||
dbgprintf("[WM] compose #%u (%u rects)\n", ++m_compose_count, dirty_rects.rects().size());
|
||||
|
@ -387,6 +388,9 @@ Rect WSCompositor::current_cursor_rect() const
|
|||
|
||||
void WSCompositor::invalidate_cursor()
|
||||
{
|
||||
auto& wm = WSWindowManager::the();
|
||||
if (wm.dnd_client())
|
||||
invalidate(wm.dnd_rect());
|
||||
invalidate(current_cursor_rect());
|
||||
}
|
||||
|
||||
|
@ -417,5 +421,17 @@ void WSCompositor::draw_cursor()
|
|||
auto& wm = WSWindowManager::the();
|
||||
Rect cursor_rect = current_cursor_rect();
|
||||
m_back_painter->blit(cursor_rect.location(), wm.active_cursor().bitmap(), wm.active_cursor().rect());
|
||||
|
||||
if (wm.dnd_client()) {
|
||||
auto dnd_rect = wm.dnd_rect();
|
||||
if (!wm.dnd_text().is_empty()) {
|
||||
m_back_painter->fill_rect(dnd_rect, Color(110, 34, 9, 200));
|
||||
m_back_painter->draw_text(dnd_rect, wm.dnd_text(), TextAlignment::Center, Color::White);
|
||||
}
|
||||
// FIXME: Also do the drag_bitmap if present
|
||||
m_last_dnd_rect = dnd_rect;
|
||||
} else {
|
||||
m_last_dnd_rect = {};
|
||||
}
|
||||
m_last_cursor_rect = cursor_rect;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue