Serenity Operating System
at master 110 lines 5.1 kB view raw
1/* 2 * Copyright (c) 2021-2022, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include "MouseWidget.h" 8 9#include <Applications/MouseSettings/MouseWidgetGML.h> 10#include <LibGUI/ConnectionToWindowServer.h> 11#include <LibGUI/Label.h> 12#include <LibGUI/Slider.h> 13#include <LibGUI/SpinBox.h> 14#include <WindowServer/Screen.h> 15#include <WindowServer/WindowManager.h> 16 17constexpr double speed_slider_scale = 100.0; 18constexpr int default_scroll_length = 4; 19constexpr int double_click_speed_default = 250; 20 21MouseWidget::MouseWidget() 22{ 23 load_from_gml(mouse_widget_gml).release_value_but_fixme_should_propagate_errors(); 24 25 m_speed_label = *find_descendant_of_type_named<GUI::Label>("speed_label"); 26 m_speed_slider = *find_descendant_of_type_named<GUI::HorizontalSlider>("speed_slider"); 27 m_speed_slider->set_range(WindowServer::mouse_accel_min * speed_slider_scale, WindowServer::mouse_accel_max * speed_slider_scale); 28 int const slider_value = float { speed_slider_scale } * GUI::ConnectionToWindowServer::the().get_mouse_acceleration(); 29 m_speed_slider->set_value(slider_value, GUI::AllowCallback::No); 30 m_speed_slider->on_change = [&](int) { 31 update_speed_label(); 32 set_modified(true); 33 }; 34 35 m_scroll_length_spinbox = *find_descendant_of_type_named<GUI::SpinBox>("scroll_length_spinbox"); 36 m_scroll_length_spinbox->set_min(WindowServer::scroll_step_size_min); 37 m_scroll_length_spinbox->set_value(GUI::ConnectionToWindowServer::the().get_scroll_step_size(), GUI::AllowCallback::No); 38 m_scroll_length_spinbox->on_change = [&](auto) { 39 set_modified(true); 40 }; 41 42 m_double_click_arrow_widget = *find_descendant_of_type_named<MouseSettings::DoubleClickArrowWidget>("double_click_arrow_widget"); 43 m_double_click_speed_label = *find_descendant_of_type_named<GUI::Label>("double_click_speed_label"); 44 m_double_click_speed_slider = *find_descendant_of_type_named<GUI::HorizontalSlider>("double_click_speed_slider"); 45 m_double_click_speed_slider->set_min(WindowServer::double_click_speed_min); 46 m_double_click_speed_slider->set_max(WindowServer::double_click_speed_max); 47 m_double_click_speed_slider->set_value(GUI::ConnectionToWindowServer::the().get_double_click_speed(), GUI::AllowCallback::No); 48 m_double_click_speed_slider->on_change = [&](int speed) { 49 m_double_click_arrow_widget->set_double_click_speed(speed); 50 update_double_click_speed_label(); 51 set_modified(true); 52 }; 53 54 m_switch_buttons_image_label = *find_descendant_of_type_named<GUI::Label>("switch_buttons_image_label"); 55 m_switch_buttons_checkbox = *find_descendant_of_type_named<GUI::CheckBox>("switch_buttons_checkbox"); 56 m_switch_buttons_checkbox->set_checked(GUI::ConnectionToWindowServer::the().are_mouse_buttons_switched(), GUI::AllowCallback::No); 57 m_switch_buttons_checkbox->on_checked = [&](auto) { 58 update_switch_buttons_image_label(); 59 set_modified(true); 60 }; 61 62 m_natural_scroll_checkbox = *find_descendant_of_type_named<GUI::CheckBox>("natural_scroll_checkbox"); 63 m_natural_scroll_checkbox->set_checked(GUI::ConnectionToWindowServer::the().is_natural_scroll(), GUI::AllowCallback::No); 64 m_natural_scroll_checkbox->on_checked = [&](auto) { 65 set_modified(true); 66 }; 67 68 update_speed_label(); 69 update_double_click_speed_label(); 70 update_switch_buttons_image_label(); 71 m_double_click_arrow_widget->set_double_click_speed(m_double_click_speed_slider->value()); 72} 73 74void MouseWidget::apply_settings() 75{ 76 float const factor = m_speed_slider->value() / speed_slider_scale; 77 GUI::ConnectionToWindowServer::the().async_set_mouse_acceleration(factor); 78 GUI::ConnectionToWindowServer::the().async_set_scroll_step_size(m_scroll_length_spinbox->value()); 79 GUI::ConnectionToWindowServer::the().async_set_double_click_speed(m_double_click_speed_slider->value()); 80 GUI::ConnectionToWindowServer::the().async_set_mouse_buttons_switched(m_switch_buttons_checkbox->is_checked()); 81 GUI::ConnectionToWindowServer::the().async_set_natural_scroll(m_natural_scroll_checkbox->is_checked()); 82} 83 84void MouseWidget::reset_default_values() 85{ 86 m_speed_slider->set_value(speed_slider_scale); 87 m_scroll_length_spinbox->set_value(default_scroll_length); 88 m_double_click_speed_slider->set_value(double_click_speed_default); 89 m_switch_buttons_checkbox->set_checked(false); 90 m_natural_scroll_checkbox->set_checked(false); 91} 92 93void MouseWidget::update_speed_label() 94{ 95 m_speed_label->set_text(DeprecatedString::formatted("{} %", m_speed_slider->value())); 96} 97 98void MouseWidget::update_double_click_speed_label() 99{ 100 m_double_click_speed_label->set_text(DeprecatedString::formatted("{} ms", m_double_click_speed_slider->value())); 101} 102 103void MouseWidget::update_switch_buttons_image_label() 104{ 105 if (m_switch_buttons_checkbox->is_checked()) { 106 m_switch_buttons_image_label->set_icon_from_path("/res/graphics/mouse-button-right.png"); 107 } else { 108 m_switch_buttons_image_label->set_icon_from_path("/res/graphics/mouse-button-left.png"); 109 } 110}