mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-27 02:05:07 +02:00
Add ElementResizeAction to Page (maybe there's a better place). It's just a mousemove delegate that updates styles on the target element. Add ChromeMetrics for zoom-invariant chrome like scrollbar thumb thickness, resize gripper size, paddings, etc. It's not user-stylable but separates basic concerns in a way that a visually gifted designer unlike myself can adjust to taste. These values are pre-divided by zoom factor so that PaintableBox can continue using device_pixels_per_css_pixel calls as normal. The adjusted metrics are computed on demand from Page multiple times per paint cycle, which is not ideal but avoids lifetime management and atomics. Maybe someone with more surety about the painting flow control can improve this, but it won't be a huge win. If profiling shows this slowing paints, then Ladybird is in good shape. Update PaintableBox to draw the resize gripper and deconflict the scrollbars. Set apropriate cursors for scrollbars and gripper in mousemove. We override EventHandler's cursor handling because nothing should ever come between a man and his resize gripper. Chrome metrics use the CSSPixels class. This is good because it's broadly compatible but bad because they're actually different units when zoom is not 1.0. If that's a problem, we could make a new type or just use double.
101 lines
4.0 KiB
C++
101 lines
4.0 KiB
C++
/*
|
|
* Copyright (c) 2020, Andreas Kling <andreas@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Forward.h>
|
|
#include <AK/NonnullOwnPtr.h>
|
|
#include <AK/WeakPtr.h>
|
|
#include <LibGC/Ptr.h>
|
|
#include <LibGfx/Forward.h>
|
|
#include <LibJS/Heap/Cell.h>
|
|
#include <LibUnicode/Forward.h>
|
|
#include <LibWeb/CSS/ComputedValues.h>
|
|
#include <LibWeb/Export.h>
|
|
#include <LibWeb/Forward.h>
|
|
#include <LibWeb/Gamepad/SDLGamepadForward.h>
|
|
#include <LibWeb/Page/EventResult.h>
|
|
#include <LibWeb/Page/InputEvent.h>
|
|
#include <LibWeb/PixelUnits.h>
|
|
#include <LibWeb/UIEvents/KeyCode.h>
|
|
|
|
namespace Web {
|
|
|
|
class WEB_API EventHandler {
|
|
public:
|
|
explicit EventHandler(Badge<HTML::Navigable>, HTML::Navigable&);
|
|
~EventHandler();
|
|
|
|
EventResult handle_mouseup(CSSPixelPoint, CSSPixelPoint screen_position, unsigned button, unsigned buttons, unsigned modifiers);
|
|
EventResult handle_mousedown(CSSPixelPoint, CSSPixelPoint screen_position, unsigned button, unsigned buttons, unsigned modifiers);
|
|
EventResult handle_mousemove(CSSPixelPoint, CSSPixelPoint screen_position, unsigned buttons, unsigned modifiers);
|
|
EventResult handle_mouseleave();
|
|
EventResult handle_mousewheel(CSSPixelPoint, CSSPixelPoint screen_position, unsigned button, unsigned buttons, unsigned modifiers, int wheel_delta_x, int wheel_delta_y);
|
|
EventResult handle_doubleclick(CSSPixelPoint, CSSPixelPoint screen_position, unsigned button, unsigned buttons, unsigned modifiers);
|
|
|
|
EventResult handle_drag_and_drop_event(DragEvent::Type, CSSPixelPoint, CSSPixelPoint screen_position, unsigned button, unsigned buttons, unsigned modifiers, Vector<HTML::SelectedFile> files);
|
|
|
|
EventResult handle_pinch_event(CSSPixelPoint, double scale_delta);
|
|
|
|
EventResult handle_keydown(UIEvents::KeyCode, unsigned modifiers, u32 code_point, bool repeat);
|
|
EventResult handle_keyup(UIEvents::KeyCode, unsigned modifiers, u32 code_point, bool repeat);
|
|
|
|
void set_mouse_event_tracking_paintable(GC::Ptr<Painting::Paintable>);
|
|
void set_element_resize_in_progress(DOM::Element& element, CSSPixelPoint viewport_position);
|
|
|
|
EventResult handle_paste(Utf16String const& text);
|
|
|
|
void handle_sdl_input_events();
|
|
|
|
void visit_edges(JS::Cell::Visitor& visitor) const;
|
|
|
|
Unicode::Segmenter& word_segmenter();
|
|
|
|
private:
|
|
EventResult focus_next_element();
|
|
EventResult focus_previous_element();
|
|
|
|
EventResult fire_keyboard_event(FlyString const& event_name, HTML::Navigable&, UIEvents::KeyCode, unsigned modifiers, u32 code_point, bool repeat);
|
|
[[nodiscard]] EventResult input_event(FlyString const& event_name, FlyString const& input_type, HTML::Navigable&, Variant<u32, Utf16String> code_point_or_string);
|
|
CSSPixelPoint compute_mouse_event_client_offset(CSSPixelPoint event_page_position) const;
|
|
CSSPixelPoint compute_mouse_event_page_offset(CSSPixelPoint event_client_offset) const;
|
|
CSSPixelPoint compute_mouse_event_movement(CSSPixelPoint event_client_offset) const;
|
|
|
|
struct Target {
|
|
GC::Ptr<Painting::Paintable> paintable;
|
|
Optional<int> index_in_node;
|
|
Optional<CSS::CursorPredefined> cursor_override;
|
|
};
|
|
Optional<Target> target_for_mouse_position(CSSPixelPoint position);
|
|
|
|
GC::Ptr<Painting::PaintableBox> paint_root();
|
|
GC::Ptr<Painting::PaintableBox const> paint_root() const;
|
|
|
|
bool should_ignore_device_input_event() const;
|
|
|
|
void handle_gamepad_connected(SDL_JoystickID);
|
|
void handle_gamepad_updated(SDL_JoystickID);
|
|
void handle_gamepad_disconnected(SDL_JoystickID);
|
|
|
|
GC::Ref<HTML::Navigable> m_navigable;
|
|
|
|
bool m_in_mouse_selection { false };
|
|
InputEventsTarget* m_mouse_selection_target { nullptr };
|
|
|
|
GC::Ptr<Painting::Paintable> m_mouse_event_tracking_paintable;
|
|
|
|
NonnullOwnPtr<DragAndDropEventHandler> m_drag_and_drop_event_handler;
|
|
OwnPtr<ElementResizeAction> m_element_resize_in_progress;
|
|
|
|
GC::Weak<DOM::EventTarget> m_mousedown_target;
|
|
|
|
Optional<CSSPixelPoint> m_mousemove_previous_screen_position;
|
|
|
|
OwnPtr<Unicode::Segmenter> m_word_segmenter;
|
|
};
|
|
|
|
}
|