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

github.com/FreeRDP/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGiovanni Panozzo <giovanni@panozzo.it>2022-11-02 21:21:20 +0300
committerGiovanni Panozzo <giovanni@panozzo.it>2022-11-02 21:21:20 +0300
commitcb44df90ab2cfe54de008892440a84425de7a9eb (patch)
tree6269dbc38592d605286038dcb8768b03efab31d3 /src
parent15148bfef09542d3f85980c6b83670dceb718b74 (diff)
Fix widget reparenting when entering/exiting fullscreen
Diffstat (limited to 'src')
-rw-r--r--src/rcw.c86
1 files changed, 59 insertions, 27 deletions
diff --git a/src/rcw.c b/src/rcw.c
index 4099ea3a9..ed08b66f0 100644
--- a/src/rcw.c
+++ b/src/rcw.c
@@ -511,6 +511,8 @@ static void rcw_pointer_grab(RemminaConnectionWindow *cnnwin)
GdkSeat *seat;
GdkDisplay *display;
GdkGrabStatus ggs;
+
+
if (cnnwin->priv->pointer_captured) {
#if DEBUG_KB_GRABBING
printf("DEBUG_KB_GRABBING: pointer_captured is true, it should not\n");
@@ -910,18 +912,16 @@ static void rco_get_desktop_size(RemminaConnectionObject *cnnobj, gint *width, g
}
}
-void rco_set_scrolled_policy(RemminaConnectionObject *cnnobj, GtkScrolledWindow *scrolled_window)
+void rco_set_scrolled_policy(RemminaScaleMode scalemode, GtkScrolledWindow *scrolled_window)
{
TRACE_CALL(__func__);
- RemminaScaleMode scalemode;
- scalemode = get_current_allowed_scale_mode(cnnobj, NULL, NULL);
gtk_scrolled_window_set_policy(scrolled_window,
scalemode == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_SCALED ? GTK_POLICY_NEVER : GTK_POLICY_AUTOMATIC,
scalemode == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_SCALED ? GTK_POLICY_NEVER : GTK_POLICY_AUTOMATIC);
}
-static GtkWidget *rco_create_scrolled_container(RemminaConnectionObject *cnnobj, int view_mode)
+static GtkWidget *rco_create_scrolled_container(RemminaScaleMode scalemode, int view_mode)
{
GtkWidget *scrolled_container;
@@ -929,7 +929,7 @@ static GtkWidget *rco_create_scrolled_container(RemminaConnectionObject *cnnobj,
scrolled_container = remmina_scrolled_viewport_new();
} else {
scrolled_container = gtk_scrolled_window_new(NULL, NULL);
- rco_set_scrolled_policy(cnnobj, GTK_SCROLLED_WINDOW(scrolled_container));
+ rco_set_scrolled_policy(scalemode, GTK_SCROLLED_WINDOW(scrolled_container));
gtk_container_set_border_width(GTK_CONTAINER(scrolled_container), 0);
gtk_widget_set_can_focus(scrolled_container, FALSE);
}
@@ -970,8 +970,10 @@ gboolean rcw_toolbar_autofit_restore(RemminaConnectionWindow *cnnwin)
MAX(1, dheight + ta.height + nba.height - ca.height));
gtk_container_check_resize(GTK_CONTAINER(cnnobj->cnnwin));
}
- if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container))
- rco_set_scrolled_policy(cnnobj, GTK_SCROLLED_WINDOW(cnnobj->scrolled_container));
+ if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container)) {
+ RemminaScaleMode scalemode = get_current_allowed_scale_mode(cnnobj, NULL, NULL);
+ rco_set_scrolled_policy(scalemode, GTK_SCROLLED_WINDOW(cnnobj->scrolled_container));
+ }
return G_SOURCE_REMOVE;
}
@@ -1222,13 +1224,10 @@ static void nb_set_current_page(GtkNotebook *notebook, GtkWidget *page)
}
}
-static void nb_migrate_page_content(GtkWidget *frompage, GtkWidget *topage)
+static void nb_migrate_message_panels(GtkWidget *frompage, GtkWidget *topage)
{
/* Migrate a single connection tab from a notebook to another one */
GList *lst, *l;
- RemminaConnectionObject *cnnobj;
-
- cnnobj = (RemminaConnectionObject *)g_object_get_data(G_OBJECT(frompage), "cnnobj");
/* Reparent message panels */
lst = gtk_container_get_children(GTK_CONTAINER(frompage));
@@ -1243,10 +1242,6 @@ static void nb_migrate_page_content(GtkWidget *frompage, GtkWidget *topage)
}
g_list_free(lst);
- /* Reparent the viewport (which is inside scrolled_container inside frompage */
- G_GNUC_BEGIN_IGNORE_DEPRECATIONS
- gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container);
- G_GNUC_END_IGNORE_DEPRECATIONS
}
static void rcw_migrate(RemminaConnectionWindow *from, RemminaConnectionWindow *to)
@@ -1256,8 +1251,9 @@ static void rcw_migrate(RemminaConnectionWindow *from, RemminaConnectionWindow *
gchar *tag;
gint cp, np, i;
GtkNotebook *from_notebook;
- GtkWidget *frompage, *newpage;
+ GtkWidget *frompage, *newpage, *old_scrolled_container;
RemminaConnectionObject *cnnobj;
+ RemminaScaleMode scalemode;
/* Migrate TAG */
tag = g_strdup((gchar *)g_object_get_data(G_OBJECT(from), "tag"));
@@ -1266,6 +1262,7 @@ static void rcw_migrate(RemminaConnectionWindow *from, RemminaConnectionWindow *
/* Migrate notebook content */
from_notebook = from->priv->notebook;
if (from_notebook && GTK_IS_NOTEBOOK(from_notebook)) {
+
cp = gtk_notebook_get_current_page(from_notebook);
np = gtk_notebook_get_n_pages(from_notebook);
/* Create pages on dest notebook and migrate
@@ -1273,16 +1270,34 @@ static void rcw_migrate(RemminaConnectionWindow *from, RemminaConnectionWindow *
for (i = 0; i < np; i++) {
frompage = gtk_notebook_get_nth_page(from_notebook, i);
cnnobj = g_object_get_data(G_OBJECT(frompage), "cnnobj");
- cnnobj->scrolled_container = rco_create_scrolled_container(cnnobj, to->priv->view_mode);
- g_signal_connect(G_OBJECT(cnnobj->scrolled_container), "destroy",
- G_CALLBACK(gtk_widget_destroyed), (gpointer)&cnnobj->scrolled_container);
+
+ /* A scrolled container must be recreated, because it can be different on the new window/page
+ depending on view_mode */
+ scalemode = get_current_allowed_scale_mode(cnnobj, NULL, NULL);
+ old_scrolled_container = cnnobj->scrolled_container;
+ cnnobj->scrolled_container = rco_create_scrolled_container(scalemode, to->priv->view_mode);
+
newpage = rcw_append_new_page(to, cnnobj);
- nb_migrate_page_content(frompage, newpage);
+
+ nb_migrate_message_panels(frompage, newpage);
+
+ /* Reparent the viewport (which is inside scrolled_container) to the new page */
+ g_object_ref(cnnobj->viewport);
+ gtk_container_remove(GTK_CONTAINER(old_scrolled_container), cnnobj->viewport);
+ gtk_container_add(GTK_CONTAINER(cnnobj->scrolled_container), cnnobj->viewport);
+ g_object_unref(cnnobj->viewport);
+
+ /* Destroy old scrolled_container. Not really needed, it will be destroyed
+ * when removing the page from the notepad */
+ gtk_widget_destroy(old_scrolled_container);
+
}
+
/* Remove all the pages from source notebook */
for (i = np - 1; i >= 0; i--)
gtk_notebook_remove_page(from_notebook, i);
gtk_notebook_set_current_page(to->priv->notebook, cp);
+
}
}
@@ -1297,6 +1312,11 @@ static void rcw_switch_viewmode(RemminaConnectionWindow *cnnwin, int newmode)
if (old_mode == newmode)
return;
+
+
+ RemminaConnectionObject *cnnobj;
+ cnnobj = rcw_get_visible_cnnobj(cnnwin);
+
if (newmode == VIEWPORT_FULLSCREEN_MODE || newmode == SCROLLED_FULLSCREEN_MODE) {
if (old_mode == SCROLLED_WINDOW_MODE) {
/* We are leaving SCROLLED_WINDOW_MODE, save W,H, and maximized
@@ -1648,8 +1668,9 @@ static void rco_change_scalemode(RemminaConnectionObject *cnnobj, gboolean bdyn,
if (cnnobj->cnnwin->priv->view_mode != SCROLLED_WINDOW_MODE)
rco_check_resize(cnnobj);
- if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container))
- rco_set_scrolled_policy(cnnobj, GTK_SCROLLED_WINDOW(cnnobj->scrolled_container));
+ if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container)) {
+ rco_set_scrolled_policy(scalemode, GTK_SCROLLED_WINDOW(cnnobj->scrolled_container));
+ }
}
static void rcw_toolbar_dynres(GtkToolItem *toggle, RemminaConnectionWindow *cnnwin)
@@ -2797,6 +2818,13 @@ static gboolean rcw_on_leave_notify_event(GtkWidget *widget, GdkEventCrossing *e
print_crossing_event(event);
#endif
+ if (event->mode != GDK_CROSSING_NORMAL && event->mode != GDK_CROSSING_UNGRAB) {
+#if DEBUG_KB_GRABBING
+ printf("DEBUG_KB_GRABBING: ignored because mode is not GDK_CROSSING_NORMAL GDK_CROSSING_UNGRAB\n");
+#endif
+ return FALSE;
+ }
+
if (cnnwin->priv->delayed_grab_eventsourceid) {
g_source_remove(cnnwin->priv->delayed_grab_eventsourceid);
cnnwin->priv->delayed_grab_eventsourceid = 0;
@@ -2815,7 +2843,7 @@ static gboolean rco_leave_protocol_widget(GtkWidget *widget, GdkEventCrossing *e
TRACE_CALL(__func__);
#if DEBUG_KB_GRABBING
- printf("DEBUG_KB_GRABBING: received leave event on RCO.");
+ printf("DEBUG_KB_GRABBING: received leave event on RCO.\n");
print_crossing_event(event);
#endif
@@ -3236,6 +3264,8 @@ static gboolean rcw_map_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
TRACE_CALL(__func__);
+
+
RemminaConnectionWindow *cnnwin = (RemminaConnectionWindow *)widget;
RemminaConnectionObject *cnnobj;
RemminaProtocolWidget *gp;
@@ -3498,8 +3528,6 @@ static GtkWidget *rco_create_tab_label(RemminaConnectionObject *cnnobj)
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(rco_on_close_button_clicked), cnnobj);
- g_signal_connect(G_OBJECT(cnnobj->proto), "enter-notify-event", G_CALLBACK(rco_enter_protocol_widget), cnnobj);
- g_signal_connect(G_OBJECT(cnnobj->proto), "leave-notify-event", G_CALLBACK(rco_leave_protocol_widget), cnnobj);
return hbox;
}
@@ -3622,6 +3650,7 @@ static void rcw_on_page_removed(GtkNotebook *notebook, GtkWidget *child, guint p
if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(cnnwin->priv->notebook)) <= 0)
gtk_widget_destroy(GTK_WIDGET(cnnwin));
+
}
static GtkNotebook *
@@ -4451,6 +4480,7 @@ GtkWidget *rcw_open_from_file_full(RemminaFile *remminafile, GCallback disconnec
gboolean maximize;
gint view_mode;
const gchar *msg;
+ RemminaScaleMode scalemode;
if (disconnect_cb) {
g_print("disconnect_cb is deprecated inside rcw_open_from_file_full() and should be null\n");
@@ -4507,8 +4537,8 @@ GtkWidget *rcw_open_from_file_full(RemminaFile *remminafile, GCallback disconnec
gtk_viewport_set_shadow_type(GTK_VIEWPORT(cnnobj->viewport), GTK_SHADOW_NONE);
/* Create the scrolled container */
- cnnobj->scrolled_container = rco_create_scrolled_container(cnnobj, view_mode);
- g_signal_connect(G_OBJECT(cnnobj->scrolled_container), "destroy", G_CALLBACK(gtk_widget_destroyed), (gpointer)&cnnobj->scrolled_container);
+ scalemode = get_current_allowed_scale_mode(cnnobj, NULL, NULL);
+ cnnobj->scrolled_container = rco_create_scrolled_container(scalemode, view_mode);
gtk_container_add(GTK_CONTAINER(cnnobj->scrolled_container), cnnobj->viewport);
@@ -4557,6 +4587,8 @@ GtkWidget *rcw_open_from_file_full(RemminaFile *remminafile, GCallback disconnec
g_signal_connect(G_OBJECT(cnnobj->proto), "update-align", G_CALLBACK(rco_on_update_align), NULL);
g_signal_connect(G_OBJECT(cnnobj->proto), "lock-dynres", G_CALLBACK(rco_on_lock_dynres), NULL);
g_signal_connect(G_OBJECT(cnnobj->proto), "unlock-dynres", G_CALLBACK(rco_on_unlock_dynres), NULL);
+ g_signal_connect(G_OBJECT(cnnobj->proto), "enter-notify-event", G_CALLBACK(rco_enter_protocol_widget), cnnobj);
+ g_signal_connect(G_OBJECT(cnnobj->proto), "leave-notify-event", G_CALLBACK(rco_leave_protocol_widget), cnnobj);
if (!remmina_pref.save_view_mode)
remmina_file_set_int(cnnobj->remmina_file, "viewmode", remmina_pref.default_mode);