LibWeb+LibWebView+WebContent: Add a setting to control primary pasting

This commit is contained in:
Timothy Flynn 2026-05-15 07:20:23 -04:00 committed by Alexander Kalenik
parent 218d82cb65
commit af7b2b5e8a
7 changed files with 41 additions and 7 deletions

View file

@ -378,6 +378,16 @@
Scroll pages by pressing the middle mouse button and moving the mouse.
</p>
</div>
<hr />
<div class="card-group">
<div class="inline-container">
<label for="enable-primary-paste">Enable primary pasting</label>
<input id="enable-primary-paste" type="checkbox" switch />
</div>
<p class="description">
Paste text from the clipboard when the middle mouse button is clicked.
</p>
</div>
</div>
</div>
</div>

View file

@ -1,4 +1,5 @@
const enableAutoscroll = document.querySelector("#enable-autoscroll");
const enablePrimaryPaste = document.querySelector("#enable-primary-paste");
let BROWSING_BEHAVIOR = {};
@ -6,12 +7,18 @@ const loadSettings = settings => {
BROWSING_BEHAVIOR = settings.browsingBehavior || {};
enableAutoscroll.checked = !!BROWSING_BEHAVIOR.enableAutoscroll;
enablePrimaryPaste.checked = !!BROWSING_BEHAVIOR.enablePrimaryPaste;
};
enableAutoscroll.addEventListener("change", () => {
BROWSING_BEHAVIOR.enableAutoscroll = enableAutoscroll.checked;
ladybird.sendMessage("setBrowsingBehavior", BROWSING_BEHAVIOR);
});
function addChangeHandler(input, name) {
input.addEventListener("change", () => {
BROWSING_BEHAVIOR[name] = input.checked;
ladybird.sendMessage("setBrowsingBehavior", BROWSING_BEHAVIOR);
});
}
addChangeHandler(enableAutoscroll, "enableAutoscroll");
addChangeHandler(enablePrimaryPaste, "enablePrimaryPaste");
document.addEventListener("WebUIMessage", event => {
if (event.detail.name === "loadSettings") {

View file

@ -1501,6 +1501,10 @@ static bool is_middle_click_paste_target(DOM::Node const& node)
bool EventHandler::maybe_request_paste_for_middle_click(DOM::Document& document, CSSPixelPoint visual_viewport_position)
{
auto& page = m_navigable->page();
if (!page.enable_primary_paste())
return false;
auto cursor_hit = paint_root()->hit_test(visual_viewport_position, Painting::HitTestType::TextCursor);
if (!cursor_hit.has_value())
return false;
@ -1519,7 +1523,7 @@ bool EventHandler::maybe_request_paste_for_middle_click(DOM::Document& document,
return false;
target->set_selection_anchor(*hit_node, cursor_hit->index_in_node);
m_navigable->page().client().page_did_request_paste();
page.client().page_did_request_paste();
return true;
}

View file

@ -132,6 +132,9 @@ public:
bool enable_autoscroll() const { return m_enable_autoscroll; }
void set_enable_autoscroll(bool b) { m_enable_autoscroll = b; }
bool enable_primary_paste() const { return m_enable_primary_paste; }
void set_enable_primary_paste(bool b) { m_enable_primary_paste = b; }
bool async_scrolling_enabled() const { return m_async_scrolling_enabled; }
void set_async_scrolling_enabled(bool b) { m_async_scrolling_enabled = b; }
u64 wheel_event_listener_state_generation() const { return m_wheel_event_listener_state_generation; }
@ -295,6 +298,7 @@ private:
bool m_is_scripting_enabled { true };
bool m_should_block_pop_ups { true };
bool m_enable_autoscroll { true };
bool m_enable_primary_paste { true };
bool m_async_scrolling_enabled { false };
u64 m_wheel_event_listener_state_generation { 0 };

View file

@ -35,6 +35,7 @@ static auto DEFAULT_LANGUAGE = "en"_string;
static constexpr auto BROWSING_BEHAVIOR_KEY = "browsingBehavior"sv;
static constexpr auto ENABLE_AUTOSCROLL_KEY = "enableAutoscroll"sv;
static constexpr auto ENABLE_PRIMARY_PASTE_KEY = "enablePrimaryPaste"sv;
static constexpr auto SEARCH_ENGINE_KEY = "searchEngine"sv;
static constexpr auto SEARCH_ENGINE_CUSTOM_KEY = "custom"sv;
@ -182,6 +183,7 @@ JsonValue Settings::serialize_json() const
JsonObject browsing_behavior;
browsing_behavior.set(ENABLE_AUTOSCROLL_KEY, m_browsing_behavior.enable_autoscroll);
browsing_behavior.set(ENABLE_PRIMARY_PASTE_KEY, m_browsing_behavior.enable_primary_paste);
settings.set(BROWSING_BEHAVIOR_KEY, move(browsing_behavior));
JsonArray custom_search_engines;
@ -355,6 +357,8 @@ BrowsingBehavior Settings::parse_browsing_behavior(JsonValue const& settings)
if (auto enable_autoscroll = settings.as_object().get_bool(ENABLE_AUTOSCROLL_KEY); enable_autoscroll.has_value())
browsing_behavior.enable_autoscroll = *enable_autoscroll;
if (auto enable_primary_paste = settings.as_object().get_bool(ENABLE_PRIMARY_PASTE_KEY); enable_primary_paste.has_value())
browsing_behavior.enable_primary_paste = *enable_primary_paste;
return browsing_behavior;
}
@ -609,6 +613,7 @@ template<>
ErrorOr<void> encode(Encoder& encoder, WebView::BrowsingBehavior const& browsing_behavior)
{
TRY(encoder.encode(browsing_behavior.enable_autoscroll));
TRY(encoder.encode(browsing_behavior.enable_primary_paste));
return {};
}
@ -617,8 +622,9 @@ template<>
ErrorOr<WebView::BrowsingBehavior> decode(Decoder& decoder)
{
auto enable_autoscroll = TRY(decoder.decode<bool>());
auto enable_primary_paste = TRY(decoder.decode<bool>());
return WebView::BrowsingBehavior { enable_autoscroll };
return WebView::BrowsingBehavior { enable_autoscroll, enable_primary_paste };
}
}

View file

@ -23,6 +23,7 @@ namespace WebView {
struct BrowsingBehavior {
bool enable_autoscroll { true };
bool enable_primary_paste { true };
};
struct SiteSetting {

View file

@ -1283,8 +1283,10 @@ void ConnectionFromClient::set_preferred_languages(u64, Vector<String> preferred
void ConnectionFromClient::set_browsing_behavior(u64 page_id, WebView::BrowsingBehavior browsing_behavior)
{
if (auto page = this->page(page_id); page.has_value())
if (auto page = this->page(page_id); page.has_value()) {
page->page().set_enable_autoscroll(browsing_behavior.enable_autoscroll);
page->page().set_enable_primary_paste(browsing_behavior.enable_primary_paste);
}
}
void ConnectionFromClient::set_enable_global_privacy_control(u64, bool enable)