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);

Reply via email to