Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormyheroyuki <myheroyuki@outlook.com>2023-06-07 15:49:24 +0300
committermyheroyuki <myheroyuki@outlook.com>2023-06-07 15:49:24 +0300
commit660e3edb3e88f284af5a70a2eb33eb8fdf76d85b (patch)
tree39d677cce2b1ab5f9655c148346688fad9fee3e1
parentc079a7fdb7642922d173d185f7abb41e69da6f56 (diff)
Fixed key chooser in preferences
-rw-r--r--data/ui/remmina_key_chooser.glade55
-rw-r--r--src/remmina_key_chooser.c52
-rw-r--r--src/remmina_key_chooser.h8
-rw-r--r--src/remmina_pref_dialog.c8
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 */