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-07-19 14:49:59 +0300
committermyheroyuki <myheroyuki@outlook.com>2023-07-19 14:49:59 +0300
commit41a03197f168f1b49d5145e7157cffb71d90db3f (patch)
tree401819cc5ba22ccd405125029c03b4787f26ce13
parent01ddd7fb4c86dfeb3b07825f086844a8113c278f (diff)
VNC plugin now works in a minimal functional capacity. Some features are missing, but it can be used to connect to, view, and interact with a remote VNC server
-rw-r--r--plugins/vnc/vnc_plugin.c248
-rw-r--r--plugins/vnc/vnc_plugin.h1
-rw-r--r--src/rcw.c12
-rw-r--r--src/remmina_protocol_widget.c2
4 files changed, 181 insertions, 82 deletions
diff --git a/plugins/vnc/vnc_plugin.c b/plugins/vnc/vnc_plugin.c
index 8789268d8..7d7cb2d0f 100644
--- a/plugins/vnc/vnc_plugin.c
+++ b/plugins/vnc/vnc_plugin.c
@@ -151,6 +151,11 @@ static void remmina_plugin_vnc_event_push(RemminaProtocolWidget *gp, gint event_
event->event_data.pointer.y = GPOINTER_TO_INT(p2);
event->event_data.pointer.button_mask = GPOINTER_TO_INT(p3);
break;
+ case REMMINA_PLUGIN_VNC_EVENT_SCROLL:
+ event->event_data.pointer.x = GPOINTER_TO_INT(p1);
+ event->event_data.pointer.y = GPOINTER_TO_INT(p2);
+ event->event_data.pointer.button_mask = GPOINTER_TO_INT(p3);
+ break;
case REMMINA_PLUGIN_VNC_EVENT_CUTTEXT:
case REMMINA_PLUGIN_VNC_EVENT_CHAT_SEND:
event->event_data.text.text = g_strdup((char *)p1);
@@ -268,7 +273,7 @@ gboolean remmina_plugin_vnc_setcursor(RemminaProtocolWidget *gp)
gpdata->queuecursor_handler = 0;
if (gpdata->queuecursor_surface) {
- cur = gdk_cursor_new_from_name("help", NULL);
+ cur = gdk_cursor_new_from_name("default", NULL);
gtk_widget_set_cursor(gpdata->drawing_area, cur);
g_object_unref(cur);
cairo_surface_destroy(gpdata->queuecursor_surface);
@@ -339,6 +344,10 @@ static void remmina_plugin_vnc_process_vnc_event(RemminaProtocolWidget *gp)
SendPointerEvent(cl, event->event_data.pointer.x, event->event_data.pointer.y,
event->event_data.pointer.button_mask);
break;
+ case REMMINA_PLUGIN_VNC_EVENT_SCROLL:
+ SendPointerEvent(cl, event->event_data.pointer.x, event->event_data.pointer.y,
+ event->event_data.pointer.button_mask);
+ break;
case REMMINA_PLUGIN_VNC_EVENT_CUTTEXT:
if (event->event_data.text.text) {
rfbClientLog("sending clipboard text '%s'\n", event->event_data.text.text);
@@ -563,7 +572,7 @@ static gboolean remmina_plugin_vnc_queue_draw_area_real(RemminaProtocolWidget *g
gpdata->queuedraw_handler = 0;
UNLOCK_BUFFER(FALSE);
- gtk_widget_queue_draw(GTK_WIDGET(gp));
+ gtk_widget_queue_draw(GTK_WIDGET(gpdata->drawing_area));
}
return FALSE;
}
@@ -1415,7 +1424,7 @@ static RemminaPluginVncCoordinates remmina_plugin_vnc_scale_coordinates(GtkWidge
return result;
}
-static gboolean remmina_plugin_vnc_on_motion(GtkWidget *widget, GdkMotionEvent *event, RemminaProtocolWidget *gp)
+static gboolean remmina_plugin_vnc_on_motion(GtkWidget *widget, gdouble x, gdouble y, RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp);
@@ -1427,16 +1436,14 @@ static gboolean remmina_plugin_vnc_on_motion(GtkWidget *widget, GdkMotionEvent *
remminafile = remmina_plugin_service->protocol_plugin_get_file(gp);
if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE))
return FALSE;
- double* x;
- double* y;
- gdk_event_get_position (event,x, y);
- coordinates = remmina_plugin_vnc_scale_coordinates(widget, gp, x, y);
+
+ coordinates = remmina_plugin_vnc_scale_coordinates(gpdata->drawing_area, gp, x, y);
remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
GINT_TO_POINTER(gpdata->button_mask));
return TRUE;
}
-static gboolean remmina_plugin_vnc_on_button(GtkWidget *widget, GdkButtonEvent *event, RemminaProtocolWidget *gp)
+static gboolean remmina_plugin_vnc_on_button_press(GtkGestureClick *self, gint n_press, gdouble x, gdouble y, RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp);
@@ -1451,21 +1458,42 @@ static gboolean remmina_plugin_vnc_on_button(GtkWidget *widget, GdkButtonEvent *
return FALSE;
/* We only accept 3 buttons */
- if (gdk_button_event_get_button(event) < 1 || gdk_button_event_get_button(event) > 3)
+ if (gtk_gesture_single_get_current_button(self) < 1 || gtk_gesture_single_get_current_button(self) > 3)
+ return FALSE;
+
+ mask = (1 << (gtk_gesture_single_get_current_button(self) - 1));
+ gpdata->button_mask = (gpdata->button_mask | mask);
+
+
+ coordinates = remmina_plugin_vnc_scale_coordinates(gpdata->drawing_area, gp, x, y);
+ remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
+ GINT_TO_POINTER(gpdata->button_mask));
+ return TRUE;
+}
+
+static gboolean remmina_plugin_vnc_on_button_release(GtkGestureClick *self, gint n_press, gdouble x, gdouble y, RemminaProtocolWidget *gp)
+{
+ TRACE_CALL(__func__);
+ RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp);
+ RemminaFile *remminafile;
+ RemminaPluginVncCoordinates coordinates;
+ gint mask;
+
+ if (!gpdata->connected || !gpdata->client)
+ return FALSE;
+ remminafile = remmina_plugin_service->protocol_plugin_get_file(gp);
+ if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE))
return FALSE;
- /* We bypass 2button-press and 3button-press events */
- if (gdk_event_get_event_type(event) != GDK_BUTTON_PRESS && gdk_event_get_event_type(event) != GDK_BUTTON_RELEASE)
- return TRUE;
- mask = (1 << (gdk_button_event_get_button(event) - 1));
- gpdata->button_mask = (gdk_event_get_event_type(event) == GDK_BUTTON_PRESS ? (gpdata->button_mask | mask) :
- (gpdata->button_mask & (0xff - mask)));
+ /* We only accept 3 buttons */
+ if (gtk_gesture_single_get_current_button(self) < 1 || gtk_gesture_single_get_current_button(self) > 3)
+ return FALSE;
+
+ mask = (1 << (gtk_gesture_single_get_current_button(self) - 1));
+ gpdata->button_mask = (gpdata->button_mask & (0xff - mask));
- double* x;
- double* y;
- gdk_event_get_position (event,x, y);
- coordinates = remmina_plugin_vnc_scale_coordinates(widget, gp, x, y);
+ coordinates = remmina_plugin_vnc_scale_coordinates(gpdata->drawing_area, gp, x, y);
remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
GINT_TO_POINTER(gpdata->button_mask));
return TRUE;
@@ -1484,7 +1512,7 @@ static gint delta_to_mask(float delta, float *accum, gint mask_plus, gint mask_m
return 0;
}
-static gboolean remmina_plugin_vnc_on_scroll(GtkWidget *widget, GdkScrollEvent *event, RemminaProtocolWidget *gp)
+static gboolean remmina_plugin_vnc_on_scroll(GtkWidget *widget, gdouble x, gdouble y, RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp);
@@ -1498,23 +1526,41 @@ static gboolean remmina_plugin_vnc_on_scroll(GtkWidget *widget, GdkScrollEvent *
if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE))
return FALSE;
- switch (gdk_scroll_event_get_direction(event)) {
- case GDK_SCROLL_UP:
- mask = (1 << 3);
- gpdata->scroll_y_accumulator = 0;
- break;
- case GDK_SCROLL_DOWN:
- mask = (1 << 4);
+ if (x > 0){
+ mask = (1 << 6);
gpdata->scroll_y_accumulator = 0;
- break;
- case GDK_SCROLL_LEFT:
+ }
+ else if (x < 0){
mask = (1 << 5);
+ gpdata->scroll_y_accumulator = 0;
+ }
+ if (y > 0){
+ mask = (1 << 3);
gpdata->scroll_x_accumulator = 0;
- break;
- case GDK_SCROLL_RIGHT:
- mask = (1 << 6);
+ }
+ else if (y < 0){
+ mask = (1 << 4);
gpdata->scroll_x_accumulator = 0;
- break;
+ }
+
+
+ // switch (gdk_scroll_event_get_direction(event)) {
+ // case GDK_SCROLL_UP:
+ // mask = (1 << 3);
+ // gpdata->scroll_y_accumulator = 0;
+ // break;
+ // case GDK_SCROLL_DOWN:
+ // mask = (1 << 4);
+ // gpdata->scroll_y_accumulator = 0;
+ // break;
+ // case GDK_SCROLL_LEFT:
+ // mask = (1 << 5);
+ // gpdata->scroll_x_accumulator = 0;
+ // break;
+ // case GDK_SCROLL_RIGHT:
+ // mask = (1 << 6);
+ // gpdata->scroll_x_accumulator = 0;
+ // break;
// #if GTK_CHECK_VERSION(3, 4, 0)
// case GDK_SCROLL_SMOOTH:
// /* RFB does not seems to support SMOOTH scroll, so we accumulate GTK delta requested
@@ -1525,19 +1571,20 @@ static gboolean remmina_plugin_vnc_on_scroll(GtkWidget *widget, GdkScrollEvent *
// return FALSE;
// break;
// #endif
- default:
- return FALSE;
- }
+ // default:
+ // return FALSE;
+ // }
- double* x;
- double* y;
- gdk_event_get_position (event,x, y);
- coordinates = remmina_plugin_vnc_scale_coordinates(widget, gp, x, y);
- remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
- GINT_TO_POINTER(mask | gpdata->button_mask));
- remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
- GINT_TO_POINTER(gpdata->button_mask));
+ coordinates = remmina_plugin_vnc_scale_coordinates(gpdata->drawing_area, gp, x, y);
+ // remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_SCROLL, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
+ // GINT_TO_POINTER(mask | gpdata->button_mask));
+ // remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_SCROLL, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
+ // GINT_TO_POINTER(mask));
+ remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_SCROLL, GINT_TO_POINTER(x), GINT_TO_POINTER(y),
+ GINT_TO_POINTER(mask));
+ remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_SCROLL, GINT_TO_POINTER(coordinates.x), GINT_TO_POINTER(coordinates.y),
+ GINT_TO_POINTER(0));
return TRUE;
}
@@ -1574,14 +1621,13 @@ static void remmina_plugin_vnc_release_key(RemminaProtocolWidget *gp, guint16 ke
}
}
-static gboolean remmina_plugin_vnc_on_key(GtkWidget *widget, GdkKeyEvent *event, RemminaProtocolWidget *gp)
+static gboolean remmina_plugin_vnc_on_key_press(GtkWidget *widget, guint keyval, guint keycode, GdkModifierType state, RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp);
RemminaFile *remminafile;
RemminaKeyVal *k;
- guint event_keyval;
- guint keyval;
+ guint event_keyval = keyval;
if (!gpdata->connected || !gpdata->client)
return FALSE;
@@ -1592,35 +1638,55 @@ static gboolean remmina_plugin_vnc_on_key(GtkWidget *widget, GdkKeyEvent *event,
gpdata->scroll_x_accumulator = 0;
gpdata->scroll_y_accumulator = 0;
- /* When sending key release, try first to find out a previously sent keyval
- * to workaround bugs like https://bugs.freedesktop.org/show_bug.cgi?id=7430 */
+ keyval = remmina_plugin_service->pref_keymap_get_keyval(remmina_plugin_service->file_get_string(remminafile, "keymap"),
+ event_keyval);
- event_keyval = gdk_key_event_get_keyval(event);
- if (gdk_event_get_event_type(event) == GDK_KEY_RELEASE) {
- for (int i = 0; i < gpdata->pressed_keys->len; i++) {
- k = g_ptr_array_index(gpdata->pressed_keys, i);
- if (k->keycode == gdk_key_event_get_keycode(event)) {
- event_keyval = k->keyval;
- break;
- }
+ remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_KEY, GUINT_TO_POINTER(keyval), TRUE, NULL);
+
+ /* Register/unregister the pressed key */
+
+ k = g_new(RemminaKeyVal, 1);
+ k->keyval = keyval;
+ k->keycode = keycode;
+ g_ptr_array_add(gpdata->pressed_keys, k);
+
+ return TRUE;
+}
+
+static gboolean remmina_plugin_vnc_on_key_release(GtkWidget *widget, guint keyval, guint keycode, GdkModifierType state, RemminaProtocolWidget *gp)
+{
+ TRACE_CALL(__func__);
+ RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp);
+ RemminaFile *remminafile;
+ RemminaKeyVal *k;
+ guint event_keyval = keyval;
+
+ if (!gpdata->connected || !gpdata->client)
+ return FALSE;
+ remminafile = remmina_plugin_service->protocol_plugin_get_file(gp);
+ if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE))
+ return FALSE;
+
+ gpdata->scroll_x_accumulator = 0;
+ gpdata->scroll_y_accumulator = 0;
+
+ for (int i = 0; i < gpdata->pressed_keys->len; i++) {
+ k = g_ptr_array_index(gpdata->pressed_keys, i);
+ if (k->keycode == keycode) {
+ event_keyval = k->keyval;
+ break;
}
}
keyval = remmina_plugin_service->pref_keymap_get_keyval(remmina_plugin_service->file_get_string(remminafile, "keymap"),
event_keyval);
- remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_KEY, GUINT_TO_POINTER(keyval),
- GINT_TO_POINTER(gdk_event_get_event_type(event) == GDK_KEY_PRESS ? TRUE : FALSE), NULL);
+ remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_KEY, GUINT_TO_POINTER(keyval), FALSE, NULL);
/* Register/unregister the pressed key */
- if (gdk_event_get_event_type(event) == GDK_KEY_PRESS) {
- k = g_new(RemminaKeyVal, 1);
- k->keyval = keyval;
- k->keycode = gdk_key_event_get_keycode(event);
- g_ptr_array_add(gpdata->pressed_keys, k);
- } else {
- remmina_plugin_vnc_release_key(gp, gdk_key_event_get_keycode(event));
- }
+
+ remmina_plugin_vnc_release_key(gp, keycode);
+
return TRUE;
}
@@ -1703,12 +1769,31 @@ static gboolean remmina_plugin_vnc_open_connection(RemminaProtocolWidget *gp)
remmina_plugin_service->protocol_plugin_register_hostkey(gp, gpdata->drawing_area);
g_signal_connect(G_OBJECT(gp), "realize", G_CALLBACK(remmina_plugin_vnc_on_realize), NULL);
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "motion-notify-event", G_CALLBACK(remmina_plugin_vnc_on_motion), gp);
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "button-press-event", G_CALLBACK(remmina_plugin_vnc_on_button), gp);
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "button-release-event", G_CALLBACK(remmina_plugin_vnc_on_button), gp);
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "scroll-event", G_CALLBACK(remmina_plugin_vnc_on_scroll), gp);
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "key-press-event", G_CALLBACK(remmina_plugin_vnc_on_key), gp);
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "key-release-event", G_CALLBACK(remmina_plugin_vnc_on_key), gp);
+
+
+ gtk_widget_set_focusable(GTK_WIDGET(gpdata->drawing_area), TRUE);
+ GtkGesture *gesture = gtk_gesture_click_new();
+ gtk_gesture_single_set_button(gesture, 0);
+ g_signal_connect (gesture, "pressed", G_CALLBACK (remmina_plugin_vnc_on_button_press), gp);
+ g_signal_connect (gesture, "released", G_CALLBACK (remmina_plugin_vnc_on_button_release), gp);
+ gtk_event_controller_set_propagation_phase(gesture, GTK_PHASE_TARGET);
+ gtk_widget_add_controller(gpdata->drawing_area, GTK_EVENT_CONTROLLER (gesture));
+
+
+ GtkEventControllerMotion* motion_event_controller = gtk_event_controller_motion_new();
+ gtk_widget_add_controller(G_OBJECT(gpdata->drawing_area), motion_event_controller);
+ g_signal_connect(motion_event_controller, "motion", G_CALLBACK(remmina_plugin_vnc_on_motion), gp);
+
+ GtkEventControllerScroll* scroll_event_controller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES );
+ gtk_widget_add_controller(G_OBJECT(gpdata->drawing_area), scroll_event_controller);
+ g_signal_connect(scroll_event_controller, "scroll", G_CALLBACK(remmina_plugin_vnc_on_scroll), gp);
+
+ GtkEventControllerKey* key_event_controller = gtk_event_controller_key_new();
+ gtk_widget_add_controller(G_OBJECT(gpdata->drawing_area), key_event_controller);
+ g_signal_connect(key_event_controller, "key-pressed", G_CALLBACK(remmina_plugin_vnc_on_key_press), gp);
+ g_signal_connect(key_event_controller, "key-released", G_CALLBACK(remmina_plugin_vnc_on_key_release), gp);
+
+
//if (!remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE))
// gpdata->clipboard_handler = g_signal_connect(G_OBJECT(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)),
@@ -1932,12 +2017,11 @@ static gboolean remmina_plugin_vnc_on_size_allocate(GtkWidget *widget, GtkAlloca
}
#endif
-static gboolean remmina_plugin_vnc_on_draw(GtkWidget *widget, cairo_t *context, RemminaProtocolWidget *gp)
+static gboolean remmina_plugin_vnc_on_draw(GtkWidget *widget, cairo_t *context, int width, int height, RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp);
cairo_surface_t *surface;
- gint width, height;
GtkAllocation widget_allocation;
LOCK_BUFFER(FALSE);
@@ -1983,14 +2067,20 @@ static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
gpdata->drawing_area = gtk_drawing_area_new();
gtk_widget_show(gpdata->drawing_area);
+ gtk_widget_set_hexpand(gpdata->drawing_area, TRUE);
+ gtk_widget_set_vexpand(gpdata->drawing_area, TRUE);
gtk_box_append((gp), gpdata->drawing_area);
-
+ g_object_set_data_full(G_OBJECT(gp), "child_plugin", gpdata->drawing_area, g_free);
+
// gtk_widget_add_events(
// gpdata->drawing_area,
// GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK
// | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK
// | GDK_KEY_RELEASE_MASK
// | GDK_SCROLL_MASK); TODO GTK4
+
+
+
gtk_widget_set_can_focus(gpdata->drawing_area, TRUE);
if (!disable_smooth_scrolling) {
@@ -1999,9 +2089,11 @@ static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
}
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "draw", G_CALLBACK(remmina_plugin_vnc_on_draw), gp);
+ gtk_drawing_area_set_draw_func(gpdata->drawing_area, remmina_plugin_vnc_on_draw, gp, NULL);
+
+
#if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14)
- g_signal_connect(G_OBJECT(gpdata->drawing_area), "size-allocate", G_CALLBACK(remmina_plugin_vnc_on_size_allocate), gp);
+ //g_signal_connect(G_OBJECT(gpdata->drawing_area), "resize", G_CALLBACK(remmina_plugin_vnc_on_size_allocate), gp);
#endif
gpdata->auth_first = TRUE;
gpdata->clipboard_timer = g_date_time_new_now_utc();
diff --git a/plugins/vnc/vnc_plugin.h b/plugins/vnc/vnc_plugin.h
index a0a1732d9..0e13ecf19 100644
--- a/plugins/vnc/vnc_plugin.h
+++ b/plugins/vnc/vnc_plugin.h
@@ -122,6 +122,7 @@ typedef struct _RemminaPluginVncData {
enum {
REMMINA_PLUGIN_VNC_EVENT_KEY,
REMMINA_PLUGIN_VNC_EVENT_POINTER,
+ REMMINA_PLUGIN_VNC_EVENT_SCROLL,
REMMINA_PLUGIN_VNC_EVENT_CUTTEXT,
REMMINA_PLUGIN_VNC_EVENT_CHAT_OPEN,
REMMINA_PLUGIN_VNC_EVENT_CHAT_SEND,
diff --git a/src/rcw.c b/src/rcw.c
index 2ff1796ad..68d18e9d0 100644
--- a/src/rcw.c
+++ b/src/rcw.c
@@ -982,6 +982,8 @@ static GtkWidget *rco_create_scrolled_container(RemminaScaleMode scalemode, int
scrolled_container = gtk_scrolled_window_new();
rco_set_scrolled_policy(scalemode, GTK_SCROLLED_WINDOW(scrolled_container));
//gtk_container_set_border_width(GTK_CONTAINER(scrolled_container), 0);
+ gtk_widget_set_vexpand(scrolled_container, TRUE);
+ gtk_widget_set_hexpand(scrolled_container, TRUE);
gtk_widget_set_focusable(scrolled_container, FALSE);
}
@@ -1231,14 +1233,18 @@ static void remmina_protocol_widget_update_alignment(RemminaConnectionObject *cn
//gtk_frame_set_shadow_type(GTK_FRAME(cnnobj->aspectframe), GTK_SHADOW_NONE); TODO GTK4
g_object_ref(cnnobj->proto);
//gtk_container_remove(GTK_CONTAINER(cnnobj->viewport), cnnobj->proto);
- gtk_box_append(GTK_BOX(cnnobj->viewport), cnnobj->aspectframe);
- gtk_box_append(GTK_BOX(cnnobj->aspectframe), cnnobj->proto);
+ gtk_viewport_set_child((cnnobj->viewport), cnnobj->aspectframe);
+ gtk_aspect_frame_set_child((cnnobj->aspectframe), cnnobj->proto);
g_object_unref(cnnobj->proto);
gtk_widget_show(cnnobj->aspectframe);
if (cnnobj != NULL && cnnobj->cnnwin != NULL && cnnobj->cnnwin->priv->notebook != NULL)
rcw_grab_focus(cnnobj->cnnwin);
} else {
//gtk_aspect_frame_set(GTK_ASPECT_FRAME(cnnobj->aspectframe), 0.5, 0.5, aratio, FALSE); TODO GTK4
+ gtk_aspect_frame_set_xalign(cnnobj->aspectframe, 0.5);
+ gtk_aspect_frame_set_yalign(cnnobj->aspectframe, 0.5);
+ gtk_aspect_frame_set_ratio(cnnobj->aspectframe, aratio);
+ gtk_aspect_frame_set_obey_child(cnnobj->aspectframe, FALSE);
}
} else {
/* We do not need an aspectframe as a parent of proto */
@@ -1250,7 +1256,7 @@ static void remmina_protocol_widget_update_alignment(RemminaConnectionObject *cn
//gtk_container_remove(GTK_CONTAINER(cnnobj->viewport), cnnobj->aspectframe);
g_object_unref(cnnobj->aspectframe);
cnnobj->aspectframe = NULL;
- gtk_box_append(GTK_BOX(cnnobj->viewport), cnnobj->proto);
+ gtk_viewport_set_child((cnnobj->viewport), cnnobj->proto);
g_object_unref(cnnobj->proto);
if (cnnobj != NULL && cnnobj->cnnwin != NULL && cnnobj->cnnwin->priv->notebook != NULL)
rcw_grab_focus(cnnobj->cnnwin);
diff --git a/src/remmina_protocol_widget.c b/src/remmina_protocol_widget.c
index 84a2a0e2e..59c4af119 100644
--- a/src/remmina_protocol_widget.c
+++ b/src/remmina_protocol_widget.c
@@ -218,7 +218,7 @@ void remmina_protocol_widget_grab_focus(RemminaProtocolWidget *gp)
TRACE_CALL(__func__);
GtkWidget *child;
- //child = gtk_bin_get_child(GTK_BIN(gp));
+ child = g_object_get_data((gp), "child_plugin");
if (child) {
gtk_widget_set_can_focus(child, TRUE);