Package: tsclient Version: 0.150-1 This patch adds more resolutions to tsclient. currently tsclient has all resolutions hardcoded in connect.c, this patch provides more resolutions and the option to add a resolution defined by the user.
this was first addressed in https://bugs.launchpad.net/ubuntu/+source/tsclient/+bug/63412 and the patch was submitted originally by Ted M Lin (https://launchpad.net/~kitlaan) and has been reported upstream at https://sourceforge.net/tracker/?func=detail&aid=2799711&group_id=192483&atid=941576 Usertags: origin-ubuntu ubuntu-patch karmic Tags: patch -- Efrain J Valles https://launchpad.net/~effie-jayx
diff -Nur -x '*.orig' -x '*~' tsclient-0.150/src/connect.c tsclient-0.150.new/src/connect.c --- tsclient-0.150/src/connect.c 2008-11-05 23:16:45.000000000 -0500 +++ tsclient-0.150.new/src/connect.c 2008-11-05 23:21:34.000000000 -0500 @@ -56,7 +56,12 @@ _("1024 x 768 pixels"), _("1152 x 864 pixels"), _("1280 x 960 pixels"), + _("1280 x 1024 pixels"), _("1400 x 1050 pixels"), + _("1600 x 1200 pixels"), + _("1680 x 1050 pixels"), + _("1920 x 1200 pixels"), + _("Custom Resolution"), NULL }; gchar *color_items[] = { @@ -138,6 +143,12 @@ GtkWidget *optSize; GtkWidget *alnAltFullSwitch; GtkWidget *chkAltFullSwitch; + GtkWidget *tblCustomSize; + GtkWidget *alnCustomSize; + GtkWidget *lblSizeHeight; + GtkWidget *lblSizeWidth; + GtkWidget *txtDesktopWidth; + GtkWidget *txtDesktopHeight; // Color Frame Widgets GtkWidget *frameColor; @@ -562,6 +573,44 @@ optSize = tsc_option_menu_factory (size_items); gtk_container_add (GTK_CONTAINER (alnSize), optSize); + alnCustomSize = gtk_alignment_new (0.5, 0.5, 0.88, 1); + gtk_box_pack_start (GTK_BOX (vbxSize), alnCustomSize, FALSE, FALSE, 0); + gtk_widget_set_sensitive (alnCustomSize, FALSE); + + tblCustomSize = gtk_table_new (1, 4, FALSE); + gtk_container_add (GTK_CONTAINER (alnCustomSize), tblCustomSize); + + lblSizeWidth = gtk_label_new (_("Width:")); + gtk_table_attach (GTK_TABLE (tblCustomSize), lblSizeWidth, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 6, 6); + gtk_label_set_justify (GTK_LABEL (lblSizeWidth), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (lblSizeWidth), 0, 0.5); + + lblSizeHeight = gtk_label_new (_("Height:")); + gtk_table_attach (GTK_TABLE (tblCustomSize), lblSizeHeight, 2, 3, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 6, 6); + gtk_label_set_justify (GTK_LABEL (lblSizeHeight), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (lblSizeHeight), 0, 0.5); + + txtDesktopWidth = gtk_entry_new_with_max_length (4); + gtk_entry_set_activates_default (GTK_ENTRY (txtDesktopWidth), TRUE); + gtk_entry_set_width_chars (GTK_ENTRY (txtDesktopWidth), 4); + gtk_table_attach (GTK_TABLE (tblCustomSize), txtDesktopWidth, 1, 2, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_tooltips_set_tip (tooltips, txtDesktopWidth, _("Enter the desktop width."), NULL); + + txtDesktopHeight = gtk_entry_new_with_max_length (4); + gtk_entry_set_activates_default (GTK_ENTRY (txtDesktopHeight), TRUE); + gtk_entry_set_width_chars (GTK_ENTRY (txtDesktopHeight), 4); + gtk_table_attach (GTK_TABLE (tblCustomSize), txtDesktopHeight, 3, 4, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_tooltips_set_tip (tooltips, txtDesktopHeight, _("Enter the desktop height."), NULL); + + optSize3 = gtk_radio_button_new_with_mnemonic (NULL, _("Operate in full screen mode")); gtk_box_pack_start (GTK_BOX (vbxSize), optSize3, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (optSize3), 3); @@ -1013,6 +1062,9 @@ g_signal_connect (G_OBJECT (optSize3), "clicked", G_CALLBACK (on_optSize3_clicked), NULL); + g_signal_connect (G_OBJECT (optSize), "changed", + G_CALLBACK (on_optSize_changed), + NULL); g_signal_connect (G_OBJECT (optColor1), "clicked", G_CALLBACK (on_optColor1_clicked), @@ -1102,6 +1154,12 @@ HOOKUP_OBJECT (frmConnect, optSize3, "optSize3"); HOOKUP_OBJECT (frmConnect, alnAltFullSwitch, "alnAltFullSwitch"); HOOKUP_OBJECT (frmConnect, chkAltFullSwitch, "chkAltFullSwitch"); + HOOKUP_OBJECT (frmConnect, tblCustomSize, "tblCustomSize"); + HOOKUP_OBJECT (frmConnect, alnCustomSize, "alnCustomSize"); + HOOKUP_OBJECT (frmConnect, lblSizeWidth, "lblSizeWidth"); + HOOKUP_OBJECT (frmConnect, lblSizeHeight, "lblSizeHeight"); + HOOKUP_OBJECT (frmConnect, txtDesktopWidth, "txtDesktopWidth"); + HOOKUP_OBJECT (frmConnect, txtDesktopHeight, "txtDesktopHeight"); // Color Frame Widgets HOOKUP_OBJECT (frmConnect, frameColor, "frameColor"); @@ -1313,13 +1371,15 @@ on_optSize1_clicked (GtkButton *button, gpointer user_data) { - GtkWidget *aln_size, *aln_afss; + GtkWidget *aln_size, *aln_afss, *aln_cust; aln_size = lookup_widget (gConnect, "alnSize"); aln_afss = lookup_widget (gConnect, "alnAltFullSwitch"); + aln_cust = lookup_widget (gConnect, "alnCustomSize"); gtk_widget_set_sensitive (aln_size, FALSE); gtk_widget_set_sensitive (aln_afss, FALSE); + gtk_widget_set_sensitive (aln_cust, FALSE); } @@ -1327,12 +1387,21 @@ on_optSize2_clicked (GtkButton *button, gpointer user_data) { - GtkWidget *aln_size, *aln_afss; + GtkWidget *aln_size, *aln_afss, *aln_cust; + GtkWidget *opt_size; aln_size = lookup_widget (gConnect, "alnSize"); aln_afss = lookup_widget (gConnect, "alnAltFullSwitch"); + aln_cust = lookup_widget (gConnect, "alnCustomSize"); + opt_size = lookup_widget (gConnect, "optSize"); + gtk_widget_set_sensitive (aln_size, TRUE); gtk_widget_set_sensitive (aln_afss, FALSE); + if ((int) gtk_option_menu_get_history (GTK_OPTION_MENU (opt_size)) == 10) { + gtk_widget_set_sensitive (aln_cust, TRUE); + } else { + gtk_widget_set_sensitive (aln_cust, FALSE); + } } @@ -1340,12 +1409,32 @@ on_optSize3_clicked (GtkButton *button, gpointer user_data) { - GtkWidget *aln_size, *aln_afss; + GtkWidget *aln_size, *aln_afss, *aln_cust; aln_size = lookup_widget (gConnect, "alnSize"); aln_afss = lookup_widget (gConnect, "alnAltFullSwitch"); + aln_cust = lookup_widget (gConnect, "alnCustomSize"); + gtk_widget_set_sensitive (aln_size, FALSE); gtk_widget_set_sensitive (aln_afss, TRUE); + gtk_widget_set_sensitive (aln_cust, FALSE); +} + +void +on_optSize_changed (GtkButton *button, + gpointer user_data) +{ + GtkWidget *aln_cust; + GtkWidget *opt_size; + + aln_cust = lookup_widget (gConnect, "alnCustomSize"); + opt_size = lookup_widget (gConnect, "optSize"); + + if ((int) gtk_option_menu_get_history (GTK_OPTION_MENU (opt_size)) == 10) { + gtk_widget_set_sensitive (aln_cust, TRUE); + } else { + gtk_widget_set_sensitive (aln_cust, FALSE); + } } void @@ -1369,6 +1458,7 @@ gtk_widget_set_sensitive (aln_color, TRUE); } + void on_btnSaveAs_clicked (GtkButton *button, gpointer user_data) diff -Nur -x '*.orig' -x '*~' tsclient-0.150/src/connect.h tsclient-0.150.new/src/connect.h --- tsclient-0.150/src/connect.h 2008-11-05 23:16:45.000000000 -0500 +++ tsclient-0.150.new/src/connect.h 2008-11-05 23:19:09.000000000 -0500 @@ -22,6 +22,8 @@ void on_optSize4_clicked (GtkButton *button, gpointer user_data); +void on_optSize_changed (GtkButton *button, gpointer user_data); + void on_optColor1_clicked (GtkButton *button, gpointer user_data); void on_optColor2_clicked (GtkButton *button, gpointer user_data); diff -Nur -x '*.orig' -x '*~' tsclient-0.150/src/rdpfile.c tsclient-0.150.new/src/rdpfile.c --- tsclient-0.150/src/rdpfile.c 2008-11-05 23:16:45.000000000 -0500 +++ tsclient-0.150.new/src/rdpfile.c 2008-11-05 23:19:09.000000000 -0500 @@ -17,6 +17,7 @@ #include "rdpfile.h" #include "support.h" +#define RDP_WxH(r, w, h) ((r)->desktopwidth == (w) && (r)->desktopheight == (h)) /*************************************** * * @@ -265,6 +266,7 @@ GtkWidget *widget; guint pos = 0; guint dsize = 0; + char *buffer; #ifdef TSCLIENT_DEBUG printf ("rdp_file_set_screen\n"); @@ -324,29 +326,31 @@ else gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE); - switch (rdp->desktopwidth) { - case 640: + if (RDP_WxH(rdp, 640, 480)) dsize = 0; - break; - case 800: + else if (RDP_WxH(rdp, 800, 600)) dsize = 1; - break; - case 1024: + else if (RDP_WxH(rdp, 1024, 768)) dsize = 2; - break; - case 1152: + else if (RDP_WxH(rdp, 1152, 864)) dsize = 3; - break; - case 1280: + else if (RDP_WxH(rdp, 1280, 960)) dsize = 4; - break; - case 1400: + else if (RDP_WxH(rdp, 1280, 1024)) dsize = 5; - break; - default: + else if (RDP_WxH(rdp, 1400, 1050)) + dsize = 6; + else if (RDP_WxH(rdp, 1600, 1200)) + dsize = 7; + else if (RDP_WxH(rdp, 1680, 1050)) + dsize = 8; + else if (RDP_WxH(rdp, 1920, 1200)) + dsize = 9; + else if (rdp->desktopwidth > MAX_DESKTOP_WIDTH || rdp->desktopwidth <= 0 || + rdp->desktopheight > MAX_DESKTOP_HEIGHT || rdp->desktopheight <= 0) dsize = 1234; - break; - } + else + dsize = 10; if (rdp->screen_mode_id == 2) { widget = lookup_widget (main_window, "optSize3"); @@ -357,6 +361,18 @@ gtk_toggle_button_set_active ((GtkToggleButton*) widget, TRUE); widget = lookup_widget (main_window, "optSize"); gtk_option_menu_set_history (GTK_OPTION_MENU (widget), dsize); + if (dsize == 10) { + widget = lookup_widget (main_window, "txtDesktopWidth"); + gtk_editable_delete_text ((GtkEditable*) widget, 0, -1); + buffer = g_strdup_printf("%d", rdp->desktopwidth); + gtk_editable_insert_text((GtkEditable*) widget, (gchar *)buffer, strlen(buffer), &pos); + g_free(buffer); + widget = lookup_widget (main_window, "txtDesktopHeight"); + gtk_editable_delete_text ((GtkEditable*) widget, 0, -1); + buffer = g_strdup_printf("%d", rdp->desktopheight); + gtk_editable_insert_text((GtkEditable*) widget, (gchar *)buffer, strlen(buffer), &pos); + g_free(buffer); + } } else { widget = lookup_widget (main_window, "optSize1"); gtk_toggle_button_set_active ((GtkToggleButton*) widget, TRUE); @@ -646,9 +662,33 @@ rdp->desktopheight = 960; break; case 5: + rdp->desktopwidth = 1280; + rdp->desktopheight = 1024; + break; + case 6: rdp->desktopwidth = 1400; rdp->desktopheight = 1050; break; + case 7: + rdp->desktopwidth = 1600; + rdp->desktopheight = 1200; + break; + case 8: + rdp->desktopwidth = 1680; + rdp->desktopheight = 1050; + break; + case 9: + rdp->desktopwidth = 1920; + rdp->desktopheight = 1200; + break; + case 10: + widget = lookup_widget (main_window, "txtDesktopWidth"); + value = gtk_editable_get_chars ((GtkEditable*) widget, 0, -1); + if (value) rdp->desktopwidth = atoi(value); + widget = lookup_widget (main_window, "txtDesktopHeight"); + value = gtk_editable_get_chars ((GtkEditable*) widget, 0, -1); + if (value) rdp->desktopheight = atoi(value); + break; default: rdp->desktopwidth = 0; rdp->desktopheight = 0; diff -Nur -x '*.orig' -x '*~' tsclient-0.150/src/rdpfile.h tsclient-0.150.new/src/rdpfile.h --- tsclient-0.150/src/rdpfile.h 2008-11-05 23:16:45.000000000 -0500 +++ tsclient-0.150.new/src/rdpfile.h 2008-11-05 23:19:09.000000000 -0500 @@ -9,6 +9,9 @@ #define MAX_VALUE_SIZE 2048 #define MAX_BUFFER_SIZE 4096 +#define MAX_DESKTOP_WIDTH 4096 +#define MAX_DESKTOP_HEIGHT 2048 + typedef struct { char key[MAX_KEY_SIZE]; @@ -63,6 +66,7 @@ int rdp_file_init (rdp_file *rdp_in); +int rdp_file_cleanup (rdp_file *rdp_in); int rdp_file_load (rdp_file *rdp_in, const char *fqpath); int rdp_file_save (rdp_file *rdp_in, const char *fqpath); int rdp_file_set_screen (rdp_file *rdp_in, GtkWidget *main_window); diff -Nur -x '*.orig' -x '*~' tsclient-0.150/src/support.c tsclient-0.150.new/src/support.c --- tsclient-0.150/src/support.c 2008-11-05 23:16:45.000000000 -0500 +++ tsclient-0.150.new/src/support.c 2008-11-05 23:19:09.000000000 -0500 @@ -405,35 +405,9 @@ sprintf(buffer, "-f"); } c_argv[c_argc++] = g_strdup (buffer); - } else { - switch (rdp->desktopwidth) { - case 640: - sprintf(buffer, "-g640x480"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 800: - sprintf(buffer, "-g800x600"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 1024: - sprintf(buffer, "-g1024x768"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 1152: - sprintf(buffer, "-g1152x864"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 1280: - sprintf(buffer, "-g1280x960"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 1400: - sprintf(buffer, "-g1400x1050"); - c_argv[c_argc++] = g_strdup (buffer); - break; - default: - break; - } + } else if (rdp->desktopwidth > 0 && rdp->desktopheight > 0) { + sprintf(buffer, "-g%dx%d", rdp->desktopwidth, rdp->desktopheight); + c_argv[c_argc++] = g_strdup (buffer); } switch (rdp->session_bpp) { @@ -565,41 +539,11 @@ if (rdp->screen_mode_id == 2) { sprintf(buffer, "-fullscreen"); c_argv[c_argc++] = g_strdup (buffer); - } else { - switch (rdp->desktopwidth) { - case 640: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = g_strdup (buffer); - sprintf(buffer, "640x480"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 800: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = g_strdup (buffer); - sprintf(buffer, "800x600"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 1024: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = g_strdup (buffer); - sprintf(buffer, "1024x768"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 1152: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = g_strdup (buffer); - sprintf(buffer, "1152x864"); - c_argv[c_argc++] = g_strdup (buffer); - break; - case 1280: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = g_strdup (buffer); - sprintf(buffer, "1280x960"); - c_argv[c_argc++] = g_strdup (buffer); - break; - default: - break; - } + } else if (rdp->desktopwidth > 0 && rdp->desktopheight > 0) { + sprintf(buffer, "-geometry"); + c_argv[c_argc++] = g_strdup (buffer); + sprintf(buffer, "%dx%d", rdp->desktopwidth, rdp->desktopheight); + c_argv[c_argc++] = g_strdup (buffer); } /* this is diff in all vnc vers @@ -681,39 +625,11 @@ sprintf(buffer, "-once"); c_argv[c_argc++] = strdup(buffer); - switch (rdp->desktopwidth) { - case 640: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "640x480"); - c_argv[c_argc++] = strdup(buffer); - break; - case 800: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "800x600"); - c_argv[c_argc++] = strdup(buffer); - break; - case 1024: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "1024x768"); - c_argv[c_argc++] = strdup(buffer); - break; - case 1152: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "1152x864"); - c_argv[c_argc++] = strdup(buffer); - break; - case 1280: + if (rdp->desktopwidth > 0 && rdp->desktopheight > 0) { sprintf(buffer, "-geometry"); c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "1280x960"); + sprintf(buffer, "%dx%d", rdp->desktopwidth, rdp->desktopheight); c_argv[c_argc++] = strdup(buffer); - break; - default: - break; } sprintf(buffer, "-query"); @@ -756,39 +672,11 @@ c_argv[c_argc++] = g_strdup (buffer); } - switch (rdp->desktopwidth) { - case 640: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "640x480"); - c_argv[c_argc++] = strdup(buffer); - break; - case 800: + if ( rdp->desktopwidth > 0 && rdp->desktopheight > 0 ) { sprintf(buffer, "-geometry"); c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "800x600"); + sprintf(buffer, "%dx%d", rdp->desktopwidth, rdp->desktopheight); c_argv[c_argc++] = strdup(buffer); - break; - case 1024: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "1024x768"); - c_argv[c_argc++] = strdup(buffer); - break; - case 1152: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "1152x864"); - c_argv[c_argc++] = strdup(buffer); - break; - case 1280: - sprintf(buffer, "-geometry"); - c_argv[c_argc++] = strdup(buffer); - sprintf(buffer, "1280x960"); - c_argv[c_argc++] = strdup(buffer); - break; - default: - break; } switch (rdp->session_bpp) { @@ -1103,7 +991,7 @@ //mru_add_server (rdp->full_address); } if(*error) - g_free(error); + g_free(*error); g_free(error); } g_free (rdp);