diff options
author | myheroyuki <myheroyuki@outlook.com> | 2023-06-07 15:49:24 +0300 |
---|---|---|
committer | myheroyuki <myheroyuki@outlook.com> | 2023-06-07 15:49:24 +0300 |
commit | 660e3edb3e88f284af5a70a2eb33eb8fdf76d85b (patch) | |
tree | 39d677cce2b1ab5f9655c148346688fad9fee3e1 | |
parent | c079a7fdb7642922d173d185f7abb41e69da6f56 (diff) |
Fixed key chooser in preferences
-rw-r--r-- | data/ui/remmina_key_chooser.glade | 55 | ||||
-rw-r--r-- | src/remmina_key_chooser.c | 52 | ||||
-rw-r--r-- | src/remmina_key_chooser.h | 8 | ||||
-rw-r--r-- | src/remmina_pref_dialog.c | 8 |
4 files changed, 48 insertions, 75 deletions
diff --git a/data/ui/remmina_key_chooser.glade b/data/ui/remmina_key_chooser.glade index 2e7710ef4..31019fc06 100644 --- a/data/ui/remmina_key_chooser.glade +++ b/data/ui/remmina_key_chooser.glade @@ -1,21 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.18.3 --> <interface> - <requires lib="gtk+" version="3.0"/> - <object class="GtkActionGroup" id="actiongroup_key_chooser"> - <child> - <object class="GtkAction" id="action_cancel"> - <property name="label" translatable="yes">_Cancel</property> - <property name="short_label" translatable="yes">_Cancel</property> - </object> - </child> - <child> - <object class="GtkAction" id="action_remove"> - <property name="label" translatable="yes">_Remove</property> - <property name="short_label" translatable="yes">_Remove</property> - </object> - </child> - </object> + <requires lib="gtk+" version="4.0"/> <object class="GtkDialog" id="KeyChooserDialog"> <property name="width_request">250</property> <property name="height_request">100</property> @@ -23,58 +9,36 @@ <property name="title" translatable="yes">Choose a new key</property> <property name="resizable">False</property> <property name="modal">True</property> - <property name="type_hint">dialog</property> - <child internal-child="vbox"> + <child> <object class="GtkBox" id="dialog-vbox1"> <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="dialog-action_area1"> + <child> + <object class="GtkBox" id="dialog-action_area1"> <property name="can_focus">False</property> - <property name="layout_style">end</property> <child> <object class="GtkButton" id="button_remove"> - <property name="label">button</property> - <property name="use_action_appearance">True</property> - <property name="related_action">action_remove</property> + <property name="label">Remove</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> </child> <child> <object class="GtkButton" id="button_cancel"> - <property name="label">button</property> - <property name="use_action_appearance">True</property> - <property name="related_action">action_cancel</property> + <property name="label">Cancel</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> </child> </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> </child> <child> - <object class="GtkEventBox" id="eventbox_key_chooser"> + <object class="GtkBox" id="eventbox_key_chooser"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="events">GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property> <child> <object class="GtkLabel" id="label_title"> <property name="visible">True</property> @@ -83,11 +47,6 @@ </object> </child> </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> </child> </object> </child> diff --git a/src/remmina_key_chooser.c b/src/remmina_key_chooser.c index e80761232..1726e42b8 100644 --- a/src/remmina_key_chooser.c +++ b/src/remmina_key_chooser.c @@ -40,42 +40,62 @@ #include "remmina/remmina_trace_calls.h" /* Handle key-presses on the GtkEventBox */ -static gboolean remmina_key_chooser_dialog_on_key_press(GtkWidget *widget, GdkKeyEvent *event, RemminaKeyChooserArguments *arguments) +static gboolean remmina_key_chooser_dialog_on_key_press(GtkEventControllerKey* self, + guint keyval, + guint keycode, + GdkModifierType state, RemminaKeyChooserArguments *arguments) { TRACE_CALL(__func__); - if (!arguments->use_modifiers || !gdk_key_event_is_modifier(event)) { - arguments->state = gdk_event_get_modifier_state(event); - arguments->keyval = gdk_keyval_to_lower(gdk_key_event_get_keyval(event)); - gtk_dialog_response(GTK_DIALOG(gtk_widget_get_root(widget)), - gdk_key_event_get_keyval(event) == GDK_KEY_Escape ? GTK_RESPONSE_CANCEL : GTK_RESPONSE_OK); + if (!arguments->use_modifiers || !gdk_key_event_is_modifier(gtk_event_controller_get_current_event(self))) { + arguments->val = remmina_key_chooser_get_value(keyval, state); + gtk_dialog_response(arguments->dialog, keyval == GDK_KEY_Escape ? GTK_RESPONSE_CANCEL : GTK_RESPONSE_OK); + } return TRUE; } +static gboolean remmina_key_chooser_dialog_on_response(GtkDialog* self, + gint response_id, + gpointer user_data) +{ + RemminaKeyChooserArguments* args = user_data; + if (response_id == GTK_RESPONSE_REJECT ) { + gtk_button_set_label(GTK_BUTTON(args->widget), KEY_CHOOSER_NONE); + } + else if(response_id == GTK_RESPONSE_OK ){ + gtk_button_set_label(GTK_BUTTON(args->widget), args->val); + } + gtk_window_destroy(self); + } + /* Show a key chooser dialog and return the keyval for the selected key */ -RemminaKeyChooserArguments* remmina_key_chooser_new(GtkWindow *parent_window, gboolean use_modifiers) +void remmina_key_chooser_new(GtkWindow *parent_window, gboolean use_modifiers, GtkWidget *widget) { TRACE_CALL(__func__); GtkBuilder *builder = remmina_public_gtk_builder_new_from_resource ("/org/remmina/Remmina/src/../data/ui/remmina_key_chooser.glade"); GtkDialog *dialog; RemminaKeyChooserArguments *arguments; arguments = g_new0(RemminaKeyChooserArguments, 1); - arguments->state = 0; arguments->use_modifiers = use_modifiers; + arguments->widget = widget; + arguments->val = gtk_button_get_label(GTK_BUTTON(widget)); + /* Setup the dialog */ dialog = GTK_DIALOG(gtk_builder_get_object(builder, "KeyChooserDialog")); + arguments->dialog = dialog; gtk_window_set_transient_for(GTK_WINDOW(dialog), parent_window); /* Connect the GtkEventBox signal */ - g_signal_connect(gtk_builder_get_object(builder, "eventbox_key_chooser"), "key-press-event", + GtkEventControllerKey* key_event_controller = gtk_event_controller_key_new(); + GtkBox* eventbox_key_chooser = gtk_builder_get_object(builder, "eventbox_key_chooser"); + gtk_widget_add_controller(dialog, key_event_controller); + gtk_window_set_modal(dialog, true); + + g_signal_connect(key_event_controller, "key-released", G_CALLBACK(remmina_key_chooser_dialog_on_key_press), arguments); - /* Show the dialog and destroy it after the use */ - //arguments->response = gtk_dialog_run(dialog); - gtk_window_destroy(GTK_WIDGET(dialog)); - /* The delete button set the keyval 0 */ - if (arguments->response == GTK_RESPONSE_REJECT) - arguments->keyval = 0; - return arguments; + g_signal_connect(dialog, "response", + G_CALLBACK(remmina_key_chooser_dialog_on_response), arguments); + gtk_widget_show(dialog); } /* Get the uppercase character value of a keyval */ diff --git a/src/remmina_key_chooser.h b/src/remmina_key_chooser.h index a23693245..c94652ef0 100644 --- a/src/remmina_key_chooser.h +++ b/src/remmina_key_chooser.h @@ -46,16 +46,16 @@ #define KEY_CHOOSER_NONE _("<None>") typedef struct _RemminaKeyChooserArguments { - guint keyval; - guint state; + gchar* val; gboolean use_modifiers; - gint response; + GtkWidget* widget; + GtkDialog* dialog; } RemminaKeyChooserArguments; G_BEGIN_DECLS /* Show a key chooser dialog and return the keyval for the selected key */ -RemminaKeyChooserArguments *remmina_key_chooser_new(GtkWindow *parent_window, gboolean use_modifiers); +void remmina_key_chooser_new(GtkWindow *parent_window, gboolean use_modifiers, GtkWidget *widget); /* Get the uppercase character value of a keyval */ gchar *remmina_key_chooser_get_value(guint keyval, guint state); /* Get the keyval of a (lowercase) character value */ diff --git a/src/remmina_pref_dialog.c b/src/remmina_pref_dialog.c index 1fdb42312..d65578022 100644 --- a/src/remmina_pref_dialog.c +++ b/src/remmina_pref_dialog.c @@ -74,13 +74,7 @@ void remmina_pref_dialog_on_key_chooser(GtkWidget *widget, gpointer user_data) g_return_if_fail(GTK_IS_BUTTON(widget)); - arguments = remmina_key_chooser_new(GTK_WINDOW(remmina_pref_dialog->dialog), FALSE); - if (arguments->response != GTK_RESPONSE_CANCEL && arguments->response != GTK_RESPONSE_DELETE_EVENT) { - gchar *val = remmina_key_chooser_get_value(arguments->keyval, arguments->state); - gtk_button_set_label(GTK_BUTTON(widget), val); - g_free(val); - } - g_free(arguments); + remmina_key_chooser_new(GTK_WINDOW(remmina_pref_dialog->dialog), FALSE, widget); } /* Show the available resolutions list dialog */ |