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-09-19 16:51:52 +0300
committermyheroyuki <myheroyuki@outlook.com>2023-09-19 16:51:52 +0300
commitdf60046ce87f4211f8c199089cbaba0ca87e92ce (patch)
tree09c6707a25116c78f90b6f31983d743224732809
parentf60e3844eb22a5b60cfe46cf001f3fd88d31f6ae (diff)
Begin working on tab switching in rcw
-rw-r--r--src/rcw.c127
1 files changed, 84 insertions, 43 deletions
diff --git a/src/rcw.c b/src/rcw.c
index ab6e8e19e..a2d84580d 100644
--- a/src/rcw.c
+++ b/src/rcw.c
@@ -206,6 +206,7 @@ static void rcw_keyboard_grab(RemminaConnectionWindow *cnnwin);
static void rcw_run_feature(GSimpleAction *action, GVariant *param, gpointer data);
static void rcw_toolbar_menu_on_launch_item(GSimpleAction *action, GVariant *param, gpointer data);
static void rcw_handle_keystrokes(GSimpleAction *action, GVariant *param, gpointer data);
+static void rco_switch_page_activate(GSimpleAction *action, GVariant *param, gpointer data);
static GtkWidget *rcw_append_new_page(RemminaConnectionWindow *cnnwin, RemminaConnectionObject *cnnobj);
void rcw_toolbar_preferences_check(RemminaConnectionObject *cnnobj, GSimpleActionGroup* actions, const RemminaProtocolFeature *feature,
const gchar *domain, gboolean enabled);
@@ -216,6 +217,7 @@ static GActionEntry rcw_actions[] = {
{ "feature", rcw_run_feature, NULL, NULL, NULL },
{ "keystrokes", rcw_handle_keystrokes, NULL, NULL, NULL },
{ "launch", rcw_toolbar_menu_on_launch_item, NULL, NULL, NULL },
+ { "switch", rco_switch_page_activate, NULL, NULL, NULL },
};
static void rcw_ftb_drag_begin(GtkWidget *widget, GtkDragSource *context, gpointer user_data);
@@ -1626,6 +1628,28 @@ static void rcw_scaler_keep_aspect(GtkWidget *widget, RemminaConnectionWindow *c
remmina_protocol_widget_update_alignment(cnnobj);
}
+// create properly formatted action name based on menu label
+static void rcw_create_action_names(char *name, char *str, const 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 = '_';
+ }
+ ptr++;
+ }
+ if (strcmp(group, "") == 0){
+ strcat(str, name);
+ }
+ else{
+ strcat(str, group);
+ strcat(str, "::");
+ strcat(str, name);
+ }
+}
+
static void rcw_toolbar_scaler_option(GtkWidget *toggle, RemminaConnectionWindow *cnnwin)
{
TRACE_CALL(__func__);
@@ -1676,14 +1700,30 @@ static void rcw_toolbar_scaler_option(GtkWidget *toggle, RemminaConnectionWindow
// #endif
}
-void rco_switch_page_activate(GtkButton *menuitem, RemminaConnectionObject *cnnobj)
+void rco_switch_page_activate(GSimpleAction *action, GVariant *param, gpointer data)
{
TRACE_CALL(__func__);
- RemminaConnectionWindowPriv *priv = cnnobj->cnnwin->priv;
gint page_num;
+ RemminaConnectionObject* cnnobj;
+
+
+ if(data == NULL){
+ return;
+ }
+
+
+
+ page_num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "new-page-num"));
+ cnnobj = (RemminaConnectionObject *)g_object_get_data(G_OBJECT(action), "cnnobj");
- page_num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "new-page-num"));
+ RemminaConnectionWindowPriv *priv = cnnobj->cnnwin->priv;
gtk_notebook_set_current_page(GTK_NOTEBOOK(priv->notebook), page_num);
+
+ // RemminaConnectionWindowPriv *priv = cnnobj->cnnwin->priv;
+ // gint page_num;
+
+ // page_num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "new-page-num"));
+ // gtk_notebook_set_current_page(GTK_NOTEBOOK(priv->notebook), page_num);
}
void rcw_toolbar_switch_page_popdown(GtkWidget *widget, RemminaConnectionWindow *cnnwin)
@@ -1702,12 +1742,10 @@ static void rcw_toolbar_switch_page(GtkWidget *toggle, RemminaConnectionWindow *
TRACE_CALL(__func__);
RemminaConnectionWindowPriv *priv = cnnwin->priv;
- RemminaConnectionObject *cnnobj;
-
+ RemminaConnectionObject *cnnobj, *cur_cnnobj;
+ GtkPopoverMenu* popover_menu;
GtkWidget *menu;
- GtkWidget *menuitem;
- GtkWidget *image;
- gint i, n;
+ gint i, n, cur;
if (priv->toolbar_is_reconfiguring)
return;
@@ -1718,26 +1756,52 @@ static void rcw_toolbar_switch_page(GtkWidget *toggle, RemminaConnectionWindow *
priv->sticky = TRUE;
- menu = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);;
-
+ menu = g_menu_new();
+ cur = gtk_notebook_get_current_page(GTK_NOTEBOOK(priv->notebook));
+ cur_cnnobj = rcw_get_cnnobj_at_page(cnnobj->cnnwin, cur);
n = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->notebook));
for (i = 0; i < n; i++) {
+ // if (i != cur){
cnnobj = rcw_get_cnnobj_at_page(cnnobj->cnnwin, i);
+
+ char name[80];
+ char detailed_action[80];
+ char label[80];
+ char* trail = "switch";
+
+ char* label_base = remmina_file_get_string(cnnobj->remmina_file, "name");
+ strcpy(label, label_base);
+ strcat(label, trail);
+ rcw_create_action_names(name, detailed_action, label, "");
- menuitem = gtk_button_new_with_label(remmina_file_get_string(cnnobj->remmina_file, "name"));
- gtk_widget_show(menuitem);
- //gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ // REMMINA_DEBUG("name: %s", name);
+ // REMMINA_DEBUG("label: %s", label);
+ // REMMINA_DEBUG("label_base: %s", label_base);
+ // REMMINA_DEBUG("detailed_action: %s", detailed_action);
- image = gtk_image_new_from_icon_name(remmina_file_get_icon_name(cnnobj->remmina_file));
- gtk_widget_show(image);
+ GSimpleAction *action = g_simple_action_new (g_strdup(name), NULL);
+ GMenuItem* menuitem = g_menu_item_new(label_base, detailed_action);
+ //save these to be accessed in callback
+ g_object_set_data(G_OBJECT(action), "cnnobj", (gpointer)cnnobj);
+ g_object_set_data(G_OBJECT(action), "new-page-num", GINT_TO_POINTER(i));
- g_object_set_data(G_OBJECT(menuitem), "new-page-num", GINT_TO_POINTER(i));
- g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(rco_switch_page_activate), cnnobj);
- if (i == gtk_notebook_get_current_page(GTK_NOTEBOOK(priv->notebook)))
- gtk_widget_set_sensitive(menuitem, FALSE);
+ g_signal_connect (action, "activate", G_CALLBACK (rco_switch_page_activate), menuitem);
+ g_action_map_add_action (G_ACTION_MAP (cur_cnnobj->action_group), G_ACTION (action));
+
+
+ g_menu_append_item(G_MENU(menu), menuitem);
+
+
+ // }
+
}
- g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(rcw_toolbar_switch_page_popdown),
+
+ popover_menu = (GtkPopoverMenu*)gtk_popover_menu_new_from_model(G_MENU_MODEL(menu));
+ gtk_widget_set_parent(GTK_WIDGET(popover_menu), toggle);
+ gtk_popover_popup(GTK_POPOVER(popover_menu));
+
+ g_signal_connect(G_OBJECT(popover_menu), "closed", G_CALLBACK(rcw_toolbar_switch_page_popdown),
cnnwin);
// #if GTK_CHECK_VERSION(3, 22, 0)
@@ -1837,29 +1901,6 @@ 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, const 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 (strcmp(group, "") == 0){
- strcat(str, name);
- }
- else{
- strcat(str, group);
- strcat(str, "::");
- strcat(str, name);
- }
-}
-
-
static void rcw_create_toolbar_connection_menu(GSimpleActionGroup* actions, RemminaConnectionWindow *cnnwin){
RemminaConnectionObject *cnnobj;
GMenu *menu;