diff options
-rw-r--r-- | plugins/rdp/rdp_event.c | 50 | ||||
-rw-r--r-- | plugins/rdp/rdp_plugin.c | 223 | ||||
-rw-r--r-- | plugins/rdp/rdp_settings.c | 157 | ||||
-rw-r--r-- | plugins/vnc/vnc_plugin.c | 161 |
4 files changed, 324 insertions, 267 deletions
diff --git a/plugins/rdp/rdp_event.c b/plugins/rdp/rdp_event.c index 181abc948..7f5d8fd4b 100644 --- a/plugins/rdp/rdp_event.c +++ b/plugins/rdp/rdp_event.c @@ -48,8 +48,8 @@ gboolean remmina_rdp_event_on_map(RemminaProtocolWidget *gp) { TRACE_CALL(__func__); - rfContext* rfi = GET_PLUGIN_DATA(gp); - rdpGdi* gdi; + rfContext *rfi = GET_PLUGIN_DATA(gp); + rdpGdi *gdi; if (rfi == NULL) return false; @@ -65,14 +65,15 @@ gboolean remmina_rdp_event_on_map(RemminaProtocolWidget *gp) gboolean remmina_rdp_event_on_unmap(RemminaProtocolWidget *gp) { TRACE_CALL(__func__); - rfContext* rfi = GET_PLUGIN_DATA(gp); - rdpGdi* gdi; + rfContext *rfi = GET_PLUGIN_DATA(gp); + rdpGdi *gdi; if (rfi == NULL) return false; GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(gp)); GdkWindow *window = gtk_widget_get_window(toplevel); + if (gdk_window_get_fullscreen_mode(window) == GDK_FULLSCREEN_ON_ALL_MONITORS) { REMMINA_PLUGIN_DEBUG("Unmap event received, but cannot enable TS_SUPPRESS_OUTPUT_PDU when in fullscreen"); return FALSE; @@ -203,6 +204,7 @@ static void keypress_list_add(RemminaProtocolWidget *gp, RemminaPluginRdpEvent r { TRACE_CALL(__func__); rfContext *rfi = GET_PLUGIN_DATA(gp); + if (!rdp_event.key_event.key_code) return; @@ -210,7 +212,6 @@ static void keypress_list_add(RemminaProtocolWidget *gp, RemminaPluginRdpEvent r remmina_rdp_event_release_key(gp, rdp_event); else g_array_append_val(rfi->pressed_keys, rdp_event); - } @@ -393,6 +394,7 @@ static gboolean remmina_rdp_event_delayed_monitor_layout(RemminaProtocolWidget * gchar *monitorids = NULL; guint32 maxwidth = 0; guint32 maxheight = 0; + remmina_rdp_monitor_get(rfi, &monitorids, &maxwidth, &maxheight); REMMINA_PLUGIN_DEBUG("Sending preconfigured monitor layout"); @@ -414,9 +416,9 @@ static gboolean remmina_rdp_event_delayed_monitor_layout(RemminaProtocolWidget * } rdp_event.type = REMMINA_RDP_EVENT_TYPE_SEND_MONITOR_LAYOUT; if (remmina_plugin_service->file_get_int(remminafile, "multimon", FALSE)) { - const rdpMonitor* base = freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); + const rdpMonitor *base = freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); for (gint i = 0; i < freerdp_settings_get_uint32(rfi->settings, FreeRDP_MonitorCount); ++i) { - const rdpMonitor* current = &base[i]; + const rdpMonitor *current = &base[i]; REMMINA_PLUGIN_DEBUG("Sending display layout n° %d", i); rdp_event.monitor_layout.Flags = current->is_primary; REMMINA_PLUGIN_DEBUG("EVNT MON LAYOUT - Flags: %i", rdp_event.monitor_layout.Flags); @@ -443,7 +445,6 @@ static gboolean remmina_rdp_event_delayed_monitor_layout(RemminaProtocolWidget * } remmina_rdp_event_event_push(gp, &rdp_event); } else { - rdp_event.monitor_layout.width = gpwidth; rdp_event.monitor_layout.height = gpheight; rdp_event.monitor_layout.desktopOrientation = desktopOrientation; @@ -463,6 +464,7 @@ void remmina_rdp_event_send_delayed_monitor_layout(RemminaProtocolWidget *gp) { TRACE_CALL(__func__); rfContext *rfi = GET_PLUGIN_DATA(gp); + if (!rfi || !rfi->connected || rfi->is_reconnecting) return; if (rfi->delayed_monitor_layout_handler) { @@ -471,7 +473,6 @@ void remmina_rdp_event_send_delayed_monitor_layout(RemminaProtocolWidget *gp) } if (rfi->scale == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_DYNRES) rfi->delayed_monitor_layout_handler = g_timeout_add(500, (GSourceFunc)remmina_rdp_event_delayed_monitor_layout, gp); - } static gboolean remmina_rdp_event_on_configure(GtkWidget *widget, GdkEventConfigure *event, RemminaProtocolWidget *gp) @@ -480,6 +481,7 @@ static gboolean remmina_rdp_event_on_configure(GtkWidget *widget, GdkEventConfig /* Called when gp changes its size or position */ rfContext *rfi = GET_PLUGIN_DATA(gp); + if (!rfi || !rfi->connected || rfi->is_reconnecting) return FALSE; @@ -822,6 +824,7 @@ gboolean remmina_rdp_event_on_clipboard(GtkClipboard *gtkClipboard, GdkEvent *ev REMMINA_PLUGIN_DEBUG("owner-change event received"); rfContext *rfi = GET_PLUGIN_DATA(gp); + if (rfi) remmina_rdp_clipboard_abort_transfer(rfi); @@ -850,9 +853,20 @@ void remmina_rdp_event_init(RemminaProtocolWidget *gp) GtkClipboard *clipboard; RemminaFile *remminafile; + gboolean disable_smooth_scrolling = FALSE; + if (!rfi) return; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); + /* we get first the global preferences */ + s = remmina_plugin_service->pref_get_value("rdp_disable_smooth_scrolling"); + disable_smooth_scrolling = (s && s[0] == '1' ? TRUE : FALSE); + g_free(s), s = NULL; + /* Otherwise we use the connection profile specific setting */ + disable_smooth_scrolling = remmina_plugin_service->file_get_int(remminafile, "disable-smooth-scrolling", disable_smooth_scrolling); + + REMMINA_PLUGIN_DEBUG("Disable smooth scrolling is set to %d", disable_smooth_scrolling); + rfi->drawing_area = gtk_drawing_area_new(); gtk_widget_show(rfi->drawing_area); gtk_container_add(GTK_CONTAINER(gp), rfi->drawing_area); @@ -860,23 +874,26 @@ void remmina_rdp_event_init(RemminaProtocolWidget *gp) gtk_widget_add_events(rfi->drawing_area, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK -#if GTK_CHECK_VERSION(3, 4, 0) - | GDK_SMOOTH_SCROLL_MASK -#endif | GDK_SCROLL_MASK | GDK_FOCUS_CHANGE_MASK); + + if (!disable_smooth_scrolling) { + REMMINA_PLUGIN_DEBUG("Adding GDK_SMOOTH_SCROLL_MASK"); + gtk_widget_add_events(rfi->drawing_area, GDK_SMOOTH_SCROLL_MASK); + } + gtk_widget_set_can_focus(rfi->drawing_area, TRUE); remmina_plugin_service->protocol_plugin_register_hostkey(gp, rfi->drawing_area); s = remmina_plugin_service->pref_get_value("rdp_use_client_keymap"); rfi->use_client_keymap = (s && s[0] == '1' ? TRUE : FALSE); - g_free(s); + g_free(s), s = NULL; /* Read special keymap from profile file, if exists */ remmina_rdp_event_init_keymap(rfi, remmina_plugin_service->pref_get_value("rdp_map_keycode")); if (rfi->use_client_keymap && rfi->keymap) - fprintf(stderr, "RDP profile error: you cannot define both rdp_map_hardware_keycode and have 'Use client keuboard mapping' enabled\n"); + fprintf(stderr, "RDP profile error: you cannot define both rdp_map_hardware_keycode and have 'Use client keyboard mapping' enabled\n"); g_signal_connect(G_OBJECT(rfi->drawing_area), "draw", G_CALLBACK(remmina_rdp_event_on_draw), gp); @@ -1097,6 +1114,7 @@ static void remmina_rdp_event_reconnect_progress(RemminaProtocolWidget *gp, Remm { TRACE_CALL(__func__); rfContext *rfi = GET_PLUGIN_DATA(gp); + gdk_window_invalidate_rect(gtk_widget_get_window(rfi->drawing_area), NULL, TRUE); } @@ -1141,6 +1159,7 @@ static BOOL remmina_rdp_event_set_pointer_position(RemminaProtocolWidget *gp, gi TRACE_CALL(__func__); GdkWindow *w, *nw; gint nx, ny, wx, wy; + #if GTK_CHECK_VERSION(3, 20, 0) GdkSeat *seat; #else @@ -1230,6 +1249,7 @@ static void remmina_rdp_ui_event_destroy_cairo_surface(RemminaProtocolWidget *gp { TRACE_CALL(__func__); rfContext *rfi = GET_PLUGIN_DATA(gp); + cairo_surface_destroy(rfi->surface); rfi->surface = NULL; } @@ -1369,6 +1389,7 @@ int remmina_rdp_event_queue_ui_sync_retint(RemminaProtocolWidget *gp, RemminaPlu { TRACE_CALL(__func__); int retval; + ui->sync = TRUE; remmina_rdp_event_queue_ui(gp, ui); retval = ui->retval; @@ -1380,6 +1401,7 @@ void *remmina_rdp_event_queue_ui_sync_retptr(RemminaProtocolWidget *gp, RemminaP { TRACE_CALL(__func__); void *rp; + ui->sync = TRUE; remmina_rdp_event_queue_ui(gp, ui); rp = ui->retptr; diff --git a/plugins/rdp/rdp_plugin.c b/plugins/rdp/rdp_plugin.c index 08e534111..0c1557d06 100644 --- a/plugins/rdp/rdp_plugin.c +++ b/plugins/rdp/rdp_plugin.c @@ -261,9 +261,9 @@ static BOOL rf_process_event_queue(RemminaProtocolWidget *gp) if (!dcml) break; - const rdpMonitor* base = freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); + const rdpMonitor *base = freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); for (gint i = 0; i < freerdp_settings_get_uint32(rfi->settings, FreeRDP_MonitorCount); ++i) { - const rdpMonitor* current = &base[i]; + const rdpMonitor *current = &base[i]; REMMINA_PLUGIN_DEBUG("Sending display layout for monitor n° %d", i); dcml[i].Flags = (current->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0); REMMINA_PLUGIN_DEBUG("Monitor %d is primary: %d", i, dcml[i].Flags); @@ -299,7 +299,7 @@ static BOOL rf_process_event_queue(RemminaProtocolWidget *gp) dcml->DesktopScaleFactor = event->monitor_layout.desktopScaleFactor; dcml->DeviceScaleFactor = event->monitor_layout.deviceScaleFactor; rfi->dispcontext->SendMonitorLayout(rfi->dispcontext, 1, dcml); - g_free(dcml);\ + g_free(dcml); \ } } break; @@ -332,6 +332,7 @@ static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp) gint port; rfContext *rfi = GET_PLUGIN_DATA(gp); + REMMINA_PLUGIN_DEBUG("Tunnel init"); hostport = remmina_plugin_service->protocol_plugin_start_direct_tunnel(gp, 3389, FALSE); if (hostport == NULL) @@ -386,15 +387,15 @@ BOOL rf_auto_reconnect(rfContext *rfi) /* Only auto reconnect on network disconnects. */ switch (freerdp_error_info(rfi->instance)) { - case ERRINFO_GRAPHICS_SUBSYSTEM_FAILED: - /* Disconnected by server hitting a bug or resource limit */ - break; - case ERRINFO_SUCCESS: - /* A network disconnect was detected */ - break; - default: - rfi->is_reconnecting = FALSE; - return FALSE; + case ERRINFO_GRAPHICS_SUBSYSTEM_FAILED: + /* Disconnected by server hitting a bug or resource limit */ + break; + case ERRINFO_SUCCESS: + /* A network disconnect was detected */ + break; + default: + rfi->is_reconnecting = FALSE; + return FALSE; } if (!freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled)) { @@ -405,7 +406,7 @@ BOOL rf_auto_reconnect(rfContext *rfi) /* A network disconnect was detected and we should try to reconnect */ REMMINA_PLUGIN_DEBUG("[%s] network disconnection detected, initiating reconnection attempt", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_RECONNECT_PROGRESS; @@ -423,13 +424,13 @@ BOOL rf_auto_reconnect(rfContext *rfi) /* Quit retrying if max retries has been exceeded */ if (rfi->reconnect_nattempt++ >= rfi->reconnect_maxattempts) { REMMINA_PLUGIN_DEBUG("[%s] maximum number of reconnection attempts exceeded.", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); break; } /* Attempt the next reconnect */ REMMINA_PLUGIN_DEBUG("[%s] reconnection, attempt #%d of %d", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname), rfi->reconnect_nattempt, rfi->reconnect_maxattempts); + freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname), rfi->reconnect_nattempt, rfi->reconnect_maxattempts); ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_RECONNECT_PROGRESS; @@ -440,7 +441,7 @@ BOOL rf_auto_reconnect(rfContext *rfi) /* Reconnect the SSH tunnel, if needed */ if (!remmina_rdp_tunnel_init(rfi->protocol_widget)) { REMMINA_PLUGIN_DEBUG("[%s] unable to recreate tunnel with remmina_rdp_tunnel_init.", - freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); + freerdp_settings_get_string(rfi->settings, FreeRDP_ServerHostname)); } else { if (freerdp_reconnect(rfi->instance)) { /* Reconnection is successful */ @@ -617,9 +618,9 @@ BOOL rf_keyboard_set_ime_status(rdpContext *context, UINT16 imeId, UINT32 imeSta static BOOL remmina_rdp_pre_connect(freerdp *instance) { TRACE_CALL(__func__); - rdpChannels* channels; + rdpChannels *channels; rdpSettings *settings; - rdpContext* context = instance->context; + rdpContext *context = instance->context; settings = instance->settings; channels = context->channels; @@ -631,9 +632,9 @@ static BOOL remmina_rdp_pre_connect(freerdp *instance) PubSub_SubscribeChannelConnected(instance->context->pubSub, (pChannelConnectedEventHandler)remmina_rdp_OnChannelConnectedEventHandler); PubSub_SubscribeChannelDisconnected(instance->context->pubSub, - (pChannelDisconnectedEventHandler)remmina_rdp_OnChannelDisconnectedEventHandler); + (pChannelDisconnectedEventHandler)remmina_rdp_OnChannelDisconnectedEventHandler); - if(!freerdp_client_load_addins(channels, settings)) + if (!freerdp_client_load_addins(channels, settings)) return FALSE; return True; @@ -662,25 +663,25 @@ static BOOL remmina_rdp_post_connect(freerdp *instance) REMMINA_PLUGIN_DEBUG("bpp: %d", rfi->bpp); switch (rfi->bpp) { - case 24: - REMMINA_PLUGIN_DEBUG("CAIRO_FORMAT_RGB24"); - freerdp_local_color_format = PIXEL_FORMAT_BGRX32; - rfi->cairo_format = CAIRO_FORMAT_RGB24; - break; - case 32: - /** Do not use alpha as it's not used with the desktop - * CAIRO_FORMAT_ARGB32 - * See https://gitlab.com/Remmina/Remmina/-/issues/2456 - */ - REMMINA_PLUGIN_DEBUG("CAIRO_FORMAT_RGB24"); - freerdp_local_color_format = PIXEL_FORMAT_BGRA32; - rfi->cairo_format = CAIRO_FORMAT_RGB24; - break; - default: - REMMINA_PLUGIN_DEBUG("CAIRO_FORMAT_RGB16_565"); - freerdp_local_color_format = PIXEL_FORMAT_RGB16; - rfi->cairo_format = CAIRO_FORMAT_RGB16_565; - break; + case 24: + REMMINA_PLUGIN_DEBUG("CAIRO_FORMAT_RGB24"); + freerdp_local_color_format = PIXEL_FORMAT_BGRX32; + rfi->cairo_format = CAIRO_FORMAT_RGB24; + break; + case 32: + /** Do not use alpha as it's not used with the desktop + * CAIRO_FORMAT_ARGB32 + * See https://gitlab.com/Remmina/Remmina/-/issues/2456 + */ + REMMINA_PLUGIN_DEBUG("CAIRO_FORMAT_RGB24"); + freerdp_local_color_format = PIXEL_FORMAT_BGRA32; + rfi->cairo_format = CAIRO_FORMAT_RGB24; + break; + default: + REMMINA_PLUGIN_DEBUG("CAIRO_FORMAT_RGB16_565"); + freerdp_local_color_format = PIXEL_FORMAT_RGB16; + rfi->cairo_format = CAIRO_FORMAT_RGB16_565; + break; } if (!gdi_init(instance, freerdp_local_color_format)) { @@ -854,8 +855,8 @@ static BOOL remmina_rdp_gw_authenticate(freerdp *instance, char **username, char } static DWORD remmina_rdp_verify_certificate_ex(freerdp *instance, const char *host, UINT16 port, - const char *common_name, const char *subject, - const char *issuer, const char *fingerprint, DWORD flags) + const char *common_name, const char *subject, + const char *issuer, const char *fingerprint, DWORD flags) { TRACE_CALL(__func__); gint status; @@ -874,11 +875,10 @@ static DWORD remmina_rdp_verify_certificate_ex(freerdp *instance, const char *ho } static DWORD -remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const char *subject, - const char *issuer, const char *fingerprint, BOOL host_mismatch) __attribute__ ((unused)); +remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const char *subject, const char *issuer, const char *fingerprint, BOOL host_mismatch) __attribute__ ((unused)); static DWORD remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const char *subject, - const char *issuer, const char *fingerprint, BOOL host_mismatch) + const char *issuer, const char *fingerprint, BOOL host_mismatch) { TRACE_CALL(__func__); gint status; @@ -897,10 +897,10 @@ remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const } static DWORD remmina_rdp_verify_changed_certificate_ex(freerdp *instance, const char *host, UINT16 port, - const char *common_name, const char *subject, - const char *issuer, const char *fingerprint, - const char *old_subject, const char *old_issuer, - const char *old_fingerprint, DWORD flags) + const char *common_name, const char *subject, + const char *issuer, const char *fingerprint, + const char *old_subject, const char *old_issuer, + const char *old_fingerprint, DWORD flags) { TRACE_CALL(__func__); gint status; @@ -928,7 +928,7 @@ static void remmina_rdp_post_disconnect(freerdp *instance) PubSub_UnsubscribeChannelConnected(instance->context->pubSub, (pChannelConnectedEventHandler)remmina_rdp_OnChannelConnectedEventHandler); PubSub_UnsubscribeChannelDisconnected(instance->context->pubSub, - (pChannelDisconnectedEventHandler)remmina_rdp_OnChannelDisconnectedEventHandler); + (pChannelDisconnectedEventHandler)remmina_rdp_OnChannelDisconnectedEventHandler); /* The remaining cleanup will be continued on main thread by complete_cleanup_on_main_thread() */ } @@ -996,6 +996,7 @@ int remmina_rdp_load_static_channel_addin(rdpChannels *channels, rdpSettings *se TRACE_CALL(__func__); PVIRTUALCHANNELENTRY entry = NULL; PVIRTUALCHANNELENTRYEX entryEx = NULL; + entryEx = (PVIRTUALCHANNELENTRYEX)(void *)freerdp_load_channel_addin_entry( name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC | FREERDP_ADDIN_CHANNEL_ENTRYEX); @@ -1024,11 +1025,11 @@ gchar *remmina_rdp_find_prdriver(char *smap, char *prn) size_t sz; enum { S_WAITPR, - S_INPRINTER, - S_WAITCOLON, - S_WAITDRIVER, - S_INDRIVER, - S_WAITSEMICOLON } state = S_WAITPR; + S_INPRINTER, + S_WAITCOLON, + S_WAITDRIVER, + S_INDRIVER, + S_WAITSEMICOLON } state = S_WAITPR; matching = 0; while ((c = *smap++) != 0) { @@ -1118,6 +1119,7 @@ int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t *dest) const gchar *s = remmina_plugin_service->file_get_string(remminafile, "printer_overrides"); RDPDR_PRINTER *printer; + printer = (RDPDR_PRINTER *)calloc(1, sizeof(RDPDR_PRINTER)); printer->Type = RDPDR_DTYP_PRINT; @@ -1270,15 +1272,14 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); datapath = g_build_path("/", - remmina_plugin_service->file_get_user_datadir(), - "RDP", - NULL); + remmina_plugin_service->file_get_user_datadir(), + "RDP", + NULL); REMMINA_PLUGIN_DEBUG("RDP data path is %s", datapath); - if ((datapath != NULL) && (datapath[0] != '\0')) { + if ((datapath != NULL) && (datapath[0] != '\0')) if (access(datapath, W_OK) == 0) freerdp_settings_set_string(rfi->settings, FreeRDP_ConfigPath, datapath); - } g_free(datapath); #if defined(PROXY_TYPE_IGNORE) @@ -1296,7 +1297,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) if (remmina_plugin_service->file_get_int(remminafile, "ssh_tunnel_enabled", FALSE)) freerdp_settings_set_bool(rfi->settings, FreeRDP_AutoReconnectionEnabled, FALSE); - freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth,remmina_plugin_service->file_get_int(remminafile, "colordepth", 99)); + freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, remmina_plugin_service->file_get_int(remminafile, "colordepth", 99)); freerdp_settings_set_bool(rfi->settings, FreeRDP_SoftwareGdi, TRUE); REMMINA_PLUGIN_DEBUG("gfx_h264_available: %d", gfx_h264_available); @@ -1345,8 +1346,8 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) } if (freerdp_settings_get_bool(rfi->settings, FreeRDP_RemoteFxCodec) || - freerdp_settings_get_bool(rfi->settings, FreeRDP_NSCodec) || - freerdp_settings_get_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline) ) { + freerdp_settings_get_bool(rfi->settings, FreeRDP_NSCodec) || + freerdp_settings_get_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline)) { freerdp_settings_set_bool(rfi->settings, FreeRDP_FastPathOutput, TRUE); freerdp_settings_set_bool(rfi->settings, FreeRDP_FrameMarkerCommandEnabled, TRUE); freerdp_settings_set_uint32(rfi->settings, FreeRDP_ColorDepth, 32); @@ -1360,21 +1361,21 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) h = (h + 3) & ~0x3; freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopWidth, w); freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopHeight, h); - REMMINA_PLUGIN_DEBUG ("Resolution set by the user: %dx%d", w, h); + REMMINA_PLUGIN_DEBUG("Resolution set by the user: %dx%d", w, h); /* Workaround for FreeRDP issue #5417: in GFX AVC modes we can't go under * AVC_MIN_DESKTOP_WIDTH x AVC_MIN_DESKTOP_HEIGHT */ if (freerdp_settings_get_bool(rfi->settings, FreeRDP_SupportGraphicsPipeline) && - freerdp_settings_get_bool(rfi->settings, FreeRDP_GfxH264)) { + freerdp_settings_get_bool(rfi->settings, FreeRDP_GfxH264)) { if (freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth) < - AVC_MIN_DESKTOP_WIDTH) + AVC_MIN_DESKTOP_WIDTH) freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopWidth, - AVC_MIN_DESKTOP_WIDTH); + AVC_MIN_DESKTOP_WIDTH); if (freerdp_settings_get_uint32(rfi->settings, - FreeRDP_DesktopHeight) < - AVC_MIN_DESKTOP_HEIGHT) + FreeRDP_DesktopHeight) < + AVC_MIN_DESKTOP_HEIGHT) freerdp_settings_set_uint32(rfi->settings, FreeRDP_DesktopHeight, - AVC_MIN_DESKTOP_HEIGHT); + AVC_MIN_DESKTOP_HEIGHT); } /* Workaround for FreeRDP issue #5119. This will make our horizontal resolution @@ -1390,7 +1391,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) w = freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopWidth); h = freerdp_settings_get_uint32(rfi->settings, FreeRDP_DesktopHeight); - REMMINA_PLUGIN_DEBUG ("Resolution set after workarounds: %dx%d", w, h); + REMMINA_PLUGIN_DEBUG("Resolution set after workarounds: %dx%d", w, h); if (remmina_plugin_service->file_get_string(remminafile, "username")) @@ -1503,10 +1504,10 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) remmina_plugin_service->file_get_int(remminafile, "gateway_usage", FALSE) ? TSC_PROXY_MODE_DETECT : TSC_PROXY_MODE_DIRECT); freerdp_settings_set_string(rfi->settings, FreeRDP_GatewayAccessToken, - remmina_plugin_service->file_get_string(remminafile, "gatewayaccesstoken")); + remmina_plugin_service->file_get_string(remminafile, "gatewayaccesstoken")); freerdp_settings_set_uint32(rfi->settings, FreeRDP_AuthenticationLevel, remmina_plugin_service->file_get_int( - remminafile, "authentication level", freerdp_settings_get_uint32(rfi->settings, FreeRDP_AuthenticationLevel))); + remminafile, "authentication level", freerdp_settings_get_uint32(rfi->settings, FreeRDP_AuthenticationLevel))); /* Certificate ignore */ freerdp_settings_set_bool(rfi->settings, FreeRDP_IgnoreCertificate, remmina_plugin_service->file_get_int(remminafile, "cert_ignore", 0)); @@ -1529,7 +1530,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) if (remmina_plugin_service->file_get_string(remminafile, "loadbalanceinfo")) { - char* tmp = strdup(remmina_plugin_service->file_get_string(remminafile, "loadbalanceinfo")); + char *tmp = strdup(remmina_plugin_service->file_get_string(remminafile, "loadbalanceinfo")); rfi->settings->LoadBalanceInfo = (BYTE *)tmp; freerdp_settings_set_uint32(rfi->settings, FreeRDP_LoadBalanceInfoLength, strlen(tmp)); @@ -1846,13 +1847,13 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) if (monitorids_string != NULL && monitorids_string[0] != '\0') { if (g_strstr_len(monitorids_string, -1, ",") != NULL) { if (g_strstr_len(monitorids_string, -1, ":") != NULL) { - rdpMonitor* base = (rdpMonitor *)freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); + rdpMonitor *base = (rdpMonitor *)freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorDefArray); /* We have an ID and an orientation degree */ gchar **temp_items; gchar **rot_items; temp_items = g_strsplit(monitorids_string, ",", -1); for (i = 0; i < g_strv_length(temp_items); i++) { - rdpMonitor* current = &base[atoi(rot_items[0])]; + rdpMonitor *current = &base[atoi(rot_items[0])]; rot_items = g_strsplit(temp_items[i], ":", -1); if (i == 0) monitorids = g_strdup(rot_items[0]); @@ -1861,21 +1862,24 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) current->attributes.orientation = atoi(rot_items[1]); REMMINA_PLUGIN_DEBUG("Monitor n %d orientation: %d", i, current->attributes.orientation); } - } else + } else { monitorids = g_strdup(monitorids_string); - } else + } + } else { monitorids = g_strdup(monitorids_string); - } else + } + } else { monitorids = g_strdup(monitorids_string); + } remmina_rdp_monitor_get(rfi, &monitorids, &maxwidth, &maxheight); if (monitorids != NULL && monitorids[0] != '\0') { - UINT32* base = (UINT32 *)freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorIds); + UINT32 *base = (UINT32 *)freerdp_settings_get_pointer(rfi->settings, FreeRDP_MonitorIds); gchar **items; items = g_strsplit(monitorids, ",", -1); freerdp_settings_set_uint32(rfi->settings, FreeRDP_NumMonitorIds, g_strv_length(items)); REMMINA_PLUGIN_DEBUG("NumMonitorIds: %d", freerdp_settings_get_uint32(rfi->settings, FreeRDP_NumMonitorIds)); for (i = 0; i < g_strv_length(items); i++) { - UINT32* current = &base[i]; + UINT32 *current = &base[i]; *current = atoi(items[i]); REMMINA_PLUGIN_DEBUG("Added monitor with ID %" PRIu32, *current); } @@ -1975,7 +1979,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) freerdp_settings_set_bool(rfi->settings, FreeRDP_DeviceRedirection, TRUE); freerdp_settings_set_bool(rfi->settings, FreeRDP_SupportMultitransport, TRUE); freerdp_settings_set_uint32(rfi->settings, FreeRDP_MultitransportFlags, - (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED)); + (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED)); } else { freerdp_settings_set_uint32(rfi->settings, FreeRDP_MultitransportFlags, 0); } @@ -1998,7 +2002,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) gboolean orphaned; if (!freerdp_connect(rfi->instance)) { - orphaned = (GET_PLUGIN_DATA(rfi->protocol_widget) == NULL); + orphaned = (GET_PLUGIN_DATA(rfi->protocol_widget) == NULL); if (!orphaned) { UINT32 e; @@ -2006,7 +2010,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) switch (e) { case FREERDP_ERROR_AUTHENTICATION_FAILED: - case STATUS_LOGON_FAILURE: // wrong return code from FreeRDP introduced at the end of July 2016? (fixed with b86c0ba) + case STATUS_LOGON_FAILURE: // wrong return code from FreeRDP introduced at the end of July 2016? (fixed with b86c0ba) #ifdef FREERDP_ERROR_CONNECT_LOGON_FAILURE case FREERDP_ERROR_CONNECT_LOGON_FAILURE: #endif @@ -2153,7 +2157,7 @@ static void rfi_uninit(rfContext *rfi) IFCALL(pEntryPoints->GlobalUninit); free(instance->pClientEntryPoints); freerdp_context_free(instance); /* context is rfContext* rfi */ - freerdp_free(instance); /* This implicitly frees instance->context and rfi is no longer valid */ + freerdp_free(instance); /* This implicitly frees instance->context and rfi is no longer valid */ } } @@ -2197,6 +2201,7 @@ static gpointer remmina_rdp_main_thread(gpointer data) CANCEL_ASYNC gp = (RemminaProtocolWidget *)data; + rfi = GET_PLUGIN_DATA(gp); rfi->attempt_interactive_authentication = FALSE; @@ -2351,8 +2356,9 @@ static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaPro if (rfi) { rfi->scale = remmina_plugin_service->remmina_protocol_widget_get_current_scale_mode(gp); remmina_rdp_event_update_scale(gp); - } else + } else { REMMINA_PLUGIN_DEBUG("Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_SCALE"); + } break; case REMMINA_RDP_FEATURE_MULTIMON: @@ -2365,10 +2371,9 @@ static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaPro freerdp_settings_set_bool(rfi->settings, FreeRDP_Fullscreen, TRUE); remmina_rdp_event_send_delayed_monitor_layout(gp); } - - } - else + } else { REMMINA_PLUGIN_DEBUG("Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_MULTIMON"); + } break; case REMMINA_RDP_FEATURE_DYNRESUPDATE: @@ -2377,8 +2382,8 @@ static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaPro case REMMINA_RDP_FEATURE_TOOL_REFRESH: if (rfi) gtk_widget_queue_draw_area(rfi->drawing_area, 0, 0, - remmina_plugin_service->protocol_plugin_get_width(gp), - remmina_plugin_service->protocol_plugin_get_height(gp)); + remmina_plugin_service->protocol_plugin_get_width(gp), + remmina_plugin_service->protocol_plugin_get_height(gp)); else REMMINA_PLUGIN_DEBUG("Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_TOOL_REFRESH"); break; @@ -2397,6 +2402,7 @@ static void remmina_rdp_keystroke(RemminaProtocolWidget *gp, const guint keystro { TRACE_CALL(__func__); rfContext *rfi = GET_PLUGIN_DATA(gp); + remmina_plugin_service->protocol_plugin_send_keys_signals(rfi->drawing_area, keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE); return; @@ -2500,16 +2506,16 @@ static gpointer network_list[] = /* Array of key/value pairs for sound options */ static gpointer sound_list[] = { - "off", N_("Off"), - "local", N_("Local"), - "remote", N_("Remote"), + "off", N_("Off"), + "local", N_("Local"), + "remote", N_("Remote"), NULL }; /* Array of key/value pairs for security */ static gpointer security_list[] = { - "", N_("Automatic negotiation"), + "", N_("Automatic negotiation"), "nla", N_("NLA protocol security"), "tls", N_("TLS protocol security"), "rdp", N_("RDP protocol security"), @@ -2595,19 +2601,20 @@ static gchar monitorids_tooltip[] = */ static const RemminaProtocolSetting remmina_rdp_basic_settings[] = { - { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "server", NULL, FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("Username"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "password", N_("Password"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "domain", N_("Domain"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "left-handed", N_("Left-handed mouse support"), FALSE, NULL, N_("Swap left and right mouse buttons for left-handed mouse support") }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "multimon", N_("Enable multi monitor"), TRUE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "span", N_("Span screen over multiple monitors"), TRUE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "monitorids", N_("List monitor IDs"), FALSE, NULL, monitorids_tooltip }, - { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, "resolution", NULL, FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Colour depth"), FALSE, colordepth_list, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "network", N_("Network connection type"), FALSE, network_list, network_tooltip }, - { REMMINA_PROTOCOL_SETTING_TYPE_FOLDER, "sharefolder", N_("Share folder"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } + { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "server", NULL, FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("Username"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "password", N_("Password"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "domain", N_("Domain"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "left-handed", N_("Left-handed mouse support"), TRUE, NULL, N_("Swap left and right mouse buttons for left-handed mouse support") }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disable-smooth-scrolling", N_("Disable smooth scrolling"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "multimon", N_("Enable multi monitor"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "span", N_("Span screen over multiple monitors"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "monitorids", N_("List monitor IDs"), FALSE, NULL, monitorids_tooltip }, + { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, "resolution", NULL, FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Colour depth"), FALSE, colordepth_list, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "network", N_("Network connection type"), FALSE, network_list, network_tooltip }, + { REMMINA_PROTOCOL_SETTING_TYPE_FOLDER, "sharefolder", N_("Share folder"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; /* Array of RemminaProtocolSetting for advanced settings. @@ -2671,7 +2678,7 @@ static const RemminaProtocolSetting remmina_rdp_advanced_settings[] = { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "multitransport", N_("Enable multitransport protocol (UDP)"), TRUE, NULL, N_("Using the UDP protocol may improve performance") }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "base-cred-for-gw", N_("Use base credentials for gateway too"), TRUE, NULL, NULL }, #if FREERDP_CHECK_VERSION(2, 3, 1) - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "websockets", N_("Enable Gateway websockets support"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "websockets", N_("Enable Gateway websockets support"), TRUE, NULL, NULL }, #endif { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; diff --git a/plugins/rdp/rdp_settings.c b/plugins/rdp/rdp_settings.c index b2a76e91a..da79ea385 100644 --- a/plugins/rdp/rdp_settings.c +++ b/plugins/rdp/rdp_settings.c @@ -51,7 +51,7 @@ static void remmina_rdp_settings_kbd_init(void) void remmina_rdp_settings_init(void) { TRACE_CALL(__func__); - gchar* value; + gchar *value; value = remmina_plugin_service->pref_get_value("rdp_keyboard_layout"); @@ -77,34 +77,35 @@ guint remmina_rdp_settings_get_keyboard_layout(void) #define REMMINA_RDPSET_GRID_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), REMMINA_TYPE_PLUGIN_RDPSET_GRID, RemminaPluginRdpsetGridClass)) typedef struct _RemminaPluginRdpsetGrid { - GtkGrid grid; - - GtkWidget* keyboard_layout_label; - GtkWidget* keyboard_layout_combo; - GtkListStore* keyboard_layout_store; - - GtkWidget* quality_combo; - GtkListStore* quality_store; - GtkWidget* wallpaper_check; - GtkWidget* windowdrag_check; - GtkWidget* menuanimation_check; - GtkWidget* theme_check; - GtkWidget* cursorshadow_check; - GtkWidget* cursorblinking_check; - GtkWidget* fontsmoothing_check; - GtkWidget* composition_check; - GtkWidget* use_client_keymap_check; + GtkGrid grid; + + GtkWidget * keyboard_layout_label; + GtkWidget * keyboard_layout_combo; + GtkListStore * keyboard_layout_store; + + GtkWidget * quality_combo; + GtkListStore * quality_store; + GtkWidget * wallpaper_check; + GtkWidget * windowdrag_check; + GtkWidget * menuanimation_check; + GtkWidget * theme_check; + GtkWidget * cursorshadow_check; + GtkWidget * cursorblinking_check; + GtkWidget * fontsmoothing_check; + GtkWidget * composition_check; + GtkWidget * use_client_keymap_check; + GtkWidget * disable_smooth_scrolling_check; /* FreeRDP /scale-desktop: Scaling of desktop app */ - GtkWidget* desktop_scale_factor_spin; + GtkWidget * desktop_scale_factor_spin; /* FreeRDP /scale-device: Scaling of appstore app */ - GtkListStore* device_scale_factor_store; - GtkWidget* device_scale_factor_combo; + GtkListStore * device_scale_factor_store; + GtkWidget * device_scale_factor_combo; /* FreeRDP /orientation: Orientation of display */ - GtkListStore* desktop_orientation_store; - GtkWidget* desktop_orientation_combo; + GtkListStore * desktop_orientation_store; + GtkWidget * desktop_orientation_combo; - guint quality_values[10]; + guint quality_values[10]; } RemminaPluginRdpsetGrid; typedef struct _RemminaPluginRdpsetGridClass { @@ -115,18 +116,18 @@ GType remmina_rdp_settings_grid_get_type(void) G_GNUC_CONST; G_DEFINE_TYPE(RemminaPluginRdpsetGrid, remmina_rdp_settings_grid, GTK_TYPE_GRID) -static void remmina_rdp_settings_grid_class_init(RemminaPluginRdpsetGridClass* klass) +static void remmina_rdp_settings_grid_class_init(RemminaPluginRdpsetGridClass *klass) { TRACE_CALL(__func__); } -static void remmina_rdp_settings_grid_destroy(GtkWidget* widget, gpointer data) +static void remmina_rdp_settings_grid_destroy(GtkWidget *widget, gpointer data) { TRACE_CALL(__func__); - gchar* s; + gchar *s; guint new_layout; GtkTreeIter iter; - RemminaPluginRdpsetGrid* grid; + RemminaPluginRdpsetGrid *grid; gint val; grid = REMMINA_RDPSET_GRID(widget); @@ -145,7 +146,10 @@ static void remmina_rdp_settings_grid_destroy(GtkWidget* widget, gpointer data) } remmina_plugin_service->pref_set_value("rdp_use_client_keymap", - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->use_client_keymap_check)) ? "1" : "0"); + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->use_client_keymap_check)) ? "1" : "0"); + + remmina_plugin_service->pref_set_value("rdp_disable_smooth_scrolling", + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(grid->disable_smooth_scrolling_check)) ? "1" : "0"); s = g_strdup_printf("%X", grid->quality_values[0]); remmina_plugin_service->pref_set_value("rdp_quality_0", s); @@ -163,11 +167,10 @@ static void remmina_rdp_settings_grid_destroy(GtkWidget* widget, gpointer data) remmina_plugin_service->pref_set_value("rdp_quality_9", s); g_free(s); - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->device_scale_factor_combo), &iter)) { + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->device_scale_factor_combo), &iter)) gtk_tree_model_get(GTK_TREE_MODEL(grid->device_scale_factor_store), &iter, 0, &val, -1); - } else { + else val = 0; - } s = g_strdup_printf("%d", val); remmina_plugin_service->pref_set_value("rdp_deviceScaleFactor", s); g_free(s); @@ -177,24 +180,22 @@ static void remmina_rdp_settings_grid_destroy(GtkWidget* widget, gpointer data) remmina_plugin_service->pref_set_value("rdp_desktopScaleFactor", s); g_free(s); - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->desktop_orientation_combo), &iter)) { + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->desktop_orientation_combo), &iter)) gtk_tree_model_get(GTK_TREE_MODEL(grid->desktop_orientation_store), &iter, 0, &val, -1); - } else { + else val = 0; - } s = g_strdup_printf("%d", val); remmina_plugin_service->pref_set_value("rdp_desktopOrientation", s); g_free(s); - } -static void remmina_rdp_settings_grid_load_layout(RemminaPluginRdpsetGrid* grid) +static void remmina_rdp_settings_grid_load_layout(RemminaPluginRdpsetGrid *grid) { TRACE_CALL(__func__); gint i; - gchar* s; + gchar *s; GtkTreeIter iter; - RDP_KEYBOARD_LAYOUT* layouts; + RDP_KEYBOARD_LAYOUT *layouts; gtk_list_store_append(grid->keyboard_layout_store, &iter); gtk_list_store_set(grid->keyboard_layout_store, &iter, 0, 0, 1, _("<Auto-detect>"), -1); @@ -223,7 +224,7 @@ static void remmina_rdp_settings_grid_load_layout(RemminaPluginRdpsetGrid* grid) freerdp_keyboard_layouts_free(layouts); } -static void remmina_rdp_settings_grid_load_devicescalefactor_combo(RemminaPluginRdpsetGrid* grid) +static void remmina_rdp_settings_grid_load_devicescalefactor_combo(RemminaPluginRdpsetGrid *grid) { TRACE_CALL(__func__); GtkTreeIter iter; @@ -236,10 +237,9 @@ static void remmina_rdp_settings_grid_load_devicescalefactor_combo(RemminaPlugin gtk_list_store_set(grid->device_scale_factor_store, &iter, 0, 140, 1, "140%", -1); gtk_list_store_append(grid->device_scale_factor_store, &iter); gtk_list_store_set(grid->device_scale_factor_store, &iter, 0, 180, 1, "180%", -1); - } -static void remmina_rdp_settings_grid_load_desktoporientation_combo(RemminaPluginRdpsetGrid* grid) +static void remmina_rdp_settings_grid_load_desktoporientation_combo(RemminaPluginRdpsetGrid *grid) { TRACE_CALL(__func__); GtkTreeIter iter; @@ -252,13 +252,12 @@ static void remmina_rdp_settings_grid_load_desktoporientation_combo(RemminaPlugi gtk_list_store_set(grid->desktop_orientation_store, &iter, 0, 180, 1, "180°", -1); gtk_list_store_append(grid->desktop_orientation_store, &iter); gtk_list_store_set(grid->desktop_orientation_store, &iter, 0, 270, 1, "270°", -1); - } -static void remmina_rdp_settings_grid_load_quality(RemminaPluginRdpsetGrid* grid) +static void remmina_rdp_settings_grid_load_quality(RemminaPluginRdpsetGrid *grid) { TRACE_CALL(__func__); - gchar* value; + gchar *value; GtkTreeIter iter; gtk_list_store_append(grid->quality_store, &iter); @@ -297,14 +296,13 @@ static void remmina_rdp_settings_appscale_on_changed(GtkComboBox *widget, Remmin GtkTreeIter iter; guint i = 0; - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->device_scale_factor_combo), &iter)) { + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->device_scale_factor_combo), &iter)) gtk_tree_model_get(GTK_TREE_MODEL(grid->device_scale_factor_store), &iter, 0, &i, -1); - } if (i == 0) { gtk_widget_set_sensitive(GTK_WIDGET(grid->desktop_scale_factor_spin), FALSE); gtk_spin_button_set_range(GTK_SPIN_BUTTON(grid->desktop_scale_factor_spin), 0, 0); gtk_spin_button_set_value(GTK_SPIN_BUTTON(grid->desktop_scale_factor_spin), 0); - }else { + } else { gtk_widget_set_sensitive(GTK_WIDGET(grid->desktop_scale_factor_spin), TRUE); gtk_spin_button_set_range(GTK_SPIN_BUTTON(grid->desktop_scale_factor_spin), 100, 500); // gtk_spin_button_set_value(GTK_SPIN_BUTTON(grid->desktop_scale_factor_spin), i); @@ -321,7 +319,7 @@ static void remmina_rdp_settings_quality_on_changed(GtkComboBox *widget, Remmina if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(grid->quality_combo), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(grid->quality_store), &iter, 0, &i, -1); - sensitive = ( i != -1 ); + sensitive = (i != -1); if (sensitive) v = grid->quality_values[i]; @@ -349,7 +347,7 @@ static void remmina_rdp_settings_quality_on_changed(GtkComboBox *widget, Remmina } } -static void remmina_rdp_settings_quality_option_on_toggled(GtkToggleButton* togglebutton, RemminaPluginRdpsetGrid* grid) +static void remmina_rdp_settings_quality_option_on_toggled(GtkToggleButton *togglebutton, RemminaPluginRdpsetGrid *grid) { TRACE_CALL(__func__); guint v; @@ -373,7 +371,7 @@ static void remmina_rdp_settings_quality_option_on_toggled(GtkToggleButton* togg } } -static void remmina_rdp_settings_set_combo_active_item(GtkComboBox* combo, int itemval) +static void remmina_rdp_settings_set_combo_active_item(GtkComboBox *combo, int itemval) { GtkTreeIter iter; int i; @@ -381,27 +379,24 @@ static void remmina_rdp_settings_set_combo_active_item(GtkComboBox* combo, int i gboolean valid; m = gtk_combo_box_get_model(combo); - if (!m) { + if (!m) return; - } valid = gtk_tree_model_get_iter_first(m, &iter); while (valid) { gtk_tree_model_get(m, &iter, 0, &i, -1); - if (i == itemval) { + if (i == itemval) gtk_combo_box_set_active_iter(combo, &iter); - } valid = gtk_tree_model_iter_next(m, &iter); } - } static void remmina_rdp_settings_grid_init(RemminaPluginRdpsetGrid *grid) { TRACE_CALL(__func__); - gchar* s; - GtkWidget* widget; - GtkCellRenderer* renderer; + gchar *s; + GtkWidget *widget; + GtkCellRenderer *renderer; int desktopOrientation, desktopScaleFactor, deviceScaleFactor; /* Create the grid */ @@ -445,7 +440,7 @@ static void remmina_rdp_settings_grid_init(RemminaPluginRdpsetGrid *grid) s = remmina_plugin_service->pref_get_value("rdp_use_client_keymap"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), - s && s[0] == '1' ? TRUE : FALSE); + s && s[0] == '1' ? TRUE : FALSE); g_free(s); widget = gtk_label_new(_("Quality settings")); @@ -463,7 +458,7 @@ static void remmina_rdp_settings_grid_init(RemminaPluginRdpsetGrid *grid) gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget), renderer, "text", 1); g_signal_connect(G_OBJECT(widget), "changed", - G_CALLBACK(remmina_rdp_settings_quality_on_changed), grid); + G_CALLBACK(remmina_rdp_settings_quality_on_changed), grid); grid->quality_combo = widget; remmina_rdp_settings_grid_load_quality(grid); @@ -472,56 +467,56 @@ static void remmina_rdp_settings_grid_init(RemminaPluginRdpsetGrid *grid) gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 1, 10, 2, 5); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->wallpaper_check = widget; widget = gtk_check_button_new_with_label(_("Window drag")); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 3, 10, 3, 5); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->windowdrag_check = widget; widget = gtk_check_button_new_with_label(_("Menu animation")); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 1, 13, 2, 6); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->menuanimation_check = widget; widget = gtk_check_button_new_with_label(_("Theme")); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 3, 13, 3, 6); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->theme_check = widget; widget = gtk_check_button_new_with_label(_("Cursor shadow")); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 1, 16, 2, 7); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->cursorshadow_check = widget; widget = gtk_check_button_new_with_label(_("Cursor blinking")); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 3, 16, 3, 7); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->cursorblinking_check = widget; widget = gtk_check_button_new_with_label(_("Font smoothing")); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 1, 19, 2, 8); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->fontsmoothing_check = widget; widget = gtk_check_button_new_with_label(_("Composition")); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 3, 19, 3, 8); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); + G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), grid); grid->composition_check = widget; gtk_combo_box_set_active(GTK_COMBO_BOX(grid->quality_combo), 0); @@ -570,7 +565,7 @@ static void remmina_rdp_settings_grid_init(RemminaPluginRdpsetGrid *grid) gtk_spin_button_set_value(GTK_SPIN_BUTTON(grid->desktop_scale_factor_spin), (gdouble)desktopScaleFactor); g_signal_connect(G_OBJECT(widget), "changed", - G_CALLBACK(remmina_rdp_settings_appscale_on_changed), grid); + G_CALLBACK(remmina_rdp_settings_appscale_on_changed), grid); remmina_rdp_settings_appscale_on_changed(GTK_COMBO_BOX(grid->device_scale_factor_combo), grid); widget = gtk_label_new(_("Desktop orientation")); @@ -590,12 +585,27 @@ static void remmina_rdp_settings_grid_init(RemminaPluginRdpsetGrid *grid) remmina_rdp_settings_set_combo_active_item(GTK_COMBO_BOX(grid->desktop_orientation_combo), desktopOrientation); + widget = gtk_label_new(_("Input device settings")); + gtk_widget_show(widget); + gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_START); + gtk_widget_set_valign(GTK_WIDGET(widget), GTK_ALIGN_CENTER); + gtk_grid_attach(GTK_GRID(grid), widget, 0, 30, 1, 1); + + widget = gtk_check_button_new_with_label(_("Disable smooth scrolling")); + gtk_widget_show(widget); + gtk_grid_attach(GTK_GRID(grid), widget, 1, 30, 1, 1); + grid->disable_smooth_scrolling_check = widget; + + s = remmina_plugin_service->pref_get_value("rdp_disable_smooth_scrolling"); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), + s && s[0] == '1' ? TRUE : FALSE); + g_free(s); } -GtkWidget* remmina_rdp_settings_new(void) +GtkWidget *remmina_rdp_settings_new(void) { TRACE_CALL(__func__); - GtkWidget* widget; + GtkWidget *widget; widget = GTK_WIDGET(g_object_new(REMMINA_TYPE_PLUGIN_RDPSET_GRID, NULL)); gtk_widget_show(widget); @@ -610,7 +620,7 @@ void remmina_rdp_settings_get_orientation_scale_prefs(int *desktopOrientation, i /* See https://msdn.microsoft.com/en-us/library/cc240510.aspx */ int orientation, dpsf, desf; - gchar* s; + gchar *s; *desktopOrientation = *desktopScaleFactor = *deviceScaleFactor = 0; @@ -635,5 +645,4 @@ void remmina_rdp_settings_get_orientation_scale_prefs(int *desktopOrientation, i *desktopScaleFactor = dpsf; *deviceScaleFactor = desf; - } diff --git a/plugins/vnc/vnc_plugin.c b/plugins/vnc/vnc_plugin.c index 15caaec8a..3dc3973a8 100644 --- a/plugins/vnc/vnc_plugin.c +++ b/plugins/vnc/vnc_plugin.c @@ -51,7 +51,7 @@ #define GET_PLUGIN_DATA(gp) (RemminaPluginVncData *)g_object_get_data(G_OBJECT(gp), "plugin-data") static RemminaPluginService *remmina_plugin_service = NULL; -#define REMMINA_PLUGIN_DEBUG(fmt, ...) remmina_plugin_service->_remmina_debug(__func__, fmt, ##__VA_ARGS__) +#define REMMINA_PLUGIN_DEBUG(fmt, ...) remmina_plugin_service->_remmina_debug(__func__, fmt, ## __VA_ARGS__) static int dot_cursor_x_hot = 2; static int dot_cursor_y_hot = 2; @@ -97,6 +97,7 @@ static void onMainThread_cleanup_handler(gpointer data) { TRACE_CALL(__func__); struct onMainThread_cb_data *d = data; + d->cancelled = TRUE; } @@ -118,14 +119,15 @@ static void onMainThread_schedule_callback_and_wait(struct onMainThread_cb_data } /** - Function check_for_endianness() returns 1, if architecture - is little endian, 0 in case of big endian. + * Function check_for_endianness() returns 1, if architecture + * is little endian, 0 in case of big endian. */ static gboolean check_for_endianness() { - unsigned int x = 1; - char *c = (char*) &x; - return (int)*c; + unsigned int x = 1; + char *c = (char *)&x; + + return (int)*c; } static void remmina_plugin_vnc_event_push(RemminaProtocolWidget *gp, gint event_type, gpointer p1, gpointer p2, gpointer p3) @@ -333,7 +335,7 @@ static void remmina_plugin_vnc_process_vnc_event(RemminaProtocolWidget *gp) break; case REMMINA_PLUGIN_VNC_EVENT_POINTER: SendPointerEvent(cl, event->event_data.pointer.x, event->event_data.pointer.y, - event->event_data.pointer.button_mask); + event->event_data.pointer.button_mask); break; case REMMINA_PLUGIN_VNC_EVENT_CUTTEXT: if (event->event_data.text.text) { @@ -452,17 +454,17 @@ static void remmina_plugin_vnc_update_colordepth(rfbClient *cl, gint colordepth) break; } - rfbClientLog ("colordepth = %d\n", colordepth); - rfbClientLog ("format.depth = %d\n", cl->format.depth); - rfbClientLog ("format.bitsPerPixel = %d\n", cl->format.bitsPerPixel); - rfbClientLog ("format.blueShift = %d\n", cl->format.blueShift); - rfbClientLog ("format.redShift = %d\n", cl->format.redShift); - rfbClientLog ("format.trueColour = %d\n", cl->format.trueColour); - rfbClientLog ("format.greenShift = %d\n", cl->format.greenShift); - rfbClientLog ("format.blueMax = %d\n", cl->format.blueMax); - rfbClientLog ("format.redMax = %d\n", cl->format.redMax); - rfbClientLog ("format.greenMax = %d\n", cl->format.greenMax); - rfbClientLog ("format.bigEndian = %d\n", cl->format.bigEndian); + rfbClientLog("colordepth = %d\n", colordepth); + rfbClientLog("format.depth = %d\n", cl->format.depth); + rfbClientLog("format.bitsPerPixel = %d\n", cl->format.bitsPerPixel); + rfbClientLog("format.blueShift = %d\n", cl->format.blueShift); + rfbClientLog("format.redShift = %d\n", cl->format.redShift); + rfbClientLog("format.trueColour = %d\n", cl->format.trueColour); + rfbClientLog("format.greenShift = %d\n", cl->format.greenShift); + rfbClientLog("format.blueMax = %d\n", cl->format.blueMax); + rfbClientLog("format.redMax = %d\n", cl->format.redMax); + rfbClientLog("format.greenMax = %d\n", cl->format.greenMax); + rfbClientLog("format.bigEndian = %d\n", cl->format.bigEndian); } static rfbBool remmina_plugin_vnc_rfb_allocfb(rfbClient *cl) @@ -518,6 +520,7 @@ static gint remmina_plugin_vnc_bits(gint n) { TRACE_CALL(__func__); gint b = 0; + while (n) { b++; n >>= 1; @@ -584,6 +587,7 @@ static void remmina_plugin_vnc_rfb_fill_buffer(rfbClient *cl, guchar *dest, gint gint rs, gs, bs, rm, gm, bm, rl, gl, bl, rr, gr, br; gint r; guint32 *destptr; + union { struct { guchar a, r, g, b; @@ -694,7 +698,7 @@ static void remmina_plugin_vnc_rfb_finished(rfbClient *cl) REMMINA_PLUGIN_DEBUG("FinishedFrameBufferUpdate"); } -static void remmina_plugin_vnc_rfb_led_state(rfbClient* cl, int value, int pad) +static void remmina_plugin_vnc_rfb_led_state(rfbClient *cl, int value, int pad) { TRACE_CALL(__func__); REMMINA_PLUGIN_DEBUG("Led state - value: %d, pad: %d", value, pad); @@ -722,8 +726,9 @@ static gboolean remmina_plugin_vnc_queue_cuttext(RemminaPluginVncCuttextParam *p text = g_convert_with_fallback(param->text, param->textlen, cur_charset, "ISO-8859-1", "?", &br, &bw, NULL); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), text, bw); g_free(text); - } else + } else { g_date_time_unref(t); + } } g_free(param->text); g_free(param); @@ -763,12 +768,12 @@ remmina_plugin_vnc_rfb_password(rfbClient *cl) gboolean save; disablepasswordstoring = remmina_plugin_service->file_get_int(remminafile, "disablepasswordstoring", FALSE); ret = remmina_plugin_service->protocol_plugin_init_auth(gp, - (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD), - _("Enter VNC password"), - NULL, - remmina_plugin_service->file_get_string(remminafile, "password"), - NULL, - NULL); + (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD), + _("Enter VNC password"), + NULL, + remmina_plugin_service->file_get_string(remminafile, "password"), + NULL, + NULL); if (ret != GTK_RESPONSE_OK) { gpdata->connected = FALSE; return NULL; @@ -816,12 +821,12 @@ remmina_plugin_vnc_rfb_credential(rfbClient *cl, int credentialType) disablepasswordstoring = remmina_plugin_service->file_get_int(remminafile, "disablepasswordstoring", FALSE); ret = remmina_plugin_service->protocol_plugin_init_auth(gp, - (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD) | REMMINA_MESSAGE_PANEL_FLAG_USERNAME, - _("Enter VNC authentication credentials"), - remmina_plugin_service->file_get_string(remminafile, "username"), - remmina_plugin_service->file_get_string(remminafile, "password"), - NULL, - NULL); + (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD) | REMMINA_MESSAGE_PANEL_FLAG_USERNAME, + _("Enter VNC authentication credentials"), + remmina_plugin_service->file_get_string(remminafile, "username"), + remmina_plugin_service->file_get_string(remminafile, "password"), + NULL, + NULL); if (ret == GTK_RESPONSE_OK) { gboolean save = remmina_plugin_service->protocol_plugin_init_get_savepassword(gp); cred->userCredential.username = remmina_plugin_service->protocol_plugin_init_get_username(gp); @@ -942,10 +947,11 @@ static void remmina_plugin_vnc_rfb_output(const char *format, ...) { TRACE_CALL(__func__); va_list args; + va_start(args, format); gchar *f, *p, *ff; - if(!rfbEnableClientLogging) + if (!rfbEnableClientLogging) return; /* eliminate the last \n */ f = g_strdup(format); @@ -963,10 +969,12 @@ static void remmina_plugin_vnc_rfb_output(const char *format, ...) NULL); g_snprintf(vnc_error, MAX_ERROR_LENGTH, ff, p); g_free(ff); - } else + } else { g_snprintf(vnc_error, MAX_ERROR_LENGTH, _(f), p); - } else + } + } else { g_vsnprintf(vnc_error, MAX_ERROR_LENGTH, _(f), args); + } g_free(f); va_end(args); @@ -1245,15 +1253,15 @@ static gboolean remmina_plugin_vnc_main(RemminaProtocolWidget *gp) if (remmina_plugin_service->file_get_string(remminafile, "proxy")) { remmina_plugin_service->get_server_port( - remmina_plugin_service->file_get_string(remminafile, "server"), - 5900, - &cl->destHost, - &cl->destPort); + remmina_plugin_service->file_get_string(remminafile, "server"), + 5900, + &cl->destHost, + &cl->destPort); remmina_plugin_service->get_server_port( - remmina_plugin_service->file_get_string(remminafile, "proxy"), - 5900, - &cl->serverHost, - &cl->serverPort); + remmina_plugin_service->file_get_string(remminafile, "proxy"), + 5900, + &cl->serverHost, + &cl->serverPort); REMMINA_PLUGIN_DEBUG("cl->serverHost: %s", cl->serverHost); REMMINA_PLUGIN_DEBUG("cl->serverPort: %d", cl->serverPort); REMMINA_PLUGIN_DEBUG("cl->destHost: %s", cl->destHost); @@ -1285,8 +1293,9 @@ static gboolean remmina_plugin_vnc_main(RemminaProtocolWidget *gp) if (rfbInitClient(cl, NULL, NULL)) { REMMINA_PLUGIN_DEBUG("Client initialization successfull"); break; - } else + } else { REMMINA_PLUGIN_DEBUG("Client initialization failed"); + } /* If the authentication is not called, it has to be a fatal error and must quit */ if (!gpdata->auth_called) { @@ -1719,7 +1728,7 @@ static gboolean remmina_plugin_vnc_close_connection_timeout(RemminaProtocolWidge gpdata->vnc_buffer = NULL; } g_ptr_array_free(gpdata->pressed_keys, TRUE); - g_date_time_unref(gpdata->clipboard_timer); + g_date_time_unref(gpdata->clipboard_timer); remmina_plugin_vnc_event_free_all(gp); g_queue_free(gpdata->vnc_event_queue); pthread_mutex_destroy(&gpdata->vnc_event_queue_mutex); @@ -1815,6 +1824,7 @@ static void remmina_plugin_vnc_keystroke(RemminaProtocolWidget *gp, const guint { TRACE_CALL(__func__); RemminaPluginVncData *gpdata = GET_PLUGIN_DATA(gp); + remmina_plugin_service->protocol_plugin_send_keys_signals(gpdata->drawing_area, keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE); return; @@ -1863,6 +1873,12 @@ static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp) gpdata = g_new0(RemminaPluginVncData, 1); g_object_set_data_full(G_OBJECT(gp), "plugin-data", gpdata, g_free); + gboolean disable_smooth_scrolling = FALSE; + RemminaFile *remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); + + disable_smooth_scrolling = remmina_plugin_service->file_get_int(remminafile, "disablesmoothscrolling", FALSE); + REMMINA_PLUGIN_DEBUG("Disable smooth scrolling is set to %d", disable_smooth_scrolling); + gpdata->drawing_area = gtk_drawing_area_new(); gtk_widget_show(gpdata->drawing_area); gtk_container_add(GTK_CONTAINER(gp), gpdata->drawing_area); @@ -1872,12 +1888,14 @@ static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp) GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK -#if GTK_CHECK_VERSION(3, 4, 0) - | GDK_SMOOTH_SCROLL_MASK -#endif | GDK_SCROLL_MASK); gtk_widget_set_can_focus(gpdata->drawing_area, TRUE); + if (!disable_smooth_scrolling) { + REMMINA_PLUGIN_DEBUG("Adding GDK_SMOOTH_SCROLL_MASK"); + gtk_widget_add_events(gpdata->drawing_area, GDK_SMOOTH_SCROLL_MASK); + } + g_signal_connect(G_OBJECT(gpdata->drawing_area), "draw", G_CALLBACK(remmina_plugin_vnc_on_draw), gp); @@ -1937,14 +1955,14 @@ static gchar repeater_tooltip[] = */ static const RemminaProtocolSetting remmina_plugin_vnc_basic_settings[] = { - { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "server", NULL, FALSE, "_rfb._tcp", NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "server", NULL, FALSE, "_rfb._tcp", NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "proxy", N_("Repeater"), FALSE, NULL, repeater_tooltip }, - { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("Username"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "password", N_("User password"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Colour depth"), FALSE, colordepth_list, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "quality", N_("Quality"), FALSE, quality_list, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP, "keymap", NULL, FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } + { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("Username"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "password", N_("User password"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Colour depth"), FALSE, colordepth_list, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "quality", N_("Quality"), FALSE, quality_list, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP, "keymap", NULL, FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; /* Array of RemminaProtocolSetting for basic settings. @@ -1961,9 +1979,9 @@ static const RemminaProtocolSetting remmina_plugin_vnci_basic_settings[] = { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "listenport", N_("Listen on port"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("Username"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "password", N_("User password"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Colour depth"), FALSE, colordepth_list, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Colour depth"), FALSE, colordepth_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "quality", N_("Quality"), FALSE, quality_list, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP, "keymap", NULL, FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP, "keymap", NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; @@ -1978,14 +1996,15 @@ static const RemminaProtocolSetting remmina_plugin_vnci_basic_settings[] = */ static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[] = { - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "showcursor", N_("Show remote cursor"), TRUE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "viewonly", N_("View only"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableclipboard", N_("Turn off clipboard sync"), TRUE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableencryption", N_("Turn off encryption"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableserverinput", N_("Prevent local interaction on the server"), TRUE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableserverbell", N_("Ignore remote bell messages"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disablepasswordstoring", N_("Forget passwords after use"), TRUE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "showcursor", N_("Show remote cursor"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "viewonly", N_("View only"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableclipboard", N_("Turn off clipboard sync"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableencryption", N_("Turn off encryption"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableserverinput", N_("Prevent local interaction on the server"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableserverbell", N_("Ignore remote bell messages"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disablepasswordstoring", N_("Forget passwords after use"), TRUE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disablesmoothscrolling", N_("Disable smooth scrolling"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; /* Array for available features. @@ -1997,12 +2016,12 @@ static const RemminaProtocolFeature remmina_plugin_vnc_features[] = { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "viewonly", N_("View only") }, { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "disableserverinput",N_("Prevent local interaction on the server") }, - { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH, N_("Refresh"), NULL, NULL }, - { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT, N_("Open Chat…"), "face-smile", NULL }, - { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_SENDCTRLALTDEL, N_("Send Ctrl+Alt+Delete"), NULL, NULL }, - { REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, REMMINA_PLUGIN_VNC_FEATURE_SCALE, NULL, NULL, NULL }, - { REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS, NULL, NULL, NULL }, - { REMMINA_PROTOCOL_FEATURE_TYPE_END, 0, NULL, NULL, NULL } + { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH, N_("Refresh"), NULL, NULL }, + { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT, N_("Open Chat…"), "face-smile", NULL }, + { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_SENDCTRLALTDEL, N_("Send Ctrl+Alt+Delete"), NULL, NULL }, + { REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, REMMINA_PLUGIN_VNC_FEATURE_SCALE, NULL, NULL, NULL }, + { REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS, NULL, NULL, NULL }, + { REMMINA_PROTOCOL_FEATURE_TYPE_END, 0, NULL, NULL, NULL } }; /* Protocol plugin definition and features */ |