/* cc-wacom-stylus-action-dialog.c * * Copyright © 2024 Red Hat, Inc. * * 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 of the License, 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 . * * SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include "cc-wacom-stylus-action-dialog.h" #include "cc-wacom-panel.h" struct _CcWacomStylusActionDialog { AdwWindow parent_instance; GtkLabel *description_label; AdwActionRow *left_button_row; AdwActionRow *right_button_row; AdwActionRow *middle_button_row; AdwActionRow *back_row; AdwActionRow *forward_row; GSettings *settings; char *key; }; G_DEFINE_TYPE (CcWacomStylusActionDialog, cc_wacom_stylus_action_dialog, ADW_TYPE_WINDOW) static void cc_wacom_stylus_action_dialog_finalize (GObject *object) { CcWacomStylusActionDialog *self = CC_WACOM_STYLUS_ACTION_DIALOG (object); g_clear_pointer (&self->key, free); G_OBJECT_CLASS (cc_wacom_stylus_action_dialog_parent_class)->finalize (object); } static void left_button_activated (CcWacomStylusActionDialog *self) { g_settings_set_enum (self->settings, self->key, G_DESKTOP_STYLUS_BUTTON_ACTION_DEFAULT); } static void right_button_activated (CcWacomStylusActionDialog *self) { g_settings_set_enum (self->settings, self->key, G_DESKTOP_STYLUS_BUTTON_ACTION_RIGHT); } static void middle_button_activated (CcWacomStylusActionDialog *self) { g_settings_set_enum (self->settings, self->key, G_DESKTOP_STYLUS_BUTTON_ACTION_MIDDLE); } static void back_activated (CcWacomStylusActionDialog *self) { g_settings_set_enum (self->settings, self->key, G_DESKTOP_STYLUS_BUTTON_ACTION_BACK); } static void forward_activated (CcWacomStylusActionDialog *self) { g_settings_set_enum (self->settings, self->key, G_DESKTOP_STYLUS_BUTTON_ACTION_FORWARD); } static void cc_wacom_stylus_action_dialog_class_init (CcWacomStylusActionDialogClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->finalize = cc_wacom_stylus_action_dialog_finalize; gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Escape, 0, "window.close", NULL); gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/" "wacom/cc-wacom-stylus-action-dialog.ui"); gtk_widget_class_bind_template_child (widget_class, CcWacomStylusActionDialog, description_label); gtk_widget_class_bind_template_child (widget_class, CcWacomStylusActionDialog, left_button_row); gtk_widget_class_bind_template_child (widget_class, CcWacomStylusActionDialog, right_button_row); gtk_widget_class_bind_template_child (widget_class, CcWacomStylusActionDialog, middle_button_row); gtk_widget_class_bind_template_child (widget_class, CcWacomStylusActionDialog, back_row); gtk_widget_class_bind_template_child (widget_class, CcWacomStylusActionDialog, forward_row); gtk_widget_class_bind_template_callback (widget_class, left_button_activated); gtk_widget_class_bind_template_callback (widget_class, middle_button_activated); gtk_widget_class_bind_template_callback (widget_class, right_button_activated); gtk_widget_class_bind_template_callback (widget_class, forward_activated); gtk_widget_class_bind_template_callback (widget_class, back_activated); } static void cc_wacom_stylus_action_dialog_init (CcWacomStylusActionDialog *self) { const char *text; gtk_widget_init_template (GTK_WIDGET (self)); text = cc_wacom_panel_get_stylus_button_action_label (G_DESKTOP_STYLUS_BUTTON_ACTION_DEFAULT); adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->left_button_row), text); text = cc_wacom_panel_get_stylus_button_action_label (G_DESKTOP_STYLUS_BUTTON_ACTION_MIDDLE); adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->middle_button_row), text); text = cc_wacom_panel_get_stylus_button_action_label (G_DESKTOP_STYLUS_BUTTON_ACTION_RIGHT); adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->right_button_row), text); text = cc_wacom_panel_get_stylus_button_action_label (G_DESKTOP_STYLUS_BUTTON_ACTION_BACK); adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->back_row), text); text = cc_wacom_panel_get_stylus_button_action_label (G_DESKTOP_STYLUS_BUTTON_ACTION_FORWARD); adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->forward_row), text); } GtkWidget* cc_wacom_stylus_action_dialog_new (GSettings *settings, guint button, const char *key) { CcWacomStylusActionDialog *dialog = g_object_new (CC_TYPE_WACOM_STYLUS_ACTION_DIALOG, NULL); GDesktopStylusButtonAction action; AdwActionRow *row = NULL; g_autofree char *text = NULL; g_autofree char *title = NULL; g_return_val_if_fail(button > 0 && button <= 3, NULL); dialog->settings = settings; dialog->key = g_strdup (key); text = g_strdup_printf (_("Choose an action when button %d on the stylus is pressed"), button); gtk_label_set_text (dialog->description_label, text); title = g_strdup_printf (_("Button %d Mapping"), button); gtk_window_set_title (GTK_WINDOW (dialog), title); action = g_settings_get_enum (settings, key); switch (action) { case G_DESKTOP_STYLUS_BUTTON_ACTION_DEFAULT: row = dialog->left_button_row; break; case G_DESKTOP_STYLUS_BUTTON_ACTION_MIDDLE: row = dialog->middle_button_row; break; case G_DESKTOP_STYLUS_BUTTON_ACTION_RIGHT: row = dialog->right_button_row; break; case G_DESKTOP_STYLUS_BUTTON_ACTION_BACK: row = dialog->back_row; break; case G_DESKTOP_STYLUS_BUTTON_ACTION_FORWARD: row = dialog->forward_row; break; } if (row) adw_action_row_activate (row); return GTK_WIDGET (dialog); }