Skip to content
Snippets Groups Projects
  1. Sep 19, 2021
  2. Apr 10, 2021
    • Simon Tatham's avatar
      dialog system: add a side-by-side alignment feature. · 1276c13e
      Simon Tatham authored
      This will let us put two controls side by side (e.g. in disjoint
      columns of a multi-col layout) and indicate that instead of the
      default behaviour of aligning their top edges, their centreline (or,
      even better if available, font baseline) should be aligned.
      
      NFC: nothing uses this yet.
      1276c13e
  3. Sep 08, 2019
    • Simon Tatham's avatar
      Whitespace rationalisation of entire code base. · 5d718ef6
      Simon Tatham authored
      The number of people has been steadily increasing who read our source
      code with an editor that thinks tab stops are 4 spaces apart, as
      opposed to the traditional tty-derived 8 that the PuTTY code expects.
      
      So I've been wondering for ages about just fixing it, and switching to
      a spaces-only policy throughout the code. And I recently found out
      about 'git blame -w', which should make this change not too disruptive
      for the purposes of source-control archaeology; so perhaps now is the
      time.
      
      While I'm at it, I've also taken the opportunity to remove all the
      trailing spaces from source lines (on the basis that git dislikes
      them, and is the only thing that seems to have a strong opinion one
      way or the other).
          
      Apologies to anyone downstream of this code who has complicated patch
      sets to rebase past this change. I don't intend it to be needed again.
      5d718ef6
  4. Jun 30, 2019
    • Simon Tatham's avatar
      Don't implicitly load a session if Session pane not active. · e790adec
      Simon Tatham authored
      If you select an entry in the saved sessions list box, but without
      double-clicking to actually load it, and then you hit OK, the config-
      box code will automatically load it. That just saves one click in a
      common situation.
      
      But in order to load that session, the config-box system first has to
      ask the list-box control _which_ session is selected. On Windows, this
      causes an assertion failure if the user has switched away from the
      Session panel to some other panel of the config box, because when the
      list box isn't on screen, its Windows control object is actually
      destroyed.
      
      I think a sensible answer is that we shouldn't be doing that implicit
      load behaviour in any case if the list box isn't _visible_: silently
      loading and launching a session someone selected a lot of UI actions
      ago wasn't really the point. So now I make that behaviour only happen
      when the list box (i.e. the Session panel) _is_ visible. That should
      prevent the assertion failure on Windows, but the UI effect is cross-
      platform, applying even on GTK where the control objects for invisible
      panels persist and so the assertion failure didn't happen. I think
      it's a reasonable UI change to make globally.
      
      In order to implement it, I've had to invent a new query function so
      that config.c can tell whether a given control is visible. In order to
      do that on GTK, I had to give each control a pointer to the 'selparam'
      structure describing its config-box pane, so that query function could
      check it against the current one - and in order to do _that_, I had to
      first arrange that those 'selparam' structures have stable addresses
      from the moment they're first created, which meant adding a layer of
      indirection so that the array of them in the top-level dlgparam
      structure is now an array of _pointers_ rather than of actual structs.
      (That way, realloc half way through config box creation can't
      invalidate the important pointer values.)
      e790adec
  5. Feb 28, 2019
    • Simon Tatham's avatar
      New array-growing macros: sgrowarray and sgrowarrayn. · e0a76971
      Simon Tatham authored
      The idea of these is that they centralise the common idiom along the
      lines of
      
         if (logical_array_len >= physical_array_size) {
             physical_array_size = logical_array_len * 5 / 4 + 256;
             array = sresize(array, physical_array_size, ElementType);
         }
      
      which happens at a zillion call sites throughout this code base, with
      different random choices of the geometric factor and additive
      constant, sometimes forgetting them completely, and generally doing a
      lot of repeated work.
      
      The new macro sgrowarray(array,size,n) has the semantics: here are the
      array pointer and its physical size for you to modify, now please
      ensure that the nth element exists, so I can write into it. And
      sgrowarrayn(array,size,n,m) is the same except that it ensures that
      the array has size at least n+m (so sgrowarray is just the special
      case where m=1).
      
      Now that this is a single centralised implementation that will be used
      everywhere, I've also gone to more effort in the implementation, with
      careful overflow checks that would have been painful to put at all the
      previous call sites.
      
      This commit also switches over every use of sresize(), apart from a
      few where I really didn't think it would gain anything. A consequence
      of that is that a lot of array-size variables have to have their types
      changed to size_t, because the macros require that (they address-take
      the size to pass to the underlying function).
      e0a76971
  6. Nov 03, 2018
    • Simon Tatham's avatar
      Convert a lot of 'int' variables to 'bool'. · 3214563d
      Simon Tatham authored
      My normal habit these days, in new code, is to treat int and bool as
      _almost_ completely separate types. I'm still willing to use C's
      implicit test for zero on an integer (e.g. 'if (!blob.len)' is fine,
      no need to spell it out as blob.len != 0), but generally, if a
      variable is going to be conceptually a boolean, I like to declare it
      bool and assign to it using 'true' or 'false' rather than 0 or 1.
      
      PuTTY is an exception, because it predates the C99 bool, and I've
      stuck to its existing coding style even when adding new code to it.
      But it's been annoying me more and more, so now that I've decided C99
      bool is an acceptable thing to require from our toolchain in the first
      place, here's a quite thorough trawl through the source doing
      'boolification'. Many variables and function parameters are now typed
      as bool rather than int; many assignments of 0 or 1 to those variables
      are now spelled 'true' or 'false'.
      
      I managed this thorough conversion with the help of a custom clang
      plugin that I wrote to trawl the AST and apply heuristics to point out
      where things might want changing. So I've even managed to do a decent
      job on parts of the code I haven't looked at in years!
      
      To make the plugin's work easier, I pushed platform front ends
      generally in the direction of using standard 'bool' in preference to
      platform-specific boolean types like Windows BOOL or GTK's gboolean;
      I've left the platform booleans in places they _have_ to be for the
      platform APIs to work right, but variables only used by my own code
      have been converted wherever I found them.
      
      In a few places there are int values that look very like booleans in
      _most_ of the places they're used, but have a rarely-used third value,
      or a distinction between different nonzero values that most users
      don't care about. In these cases, I've _removed_ uses of 'true' and
      'false' for the return values, to emphasise that there's something
      more subtle going on than a simple boolean answer:
       - the 'multisel' field in dialog.h's list box structure, for which
         the GTK front end in particular recognises a difference between 1
         and 2 but nearly everything else treats as boolean
       - the 'urgent' parameter to plug_receive, where 1 vs 2 tells you
         something about the specific location of the urgent pointer, but
         most clients only care about 0 vs 'something nonzero'
       - the return value of wc_match, where -1 indicates a syntax error in
         the wildcard.
       - the return values from SSH-1 RSA-key loading functions, which use
         -1 for 'wrong passphrase' and 0 for all other failures (so any
         caller which already knows it's not loading an _encrypted private_
         key can treat them as boolean)
       - term->esc_query, and the 'query' parameter in toggle_mode in
         terminal.c, which _usually_ hold 0 for ESC[123h or 1 for ESC[?123h,
         but can also hold -1 for some other intervening character that we
         don't support.
      
      In a few places there's an integer that I haven't turned into a bool
      even though it really _can_ only take values 0 or 1 (and, as above,
      tried to make the call sites consistent in not calling those values
      true and false), on the grounds that I thought it would make it more
      confusing to imply that the 0 value was in some sense 'negative' or
      bad and the 1 positive or good:
       - the return value of plug_accepting uses the POSIXish convention of
         0=success and nonzero=error; I think if I made it bool then I'd
         also want to reverse its sense, and that's a job for a separate
         piece of work.
       - the 'screen' parameter to lineptr() in terminal.c, where 0 and 1
         represent the default and alternate screens. There's no obvious
         reason why one of those should be considered 'true' or 'positive'
         or 'success' - they're just indices - so I've left it as int.
      
      ssh_scp_recv had particularly confusing semantics for its previous int
      return value: its call sites used '<= 0' to check for error, but it
      never actually returned a negative number, just 0 or 1. Now the
      function and its call sites agree that it's a bool.
      
      In a couple of places I've renamed variables called 'ret', because I
      don't like that name any more - it's unclear whether it means the
      return value (in preparation) for the _containing_ function or the
      return value received from a subroutine call, and occasionally I've
      accidentally used the same variable for both and introduced a bug. So
      where one of those got in my way, I've renamed it to 'toret' or 'retd'
      (the latter short for 'returned') in line with my usual modern
      practice, but I haven't done a thorough job of finding all of them.
      
      Finally, one amusing side effect of doing this is that I've had to
      separate quite a few chained assignments. It used to be perfectly fine
      to write 'a = b = c = TRUE' when a,b,c were int and TRUE was just a
      the 'true' defined by stdbool.h, that idiom provokes a warning from
      gcc: 'suggest parentheses around assignment used as truth value'!
      3214563d
    • Simon Tatham's avatar
      Adopt C99 <stdbool.h>'s true/false. · a6f1709c
      Simon Tatham authored
      This commit includes <stdbool.h> from defs.h and deletes my
      traditional definitions of TRUE and FALSE, but other than that, it's a
      100% mechanical search-and-replace transforming all uses of TRUE and
      FALSE into the C99-standardised lowercase spellings.
      
      No actual types are changed in this commit; that will come next. This
      is just getting the noise out of the way, so that subsequent commits
      can have a higher proportion of signal.
      a6f1709c
  7. Sep 20, 2018
    • Simon Tatham's avatar
      Expose the structure tag 'dlgparam'. · 3aae1f9d
      Simon Tatham authored
      This continues my ongoing crusade against dangerous 'void *'
      parameters.
      3aae1f9d
    • Simon Tatham's avatar
      Remove some redundant utility macros. · fc375c0b
      Simon Tatham authored
      ATOFFSET in dialog.h became obsolete when the old 'struct Config' gave
      way to the new Conf, because its only use was to identify fields in
      struct Config for the generic control handlers to update.
      
      And lenof in ssh.h is redundant because there's also a copy in misc.h.
      (Which is already included _everywhere_ that lenof is used - I didn't
      even need to add any instances of #include "misc.h" after removing the
      copy in ssh.h.)
      fc375c0b
  8. Jun 20, 2015
    • Simon Tatham's avatar
      Completely remove the privdata mechanism in dialog.h. · 3ba1a7cf
      Simon Tatham authored
      The last use of it, to store the contents of the saved session name
      edit box, was removed nearly two years ago in svn r9923 and replaced
      by ctrl_alloc_with_free. The mechanism has been unused ever since
      then, and I suspect any further uses of it would be a bad idea for the
      same reasons, so let's get rid of it.
      
      (cherry picked from commit 42c592c4)
      3ba1a7cf
  9. May 15, 2015
    • Simon Tatham's avatar
      Giant const-correctness patch of doom! · 89da2ddf
      Simon Tatham authored
      Having found a lot of unfixed constness issues in recent development,
      I thought perhaps it was time to get proactive, so I compiled the
      whole codebase with -Wwrite-strings. That turned up a huge load of
      const problems, which I've fixed in this commit: the Unix build now
      goes cleanly through with -Wwrite-strings, and the Windows build is as
      close as I could get it (there are some lingering issues due to
      occasional Windows API functions like AcquireCredentialsHandle not
      having the right constness).
      
      Notable fallout beyond the purely mechanical changing of types:
       - the stuff saved by cmdline_save_param() is now explicitly
         dupstr()ed, and freed in cmdline_run_saved.
       - I couldn't make both string arguments to cmdline_process_param()
         const, because it intentionally writes to one of them in the case
         where it's the argument to -pw (in the vain hope of being at least
         slightly friendly to 'ps'), so elsewhere I had to temporarily
         dupstr() something for the sake of passing it to that function
       - I had to invent a silly parallel version of const_cmp() so I could
         pass const string literals in to lookup functions.
       - stripslashes() in pscp.c and psftp.c has the annoying strchr nature
      89da2ddf
  10. May 08, 2015
    • Simon Tatham's avatar
      Completely remove the privdata mechanism in dialog.h. · 42c592c4
      Simon Tatham authored
      The last use of it, to store the contents of the saved session name
      edit box, was removed nearly two years ago in svn r9923 and replaced
      by ctrl_alloc_with_free. The mechanism has been unused ever since
      then, and I suspect any further uses of it would be a bad idea for the
      same reasons, so let's get rid of it.
      42c592c4
  11. Sep 09, 2014
    • Simon Tatham's avatar
      Add an option to suppress horizontal scroll bars in list boxes. · f3860ec9
      Simon Tatham authored
      I'm about to add a list box which expects to contain some very long
      but uninformative strings, and which is also quite vertically squashed
      so there's not much room for a horizontal scroll bar to appear in it.
      So here's an option in the list box specification structure which
      causes the constructed GTKTreeView to use the 'ellipsize' option for
      all its cell renderers, i.e. too-long strings are truncated with an
      ellipsis.
      
      Windows needs no change, because its list boxes already work this way.
      
      [originally from svn r10219]
      f3860ec9
  12. Jul 14, 2013
  13. Oct 02, 2011
  14. Oct 01, 2011
    • Simon Tatham's avatar
      Change the semantics of 'FontSpec' so that it's a dynamically · 9c75fe9a
      Simon Tatham authored
      allocated type.
      
      The main reason for this is to stop it from taking up a fixed large
      amount of space in every 'struct value' subunion in conf.c, although
      that makes little difference so far because Filename is still doing
      the same thing (and is therefore next on my list). However, the
      removal of its arbitrary length limit is not to be sneezed at.
      
      [originally from svn r9314]
      9c75fe9a
  15. Jul 14, 2011
    • Simon Tatham's avatar
      Post-release destabilisation! Completely remove the struct type · a1f3b7a3
      Simon Tatham authored
      'Config' in putty.h, which stores all PuTTY's settings and includes an
      arbitrary length limit on every single one of those settings which is
      stored in string form. In place of it is 'Conf', an opaque data type
      everywhere outside the new file conf.c, which stores a list of (key,
      value) pairs in which every key contains an integer identifying a
      configuration setting, and for some of those integers the key also
      contains extra parts (so that, for instance, CONF_environmt is a
      string-to-string mapping). Everywhere that a Config was previously
      used, a Conf is now; everywhere there was a Config structure copy,
      conf_copy() is called; every lookup, adjustment, load and save
      operation on a Config has been rewritten; and there's a mechanism for
      serialising a Conf into a binary blob and back for use with Duplicate
      Session.
      
      User-visible effects of this change _should_ be minimal, though I
      don't doubt I've introduced one or two bugs here and there which will
      eventually be found. The _intended_ visible effects of this change are
      that all arbitrary limits on configuration strings and lists (e.g.
      limit on number of port forwardings) should now disappear; that list
      boxes in the configuration will now be displayed in a sorted order
      rather than the arbitrary order in which they were added to the list
      (since the underlying data structure is now a sorted tree234 rather
      than an ad-hoc comma-separated string); and one more specific change,
      which is that local and dynamic port forwardings on the same port
      number are now mutually exclusive in the configuration (putting 'D' in
      the key rather than the value was a mistake in the first place).
      
      One other reorganisation as a result of this is that I've moved all
      the dialog.c standard handlers (dlg_stdeditbox_handler and friends)
      out into config.c, because I can't really justify calling them generic
      any more. When they took a pointer to an arbitrary structure type and
      the offset of a field within that structure, they were independent of
      whether that structure was a Config or something completely different,
      but now they really do expect to talk to a Conf, which can _only_ be
      used for PuTTY configuration, so I've renamed them all things like
      conf_editbox_handler and moved them out of the nominally independent
      dialog-box management module into the PuTTY-specific config.c.
      
      [originally from svn r9214]
      a1f3b7a3
  16. Apr 02, 2008
  17. Aug 28, 2006
    • Simon Tatham's avatar
      Support for Windows PuTTY connecting straight to a local serial port · 34f74742
      Simon Tatham authored
      in place of making a network connection. This has involved a couple
      of minor infrastructure changes:
       - New dlg_label_change() function in the dialog.h interface, which
         alters the label on a control. Only used, at present, to switch
         the Host Name and Port boxes into Serial Line and Speed, which
         means that any platform not implementing serial connections (i.e.
         currently all but Windows) does not need to actually do anything
         in this function. Yet.
       - New small piece of infrastructure: cfg_launchable() determines
         whether a Config structure describes a session ready to be
         launched. This was previously determined by seeing if it had a
         non-empty host name, but it has to check the serial line as well
         so there's a centralised function for it. I haven't gone through
         all front ends and arranged for this function to be used
         everywhere it needs to be; so far I've only checked Windows.
       - Similarly, cfg_dest() returns the destination of a connection
         (host name or serial line) in a text format suitable for putting
         into messages such as `Unable to connect to %s'.
      
      [originally from svn r6815]
      34f74742
  18. Apr 09, 2003
  19. Mar 26, 2003
  20. Mar 18, 2003
    • Simon Tatham's avatar
      Big sprawling dialog-box commit covering all sorts of things. · 4d41247c
      Simon Tatham authored
      Buttons now have an `iscancel' flag to go with `isdefault';
      dlg_last_focused() now explicitly passes the control it _doesn't_
      care about (`I want the last control that had focus and isn't this
      one'); and in the GTK implementation, various fixes have happened,
      notably including arrow keys working sensibly in list boxes and the
      treeview and short font aliases being expanded correctly to
      initialise the font selectors.
      
      [originally from svn r2958]
      4d41247c
  21. Mar 17, 2003
  22. Mar 08, 2003
    • Simon Tatham's avatar
      Add the ability to allocate extra per-dialog-instance private data · 43fe7d3c
      Simon Tatham authored
      in the portable dialog interface. This has allowed me to remove
      `ssd->savedsession' in config.c, which was (I believe) the only
      out-of-place piece of per-instance data in the dialog template
      stuff. Now we should actually be able to run more than one config
      box in the same process at the same time (for platforms that'll find
      that useful).
      
      [originally from svn r2925]
      43fe7d3c
  23. Mar 05, 2003
    • Simon Tatham's avatar
      The long-awaited config box revamp! I've taken the whole config box · 616c837c
      Simon Tatham authored
      to pieces, and put it back together in a new table-driven form.
      config.c sets up a data structure describing most of the config box;
      wincfg.c adds in the Windows-specific options (so that config.c can
      also form the basis for Mac and Unix config boxes). Then winctrls.c
      contains a shiny new layout engine which consumes that data
      structure, and windlg.c passes all WM_COMMAND and similar messages
      to a driver alongside that layout engine. In the process I've sorted
      out nicer-looking panel titles and finally fixed the list-boxes-are-
      never-the-right-size bug (turned out to be Windows's fault, of
      course). I _believe_ it should do everything the old config box did,
      including context help. Now everyone has to test it thoroughly...
      
      [originally from svn r2908]
      616c837c
Loading