diff --git a/panels/mouse/cc-mouse-panel.c b/panels/mouse/cc-mouse-panel.c index f3130f46fd03b22edafd4e996e5b2927f1a62a54..df2cd4b7ac9dd098644d79a616da3df84c0aee8f 100644 --- a/panels/mouse/cc-mouse-panel.c +++ b/panels/mouse/cc-mouse-panel.c @@ -21,32 +21,344 @@ * */ -#include "cc-mouse-panel.h" -#include "cc-mouse-resources.h" - -#include "gnome-mouse-properties.h" -#include "gnome-mouse-test.h" +#include #include -#include +#include "cc-mouse-caps-helper.h" +#include "cc-mouse-panel.h" +#include "cc-mouse-resources.h" +#include "cc-mouse-test.h" +#include "gsd-device-manager.h" +#include "gsd-input-helper.h" +#include "list-box-helper.h" struct _CcMousePanel { - CcPanel parent_instance; + CcPanel parent_instance; + + GtkListBoxRow *edge_scrolling_row; + GtkSwitch *edge_scrolling_switch; + GtkListBox *general_listbox; + GtkFrame *mouse_frame; + GtkListBox *mouse_listbox; + GtkSwitch *mouse_natural_scrolling_switch; + GtkScale *mouse_speed_scale; + CcMouseTest *mouse_test; + GtkRadioButton *primary_button_left; + GtkRadioButton *primary_button_right; + GtkScrolledWindow *scrolled_window; + GtkStack *stack; + GtkListBoxRow *tap_to_click_row; + GtkSwitch *tap_to_click_switch; + GtkButton *test_button; + GtkFrame *touchpad_frame; + GtkListBox *touchpad_listbox; + GtkListBoxRow *touchpad_natural_scrolling_row; + GtkSwitch *touchpad_natural_scrolling_switch; + GtkListBoxRow *touchpad_speed_row; + GtkScale *touchpad_speed_scale; + GtkSwitch *touchpad_toggle_switch; + GtkListBoxRow *two_finger_scrolling_row; + GtkSwitch *two_finger_scrolling_switch; + + GSettings *mouse_settings; + GSettings *gsd_mouse_settings; + GSettings *touchpad_settings; - GtkWidget *stack; + GsdDeviceManager *device_manager; + guint device_added_id; + guint device_removed_id; + + gboolean have_mouse; + gboolean have_touchpad; + gboolean have_touchscreen; + gboolean have_synaptics; + + gboolean left_handed; + GtkGesture *left_gesture; + GtkGesture *right_gesture; }; CC_PANEL_REGISTER (CcMousePanel, cc_mouse_panel) -enum { - CC_MOUSE_PAGE_PREFS, - CC_MOUSE_PAGE_TEST -}; +static void +setup_touchpad_options (CcMousePanel *self) +{ + gboolean edge_scroll_enabled; + gboolean two_finger_scroll_enabled; + gboolean have_two_finger_scrolling; + gboolean have_edge_scrolling; + gboolean have_tap_to_click; + + if (self->have_synaptics || !self->have_touchpad) { + gtk_widget_hide (GTK_WIDGET (self->touchpad_frame)); + 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_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); + gtk_widget_set_visible (GTK_WIDGET (self->tap_to_click_row), have_tap_to_click); + + edge_scroll_enabled = g_settings_get_boolean (self->touchpad_settings, "edge-scrolling-enabled"); + two_finger_scroll_enabled = g_settings_get_boolean (self->touchpad_settings, "two-finger-scrolling-enabled"); + if (edge_scroll_enabled && two_finger_scroll_enabled) + { + /* You cunning user set both, but you can only have one set in that UI */ + gtk_switch_set_active (self->edge_scrolling_switch, FALSE); + } +} + +static void +two_finger_scrolling_changed_event (CcMousePanel *self, + gboolean state) +{ + /* Updating the setting will cause the "state" of the switch to be updated. */ + g_settings_set_boolean (self->touchpad_settings, "two-finger-scrolling-enabled", state); + + /* Disable edge scrolling if two-finger scrolling is enabled */ + if (state && gtk_widget_get_visible (GTK_WIDGET (self->edge_scrolling_row))) + gtk_switch_set_active (self->edge_scrolling_switch, FALSE); +} + +static void +edge_scrolling_changed_event (CcMousePanel *self, + gboolean state) +{ + /* Updating the setting will cause the "state" of the switch to be updated. */ + g_settings_set_boolean (self->touchpad_settings, "edge-scrolling-enabled", state); + + /* Disable two-finger scrolling if edge scrolling is enabled */ + if (state && gtk_widget_get_visible (GTK_WIDGET (self->two_finger_scrolling_row))) + gtk_switch_set_active (self->two_finger_scrolling_switch, FALSE); +} + +static gboolean +get_touchpad_enabled (GSettings *settings) +{ + GDesktopDeviceSendEvents send_events; + + send_events = g_settings_get_enum (settings, "send-events"); + + return send_events == G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED; +} + +static gboolean +show_touchpad_enabling_switch (CcMousePanel *self) +{ + if (!self->have_touchpad) + return FALSE; + + g_debug ("Should we show the touchpad disable switch: have_mouse: %s have_touchscreen: %s\n", + self->have_mouse ? "true" : "false", + self->have_touchscreen ? "true" : "false"); + + /* Let's show the button when a mouse or touchscreen is present */ + if (self->have_mouse || self->have_touchscreen) + return TRUE; + + /* Let's also show when the touchpad is disabled. */ + if (!get_touchpad_enabled (self->touchpad_settings)) + return TRUE; + + return FALSE; +} + +static gboolean +touchpad_enabled_get_mapping (GValue *value, + GVariant *variant, + gpointer user_data) +{ + gboolean enabled; + + enabled = g_strcmp0 (g_variant_get_string (variant, NULL), "enabled") == 0; + g_value_set_boolean (value, enabled); + + return TRUE; +} + +static GVariant * +touchpad_enabled_set_mapping (const GValue *value, + const GVariantType *type, + gpointer user_data) +{ + gboolean enabled; + + enabled = g_value_get_boolean (value); + + return g_variant_new_string (enabled ? "enabled" : "disabled"); +} + +static void +handle_secondary_button (CcMousePanel *self, + GtkRadioButton *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); + gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture), GTK_PHASE_BUBBLE); +} + +/* Set up the property editors in the dialog. */ +static void +setup_dialog (CcMousePanel *self) +{ + GtkRadioButton *button; + + self->left_handed = g_settings_get_boolean (self->mouse_settings, "left-handed"); + button = self->left_handed ? self->primary_button_right : self->primary_button_left; + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); + + g_settings_bind (self->mouse_settings, "left-handed", + self->primary_button_left, "active", + G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN); + g_settings_bind (self->mouse_settings, "left-handed", + self->primary_button_right, "active", + G_SETTINGS_BIND_DEFAULT); + + /* Allow changing orientation with either button */ + button = self->primary_button_right; + self->right_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (button)); + handle_secondary_button (self, button, self->right_gesture); + button = self->primary_button_left; + self->left_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (button)); + handle_secondary_button (self, button, self->left_gesture); + + g_settings_bind (self->mouse_settings, "natural-scroll", + self->mouse_natural_scrolling_switch, "active", + G_SETTINGS_BIND_DEFAULT); + + gtk_list_box_set_header_func (self->general_listbox, cc_list_box_update_header_func, NULL, NULL); + gtk_list_box_set_header_func (self->touchpad_listbox, cc_list_box_update_header_func, NULL, NULL); + + /* Mouse section */ + gtk_widget_set_visible (GTK_WIDGET (self->mouse_frame), self->have_mouse); + + g_settings_bind (self->mouse_settings, "speed", + gtk_range_get_adjustment (GTK_RANGE (self->mouse_speed_scale)), "value", + G_SETTINGS_BIND_DEFAULT); + + gtk_list_box_set_header_func (self->mouse_listbox, cc_list_box_update_header_func, NULL, NULL); + + /* Touchpad section */ + gtk_widget_set_visible (GTK_WIDGET (self->touchpad_toggle_switch), show_touchpad_enabling_switch (self)); + + g_settings_bind_with_mapping (self->touchpad_settings, "send-events", + self->touchpad_toggle_switch, "active", + G_SETTINGS_BIND_DEFAULT, + touchpad_enabled_get_mapping, + touchpad_enabled_set_mapping, + NULL, NULL); + g_settings_bind_with_mapping (self->touchpad_settings, "send-events", + self->touchpad_natural_scrolling_row, "sensitive", + G_SETTINGS_BIND_GET, + touchpad_enabled_get_mapping, + touchpad_enabled_set_mapping, + NULL, NULL); + g_settings_bind_with_mapping (self->touchpad_settings, "send-events", + self->touchpad_speed_row, "sensitive", + G_SETTINGS_BIND_GET, + touchpad_enabled_get_mapping, + touchpad_enabled_set_mapping, + NULL, NULL); + g_settings_bind_with_mapping (self->touchpad_settings, "send-events", + self->tap_to_click_row, "sensitive", + G_SETTINGS_BIND_GET, + touchpad_enabled_get_mapping, + touchpad_enabled_set_mapping, + NULL, NULL); + g_settings_bind_with_mapping (self->touchpad_settings, "send-events", + self->two_finger_scrolling_row, "sensitive", + G_SETTINGS_BIND_GET, + touchpad_enabled_get_mapping, + touchpad_enabled_set_mapping, + NULL, NULL); + g_settings_bind_with_mapping (self->touchpad_settings, "send-events", + self->edge_scrolling_row, "sensitive", + G_SETTINGS_BIND_GET, + touchpad_enabled_get_mapping, + touchpad_enabled_set_mapping, + NULL, NULL); + + g_settings_bind (self->touchpad_settings, "natural-scroll", + self->touchpad_natural_scrolling_switch, "active", + G_SETTINGS_BIND_DEFAULT); + + g_settings_bind (self->touchpad_settings, "speed", + gtk_range_get_adjustment (GTK_RANGE (self->touchpad_speed_scale)), "value", + G_SETTINGS_BIND_DEFAULT); + + g_settings_bind (self->touchpad_settings, "tap-to-click", + self->tap_to_click_switch, "active", + G_SETTINGS_BIND_DEFAULT); + + g_settings_bind (self->touchpad_settings, "two-finger-scrolling-enabled", + self->two_finger_scrolling_switch, "state", + G_SETTINGS_BIND_GET); + + g_settings_bind (self->touchpad_settings, "edge-scrolling-enabled", + self->edge_scrolling_switch, "state", + G_SETTINGS_BIND_GET); + + setup_touchpad_options (self); +} + +/* Callback issued when a button is clicked on the dialog */ +static void +device_changed (GsdDeviceManager *device_manager, + GsdDevice *device, + CcMousePanel *self) +{ + self->have_touchpad = touchpad_is_present (); + + 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->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) { + CcMousePanel *self = CC_MOUSE_PANEL (object); + + g_clear_object (&self->mouse_settings); + g_clear_object (&self->gsd_mouse_settings); + g_clear_object (&self->touchpad_settings); + g_clear_object (&self->right_gesture); + g_clear_object (&self->left_gesture); + + if (self->device_manager != NULL) { + g_signal_handler_disconnect (self->device_manager, self->device_added_id); + self->device_added_id = 0; + g_signal_handler_disconnect (self->device_manager, self->device_removed_id); + self->device_removed_id = 0; + self->device_manager = NULL; + } + G_OBJECT_CLASS (cc_mouse_panel_parent_class)->dispose (object); } @@ -57,67 +369,96 @@ cc_mouse_panel_get_help_uri (CcPanel *panel) } static void -shell_test_button_toggled (GtkToggleButton *button, CcMousePanel *panel) +test_button_toggled_cb (CcMousePanel *self) { - gboolean active; - - active = gtk_toggle_button_get_active (button); - gtk_stack_set_visible_child_name (GTK_STACK (panel->stack), active ? "test_widget" : "prefs_widget"); + 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)); } static void cc_mouse_panel_constructed (GObject *object) { CcMousePanel *self = CC_MOUSE_PANEL (object); - GtkWidget *button; CcShell *shell; G_OBJECT_CLASS (cc_mouse_panel_parent_class)->constructed (object); /* Add test area button to shell header. */ shell = cc_panel_get_shell (CC_PANEL (self)); - - button = gtk_toggle_button_new_with_mnemonic (_("Test Your _Settings")); - gtk_style_context_add_class (gtk_widget_get_style_context (button), - "text-button"); - gtk_widget_set_valign (button, GTK_ALIGN_CENTER); - gtk_widget_set_visible (button, TRUE); - - cc_shell_embed_widget_in_header (shell, button, GTK_POS_RIGHT); - - g_signal_connect (GTK_BUTTON (button), "toggled", - G_CALLBACK (shell_test_button_toggled), - self); + cc_shell_embed_widget_in_header (shell, GTK_WIDGET (self->test_button), GTK_POS_RIGHT); } static void cc_mouse_panel_init (CcMousePanel *self) { - GtkWidget *prefs_widget, *test_widget; - g_resources_register (cc_mouse_get_resource ()); - prefs_widget = cc_mouse_properties_new (); - gtk_widget_show (prefs_widget); - test_widget = cc_mouse_test_new (); - gtk_widget_show (test_widget); + cc_mouse_test_get_type (); + gtk_widget_init_template (GTK_WIDGET (self)); + + self->mouse_settings = g_settings_new ("org.gnome.desktop.peripherals.mouse"); + self->gsd_mouse_settings = g_settings_new ("org.gnome.settings-daemon.peripherals.mouse"); + self->touchpad_settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad"); + + self->device_manager = gsd_device_manager_get (); + self->device_added_id = g_signal_connect (self->device_manager, "device-added", + G_CALLBACK (device_changed), self); + self->device_removed_id = g_signal_connect (self->device_manager, "device-removed", + G_CALLBACK (device_changed), self); - self->stack = gtk_stack_new (); - gtk_widget_show (self->stack); - gtk_stack_add_named (GTK_STACK (self->stack), prefs_widget, "prefs_widget"); - gtk_stack_add_named (GTK_STACK (self->stack), test_widget, "test_widget"); + self->have_mouse = mouse_is_present (); + self->have_touchpad = touchpad_is_present (); + self->have_touchscreen = touchscreen_is_present (); + self->have_synaptics = cc_synaptics_check (); + if (self->have_synaptics) + g_warning ("Detected synaptics X driver, please migrate to libinput"); - gtk_container_add (GTK_CONTAINER (self), self->stack); + setup_dialog (self); } static void cc_mouse_panel_class_init (CcMousePanelClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); CcPanelClass *panel_class = CC_PANEL_CLASS (klass); panel_class->get_help_uri = cc_mouse_panel_get_help_uri; object_class->dispose = cc_mouse_panel_dispose; object_class->constructed = cc_mouse_panel_constructed; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/mouse/cc-mouse-panel.ui"); + + 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_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); + gtk_widget_class_bind_template_child (widget_class, CcMousePanel, mouse_test); + 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, 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_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); + gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_speed_row); + gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_speed_scale); + gtk_widget_class_bind_template_child (widget_class, CcMousePanel, touchpad_toggle_switch); + gtk_widget_class_bind_template_child (widget_class, CcMousePanel, two_finger_scrolling_row); + 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); } diff --git a/panels/mouse/cc-mouse-panel.ui b/panels/mouse/cc-mouse-panel.ui new file mode 100644 index 0000000000000000000000000000000000000000..bcfde6de6ef622b24ff4f144e18ad89c2145e596 --- /dev/null +++ b/panels/mouse/cc-mouse-panel.ui @@ -0,0 +1,752 @@ + + + + + + True + True + center + Test Your _Settings + + + + + -1 + 1 + + + -1 + 1 + + + vertical + + + + + + + + + + + + horizontal + + + + + + diff --git a/panels/mouse/gnome-mouse-test.c b/panels/mouse/cc-mouse-test.c similarity index 99% rename from panels/mouse/gnome-mouse-test.c rename to panels/mouse/cc-mouse-test.c index 3e29e67b73bd84faaca4042c5b8d82ba80f9c4a5..35f337df7cf0db8c6bf834eee21638dcaa6a3b6c 100644 --- a/panels/mouse/gnome-mouse-test.c +++ b/panels/mouse/cc-mouse-test.c @@ -27,7 +27,7 @@ #include #include -#include "gnome-mouse-test.h" +#include "cc-mouse-test.h" #include #include @@ -344,7 +344,7 @@ cc_mouse_test_class_init (CcMouseTestClass *klass) object_class->finalize = cc_mouse_test_finalize; - gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/mouse/gnome-mouse-test.ui"); + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/mouse/cc-mouse-test.ui"); gtk_widget_class_bind_template_child (widget_class, CcMouseTest, button_drawing_area); gtk_widget_class_bind_template_child (widget_class, CcMouseTest, information_label); diff --git a/panels/mouse/gnome-mouse-test.h b/panels/mouse/cc-mouse-test.h similarity index 100% rename from panels/mouse/gnome-mouse-test.h rename to panels/mouse/cc-mouse-test.h diff --git a/panels/mouse/gnome-mouse-test.ui b/panels/mouse/cc-mouse-test.ui similarity index 100% rename from panels/mouse/gnome-mouse-test.ui rename to panels/mouse/cc-mouse-test.ui diff --git a/panels/mouse/gnome-mouse-properties.c b/panels/mouse/gnome-mouse-properties.c deleted file mode 100644 index 5f4b16b9ce097341d3b082e45a244127f5cbd75e..0000000000000000000000000000000000000000 --- a/panels/mouse/gnome-mouse-properties.c +++ /dev/null @@ -1,444 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- - * - * Copyright (C) 2001, 2012 Red Hat, Inc. - * Copyright (C) 2001 Ximian, Inc. - * - * Written by: Jonathon Blandford , - * Bradford Hovinen , - * Ondrej Holy , - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "gnome-mouse-properties.h" -#include "gsd-input-helper.h" -#include "gsd-device-manager.h" -#include "list-box-helper.h" -#include "cc-mouse-caps-helper.h" - -#include -#include -#include - -struct _CcMouseProperties -{ - GtkBin parent_instance; - - GtkWidget *edge_scrolling_row; - GtkWidget *edge_scrolling_switch; - GtkWidget *general_listbox; - GtkWidget *mouse_frame; - GtkWidget *mouse_listbox; - GtkWidget *mouse_natural_scrolling_switch; - GtkWidget *mouse_speed_scale; - GtkWidget *primary_button_left; - GtkWidget *primary_button_right; - GtkWidget *scrolled_window; - GtkWidget *tap_to_click_row; - GtkWidget *tap_to_click_switch; - GtkWidget *touchpad_frame; - GtkWidget *touchpad_listbox; - GtkWidget *touchpad_natural_scrolling_row; - GtkWidget *touchpad_natural_scrolling_switch; - GtkWidget *touchpad_speed_row; - GtkWidget *touchpad_speed_scale; - GtkWidget *touchpad_toggle_switch; - GtkWidget *two_finger_scrolling_row; - GtkWidget *two_finger_scrolling_switch; - - GSettings *mouse_settings; - GSettings *gsd_mouse_settings; - GSettings *touchpad_settings; - - GsdDeviceManager *device_manager; - guint device_added_id; - guint device_removed_id; - - gboolean have_mouse; - gboolean have_touchpad; - gboolean have_touchscreen; - gboolean have_synaptics; - - gboolean left_handed; - GtkGesture *left_gesture; - GtkGesture *right_gesture; -}; - -G_DEFINE_TYPE (CcMouseProperties, cc_mouse_properties, GTK_TYPE_BIN); - -static void -setup_touchpad_options (CcMouseProperties *self) -{ - gboolean edge_scroll_enabled; - gboolean two_finger_scroll_enabled; - gboolean have_two_finger_scrolling; - gboolean have_edge_scrolling; - gboolean have_tap_to_click; - - if (self->have_synaptics || !self->have_touchpad) { - gtk_widget_hide (self->touchpad_frame); - return; - } - - cc_touchpad_check_capabilities (&have_two_finger_scrolling, &have_edge_scrolling, &have_tap_to_click); - - gtk_widget_show (self->touchpad_frame); - - gtk_widget_set_visible (self->two_finger_scrolling_row, have_two_finger_scrolling); - gtk_widget_set_visible (self->edge_scrolling_row, have_edge_scrolling); - gtk_widget_set_visible (self->tap_to_click_row, have_tap_to_click); - - edge_scroll_enabled = g_settings_get_boolean (self->touchpad_settings, "edge-scrolling-enabled"); - two_finger_scroll_enabled = g_settings_get_boolean (self->touchpad_settings, "two-finger-scrolling-enabled"); - if (edge_scroll_enabled && two_finger_scroll_enabled) { - /* You cunning user set both, but you can only have one set in that UI */ - gtk_switch_set_active (GTK_SWITCH (self->edge_scrolling_switch), FALSE); - } -} - -static void -two_finger_scrolling_changed_event (CcMouseProperties *self, - gboolean state) -{ - /* Updating the setting will cause the "state" of the switch to be updated. */ - g_settings_set_boolean (self->touchpad_settings, "two-finger-scrolling-enabled", state); - - if (state && gtk_widget_get_visible (self->edge_scrolling_row)) { - /* Disable edge scrolling if two-finger scrolling is enabled */ - gtk_switch_set_active (GTK_SWITCH (self->edge_scrolling_switch), FALSE); - } -} - -static void -edge_scrolling_changed_event (CcMouseProperties *self, - gboolean state) -{ - /* Updating the setting will cause the "state" of the switch to be updated. */ - g_settings_set_boolean (self->touchpad_settings, "edge-scrolling-enabled", state); - - if (state && gtk_widget_get_visible (self->two_finger_scrolling_row)) { - /* Disable two-finger scrolling if edge scrolling is enabled */ - gtk_switch_set_active (GTK_SWITCH (self->two_finger_scrolling_switch), FALSE); - } -} - -static gboolean -get_touchpad_enabled (GSettings *settings) -{ - GDesktopDeviceSendEvents send_events; - - send_events = g_settings_get_enum (settings, "send-events"); - - return send_events == G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED; -} - -static gboolean -show_touchpad_enabling_switch (CcMouseProperties *self) -{ - if (!self->have_touchpad) - return FALSE; - - g_debug ("Should we show the touchpad disable switch: have_mouse: %s have_touchscreen: %s\n", - self->have_mouse ? "true" : "false", - self->have_touchscreen ? "true" : "false"); - - /* Let's show the button when a mouse or touchscreen is present */ - if (self->have_mouse || self->have_touchscreen) - return TRUE; - - /* Let's also show when the touchpad is disabled. */ - if (!get_touchpad_enabled (self->touchpad_settings)) - return TRUE; - - return FALSE; -} - -static gboolean -touchpad_enabled_get_mapping (GValue *value, - GVariant *variant, - gpointer user_data) -{ - gboolean enabled; - - enabled = g_strcmp0 (g_variant_get_string (variant, NULL), "enabled") == 0; - g_value_set_boolean (value, enabled); - - return TRUE; -} - -static GVariant * -touchpad_enabled_set_mapping (const GValue *value, - const GVariantType *type, - gpointer user_data) -{ - gboolean enabled; - - enabled = g_value_get_boolean (value); - - return g_variant_new_string (enabled ? "enabled" : "disabled"); -} - -static void -handle_secondary_button (CcMouseProperties *self, - GtkWidget *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); - gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture), GTK_PHASE_BUBBLE); - -} - -/* Set up the property editors in the dialog. */ -static void -setup_dialog (CcMouseProperties *self) -{ - GtkWidget *button; - - self->left_handed = g_settings_get_boolean (self->mouse_settings, "left-handed"); - button = self->left_handed ? self->primary_button_right : self->primary_button_left; - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); - - g_settings_bind (self->mouse_settings, "left-handed", - self->primary_button_left, "active", - G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN); - g_settings_bind (self->mouse_settings, "left-handed", - self->primary_button_right, "active", - G_SETTINGS_BIND_DEFAULT); - - /* Allow changing orientation with either button */ - button = self->primary_button_right; - self->right_gesture = gtk_gesture_multi_press_new (button); - handle_secondary_button (self, button, self->right_gesture); - button = self->primary_button_left; - self->left_gesture = gtk_gesture_multi_press_new (button); - handle_secondary_button (self, button, self->left_gesture); - - g_settings_bind (self->mouse_settings, "natural-scroll", - self->mouse_natural_scrolling_switch, "active", - G_SETTINGS_BIND_DEFAULT); - - gtk_list_box_set_header_func (GTK_LIST_BOX (self->general_listbox), cc_list_box_update_header_func, NULL, NULL); - gtk_list_box_set_header_func (GTK_LIST_BOX (self->touchpad_listbox), cc_list_box_update_header_func, NULL, NULL); - - /* Mouse section */ - gtk_widget_set_visible (self->mouse_frame, self->have_mouse); - - g_settings_bind (self->mouse_settings, "speed", - gtk_range_get_adjustment (GTK_RANGE (self->mouse_speed_scale)), "value", - G_SETTINGS_BIND_DEFAULT); - - gtk_list_box_set_header_func (GTK_LIST_BOX (self->mouse_listbox), cc_list_box_update_header_func, NULL, NULL); - - /* Touchpad section */ - gtk_widget_set_visible (self->touchpad_toggle_switch, - show_touchpad_enabling_switch (self)); - - g_settings_bind_with_mapping (self->touchpad_settings, "send-events", - self->touchpad_toggle_switch, "active", - G_SETTINGS_BIND_DEFAULT, - touchpad_enabled_get_mapping, - touchpad_enabled_set_mapping, - NULL, NULL); - g_settings_bind_with_mapping (self->touchpad_settings, "send-events", - self->touchpad_natural_scrolling_row, "sensitive", - G_SETTINGS_BIND_GET, - touchpad_enabled_get_mapping, - touchpad_enabled_set_mapping, - NULL, NULL); - g_settings_bind_with_mapping (self->touchpad_settings, "send-events", - self->touchpad_speed_row, "sensitive", - G_SETTINGS_BIND_GET, - touchpad_enabled_get_mapping, - touchpad_enabled_set_mapping, - NULL, NULL); - g_settings_bind_with_mapping (self->touchpad_settings, "send-events", - self->tap_to_click_row, "sensitive", - G_SETTINGS_BIND_GET, - touchpad_enabled_get_mapping, - touchpad_enabled_set_mapping, - NULL, NULL); - g_settings_bind_with_mapping (self->touchpad_settings, "send-events", - self->two_finger_scrolling_row, "sensitive", - G_SETTINGS_BIND_GET, - touchpad_enabled_get_mapping, - touchpad_enabled_set_mapping, - NULL, NULL); - g_settings_bind_with_mapping (self->touchpad_settings, "send-events", - self->edge_scrolling_row, "sensitive", - G_SETTINGS_BIND_GET, - touchpad_enabled_get_mapping, - touchpad_enabled_set_mapping, - NULL, NULL); - - g_settings_bind (self->touchpad_settings, "natural-scroll", - self->touchpad_natural_scrolling_switch, "active", - G_SETTINGS_BIND_DEFAULT); - - g_settings_bind (self->touchpad_settings, "speed", - gtk_range_get_adjustment (GTK_RANGE (self->touchpad_speed_scale)), "value", - G_SETTINGS_BIND_DEFAULT); - - g_settings_bind (self->touchpad_settings, "tap-to-click", - self->tap_to_click_switch, "active", - G_SETTINGS_BIND_DEFAULT); - - g_settings_bind (self->touchpad_settings, "two-finger-scrolling-enabled", - self->two_finger_scrolling_switch, "state", - G_SETTINGS_BIND_GET); - - g_settings_bind (self->touchpad_settings, "edge-scrolling-enabled", - self->edge_scrolling_switch, "state", - G_SETTINGS_BIND_GET); - - setup_touchpad_options (self); -} - -/* Callback issued when a button is clicked on the dialog */ -static void -device_changed (GsdDeviceManager *device_manager, - GsdDevice *device, - CcMouseProperties *self) -{ - self->have_touchpad = touchpad_is_present (); - - setup_touchpad_options (self); - - self->have_mouse = mouse_is_present (); - gtk_widget_set_visible (self->mouse_frame, self->have_mouse); - gtk_widget_set_visible (self->touchpad_toggle_switch, - show_touchpad_enabling_switch (self)); -} - -static void -on_content_size_changed (CcMouseProperties *self, - GtkAllocation *allocation) -{ - if (allocation->height < 490) { - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self->scrolled_window), - GTK_POLICY_NEVER, GTK_POLICY_NEVER); - } else { - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self->scrolled_window), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (self->scrolled_window), 490); - } -} - -static void -cc_mouse_properties_finalize (GObject *object) -{ - CcMouseProperties *self = CC_MOUSE_PROPERTIES (object); - - g_clear_object (&self->mouse_settings); - g_clear_object (&self->gsd_mouse_settings); - g_clear_object (&self->touchpad_settings); - g_clear_object (&self->right_gesture); - g_clear_object (&self->left_gesture); - - if (self->device_manager != NULL) { - g_signal_handler_disconnect (self->device_manager, self->device_added_id); - self->device_added_id = 0; - g_signal_handler_disconnect (self->device_manager, self->device_removed_id); - self->device_removed_id = 0; - self->device_manager = NULL; - } - - G_OBJECT_CLASS (cc_mouse_properties_parent_class)->finalize (object); -} - -static void -cc_mouse_properties_class_init (CcMousePropertiesClass *klass) -{ - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->finalize = cc_mouse_properties_finalize; - - gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/mouse/gnome-mouse-properties.ui"); - - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, edge_scrolling_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, edge_scrolling_switch); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, general_listbox); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, mouse_frame); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, mouse_listbox); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, mouse_natural_scrolling_switch); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, mouse_speed_scale); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, primary_button_left); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, primary_button_right); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, scrolled_window); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, tap_to_click_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, tap_to_click_switch); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, touchpad_frame); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, touchpad_listbox); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, touchpad_natural_scrolling_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, touchpad_natural_scrolling_switch); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, touchpad_speed_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, tap_to_click_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, two_finger_scrolling_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, edge_scrolling_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, touchpad_speed_scale); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, touchpad_toggle_switch); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, two_finger_scrolling_row); - gtk_widget_class_bind_template_child (widget_class, CcMouseProperties, two_finger_scrolling_switch); - - gtk_widget_class_bind_template_callback (widget_class, edge_scrolling_changed_event); - gtk_widget_class_bind_template_callback (widget_class, two_finger_scrolling_changed_event); - gtk_widget_class_bind_template_callback (widget_class, on_content_size_changed); -} - -static void -cc_mouse_properties_init (CcMouseProperties *self) -{ - g_autoptr(GError) error = NULL; - - gtk_widget_init_template (GTK_WIDGET (self)); - - self->mouse_settings = g_settings_new ("org.gnome.desktop.peripherals.mouse"); - self->gsd_mouse_settings = g_settings_new ("org.gnome.settings-daemon.peripherals.mouse"); - self->touchpad_settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad"); - - self->device_manager = gsd_device_manager_get (); - self->device_added_id = g_signal_connect (self->device_manager, "device-added", - G_CALLBACK (device_changed), self); - self->device_removed_id = g_signal_connect (self->device_manager, "device-removed", - G_CALLBACK (device_changed), self); - - self->have_mouse = mouse_is_present (); - self->have_touchpad = touchpad_is_present (); - self->have_touchscreen = touchscreen_is_present (); - self->have_synaptics = cc_synaptics_check (); - if (self->have_synaptics) - g_warning ("Detected synaptics X driver, please migrate to libinput"); - - setup_dialog (self); -} - -GtkWidget * -cc_mouse_properties_new (void) -{ - return (GtkWidget *) g_object_new (CC_TYPE_MOUSE_PROPERTIES, NULL); -} diff --git a/panels/mouse/gnome-mouse-properties.h b/panels/mouse/gnome-mouse-properties.h deleted file mode 100644 index dd7554d7154dce6d983eb9cc34ccbafed9b55740..0000000000000000000000000000000000000000 --- a/panels/mouse/gnome-mouse-properties.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- mode: c; style: linux -*- */ - -/* mouse-properties-capplet.c - * Copyright (C) 2001 Red Hat, Inc. - * Copyright (C) 2001 Ximian, Inc. - * - * Written by: Jonathon Blandford , - * Bradford Hovinen , - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -#include - -#ifndef _CC_MOUSE_PROPERTIES_H -#define _CC_MOUSE_PROPERTIES_H - -G_BEGIN_DECLS - -#define CC_TYPE_MOUSE_PROPERTIES (cc_mouse_properties_get_type ()) -G_DECLARE_FINAL_TYPE (CcMouseProperties, cc_mouse_properties, CC, MOUSE_PROPERTIES, GtkBin) - -GtkWidget *cc_mouse_properties_new (void); - -G_END_DECLS - -#endif /* _CC_MOUSE_PROPERTIES_H */ diff --git a/panels/mouse/gnome-mouse-properties.ui b/panels/mouse/gnome-mouse-properties.ui deleted file mode 100644 index 32c3beb76c6e601d0d8d37e8ae5a9a722c4052c9..0000000000000000000000000000000000000000 --- a/panels/mouse/gnome-mouse-properties.ui +++ /dev/null @@ -1,742 +0,0 @@ - - - - - -1 - 1 - - - -1 - 1 - - - 100 - 1000 - 400 - 100 - 100 - - - - - vertical - - - - - - - - - - - - - horizontal - - - - - - diff --git a/panels/mouse/meson.build b/panels/mouse/meson.build index cf79fc784a31399189c6c6aef959ea105843d389..357aaae810bc1d692d16c0912831629898b5aaf1 100644 --- a/panels/mouse/meson.build +++ b/panels/mouse/meson.build @@ -18,8 +18,8 @@ i18n.merge_file( ) resource_data = files( - 'gnome-mouse-properties.ui', - 'gnome-mouse-test.ui', + 'cc-mouse-panel.ui', + 'cc-mouse-test.ui', 'scroll-test-gegl.svg', 'scroll-test.svg' ) @@ -35,8 +35,7 @@ common_sources = gnome.compile_resources( sources = common_sources + files( 'cc-mouse-panel.c', 'cc-mouse-caps-helper.c', - 'gnome-mouse-properties.c', - 'gnome-mouse-test.c' + 'cc-mouse-test.c', ) deps = common_deps + [ @@ -57,7 +56,7 @@ panels_libs += static_library( test_name = 'test-gnome-mouse-test' sources = common_sources + files( - 'gnome-mouse-test.c', + 'cc-mouse-test.c', test_name + '.c' ) diff --git a/panels/mouse/mouse.gresource.xml b/panels/mouse/mouse.gresource.xml index 2b3e6f772573cb0b70d49cae11eb318c7fe4d7ad..056870529a245041d13bc02b84e05730952669c1 100644 --- a/panels/mouse/mouse.gresource.xml +++ b/panels/mouse/mouse.gresource.xml @@ -1,8 +1,8 @@ - gnome-mouse-properties.ui - gnome-mouse-test.ui + cc-mouse-panel.ui + cc-mouse-test.ui scroll-test.svg scroll-test-gegl.svg diff --git a/panels/mouse/test-gnome-mouse-test.c b/panels/mouse/test-gnome-mouse-test.c index 557f36e0ba9fd135d163442a76041ef7c94ba29d..5b006f6693bf2af02b7b276cda0db507efec47dc 100644 --- a/panels/mouse/test-gnome-mouse-test.c +++ b/panels/mouse/test-gnome-mouse-test.c @@ -2,7 +2,7 @@ #include #include "cc-mouse-resources.h" -#include "gnome-mouse-test.h" +#include "cc-mouse-test.h" static gboolean delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) diff --git a/po/POTFILES.in b/po/POTFILES.in index 4a75e2d0d082c5acff9196a5013c60b00261205e..d46ba8747f67a885ce0268da6d44747835227f95 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -60,12 +60,11 @@ panels/keyboard/cc-keyboard-shortcut-editor.c panels/keyboard/cc-keyboard-shortcut-editor.ui panels/keyboard/gnome-keyboard-panel.desktop.in.in panels/keyboard/keyboard-shortcuts.c -panels/mouse/cc-mouse-panel.c +panels/keyboard/shortcut-editor.ui +panels/mouse/cc-mouse-panel.ui +panels/mouse/cc-mouse-test.c +panels/mouse/cc-mouse-test.ui panels/mouse/gnome-mouse-panel.desktop.in.in -panels/mouse/gnome-mouse-properties.c -panels/mouse/gnome-mouse-properties.ui -panels/mouse/gnome-mouse-test.c -panels/mouse/gnome-mouse-test.ui panels/network/cc-network-panel.c panels/network/cc-network-panel.ui panels/network/cc-wifi-connection-row.c