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-08-10 15:33:30 +0300
committermyheroyuki <myheroyuki@outlook.com>2023-08-10 15:33:30 +0300
commit831883845a133baf537b06fc8d464f027f8e519d (patch)
tree5f101130d298db10dfc4a4b1fb6676dd78969bdb
parent1f7602386157fe8c6050b17ca9df1640a73a5033 (diff)
More improvements to the rcw toolbar
-rw-r--r--src/rcw.c253
1 files changed, 89 insertions, 164 deletions
diff --git a/src/rcw.c b/src/rcw.c
index 5dc8e89fb..430f52d2e 100644
--- a/src/rcw.c
+++ b/src/rcw.c
@@ -1852,6 +1852,28 @@ static void rcw_toolbar_scaled_mode(GtkWidget *toggle, RemminaConnectionWindow *
rco_change_scalemode(cnnobj, bdyn, bscale);
}
+// create properly formatted action name based on menu label
+static void rcw_create_action_names(char *name, char *str, char *label, char *group){
+ strcpy(name, label);
+ strcpy(str, "rcw.");
+ //replace white_space with _
+ char* ptr = name;
+ while(*ptr){
+ if (*ptr == ' ' || *ptr == '(' || *ptr == ')'){
+ *ptr = '_';
+ }
+ ptr++;
+ }
+ if (group == ""){
+ strcat(str, name);
+ }
+ else{
+ strcat(str, group);
+ strcat(str, "::");
+ strcat(str, name);
+ }
+}
+
static void rcw_create_toolbar_actions(GSimpleActionGroup* actions, RemminaConnectionWindow *cnnwin){
RemminaConnectionWindowPriv *priv;
@@ -1882,20 +1904,9 @@ static void rcw_create_toolbar_actions(GSimpleActionGroup* actions, RemminaConne
enabled = remmina_protocol_widget_query_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature);
if (enabled) {
- //create action name based on menu label
char name[80];
- strcpy(name, label);
char str[80];
- strcpy(str, "rcw.");
- //replace white_space with _
- char* ptr = name;
- while(*ptr){
- if (*ptr == ' '){
- *ptr = '_';
- }
- ptr++;
- }
- strcat(str, name);
+ rcw_create_action_names(name, str, label, "");
GActionEntry entry = {name, rcw_run_feature, NULL, NULL, NULL};
g_action_map_add_action_entries(actions, &entry, 1, NULL);
@@ -2089,19 +2100,20 @@ void rcw_toolbar_tools_popdown(GtkWidget *toggle, RemminaConnectionWindow *cnnwi
rcw_floating_toolbar_show(cnnwin, FALSE);
}
-static void rco_call_protocol_feature_radio(GtkButton *menuitem, RemminaConnectionObject *cnnobj)
+static void rco_call_protocol_feature_radio(GSimpleAction* action, GVariant *data)
{
TRACE_CALL(__func__);
RemminaProtocolFeature *feature;
- gpointer value;
+ gchar* value;
+ RemminaConnectionObject* cnnobj;
- // if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) {
- // feature = (RemminaProtocolFeature *)g_object_get_data(G_OBJECT(menuitem), "feature-type");
- // value = g_object_get_data(G_OBJECT(menuitem), "feature-value");
+ feature = (RemminaProtocolFeature *)g_object_get_data(G_OBJECT(action), "feature-type");
+ cnnobj = (RemminaConnectionObject *)g_object_get_data(G_OBJECT(action), "cnnobj");
+ value = g_variant_get_string(data, NULL);
- // remmina_file_set_string(cnnobj->remmina_file, (const gchar *)feature->opt2, (const gchar *)value);
- // remmina_protocol_widget_call_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature);
- // }
+ remmina_file_set_string(cnnobj->remmina_file, (const gchar *)feature->opt2, (const gchar *)value);
+ remmina_protocol_widget_call_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature);
+ g_action_change_state(action, data);
}
static void rco_call_protocol_feature_check(GSimpleAction* action, gpointer *data)
@@ -2110,7 +2122,6 @@ static void rco_call_protocol_feature_check(GSimpleAction* action, gpointer *dat
RemminaProtocolFeature *feature;
gboolean value;
RemminaConnectionObject* cnnobj;
- GtkWidget* proto;
value = g_variant_get_boolean(g_action_get_state(action));
@@ -2120,7 +2131,7 @@ static void rco_call_protocol_feature_check(GSimpleAction* action, gpointer *dat
cnnobj = (RemminaConnectionObject *)g_object_get_data(G_OBJECT(action), "cnnobj");
remmina_file_set_int(cnnobj->remmina_file, (const gchar *)feature->opt2, !value);
- g_action_change_state(action, g_variant_new_boolean(new_state));
+ g_action_change_state(action, g_variant_new_boolean(!new_state));
remmina_protocol_widget_call_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature);
}
@@ -2144,63 +2155,43 @@ void rcw_toolbar_preferences_radio(RemminaConnectionObject *cnnobj, RemminaFile
const gchar *value;
group = NULL;
- gboolean initial_value = 1;
- GVariant* variant = g_variant_new_boolean(initial_value);
+ GVariantType* variant_type = g_variant_type_new("s");
value = remmina_file_get_string(remminafile, (const gchar *)feature->opt2);
list = (const gchar **)feature->opt3;
+
+
for (i = 0; list[i]; i += 2) {
menuitem = gtk_toggle_button_new_with_label(g_dgettext(domain, list[i + 1]));
char* label = g_dgettext(domain, list[i + 1]);
- //group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem));
- //gtk_widget_show(menuitem);
- //gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
if (enabled) {
- //create action name based on menu label
char name[80];
- strcpy(name, label);
char str[80];
- strcpy(str, "rcw.");
- //replace white_space with _
- char* ptr = name;
- while(*ptr){
- if (*ptr == ' '){
- *ptr = '_';
- }
- ptr++;
- }
- strcat(str, name);
+ rcw_create_action_names(name, str, label, "radio");
-
-
- GActionEntry entry = {name, rcw_run_feature, NULL, NULL, NULL};
+ GActionEntry entry = {"radio", rcw_run_feature, NULL, NULL, NULL};
g_action_map_add_action_entries(actions, &entry, 1, NULL);
- GSimpleAction *action = g_simple_action_new_stateful (name, NULL, variant);
+ GSimpleAction *action = g_simple_action_new_stateful ("radio", variant_type, g_variant_new_string(name));
GMenuItem* menuitem = g_menu_item_new(label, str);
//save these to be accessed in callback
g_object_set_data((action), "feature-type", (gpointer)feature);
- g_object_set_data((action), "proto", (gpointer)cnnobj->proto);
+ g_object_set_data((action), "cnnobj", (gpointer)cnnobj);
- g_signal_connect (action, "activate", G_CALLBACK (rcw_run_feature), menuitem);
+ g_signal_connect (action, "activate", G_CALLBACK (rco_call_protocol_feature_radio), menuitem);
g_action_map_add_action (G_ACTION_MAP (actions), G_ACTION (action));
g_menu_append_item(cnnobj->cnnwin->priv->preference_menu, menuitem);
-
- // g_object_set_data(G_OBJECT(menuitem), "feature-type", (gpointer)feature);
- // g_object_set_data(G_OBJECT(menuitem), "feature-value", (gpointer)list[i]);
-
- // if (value && g_strcmp0(list[i], value) == 0)
- // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menuitem), TRUE);
-
- // g_signal_connect(G_OBJECT(menuitem), "toggled",
- // G_CALLBACK(rco_call_protocol_feature_radio), cnnobj);
+ if (value && g_strcmp0(list[i], value) == 0){
+ g_action_change_state(action, g_variant_new_string("name"));
+ }
}
else {
gtk_widget_set_sensitive(menuitem, FALSE);
}
}
+ g_variant_type_free(variant_type);
}
void rcw_toolbar_preferences_check(RemminaConnectionObject *cnnobj,
@@ -2212,49 +2203,30 @@ void rcw_toolbar_preferences_check(RemminaConnectionObject *cnnobj,
menuitem = gtk_toggle_button_new_with_label(g_dgettext(domain, (const gchar *)feature->opt3));
gtk_widget_show(menuitem);
- gboolean initial_value = 1;
- GVariant* variant = g_variant_new_boolean(initial_value);
if (enabled) {
- char* label = g_dgettext(domain, (const gchar *)feature->opt3);
- //create action name based on menu label
- char name[80];
- strcpy(name, label);
- char str[80];
- strcpy(str, "rcw.");
- //replace white_space with _
- char* ptr = name;
- while(*ptr){
- if (*ptr == ' '){
- *ptr = '_';
- }
- ptr++;
- }
- strcat(str, name);
-
-
-
- GActionEntry entry = {name, rcw_run_feature, NULL, NULL, NULL};
- g_action_map_add_action_entries(actions, &entry, 1, NULL);
- GSimpleAction *action = g_simple_action_new_stateful (name, NULL, variant);
+ gboolean initial_value = remmina_file_get_int(cnnobj->remmina_file, feature->opt2, 0);
+ GVariant* variant = g_variant_new_boolean(initial_value);
- GMenuItem* menuitem = g_menu_item_new(label, str);
- //save these to be accessed in callback
- g_object_set_data((action), "feature-type", (gpointer)feature);
- g_object_set_data((action), "cnnobj", (gpointer)cnnobj);
+ char* label = g_dgettext(domain, (const gchar *)feature->opt3);
+ char name[80];
+ char str[80];
+ rcw_create_action_names(name, str, label, "");
- g_signal_connect (action, "activate", G_CALLBACK (rco_call_protocol_feature_check), NULL);
- g_action_map_add_action (G_ACTION_MAP (actions), G_ACTION (action));
-
- g_menu_append_item(cnnobj->cnnwin->priv->preference_menu, menuitem);
+ GActionEntry entry = {name, rcw_run_feature, NULL, NULL, NULL};
+ g_action_map_add_action_entries(actions, &entry, 1, NULL);
+ GSimpleAction *action = g_simple_action_new_stateful (name, NULL, variant);
- // g_object_set_data(G_OBJECT(menuitem), "feature-type", (gpointer)feature);
+ GMenuItem* menuitem = g_menu_item_new(label, str);
+ //save these to be accessed in callback
+ g_object_set_data((action), "feature-type", (gpointer)feature);
+ g_object_set_data((action), "cnnobj", (gpointer)cnnobj);
- // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menuitem),
- // remmina_file_get_int(cnnobj->remmina_file, (const gchar *)feature->opt2, FALSE));
+ g_signal_connect (action, "activate", G_CALLBACK (rco_call_protocol_feature_check), NULL);
+ g_action_map_add_action (G_ACTION_MAP (actions), G_ACTION (action));
+
+ g_menu_append_item(cnnobj->cnnwin->priv->preference_menu, menuitem);
- // g_signal_connect(G_OBJECT(menuitem), "toggled",
- // G_CALLBACK(rco_call_protocol_feature_check), cnnobj);
}
else {
gtk_widget_set_sensitive(menuitem, FALSE);
@@ -2273,7 +2245,6 @@ static void rcw_toolbar_preferences(GtkWidget *toggle, RemminaConnectionWindow *
gchar *domain;
gboolean enabled;
GtkPopoverMenu* popover_menu;
- GSimpleActionGroup *actions;
if (cnnwin->priv->toolbar_is_reconfiguring)
@@ -2289,12 +2260,6 @@ static void rcw_toolbar_preferences(GtkWidget *toggle, RemminaConnectionWindow *
separator = FALSE;
-
- actions = g_simple_action_group_new();
- g_action_map_add_action_entries(G_ACTION_MAP(actions), rcw_actions, G_N_ELEMENTS(rcw_actions), cnnobj->cnnwin);
- gtk_widget_insert_action_group(GTK_WIDGET(cnnobj->cnnwin), "rcw", G_ACTION_GROUP(actions));
- rcw_create_toolbar_actions(actions, cnnobj->cnnwin);
-
popover_menu = gtk_popover_menu_new_from_model(cnnwin->priv->preference_menu);
gtk_widget_set_parent(popover_menu, toggle);
gtk_popover_popup(GTK_POPOVER(popover_menu));
@@ -2303,48 +2268,7 @@ static void rcw_toolbar_preferences(GtkWidget *toggle, RemminaConnectionWindow *
-
- // domain = remmina_protocol_widget_get_domain(REMMINA_PROTOCOL_WIDGET(cnnobj->proto));
- // menu = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);;
-
- // cnnwin->priv->preference_menu = g_menu_new();
-
-
- // for (feature = remmina_protocol_widget_get_features(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); feature && feature->type;
- // feature++) {
- // if (feature->type != REMMINA_PROTOCOL_FEATURE_TYPE_PREF)
- // continue;
-
- // if (separator) {
- // menuitem = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
- // gtk_widget_show(menuitem);
- // //gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
- // separator = FALSE;
- // }
- // enabled = remmina_protocol_widget_query_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature);
- // switch (GPOINTER_TO_INT(feature->opt1)) {
- // case REMMINA_PROTOCOL_FEATURE_PREF_RADIO:
- // // rcw_toolbar_preferences_radio(cnnobj, cnnobj->remmina_file, menu, feature,
- // // domain, enabled);
- // separator = TRUE;
- // break;
- // case REMMINA_PROTOCOL_FEATURE_PREF_CHECK:
- // rcw_toolbar_preferences_check(cnnobj, menu, feature,
- // domain, enabled);
- // break;
- // }
- // }
-
- // g_free(domain);
-
- // g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(rcw_toolbar_preferences_popdown), cnnwin);
-
-// #if GTK_CHECK_VERSION(3, 22, 0)
-// gtk_menu_popup_at_widget(GTK_MENU(menu), GTK_WIDGET(toggle),
-// GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
-// #else
-// gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, widget, 0, gtk_get_current_event_time());
-// #endif
+ //TODO GTK4 handle menu separator
}
static void rcw_toolbar_menu_on_launch_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem, gpointer data)
@@ -2391,7 +2315,6 @@ static void rcw_toolbar_menu(GtkWidget *toggle, RemminaConnectionWindow *cnnwin)
remmina_applet_menu_populate(REMMINA_APPLET_MENU(menu));
g_signal_connect(G_OBJECT(menu), "launch-item", G_CALLBACK(rcw_toolbar_menu_on_launch_item), NULL);
- //g_signal_connect(G_OBJECT(menu), "edit-item", G_CALLBACK(rcw_toolbar_menu_on_edit_item), NULL);
menuitem = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_widget_show(menuitem);
//gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
@@ -2415,7 +2338,6 @@ static void rcw_toolbar_tools(GtkWidget *toggle, RemminaConnectionWindow *cnnwin
RemminaConnectionObject *cnnobj;
const RemminaProtocolFeature *feature;
GtkPopoverMenu* popover_menu;
- GSimpleActionGroup *actions;
if (cnnwin->priv->toolbar_is_reconfiguring)
@@ -2428,10 +2350,6 @@ static void rcw_toolbar_tools(GtkWidget *toggle, RemminaConnectionWindow *cnnwin
priv->sticky = TRUE;
- actions = g_simple_action_group_new();
- g_action_map_add_action_entries(G_ACTION_MAP(actions), rcw_actions, G_N_ELEMENTS(rcw_actions), cnnobj->cnnwin);
- gtk_widget_insert_action_group(GTK_WIDGET(cnnobj->cnnwin), "rcw", G_ACTION_GROUP(actions));
- rcw_create_toolbar_actions(actions, cnnobj->cnnwin);
popover_menu = gtk_popover_menu_new_from_model(cnnwin->priv->toolbar_menu);
gtk_widget_set_parent(popover_menu, toggle);
@@ -2652,7 +2570,6 @@ rcw_create_toolbar(RemminaConnectionWindow *cnnwin, gint mode)
GtkWidget *toolitem;
GtkWidget *widget;
GtkWidget *arrow;
-
GdkDisplay *display;
gint n_monitors;
@@ -3675,9 +3592,7 @@ static gboolean rcw_map_event_fullscreen(GtkWidget *widget, gpointer data)
return FALSE;
}
- //RemminaConnectionWindow *cnnwin = (RemminaConnectionWindow *)data;
cnnobj = rcw_get_visible_cnnobj((RemminaConnectionWindow *)widget);
- //cnnobj = g_object_get_data(G_OBJECT(widget), "cnnobj");
if (!cnnobj) {
REMMINA_DEBUG("Remmina Connection Object undefined, cannot go fullscreen");
return FALSE;
@@ -3728,7 +3643,13 @@ void rcw_property_notification_check(GObject* self, GParamSpec* pspec, gpointer
if (strcmp(g_param_spec_get_name(pspec), "mapped") == 0) {
GdkSurface* surface = GDK_SURFACE(self);
if (gdk_surface_get_mapped(surface)){
- rcw_map_event(self, user_data);
+ if (user_data != NULL){
+ rcw_map_event_fullscreen(self, user_data);
+ }
+ else{
+ rcw_map_event(self, user_data);
+ }
+
}
else{
rcw_unmap_event(self, user_data);
@@ -4385,19 +4306,19 @@ RemminaConnectionWindow *rcw_create_fullscreen(GtkWindow *old, gint view_mode)
full_screen_target_monitor = FULL_SCREEN_TARGET_MONITOR_UNDEFINED;
if (old) {
#if GTK_CHECK_VERSION(3, 22, 0)
- GtkNative* native = gtk_widget_get_native((GTK_WIDGET(cnnwin)));
- GdkSurface *window = gtk_native_get_surface(native);
- // old_window = gtk_native_get_surface(gtk_widget_get_native(old));
- // old_display = gdk_surface_get_display(old_window);
- // old_monitor = gdk_display_get_monitor_at_surface(old_display, old_window);
- // GListModel* list = gdk_display_get_monitors(old_display);
- // n_monitors = g_list_model_get_n_items(list);// ); gdk_display_get_n_monitors(old_display);
- // for (i = 0; i < n_monitors; ++i) {
- // if (g_list_model_get_item(list, i) == old_monitor) {
- // full_screen_target_monitor = i;
- // break;
- // }
- // }
+ // GtkNative* native = gtk_widget_get_native((GTK_WIDGET(cnnwin)));
+ // GdkSurface *window = gtk_native_get_surface(native);
+ old_window = gtk_native_get_surface(gtk_widget_get_native(old));
+ old_display = gdk_surface_get_display(old_window);
+ old_monitor = gdk_display_get_monitor_at_surface(old_display, old_window);
+ GListModel* list = gdk_display_get_monitors(old_display);
+ n_monitors = g_list_model_get_n_items(list);// ); gdk_display_get_n_monitors(old_display);
+ for (i = 0; i < n_monitors; ++i) {
+ if (g_list_model_get_item(list, i) == old_monitor) {
+ full_screen_target_monitor = i;
+ break;
+ }
+ }
#else
GtkNative* native = gtk_widget_get_native((GTK_WIDGET(cnnwin)));
GdkSurface *window = gtk_native_get_surface(native);
@@ -4664,7 +4585,7 @@ void rco_on_connect(RemminaProtocolWidget *gp, RemminaConnectionObject *cnnobj)
TRACE_CALL(__func__);
REMMINA_DEBUG("Connect signal emitted");
-
+ GSimpleActionGroup *actions;
/* This signal handler is called by a plugin when it’s correctly connected
* (and authenticated) */
@@ -4691,6 +4612,11 @@ void rco_on_connect(RemminaProtocolWidget *gp, RemminaConnectionObject *cnnobj)
if (cnnobj->cnnwin->priv->floating_toolbar_widget)
gtk_widget_show(cnnobj->cnnwin->priv->floating_toolbar_widget);
+ actions = g_simple_action_group_new();
+ g_action_map_add_action_entries(G_ACTION_MAP(actions), rcw_actions, G_N_ELEMENTS(rcw_actions), cnnobj->cnnwin);
+ gtk_widget_insert_action_group(GTK_WIDGET(cnnobj->cnnwin), "rcw", G_ACTION_GROUP(actions));
+ rcw_create_toolbar_actions(actions, cnnobj->cnnwin);
+
rco_update_toolbar(cnnobj);
REMMINA_DEBUG("Trying to present the window");
@@ -4904,7 +4830,6 @@ GtkWidget *rcw_open_from_file_full(RemminaFile *remminafile, GCallback disconnec
gint view_mode;
const gchar *msg;
RemminaScaleMode scalemode;
- GSimpleActionGroup *actions;
if (disconnect_cb) {
g_print("disconnect_cb is deprecated inside rcw_open_from_file_full() and should be null\n");