mouse: Port to GTK4

This one is an interesting case. It was easier to simply switch
to AdwPreferencesPage than actually port all the GtkFrames in
there.

In addition to that, the mouse test page now uses a GtkPicture
instead of a GtkImage, and the GtkDrawingArea API changes are
reflected in the code.
This commit is contained in:
Georges Basile Stavracas Neto 2021-10-21 15:59:55 -03:00
parent 2d762680d2
commit 25edfb4a4b
9 changed files with 282 additions and 435 deletions

View file

@ -14,7 +14,7 @@ panels = [
'location',
'lock',
'microphone',
# 'mouse',
'mouse',
'multitasking',
'notifications',
# 'online-accounts',

View file

@ -18,7 +18,7 @@
* Author: Felipe Borges <feborges@redhat.com>
*/
#include <gdk/gdkx.h>
#include <gdk/x11/gdkx.h>
#include <X11/Xatom.h>
#include <X11/extensions/XInput2.h>
@ -51,8 +51,8 @@ touchpad_check_capabilities_x11 (gboolean *have_two_finger_scrolling,
gdk_x11_display_error_trap_push (gdisplay);
devicelist = gdk_seat_get_slaves (gdk_display_get_default_seat (gdk_display_get_default ()),
GDK_SEAT_CAPABILITY_ALL_POINTING);
devicelist = gdk_seat_get_devices (gdk_display_get_default_seat (gdk_display_get_default ()),
GDK_SEAT_CAPABILITY_ALL_POINTING);
for (l = devicelist; l != NULL; l = l->next) {
GdkDevice *device = l->data;
if (gdk_device_get_source (device) != GDK_SOURCE_TOUCHPAD)
@ -126,8 +126,8 @@ cc_synaptics_check (void)
gdk_x11_display_error_trap_push (gdisplay);
devicelist = gdk_seat_get_slaves (gdk_display_get_default_seat (gdk_display_get_default ()),
GDK_SEAT_CAPABILITY_ALL_POINTING);
devicelist = gdk_seat_get_devices (gdk_display_get_default_seat (gdk_display_get_default ()),
GDK_SEAT_CAPABILITY_ALL_POINTING);
for (l = devicelist; l != NULL; l = l->next) {
GdkDevice *device = l->data;

View file

@ -30,7 +30,6 @@
#include "cc-mouse-test.h"
#include "gsd-device-manager.h"
#include "gsd-input-helper.h"
#include "list-box-helper.h"
struct _CcMousePanel
{
@ -39,20 +38,20 @@ struct _CcMousePanel
GtkListBoxRow *edge_scrolling_row;
GtkSwitch *edge_scrolling_switch;
GtkListBox *general_listbox;
GtkFrame *mouse_frame;
AdwPreferencesGroup *mouse_group;
GtkListBox *mouse_listbox;
GtkSwitch *mouse_natural_scrolling_switch;
GtkScale *mouse_speed_scale;
CcMouseTest *mouse_test;
GtkBox *primary_button_box;
GtkRadioButton *primary_button_left;
GtkRadioButton *primary_button_right;
GtkScrolledWindow *scrolled_window;
GtkToggleButton *primary_button_left;
GtkToggleButton *primary_button_right;
AdwPreferencesPage*preferences;
GtkStack *stack;
GtkListBoxRow *tap_to_click_row;
GtkSwitch *tap_to_click_switch;
GtkButton *test_button;
GtkFrame *touchpad_frame;
AdwPreferencesGroup *touchpad_group;
GtkListBox *touchpad_listbox;
GtkListBoxRow *touchpad_natural_scrolling_row;
GtkSwitch *touchpad_natural_scrolling_switch;
@ -87,13 +86,13 @@ setup_touchpad_options (CcMousePanel *self)
gboolean have_tap_to_click;
if (self->have_synaptics || !self->have_touchpad) {
gtk_widget_hide (GTK_WIDGET (self->touchpad_frame));
gtk_widget_hide (GTK_WIDGET (self->touchpad_group));
return;
}
cc_touchpad_check_capabilities (&have_two_finger_scrolling, &have_edge_scrolling, &have_tap_to_click);
gtk_widget_show (GTK_WIDGET (self->touchpad_frame));
gtk_widget_show (GTK_WIDGET (self->touchpad_group));
gtk_widget_set_visible (GTK_WIDGET (self->two_finger_scrolling_row), have_two_finger_scrolling);
gtk_widget_set_visible (GTK_WIDGET (self->edge_scrolling_row), have_edge_scrolling);
@ -189,22 +188,29 @@ touchpad_enabled_set_mapping (const GValue *value,
}
static void
handle_secondary_button (CcMousePanel *self,
GtkRadioButton *button,
GtkGesture *gesture)
pressed_cb (GtkButton *button)
{
g_signal_emit_by_name (button, "activate");
}
static void
handle_secondary_button (CcMousePanel *self,
GtkToggleButton *button,
GtkGesture *gesture)
{
gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (gesture), FALSE);
gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (gesture), TRUE);
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
g_signal_connect_swapped (gesture, "pressed", G_CALLBACK (gtk_button_clicked), button);
g_signal_connect_swapped (gesture, "pressed", G_CALLBACK (pressed_cb), button);
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture), GTK_PHASE_BUBBLE);
gtk_widget_add_controller (GTK_WIDGET (button), GTK_EVENT_CONTROLLER (gesture));
}
/* Set up the property editors in the dialog. */
static void
setup_dialog (CcMousePanel *self)
{
GtkRadioButton *button;
GtkToggleButton *button;
gtk_widget_set_direction (GTK_WIDGET (self->primary_button_box), GTK_TEXT_DIR_LTR);
@ -221,10 +227,10 @@ setup_dialog (CcMousePanel *self)
/* Allow changing orientation with either button */
button = self->primary_button_right;
self->right_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (button));
self->right_gesture = gtk_gesture_click_new ();
handle_secondary_button (self, button, self->right_gesture);
button = self->primary_button_left;
self->left_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (button));
self->left_gesture = gtk_gesture_click_new ();
handle_secondary_button (self, button, self->left_gesture);
g_settings_bind (self->mouse_settings, "natural-scroll",
@ -232,7 +238,7 @@ setup_dialog (CcMousePanel *self)
G_SETTINGS_BIND_DEFAULT);
/* Mouse section */
gtk_widget_set_visible (GTK_WIDGET (self->mouse_frame), self->have_mouse);
gtk_widget_set_visible (GTK_WIDGET (self->mouse_group), self->have_mouse);
g_settings_bind (self->mouse_settings, "speed",
gtk_range_get_adjustment (GTK_RANGE (self->mouse_speed_scale)), "value",
@ -310,27 +316,10 @@ device_changed (CcMousePanel *self)
setup_touchpad_options (self);
self->have_mouse = mouse_is_present ();
gtk_widget_set_visible (GTK_WIDGET (self->mouse_frame), self->have_mouse);
gtk_widget_set_visible (GTK_WIDGET (self->mouse_group), self->have_mouse);
gtk_widget_set_visible (GTK_WIDGET (self->touchpad_toggle_switch), show_touchpad_enabling_switch (self));
}
static void
on_content_size_changed (CcMousePanel *self,
GtkAllocation *allocation)
{
if (allocation->height < 490)
{
gtk_scrolled_window_set_policy (self->scrolled_window,
GTK_POLICY_NEVER, GTK_POLICY_NEVER);
}
else
{
gtk_scrolled_window_set_policy (self->scrolled_window,
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_min_content_height (self->scrolled_window, 490);
}
}
static void
cc_mouse_panel_dispose (GObject *object)
{
@ -338,8 +327,6 @@ cc_mouse_panel_dispose (GObject *object)
g_clear_object (&self->mouse_settings);
g_clear_object (&self->touchpad_settings);
g_clear_object (&self->right_gesture);
g_clear_object (&self->left_gesture);
G_OBJECT_CLASS (cc_mouse_panel_parent_class)->dispose (object);
}
@ -356,7 +343,7 @@ test_button_toggled_cb (CcMousePanel *self)
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->test_button)))
gtk_stack_set_visible_child (self->stack, GTK_WIDGET (self->mouse_test));
else
gtk_stack_set_visible_child (self->stack, GTK_WIDGET (self->scrolled_window));
gtk_stack_set_visible_child (self->stack, GTK_WIDGET (self->preferences));
}
static void
@ -418,7 +405,7 @@ cc_mouse_panel_class_init (CcMousePanelClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, edge_scrolling_row);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, edge_scrolling_switch);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, general_listbox);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, mouse_frame);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, mouse_group);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, mouse_listbox);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, mouse_natural_scrolling_switch);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, mouse_speed_scale);
@ -426,12 +413,12 @@ cc_mouse_panel_class_init (CcMousePanelClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, primary_button_box);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, primary_button_left);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, primary_button_right);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, scrolled_window);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, preferences);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, stack);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, tap_to_click_row);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, tap_to_click_switch);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, test_button);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_frame);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_group);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_listbox);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_natural_scrolling_row);
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_natural_scrolling_switch);
@ -442,7 +429,6 @@ cc_mouse_panel_class_init (CcMousePanelClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcMousePanel, two_finger_scrolling_switch);
gtk_widget_class_bind_template_callback (widget_class, edge_scrolling_changed_event);
gtk_widget_class_bind_template_callback (widget_class, on_content_size_changed);
gtk_widget_class_bind_template_callback (widget_class, test_button_toggled_cb);
gtk_widget_class_bind_template_callback (widget_class, two_finger_scrolling_changed_event);
}

View file

@ -2,334 +2,220 @@
<interface>
<!-- interface-requires gtk+ 3.0 -->
<template class="CcMousePanel" parent="CcPanel">
<property name="visible">True</property>
<child>
<object class="GtkStack" id="stack">
<property name="visible">True</property>
<child>
<object class="GtkScrolledWindow" id="scrolled_window">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<property name="hscrollbar_policy">never</property>
<signal name="size-allocate" handler="on_content_size_changed" object="CcMousePanel" swapped="yes"/>
<object class="AdwPreferencesPage" id="preferences">
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="margin_top">32</property>
<property name="margin_bottom">32</property>
<property name="orientation">vertical</property>
<object class="AdwPreferencesGroup">
<property name="title" translatable="yes">General</property>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">in</property>
<property name="margin_bottom">32</property>
<property name="label_yalign">0.45</property>
<property name="shadow_type">none</property>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">General</property>
<property name="margin_bottom">12</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<object class="GtkListBox" id="general_listbox">
<property name="selection_mode">none</property>
<style>
<class name="content"/>
</style>
<child>
<object class="GtkListBox" id="general_listbox">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="selection_mode">none</property>
<style>
<class name="content"/>
</style>
<object class="AdwActionRow" id="primary_button_row">
<property name="activatable">false</property>
<property name="title" translatable="yes">Primary Button</property>
<property name="subtitle" translatable="yes">Sets the order of physical buttons on mice and touchpads.</property>
<property name="subtitle-lines">0</property>
<child>
<object class="HdyActionRow" id="primary_button_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Primary Button</property>
<property name="subtitle" translatable="yes">Sets the order of physical buttons on mice and touchpads.</property>
<property name="subtitle-lines">0</property>
<object class="GtkGrid">
<property name="row_spacing">2</property>
<property name="column_spacing">16</property>
<property name="margin_start">20</property>
<property name="margin_end">20</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="row_spacing">2</property>
<property name="column_spacing">16</property>
<property name="margin_start">20</property>
<property name="margin_end">20</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
<object class="GtkBox" id="primary_button_box">
<property name="valign">center</property>
<property name="homogeneous">True</property>
<style>
<class name="linked"/>
</style>
<child>
<object class="GtkBox" id="primary_button_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="homogeneous">True</property>
<style>
<class name="linked"/>
</style>
<child>
<object class="GtkRadioButton" id="primary_button_left">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Left</property>
<property name="draw-indicator">False</property>
<property name="height_request">35</property>
</object>
</child>
<child>
<object class="GtkRadioButton" id="primary_button_right">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Right</property>
<property name="draw-indicator">False</property>
<property name="group">primary_button_left</property>
<property name="height_request">35</property>
</object>
</child>
<object class="GtkToggleButton" id="primary_button_left">
<property name="hexpand">True</property>
<property name="label" translatable="yes">Left</property>
<property name="height_request">35</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFrame" id="mouse_frame">
<property name="visible">False</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<property name="label_yalign">0.45</property>
<property name="margin_bottom">32</property>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Mouse</property>
<property name="margin_bottom">12</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<child>
<object class="GtkListBox" id="mouse_listbox">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="selection_mode">none</property>
<style>
<class name="content"/>
</style>
<child>
<object class="HdyActionRow" id="mouse_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Mouse Speed</property>
<child>
<object class="GtkScale" id="mouse_speed_scale">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">mouse_speed_adjustment</property>
<property name="draw_value">False</property>
<property name="width-request">300</property>
<property name="halign">end</property>
<property name="expand">True</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-description" translatable="yes">Double-click timeout</property>
<child>
<object class="GtkToggleButton" id="primary_button_right">
<property name="hexpand">True</property>
<property name="label" translatable="yes">Right</property>
<property name="group">primary_button_left</property>
<property name="height_request">35</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="HdyActionRow" id="mouse_natural_scrolling_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes" comments="Translators: This switch reverses the scrolling direction for mices. The term used comes from OS X so use the same translation if possible.">Natural Scrolling</property>
<property name="subtitle" translatable="yes">Scrolling moves the content, not the view.</property>
<child>
<object class="GtkSwitch" id="mouse_natural_scrolling_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFrame" id="touchpad_frame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<property name="label_yalign">0.45</property>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Touchpad</property>
<property name="margin_bottom">12</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<child>
<object class="GtkListBox" id="touchpad_listbox">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="selection_mode">none</property>
<style>
<class name="content"/>
</style>
<child>
<object class="HdyActionRow" id="touchpad_toggle_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Touchpad</property>
<child>
<object class="GtkSwitch" id="touchpad_toggle_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</object>
</child>
</object>
</child>
<child>
<object class="HdyActionRow" id="touchpad_natural_scrolling_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes" comments="Translators: This switch reverses the scrolling direction for touchpads. The term used comes from OS X so use the same translation if possible. ">Natural Scrolling</property>
<property name="subtitle" translatable="yes">Scrolling moves the content, not the view.</property>
<child>
<object class="GtkSwitch" id="touchpad_natural_scrolling_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
<child>
<object class="HdyActionRow" id="touchpad_speed_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Touchpad Speed</property>
<child>
<object class="GtkScale" id="touchpad_speed_scale">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">touchpad_speed_adjustment</property>
<property name="draw_value">False</property>
<property name="expand">True</property>
<property name="halign">end</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-description" translatable="yes">Double-click timeout</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="HdyActionRow" id="tap_to_click_row">
<property name="visible">False</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Tap to Click</property>
<child>
<object class="GtkSwitch" id="tap_to_click_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
<child>
<object class="HdyActionRow" id="two_finger_scrolling_row">
<property name="visible">False</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Two-finger Scrolling</property>
<child>
<object class="GtkSwitch" id="two_finger_scrolling_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
<signal name="state-set" handler="two_finger_scrolling_changed_event" object="CcMousePanel" swapped="yes"/>
</object>
</child>
</object>
</child>
<child>
<object class="HdyActionRow" id="edge_scrolling_row">
<property name="visible">False</property>
<property name="can_focus">True</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Edge Scrolling</property>
<child>
<object class="GtkSwitch" id="edge_scrolling_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
<signal name="state-set" handler="edge_scrolling_changed_event" object="CcMousePanel" swapped="yes"/>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="mouse_group">
<property name="title" translatable="yes">Mouse</property>
<child>
<object class="GtkListBox" id="mouse_listbox">
<property name="selection_mode">none</property>
<style>
<class name="content"/>
</style>
<child>
<object class="AdwActionRow" id="mouse_row">
<property name="activatable">false</property>
<property name="title" translatable="yes">Mouse Speed</property>
<child>
<object class="GtkScale" id="mouse_speed_scale">
<property name="adjustment">mouse_speed_adjustment</property>
<property name="draw_value">False</property>
<property name="width-request">300</property>
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<accessibility>
<property name="label">Mouse speed</property>
</accessibility>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow" id="mouse_natural_scrolling_row">
<property name="activatable">false</property>
<property name="title" translatable="yes" comments="Translators: This switch reverses the scrolling direction for mices. The term used comes from OS X so use the same translation if possible.">Natural Scrolling</property>
<property name="subtitle" translatable="yes">Scrolling moves the content, not the view.</property>
<child>
<object class="GtkSwitch" id="mouse_natural_scrolling_switch">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup" id="touchpad_group">
<property name="title" translatable="yes">Touchpad</property>
<child>
<object class="GtkListBox" id="touchpad_listbox">
<property name="selection_mode">none</property>
<style>
<class name="content"/>
</style>
<child>
<object class="AdwActionRow" id="touchpad_toggle_row">
<property name="activatable">false</property>
<property name="title" translatable="yes">Touchpad</property>
<child>
<object class="GtkSwitch" id="touchpad_toggle_switch">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow" id="touchpad_natural_scrolling_row">
<property name="activatable">false</property>
<property name="title" translatable="yes" comments="Translators: This switch reverses the scrolling direction for touchpads. The term used comes from OS X so use the same translation if possible. ">Natural Scrolling</property>
<property name="subtitle" translatable="yes">Scrolling moves the content, not the view.</property>
<child>
<object class="GtkSwitch" id="touchpad_natural_scrolling_switch">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow" id="touchpad_speed_row">
<property name="activatable">false</property>
<property name="title" translatable="yes">Touchpad Speed</property>
<child>
<object class="GtkScale" id="touchpad_speed_scale">
<property name="adjustment">touchpad_speed_adjustment</property>
<property name="draw_value">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="halign">end</property>
<accessibility>
<property name="label">Double-click timeout</property>
</accessibility>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow" id="tap_to_click_row">
<property name="visible">False</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Tap to Click</property>
<child>
<object class="GtkSwitch" id="tap_to_click_switch">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow" id="two_finger_scrolling_row">
<property name="visible">False</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Two-finger Scrolling</property>
<child>
<object class="GtkSwitch" id="two_finger_scrolling_switch">
<property name="halign">end</property>
<property name="valign">center</property>
<signal name="state-set" handler="two_finger_scrolling_changed_event" object="CcMousePanel" swapped="yes"/>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow" id="edge_scrolling_row">
<property name="visible">False</property>
<property name="activatable">false</property>
<property name="title" translatable="yes">Edge Scrolling</property>
<child>
<object class="GtkSwitch" id="edge_scrolling_switch">
<property name="halign">end</property>
<property name="valign">center</property>
<signal name="state-set" handler="edge_scrolling_changed_event" object="CcMousePanel" swapped="yes"/>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="CcMouseTest" id="mouse_test">
<property name="visible">True</property>
</object>
</child>
</object>
</child>
</template>
<object class="GtkToggleButton" id="test_button">
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="valign">center</property>
<property name="label" translatable="yes">Test Your _Settings</property>

View file

@ -23,7 +23,7 @@
#include <glib/gi18n.h>
#include <string.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gdk/x11/gdkx.h>
#include <math.h>
#include "cc-mouse-test.h"
@ -54,7 +54,7 @@ enum
struct _CcMouseTest
{
GtkBin parent_instance;
AdwBin parent_instance;
GtkWidget *button_drawing_area;
GtkWidget *information_label;
@ -73,7 +73,7 @@ struct _CcMouseTest
gint scroll_image_timeout_id;
};
G_DEFINE_TYPE (CcMouseTest, cc_mouse_test, GTK_TYPE_BIN);
G_DEFINE_TYPE (CcMouseTest, cc_mouse_test, ADW_TYPE_BIN);
/* Timeout for the double click test */
@ -171,7 +171,7 @@ setup_scroll_image (CcMouseTest *self)
resource = "/org/gnome/control-center/mouse/scroll-test-gegl.svg";
else
resource = "/org/gnome/control-center/mouse/scroll-test.svg";
gtk_image_set_from_resource (GTK_IMAGE (self->image), resource);
gtk_picture_set_resource (GTK_PICTURE (self->image), resource);
if (self->double_click_state != DOUBLE_CLICK_TEST_GEGL)
return;
@ -181,13 +181,21 @@ setup_scroll_image (CcMouseTest *self)
/* Callback issued when the user clicks the double click testing area. */
static gboolean
button_drawing_area_button_press_event (CcMouseTest *self, GdkEventButton *event)
static void
button_drawing_area_button_pressed_cb (GtkGestureClick *click_gesture,
gint n_press,
gdouble x,
gdouble y,
CcMouseTest *self)
{
guint32 event_time;
guint current_button;
gint double_click_time;
if (event->type != GDK_BUTTON_PRESS || event->button > 3)
return FALSE;
current_button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (click_gesture));
if (current_button > 3)
return;
double_click_time = g_settings_get_int (self->mouse_settings, "double-click");
@ -197,9 +205,10 @@ button_drawing_area_button_press_event (CcMouseTest *self, GdkEventButton *event
}
/* Ignore fake double click using different buttons. */
if (self->double_click_state != DOUBLE_CLICK_TEST_OFF && self->button_state != event->button)
if (self->double_click_state != DOUBLE_CLICK_TEST_OFF && self->button_state != current_button)
self->double_click_state = DOUBLE_CLICK_TEST_OFF;
event_time = gtk_event_controller_get_current_event_time (GTK_EVENT_CONTROLLER (click_gesture));
switch (self->double_click_state) {
case DOUBLE_CLICK_TEST_OFF:
self->double_click_state = DOUBLE_CLICK_TEST_MAYBE;
@ -209,7 +218,7 @@ button_drawing_area_button_press_event (CcMouseTest *self, GdkEventButton *event
case DOUBLE_CLICK_TEST_ON:
case DOUBLE_CLICK_TEST_STILL_ON:
case DOUBLE_CLICK_TEST_ALMOST_THERE:
if (event->time - self->double_click_timestamp < double_click_time) {
if (event_time - self->double_click_timestamp < double_click_time) {
self->double_click_state++;
self->button_drawing_area_timeout_id = g_timeout_add (2500, (GSourceFunc) test_maybe_timeout, self);
} else {
@ -221,28 +230,30 @@ button_drawing_area_button_press_event (CcMouseTest *self, GdkEventButton *event
break;
}
self->double_click_timestamp = event->time;
self->double_click_timestamp = event_time;
gtk_widget_queue_draw (self->button_drawing_area);
self->button_state = event->button;
self->button_state = current_button;
setup_information_label (self);
setup_scroll_image (self);
return TRUE;
}
static gboolean
button_drawing_area_draw_event (CcMouseTest *self,
cairo_t *cr)
static void
button_drawing_area_draw_func (GtkDrawingArea *drawing_area,
cairo_t *cr,
int width,
int height,
gpointer user_data)
{
CcMouseTest *self = CC_MOUSE_TEST (user_data);
gdouble center_x, center_y, size;
GdkRGBA inner_color, outer_color;
cairo_pattern_t *pattern;
size = MAX (MIN (gtk_widget_get_allocated_width (self->button_drawing_area), gtk_widget_get_allocated_height (self->button_drawing_area)), 1);
center_x = gtk_widget_get_allocated_width (self->button_drawing_area) / 2.0;
center_y = gtk_widget_get_allocated_height (self->button_drawing_area) / 2.0;
size = MAX (MIN (width, height), 1);
center_x = width / 2.0;
center_y = height / 2.0;
switch (self->double_click_state) {
case DOUBLE_CLICK_TEST_ON:
@ -285,8 +296,6 @@ button_drawing_area_draw_event (CcMouseTest *self,
0, 2 * G_PI);
gdk_cairo_set_source_rgba (cr, &inner_color);
cairo_fill (cr);
return FALSE;
}
static void
@ -300,13 +309,10 @@ setup_dialog (CcMouseTest *self)
gtk_adjustment_get_upper (adjustment));
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider), "* {background: #26a269}", -1, NULL);
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider), "* {background: #26a269;}", -1);
gtk_style_context_add_provider (gtk_widget_get_style_context (self->viewport),
provider,
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
gtk_style_context_add_provider (gtk_widget_get_style_context (self->button_drawing_area),
provider,
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref (provider);
}
@ -351,17 +357,18 @@ cc_mouse_test_class_init (CcMouseTestClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcMouseTest, scrolled_window_adjustment);
gtk_widget_class_bind_template_child (widget_class, CcMouseTest, viewport);
gtk_widget_class_bind_template_callback (widget_class, button_drawing_area_button_press_event);
gtk_widget_class_bind_template_callback (widget_class, button_drawing_area_draw_event);
gtk_widget_class_bind_template_callback (widget_class, button_drawing_area_button_pressed_cb);
}
static void
cc_mouse_test_init (CcMouseTest *self)
{
g_autoptr(GError) error = NULL;
gtk_widget_init_template (GTK_WIDGET (self));
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (self->button_drawing_area),
button_drawing_area_draw_func,
self, NULL);
self->double_click_timestamp = 0;
self->double_click_state = DOUBLE_CLICK_TEST_OFF;
self->button_state = 0;

View file

@ -20,12 +20,12 @@
#pragma once
#include <gtk/gtk.h>
#include <adwaita.h>
G_BEGIN_DECLS
#define CC_TYPE_MOUSE_TEST (cc_mouse_test_get_type ())
G_DECLARE_FINAL_TYPE (CcMouseTest, cc_mouse_test, CC, MOUSE_TEST, GtkBin)
G_DECLARE_FINAL_TYPE (CcMouseTest, cc_mouse_test, CC, MOUSE_TEST, AdwBin)
GtkWidget *cc_mouse_test_new (void);

View file

@ -7,71 +7,45 @@
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<template class="CcMouseTest" parent="GtkBin">
<template class="CcMouseTest" parent="AdwBin">
<child>
<object class="GtkGrid" id="test_widget">
<property name="visible">True</property>
<property name="can_focus">False</property>
<object class="GtkBox" id="test_widget">
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child>
<object class="GtkLabel" id="information_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="margin_top">10</property>
<property name="margin_bottom">5</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Try clicking, double clicking, scrolling</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<property name="orientation">vertical</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="vadjustment">scrolled_window_adjustment</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">always</property>
<property name="shadow_type">in</property>
<property name="max_content_height">440</property>
<child>
<object class="GtkViewport" id="viewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkOverlay" id="grid1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<object class="GtkPicture" id="image">
<property name="margin_start">25</property>
<property name="margin_end">25</property>
<property name="resource">/org/gnome/control-center/mouse/scroll-test.svg</property>
<property name="can-shrink">False</property>
<property name="file">resource:///org/gnome/control-center/mouse/scroll-test.svg</property>
</object>
</child>
<child type="overlay">
<object class="GtkDrawingArea" id="button_drawing_area">
<property name="width_request">180</property>
<property name="height_request">180</property>
<property name="visible">True</property>
<property name="valign">end</property>
<property name="can_focus">False</property>
<property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
<property name="margin_top">20</property>
<property name="margin_bottom">20</property>
<signal name="button_press_event" handler="button_drawing_area_button_press_event" object="CcMouseTest" swapped="yes"/>
<signal name="draw" handler="button_drawing_area_draw_event" object="CcMouseTest" swapped="yes"/>
<child>
<object class="GtkGestureClick">
<property name="button">0</property>
<signal name="pressed" handler="button_drawing_area_button_pressed_cb" object="CcMouseTest" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
@ -79,12 +53,15 @@
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="information_label">
<property name="margin_top">10</property>
<property name="margin_bottom">5</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Try clicking, double clicking, scrolling</property>
<property name="wrap">True</property>
</object>
</child>
</object>
</child>

View file

@ -4,30 +4,21 @@
#include "cc-mouse-resources.h"
#include "cc-mouse-test.h"
static gboolean
delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
gtk_main_quit ();
return FALSE;
}
int main (int argc, char **argv)
{
GtkWidget *widget;
GtkWidget *window;
gtk_init (&argc, &argv);
gtk_init ();
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
widget = cc_mouse_test_new ();
gtk_widget_show (widget);
gtk_container_add (GTK_CONTAINER (window), widget);
g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (delete_event_cb), NULL);
window = gtk_window_new ();
gtk_window_set_child (GTK_WINDOW (window), widget);
gtk_window_present (GTK_WINDOW (window));
gtk_main ();
while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0)
g_main_context_iteration (NULL, TRUE);
return 0;
}

View file

@ -42,7 +42,7 @@ extern GType cc_default_apps_panel_get_type (void);
//extern GType cc_display_panel_get_type (void);
extern GType cc_info_overview_panel_get_type (void);
//extern GType cc_keyboard_panel_get_type (void);
//extern GType cc_mouse_panel_get_type (void);
extern GType cc_mouse_panel_get_type (void);
extern GType cc_multitasking_panel_get_type (void);
#ifdef BUILD_NETWORK
//extern GType cc_network_panel_get_type (void);
@ -113,7 +113,7 @@ static CcPanelLoaderVtable default_panels[] =
PANEL_TYPE("location", cc_location_panel_get_type, NULL),
PANEL_TYPE("lock", cc_lock_panel_get_type, NULL),
PANEL_TYPE("microphone", cc_microphone_panel_get_type, NULL),
//PANEL_TYPE("mouse", cc_mouse_panel_get_type, NULL),
PANEL_TYPE("mouse", cc_mouse_panel_get_type, NULL),
PANEL_TYPE("multitasking", cc_multitasking_panel_get_type, NULL),
#ifdef BUILD_NETWORK
//PANEL_TYPE("network", cc_network_panel_get_type, NULL),