summaryrefslogtreecommitdiff
path: root/applications/goldman/source/input.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'applications/goldman/source/input.cpp')
-rw-r--r--applications/goldman/source/input.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/applications/goldman/source/input.cpp b/applications/goldman/source/input.cpp
index 0cd6922..c71068c 100644
--- a/applications/goldman/source/input.cpp
+++ b/applications/goldman/source/input.cpp
@@ -5,15 +5,51 @@
euler::syscall::set_thread_name("input thread");
+ window *window_being_moved = 0;
+ bool was_mouse_down_before = false;
+
while (true) {
auto result = euler::syscall::get_input_packet();
if (std::holds_alternative<euler::syscall::mouse_packet>(result)) {
auto packet = std::get<euler::syscall::mouse_packet>(result);
+
r->lock();
+
+ int old_x, old_y;
+ r->get_cursor(old_x, old_y);
r->bump_cursor(packet.x_changed, packet.y_changed);
+ int new_x, new_y;
+ r->get_cursor(new_x, new_y);
+
+ if (window_being_moved != 0) {
+ if (r->windows.size() == 0 || r->windows.back() != window_being_moved)
+ window_being_moved = 0;
+ else {
+ r->windows.back()->x += new_x - old_x;
+ r->windows.back()->y += new_y - old_y;
+ if (!packet.left_button_down)
+ window_being_moved = 0;
+ }
+ }
+
+ else if (packet.left_button_down && !was_mouse_down_before)
+ for (auto it = r->windows.rbegin(); it != r->windows.rend(); ++it)
+ if (new_x >= (*it)->x && new_y >= (*it)->y &&
+ new_x < (*it)->x + (*it)->contents_with_decorations. width &&
+ new_y < (*it)->y + (*it)->contents_with_decorations.height) {
+ r->move_window_to_front(--it.base());
+ //it is now invalidated, but our window is now r->windows.back()
+ if (new_y < r->windows.back()->y + window::title_height)
+ window_being_moved = r->windows.back();
+ break;
+ }
+
r->unlock();
r->dispatch_render();
+
+ was_mouse_down_before = packet.left_button_down;
+
}
}