2002-10-07 20:45:23 +04:00
|
|
|
/*
|
2004-12-31 16:02:46 +03:00
|
|
|
* gtkwin.c: the main code that runs a PuTTY terminal emulator and
|
|
|
|
* backend in a GTK window.
|
2002-10-07 20:45:23 +04:00
|
|
|
*/
|
|
|
|
|
2002-10-23 18:21:12 +04:00
|
|
|
#define _GNU_SOURCE
|
|
|
|
|
2002-10-07 20:45:23 +04:00
|
|
|
#include <string.h>
|
2002-10-10 14:40:30 +04:00
|
|
|
#include <assert.h>
|
2002-10-07 20:45:23 +04:00
|
|
|
#include <stdlib.h>
|
2002-10-23 18:21:12 +04:00
|
|
|
#include <string.h>
|
2002-12-04 15:40:36 +03:00
|
|
|
#include <signal.h>
|
2002-10-09 22:09:42 +04:00
|
|
|
#include <stdio.h>
|
2002-10-07 20:45:23 +04:00
|
|
|
#include <time.h>
|
2002-10-10 16:40:05 +04:00
|
|
|
#include <errno.h>
|
2012-06-17 11:26:23 +04:00
|
|
|
#include <locale.h>
|
2002-10-10 16:40:05 +04:00
|
|
|
#include <fcntl.h>
|
|
|
|
#include <unistd.h>
|
2002-10-23 18:21:12 +04:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/wait.h>
|
2002-10-07 20:45:23 +04:00
|
|
|
#include <gtk/gtk.h>
|
2002-10-10 16:14:05 +04:00
|
|
|
#include <gdk/gdkkeysyms.h>
|
2002-10-31 22:49:52 +03:00
|
|
|
#include <gdk/gdkx.h>
|
|
|
|
#include <X11/Xlib.h>
|
|
|
|
#include <X11/Xutil.h>
|
2003-08-21 22:07:27 +04:00
|
|
|
#include <X11/Xatom.h>
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2012-06-17 11:26:23 +04:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
#include <gtk/gtkimmodule.h>
|
|
|
|
#endif
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
#define PUTTY_DO_GLOBALS /* actually _define_ globals */
|
2002-12-31 15:20:34 +03:00
|
|
|
|
2013-01-14 01:59:10 +04:00
|
|
|
#define MAY_REFER_TO_GTK_IN_HEADERS
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
#include "putty.h"
|
2002-10-22 20:11:33 +04:00
|
|
|
#include "terminal.h"
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
#include "gtkfont.h"
|
2002-10-09 22:09:42 +04:00
|
|
|
|
2002-10-07 20:45:23 +04:00
|
|
|
#define CAT2(x,y) x ## y
|
|
|
|
#define CAT(x,y) CAT2(x,y)
|
|
|
|
#define ASSERT(x) enum {CAT(assertion_,__LINE__) = 1 / (x)}
|
|
|
|
|
2010-03-14 21:58:20 +03:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
ASSERT(sizeof(long) <= sizeof(gsize));
|
|
|
|
#define LONG_TO_GPOINTER(l) GSIZE_TO_POINTER(l)
|
|
|
|
#define GPOINTER_TO_LONG(p) GPOINTER_TO_SIZE(p)
|
|
|
|
#else /* Gtk 1.2 */
|
|
|
|
ASSERT(sizeof(long) <= sizeof(gpointer));
|
|
|
|
#define LONG_TO_GPOINTER(l) ((gpointer)(long)(l))
|
|
|
|
#define GPOINTER_TO_LONG(p) ((long)(p))
|
|
|
|
#endif
|
|
|
|
|
2004-11-28 18:13:34 +03:00
|
|
|
/* Colours come in two flavours: configurable, and xterm-extended. */
|
|
|
|
#define NEXTCOLOURS 240 /* 216 colour-cube plus 24 shades of grey */
|
|
|
|
#define NALLCOLOURS (NCFGCOLOURS + NEXTCOLOURS)
|
2002-10-10 14:40:30 +04:00
|
|
|
|
2003-04-11 21:40:52 +04:00
|
|
|
GdkAtom compound_text_atom, utf8_string_atom;
|
|
|
|
|
2003-04-12 21:37:15 +04:00
|
|
|
extern char **pty_argv; /* declared in pty.c */
|
|
|
|
extern int use_pty_argv;
|
|
|
|
|
2004-11-27 16:20:21 +03:00
|
|
|
/*
|
|
|
|
* Timers are global across all sessions (even if we were handling
|
|
|
|
* multiple sessions, which we aren't), so the current timer ID is
|
|
|
|
* a global variable.
|
|
|
|
*/
|
|
|
|
static guint timer_id = 0;
|
|
|
|
|
2002-10-10 14:40:30 +04:00
|
|
|
struct gui_data {
|
2002-10-14 04:05:37 +04:00
|
|
|
GtkWidget *window, *area, *sbar;
|
2002-10-13 13:54:36 +04:00
|
|
|
GtkBox *hbox;
|
|
|
|
GtkAdjustment *sbar_adjust;
|
2004-08-14 17:04:18 +04:00
|
|
|
GtkWidget *menu, *specialsmenu, *specialsitem1, *specialsitem2,
|
|
|
|
*restartitem;
|
2003-04-12 21:37:15 +04:00
|
|
|
GtkWidget *sessionsmenu;
|
2002-10-10 14:40:30 +04:00
|
|
|
GdkPixmap *pixmap;
|
2012-06-17 11:26:23 +04:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
GtkIMContext *imc;
|
|
|
|
#endif
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
unifont *fonts[4]; /* normal, bold, wide, widebold */
|
2003-04-08 17:49:12 +04:00
|
|
|
int xpos, ypos, gotpos, gravity;
|
2005-02-15 20:05:58 +03:00
|
|
|
GdkCursor *rawcursor, *textcursor, *blankcursor, *waitcursor, *currcursor;
|
2004-11-28 18:13:34 +03:00
|
|
|
GdkColor cols[NALLCOLOURS];
|
2002-10-10 14:40:30 +04:00
|
|
|
GdkColormap *colmap;
|
2002-10-13 15:24:25 +04:00
|
|
|
wchar_t *pastein_data;
|
2003-01-02 19:17:56 +03:00
|
|
|
int direct_to_font;
|
2002-10-13 15:24:25 +04:00
|
|
|
int pastein_data_len;
|
2003-05-13 23:57:17 +04:00
|
|
|
char *pasteout_data, *pasteout_data_ctext, *pasteout_data_utf8;
|
|
|
|
int pasteout_data_len, pasteout_data_ctext_len, pasteout_data_utf8_len;
|
2002-10-10 18:42:56 +04:00
|
|
|
int font_width, font_height;
|
2003-04-10 22:00:50 +04:00
|
|
|
int width, height;
|
2002-10-13 16:44:01 +04:00
|
|
|
int ignore_sbar;
|
2002-10-15 03:39:07 +04:00
|
|
|
int mouseptr_visible;
|
2005-02-15 20:05:58 +03:00
|
|
|
int busy_status;
|
2002-10-15 03:32:00 +04:00
|
|
|
guint term_paste_idle_id;
|
2008-11-17 21:36:27 +03:00
|
|
|
guint term_exit_idle_id;
|
2002-10-15 21:18:24 +04:00
|
|
|
int alt_keycode;
|
2002-10-28 20:34:45 +03:00
|
|
|
int alt_digits;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
char *wintitle;
|
|
|
|
char *icontitle;
|
2003-03-29 21:30:14 +03:00
|
|
|
int master_fd, master_func_id;
|
2002-10-26 14:16:19 +04:00
|
|
|
void *ldisc;
|
2002-10-26 14:33:59 +04:00
|
|
|
Backend *back;
|
|
|
|
void *backhandle;
|
2002-10-26 15:08:59 +04:00
|
|
|
Terminal *term;
|
2002-10-26 16:58:13 +04:00
|
|
|
void *logctx;
|
2003-03-29 21:30:14 +03:00
|
|
|
int exited;
|
2003-01-14 21:28:23 +03:00
|
|
|
struct unicode_data ucsdata;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
Conf *conf;
|
2003-04-09 22:46:45 +04:00
|
|
|
void *eventlogstuff;
|
2003-04-12 21:37:15 +04:00
|
|
|
char *progname, **gtkargvstart;
|
|
|
|
int ngtkargs;
|
2003-08-21 22:03:06 +04:00
|
|
|
guint32 input_event_time; /* Timestamp of the most recent input event. */
|
2005-03-10 13:07:27 +03:00
|
|
|
int reconfiguring;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
/* Cached things out of conf that we refer to a lot */
|
2012-06-09 19:09:22 +04:00
|
|
|
int bold_style;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int window_border;
|
|
|
|
int cursor_type;
|
2002-10-26 16:58:13 +04:00
|
|
|
};
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
static void cache_conf_values(struct gui_data *inst)
|
|
|
|
{
|
2012-06-09 19:09:22 +04:00
|
|
|
inst->bold_style = conf_get_int(inst->conf, CONF_bold_style);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->window_border = conf_get_int(inst->conf, CONF_window_border);
|
|
|
|
inst->cursor_type = conf_get_int(inst->conf, CONF_cursor_type);
|
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
struct draw_ctx {
|
|
|
|
GdkGC *gc;
|
|
|
|
struct gui_data *inst;
|
2002-10-10 14:40:30 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
static int send_raw_mouse;
|
|
|
|
|
2002-10-31 22:49:52 +03:00
|
|
|
static char *app_name = "pterm";
|
|
|
|
|
2004-08-14 17:04:18 +04:00
|
|
|
static void start_backend(struct gui_data *inst);
|
|
|
|
|
2003-01-14 21:43:45 +03:00
|
|
|
char *x_get_default(const char *key)
|
2002-10-31 22:49:52 +03:00
|
|
|
{
|
|
|
|
return XGetDefault(GDK_DISPLAY(), app_name, key);
|
|
|
|
}
|
|
|
|
|
2003-04-01 22:10:25 +04:00
|
|
|
void connection_fatal(void *frontend, char *p, ...)
|
|
|
|
{
|
Rationalisation of the system of frontend handles. Most modular bits
of PuTTY (terminal, backend, logctx etc) take a `void *' handle
passed to them from the frontend, and used as a context for all
their callbacks. Most of these point at the frontend structure
itself (on platforms where this is meaningful), except that the
handle passed to the backend has always pointed at the terminal
because from_backend() was implemented in terminal.c. This has
finally bitten Unix PuTTY, because both backend and logctx have
been passing their respective and very different frontend handles to
logevent(), so I've fixed it.
from_backend() is now a function supplied by the _frontend_ itself,
in all cases, and the frontend handle passed to backends must be the
same as that passed to everything else. What was from_backend() in
terminal.c is now called term_data(), and the typical implementation
of from_backend() in a GUI frontend will just extract the terminal
handle from the frontend structure and delegate to that.
This appears to work on Unix and Windows, but has most likely broken
the Mac build.
[originally from svn r3100]
2003-04-11 22:36:27 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2003-04-01 22:10:25 +04:00
|
|
|
|
|
|
|
va_list ap;
|
|
|
|
char *msg;
|
|
|
|
va_start(ap, p);
|
|
|
|
msg = dupvprintf(p, ap);
|
|
|
|
va_end(ap);
|
|
|
|
inst->exited = TRUE;
|
|
|
|
fatal_message_box(inst->window, msg);
|
|
|
|
sfree(msg);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(inst->conf, CONF_close_on_exit) == FORCE_ON)
|
2003-04-01 22:10:25 +04:00
|
|
|
cleanup_exit(1);
|
|
|
|
}
|
|
|
|
|
2003-01-09 21:06:29 +03:00
|
|
|
/*
|
|
|
|
* Default settings that are specific to pterm.
|
|
|
|
*/
|
2011-10-01 21:38:59 +04:00
|
|
|
FontSpec *platform_default_fontspec(const char *name)
|
2003-01-09 21:06:29 +03:00
|
|
|
{
|
|
|
|
if (!strcmp(name, "Font"))
|
2011-10-01 21:38:59 +04:00
|
|
|
return fontspec_new("server:fixed");
|
2003-02-01 15:54:40 +03:00
|
|
|
else
|
2011-10-01 21:38:59 +04:00
|
|
|
return fontspec_new("");
|
2003-02-01 15:54:40 +03:00
|
|
|
}
|
|
|
|
|
2011-10-02 15:01:57 +04:00
|
|
|
Filename *platform_default_filename(const char *name)
|
2003-02-01 15:54:40 +03:00
|
|
|
{
|
|
|
|
if (!strcmp(name, "LogFileName"))
|
2011-10-02 15:01:57 +04:00
|
|
|
return filename_from_str("putty.log");
|
2003-02-01 15:54:40 +03:00
|
|
|
else
|
2011-10-02 15:01:57 +04:00
|
|
|
return filename_from_str("");
|
2003-02-01 15:54:40 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
char *platform_default_s(const char *name)
|
|
|
|
{
|
2006-08-28 18:29:02 +04:00
|
|
|
if (!strcmp(name, "SerialLine"))
|
|
|
|
return dupstr("/dev/ttyS0");
|
2003-01-09 21:06:29 +03:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2003-01-14 21:43:45 +03:00
|
|
|
int platform_default_i(const char *name, int def)
|
2003-01-09 21:06:29 +03:00
|
|
|
{
|
|
|
|
if (!strcmp(name, "CloseOnExit"))
|
2003-01-28 15:06:37 +03:00
|
|
|
return 2; /* maps to FORCE_ON after painful rearrangement :-( */
|
2003-04-26 17:55:47 +04:00
|
|
|
if (!strcmp(name, "WinNameAlways"))
|
|
|
|
return 0; /* X natively supports icon titles, so use 'em by default */
|
2003-01-09 21:06:29 +03:00
|
|
|
return def;
|
|
|
|
}
|
|
|
|
|
2009-08-22 03:25:48 +04:00
|
|
|
/* Dummy routine, only required in plink. */
|
2002-10-26 14:16:19 +04:00
|
|
|
void ldisc_update(void *frontend, int echo, int edit)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2005-04-21 17:57:08 +04:00
|
|
|
char *get_ttymode(void *frontend, const char *mode)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
return term_get_ttymode(inst->term, mode);
|
|
|
|
}
|
|
|
|
|
Rationalisation of the system of frontend handles. Most modular bits
of PuTTY (terminal, backend, logctx etc) take a `void *' handle
passed to them from the frontend, and used as a context for all
their callbacks. Most of these point at the frontend structure
itself (on platforms where this is meaningful), except that the
handle passed to the backend has always pointed at the terminal
because from_backend() was implemented in terminal.c. This has
finally bitten Unix PuTTY, because both backend and logctx have
been passing their respective and very different frontend handles to
logevent(), so I've fixed it.
from_backend() is now a function supplied by the _frontend_ itself,
in all cases, and the frontend handle passed to backends must be the
same as that passed to everything else. What was from_backend() in
terminal.c is now called term_data(), and the typical implementation
of from_backend() in a GUI frontend will just extract the terminal
handle from the frontend structure and delegate to that.
This appears to work on Unix and Windows, but has most likely broken
the Mac build.
[originally from svn r3100]
2003-04-11 22:36:27 +04:00
|
|
|
int from_backend(void *frontend, int is_stderr, const char *data, int len)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
return term_data(inst->term, is_stderr, data, len);
|
|
|
|
}
|
|
|
|
|
2005-10-30 23:24:09 +03:00
|
|
|
int from_backend_untrusted(void *frontend, const char *data, int len)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
return term_data_untrusted(inst->term, data, len);
|
|
|
|
}
|
|
|
|
|
2011-09-13 15:44:03 +04:00
|
|
|
int from_backend_eof(void *frontend)
|
|
|
|
{
|
|
|
|
return TRUE; /* do respond to incoming EOF with outgoing */
|
|
|
|
}
|
|
|
|
|
2005-10-30 23:24:09 +03:00
|
|
|
int get_userpass_input(prompts_t *p, unsigned char *in, int inlen)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)p->frontend;
|
|
|
|
int ret;
|
|
|
|
ret = cmdline_get_passwd_input(p, in, inlen);
|
|
|
|
if (ret == -1)
|
|
|
|
ret = term_get_userpass_input(inst->term, p, in, inlen);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2003-05-04 18:18:18 +04:00
|
|
|
void logevent(void *frontend, const char *string)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
Rationalisation of the system of frontend handles. Most modular bits
of PuTTY (terminal, backend, logctx etc) take a `void *' handle
passed to them from the frontend, and used as a context for all
their callbacks. Most of these point at the frontend structure
itself (on platforms where this is meaningful), except that the
handle passed to the backend has always pointed at the terminal
because from_backend() was implemented in terminal.c. This has
finally bitten Unix PuTTY, because both backend and logctx have
been passing their respective and very different frontend handles to
logevent(), so I've fixed it.
from_backend() is now a function supplied by the _frontend_ itself,
in all cases, and the frontend handle passed to backends must be the
same as that passed to everything else. What was from_backend() in
terminal.c is now called term_data(), and the typical implementation
of from_backend() in a GUI frontend will just extract the terminal
handle from the frontend structure and delegate to that.
This appears to work on Unix and Windows, but has most likely broken
the Mac build.
[originally from svn r3100]
2003-04-11 22:36:27 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2003-04-09 22:46:45 +04:00
|
|
|
|
|
|
|
log_eventlog(inst->logctx, string);
|
|
|
|
|
|
|
|
logevent_dlg(inst->eventlogstuff, string);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
int font_dimension(void *frontend, int which)/* 0 for width, 1 for height */
|
2002-10-15 19:16:21 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
|
2002-10-15 19:16:21 +04:00
|
|
|
if (which)
|
|
|
|
return inst->font_height;
|
|
|
|
else
|
|
|
|
return inst->font_width;
|
|
|
|
}
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
/*
|
|
|
|
* Translate a raw mouse button designation (LEFT, MIDDLE, RIGHT)
|
|
|
|
* into a cooked one (SELECT, EXTEND, PASTE).
|
|
|
|
*
|
|
|
|
* In Unix, this is not configurable; the X button arrangement is
|
|
|
|
* rock-solid across all applications, everyone has a three-button
|
|
|
|
* mouse or a means of faking it, and there is no need to switch
|
|
|
|
* buttons around at all.
|
|
|
|
*/
|
2003-01-25 19:23:48 +03:00
|
|
|
static Mouse_Button translate_button(Mouse_Button button)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
/* struct gui_data *inst = (struct gui_data *)frontend; */
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
if (button == MBT_LEFT)
|
|
|
|
return MBT_SELECT;
|
|
|
|
if (button == MBT_MIDDLE)
|
|
|
|
return MBT_PASTE;
|
|
|
|
if (button == MBT_RIGHT)
|
|
|
|
return MBT_EXTEND;
|
|
|
|
return 0; /* shouldn't happen */
|
|
|
|
}
|
|
|
|
|
2003-03-31 15:21:07 +04:00
|
|
|
/*
|
|
|
|
* Return the top-level GtkWindow associated with a particular
|
|
|
|
* front end instance.
|
|
|
|
*/
|
|
|
|
void *get_window(void *frontend)
|
|
|
|
{
|
Rationalisation of the system of frontend handles. Most modular bits
of PuTTY (terminal, backend, logctx etc) take a `void *' handle
passed to them from the frontend, and used as a context for all
their callbacks. Most of these point at the frontend structure
itself (on platforms where this is meaningful), except that the
handle passed to the backend has always pointed at the terminal
because from_backend() was implemented in terminal.c. This has
finally bitten Unix PuTTY, because both backend and logctx have
been passing their respective and very different frontend handles to
logevent(), so I've fixed it.
from_backend() is now a function supplied by the _frontend_ itself,
in all cases, and the frontend handle passed to backends must be the
same as that passed to everything else. What was from_backend() in
terminal.c is now called term_data(), and the typical implementation
of from_backend() in a GUI frontend will just extract the terminal
handle from the frontend structure and delegate to that.
This appears to work on Unix and Windows, but has most likely broken
the Mac build.
[originally from svn r3100]
2003-04-11 22:36:27 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2003-03-31 15:21:07 +04:00
|
|
|
return inst->window;
|
|
|
|
}
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
/*
|
|
|
|
* Minimise or restore the window in response to a server-side
|
|
|
|
* request.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_iconic(void *frontend, int iconic)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-15 18:31:06 +04:00
|
|
|
/*
|
|
|
|
* GTK 1.2 doesn't know how to do this.
|
|
|
|
*/
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-15 18:31:06 +04:00
|
|
|
if (iconic)
|
|
|
|
gtk_window_iconify(GTK_WINDOW(inst->window));
|
|
|
|
else
|
|
|
|
gtk_window_deiconify(GTK_WINDOW(inst->window));
|
|
|
|
#endif
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Move the window in response to a server-side request.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void move_window(void *frontend, int x, int y)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-15 18:31:06 +04:00
|
|
|
/*
|
|
|
|
* I assume that when the GTK version of this call is available
|
|
|
|
* we should use it. Not sure how it differs from the GDK one,
|
|
|
|
* though.
|
|
|
|
*/
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
gtk_window_move(GTK_WINDOW(inst->window), x, y);
|
|
|
|
#else
|
|
|
|
gdk_window_move(inst->window->window, x, y);
|
|
|
|
#endif
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Move the window to the top or bottom of the z-order in response
|
|
|
|
* to a server-side request.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_zorder(void *frontend, int top)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-15 18:31:06 +04:00
|
|
|
if (top)
|
|
|
|
gdk_window_raise(inst->window->window);
|
|
|
|
else
|
|
|
|
gdk_window_lower(inst->window->window);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Refresh the window in response to a server-side request.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void refresh_window(void *frontend)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-26 15:08:59 +04:00
|
|
|
term_invalidate(inst->term);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Maximise or restore the window in response to a server-side
|
|
|
|
* request.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_zoomed(void *frontend, int zoomed)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-15 18:31:06 +04:00
|
|
|
/*
|
|
|
|
* GTK 1.2 doesn't know how to do this.
|
|
|
|
*/
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2007-01-25 22:33:29 +03:00
|
|
|
if (zoomed)
|
2002-10-15 18:31:06 +04:00
|
|
|
gtk_window_maximize(GTK_WINDOW(inst->window));
|
|
|
|
else
|
|
|
|
gtk_window_unmaximize(GTK_WINDOW(inst->window));
|
|
|
|
#endif
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Report whether the window is iconic, for terminal reports.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
int is_iconic(void *frontend)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-15 18:31:06 +04:00
|
|
|
return !gdk_window_is_viewable(inst->window->window);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Report the window's position, for terminal reports.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void get_window_pos(void *frontend, int *x, int *y)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-15 18:31:06 +04:00
|
|
|
/*
|
|
|
|
* I assume that when the GTK version of this call is available
|
|
|
|
* we should use it. Not sure how it differs from the GDK one,
|
|
|
|
* though.
|
|
|
|
*/
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
gtk_window_get_position(GTK_WINDOW(inst->window), x, y);
|
|
|
|
#else
|
|
|
|
gdk_window_get_position(inst->window->window, x, y);
|
|
|
|
#endif
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Report the window's pixel size, for terminal reports.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void get_window_pixels(void *frontend, int *x, int *y)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-15 18:31:06 +04:00
|
|
|
/*
|
|
|
|
* I assume that when the GTK version of this call is available
|
|
|
|
* we should use it. Not sure how it differs from the GDK one,
|
|
|
|
* though.
|
|
|
|
*/
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
gtk_window_get_size(GTK_WINDOW(inst->window), x, y);
|
|
|
|
#else
|
|
|
|
gdk_window_get_size(inst->window->window, x, y);
|
|
|
|
#endif
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Return the window or icon title.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
char *get_window_title(void *frontend, int icon)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2003-05-10 13:05:41 +04:00
|
|
|
return icon ? inst->icontitle : inst->wintitle;
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
2002-10-07 20:45:23 +04:00
|
|
|
|
|
|
|
gint delete_window(GtkWidget *widget, GdkEvent *event, gpointer data)
|
|
|
|
{
|
2003-04-11 22:15:47 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (!inst->exited && conf_get_int(inst->conf, CONF_warn_on_close)) {
|
Rationalisation of the system of frontend handles. Most modular bits
of PuTTY (terminal, backend, logctx etc) take a `void *' handle
passed to them from the frontend, and used as a context for all
their callbacks. Most of these point at the frontend structure
itself (on platforms where this is meaningful), except that the
handle passed to the backend has always pointed at the terminal
because from_backend() was implemented in terminal.c. This has
finally bitten Unix PuTTY, because both backend and logctx have
been passing their respective and very different frontend handles to
logevent(), so I've fixed it.
from_backend() is now a function supplied by the _frontend_ itself,
in all cases, and the frontend handle passed to backends must be the
same as that passed to everything else. What was from_backend() in
terminal.c is now called term_data(), and the typical implementation
of from_backend() in a GUI frontend will just extract the terminal
handle from the frontend structure and delegate to that.
This appears to work on Unix and Windows, but has most likely broken
the Mac build.
[originally from svn r3100]
2003-04-11 22:36:27 +04:00
|
|
|
if (!reallyclose(inst))
|
2003-04-11 22:15:47 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
2002-10-07 20:45:23 +04:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2005-02-15 20:05:58 +03:00
|
|
|
static void update_mouseptr(struct gui_data *inst)
|
|
|
|
{
|
|
|
|
switch (inst->busy_status) {
|
|
|
|
case BUSY_NOT:
|
|
|
|
if (!inst->mouseptr_visible) {
|
|
|
|
gdk_window_set_cursor(inst->area->window, inst->blankcursor);
|
|
|
|
} else if (send_raw_mouse) {
|
|
|
|
gdk_window_set_cursor(inst->area->window, inst->rawcursor);
|
|
|
|
} else {
|
|
|
|
gdk_window_set_cursor(inst->area->window, inst->textcursor);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case BUSY_WAITING: /* XXX can we do better? */
|
|
|
|
case BUSY_CPU:
|
|
|
|
/* We always display these cursors. */
|
|
|
|
gdk_window_set_cursor(inst->area->window, inst->waitcursor);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
assert(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
static void show_mouseptr(struct gui_data *inst, int show)
|
2002-10-14 13:58:27 +04:00
|
|
|
{
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (!conf_get_int(inst->conf, CONF_hide_mouseptr))
|
2002-10-14 13:58:27 +04:00
|
|
|
show = 1;
|
2002-10-15 03:39:07 +04:00
|
|
|
inst->mouseptr_visible = show;
|
2005-02-15 20:05:58 +03:00
|
|
|
update_mouseptr(inst);
|
2002-10-14 13:58:27 +04:00
|
|
|
}
|
|
|
|
|
2003-05-13 22:14:14 +04:00
|
|
|
void draw_backing_rect(struct gui_data *inst)
|
|
|
|
{
|
|
|
|
GdkGC *gc = gdk_gc_new(inst->area->window);
|
2004-11-30 04:07:29 +03:00
|
|
|
gdk_gc_set_foreground(gc, &inst->cols[258]); /* default background */
|
2003-05-13 22:14:14 +04:00
|
|
|
gdk_draw_rectangle(inst->pixmap, gc, 1, 0, 0,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->width * inst->font_width + 2*inst->window_border,
|
|
|
|
inst->height * inst->font_height + 2*inst->window_border);
|
2003-05-13 22:14:14 +04:00
|
|
|
gdk_gc_unref(gc);
|
|
|
|
}
|
|
|
|
|
2002-10-07 20:45:23 +04:00
|
|
|
gint configure_area(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2002-10-13 16:44:01 +04:00
|
|
|
int w, h, need_size = 0;
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2003-04-12 15:03:44 +04:00
|
|
|
/*
|
|
|
|
* See if the terminal size has changed, in which case we must
|
|
|
|
* let the terminal know.
|
|
|
|
*/
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
w = (event->width - 2*inst->window_border) / inst->font_width;
|
|
|
|
h = (event->height - 2*inst->window_border) / inst->font_height;
|
2003-04-10 22:00:50 +04:00
|
|
|
if (w != inst->width || h != inst->height) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->width = w;
|
|
|
|
inst->height = h;
|
|
|
|
conf_set_int(inst->conf, CONF_width, inst->width);
|
|
|
|
conf_set_int(inst->conf, CONF_height, inst->height);
|
2002-10-13 16:44:01 +04:00
|
|
|
need_size = 1;
|
|
|
|
}
|
2003-04-12 15:03:44 +04:00
|
|
|
|
|
|
|
if (inst->pixmap) {
|
|
|
|
gdk_pixmap_unref(inst->pixmap);
|
|
|
|
inst->pixmap = NULL;
|
2002-10-13 13:54:36 +04:00
|
|
|
}
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2003-04-12 15:03:44 +04:00
|
|
|
inst->pixmap = gdk_pixmap_new(widget->window,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
(w * inst->font_width + 2*inst->window_border),
|
|
|
|
(h * inst->font_height + 2*inst->window_border), -1);
|
2003-04-12 15:03:44 +04:00
|
|
|
|
2003-05-13 22:14:14 +04:00
|
|
|
draw_backing_rect(inst);
|
2003-04-12 15:03:44 +04:00
|
|
|
|
|
|
|
if (need_size && inst->term) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
term_size(inst->term, h, w, conf_get_int(inst->conf, CONF_savelines));
|
2002-10-13 16:44:01 +04:00
|
|
|
}
|
|
|
|
|
2003-04-12 15:03:44 +04:00
|
|
|
if (inst->term)
|
|
|
|
term_invalidate(inst->term);
|
|
|
|
|
2012-06-17 11:26:23 +04:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
gtk_im_context_set_client_window(inst->imc, widget->window);
|
|
|
|
#endif
|
|
|
|
|
2002-10-07 20:45:23 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
gint expose_area(GtkWidget *widget, GdkEventExpose *event, gpointer data)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2002-10-07 20:45:23 +04:00
|
|
|
|
|
|
|
/*
|
2002-10-09 22:09:42 +04:00
|
|
|
* Pass the exposed rectangle to terminal.c, which will call us
|
|
|
|
* back to do the actual painting.
|
2002-10-07 20:45:23 +04:00
|
|
|
*/
|
2002-10-13 13:54:36 +04:00
|
|
|
if (inst->pixmap) {
|
|
|
|
gdk_draw_pixmap(widget->window,
|
|
|
|
widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
|
|
|
|
inst->pixmap,
|
|
|
|
event->area.x, event->area.y,
|
|
|
|
event->area.x, event->area.y,
|
|
|
|
event->area.width, event->area.height);
|
|
|
|
}
|
2002-10-09 22:09:42 +04:00
|
|
|
return TRUE;
|
2002-10-07 20:45:23 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
#define KEY_PRESSED(k) \
|
|
|
|
(inst->keystate[(k) / 32] & (1 << ((k) % 32)))
|
|
|
|
|
|
|
|
gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2009-02-28 19:52:42 +03:00
|
|
|
char output[256];
|
2003-04-27 15:10:48 +04:00
|
|
|
wchar_t ucsoutput[2];
|
2009-02-28 19:52:42 +03:00
|
|
|
int ucsval, start, end, special, output_charset, use_ucsoutput;
|
2012-07-06 03:45:20 +04:00
|
|
|
int nethack_mode, app_keypad_mode;
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2003-08-21 22:03:06 +04:00
|
|
|
/* Remember the timestamp. */
|
|
|
|
inst->input_event_time = event->time;
|
|
|
|
|
2002-10-15 21:18:24 +04:00
|
|
|
/* By default, nothing is generated. */
|
|
|
|
end = start = 0;
|
2003-04-27 15:10:48 +04:00
|
|
|
special = use_ucsoutput = FALSE;
|
2009-02-28 19:52:42 +03:00
|
|
|
output_charset = CS_ISO8859_1;
|
2002-10-15 21:18:24 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If Alt is being released after typing an Alt+numberpad
|
|
|
|
* sequence, we should generate the code that was typed.
|
2002-10-28 20:34:45 +03:00
|
|
|
*
|
|
|
|
* Note that we only do this if more than one key was actually
|
|
|
|
* pressed - I don't think Alt+NumPad4 should be ^D or that
|
|
|
|
* Alt+NumPad3 should be ^C, for example. There's no serious
|
|
|
|
* inconvenience in having to type a zero before a single-digit
|
|
|
|
* character code.
|
2002-10-15 21:18:24 +04:00
|
|
|
*/
|
2012-06-17 11:26:23 +04:00
|
|
|
if (event->type == GDK_KEY_RELEASE) {
|
|
|
|
if ((event->keyval == GDK_Meta_L || event->keyval == GDK_Alt_L ||
|
|
|
|
event->keyval == GDK_Meta_R || event->keyval == GDK_Alt_R) &&
|
|
|
|
inst->alt_keycode >= 0 && inst->alt_digits > 1) {
|
2002-10-15 21:18:24 +04:00
|
|
|
#ifdef KEY_DEBUGGING
|
2012-06-17 11:26:23 +04:00
|
|
|
printf("Alt key up, keycode = %d\n", inst->alt_keycode);
|
|
|
|
#endif
|
|
|
|
/*
|
|
|
|
* FIXME: we might usefully try to do something clever here
|
|
|
|
* about interpreting the generated key code in a way that's
|
|
|
|
* appropriate to the line code page.
|
|
|
|
*/
|
|
|
|
output[0] = inst->alt_keycode;
|
|
|
|
end = 1;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
if (gtk_im_context_filter_keypress(inst->imc, event))
|
|
|
|
return TRUE;
|
2002-10-15 21:18:24 +04:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
if (event->type == GDK_KEY_PRESS) {
|
2002-10-10 16:14:05 +04:00
|
|
|
#ifdef KEY_DEBUGGING
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
printf("keypress: keyval = %04x, state = %08x; string =",
|
|
|
|
event->keyval, event->state);
|
|
|
|
for (i = 0; event->string[i]; i++)
|
|
|
|
printf(" %02x", (unsigned char) event->string[i]);
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
2002-10-15 21:18:24 +04:00
|
|
|
* NYI: Compose key (!!! requires Unicode faff before even trying)
|
2002-10-10 16:14:05 +04:00
|
|
|
*/
|
|
|
|
|
2002-10-15 21:18:24 +04:00
|
|
|
/*
|
|
|
|
* If Alt has just been pressed, we start potentially
|
|
|
|
* accumulating an Alt+numberpad code. We do this by
|
|
|
|
* setting alt_keycode to -1 (nothing yet but plausible).
|
|
|
|
*/
|
|
|
|
if ((event->keyval == GDK_Meta_L || event->keyval == GDK_Alt_L ||
|
|
|
|
event->keyval == GDK_Meta_R || event->keyval == GDK_Alt_R)) {
|
|
|
|
inst->alt_keycode = -1;
|
2002-10-28 20:34:45 +03:00
|
|
|
inst->alt_digits = 0;
|
2002-10-15 21:18:24 +04:00
|
|
|
goto done; /* this generates nothing else */
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If we're seeing a numberpad key press with Mod1 down,
|
|
|
|
* consider adding it to alt_keycode if that's sensible.
|
|
|
|
* Anything _else_ with Mod1 down cancels any possibility
|
|
|
|
* of an ALT keycode: we set alt_keycode to -2.
|
|
|
|
*/
|
|
|
|
if ((event->state & GDK_MOD1_MASK) && inst->alt_keycode != -2) {
|
|
|
|
int digit = -1;
|
|
|
|
switch (event->keyval) {
|
|
|
|
case GDK_KP_0: case GDK_KP_Insert: digit = 0; break;
|
|
|
|
case GDK_KP_1: case GDK_KP_End: digit = 1; break;
|
|
|
|
case GDK_KP_2: case GDK_KP_Down: digit = 2; break;
|
|
|
|
case GDK_KP_3: case GDK_KP_Page_Down: digit = 3; break;
|
|
|
|
case GDK_KP_4: case GDK_KP_Left: digit = 4; break;
|
|
|
|
case GDK_KP_5: case GDK_KP_Begin: digit = 5; break;
|
|
|
|
case GDK_KP_6: case GDK_KP_Right: digit = 6; break;
|
|
|
|
case GDK_KP_7: case GDK_KP_Home: digit = 7; break;
|
|
|
|
case GDK_KP_8: case GDK_KP_Up: digit = 8; break;
|
|
|
|
case GDK_KP_9: case GDK_KP_Page_Up: digit = 9; break;
|
|
|
|
}
|
|
|
|
if (digit < 0)
|
|
|
|
inst->alt_keycode = -2; /* it's invalid */
|
|
|
|
else {
|
|
|
|
#ifdef KEY_DEBUGGING
|
|
|
|
printf("Adding digit %d to keycode %d", digit,
|
|
|
|
inst->alt_keycode);
|
|
|
|
#endif
|
|
|
|
if (inst->alt_keycode == -1)
|
|
|
|
inst->alt_keycode = digit; /* one-digit code */
|
|
|
|
else
|
|
|
|
inst->alt_keycode = inst->alt_keycode * 10 + digit;
|
2002-10-28 20:34:45 +03:00
|
|
|
inst->alt_digits++;
|
2002-10-15 21:18:24 +04:00
|
|
|
#ifdef KEY_DEBUGGING
|
|
|
|
printf(" gives new code %d\n", inst->alt_keycode);
|
|
|
|
#endif
|
|
|
|
/* Having used this digit, we now do nothing more with it. */
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-10-13 13:54:36 +04:00
|
|
|
/*
|
|
|
|
* Shift-PgUp and Shift-PgDn don't even generate keystrokes
|
|
|
|
* at all.
|
|
|
|
*/
|
|
|
|
if (event->keyval == GDK_Page_Up && (event->state & GDK_SHIFT_MASK)) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
term_scroll(inst->term, 0, -inst->height/2);
|
2002-10-13 13:54:36 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
2003-01-14 14:24:26 +03:00
|
|
|
if (event->keyval == GDK_Page_Up && (event->state & GDK_CONTROL_MASK)) {
|
|
|
|
term_scroll(inst->term, 0, -1);
|
|
|
|
return TRUE;
|
|
|
|
}
|
2002-10-13 13:54:36 +04:00
|
|
|
if (event->keyval == GDK_Page_Down && (event->state & GDK_SHIFT_MASK)) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
term_scroll(inst->term, 0, +inst->height/2);
|
2002-10-13 13:54:36 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
2003-01-14 14:24:26 +03:00
|
|
|
if (event->keyval == GDK_Page_Down && (event->state & GDK_CONTROL_MASK)) {
|
|
|
|
term_scroll(inst->term, 0, +1);
|
|
|
|
return TRUE;
|
|
|
|
}
|
2002-10-13 13:54:36 +04:00
|
|
|
|
2002-10-13 15:27:39 +04:00
|
|
|
/*
|
|
|
|
* Neither does Shift-Ins.
|
|
|
|
*/
|
|
|
|
if (event->keyval == GDK_Insert && (event->state & GDK_SHIFT_MASK)) {
|
2002-10-26 16:58:13 +04:00
|
|
|
request_paste(inst);
|
2002-10-13 15:27:39 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-04-12 13:27:56 +04:00
|
|
|
special = FALSE;
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2003-04-12 13:27:56 +04:00
|
|
|
|
2012-07-06 03:45:20 +04:00
|
|
|
nethack_mode = conf_get_int(inst->conf, CONF_nethack_keypad);
|
|
|
|
app_keypad_mode = (inst->term->app_keypad_keys &&
|
|
|
|
!conf_get_int(inst->conf, CONF_no_applic_k));
|
|
|
|
|
2002-10-10 16:14:05 +04:00
|
|
|
/* ALT+things gives leading Escape. */
|
|
|
|
output[0] = '\033';
|
2009-02-28 19:52:42 +03:00
|
|
|
#if !GTK_CHECK_VERSION(2,0,0)
|
|
|
|
/*
|
|
|
|
* In vanilla X, and hence also GDK 1.2, the string received
|
|
|
|
* as part of a keyboard event is assumed to be in
|
|
|
|
* ISO-8859-1. (Seems woefully shortsighted in i18n terms,
|
|
|
|
* but it's true: see the man page for XLookupString(3) for
|
|
|
|
* confirmation.)
|
|
|
|
*/
|
|
|
|
output_charset = CS_ISO8859_1;
|
|
|
|
strncpy(output+1, event->string, lenof(output)-1);
|
|
|
|
#else
|
2012-07-06 03:45:20 +04:00
|
|
|
/*
|
|
|
|
* Most things can now be passed to
|
|
|
|
* gtk_im_context_filter_keypress without breaking anything
|
|
|
|
* below this point. An exception is the numeric keypad if
|
|
|
|
* we're in Nethack or application mode: the IM will eat
|
|
|
|
* numeric keypad presses if Num Lock is on, but we don't want
|
|
|
|
* it to.
|
|
|
|
*/
|
|
|
|
if (app_keypad_mode &&
|
|
|
|
(event->keyval == GDK_Num_Lock ||
|
|
|
|
event->keyval == GDK_KP_Divide ||
|
|
|
|
event->keyval == GDK_KP_Multiply ||
|
|
|
|
event->keyval == GDK_KP_Subtract ||
|
|
|
|
event->keyval == GDK_KP_Add ||
|
|
|
|
event->keyval == GDK_KP_Enter ||
|
|
|
|
event->keyval == GDK_KP_0 ||
|
|
|
|
event->keyval == GDK_KP_Insert ||
|
|
|
|
event->keyval == GDK_KP_1 ||
|
|
|
|
event->keyval == GDK_KP_End ||
|
|
|
|
event->keyval == GDK_KP_2 ||
|
|
|
|
event->keyval == GDK_KP_Down ||
|
|
|
|
event->keyval == GDK_KP_3 ||
|
|
|
|
event->keyval == GDK_KP_Page_Down ||
|
|
|
|
event->keyval == GDK_KP_4 ||
|
|
|
|
event->keyval == GDK_KP_Left ||
|
|
|
|
event->keyval == GDK_KP_5 ||
|
|
|
|
event->keyval == GDK_KP_Begin ||
|
|
|
|
event->keyval == GDK_KP_6 ||
|
|
|
|
event->keyval == GDK_KP_Right ||
|
|
|
|
event->keyval == GDK_KP_7 ||
|
|
|
|
event->keyval == GDK_KP_Home ||
|
|
|
|
event->keyval == GDK_KP_8 ||
|
|
|
|
event->keyval == GDK_KP_Up ||
|
|
|
|
event->keyval == GDK_KP_9 ||
|
|
|
|
event->keyval == GDK_KP_Page_Up ||
|
|
|
|
event->keyval == GDK_KP_Decimal ||
|
|
|
|
event->keyval == GDK_KP_Delete)) {
|
|
|
|
/* app keypad; do nothing */
|
|
|
|
} else if (nethack_mode &&
|
|
|
|
(event->keyval == GDK_KP_1 ||
|
|
|
|
event->keyval == GDK_KP_End ||
|
|
|
|
event->keyval == GDK_KP_2 ||
|
|
|
|
event->keyval == GDK_KP_Down ||
|
|
|
|
event->keyval == GDK_KP_3 ||
|
|
|
|
event->keyval == GDK_KP_Page_Down ||
|
|
|
|
event->keyval == GDK_KP_4 ||
|
|
|
|
event->keyval == GDK_KP_Left ||
|
|
|
|
event->keyval == GDK_KP_5 ||
|
|
|
|
event->keyval == GDK_KP_Begin ||
|
|
|
|
event->keyval == GDK_KP_6 ||
|
|
|
|
event->keyval == GDK_KP_Right ||
|
|
|
|
event->keyval == GDK_KP_7 ||
|
|
|
|
event->keyval == GDK_KP_Home ||
|
|
|
|
event->keyval == GDK_KP_8 ||
|
|
|
|
event->keyval == GDK_KP_Up ||
|
|
|
|
event->keyval == GDK_KP_9 ||
|
|
|
|
event->keyval == GDK_KP_Page_Up)) {
|
|
|
|
/* nethack mode; do nothing */
|
|
|
|
} else {
|
|
|
|
if (gtk_im_context_filter_keypress(inst->imc, event))
|
|
|
|
return TRUE;
|
|
|
|
}
|
2012-06-17 11:26:23 +04:00
|
|
|
|
2009-02-28 19:52:42 +03:00
|
|
|
/*
|
|
|
|
* GDK 2.0 arranges to have done some translation for us: in
|
|
|
|
* GDK 2.0, event->string is encoded in the current locale.
|
|
|
|
*
|
|
|
|
* So we use the standard C library function mbstowcs() to
|
|
|
|
* convert from the current locale into Unicode; from there
|
|
|
|
* we can convert to whatever PuTTY is currently working in.
|
|
|
|
* (In fact I convert straight back to UTF-8 from
|
|
|
|
* wide-character Unicode, for the sake of simplicity: that
|
|
|
|
* way we can still use exactly the same code to manipulate
|
|
|
|
* the string, such as prefixing ESC.)
|
|
|
|
*/
|
|
|
|
output_charset = CS_UTF8;
|
|
|
|
{
|
2011-09-16 23:18:52 +04:00
|
|
|
wchar_t widedata[32];
|
|
|
|
const wchar_t *wp;
|
2009-02-28 19:52:42 +03:00
|
|
|
int wlen;
|
|
|
|
int ulen;
|
|
|
|
|
|
|
|
wlen = mb_to_wc(DEFAULT_CODEPAGE, 0,
|
|
|
|
event->string, strlen(event->string),
|
|
|
|
widedata, lenof(widedata)-1);
|
|
|
|
|
|
|
|
wp = widedata;
|
|
|
|
ulen = charset_from_unicode(&wp, &wlen, output+1, lenof(output)-2,
|
|
|
|
CS_UTF8, NULL, NULL, 0);
|
|
|
|
output[1+ulen] = '\0';
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (!output[1] &&
|
2003-04-27 15:10:48 +04:00
|
|
|
(ucsval = keysym_to_unicode(event->keyval)) >= 0) {
|
|
|
|
ucsoutput[0] = '\033';
|
|
|
|
ucsoutput[1] = ucsval;
|
|
|
|
use_ucsoutput = TRUE;
|
|
|
|
end = 2;
|
|
|
|
} else {
|
2009-02-28 19:52:42 +03:00
|
|
|
output[lenof(output)-1] = '\0';
|
2003-04-27 15:10:48 +04:00
|
|
|
end = strlen(output);
|
|
|
|
}
|
2002-10-17 20:58:24 +04:00
|
|
|
if (event->state & GDK_MOD1_MASK) {
|
|
|
|
start = 0;
|
|
|
|
if (end == 1) end = 0;
|
|
|
|
} else
|
|
|
|
start = 1;
|
2002-10-10 16:14:05 +04:00
|
|
|
|
|
|
|
/* Control-` is the same as Control-\ (unless gtk has a better idea) */
|
2009-02-28 19:52:42 +03:00
|
|
|
if (!output[1] && event->keyval == '`' &&
|
2002-10-10 16:14:05 +04:00
|
|
|
(event->state & GDK_CONTROL_MASK)) {
|
|
|
|
output[1] = '\x1C';
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 2;
|
|
|
|
}
|
|
|
|
|
2007-02-18 17:02:39 +03:00
|
|
|
/* Control-Break sends a Break special to the backend */
|
2002-10-10 16:14:05 +04:00
|
|
|
if (event->keyval == GDK_Break &&
|
|
|
|
(event->state & GDK_CONTROL_MASK)) {
|
2007-02-18 17:02:39 +03:00
|
|
|
if (inst->back)
|
|
|
|
inst->back->special(inst->backhandle, TS_BRK);
|
|
|
|
return TRUE;
|
2003-04-12 13:27:56 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* We handle Return ourselves, because it needs to be flagged as
|
|
|
|
* special to ldisc. */
|
|
|
|
if (event->keyval == GDK_Return) {
|
|
|
|
output[1] = '\015';
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2003-04-12 13:27:56 +04:00
|
|
|
end = 2;
|
|
|
|
special = TRUE;
|
2002-10-10 16:14:05 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Control-2, Control-Space and Control-@ are NUL */
|
2009-02-28 19:52:42 +03:00
|
|
|
if (!output[1] &&
|
2002-10-10 16:14:05 +04:00
|
|
|
(event->keyval == ' ' || event->keyval == '2' ||
|
|
|
|
event->keyval == '@') &&
|
|
|
|
(event->state & (GDK_SHIFT_MASK |
|
|
|
|
GDK_CONTROL_MASK)) == GDK_CONTROL_MASK) {
|
|
|
|
output[1] = '\0';
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Control-Shift-Space is 160 (ISO8859 nonbreaking space) */
|
2009-02-28 19:52:42 +03:00
|
|
|
if (!output[1] && event->keyval == ' ' &&
|
2002-10-10 16:14:05 +04:00
|
|
|
(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) ==
|
|
|
|
(GDK_SHIFT_MASK | GDK_CONTROL_MASK)) {
|
|
|
|
output[1] = '\240';
|
2009-02-28 19:52:42 +03:00
|
|
|
output_charset = CS_ISO8859_1;
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We don't let GTK tell us what Backspace is! We know better. */
|
|
|
|
if (event->keyval == GDK_BackSpace &&
|
|
|
|
!(event->state & GDK_SHIFT_MASK)) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
output[1] = conf_get_int(inst->conf, CONF_bksp_is_delete) ?
|
|
|
|
'\x7F' : '\x08';
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 2;
|
2003-04-12 13:27:56 +04:00
|
|
|
special = TRUE;
|
2002-10-10 16:14:05 +04:00
|
|
|
}
|
2002-10-16 13:40:36 +04:00
|
|
|
/* For Shift Backspace, do opposite of what is configured. */
|
|
|
|
if (event->keyval == GDK_BackSpace &&
|
|
|
|
(event->state & GDK_SHIFT_MASK)) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
output[1] = conf_get_int(inst->conf, CONF_bksp_is_delete) ?
|
|
|
|
'\x08' : '\x7F';
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-16 13:40:36 +04:00
|
|
|
end = 2;
|
2003-04-12 13:27:56 +04:00
|
|
|
special = TRUE;
|
2002-10-16 13:40:36 +04:00
|
|
|
}
|
2002-10-10 16:14:05 +04:00
|
|
|
|
|
|
|
/* Shift-Tab is ESC [ Z */
|
|
|
|
if (event->keyval == GDK_ISO_Left_Tab ||
|
|
|
|
(event->keyval == GDK_Tab && (event->state & GDK_SHIFT_MASK))) {
|
|
|
|
end = 1 + sprintf(output+1, "\033[Z");
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
}
|
2008-03-09 18:32:20 +03:00
|
|
|
/* And normal Tab is Tab, if the keymap hasn't already told us.
|
|
|
|
* (Curiously, at least one version of the MacOS 10.5 X server
|
|
|
|
* doesn't translate Tab for us. */
|
|
|
|
if (event->keyval == GDK_Tab && end <= 1) {
|
|
|
|
output[1] = '\t';
|
|
|
|
end = 2;
|
|
|
|
}
|
2002-10-10 16:14:05 +04:00
|
|
|
|
2002-10-14 14:06:07 +04:00
|
|
|
/*
|
|
|
|
* NetHack keypad mode.
|
|
|
|
*/
|
2012-07-06 03:45:20 +04:00
|
|
|
if (nethack_mode) {
|
2002-10-14 14:06:07 +04:00
|
|
|
char *keys = NULL;
|
|
|
|
switch (event->keyval) {
|
2006-03-08 21:10:12 +03:00
|
|
|
case GDK_KP_1: case GDK_KP_End: keys = "bB\002"; break;
|
|
|
|
case GDK_KP_2: case GDK_KP_Down: keys = "jJ\012"; break;
|
|
|
|
case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN\016"; break;
|
|
|
|
case GDK_KP_4: case GDK_KP_Left: keys = "hH\010"; break;
|
|
|
|
case GDK_KP_5: case GDK_KP_Begin: keys = "..."; break;
|
|
|
|
case GDK_KP_6: case GDK_KP_Right: keys = "lL\014"; break;
|
|
|
|
case GDK_KP_7: case GDK_KP_Home: keys = "yY\031"; break;
|
|
|
|
case GDK_KP_8: case GDK_KP_Up: keys = "kK\013"; break;
|
|
|
|
case GDK_KP_9: case GDK_KP_Page_Up: keys = "uU\025"; break;
|
2002-10-14 14:06:07 +04:00
|
|
|
}
|
|
|
|
if (keys) {
|
|
|
|
end = 2;
|
2006-03-08 21:10:12 +03:00
|
|
|
if (event->state & GDK_CONTROL_MASK)
|
|
|
|
output[1] = keys[2];
|
|
|
|
else if (event->state & GDK_SHIFT_MASK)
|
2002-10-14 14:06:07 +04:00
|
|
|
output[1] = keys[1];
|
|
|
|
else
|
|
|
|
output[1] = keys[0];
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-14 14:06:07 +04:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-10-10 16:14:05 +04:00
|
|
|
/*
|
|
|
|
* Application keypad mode.
|
|
|
|
*/
|
2012-07-06 03:45:20 +04:00
|
|
|
if (app_keypad_mode) {
|
2002-10-10 16:14:05 +04:00
|
|
|
int xkey = 0;
|
|
|
|
switch (event->keyval) {
|
|
|
|
case GDK_Num_Lock: xkey = 'P'; break;
|
|
|
|
case GDK_KP_Divide: xkey = 'Q'; break;
|
|
|
|
case GDK_KP_Multiply: xkey = 'R'; break;
|
|
|
|
case GDK_KP_Subtract: xkey = 'S'; break;
|
|
|
|
/*
|
|
|
|
* Keypad + is tricky. It covers a space that would
|
|
|
|
* be taken up on the VT100 by _two_ keys; so we
|
|
|
|
* let Shift select between the two. Worse still,
|
|
|
|
* in xterm function key mode we change which two...
|
|
|
|
*/
|
|
|
|
case GDK_KP_Add:
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(inst->conf, CONF_funky_type) == FUNKY_XTERM) {
|
2002-10-10 16:14:05 +04:00
|
|
|
if (event->state & GDK_SHIFT_MASK)
|
|
|
|
xkey = 'l';
|
|
|
|
else
|
|
|
|
xkey = 'k';
|
|
|
|
} else if (event->state & GDK_SHIFT_MASK)
|
|
|
|
xkey = 'm';
|
|
|
|
else
|
|
|
|
xkey = 'l';
|
|
|
|
break;
|
|
|
|
case GDK_KP_Enter: xkey = 'M'; break;
|
|
|
|
case GDK_KP_0: case GDK_KP_Insert: xkey = 'p'; break;
|
|
|
|
case GDK_KP_1: case GDK_KP_End: xkey = 'q'; break;
|
|
|
|
case GDK_KP_2: case GDK_KP_Down: xkey = 'r'; break;
|
|
|
|
case GDK_KP_3: case GDK_KP_Page_Down: xkey = 's'; break;
|
|
|
|
case GDK_KP_4: case GDK_KP_Left: xkey = 't'; break;
|
|
|
|
case GDK_KP_5: case GDK_KP_Begin: xkey = 'u'; break;
|
|
|
|
case GDK_KP_6: case GDK_KP_Right: xkey = 'v'; break;
|
|
|
|
case GDK_KP_7: case GDK_KP_Home: xkey = 'w'; break;
|
|
|
|
case GDK_KP_8: case GDK_KP_Up: xkey = 'x'; break;
|
|
|
|
case GDK_KP_9: case GDK_KP_Page_Up: xkey = 'y'; break;
|
|
|
|
case GDK_KP_Decimal: case GDK_KP_Delete: xkey = 'n'; break;
|
|
|
|
}
|
|
|
|
if (xkey) {
|
2002-10-26 15:08:59 +04:00
|
|
|
if (inst->term->vt52_mode) {
|
2002-10-10 16:14:05 +04:00
|
|
|
if (xkey >= 'P' && xkey <= 'S')
|
|
|
|
end = 1 + sprintf(output+1, "\033%c", xkey);
|
|
|
|
else
|
|
|
|
end = 1 + sprintf(output+1, "\033?%c", xkey);
|
|
|
|
} else
|
|
|
|
end = 1 + sprintf(output+1, "\033O%c", xkey);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Next, all the keys that do tilde codes. (ESC '[' nn '~',
|
|
|
|
* for integer decimal nn.)
|
|
|
|
*
|
|
|
|
* We also deal with the weird ones here. Linux VCs replace F1
|
|
|
|
* to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but
|
|
|
|
* does replace Home and End (1~ and 4~) by ESC [ H and ESC O w
|
|
|
|
* respectively.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
int code = 0;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int funky_type = conf_get_int(inst->conf, CONF_funky_type);
|
2002-10-10 16:14:05 +04:00
|
|
|
switch (event->keyval) {
|
|
|
|
case GDK_F1:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 23 : 11);
|
|
|
|
break;
|
|
|
|
case GDK_F2:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 24 : 12);
|
|
|
|
break;
|
|
|
|
case GDK_F3:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 25 : 13);
|
|
|
|
break;
|
|
|
|
case GDK_F4:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 26 : 14);
|
|
|
|
break;
|
|
|
|
case GDK_F5:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 28 : 15);
|
|
|
|
break;
|
|
|
|
case GDK_F6:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 29 : 17);
|
|
|
|
break;
|
|
|
|
case GDK_F7:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 31 : 18);
|
|
|
|
break;
|
|
|
|
case GDK_F8:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 32 : 19);
|
|
|
|
break;
|
|
|
|
case GDK_F9:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 33 : 20);
|
|
|
|
break;
|
|
|
|
case GDK_F10:
|
|
|
|
code = (event->state & GDK_SHIFT_MASK ? 34 : 21);
|
|
|
|
break;
|
|
|
|
case GDK_F11:
|
|
|
|
code = 23;
|
|
|
|
break;
|
|
|
|
case GDK_F12:
|
|
|
|
code = 24;
|
|
|
|
break;
|
|
|
|
case GDK_F13:
|
|
|
|
code = 25;
|
|
|
|
break;
|
|
|
|
case GDK_F14:
|
|
|
|
code = 26;
|
|
|
|
break;
|
|
|
|
case GDK_F15:
|
|
|
|
code = 28;
|
|
|
|
break;
|
|
|
|
case GDK_F16:
|
|
|
|
code = 29;
|
|
|
|
break;
|
|
|
|
case GDK_F17:
|
|
|
|
code = 31;
|
|
|
|
break;
|
|
|
|
case GDK_F18:
|
|
|
|
code = 32;
|
|
|
|
break;
|
|
|
|
case GDK_F19:
|
|
|
|
code = 33;
|
|
|
|
break;
|
|
|
|
case GDK_F20:
|
|
|
|
code = 34;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!(event->state & GDK_CONTROL_MASK)) switch (event->keyval) {
|
|
|
|
case GDK_Home: case GDK_KP_Home:
|
|
|
|
code = 1;
|
|
|
|
break;
|
|
|
|
case GDK_Insert: case GDK_KP_Insert:
|
|
|
|
code = 2;
|
|
|
|
break;
|
|
|
|
case GDK_Delete: case GDK_KP_Delete:
|
|
|
|
code = 3;
|
|
|
|
break;
|
|
|
|
case GDK_End: case GDK_KP_End:
|
|
|
|
code = 4;
|
|
|
|
break;
|
|
|
|
case GDK_Page_Up: case GDK_KP_Page_Up:
|
|
|
|
code = 5;
|
|
|
|
break;
|
|
|
|
case GDK_Page_Down: case GDK_KP_Page_Down:
|
|
|
|
code = 6;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* Reorder edit keys to physical order */
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (funky_type == FUNKY_VT400 && code <= 6)
|
2002-10-10 16:14:05 +04:00
|
|
|
code = "\0\2\1\4\5\3\6"[code];
|
|
|
|
|
2002-10-26 15:08:59 +04:00
|
|
|
if (inst->term->vt52_mode && code > 0 && code <= 6) {
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 1 + sprintf(output+1, "\x1B%c", " HLMEIG"[code]);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (funky_type == FUNKY_SCO && /* SCO function keys */
|
2002-10-10 16:14:05 +04:00
|
|
|
code >= 11 && code <= 34) {
|
|
|
|
char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{";
|
|
|
|
int index = 0;
|
|
|
|
switch (event->keyval) {
|
|
|
|
case GDK_F1: index = 0; break;
|
|
|
|
case GDK_F2: index = 1; break;
|
|
|
|
case GDK_F3: index = 2; break;
|
|
|
|
case GDK_F4: index = 3; break;
|
|
|
|
case GDK_F5: index = 4; break;
|
|
|
|
case GDK_F6: index = 5; break;
|
|
|
|
case GDK_F7: index = 6; break;
|
|
|
|
case GDK_F8: index = 7; break;
|
|
|
|
case GDK_F9: index = 8; break;
|
|
|
|
case GDK_F10: index = 9; break;
|
|
|
|
case GDK_F11: index = 10; break;
|
|
|
|
case GDK_F12: index = 11; break;
|
|
|
|
}
|
|
|
|
if (event->state & GDK_SHIFT_MASK) index += 12;
|
|
|
|
if (event->state & GDK_CONTROL_MASK) index += 24;
|
|
|
|
end = 1 + sprintf(output+1, "\x1B[%c", codes[index]);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (funky_type == FUNKY_SCO && /* SCO small keypad */
|
2002-10-10 16:14:05 +04:00
|
|
|
code >= 1 && code <= 6) {
|
|
|
|
char codes[] = "HL.FIG";
|
|
|
|
if (code == 3) {
|
|
|
|
output[1] = '\x7F';
|
|
|
|
end = 2;
|
|
|
|
} else {
|
|
|
|
end = 1 + sprintf(output+1, "\x1B[%c", codes[code-1]);
|
|
|
|
}
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if ((inst->term->vt52_mode || funky_type == FUNKY_VT100P) &&
|
2002-10-22 20:11:33 +04:00
|
|
|
code >= 11 && code <= 24) {
|
2002-10-10 16:14:05 +04:00
|
|
|
int offt = 0;
|
|
|
|
if (code > 15)
|
|
|
|
offt++;
|
|
|
|
if (code > 21)
|
|
|
|
offt++;
|
2002-10-26 15:08:59 +04:00
|
|
|
if (inst->term->vt52_mode)
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 1 + sprintf(output+1,
|
|
|
|
"\x1B%c", code + 'P' - 11 - offt);
|
|
|
|
else
|
|
|
|
end = 1 + sprintf(output+1,
|
|
|
|
"\x1BO%c", code + 'P' - 11 - offt);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (funky_type == FUNKY_LINUX && code >= 11 && code <= 15) {
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 1 + sprintf(output+1, "\x1B[[%c", code + 'A' - 11);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (funky_type == FUNKY_XTERM && code >= 11 && code <= 14) {
|
2002-10-26 15:08:59 +04:00
|
|
|
if (inst->term->vt52_mode)
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 1 + sprintf(output+1, "\x1B%c", code + 'P' - 11);
|
|
|
|
else
|
|
|
|
end = 1 + sprintf(output+1, "\x1BO%c", code + 'P' - 11);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if ((code == 1 || code == 4) &&
|
|
|
|
conf_get_int(inst->conf, CONF_rxvt_homeend)) {
|
2002-10-10 16:14:05 +04:00
|
|
|
end = 1 + sprintf(output+1, code == 1 ? "\x1B[H" : "\x1BOw");
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
if (code) {
|
|
|
|
end = 1 + sprintf(output+1, "\x1B[%d~", code);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cursor keys. (This includes the numberpad cursor keys,
|
|
|
|
* if we haven't already done them due to app keypad mode.)
|
|
|
|
*
|
|
|
|
* Here we also process un-numlocked un-appkeypadded KP5,
|
|
|
|
* which sends ESC [ G.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
int xkey = 0;
|
|
|
|
switch (event->keyval) {
|
|
|
|
case GDK_Up: case GDK_KP_Up: xkey = 'A'; break;
|
|
|
|
case GDK_Down: case GDK_KP_Down: xkey = 'B'; break;
|
|
|
|
case GDK_Right: case GDK_KP_Right: xkey = 'C'; break;
|
|
|
|
case GDK_Left: case GDK_KP_Left: xkey = 'D'; break;
|
|
|
|
case GDK_Begin: case GDK_KP_Begin: xkey = 'G'; break;
|
|
|
|
}
|
|
|
|
if (xkey) {
|
2010-03-06 18:50:26 +03:00
|
|
|
end = 1 + format_arrow_key(output+1, inst->term, xkey,
|
|
|
|
event->state & GDK_CONTROL_MASK);
|
2003-04-27 15:10:48 +04:00
|
|
|
use_ucsoutput = FALSE;
|
2002-10-10 16:14:05 +04:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
2002-10-15 21:18:24 +04:00
|
|
|
goto done;
|
|
|
|
}
|
2002-10-10 16:14:05 +04:00
|
|
|
|
2002-10-15 21:18:24 +04:00
|
|
|
done:
|
2002-10-10 16:14:05 +04:00
|
|
|
|
2002-10-15 21:18:24 +04:00
|
|
|
if (end-start > 0) {
|
2002-10-10 16:14:05 +04:00
|
|
|
#ifdef KEY_DEBUGGING
|
2002-10-15 21:18:24 +04:00
|
|
|
int i;
|
|
|
|
printf("generating sequence:");
|
|
|
|
for (i = start; i < end; i++)
|
|
|
|
printf(" %02x", (unsigned char) output[i]);
|
|
|
|
printf("\n");
|
2002-10-10 16:14:05 +04:00
|
|
|
#endif
|
2002-10-15 21:18:24 +04:00
|
|
|
|
2003-04-12 13:27:56 +04:00
|
|
|
if (special) {
|
|
|
|
/*
|
|
|
|
* For special control characters, the character set
|
|
|
|
* should never matter.
|
|
|
|
*/
|
|
|
|
output[end] = '\0'; /* NUL-terminate */
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->ldisc)
|
|
|
|
ldisc_send(inst->ldisc, output+start, -2, 1);
|
2003-04-12 13:27:56 +04:00
|
|
|
} else if (!inst->direct_to_font) {
|
2003-04-27 15:10:48 +04:00
|
|
|
if (!use_ucsoutput) {
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->ldisc)
|
2009-02-28 19:52:42 +03:00
|
|
|
lpage_send(inst->ldisc, output_charset, output+start,
|
2004-08-14 17:04:18 +04:00
|
|
|
end-start, 1);
|
2003-04-27 15:10:48 +04:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* We generated our own Unicode key data from the
|
|
|
|
* keysym, so use that instead.
|
|
|
|
*/
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->ldisc)
|
|
|
|
luni_send(inst->ldisc, ucsoutput+start, end-start, 1);
|
2003-04-27 15:10:48 +04:00
|
|
|
}
|
2003-01-02 01:25:25 +03:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* In direct-to-font mode, we just send the string
|
|
|
|
* exactly as we received it.
|
|
|
|
*/
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->ldisc)
|
|
|
|
ldisc_send(inst->ldisc, output+start, end-start, 1);
|
2003-01-02 01:25:25 +03:00
|
|
|
}
|
2002-12-31 15:20:34 +03:00
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
show_mouseptr(inst, 0);
|
2002-10-26 15:08:59 +04:00
|
|
|
term_seen_key_event(inst->term);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
2002-10-07 20:45:23 +04:00
|
|
|
}
|
|
|
|
|
2012-06-17 11:26:23 +04:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
void input_method_commit_event(GtkIMContext *imc, gchar *str, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2013-07-11 21:24:20 +04:00
|
|
|
if (inst->ldisc)
|
|
|
|
lpage_send(inst->ldisc, CS_UTF8, str, strlen(str), 1);
|
2012-06-18 22:10:59 +04:00
|
|
|
show_mouseptr(inst, 0);
|
|
|
|
term_seen_key_event(inst->term);
|
2012-06-17 11:26:23 +04:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2008-06-11 00:18:23 +04:00
|
|
|
gboolean button_internal(struct gui_data *inst, guint32 timestamp,
|
|
|
|
GdkEventType type, guint ebutton, guint state,
|
|
|
|
gdouble ex, gdouble ey)
|
2002-10-13 15:24:25 +04:00
|
|
|
{
|
|
|
|
int shift, ctrl, alt, x, y, button, act;
|
|
|
|
|
2003-08-21 22:03:06 +04:00
|
|
|
/* Remember the timestamp. */
|
2008-06-11 00:18:23 +04:00
|
|
|
inst->input_event_time = timestamp;
|
2003-08-21 22:03:06 +04:00
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
show_mouseptr(inst, 1);
|
2002-10-14 13:58:27 +04:00
|
|
|
|
2008-06-11 00:18:23 +04:00
|
|
|
if (ebutton == 4 && type == GDK_BUTTON_PRESS) {
|
2002-10-26 15:08:59 +04:00
|
|
|
term_scroll(inst->term, 0, -5);
|
2002-10-15 20:50:42 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
2008-06-11 00:18:23 +04:00
|
|
|
if (ebutton == 5 && type == GDK_BUTTON_PRESS) {
|
2002-10-26 15:08:59 +04:00
|
|
|
term_scroll(inst->term, 0, +5);
|
2002-10-15 20:50:42 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-06-11 00:18:23 +04:00
|
|
|
shift = state & GDK_SHIFT_MASK;
|
|
|
|
ctrl = state & GDK_CONTROL_MASK;
|
|
|
|
alt = state & GDK_MOD1_MASK;
|
2003-04-05 20:05:00 +04:00
|
|
|
|
2008-06-11 00:18:23 +04:00
|
|
|
if (ebutton == 3 && ctrl) {
|
2003-04-05 20:05:00 +04:00
|
|
|
gtk_menu_popup(GTK_MENU(inst->menu), NULL, NULL, NULL, NULL,
|
2008-06-11 00:18:23 +04:00
|
|
|
ebutton, timestamp);
|
2003-04-05 20:05:00 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-06-11 00:18:23 +04:00
|
|
|
if (ebutton == 1)
|
2002-10-13 15:24:25 +04:00
|
|
|
button = MBT_LEFT;
|
2008-06-11 00:18:23 +04:00
|
|
|
else if (ebutton == 2)
|
2002-10-13 15:24:25 +04:00
|
|
|
button = MBT_MIDDLE;
|
2008-06-11 00:18:23 +04:00
|
|
|
else if (ebutton == 3)
|
2002-10-13 15:24:25 +04:00
|
|
|
button = MBT_RIGHT;
|
|
|
|
else
|
|
|
|
return FALSE; /* don't even know what button! */
|
|
|
|
|
2008-06-11 00:18:23 +04:00
|
|
|
switch (type) {
|
2002-10-13 15:24:25 +04:00
|
|
|
case GDK_BUTTON_PRESS: act = MA_CLICK; break;
|
|
|
|
case GDK_BUTTON_RELEASE: act = MA_RELEASE; break;
|
|
|
|
case GDK_2BUTTON_PRESS: act = MA_2CLK; break;
|
|
|
|
case GDK_3BUTTON_PRESS: act = MA_3CLK; break;
|
|
|
|
default: return FALSE; /* don't know this event type */
|
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (send_raw_mouse && !(shift && conf_get_int(inst->conf,
|
|
|
|
CONF_mouse_override)) &&
|
2002-10-13 15:24:25 +04:00
|
|
|
act != MA_CLICK && act != MA_RELEASE)
|
|
|
|
return TRUE; /* we ignore these in raw mouse mode */
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x = (ex - inst->window_border) / inst->font_width;
|
|
|
|
y = (ey - inst->window_border) / inst->font_height;
|
2002-10-13 15:24:25 +04:00
|
|
|
|
2003-01-25 19:16:45 +03:00
|
|
|
term_mouse(inst->term, button, translate_button(button), act,
|
|
|
|
x, y, shift, ctrl, alt);
|
2002-10-13 15:24:25 +04:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2008-06-11 00:18:23 +04:00
|
|
|
gboolean button_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
return button_internal(inst, event->time, event->type, event->button,
|
|
|
|
event->state, event->x, event->y);
|
|
|
|
}
|
|
|
|
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
/*
|
|
|
|
* In GTK 2, mouse wheel events have become a new type of event.
|
|
|
|
* This handler translates them back into button-4 and button-5
|
|
|
|
* presses so that I don't have to change my old code too much :-)
|
|
|
|
*/
|
|
|
|
gboolean scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
guint button;
|
|
|
|
|
|
|
|
if (event->direction == GDK_SCROLL_UP)
|
|
|
|
button = 4;
|
|
|
|
else if (event->direction == GDK_SCROLL_DOWN)
|
|
|
|
button = 5;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return button_internal(inst, event->time, GDK_BUTTON_PRESS,
|
|
|
|
button, event->state, event->x, event->y);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2002-10-13 15:24:25 +04:00
|
|
|
gint motion_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
int shift, ctrl, alt, x, y, button;
|
|
|
|
|
2003-08-21 22:03:06 +04:00
|
|
|
/* Remember the timestamp. */
|
|
|
|
inst->input_event_time = event->time;
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
show_mouseptr(inst, 1);
|
2002-10-14 13:58:27 +04:00
|
|
|
|
2002-10-13 15:24:25 +04:00
|
|
|
shift = event->state & GDK_SHIFT_MASK;
|
|
|
|
ctrl = event->state & GDK_CONTROL_MASK;
|
|
|
|
alt = event->state & GDK_MOD1_MASK;
|
|
|
|
if (event->state & GDK_BUTTON1_MASK)
|
|
|
|
button = MBT_LEFT;
|
|
|
|
else if (event->state & GDK_BUTTON2_MASK)
|
|
|
|
button = MBT_MIDDLE;
|
|
|
|
else if (event->state & GDK_BUTTON3_MASK)
|
|
|
|
button = MBT_RIGHT;
|
|
|
|
else
|
|
|
|
return FALSE; /* don't even know what button! */
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x = (event->x - inst->window_border) / inst->font_width;
|
|
|
|
y = (event->y - inst->window_border) / inst->font_height;
|
2002-10-13 15:24:25 +04:00
|
|
|
|
2003-01-25 19:16:45 +03:00
|
|
|
term_mouse(inst->term, button, translate_button(button), MA_DRAG,
|
|
|
|
x, y, shift, ctrl, alt);
|
2002-10-13 15:24:25 +04:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2002-10-26 14:16:19 +04:00
|
|
|
void frontend_keypress(void *handle)
|
2002-10-23 18:21:12 +04:00
|
|
|
{
|
2002-10-26 14:16:19 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)handle;
|
|
|
|
|
2002-10-23 18:21:12 +04:00
|
|
|
/*
|
|
|
|
* If our child process has exited but not closed, terminate on
|
|
|
|
* any keypress.
|
|
|
|
*/
|
|
|
|
if (inst->exited)
|
2013-07-19 21:44:47 +04:00
|
|
|
cleanup_exit(0);
|
2002-10-23 18:21:12 +04:00
|
|
|
}
|
|
|
|
|
2008-11-17 21:36:27 +03:00
|
|
|
static gint idle_exit_func(gpointer data)
|
2002-10-07 20:45:23 +04:00
|
|
|
{
|
2008-11-17 21:36:27 +03:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int exitcode, close_on_exit;
|
2002-10-14 13:18:34 +04:00
|
|
|
|
2003-04-01 22:10:25 +04:00
|
|
|
if (!inst->exited &&
|
|
|
|
(exitcode = inst->back->exitcode(inst->backhandle)) >= 0) {
|
2003-03-29 21:30:14 +03:00
|
|
|
inst->exited = TRUE;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
close_on_exit = conf_get_int(inst->conf, CONF_close_on_exit);
|
|
|
|
if (close_on_exit == FORCE_ON ||
|
|
|
|
(close_on_exit == AUTO && exitcode == 0))
|
2005-03-05 20:56:28 +03:00
|
|
|
gtk_main_quit(); /* just go */
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->ldisc) {
|
|
|
|
ldisc_free(inst->ldisc);
|
|
|
|
inst->ldisc = NULL;
|
|
|
|
}
|
2013-07-11 21:24:14 +04:00
|
|
|
inst->back->free(inst->backhandle);
|
|
|
|
inst->backhandle = NULL;
|
|
|
|
inst->back = NULL;
|
|
|
|
term_provide_resize_fn(inst->term, NULL, NULL);
|
|
|
|
update_specials_menu(inst);
|
2009-09-14 03:41:55 +04:00
|
|
|
gtk_widget_set_sensitive(inst->restartitem, TRUE);
|
2002-10-14 13:18:34 +04:00
|
|
|
}
|
2008-11-17 21:36:27 +03:00
|
|
|
|
|
|
|
gtk_idle_remove(inst->term_exit_idle_id);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void notify_remote_exit(void *frontend)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
|
|
|
|
inst->term_exit_idle_id = gtk_idle_add(idle_exit_func, inst);
|
2004-11-27 16:20:21 +03:00
|
|
|
}
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2004-11-27 16:20:21 +03:00
|
|
|
static gint timer_trigger(gpointer data)
|
|
|
|
{
|
2012-09-19 01:42:48 +04:00
|
|
|
unsigned long now = GPOINTER_TO_LONG(data);
|
|
|
|
unsigned long next, then;
|
2004-11-27 16:20:21 +03:00
|
|
|
long ticks;
|
|
|
|
|
|
|
|
if (run_timers(now, &next)) {
|
2012-09-19 01:42:48 +04:00
|
|
|
then = now;
|
|
|
|
now = GETTICKCOUNT();
|
|
|
|
if (now - then > next - then)
|
|
|
|
ticks = 0;
|
|
|
|
else
|
|
|
|
ticks = next - now;
|
|
|
|
timer_id = gtk_timeout_add(ticks, timer_trigger,
|
2010-03-14 21:58:20 +03:00
|
|
|
LONG_TO_GPOINTER(next));
|
2004-11-27 16:20:21 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Never let a timer resume. If we need another one, we've
|
|
|
|
* asked for it explicitly above.
|
|
|
|
*/
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2012-09-19 01:42:48 +04:00
|
|
|
void timer_change_notify(unsigned long next)
|
2004-11-27 16:20:21 +03:00
|
|
|
{
|
|
|
|
long ticks;
|
|
|
|
|
|
|
|
if (timer_id)
|
|
|
|
gtk_timeout_remove(timer_id);
|
|
|
|
|
|
|
|
ticks = next - GETTICKCOUNT();
|
|
|
|
if (ticks <= 0)
|
|
|
|
ticks = 1; /* just in case */
|
|
|
|
|
|
|
|
timer_id = gtk_timeout_add(ticks, timer_trigger,
|
2010-03-14 21:58:20 +03:00
|
|
|
LONG_TO_GPOINTER(next));
|
2002-10-07 20:45:23 +04:00
|
|
|
}
|
|
|
|
|
2003-03-29 21:30:14 +03:00
|
|
|
void fd_input_func(gpointer data, gint sourcefd, GdkInputCondition condition)
|
2002-10-10 16:40:05 +04:00
|
|
|
{
|
2003-04-01 22:10:25 +04:00
|
|
|
/*
|
|
|
|
* We must process exceptional notifications before ordinary
|
|
|
|
* readability ones, or we may go straight past the urgent
|
|
|
|
* marker.
|
|
|
|
*/
|
|
|
|
if (condition & GDK_INPUT_EXCEPTION)
|
|
|
|
select_result(sourcefd, 4);
|
|
|
|
if (condition & GDK_INPUT_READ)
|
|
|
|
select_result(sourcefd, 1);
|
|
|
|
if (condition & GDK_INPUT_WRITE)
|
|
|
|
select_result(sourcefd, 2);
|
2002-10-10 16:40:05 +04:00
|
|
|
}
|
|
|
|
|
2002-10-07 20:45:23 +04:00
|
|
|
void destroy(GtkWidget *widget, gpointer data)
|
|
|
|
{
|
|
|
|
gtk_main_quit();
|
|
|
|
}
|
|
|
|
|
|
|
|
gint focus_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2004-11-27 22:34:45 +03:00
|
|
|
term_set_focus(inst->term, event->in);
|
2002-10-26 15:08:59 +04:00
|
|
|
term_update(inst->term);
|
2002-10-26 16:58:13 +04:00
|
|
|
show_mouseptr(inst, 1);
|
2002-10-09 22:09:42 +04:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2005-02-15 20:05:58 +03:00
|
|
|
void set_busy_status(void *frontend, int status)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
inst->busy_status = status;
|
|
|
|
update_mouseptr(inst);
|
|
|
|
}
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
/*
|
|
|
|
* set or clear the "raw mouse message" mode
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_raw_mouse_mode(void *frontend, int activate)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
activate = activate && !conf_get_int(inst->conf, CONF_no_mouse_rep);
|
2002-10-10 14:40:30 +04:00
|
|
|
send_raw_mouse = activate;
|
2005-02-15 20:05:58 +03:00
|
|
|
update_mouseptr(inst);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void request_resize(void *frontend, int w, int h)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-15 20:24:42 +04:00
|
|
|
int large_x, large_y;
|
|
|
|
int offset_x, offset_y;
|
|
|
|
int area_x, area_y;
|
|
|
|
GtkRequisition inner, outer;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This is a heinous hack dreamed up by the gnome-terminal
|
|
|
|
* people to get around a limitation in gtk. The problem is
|
|
|
|
* that in order to set the size correctly we really need to be
|
|
|
|
* calling gtk_window_resize - but that needs to know the size
|
|
|
|
* of the _whole window_, not the drawing area. So what we do
|
|
|
|
* is to set an artificially huge size request on the drawing
|
|
|
|
* area, recompute the resulting size request on the window,
|
|
|
|
* and look at the difference between the two. That gives us
|
|
|
|
* the x and y offsets we need to translate drawing area size
|
|
|
|
* into window size for real, and then we call
|
|
|
|
* gtk_window_resize.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We start by retrieving the current size of the whole window.
|
|
|
|
* Adding a bit to _that_ will give us a value we can use as a
|
|
|
|
* bogus size request which guarantees to be bigger than the
|
|
|
|
* current size of the drawing area.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
get_window_pixels(inst, &large_x, &large_y);
|
2002-10-15 20:24:42 +04:00
|
|
|
large_x += 32;
|
|
|
|
large_y += 32;
|
|
|
|
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
gtk_widget_set_size_request(inst->area, large_x, large_y);
|
|
|
|
#else
|
|
|
|
gtk_widget_set_usize(inst->area, large_x, large_y);
|
|
|
|
#endif
|
|
|
|
gtk_widget_size_request(inst->area, &inner);
|
|
|
|
gtk_widget_size_request(inst->window, &outer);
|
|
|
|
|
|
|
|
offset_x = outer.width - inner.width;
|
|
|
|
offset_y = outer.height - inner.height;
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
area_x = inst->font_width * w + 2*inst->window_border;
|
|
|
|
area_y = inst->font_height * h + 2*inst->window_border;
|
2002-10-15 20:24:42 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Now we must set the size request on the drawing area back to
|
|
|
|
* something sensible before we commit the real resize. Best
|
|
|
|
* way to do this, I think, is to set it to what the size is
|
|
|
|
* really going to end up being.
|
|
|
|
*/
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
gtk_widget_set_size_request(inst->area, area_x, area_y);
|
2007-01-25 22:33:29 +03:00
|
|
|
gtk_window_resize(GTK_WINDOW(inst->window),
|
|
|
|
area_x + offset_x, area_y + offset_y);
|
2002-10-15 20:24:42 +04:00
|
|
|
#else
|
|
|
|
gtk_widget_set_usize(inst->area, area_x, area_y);
|
2003-04-10 22:00:50 +04:00
|
|
|
gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area), area_x, area_y);
|
2008-03-29 23:02:12 +03:00
|
|
|
/*
|
|
|
|
* I can no longer remember what this call to
|
|
|
|
* gtk_container_dequeue_resize_handler is for. It was
|
|
|
|
* introduced in r3092 with no comment, and the commit log
|
|
|
|
* message was uninformative. I'm _guessing_ its purpose is to
|
|
|
|
* prevent gratuitous resize processing on the window given
|
|
|
|
* that we're about to resize it anyway, but I have no idea
|
|
|
|
* why that's so incredibly vital.
|
|
|
|
*
|
|
|
|
* I've tried removing the call, and nothing seems to go
|
|
|
|
* wrong. I've backtracked to r3092 and tried removing the
|
|
|
|
* call there, and still nothing goes wrong. So I'm going to
|
|
|
|
* adopt the working hypothesis that it's superfluous; I won't
|
|
|
|
* actually remove it from the GTK 1.2 code, but I won't
|
|
|
|
* attempt to replicate its functionality in the GTK 2 code
|
|
|
|
* above.
|
|
|
|
*/
|
2003-04-10 22:00:50 +04:00
|
|
|
gtk_container_dequeue_resize_handler(GTK_CONTAINER(inst->window));
|
2002-10-15 20:24:42 +04:00
|
|
|
gdk_window_resize(inst->window->window,
|
|
|
|
area_x + offset_x, area_y + offset_y);
|
|
|
|
#endif
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
static void real_palette_set(struct gui_data *inst, int n, int r, int g, int b)
|
2002-10-14 14:21:35 +04:00
|
|
|
{
|
|
|
|
gboolean success[1];
|
|
|
|
|
|
|
|
inst->cols[n].red = r * 0x0101;
|
|
|
|
inst->cols[n].green = g * 0x0101;
|
|
|
|
inst->cols[n].blue = b * 0x0101;
|
|
|
|
|
2003-04-10 22:00:50 +04:00
|
|
|
gdk_colormap_free_colors(inst->colmap, inst->cols + n, 1);
|
2002-10-14 14:21:35 +04:00
|
|
|
gdk_colormap_alloc_colors(inst->colmap, inst->cols + n, 1,
|
2005-04-28 00:30:47 +04:00
|
|
|
FALSE, TRUE, success);
|
2002-10-14 14:21:35 +04:00
|
|
|
if (!success[0])
|
2003-04-10 15:57:11 +04:00
|
|
|
g_error("%s: couldn't allocate colour %d (#%02x%02x%02x)\n", appname,
|
2002-10-14 14:21:35 +04:00
|
|
|
n, r, g, b);
|
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_window_background(struct gui_data *inst)
|
2002-10-25 15:58:59 +04:00
|
|
|
{
|
|
|
|
if (inst->area && inst->area->window)
|
2004-11-28 18:18:23 +03:00
|
|
|
gdk_window_set_background(inst->area->window, &inst->cols[258]);
|
2002-10-25 15:58:59 +04:00
|
|
|
if (inst->window && inst->window->window)
|
2004-11-28 18:18:23 +03:00
|
|
|
gdk_window_set_background(inst->window->window, &inst->cols[258]);
|
2002-10-25 15:58:59 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void palette_set(void *frontend, int n, int r, int g, int b)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2004-11-28 18:13:34 +03:00
|
|
|
if (n >= 16)
|
|
|
|
n += 256 - 16;
|
2013-07-01 21:56:33 +04:00
|
|
|
if (n >= NALLCOLOURS)
|
2004-11-28 18:13:34 +03:00
|
|
|
return;
|
|
|
|
real_palette_set(inst, n, r, g, b);
|
2006-03-13 01:17:46 +03:00
|
|
|
if (n == 258) {
|
|
|
|
/* Default Background changed. Ensure space between text area and
|
|
|
|
* window border is redrawn */
|
2002-10-26 16:58:13 +04:00
|
|
|
set_window_background(inst);
|
2006-03-13 01:17:46 +03:00
|
|
|
draw_backing_rect(inst);
|
|
|
|
gtk_widget_queue_draw(inst->area);
|
|
|
|
}
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
2002-10-14 14:21:35 +04:00
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void palette_reset(void *frontend)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
/* This maps colour indices in inst->conf to those used in inst->cols. */
|
2002-10-14 14:21:35 +04:00
|
|
|
static const int ww[] = {
|
2004-11-28 18:13:34 +03:00
|
|
|
256, 257, 258, 259, 260, 261,
|
|
|
|
0, 8, 1, 9, 2, 10, 3, 11,
|
|
|
|
4, 12, 5, 13, 6, 14, 7, 15
|
2002-10-14 14:21:35 +04:00
|
|
|
};
|
2004-11-28 18:13:34 +03:00
|
|
|
gboolean success[NALLCOLOURS];
|
2002-10-14 14:21:35 +04:00
|
|
|
int i;
|
|
|
|
|
2004-11-28 18:13:34 +03:00
|
|
|
assert(lenof(ww) == NCFGCOLOURS);
|
2002-10-14 14:21:35 +04:00
|
|
|
|
|
|
|
if (!inst->colmap) {
|
|
|
|
inst->colmap = gdk_colormap_get_system();
|
|
|
|
} else {
|
2004-11-28 18:13:34 +03:00
|
|
|
gdk_colormap_free_colors(inst->colmap, inst->cols, NALLCOLOURS);
|
2002-10-14 14:21:35 +04:00
|
|
|
}
|
|
|
|
|
2004-11-28 18:13:34 +03:00
|
|
|
for (i = 0; i < NCFGCOLOURS; i++) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->cols[ww[i]].red =
|
|
|
|
conf_get_int_int(inst->conf, CONF_colours, i*3+0) * 0x0101;
|
|
|
|
inst->cols[ww[i]].green =
|
|
|
|
conf_get_int_int(inst->conf, CONF_colours, i*3+1) * 0x0101;
|
|
|
|
inst->cols[ww[i]].blue =
|
|
|
|
conf_get_int_int(inst->conf, CONF_colours, i*3+2) * 0x0101;
|
2002-10-14 14:21:35 +04:00
|
|
|
}
|
|
|
|
|
2004-11-28 18:13:34 +03:00
|
|
|
for (i = 0; i < NEXTCOLOURS; i++) {
|
|
|
|
if (i < 216) {
|
|
|
|
int r = i / 36, g = (i / 6) % 6, b = i % 6;
|
2005-10-14 01:56:43 +04:00
|
|
|
inst->cols[i+16].red = r ? r * 0x2828 + 0x3737 : 0;
|
|
|
|
inst->cols[i+16].green = g ? g * 0x2828 + 0x3737 : 0;
|
2007-03-19 15:05:34 +03:00
|
|
|
inst->cols[i+16].blue = b ? b * 0x2828 + 0x3737 : 0;
|
2004-11-28 18:13:34 +03:00
|
|
|
} else {
|
|
|
|
int shade = i - 216;
|
2005-10-14 01:56:43 +04:00
|
|
|
shade = shade * 0x0a0a + 0x0808;
|
2004-11-28 18:13:34 +03:00
|
|
|
inst->cols[i+16].red = inst->cols[i+16].green =
|
|
|
|
inst->cols[i+16].blue = shade;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gdk_colormap_alloc_colors(inst->colmap, inst->cols, NALLCOLOURS,
|
2005-04-26 02:46:08 +04:00
|
|
|
FALSE, TRUE, success);
|
2004-11-28 18:13:34 +03:00
|
|
|
for (i = 0; i < NALLCOLOURS; i++) {
|
2002-10-14 14:21:35 +04:00
|
|
|
if (!success[i])
|
2003-04-10 15:57:11 +04:00
|
|
|
g_error("%s: couldn't allocate colour %d (#%02x%02x%02x)\n",
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
appname, i,
|
|
|
|
conf_get_int_int(inst->conf, CONF_colours, i*3+0),
|
|
|
|
conf_get_int_int(inst->conf, CONF_colours, i*3+1),
|
|
|
|
conf_get_int_int(inst->conf, CONF_colours, i*3+2));
|
2002-10-14 14:21:35 +04:00
|
|
|
}
|
2002-10-25 15:58:59 +04:00
|
|
|
|
2006-03-13 01:17:46 +03:00
|
|
|
/* Since Default Background may have changed, ensure that space
|
|
|
|
* between text area and window border is refreshed. */
|
2002-10-26 16:58:13 +04:00
|
|
|
set_window_background(inst);
|
2008-03-22 21:11:17 +03:00
|
|
|
if (inst->area && inst->area->window) {
|
2006-03-13 01:17:46 +03:00
|
|
|
draw_backing_rect(inst);
|
|
|
|
gtk_widget_queue_draw(inst->area);
|
|
|
|
}
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2003-08-21 22:07:27 +04:00
|
|
|
/* Ensure that all the cut buffers exist - according to the ICCCM, we must
|
|
|
|
* do this before we start using cut buffers.
|
|
|
|
*/
|
|
|
|
void init_cutbuffers()
|
|
|
|
{
|
2006-12-31 02:00:14 +03:00
|
|
|
unsigned char empty[] = "";
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER0, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER1, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER2, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER3, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER4, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER5, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER6, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
XChangeProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
|
2006-12-31 02:00:14 +03:00
|
|
|
XA_CUT_BUFFER7, XA_STRING, 8, PropModeAppend, empty, 0);
|
2003-08-21 22:07:27 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Store the data in a cut-buffer. */
|
|
|
|
void store_cutbuffer(char * ptr, int len)
|
|
|
|
{
|
|
|
|
/* ICCCM says we must rotate the buffers before storing to buffer 0. */
|
|
|
|
XRotateBuffers(GDK_DISPLAY(), 1);
|
|
|
|
XStoreBytes(GDK_DISPLAY(), ptr, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Retrieve data from a cut-buffer.
|
|
|
|
* Returned data needs to be freed with XFree().
|
|
|
|
*/
|
|
|
|
char * retrieve_cutbuffer(int * nbytes)
|
|
|
|
{
|
|
|
|
char * ptr;
|
|
|
|
ptr = XFetchBytes(GDK_DISPLAY(), nbytes);
|
2004-05-24 15:30:15 +04:00
|
|
|
if (*nbytes <= 0 && ptr != 0) {
|
2003-08-21 22:07:27 +04:00
|
|
|
XFree(ptr);
|
|
|
|
ptr = 0;
|
|
|
|
}
|
|
|
|
return ptr;
|
|
|
|
}
|
|
|
|
|
2006-02-14 01:18:17 +03:00
|
|
|
void write_clip(void *frontend, wchar_t * data, int *attr, int len, int must_deselect)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-13 15:24:25 +04:00
|
|
|
if (inst->pasteout_data)
|
|
|
|
sfree(inst->pasteout_data);
|
2003-05-13 23:57:17 +04:00
|
|
|
if (inst->pasteout_data_ctext)
|
|
|
|
sfree(inst->pasteout_data_ctext);
|
2002-12-31 15:20:34 +03:00
|
|
|
if (inst->pasteout_data_utf8)
|
|
|
|
sfree(inst->pasteout_data_utf8);
|
|
|
|
|
2003-01-02 01:25:25 +03:00
|
|
|
/*
|
2003-05-13 23:57:17 +04:00
|
|
|
* Set up UTF-8 and compound text paste data. This only happens
|
|
|
|
* if we aren't in direct-to-font mode using the D800 hack.
|
2003-01-02 01:25:25 +03:00
|
|
|
*/
|
2003-01-02 19:17:56 +03:00
|
|
|
if (!inst->direct_to_font) {
|
2011-09-16 23:18:52 +04:00
|
|
|
const wchar_t *tmp = data;
|
2002-12-31 15:20:34 +03:00
|
|
|
int tmplen = len;
|
2003-05-13 23:57:17 +04:00
|
|
|
XTextProperty tp;
|
|
|
|
char *list[1];
|
2003-01-02 01:25:25 +03:00
|
|
|
|
2003-03-29 19:14:26 +03:00
|
|
|
inst->pasteout_data_utf8 = snewn(len*6, char);
|
2003-01-02 01:25:25 +03:00
|
|
|
inst->pasteout_data_utf8_len = len*6;
|
2002-12-31 15:20:34 +03:00
|
|
|
inst->pasteout_data_utf8_len =
|
|
|
|
charset_from_unicode(&tmp, &tmplen, inst->pasteout_data_utf8,
|
|
|
|
inst->pasteout_data_utf8_len,
|
|
|
|
CS_UTF8, NULL, NULL, 0);
|
2003-01-02 19:17:56 +03:00
|
|
|
if (inst->pasteout_data_utf8_len == 0) {
|
|
|
|
sfree(inst->pasteout_data_utf8);
|
|
|
|
inst->pasteout_data_utf8 = NULL;
|
|
|
|
} else {
|
|
|
|
inst->pasteout_data_utf8 =
|
2003-03-29 19:14:26 +03:00
|
|
|
sresize(inst->pasteout_data_utf8,
|
2003-05-13 23:57:17 +04:00
|
|
|
inst->pasteout_data_utf8_len + 1, char);
|
|
|
|
inst->pasteout_data_utf8[inst->pasteout_data_utf8_len] = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Now let Xlib convert our UTF-8 data into compound text.
|
|
|
|
*/
|
|
|
|
list[0] = inst->pasteout_data_utf8;
|
|
|
|
if (Xutf8TextListToTextProperty(GDK_DISPLAY(), list, 1,
|
|
|
|
XCompoundTextStyle, &tp) == 0) {
|
|
|
|
inst->pasteout_data_ctext = snewn(tp.nitems+1, char);
|
|
|
|
memcpy(inst->pasteout_data_ctext, tp.value, tp.nitems);
|
|
|
|
inst->pasteout_data_ctext_len = tp.nitems;
|
|
|
|
XFree(tp.value);
|
2004-07-27 19:20:37 +04:00
|
|
|
} else {
|
|
|
|
inst->pasteout_data_ctext = NULL;
|
|
|
|
inst->pasteout_data_ctext_len = 0;
|
|
|
|
}
|
2003-01-02 01:25:25 +03:00
|
|
|
} else {
|
|
|
|
inst->pasteout_data_utf8 = NULL;
|
|
|
|
inst->pasteout_data_utf8_len = 0;
|
2003-05-13 23:57:17 +04:00
|
|
|
inst->pasteout_data_ctext = NULL;
|
|
|
|
inst->pasteout_data_ctext_len = 0;
|
2002-12-31 15:20:34 +03:00
|
|
|
}
|
|
|
|
|
2003-03-29 19:14:26 +03:00
|
|
|
inst->pasteout_data = snewn(len*6, char);
|
2003-01-02 19:17:56 +03:00
|
|
|
inst->pasteout_data_len = len*6;
|
2003-01-14 21:28:23 +03:00
|
|
|
inst->pasteout_data_len = wc_to_mb(inst->ucsdata.line_codepage, 0,
|
|
|
|
data, len, inst->pasteout_data,
|
|
|
|
inst->pasteout_data_len,
|
|
|
|
NULL, NULL, NULL);
|
2003-01-02 19:17:56 +03:00
|
|
|
if (inst->pasteout_data_len == 0) {
|
|
|
|
sfree(inst->pasteout_data);
|
|
|
|
inst->pasteout_data = NULL;
|
|
|
|
} else {
|
|
|
|
inst->pasteout_data =
|
2003-03-29 19:14:26 +03:00
|
|
|
sresize(inst->pasteout_data, inst->pasteout_data_len, char);
|
2003-01-02 19:17:56 +03:00
|
|
|
}
|
2002-10-13 15:24:25 +04:00
|
|
|
|
2003-08-21 22:07:27 +04:00
|
|
|
store_cutbuffer(inst->pasteout_data, inst->pasteout_data_len);
|
|
|
|
|
2002-10-13 15:24:25 +04:00
|
|
|
if (gtk_selection_owner_set(inst->area, GDK_SELECTION_PRIMARY,
|
2003-08-21 22:03:06 +04:00
|
|
|
inst->input_event_time)) {
|
2008-12-03 03:06:38 +03:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
2008-12-02 02:03:11 +03:00
|
|
|
gtk_selection_clear_targets(inst->area, GDK_SELECTION_PRIMARY);
|
2008-12-03 03:06:38 +03:00
|
|
|
#endif
|
2002-10-13 15:24:25 +04:00
|
|
|
gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY,
|
|
|
|
GDK_SELECTION_TYPE_STRING, 1);
|
2003-05-13 23:57:17 +04:00
|
|
|
if (inst->pasteout_data_ctext)
|
|
|
|
gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY,
|
|
|
|
compound_text_atom, 1);
|
2003-01-02 01:25:25 +03:00
|
|
|
if (inst->pasteout_data_utf8)
|
|
|
|
gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY,
|
2003-04-11 21:40:52 +04:00
|
|
|
utf8_string_atom, 1);
|
2002-10-13 15:24:25 +04:00
|
|
|
}
|
2003-04-11 22:10:13 +04:00
|
|
|
|
|
|
|
if (must_deselect)
|
|
|
|
term_deselect(inst->term);
|
2002-10-13 15:24:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void selection_get(GtkWidget *widget, GtkSelectionData *seldata,
|
|
|
|
guint info, guint time_stamp, gpointer data)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2003-04-11 21:40:52 +04:00
|
|
|
if (seldata->target == utf8_string_atom)
|
2002-12-31 15:20:34 +03:00
|
|
|
gtk_selection_data_set(seldata, seldata->target, 8,
|
2006-12-31 02:00:14 +03:00
|
|
|
(unsigned char *)inst->pasteout_data_utf8,
|
2002-12-31 15:20:34 +03:00
|
|
|
inst->pasteout_data_utf8_len);
|
2003-05-13 23:57:17 +04:00
|
|
|
else if (seldata->target == compound_text_atom)
|
|
|
|
gtk_selection_data_set(seldata, seldata->target, 8,
|
2006-12-31 02:00:14 +03:00
|
|
|
(unsigned char *)inst->pasteout_data_ctext,
|
2003-05-13 23:57:17 +04:00
|
|
|
inst->pasteout_data_ctext_len);
|
2002-12-31 15:20:34 +03:00
|
|
|
else
|
|
|
|
gtk_selection_data_set(seldata, seldata->target, 8,
|
2006-12-31 02:00:14 +03:00
|
|
|
(unsigned char *)inst->pasteout_data,
|
|
|
|
inst->pasteout_data_len);
|
2002-10-13 15:24:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
gint selection_clear(GtkWidget *widget, GdkEventSelection *seldata,
|
|
|
|
gpointer data)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2003-08-21 22:03:06 +04:00
|
|
|
|
2002-10-26 15:08:59 +04:00
|
|
|
term_deselect(inst->term);
|
2002-10-13 15:24:25 +04:00
|
|
|
if (inst->pasteout_data)
|
|
|
|
sfree(inst->pasteout_data);
|
2003-05-13 23:57:17 +04:00
|
|
|
if (inst->pasteout_data_ctext)
|
|
|
|
sfree(inst->pasteout_data_ctext);
|
2002-12-31 15:20:34 +03:00
|
|
|
if (inst->pasteout_data_utf8)
|
|
|
|
sfree(inst->pasteout_data_utf8);
|
2002-10-13 15:24:25 +04:00
|
|
|
inst->pasteout_data = NULL;
|
|
|
|
inst->pasteout_data_len = 0;
|
2003-05-13 23:57:17 +04:00
|
|
|
inst->pasteout_data_ctext = NULL;
|
|
|
|
inst->pasteout_data_ctext_len = 0;
|
2002-12-31 15:20:34 +03:00
|
|
|
inst->pasteout_data_utf8 = NULL;
|
|
|
|
inst->pasteout_data_utf8_len = 0;
|
2002-10-13 15:24:25 +04:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void request_paste(void *frontend)
|
2002-10-13 15:24:25 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2002-10-13 15:24:25 +04:00
|
|
|
/*
|
|
|
|
* In Unix, pasting is asynchronous: all we can do at the
|
|
|
|
* moment is to call gtk_selection_convert(), and when the data
|
|
|
|
* comes back _then_ we can call term_do_paste().
|
|
|
|
*/
|
2002-12-31 15:20:34 +03:00
|
|
|
|
2003-01-02 19:17:56 +03:00
|
|
|
if (!inst->direct_to_font) {
|
2003-01-02 01:25:25 +03:00
|
|
|
/*
|
|
|
|
* First we attempt to retrieve the selection as a UTF-8
|
|
|
|
* string (which we will convert to the correct code page
|
|
|
|
* before sending to the session, of course). If that
|
|
|
|
* fails, selection_received() will be informed and will
|
|
|
|
* fall back to an ordinary string.
|
|
|
|
*/
|
|
|
|
gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY,
|
2003-08-21 22:03:06 +04:00
|
|
|
utf8_string_atom,
|
|
|
|
inst->input_event_time);
|
2003-01-02 01:25:25 +03:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* If we're in direct-to-font mode, we disable UTF-8
|
|
|
|
* pasting, and go straight to ordinary string data.
|
|
|
|
*/
|
|
|
|
gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY,
|
2003-08-21 22:03:06 +04:00
|
|
|
GDK_SELECTION_TYPE_STRING,
|
|
|
|
inst->input_event_time);
|
2003-01-02 01:25:25 +03:00
|
|
|
}
|
2002-10-13 15:24:25 +04:00
|
|
|
}
|
|
|
|
|
2002-10-15 03:32:00 +04:00
|
|
|
gint idle_paste_func(gpointer data); /* forward ref */
|
|
|
|
|
2002-10-13 15:24:25 +04:00
|
|
|
void selection_received(GtkWidget *widget, GtkSelectionData *seldata,
|
2002-10-28 12:38:28 +03:00
|
|
|
guint time, gpointer data)
|
2002-10-13 15:24:25 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2003-05-13 23:57:17 +04:00
|
|
|
XTextProperty tp;
|
|
|
|
char **list;
|
|
|
|
char *text;
|
|
|
|
int length, count, ret;
|
|
|
|
int free_list_required = 0;
|
2003-08-21 22:07:27 +04:00
|
|
|
int free_required = 0;
|
2003-05-13 23:57:17 +04:00
|
|
|
int charset;
|
2002-10-26 16:58:13 +04:00
|
|
|
|
2003-04-11 21:40:52 +04:00
|
|
|
if (seldata->target == utf8_string_atom && seldata->length <= 0) {
|
2002-12-31 15:20:34 +03:00
|
|
|
/*
|
2003-05-13 22:43:30 +04:00
|
|
|
* Failed to get a UTF-8 selection string. Try compound
|
|
|
|
* text next.
|
|
|
|
*/
|
|
|
|
gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY,
|
2003-08-21 22:03:06 +04:00
|
|
|
compound_text_atom,
|
|
|
|
inst->input_event_time);
|
2003-05-13 22:43:30 +04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (seldata->target == compound_text_atom && seldata->length <= 0) {
|
|
|
|
/*
|
|
|
|
* Failed to get UTF-8 or compound text. Try an ordinary
|
2002-12-31 15:20:34 +03:00
|
|
|
* string.
|
|
|
|
*/
|
|
|
|
gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY,
|
2003-08-21 22:03:06 +04:00
|
|
|
GDK_SELECTION_TYPE_STRING,
|
|
|
|
inst->input_event_time);
|
2002-12-31 15:20:34 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2003-08-21 22:07:27 +04:00
|
|
|
* If we have data, but it's not of a type we can deal with,
|
|
|
|
* we have to ignore the data.
|
2002-12-31 15:20:34 +03:00
|
|
|
*/
|
2003-08-21 22:07:27 +04:00
|
|
|
if (seldata->length > 0 &&
|
|
|
|
seldata->type != GDK_SELECTION_TYPE_STRING &&
|
|
|
|
seldata->type != compound_text_atom &&
|
|
|
|
seldata->type != utf8_string_atom)
|
|
|
|
return;
|
2003-05-13 23:57:17 +04:00
|
|
|
|
2003-08-21 22:07:27 +04:00
|
|
|
/*
|
|
|
|
* If we have no data, try looking in a cut buffer.
|
|
|
|
*/
|
|
|
|
if (seldata->length <= 0) {
|
|
|
|
text = retrieve_cutbuffer(&length);
|
|
|
|
if (length == 0)
|
|
|
|
return;
|
|
|
|
/* Xterm is rumoured to expect Latin-1, though I havn't checked the
|
|
|
|
* source, so use that as a de-facto standard. */
|
|
|
|
charset = CS_ISO8859_1;
|
|
|
|
free_required = 1;
|
|
|
|
} else {
|
2004-05-22 18:21:27 +04:00
|
|
|
/*
|
|
|
|
* Convert COMPOUND_TEXT into UTF-8.
|
|
|
|
*/
|
|
|
|
if (seldata->type == compound_text_atom) {
|
|
|
|
tp.value = seldata->data;
|
|
|
|
tp.encoding = (Atom) seldata->type;
|
|
|
|
tp.format = seldata->format;
|
|
|
|
tp.nitems = seldata->length;
|
|
|
|
ret = Xutf8TextPropertyToTextList(GDK_DISPLAY(), &tp,
|
|
|
|
&list, &count);
|
|
|
|
if (ret != 0 || count != 1) {
|
|
|
|
/*
|
|
|
|
* Compound text failed; fall back to STRING.
|
|
|
|
*/
|
|
|
|
gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY,
|
|
|
|
GDK_SELECTION_TYPE_STRING,
|
|
|
|
inst->input_event_time);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
text = list[0];
|
|
|
|
length = strlen(list[0]);
|
|
|
|
charset = CS_UTF8;
|
|
|
|
free_list_required = 1;
|
|
|
|
} else {
|
|
|
|
text = (char *)seldata->data;
|
|
|
|
length = seldata->length;
|
|
|
|
charset = (seldata->type == utf8_string_atom ?
|
|
|
|
CS_UTF8 : inst->ucsdata.line_codepage);
|
2003-05-13 23:57:17 +04:00
|
|
|
}
|
2003-08-21 22:07:27 +04:00
|
|
|
}
|
2003-05-13 23:57:17 +04:00
|
|
|
|
2002-10-13 15:24:25 +04:00
|
|
|
if (inst->pastein_data)
|
|
|
|
sfree(inst->pastein_data);
|
|
|
|
|
2003-05-13 23:57:17 +04:00
|
|
|
inst->pastein_data = snewn(length, wchar_t);
|
|
|
|
inst->pastein_data_len = length;
|
2002-12-31 15:20:34 +03:00
|
|
|
inst->pastein_data_len =
|
2003-05-13 23:57:17 +04:00
|
|
|
mb_to_wc(charset, 0, text, length,
|
2002-12-31 15:20:34 +03:00
|
|
|
inst->pastein_data, inst->pastein_data_len);
|
2002-10-13 15:24:25 +04:00
|
|
|
|
2002-10-26 15:08:59 +04:00
|
|
|
term_do_paste(inst->term);
|
2002-10-15 03:32:00 +04:00
|
|
|
|
2002-10-26 15:08:59 +04:00
|
|
|
if (term_paste_pending(inst->term))
|
2002-10-15 03:32:00 +04:00
|
|
|
inst->term_paste_idle_id = gtk_idle_add(idle_paste_func, inst);
|
2003-05-13 23:57:17 +04:00
|
|
|
|
|
|
|
if (free_list_required)
|
|
|
|
XFreeStringList(list);
|
2003-08-21 22:07:27 +04:00
|
|
|
if (free_required)
|
|
|
|
XFree(text);
|
2002-10-15 03:32:00 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
gint idle_paste_func(gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
|
2002-10-26 15:08:59 +04:00
|
|
|
if (term_paste_pending(inst->term))
|
|
|
|
term_paste(inst->term);
|
2002-10-15 03:32:00 +04:00
|
|
|
else
|
|
|
|
gtk_idle_remove(inst->term_paste_idle_id);
|
|
|
|
|
|
|
|
return TRUE;
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-15 03:32:00 +04:00
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void get_clip(void *frontend, wchar_t ** p, int *len)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
if (p) {
|
2002-10-13 15:24:25 +04:00
|
|
|
*p = inst->pastein_data;
|
|
|
|
*len = inst->pastein_data_len;
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-04-26 17:55:47 +04:00
|
|
|
static void set_window_titles(struct gui_data *inst)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* We must always call set_icon_name after calling set_title,
|
|
|
|
* since set_title will write both names. Irritating, but such
|
|
|
|
* is life.
|
|
|
|
*/
|
|
|
|
gtk_window_set_title(GTK_WINDOW(inst->window), inst->wintitle);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (!conf_get_int(inst->conf, CONF_win_name_always))
|
2003-04-26 17:55:47 +04:00
|
|
|
gdk_window_set_icon_name(inst->window->window, inst->icontitle);
|
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_title(void *frontend, char *title)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
sfree(inst->wintitle);
|
|
|
|
inst->wintitle = dupstr(title);
|
2003-04-26 17:55:47 +04:00
|
|
|
set_window_titles(inst);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_icon(void *frontend, char *title)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
sfree(inst->icontitle);
|
|
|
|
inst->icontitle = dupstr(title);
|
|
|
|
set_window_titles(inst);
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_title_and_icon(void *frontend, char *title, char *icon)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
sfree(inst->wintitle);
|
|
|
|
inst->wintitle = dupstr(title);
|
|
|
|
sfree(inst->icontitle);
|
|
|
|
inst->icontitle = dupstr(icon);
|
2003-04-26 17:55:47 +04:00
|
|
|
set_window_titles(inst);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void set_sbar(void *frontend, int total, int start, int page)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (!conf_get_int(inst->conf, CONF_scrollbar))
|
2002-10-15 18:55:19 +04:00
|
|
|
return;
|
2002-10-13 13:54:36 +04:00
|
|
|
inst->sbar_adjust->lower = 0;
|
|
|
|
inst->sbar_adjust->upper = total;
|
|
|
|
inst->sbar_adjust->value = start;
|
|
|
|
inst->sbar_adjust->page_size = page;
|
|
|
|
inst->sbar_adjust->step_increment = 1;
|
|
|
|
inst->sbar_adjust->page_increment = page/2;
|
2002-10-13 16:44:01 +04:00
|
|
|
inst->ignore_sbar = TRUE;
|
2002-10-13 13:54:36 +04:00
|
|
|
gtk_adjustment_changed(inst->sbar_adjust);
|
2002-10-13 16:44:01 +04:00
|
|
|
inst->ignore_sbar = FALSE;
|
2002-10-13 13:54:36 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void scrollbar_moved(GtkAdjustment *adj, gpointer data)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (!conf_get_int(inst->conf, CONF_scrollbar))
|
2002-10-15 18:55:19 +04:00
|
|
|
return;
|
2002-10-13 16:44:01 +04:00
|
|
|
if (!inst->ignore_sbar)
|
2002-10-26 15:08:59 +04:00
|
|
|
term_scroll(inst->term, 1, (int)adj->value);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
void sys_cursor(void *frontend, int x, int y)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* This is meaningless under X.
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
2002-10-29 00:58:07 +03:00
|
|
|
/*
|
|
|
|
* This is still called when mode==BELL_VISUAL, even though the
|
|
|
|
* visual bell is handled entirely within terminal.c, because we
|
|
|
|
* may want to perform additional actions on any kind of bell (for
|
|
|
|
* example, taskbar flashing in Windows).
|
|
|
|
*/
|
2005-12-09 23:04:19 +03:00
|
|
|
void do_beep(void *frontend, int mode)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2007-02-24 16:36:11 +03:00
|
|
|
if (mode == BELL_DEFAULT)
|
2002-10-29 00:58:07 +03:00
|
|
|
gdk_beep();
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-11-10 00:46:21 +03:00
|
|
|
int char_width(Context ctx, int uc)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Under X, any fixed-width font really _is_ fixed-width.
|
|
|
|
* Double-width characters will be dealt with using a separate
|
|
|
|
* font. For the moment we can simply return 1.
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
*
|
|
|
|
* FIXME: but is that also true of Pango?
|
2002-10-09 22:09:42 +04:00
|
|
|
*/
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
Context get_ctx(void *frontend)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
|
|
|
struct draw_ctx *dctx;
|
|
|
|
|
2002-10-10 14:40:30 +04:00
|
|
|
if (!inst->area->window)
|
|
|
|
return NULL;
|
2002-10-26 16:58:13 +04:00
|
|
|
|
2003-03-29 19:14:26 +03:00
|
|
|
dctx = snew(struct draw_ctx);
|
2002-10-26 16:58:13 +04:00
|
|
|
dctx->inst = inst;
|
|
|
|
dctx->gc = gdk_gc_new(inst->area->window);
|
|
|
|
return dctx;
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void free_ctx(Context ctx)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
|
|
|
/* struct gui_data *inst = dctx->inst; */
|
|
|
|
GdkGC *gc = dctx->gc;
|
2002-10-09 22:09:42 +04:00
|
|
|
gdk_gc_unref(gc);
|
2002-10-26 16:58:13 +04:00
|
|
|
sfree(dctx);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Draw a line of text in the window, at given character
|
|
|
|
* coordinates, in given attributes.
|
|
|
|
*
|
|
|
|
* We are allowed to fiddle with the contents of `text'.
|
|
|
|
*/
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len,
|
2002-10-15 22:18:25 +04:00
|
|
|
unsigned long attr, int lattr)
|
2002-10-09 22:09:42 +04:00
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
|
|
|
struct gui_data *inst = dctx->inst;
|
|
|
|
GdkGC *gc = dctx->gc;
|
2004-10-14 20:42:43 +04:00
|
|
|
int ncombining, combining;
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
int nfg, nbg, t, fontid, shadow, rlen, widefactor, bold;
|
2005-04-28 01:22:40 +04:00
|
|
|
int monochrome = gtk_widget_get_visual(inst->area)->depth == 1;
|
2002-10-10 14:40:30 +04:00
|
|
|
|
2004-10-14 20:42:43 +04:00
|
|
|
if (attr & TATTR_COMBINING) {
|
|
|
|
ncombining = len;
|
|
|
|
len = 1;
|
|
|
|
} else
|
|
|
|
ncombining = 1;
|
|
|
|
|
2005-04-28 01:09:45 +04:00
|
|
|
nfg = ((monochrome ? ATTR_DEFFG : (attr & ATTR_FGMASK)) >> ATTR_FGSHIFT);
|
|
|
|
nbg = ((monochrome ? ATTR_DEFBG : (attr & ATTR_BGMASK)) >> ATTR_BGSHIFT);
|
2005-04-28 01:42:51 +04:00
|
|
|
if (!!(attr & ATTR_REVERSE) ^ (monochrome && (attr & TATTR_ACTCURS))) {
|
2002-10-10 14:40:30 +04:00
|
|
|
t = nfg;
|
|
|
|
nfg = nbg;
|
|
|
|
nbg = t;
|
|
|
|
}
|
2012-06-09 19:09:22 +04:00
|
|
|
if ((inst->bold_style & 2) && (attr & ATTR_BOLD)) {
|
2004-11-28 18:13:34 +03:00
|
|
|
if (nfg < 16) nfg |= 8;
|
|
|
|
else if (nfg >= 256) nfg |= 1;
|
|
|
|
}
|
2012-06-09 19:09:22 +04:00
|
|
|
if ((inst->bold_style & 2) && (attr & ATTR_BLINK)) {
|
2004-11-28 18:13:34 +03:00
|
|
|
if (nbg < 16) nbg |= 8;
|
|
|
|
else if (nbg >= 256) nbg |= 1;
|
|
|
|
}
|
2005-04-28 01:42:51 +04:00
|
|
|
if ((attr & TATTR_ACTCURS) && !monochrome) {
|
2004-11-28 18:13:34 +03:00
|
|
|
nfg = 260;
|
|
|
|
nbg = 261;
|
2002-10-10 14:40:30 +04:00
|
|
|
}
|
|
|
|
|
2002-10-15 22:42:48 +04:00
|
|
|
fontid = shadow = 0;
|
2003-01-02 00:53:22 +03:00
|
|
|
|
|
|
|
if (attr & ATTR_WIDE) {
|
|
|
|
widefactor = 2;
|
|
|
|
fontid |= 2;
|
|
|
|
} else {
|
|
|
|
widefactor = 1;
|
|
|
|
}
|
|
|
|
|
2012-06-09 19:09:22 +04:00
|
|
|
if ((attr & ATTR_BOLD) && (inst->bold_style & 1)) {
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
bold = 1;
|
|
|
|
fontid |= 1;
|
|
|
|
} else {
|
|
|
|
bold = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!inst->fonts[fontid]) {
|
|
|
|
int i;
|
|
|
|
/*
|
|
|
|
* Fall back through font ids with subsets of this one's
|
|
|
|
* set bits, in order.
|
|
|
|
*/
|
|
|
|
for (i = fontid; i-- > 0 ;) {
|
|
|
|
if (i & ~fontid)
|
|
|
|
continue; /* some other bit is set */
|
|
|
|
if (inst->fonts[i]) {
|
|
|
|
fontid = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assert(inst->fonts[fontid]); /* we should at least have hit zero */
|
2002-10-15 22:42:48 +04:00
|
|
|
}
|
|
|
|
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
if ((lattr & LATTR_MODE) != LATTR_NORM) {
|
2002-10-15 04:22:48 +04:00
|
|
|
x *= 2;
|
2002-10-26 15:08:59 +04:00
|
|
|
if (x >= inst->term->cols)
|
2002-10-15 13:30:16 +04:00
|
|
|
return;
|
2003-01-02 00:53:22 +03:00
|
|
|
if (x + len*2*widefactor > inst->term->cols)
|
|
|
|
len = (inst->term->cols-x)/2/widefactor;/* trim to LH half */
|
2002-11-02 19:16:35 +03:00
|
|
|
rlen = len * 2;
|
|
|
|
} else
|
|
|
|
rlen = len;
|
|
|
|
|
|
|
|
{
|
|
|
|
GdkRectangle r;
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
r.x = x*inst->font_width+inst->window_border;
|
|
|
|
r.y = y*inst->font_height+inst->window_border;
|
2003-01-02 00:53:22 +03:00
|
|
|
r.width = rlen*widefactor*inst->font_width;
|
2002-11-02 19:16:35 +03:00
|
|
|
r.height = inst->font_height;
|
|
|
|
gdk_gc_set_clip_rectangle(gc, &r);
|
2002-10-15 04:22:48 +04:00
|
|
|
}
|
|
|
|
|
2002-10-10 14:40:30 +04:00
|
|
|
gdk_gc_set_foreground(gc, &inst->cols[nbg]);
|
2002-10-10 18:42:56 +04:00
|
|
|
gdk_draw_rectangle(inst->pixmap, gc, 1,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border,
|
2003-01-02 00:53:22 +03:00
|
|
|
rlen*widefactor*inst->font_width, inst->font_height);
|
2002-10-13 13:54:36 +04:00
|
|
|
|
2002-10-10 14:40:30 +04:00
|
|
|
gdk_gc_set_foreground(gc, &inst->cols[nfg]);
|
2011-09-16 23:18:53 +04:00
|
|
|
for (combining = 0; combining < ncombining; combining++) {
|
|
|
|
unifont_draw_text(inst->pixmap, gc, inst->fonts[fontid],
|
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border+inst->fonts[0]->ascent,
|
|
|
|
text + combining, len, widefactor > 1,
|
|
|
|
bold, inst->font_width);
|
2002-12-31 15:20:34 +03:00
|
|
|
}
|
2002-10-10 14:40:30 +04:00
|
|
|
|
|
|
|
if (attr & ATTR_UNDER) {
|
|
|
|
int uheight = inst->fonts[0]->ascent + 1;
|
2002-10-10 18:42:56 +04:00
|
|
|
if (uheight >= inst->font_height)
|
|
|
|
uheight = inst->font_height - 1;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
gdk_draw_line(inst->pixmap, gc, x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height + uheight + inst->window_border,
|
|
|
|
(x+len)*widefactor*inst->font_width-1+inst->window_border,
|
|
|
|
y*inst->font_height + uheight + inst->window_border);
|
2002-10-10 14:40:30 +04:00
|
|
|
}
|
|
|
|
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
if ((lattr & LATTR_MODE) != LATTR_NORM) {
|
2002-10-15 04:22:48 +04:00
|
|
|
/*
|
|
|
|
* I can't find any plausible StretchBlt equivalent in the
|
|
|
|
* X server, so I'm going to do this the slow and painful
|
|
|
|
* way. This will involve repeated calls to
|
|
|
|
* gdk_draw_pixmap() to stretch the text horizontally. It's
|
|
|
|
* O(N^2) in time and O(N) in network bandwidth, but you
|
|
|
|
* try thinking of a better way. :-(
|
|
|
|
*/
|
|
|
|
int i;
|
2003-01-02 00:53:22 +03:00
|
|
|
for (i = 0; i < len * widefactor * inst->font_width; i++) {
|
2002-10-15 04:22:48 +04:00
|
|
|
gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x*inst->font_width+inst->window_border + 2*i,
|
|
|
|
y*inst->font_height+inst->window_border,
|
|
|
|
x*inst->font_width+inst->window_border + 2*i+1,
|
|
|
|
y*inst->font_height+inst->window_border,
|
2004-10-15 16:17:48 +04:00
|
|
|
len * widefactor * inst->font_width - i, inst->font_height);
|
2002-10-15 04:22:48 +04:00
|
|
|
}
|
|
|
|
len *= 2;
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
if ((lattr & LATTR_MODE) != LATTR_WIDE) {
|
2002-10-15 04:22:48 +04:00
|
|
|
int dt, db;
|
|
|
|
/* Now stretch vertically, in the same way. */
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
if ((lattr & LATTR_MODE) == LATTR_BOT)
|
2002-10-15 04:22:48 +04:00
|
|
|
dt = 0, db = 1;
|
|
|
|
else
|
|
|
|
dt = 1, db = 0;
|
|
|
|
for (i = 0; i < inst->font_height; i+=2) {
|
|
|
|
gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border+dt*i+db,
|
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border+dt*(i+1),
|
2004-10-15 16:17:48 +04:00
|
|
|
len * widefactor * inst->font_width, inst->font_height-i-1);
|
2002-10-15 04:22:48 +04:00
|
|
|
}
|
|
|
|
}
|
2002-10-15 22:18:25 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
void do_text(Context ctx, int x, int y, wchar_t *text, int len,
|
2002-10-15 22:18:25 +04:00
|
|
|
unsigned long attr, int lattr)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
|
|
|
struct gui_data *inst = dctx->inst;
|
|
|
|
GdkGC *gc = dctx->gc;
|
2003-01-02 00:53:22 +03:00
|
|
|
int widefactor;
|
2002-10-15 22:18:25 +04:00
|
|
|
|
|
|
|
do_text_internal(ctx, x, y, text, len, attr, lattr);
|
|
|
|
|
2003-01-02 00:53:22 +03:00
|
|
|
if (attr & ATTR_WIDE) {
|
|
|
|
widefactor = 2;
|
|
|
|
} else {
|
|
|
|
widefactor = 1;
|
|
|
|
}
|
|
|
|
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
if ((lattr & LATTR_MODE) != LATTR_NORM) {
|
2002-10-15 22:18:25 +04:00
|
|
|
x *= 2;
|
2002-10-26 15:08:59 +04:00
|
|
|
if (x >= inst->term->cols)
|
2002-10-15 22:18:25 +04:00
|
|
|
return;
|
2003-01-02 00:53:22 +03:00
|
|
|
if (x + len*2*widefactor > inst->term->cols)
|
|
|
|
len = (inst->term->cols-x)/2/widefactor;/* trim to LH half */
|
2002-10-15 04:22:48 +04:00
|
|
|
len *= 2;
|
|
|
|
}
|
|
|
|
|
2002-10-10 14:40:30 +04:00
|
|
|
gdk_draw_pixmap(inst->area->window, gc, inst->pixmap,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border,
|
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border,
|
2003-01-02 00:53:22 +03:00
|
|
|
len*widefactor*inst->font_width, inst->font_height);
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
void do_cursor(Context ctx, int x, int y, wchar_t *text, int len,
|
2002-10-09 22:09:42 +04:00
|
|
|
unsigned long attr, int lattr)
|
|
|
|
{
|
2002-10-26 16:58:13 +04:00
|
|
|
struct draw_ctx *dctx = (struct draw_ctx *)ctx;
|
|
|
|
struct gui_data *inst = dctx->inst;
|
|
|
|
GdkGC *gc = dctx->gc;
|
|
|
|
|
2004-09-29 00:42:39 +04:00
|
|
|
int active, passive, widefactor;
|
2002-10-10 14:40:30 +04:00
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
if (attr & TATTR_PASCURS) {
|
|
|
|
attr &= ~TATTR_PASCURS;
|
2002-10-10 14:40:30 +04:00
|
|
|
passive = 1;
|
|
|
|
} else
|
|
|
|
passive = 0;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if ((attr & TATTR_ACTCURS) && inst->cursor_type != 0) {
|
2002-10-15 22:18:25 +04:00
|
|
|
attr &= ~TATTR_ACTCURS;
|
2004-09-29 00:42:39 +04:00
|
|
|
active = 1;
|
|
|
|
} else
|
|
|
|
active = 0;
|
2002-10-15 22:18:25 +04:00
|
|
|
do_text_internal(ctx, x, y, text, len, attr, lattr);
|
|
|
|
|
2004-10-15 12:51:57 +04:00
|
|
|
if (attr & TATTR_COMBINING)
|
|
|
|
len = 1;
|
|
|
|
|
2003-01-02 00:53:22 +03:00
|
|
|
if (attr & ATTR_WIDE) {
|
|
|
|
widefactor = 2;
|
|
|
|
} else {
|
|
|
|
widefactor = 1;
|
|
|
|
}
|
|
|
|
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
if ((lattr & LATTR_MODE) != LATTR_NORM) {
|
2002-10-15 22:18:25 +04:00
|
|
|
x *= 2;
|
2002-10-26 15:08:59 +04:00
|
|
|
if (x >= inst->term->cols)
|
2002-10-15 22:18:25 +04:00
|
|
|
return;
|
2003-01-02 00:53:22 +03:00
|
|
|
if (x + len*2*widefactor > inst->term->cols)
|
|
|
|
len = (inst->term->cols-x)/2/widefactor;/* trim to LH half */
|
2002-10-15 22:18:25 +04:00
|
|
|
len *= 2;
|
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (inst->cursor_type == 0) {
|
2002-10-15 22:18:25 +04:00
|
|
|
/*
|
|
|
|
* An active block cursor will already have been done by
|
|
|
|
* the above do_text call, so we only need to do anything
|
|
|
|
* if it's passive.
|
|
|
|
*/
|
|
|
|
if (passive) {
|
2004-11-28 18:13:34 +03:00
|
|
|
gdk_gc_set_foreground(gc, &inst->cols[261]);
|
2002-10-15 22:18:25 +04:00
|
|
|
gdk_draw_rectangle(inst->pixmap, gc, 0,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border,
|
2004-10-15 16:25:51 +04:00
|
|
|
len*widefactor*inst->font_width-1, inst->font_height-1);
|
2002-10-15 22:18:25 +04:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
int uheight;
|
|
|
|
int startx, starty, dx, dy, length, i;
|
|
|
|
|
|
|
|
int char_width;
|
|
|
|
|
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long'
encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of
`termchar' structures, which currently have 32-bit Unicode and 32
attribute bits but which will probably expand further in future.
To prevent bloat of the memory footprint, I've introduced a mostly
RLE-like compression scheme for storing scrollback: each line is
compressed into a compact (but hard to modify) form when it moves
into the term->scrollback tree, and is temporarily decompressed when
the user wants to scroll back over it. My initial tests suggest that
this compression averages about 1/4 of the previous (32 bits per
character cell) data size in typical output, which means this is an
improvement even without counting the new ability to extend the
information stored in each character cell.
Another beneficial side effect is that the insane format in which
Unicode was passed to front ends through do_text() has now been
rendered sane.
Testing is incomplete; this _may_ still have instabilities. Windows
and Unix front ends both seem to work as far as I've looked, but I
haven't yet looked very hard. The Mac front end I've edited (it
seemed obvious how to change it) but I can't compile or test it.
As an immediate functional effect, the terminal emulator now
supports full 32-bit Unicode to whatever extent the host platform
allows it to. For example, if you output a 4-or-more-byte UTF-8
character in Unix pterm, it will not display it properly, but it
will correctly paste it back out in a UTF8_STRING selection. Windows
is more restricted, sadly.
[originally from svn r4609]
2004-10-13 15:50:16 +04:00
|
|
|
if ((attr & ATTR_WIDE) || (lattr & LATTR_MODE) != LATTR_NORM)
|
2002-10-15 22:18:25 +04:00
|
|
|
char_width = 2*inst->font_width;
|
|
|
|
else
|
|
|
|
char_width = inst->font_width;
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (inst->cursor_type == 1) {
|
2002-10-15 22:18:25 +04:00
|
|
|
uheight = inst->fonts[0]->ascent + 1;
|
|
|
|
if (uheight >= inst->font_height)
|
|
|
|
uheight = inst->font_height - 1;
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
startx = x * inst->font_width + inst->window_border;
|
|
|
|
starty = y * inst->font_height + inst->window_border + uheight;
|
2002-10-15 22:18:25 +04:00
|
|
|
dx = 1;
|
|
|
|
dy = 0;
|
2004-10-15 16:25:51 +04:00
|
|
|
length = len * widefactor * char_width;
|
2002-10-15 22:18:25 +04:00
|
|
|
} else {
|
|
|
|
int xadjust = 0;
|
|
|
|
if (attr & TATTR_RIGHTCURS)
|
|
|
|
xadjust = char_width - 1;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
startx = x * inst->font_width + inst->window_border + xadjust;
|
|
|
|
starty = y * inst->font_height + inst->window_border;
|
2002-10-15 22:18:25 +04:00
|
|
|
dx = 0;
|
|
|
|
dy = 1;
|
|
|
|
length = inst->font_height;
|
|
|
|
}
|
|
|
|
|
2004-12-20 01:37:05 +03:00
|
|
|
gdk_gc_set_foreground(gc, &inst->cols[261]);
|
2002-10-15 22:18:25 +04:00
|
|
|
if (passive) {
|
|
|
|
for (i = 0; i < length; i++) {
|
|
|
|
if (i % 2 == 0) {
|
|
|
|
gdk_draw_point(inst->pixmap, gc, startx, starty);
|
|
|
|
}
|
|
|
|
startx += dx;
|
|
|
|
starty += dy;
|
|
|
|
}
|
2004-09-29 00:42:39 +04:00
|
|
|
} else if (active) {
|
2002-10-15 22:18:25 +04:00
|
|
|
gdk_draw_line(inst->pixmap, gc, startx, starty,
|
|
|
|
startx + (length-1) * dx, starty + (length-1) * dy);
|
2004-09-29 00:42:39 +04:00
|
|
|
} /* else no cursor (e.g., blinked off) */
|
2002-10-10 14:40:30 +04:00
|
|
|
}
|
2002-10-15 22:18:25 +04:00
|
|
|
|
|
|
|
gdk_draw_pixmap(inst->area->window, gc, inst->pixmap,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border,
|
|
|
|
x*inst->font_width+inst->window_border,
|
|
|
|
y*inst->font_height+inst->window_border,
|
2003-01-02 00:53:22 +03:00
|
|
|
len*widefactor*inst->font_width, inst->font_height);
|
2012-06-17 11:26:23 +04:00
|
|
|
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
{
|
|
|
|
GdkRectangle cursorrect;
|
|
|
|
cursorrect.x = x*inst->font_width+inst->window_border;
|
|
|
|
cursorrect.y = y*inst->font_height+inst->window_border;
|
|
|
|
cursorrect.width = len*widefactor*inst->font_width;
|
|
|
|
cursorrect.height = inst->font_height;
|
|
|
|
gtk_im_context_set_cursor_location(inst->imc, &cursorrect);
|
|
|
|
}
|
|
|
|
#endif
|
2002-10-09 22:09:42 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
GdkCursor *make_mouse_ptr(struct gui_data *inst, int cursor_val)
|
2002-10-13 16:17:03 +04:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Truly hideous hack: GTK doesn't allow us to set the mouse
|
|
|
|
* cursor foreground and background colours unless we've _also_
|
|
|
|
* created our own cursor from bitmaps. Therefore, I need to
|
|
|
|
* load the `cursor' font and draw glyphs from it on to
|
|
|
|
* pixmaps, in order to construct my cursors with the fg and bg
|
|
|
|
* I want. This is a gross hack, but it's more self-contained
|
|
|
|
* than linking in Xlib to find the X window handle to
|
|
|
|
* inst->area and calling XRecolorCursor, and it's more
|
|
|
|
* futureproof than hard-coding the shapes as bitmap arrays.
|
|
|
|
*/
|
|
|
|
static GdkFont *cursor_font = NULL;
|
|
|
|
GdkPixmap *source, *mask;
|
|
|
|
GdkGC *gc;
|
|
|
|
GdkColor cfg = { 0, 65535, 65535, 65535 };
|
|
|
|
GdkColor cbg = { 0, 0, 0, 0 };
|
|
|
|
GdkColor dfg = { 1, 65535, 65535, 65535 };
|
|
|
|
GdkColor dbg = { 0, 0, 0, 0 };
|
|
|
|
GdkCursor *ret;
|
|
|
|
gchar text[2];
|
|
|
|
gint lb, rb, wid, asc, desc, w, h, x, y;
|
|
|
|
|
2002-10-14 13:58:27 +04:00
|
|
|
if (cursor_val == -2) {
|
2002-10-13 16:17:03 +04:00
|
|
|
gdk_font_unref(cursor_font);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2007-01-25 22:33:29 +03:00
|
|
|
if (cursor_val >= 0 && !cursor_font) {
|
2002-10-13 16:17:03 +04:00
|
|
|
cursor_font = gdk_font_load("cursor");
|
2007-01-25 22:33:29 +03:00
|
|
|
if (cursor_font)
|
|
|
|
gdk_font_ref(cursor_font);
|
|
|
|
}
|
2002-10-13 16:17:03 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Get the text extent of the cursor in question. We use the
|
|
|
|
* mask character for this, because it's typically slightly
|
|
|
|
* bigger than the main character.
|
|
|
|
*/
|
2002-10-14 13:58:27 +04:00
|
|
|
if (cursor_val >= 0) {
|
|
|
|
text[1] = '\0';
|
|
|
|
text[0] = (char)cursor_val + 1;
|
|
|
|
gdk_string_extents(cursor_font, text, &lb, &rb, &wid, &asc, &desc);
|
|
|
|
w = rb-lb; h = asc+desc; x = -lb; y = asc;
|
|
|
|
} else {
|
|
|
|
w = h = 1;
|
|
|
|
x = y = 0;
|
|
|
|
}
|
2002-10-13 16:17:03 +04:00
|
|
|
|
|
|
|
source = gdk_pixmap_new(NULL, w, h, 1);
|
|
|
|
mask = gdk_pixmap_new(NULL, w, h, 1);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Draw the mask character on the mask pixmap.
|
|
|
|
*/
|
|
|
|
gc = gdk_gc_new(mask);
|
|
|
|
gdk_gc_set_foreground(gc, &dbg);
|
|
|
|
gdk_draw_rectangle(mask, gc, 1, 0, 0, w, h);
|
2002-10-14 13:58:27 +04:00
|
|
|
if (cursor_val >= 0) {
|
|
|
|
text[1] = '\0';
|
|
|
|
text[0] = (char)cursor_val + 1;
|
|
|
|
gdk_gc_set_foreground(gc, &dfg);
|
|
|
|
gdk_draw_text(mask, cursor_font, gc, x, y, text, 1);
|
|
|
|
}
|
2002-10-13 16:17:03 +04:00
|
|
|
gdk_gc_unref(gc);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Draw the main character on the source pixmap.
|
|
|
|
*/
|
|
|
|
gc = gdk_gc_new(source);
|
|
|
|
gdk_gc_set_foreground(gc, &dbg);
|
|
|
|
gdk_draw_rectangle(source, gc, 1, 0, 0, w, h);
|
2002-10-14 13:58:27 +04:00
|
|
|
if (cursor_val >= 0) {
|
|
|
|
text[1] = '\0';
|
|
|
|
text[0] = (char)cursor_val;
|
|
|
|
gdk_gc_set_foreground(gc, &dfg);
|
|
|
|
gdk_draw_text(source, cursor_font, gc, x, y, text, 1);
|
|
|
|
}
|
2002-10-13 16:17:03 +04:00
|
|
|
gdk_gc_unref(gc);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create the cursor.
|
|
|
|
*/
|
|
|
|
ret = gdk_cursor_new_from_pixmap(source, mask, &cfg, &cbg, x, y);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clean up.
|
|
|
|
*/
|
|
|
|
gdk_pixmap_unref(source);
|
|
|
|
gdk_pixmap_unref(mask);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2002-10-09 22:09:42 +04:00
|
|
|
void modalfatalbox(char *p, ...)
|
|
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
fprintf(stderr, "FATAL ERROR: ");
|
|
|
|
va_start(ap, p);
|
|
|
|
vfprintf(stderr, p, ap);
|
|
|
|
va_end(ap);
|
|
|
|
fputc('\n', stderr);
|
|
|
|
exit(1);
|
2002-10-07 20:45:23 +04:00
|
|
|
}
|
|
|
|
|
2003-03-31 16:10:53 +04:00
|
|
|
void cmdline_error(char *p, ...)
|
|
|
|
{
|
|
|
|
va_list ap;
|
2003-04-10 15:57:11 +04:00
|
|
|
fprintf(stderr, "%s: ", appname);
|
2003-03-31 16:10:53 +04:00
|
|
|
va_start(ap, p);
|
|
|
|
vfprintf(stderr, p, ap);
|
|
|
|
va_end(ap);
|
|
|
|
fputc('\n', stderr);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
char *get_x_display(void *frontend)
|
2002-10-15 16:29:52 +04:00
|
|
|
{
|
|
|
|
return gdk_get_display();
|
|
|
|
}
|
|
|
|
|
2003-03-06 15:57:37 +03:00
|
|
|
long get_windowid(void *frontend)
|
|
|
|
{
|
Rationalisation of the system of frontend handles. Most modular bits
of PuTTY (terminal, backend, logctx etc) take a `void *' handle
passed to them from the frontend, and used as a context for all
their callbacks. Most of these point at the frontend structure
itself (on platforms where this is meaningful), except that the
handle passed to the backend has always pointed at the terminal
because from_backend() was implemented in terminal.c. This has
finally bitten Unix PuTTY, because both backend and logctx have
been passing their respective and very different frontend handles to
logevent(), so I've fixed it.
from_backend() is now a function supplied by the _frontend_ itself,
in all cases, and the frontend handle passed to backends must be the
same as that passed to everything else. What was from_backend() in
terminal.c is now called term_data(), and the typical implementation
of from_backend() in a GUI frontend will just extract the terminal
handle from the frontend structure and delegate to that.
This appears to work on Unix and Windows, but has most likely broken
the Mac build.
[originally from svn r3100]
2003-04-11 22:36:27 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2003-03-06 15:57:37 +03:00
|
|
|
return (long)GDK_WINDOW_XWINDOW(inst->area->window);
|
|
|
|
}
|
|
|
|
|
2002-10-30 21:22:37 +03:00
|
|
|
static void help(FILE *fp) {
|
|
|
|
if(fprintf(fp,
|
|
|
|
"pterm option summary:\n"
|
|
|
|
"\n"
|
|
|
|
" --display DISPLAY Specify X display to use (note '--')\n"
|
|
|
|
" -name PREFIX Prefix when looking up resources (default: pterm)\n"
|
|
|
|
" -fn FONT Normal text font\n"
|
|
|
|
" -fb FONT Bold text font\n"
|
2003-04-08 17:49:12 +04:00
|
|
|
" -geometry GEOMETRY Position and size of window (size in characters)\n"
|
2002-10-30 21:22:37 +03:00
|
|
|
" -sl LINES Number of lines of scrollback\n"
|
|
|
|
" -fg COLOUR, -bg COLOUR Foreground/background colour\n"
|
|
|
|
" -bfg COLOUR, -bbg COLOUR Foreground/background bold colour\n"
|
|
|
|
" -cfg COLOUR, -bfg COLOUR Foreground/background cursor colour\n"
|
|
|
|
" -T TITLE Window title\n"
|
|
|
|
" -ut, +ut Do(default) or do not update utmp\n"
|
|
|
|
" -ls, +ls Do(default) or do not make shell a login shell\n"
|
|
|
|
" -sb, +sb Do(default) or do not display a scrollbar\n"
|
|
|
|
" -log PATH Log all output to a file\n"
|
|
|
|
" -nethack Map numeric keypad to hjklyubn direction keys\n"
|
|
|
|
" -xrm RESOURCE-STRING Set an X resource\n"
|
|
|
|
" -e COMMAND [ARGS...] Execute command (consumes all remaining args)\n"
|
|
|
|
) < 0 || fflush(fp) < 0) {
|
|
|
|
perror("output error");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-19 21:08:15 +04:00
|
|
|
static void version(FILE *fp) {
|
|
|
|
if(fprintf(fp, "%s: %s\n", appname, ver) < 0 || fflush(fp) < 0) {
|
|
|
|
perror("output error");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-02-25 03:50:24 +03:00
|
|
|
int do_cmdline(int argc, char **argv, int do_everything, int *allow_launch,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
struct gui_data *inst, Conf *conf)
|
2002-10-07 20:45:23 +04:00
|
|
|
{
|
2002-10-13 16:54:17 +04:00
|
|
|
int err = 0;
|
2003-04-12 21:37:15 +04:00
|
|
|
char *val;
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2002-10-16 18:32:06 +04:00
|
|
|
/*
|
2002-11-05 16:20:42 +03:00
|
|
|
* Macros to make argument handling easier. Note that because
|
|
|
|
* they need to call `continue', they cannot be contained in
|
|
|
|
* the usual do {...} while (0) wrapper to make them
|
|
|
|
* syntactically single statements; hence it is not legal to
|
|
|
|
* use one of these macros as an unbraced statement between
|
|
|
|
* `if' and `else'.
|
2002-10-16 18:32:06 +04:00
|
|
|
*/
|
2002-11-05 16:20:42 +03:00
|
|
|
#define EXPECTS_ARG { \
|
2002-10-16 18:32:06 +04:00
|
|
|
if (--argc <= 0) { \
|
|
|
|
err = 1; \
|
2003-04-10 15:57:11 +04:00
|
|
|
fprintf(stderr, "%s: %s expects an argument\n", appname, p); \
|
2002-11-05 16:20:42 +03:00
|
|
|
continue; \
|
2002-10-16 18:32:06 +04:00
|
|
|
} else \
|
|
|
|
val = *++argv; \
|
2002-11-05 16:20:42 +03:00
|
|
|
}
|
|
|
|
#define SECOND_PASS_ONLY { if (!do_everything) continue; }
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2002-10-13 16:54:17 +04:00
|
|
|
while (--argc > 0) {
|
|
|
|
char *p = *++argv;
|
2003-03-31 16:10:53 +04:00
|
|
|
int ret;
|
|
|
|
|
2003-05-06 23:55:00 +04:00
|
|
|
/*
|
|
|
|
* Shameless cheating. Debian requires all X terminal
|
|
|
|
* emulators to support `-T title'; but
|
|
|
|
* cmdline_process_param will eat -T (it means no-pty) and
|
|
|
|
* complain that pterm doesn't support it. So, in pterm
|
|
|
|
* only, we convert -T into -title.
|
|
|
|
*/
|
|
|
|
if ((cmdline_tooltype & TOOLTYPE_NONNETWORK) &&
|
|
|
|
!strcmp(p, "-T"))
|
|
|
|
p = "-title";
|
|
|
|
|
2003-03-31 16:10:53 +04:00
|
|
|
ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL),
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
do_everything ? 1 : -1, conf);
|
2003-03-31 16:10:53 +04:00
|
|
|
|
|
|
|
if (ret == -2) {
|
|
|
|
cmdline_error("option \"%s\" requires an argument", p);
|
|
|
|
} else if (ret == 2) {
|
|
|
|
--argc, ++argv; /* skip next argument */
|
|
|
|
continue;
|
|
|
|
} else if (ret == 1) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2002-10-16 20:00:38 +04:00
|
|
|
if (!strcmp(p, "-fn") || !strcmp(p, "-font")) {
|
2011-10-01 21:38:59 +04:00
|
|
|
FontSpec *fs;
|
2002-10-16 18:32:06 +04:00
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
2011-10-01 21:38:59 +04:00
|
|
|
fs = fontspec_new(val);
|
|
|
|
conf_set_fontspec(conf, CONF_font, fs);
|
|
|
|
fontspec_free(fs);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-fb")) {
|
2011-10-01 21:38:59 +04:00
|
|
|
FontSpec *fs;
|
2002-10-16 18:32:06 +04:00
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
2011-10-01 21:38:59 +04:00
|
|
|
fs = fontspec_new(val);
|
2011-10-01 22:00:49 +04:00
|
|
|
conf_set_fontspec(conf, CONF_boldfont, fs);
|
2011-10-01 21:38:59 +04:00
|
|
|
fontspec_free(fs);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2003-01-02 00:53:22 +03:00
|
|
|
} else if (!strcmp(p, "-fw")) {
|
2011-10-01 21:38:59 +04:00
|
|
|
FontSpec *fs;
|
2003-01-02 00:53:22 +03:00
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
2011-10-01 21:38:59 +04:00
|
|
|
fs = fontspec_new(val);
|
2011-10-01 22:00:49 +04:00
|
|
|
conf_set_fontspec(conf, CONF_widefont, fs);
|
2011-10-01 21:38:59 +04:00
|
|
|
fontspec_free(fs);
|
2003-01-02 00:53:22 +03:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-fwb")) {
|
2011-10-01 21:38:59 +04:00
|
|
|
FontSpec *fs;
|
2003-01-02 00:53:22 +03:00
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
2011-10-01 21:38:59 +04:00
|
|
|
fs = fontspec_new(val);
|
2011-10-01 22:00:49 +04:00
|
|
|
conf_set_fontspec(conf, CONF_wideboldfont, fs);
|
2011-10-01 21:38:59 +04:00
|
|
|
fontspec_free(fs);
|
2003-01-02 00:53:22 +03:00
|
|
|
|
2002-12-31 15:20:34 +03:00
|
|
|
} else if (!strcmp(p, "-cs")) {
|
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_str(conf, CONF_line_codepage, val);
|
2002-12-31 15:20:34 +03:00
|
|
|
|
2002-10-16 20:00:38 +04:00
|
|
|
} else if (!strcmp(p, "-geometry")) {
|
2006-12-31 02:00:14 +03:00
|
|
|
int flags, x, y;
|
|
|
|
unsigned int w, h;
|
2002-10-16 20:00:38 +04:00
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
|
|
|
|
|
|
|
flags = XParseGeometry(val, &x, &y, &w, &h);
|
|
|
|
if (flags & WidthValue)
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_width, w);
|
2002-10-16 20:00:38 +04:00
|
|
|
if (flags & HeightValue)
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_height, h);
|
2002-10-16 20:00:38 +04:00
|
|
|
|
2003-04-08 17:49:12 +04:00
|
|
|
if (flags & (XValue | YValue)) {
|
|
|
|
inst->xpos = x;
|
|
|
|
inst->ypos = y;
|
|
|
|
inst->gotpos = TRUE;
|
|
|
|
inst->gravity = ((flags & XNegative ? 1 : 0) |
|
|
|
|
(flags & YNegative ? 2 : 0));
|
|
|
|
}
|
2002-10-16 20:00:38 +04:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-sl")) {
|
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_savelines, atoi(val));
|
2002-10-16 20:00:38 +04:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-fg") || !strcmp(p, "-bg") ||
|
|
|
|
!strcmp(p, "-bfg") || !strcmp(p, "-bbg") ||
|
2003-01-12 18:36:05 +03:00
|
|
|
!strcmp(p, "-cfg") || !strcmp(p, "-cbg")) {
|
2002-10-16 20:00:38 +04:00
|
|
|
GdkColor col;
|
|
|
|
|
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
|
|
|
if (!gdk_color_parse(val, &col)) {
|
|
|
|
err = 1;
|
2003-04-10 15:57:11 +04:00
|
|
|
fprintf(stderr, "%s: unable to parse colour \"%s\"\n",
|
|
|
|
appname, val);
|
2002-10-16 20:00:38 +04:00
|
|
|
} else {
|
|
|
|
int index;
|
|
|
|
index = (!strcmp(p, "-fg") ? 0 :
|
|
|
|
!strcmp(p, "-bg") ? 2 :
|
|
|
|
!strcmp(p, "-bfg") ? 1 :
|
|
|
|
!strcmp(p, "-bbg") ? 3 :
|
2003-01-12 18:36:05 +03:00
|
|
|
!strcmp(p, "-cfg") ? 4 :
|
2002-10-16 20:00:38 +04:00
|
|
|
!strcmp(p, "-cbg") ? 5 : -1);
|
|
|
|
assert(index != -1);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int_int(conf, CONF_colours, index*3+0, col.red / 256);
|
|
|
|
conf_set_int_int(conf, CONF_colours, index*3+1,col.green/ 256);
|
|
|
|
conf_set_int_int(conf, CONF_colours, index*3+2, col.blue/ 256);
|
2002-10-16 20:00:38 +04:00
|
|
|
}
|
|
|
|
|
2003-03-29 22:52:50 +03:00
|
|
|
} else if (use_pty_argv && !strcmp(p, "-e")) {
|
2002-10-16 18:32:06 +04:00
|
|
|
/* This option swallows all further arguments. */
|
|
|
|
if (!do_everything)
|
|
|
|
break;
|
|
|
|
|
2002-10-13 16:54:17 +04:00
|
|
|
if (--argc > 0) {
|
|
|
|
int i;
|
2003-03-29 19:14:26 +03:00
|
|
|
pty_argv = snewn(argc+1, char *);
|
2002-10-13 16:54:17 +04:00
|
|
|
++argv;
|
|
|
|
for (i = 0; i < argc; i++)
|
|
|
|
pty_argv[i] = argv[i];
|
|
|
|
pty_argv[argc] = NULL;
|
|
|
|
break; /* finished command-line processing */
|
|
|
|
} else
|
2003-04-10 15:57:11 +04:00
|
|
|
err = 1, fprintf(stderr, "%s: -e expects an argument\n",
|
|
|
|
appname);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2003-04-08 18:02:34 +04:00
|
|
|
} else if (!strcmp(p, "-title")) {
|
2002-10-16 18:32:06 +04:00
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_str(conf, CONF_wintitle, val);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-log")) {
|
2011-10-02 15:01:57 +04:00
|
|
|
Filename *fn;
|
2002-10-16 18:32:06 +04:00
|
|
|
EXPECTS_ARG;
|
|
|
|
SECOND_PASS_ONLY;
|
2011-10-02 15:01:57 +04:00
|
|
|
fn = filename_from_str(val);
|
|
|
|
conf_set_filename(conf, CONF_logfilename, fn);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_logtype, LGTYP_DEBUG);
|
2011-10-02 15:01:57 +04:00
|
|
|
filename_free(fn);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2002-10-16 20:00:38 +04:00
|
|
|
} else if (!strcmp(p, "-ut-") || !strcmp(p, "+ut")) {
|
2002-10-16 18:32:06 +04:00
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_stamp_utmp, 0);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2002-10-16 20:00:38 +04:00
|
|
|
} else if (!strcmp(p, "-ut")) {
|
2002-10-16 18:32:06 +04:00
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_stamp_utmp, 1);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2002-10-16 20:00:38 +04:00
|
|
|
} else if (!strcmp(p, "-ls-") || !strcmp(p, "+ls")) {
|
2002-10-16 18:32:06 +04:00
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_login_shell, 0);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2002-10-16 20:00:38 +04:00
|
|
|
} else if (!strcmp(p, "-ls")) {
|
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_login_shell, 1);
|
2002-10-16 20:00:38 +04:00
|
|
|
|
2002-10-16 18:32:06 +04:00
|
|
|
} else if (!strcmp(p, "-nethack")) {
|
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_nethack_keypad, 1);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2002-10-16 20:00:38 +04:00
|
|
|
} else if (!strcmp(p, "-sb-") || !strcmp(p, "+sb")) {
|
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_scrollbar, 0);
|
2002-10-16 20:00:38 +04:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-sb")) {
|
2002-10-16 18:32:06 +04:00
|
|
|
SECOND_PASS_ONLY;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_set_int(conf, CONF_scrollbar, 1);
|
2002-10-16 18:32:06 +04:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-name")) {
|
|
|
|
EXPECTS_ARG;
|
|
|
|
app_name = val;
|
2002-10-17 02:54:58 +04:00
|
|
|
|
|
|
|
} else if (!strcmp(p, "-xrm")) {
|
|
|
|
EXPECTS_ARG;
|
|
|
|
provide_xrm_string(val);
|
|
|
|
|
2002-10-30 21:22:37 +03:00
|
|
|
} else if(!strcmp(p, "-help") || !strcmp(p, "--help")) {
|
|
|
|
help(stdout);
|
|
|
|
exit(0);
|
2005-03-19 05:26:58 +03:00
|
|
|
|
2012-09-19 21:08:15 +04:00
|
|
|
} else if(!strcmp(p, "-version") || !strcmp(p, "--version")) {
|
|
|
|
version(stdout);
|
|
|
|
exit(0);
|
|
|
|
|
2005-03-19 05:26:58 +03:00
|
|
|
} else if (!strcmp(p, "-pgpfp")) {
|
|
|
|
pgp_fingerprints();
|
|
|
|
exit(1);
|
|
|
|
|
2003-03-31 16:10:53 +04:00
|
|
|
} else if(p[0] != '-' && (!do_everything ||
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
process_nonoption_arg(p, conf,
|
2007-02-25 03:50:24 +03:00
|
|
|
allow_launch))) {
|
2003-03-31 16:10:53 +04:00
|
|
|
/* do nothing */
|
|
|
|
|
2002-10-18 19:26:54 +04:00
|
|
|
} else {
|
|
|
|
err = 1;
|
2003-04-10 15:57:11 +04:00
|
|
|
fprintf(stderr, "%s: unrecognized option '%s'\n", appname, p);
|
2002-10-15 18:55:19 +04:00
|
|
|
}
|
2002-10-13 16:54:17 +04:00
|
|
|
}
|
|
|
|
|
2002-10-16 18:32:06 +04:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2003-03-29 21:30:14 +03:00
|
|
|
int uxsel_input_add(int fd, int rwx) {
|
|
|
|
int flags = 0;
|
|
|
|
if (rwx & 1) flags |= GDK_INPUT_READ;
|
|
|
|
if (rwx & 2) flags |= GDK_INPUT_WRITE;
|
|
|
|
if (rwx & 4) flags |= GDK_INPUT_EXCEPTION;
|
2007-01-26 23:00:32 +03:00
|
|
|
assert(flags);
|
|
|
|
return gdk_input_add(fd, flags, fd_input_func, NULL);
|
2003-03-29 21:30:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void uxsel_input_remove(int id) {
|
2007-01-26 23:00:32 +03:00
|
|
|
gdk_input_remove(id);
|
2003-03-29 21:30:14 +03:00
|
|
|
}
|
|
|
|
|
2011-12-08 23:15:57 +04:00
|
|
|
int frontend_net_pending_error_idle_id;
|
|
|
|
int frontend_got_net_pending_errors = FALSE;
|
|
|
|
gboolean frontend_net_pending_errors(gpointer data)
|
|
|
|
{
|
|
|
|
net_pending_errors();
|
|
|
|
gtk_idle_remove(frontend_net_pending_error_idle_id);
|
|
|
|
frontend_got_net_pending_errors = FALSE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
void frontend_net_error_pending(void)
|
|
|
|
{
|
|
|
|
if (!frontend_got_net_pending_errors) {
|
|
|
|
frontend_got_net_pending_errors = TRUE;
|
|
|
|
frontend_net_pending_error_idle_id =
|
|
|
|
gtk_idle_add(frontend_net_pending_errors, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-14 01:59:10 +04:00
|
|
|
char *setup_fonts_ucs(struct gui_data *inst)
|
2003-04-10 22:00:50 +04:00
|
|
|
{
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int shadowbold = conf_get_int(inst->conf, CONF_shadowbold);
|
|
|
|
int shadowboldoffset = conf_get_int(inst->conf, CONF_shadowboldoffset);
|
|
|
|
FontSpec *fs;
|
2013-01-14 01:59:10 +04:00
|
|
|
unifont *fonts[4];
|
|
|
|
int i;
|
2003-04-10 22:00:50 +04:00
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
fs = conf_get_fontspec(inst->conf, CONF_font);
|
2013-01-14 01:59:10 +04:00
|
|
|
fonts[0] = multifont_create(inst->area, fs->name, FALSE, FALSE,
|
|
|
|
shadowboldoffset, shadowbold);
|
|
|
|
if (!fonts[0]) {
|
|
|
|
return dupprintf("unable to load font \"%s\"", fs->name);
|
2003-04-10 22:00:50 +04:00
|
|
|
}
|
2003-05-10 14:15:00 +04:00
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
fs = conf_get_fontspec(inst->conf, CONF_boldfont);
|
|
|
|
if (shadowbold || !fs->name[0]) {
|
2013-01-14 01:59:10 +04:00
|
|
|
fonts[1] = NULL;
|
2003-05-10 14:15:00 +04:00
|
|
|
} else {
|
2013-01-14 01:59:10 +04:00
|
|
|
fonts[1] = multifont_create(inst->area, fs->name, FALSE, TRUE,
|
|
|
|
shadowboldoffset, shadowbold);
|
|
|
|
if (!fonts[1]) {
|
|
|
|
if (fonts[0])
|
|
|
|
unifont_destroy(fonts[0]);
|
|
|
|
return dupprintf("unable to load bold font \"%s\"", fs->name);
|
2003-08-21 22:39:17 +04:00
|
|
|
}
|
2003-05-10 14:15:00 +04:00
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
fs = conf_get_fontspec(inst->conf, CONF_widefont);
|
|
|
|
if (fs->name[0]) {
|
2013-01-14 01:59:10 +04:00
|
|
|
fonts[2] = multifont_create(inst->area, fs->name, TRUE, FALSE,
|
|
|
|
shadowboldoffset, shadowbold);
|
|
|
|
if (!fonts[2]) {
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
if (fonts[i])
|
|
|
|
unifont_destroy(fonts[i]);
|
|
|
|
return dupprintf("%s: unable to load wide font \"%s\"", fs->name);
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
}
|
2003-05-10 14:15:00 +04:00
|
|
|
} else {
|
2013-01-14 01:59:10 +04:00
|
|
|
fonts[2] = NULL;
|
2003-05-10 14:15:00 +04:00
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
fs = conf_get_fontspec(inst->conf, CONF_wideboldfont);
|
|
|
|
if (shadowbold || !fs->name[0]) {
|
2013-01-14 01:59:10 +04:00
|
|
|
fonts[3] = NULL;
|
2003-05-10 14:15:00 +04:00
|
|
|
} else {
|
2013-01-14 01:59:10 +04:00
|
|
|
fonts[3] = multifont_create(inst->area, fs->name, TRUE, TRUE,
|
|
|
|
shadowboldoffset, shadowbold);
|
|
|
|
if (!fonts[3]) {
|
|
|
|
for (i = 0; i < 3; i++)
|
|
|
|
if (fonts[i])
|
|
|
|
unifont_destroy(fonts[i]);
|
|
|
|
return dupprintf("%s: unable to load wide bold font \"%s\"",
|
|
|
|
fs->name);
|
2003-08-21 22:39:17 +04:00
|
|
|
}
|
2003-05-10 14:15:00 +04:00
|
|
|
}
|
2003-04-10 22:00:50 +04:00
|
|
|
|
2013-01-14 01:59:10 +04:00
|
|
|
/*
|
|
|
|
* Now we've got past all the possible error conditions, we can
|
|
|
|
* actually update our state.
|
|
|
|
*/
|
|
|
|
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
|
if (inst->fonts[i])
|
|
|
|
unifont_destroy(inst->fonts[i]);
|
|
|
|
inst->fonts[i] = fonts[i];
|
|
|
|
}
|
|
|
|
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
inst->font_width = inst->fonts[0]->width;
|
|
|
|
inst->font_height = inst->fonts[0]->height;
|
2003-04-10 22:00:50 +04:00
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->direct_to_font = init_ucs(&inst->ucsdata,
|
|
|
|
conf_get_str(inst->conf, CONF_line_codepage),
|
|
|
|
conf_get_int(inst->conf, CONF_utf8_override),
|
Refactor the font handling code: I've moved all the code that
explicitly deals with GdkFont out into a new module, behind a
polymorphic interface (done by ad-hoc explicit vtable management in
C). This should allow me to drop in a Pango font handling module in
parallel with the existing one, meaning that GTK2 PuTTY will be able
to seamlessly switch between X11 server-side fonts and Pango client-
side ones as the user chooses, or even use a mixture of the two
(e.g. an X11 font for narrow characters and a Pango one for wide
characters, or vice versa).
In the process, incidentally, I got to the bottom of the `weird bug'
mentioned in the old do_text_internal(). It's not a bug in
gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a
32-bit type rather than a 16-bit one, so no wonder you have to
specify twice the length to find all the characters in the string!
However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes
it to strip off everything above the low byte of each GdkWChar,
sigh. Solution to both problems is to use an array of the underlying
Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to
gchar *. Grotty, but it works. (And it'll become significantly less
grotty if and when we have to stop using the GDK font handling
wrappers in favour of going direct to Xlib.)
[originally from svn r7933]
2008-03-22 14:40:23 +03:00
|
|
|
inst->fonts[0]->public_charset,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_get_int(inst->conf, CONF_vtmode));
|
2013-01-14 01:59:10 +04:00
|
|
|
|
|
|
|
return NULL;
|
2003-04-10 22:00:50 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void set_geom_hints(struct gui_data *inst)
|
|
|
|
{
|
|
|
|
GdkGeometry geom;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
geom.min_width = inst->font_width + 2*inst->window_border;
|
|
|
|
geom.min_height = inst->font_height + 2*inst->window_border;
|
2003-04-10 22:00:50 +04:00
|
|
|
geom.max_width = geom.max_height = -1;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
geom.base_width = 2*inst->window_border;
|
|
|
|
geom.base_height = 2*inst->window_border;
|
2003-04-10 22:00:50 +04:00
|
|
|
geom.width_inc = inst->font_width;
|
|
|
|
geom.height_inc = inst->font_height;
|
|
|
|
geom.min_aspect = geom.max_aspect = 0;
|
|
|
|
gtk_window_set_geometry_hints(GTK_WINDOW(inst->window), inst->area, &geom,
|
|
|
|
GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE |
|
|
|
|
GDK_HINT_RESIZE_INC);
|
|
|
|
}
|
|
|
|
|
2003-04-05 20:05:00 +04:00
|
|
|
void clear_scrollback_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
term_clrsb(inst->term);
|
|
|
|
}
|
|
|
|
|
|
|
|
void reset_terminal_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2006-02-19 17:59:48 +03:00
|
|
|
term_pwron(inst->term, TRUE);
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->ldisc)
|
|
|
|
ldisc_send(inst->ldisc, NULL, 0, 0);
|
2003-04-05 20:05:00 +04:00
|
|
|
}
|
|
|
|
|
2003-04-11 21:59:36 +04:00
|
|
|
void copy_all_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
term_copyall(inst->term);
|
|
|
|
}
|
|
|
|
|
2003-04-05 20:05:00 +04:00
|
|
|
void special_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2003-05-10 12:35:54 +04:00
|
|
|
int code = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(item),
|
|
|
|
"user-data"));
|
2003-04-05 20:05:00 +04:00
|
|
|
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->back)
|
|
|
|
inst->back->special(inst->backhandle, code);
|
2003-04-05 20:05:00 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void about_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
2003-04-10 12:53:43 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
about_box(inst->window);
|
2003-04-05 20:05:00 +04:00
|
|
|
}
|
|
|
|
|
2003-04-09 22:46:45 +04:00
|
|
|
void event_log_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
showeventlog(inst->eventlogstuff, inst->window);
|
|
|
|
}
|
|
|
|
|
2003-04-10 22:00:50 +04:00
|
|
|
void change_settings_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
/* This maps colour indices in inst->conf to those used in inst->cols. */
|
2003-04-10 22:00:50 +04:00
|
|
|
static const int ww[] = {
|
2004-11-28 18:13:34 +03:00
|
|
|
256, 257, 258, 259, 260, 261,
|
|
|
|
0, 8, 1, 9, 2, 10, 3, 11,
|
|
|
|
4, 12, 5, 13, 6, 14, 7, 15
|
2003-04-10 22:00:50 +04:00
|
|
|
};
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
2013-07-14 14:46:07 +04:00
|
|
|
char *title;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
Conf *oldconf, *newconf;
|
|
|
|
int i, j, need_size;
|
2003-04-10 22:00:50 +04:00
|
|
|
|
2004-11-28 18:13:34 +03:00
|
|
|
assert(lenof(ww) == NCFGCOLOURS);
|
|
|
|
|
2005-03-10 13:07:27 +03:00
|
|
|
if (inst->reconfiguring)
|
|
|
|
return;
|
|
|
|
else
|
|
|
|
inst->reconfiguring = TRUE;
|
|
|
|
|
2013-07-14 14:46:07 +04:00
|
|
|
title = dupcat(appname, " Reconfiguration", NULL);
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
oldconf = inst->conf;
|
|
|
|
newconf = conf_copy(inst->conf);
|
2003-04-10 22:00:50 +04:00
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (do_config_box(title, newconf, 1,
|
2004-12-29 15:32:25 +03:00
|
|
|
inst->back?inst->back->cfg_info(inst->backhandle):0)) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->conf = newconf;
|
2003-04-10 22:00:50 +04:00
|
|
|
|
|
|
|
/* Pass new config data to the logging module */
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
log_reconfig(inst->logctx, inst->conf);
|
2003-04-10 22:00:50 +04:00
|
|
|
/*
|
|
|
|
* Flush the line discipline's edit buffer in the case
|
|
|
|
* where local editing has just been disabled.
|
|
|
|
*/
|
2013-07-11 21:24:20 +04:00
|
|
|
if (inst->ldisc) {
|
|
|
|
ldisc_configure(inst->ldisc, inst->conf);
|
2004-08-14 17:04:18 +04:00
|
|
|
ldisc_send(inst->ldisc, NULL, 0, 0);
|
2013-07-11 21:24:20 +04:00
|
|
|
}
|
2003-04-10 22:00:50 +04:00
|
|
|
/* Pass new config data to the terminal */
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
term_reconfig(inst->term, inst->conf);
|
2003-04-10 22:00:50 +04:00
|
|
|
/* Pass new config data to the back end */
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->back)
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->back->reconfig(inst->backhandle, inst->conf);
|
|
|
|
|
|
|
|
cache_conf_values(inst);
|
2003-04-10 22:00:50 +04:00
|
|
|
|
|
|
|
/*
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
* Just setting inst->conf is sufficient to cause colour
|
2003-04-10 22:00:50 +04:00
|
|
|
* setting changes to appear on the next ESC]R palette
|
|
|
|
* reset. But we should also check whether any colour
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
* settings have been changed, and revert the ones that have
|
|
|
|
* to the new default, on the assumption that the user is
|
|
|
|
* most likely to want an immediate update.
|
2003-04-10 22:00:50 +04:00
|
|
|
*/
|
2004-11-28 18:13:34 +03:00
|
|
|
for (i = 0; i < NCFGCOLOURS; i++) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
for (j = 0; j < 3; j++)
|
|
|
|
if (conf_get_int_int(oldconf, CONF_colours, i*3+j) !=
|
|
|
|
conf_get_int_int(newconf, CONF_colours, i*3+j))
|
|
|
|
break;
|
|
|
|
if (j < 3) {
|
|
|
|
real_palette_set(inst, ww[i],
|
|
|
|
conf_get_int_int(newconf,CONF_colours,i*3+0),
|
|
|
|
conf_get_int_int(newconf,CONF_colours,i*3+1),
|
|
|
|
conf_get_int_int(newconf,CONF_colours,i*3+2));
|
2003-05-13 22:14:14 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If the default background has changed, we must
|
|
|
|
* repaint the space in between the window border
|
|
|
|
* and the text area.
|
|
|
|
*/
|
2013-07-14 14:45:48 +04:00
|
|
|
if (ww[i] == 258) {
|
2003-05-13 22:14:14 +04:00
|
|
|
set_window_background(inst);
|
|
|
|
draw_backing_rect(inst);
|
|
|
|
}
|
|
|
|
}
|
2003-04-10 22:00:50 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If the scrollbar needs to be shown, hidden, or moved
|
|
|
|
* from one end to the other of the window, do so now.
|
|
|
|
*/
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(oldconf, CONF_scrollbar) !=
|
|
|
|
conf_get_int(newconf, CONF_scrollbar)) {
|
|
|
|
if (conf_get_int(newconf, CONF_scrollbar))
|
2003-04-10 22:00:50 +04:00
|
|
|
gtk_widget_show(inst->sbar);
|
|
|
|
else
|
|
|
|
gtk_widget_hide(inst->sbar);
|
|
|
|
}
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(oldconf, CONF_scrollbar_on_left) !=
|
|
|
|
conf_get_int(newconf, CONF_scrollbar_on_left)) {
|
2003-04-10 22:00:50 +04:00
|
|
|
gtk_box_reorder_child(inst->hbox, inst->sbar,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_get_int(newconf, CONF_scrollbar_on_left)
|
|
|
|
? 0 : 1);
|
2003-04-10 22:00:50 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Change the window title, if required.
|
|
|
|
*/
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (strcmp(conf_get_str(oldconf, CONF_wintitle),
|
|
|
|
conf_get_str(newconf, CONF_wintitle)))
|
2011-08-19 18:55:24 +04:00
|
|
|
set_title(inst, conf_get_str(newconf, CONF_wintitle));
|
2003-04-26 17:55:47 +04:00
|
|
|
set_window_titles(inst);
|
2003-04-10 22:00:50 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Redo the whole tangled fonts and Unicode mess if
|
|
|
|
* necessary.
|
|
|
|
*/
|
2013-01-14 01:59:10 +04:00
|
|
|
need_size = FALSE;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (strcmp(conf_get_fontspec(oldconf, CONF_font)->name,
|
|
|
|
conf_get_fontspec(newconf, CONF_font)->name) ||
|
|
|
|
strcmp(conf_get_fontspec(oldconf, CONF_boldfont)->name,
|
|
|
|
conf_get_fontspec(newconf, CONF_boldfont)->name) ||
|
|
|
|
strcmp(conf_get_fontspec(oldconf, CONF_widefont)->name,
|
|
|
|
conf_get_fontspec(newconf, CONF_widefont)->name) ||
|
|
|
|
strcmp(conf_get_fontspec(oldconf, CONF_wideboldfont)->name,
|
|
|
|
conf_get_fontspec(newconf, CONF_wideboldfont)->name) ||
|
|
|
|
strcmp(conf_get_str(oldconf, CONF_line_codepage),
|
|
|
|
conf_get_str(newconf, CONF_line_codepage)) ||
|
2012-04-22 18:22:08 +04:00
|
|
|
conf_get_int(oldconf, CONF_utf8_override) !=
|
|
|
|
conf_get_int(newconf, CONF_utf8_override) ||
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_get_int(oldconf, CONF_vtmode) !=
|
|
|
|
conf_get_int(newconf, CONF_vtmode) ||
|
|
|
|
conf_get_int(oldconf, CONF_shadowbold) !=
|
|
|
|
conf_get_int(newconf, CONF_shadowbold) ||
|
|
|
|
conf_get_int(oldconf, CONF_shadowboldoffset) !=
|
|
|
|
conf_get_int(newconf, CONF_shadowboldoffset)) {
|
2013-01-14 01:59:10 +04:00
|
|
|
char *errmsg = setup_fonts_ucs(inst);
|
|
|
|
if (errmsg) {
|
|
|
|
char *msgboxtext =
|
|
|
|
dupprintf("Could not change fonts in terminal window: %s\n",
|
|
|
|
errmsg);
|
|
|
|
messagebox(inst->window, "Font setup error", msgboxtext,
|
|
|
|
string_width("Could not change fonts in terminal window:"),
|
|
|
|
"OK", 'o', +1, 1,
|
|
|
|
NULL);
|
2013-07-14 14:46:07 +04:00
|
|
|
sfree(msgboxtext);
|
2013-01-14 01:59:10 +04:00
|
|
|
sfree(errmsg);
|
|
|
|
} else {
|
|
|
|
need_size = TRUE;
|
|
|
|
}
|
|
|
|
}
|
2003-04-10 22:00:50 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Resize the window.
|
|
|
|
*/
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(oldconf, CONF_width) !=
|
|
|
|
conf_get_int(newconf, CONF_width) ||
|
|
|
|
conf_get_int(oldconf, CONF_height) !=
|
|
|
|
conf_get_int(newconf, CONF_height) ||
|
|
|
|
conf_get_int(oldconf, CONF_window_border) !=
|
|
|
|
conf_get_int(newconf, CONF_window_border) ||
|
|
|
|
need_size) {
|
2003-04-10 22:00:50 +04:00
|
|
|
set_geom_hints(inst);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
request_resize(inst, conf_get_int(newconf, CONF_width),
|
|
|
|
conf_get_int(newconf, CONF_height));
|
2003-04-12 14:44:14 +04:00
|
|
|
} else {
|
|
|
|
/*
|
|
|
|
* The above will have caused a call to term_size() for
|
|
|
|
* us if it happened. If the user has fiddled with only
|
|
|
|
* the scrollback size, the above will not have
|
|
|
|
* happened and we will need an explicit term_size()
|
|
|
|
* here.
|
|
|
|
*/
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(oldconf, CONF_savelines) !=
|
|
|
|
conf_get_int(newconf, CONF_savelines))
|
2003-04-12 14:44:14 +04:00
|
|
|
term_size(inst->term, inst->term->rows, inst->term->cols,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_get_int(newconf, CONF_savelines));
|
2003-04-12 14:44:14 +04:00
|
|
|
}
|
2003-04-10 22:00:50 +04:00
|
|
|
|
|
|
|
term_invalidate(inst->term);
|
2003-05-13 22:14:14 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* We do an explicit full redraw here to ensure the window
|
|
|
|
* border has been redrawn as well as the text area.
|
|
|
|
*/
|
|
|
|
gtk_widget_queue_draw(inst->area);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
|
|
|
|
conf_free(oldconf);
|
|
|
|
} else {
|
|
|
|
conf_free(newconf);
|
2003-04-10 22:00:50 +04:00
|
|
|
}
|
|
|
|
sfree(title);
|
2005-03-10 13:07:27 +03:00
|
|
|
inst->reconfiguring = FALSE;
|
2003-04-10 22:00:50 +04:00
|
|
|
}
|
|
|
|
|
2003-04-12 21:37:15 +04:00
|
|
|
void fork_and_exec_self(struct gui_data *inst, int fd_to_close, ...)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Re-execing ourself is not an exact science under Unix. I do
|
|
|
|
* the best I can by using /proc/self/exe if available and by
|
|
|
|
* assuming argv[0] can be found on $PATH if not.
|
|
|
|
*
|
|
|
|
* Note that we also have to reconstruct the elements of the
|
|
|
|
* original argv which gtk swallowed, since the user wants the
|
|
|
|
* new session to appear on the same X display as the old one.
|
|
|
|
*/
|
|
|
|
char **args;
|
|
|
|
va_list ap;
|
|
|
|
int i, n;
|
|
|
|
int pid;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Collect the arguments with which to re-exec ourself.
|
|
|
|
*/
|
|
|
|
va_start(ap, fd_to_close);
|
|
|
|
n = 2; /* progname and terminating NULL */
|
|
|
|
n += inst->ngtkargs;
|
|
|
|
while (va_arg(ap, char *) != NULL)
|
|
|
|
n++;
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
args = snewn(n, char *);
|
|
|
|
args[0] = inst->progname;
|
|
|
|
args[n-1] = NULL;
|
|
|
|
for (i = 0; i < inst->ngtkargs; i++)
|
|
|
|
args[i+1] = inst->gtkargvstart[i];
|
|
|
|
|
|
|
|
i++;
|
|
|
|
va_start(ap, fd_to_close);
|
|
|
|
while ((args[i++] = va_arg(ap, char *)) != NULL);
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
assert(i == n);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Do the double fork.
|
|
|
|
*/
|
|
|
|
pid = fork();
|
|
|
|
if (pid < 0) {
|
|
|
|
perror("fork");
|
2013-07-14 14:46:07 +04:00
|
|
|
sfree(args);
|
2003-04-12 21:37:15 +04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pid == 0) {
|
|
|
|
int pid2 = fork();
|
|
|
|
if (pid2 < 0) {
|
|
|
|
perror("fork");
|
|
|
|
_exit(1);
|
|
|
|
} else if (pid2 > 0) {
|
|
|
|
/*
|
|
|
|
* First child has successfully forked second child. My
|
|
|
|
* Work Here Is Done. Note the use of _exit rather than
|
|
|
|
* exit: the latter appears to cause destroy messages
|
|
|
|
* to be sent to the X server. I suspect gtk uses
|
|
|
|
* atexit.
|
|
|
|
*/
|
|
|
|
_exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If we reach here, we are the second child, so we now
|
|
|
|
* actually perform the exec.
|
|
|
|
*/
|
|
|
|
if (fd_to_close >= 0)
|
|
|
|
close(fd_to_close);
|
|
|
|
|
|
|
|
execv("/proc/self/exe", args);
|
|
|
|
execvp(inst->progname, args);
|
|
|
|
perror("exec");
|
|
|
|
_exit(127);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
int status;
|
2013-07-14 14:46:07 +04:00
|
|
|
sfree(args);
|
2003-04-12 21:37:15 +04:00
|
|
|
waitpid(pid, &status, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void dup_session_menuitem(GtkMenuItem *item, gpointer gdata)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)gdata;
|
|
|
|
/*
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
* For this feature we must marshal conf and (possibly) pty_argv
|
2003-04-12 21:37:15 +04:00
|
|
|
* into a byte stream, create a pipe, and send this byte stream
|
|
|
|
* to the child through the pipe.
|
|
|
|
*/
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int i, ret, sersize, size;
|
2003-04-12 21:37:15 +04:00
|
|
|
char *data;
|
|
|
|
char option[80];
|
|
|
|
int pipefd[2];
|
|
|
|
|
|
|
|
if (pipe(pipefd) < 0) {
|
|
|
|
perror("pipe");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
size = sersize = conf_serialised_size(inst->conf);
|
2003-04-12 21:37:15 +04:00
|
|
|
if (use_pty_argv && pty_argv) {
|
|
|
|
for (i = 0; pty_argv[i]; i++)
|
|
|
|
size += strlen(pty_argv[i]) + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
data = snewn(size, char);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_serialise(inst->conf, data);
|
2003-04-12 21:37:15 +04:00
|
|
|
if (use_pty_argv && pty_argv) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int p = sersize;
|
2003-04-12 21:37:15 +04:00
|
|
|
for (i = 0; pty_argv[i]; i++) {
|
|
|
|
strcpy(data + p, pty_argv[i]);
|
|
|
|
p += strlen(pty_argv[i]) + 1;
|
|
|
|
}
|
|
|
|
assert(p == size);
|
|
|
|
}
|
|
|
|
|
|
|
|
sprintf(option, "---[%d,%d]", pipefd[0], size);
|
2013-07-19 22:10:02 +04:00
|
|
|
noncloexec(pipefd[0]);
|
2003-04-12 21:37:15 +04:00
|
|
|
fork_and_exec_self(inst, pipefd[1], option, NULL);
|
|
|
|
close(pipefd[0]);
|
|
|
|
|
2003-04-23 17:48:09 +04:00
|
|
|
i = ret = 0;
|
2003-04-12 21:37:15 +04:00
|
|
|
while (i < size && (ret = write(pipefd[1], data + i, size - i)) > 0)
|
|
|
|
i += ret;
|
|
|
|
if (ret < 0)
|
|
|
|
perror("write to pipe");
|
|
|
|
close(pipefd[1]);
|
|
|
|
sfree(data);
|
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int read_dupsession_data(struct gui_data *inst, Conf *conf, char *arg)
|
2003-04-12 21:37:15 +04:00
|
|
|
{
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
int fd, i, ret, size, size_used;
|
2003-04-12 21:37:15 +04:00
|
|
|
char *data;
|
|
|
|
|
|
|
|
if (sscanf(arg, "---[%d,%d]", &fd, &size) != 2) {
|
|
|
|
fprintf(stderr, "%s: malformed magic argument `%s'\n", appname, arg);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
data = snewn(size, char);
|
2003-04-23 17:48:09 +04:00
|
|
|
i = ret = 0;
|
2003-04-12 21:37:15 +04:00
|
|
|
while (i < size && (ret = read(fd, data + i, size - i)) > 0)
|
|
|
|
i += ret;
|
|
|
|
if (ret < 0) {
|
|
|
|
perror("read from pipe");
|
|
|
|
exit(1);
|
|
|
|
} else if (i < size) {
|
|
|
|
fprintf(stderr, "%s: unexpected EOF in Duplicate Session data\n",
|
|
|
|
appname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
size_used = conf_deserialise(conf, data, size);
|
2013-07-14 14:46:07 +04:00
|
|
|
sfree(data);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (use_pty_argv && size > size_used) {
|
2003-04-12 21:37:15 +04:00
|
|
|
int n = 0;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
i = size_used;
|
2003-04-12 21:37:15 +04:00
|
|
|
while (i < size) {
|
|
|
|
while (i < size && data[i]) i++;
|
|
|
|
if (i >= size) {
|
|
|
|
fprintf(stderr, "%s: malformed Duplicate Session data\n",
|
|
|
|
appname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
i++;
|
|
|
|
n++;
|
|
|
|
}
|
|
|
|
pty_argv = snewn(n+1, char *);
|
|
|
|
pty_argv[n] = NULL;
|
|
|
|
n = 0;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
i = size_used;
|
2003-04-12 21:37:15 +04:00
|
|
|
while (i < size) {
|
|
|
|
char *p = data + i;
|
|
|
|
while (i < size && data[i]) i++;
|
|
|
|
assert(i < size);
|
|
|
|
i++;
|
|
|
|
pty_argv[n++] = dupstr(p);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void new_session_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
|
|
|
|
fork_and_exec_self(inst, -1, NULL);
|
|
|
|
}
|
|
|
|
|
2004-08-14 17:04:18 +04:00
|
|
|
void restart_session_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
|
|
|
|
if (!inst->back) {
|
|
|
|
logevent(inst, "----- Session restarted -----");
|
2006-02-19 17:59:48 +03:00
|
|
|
term_pwron(inst->term, FALSE);
|
2004-08-14 17:04:18 +04:00
|
|
|
start_backend(inst);
|
|
|
|
inst->exited = FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-04-12 21:37:15 +04:00
|
|
|
void saved_session_menuitem(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
char *str = (char *)gtk_object_get_data(GTK_OBJECT(item), "user-data");
|
|
|
|
|
|
|
|
fork_and_exec_self(inst, -1, "-load", str, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
void saved_session_freedata(GtkMenuItem *item, gpointer data)
|
|
|
|
{
|
|
|
|
char *str = (char *)gtk_object_get_data(GTK_OBJECT(item), "user-data");
|
|
|
|
|
|
|
|
sfree(str);
|
|
|
|
}
|
|
|
|
|
2005-04-07 05:36:28 +04:00
|
|
|
static void update_savedsess_menu(GtkMenuItem *menuitem, gpointer data)
|
|
|
|
{
|
|
|
|
struct gui_data *inst = (struct gui_data *)data;
|
|
|
|
struct sesslist sesslist;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
gtk_container_foreach(GTK_CONTAINER(inst->sessionsmenu),
|
|
|
|
(GtkCallback)gtk_widget_destroy, NULL);
|
|
|
|
|
|
|
|
get_sesslist(&sesslist, TRUE);
|
2009-09-14 03:29:11 +04:00
|
|
|
/* skip sesslist.sessions[0] == Default Settings */
|
2005-04-07 05:36:28 +04:00
|
|
|
for (i = 1; i < sesslist.nsessions; i++) {
|
|
|
|
GtkWidget *menuitem =
|
|
|
|
gtk_menu_item_new_with_label(sesslist.sessions[i]);
|
|
|
|
gtk_container_add(GTK_CONTAINER(inst->sessionsmenu), menuitem);
|
|
|
|
gtk_widget_show(menuitem);
|
|
|
|
gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
|
|
|
|
dupstr(sesslist.sessions[i]));
|
|
|
|
gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
|
|
|
|
GTK_SIGNAL_FUNC(saved_session_menuitem),
|
|
|
|
inst);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(menuitem), "destroy",
|
|
|
|
GTK_SIGNAL_FUNC(saved_session_freedata),
|
|
|
|
inst);
|
|
|
|
}
|
2009-09-14 03:29:11 +04:00
|
|
|
if (sesslist.nsessions <= 1) {
|
|
|
|
GtkWidget *menuitem =
|
|
|
|
gtk_menu_item_new_with_label("(No sessions)");
|
|
|
|
gtk_widget_set_sensitive(menuitem, FALSE);
|
|
|
|
gtk_container_add(GTK_CONTAINER(inst->sessionsmenu), menuitem);
|
|
|
|
gtk_widget_show(menuitem);
|
|
|
|
}
|
2005-04-07 05:36:28 +04:00
|
|
|
get_sesslist(&sesslist, FALSE); /* free up */
|
|
|
|
}
|
|
|
|
|
2007-01-06 21:27:00 +03:00
|
|
|
void set_window_icon(GtkWidget *window, const char *const *const *icon,
|
|
|
|
int n_icon)
|
|
|
|
{
|
|
|
|
GdkPixmap *iconpm;
|
2007-01-31 15:30:48 +03:00
|
|
|
GdkBitmap *iconmask;
|
2007-01-06 21:27:00 +03:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
GList *iconlist;
|
|
|
|
int n;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (!n_icon)
|
|
|
|
return;
|
|
|
|
|
|
|
|
gtk_widget_realize(window);
|
2007-01-31 15:30:48 +03:00
|
|
|
iconpm = gdk_pixmap_create_from_xpm_d(window->window, &iconmask,
|
2007-01-06 21:27:00 +03:00
|
|
|
NULL, (gchar **)icon[0]);
|
2007-01-31 15:30:48 +03:00
|
|
|
gdk_window_set_icon(window->window, NULL, iconpm, iconmask);
|
2007-01-06 21:27:00 +03:00
|
|
|
|
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
iconlist = NULL;
|
|
|
|
for (n = 0; n < n_icon; n++) {
|
|
|
|
iconlist =
|
|
|
|
g_list_append(iconlist,
|
|
|
|
gdk_pixbuf_new_from_xpm_data((const gchar **)
|
|
|
|
icon[n]));
|
|
|
|
}
|
|
|
|
gdk_window_set_icon_list(window->window, iconlist);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2003-04-05 20:05:00 +04:00
|
|
|
void update_specials_menu(void *frontend)
|
|
|
|
{
|
Rationalisation of the system of frontend handles. Most modular bits
of PuTTY (terminal, backend, logctx etc) take a `void *' handle
passed to them from the frontend, and used as a context for all
their callbacks. Most of these point at the frontend structure
itself (on platforms where this is meaningful), except that the
handle passed to the backend has always pointed at the terminal
because from_backend() was implemented in terminal.c. This has
finally bitten Unix PuTTY, because both backend and logctx have
been passing their respective and very different frontend handles to
logevent(), so I've fixed it.
from_backend() is now a function supplied by the _frontend_ itself,
in all cases, and the frontend handle passed to backends must be the
same as that passed to everything else. What was from_backend() in
terminal.c is now called term_data(), and the typical implementation
of from_backend() in a GUI frontend will just extract the terminal
handle from the frontend structure and delegate to that.
This appears to work on Unix and Windows, but has most likely broken
the Mac build.
[originally from svn r3100]
2003-04-11 22:36:27 +04:00
|
|
|
struct gui_data *inst = (struct gui_data *)frontend;
|
2003-04-05 20:05:00 +04:00
|
|
|
|
|
|
|
const struct telnet_special *specials;
|
|
|
|
|
2004-08-14 17:04:18 +04:00
|
|
|
if (inst->back)
|
|
|
|
specials = inst->back->get_specials(inst->backhandle);
|
|
|
|
else
|
|
|
|
specials = NULL;
|
|
|
|
|
2004-10-18 01:22:22 +04:00
|
|
|
/* I believe this disposes of submenus too. */
|
2003-04-05 20:05:00 +04:00
|
|
|
gtk_container_foreach(GTK_CONTAINER(inst->specialsmenu),
|
|
|
|
(GtkCallback)gtk_widget_destroy, NULL);
|
|
|
|
if (specials) {
|
|
|
|
int i;
|
2004-10-18 01:22:22 +04:00
|
|
|
GtkWidget *menu = inst->specialsmenu;
|
|
|
|
/* A lame "stack" for submenus that will do for now. */
|
|
|
|
GtkWidget *saved_menu = NULL;
|
|
|
|
int nesting = 1;
|
|
|
|
for (i = 0; nesting > 0; i++) {
|
|
|
|
GtkWidget *menuitem = NULL;
|
|
|
|
switch (specials[i].code) {
|
|
|
|
case TS_SUBMENU:
|
|
|
|
assert (nesting < 2);
|
|
|
|
saved_menu = menu; /* XXX lame stacking */
|
|
|
|
menu = gtk_menu_new();
|
|
|
|
menuitem = gtk_menu_item_new_with_label(specials[i].name);
|
|
|
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
|
|
|
|
gtk_container_add(GTK_CONTAINER(saved_menu), menuitem);
|
|
|
|
gtk_widget_show(menuitem);
|
|
|
|
menuitem = NULL;
|
|
|
|
nesting++;
|
|
|
|
break;
|
|
|
|
case TS_EXITMENU:
|
|
|
|
nesting--;
|
|
|
|
if (nesting) {
|
|
|
|
menu = saved_menu; /* XXX lame stacking */
|
|
|
|
saved_menu = NULL;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case TS_SEP:
|
|
|
|
menuitem = gtk_menu_item_new();
|
|
|
|
break;
|
|
|
|
default:
|
2003-04-05 20:05:00 +04:00
|
|
|
menuitem = gtk_menu_item_new_with_label(specials[i].name);
|
|
|
|
gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
|
2003-05-10 12:35:54 +04:00
|
|
|
GINT_TO_POINTER(specials[i].code));
|
2003-04-05 20:05:00 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
|
|
|
|
GTK_SIGNAL_FUNC(special_menuitem), inst);
|
2004-10-18 01:22:22 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (menuitem) {
|
|
|
|
gtk_container_add(GTK_CONTAINER(menu), menuitem);
|
|
|
|
gtk_widget_show(menuitem);
|
|
|
|
}
|
2003-04-05 20:05:00 +04:00
|
|
|
}
|
|
|
|
gtk_widget_show(inst->specialsitem1);
|
|
|
|
gtk_widget_show(inst->specialsitem2);
|
|
|
|
} else {
|
|
|
|
gtk_widget_hide(inst->specialsitem1);
|
|
|
|
gtk_widget_hide(inst->specialsitem2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-08-14 17:04:18 +04:00
|
|
|
static void start_backend(struct gui_data *inst)
|
2002-10-16 18:32:06 +04:00
|
|
|
{
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
extern Backend *select_backend(Conf *conf);
|
2004-08-14 17:04:18 +04:00
|
|
|
char *realhost;
|
|
|
|
const char *error;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
char *s;
|
2004-08-14 17:04:18 +04:00
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->back = select_backend(inst->conf);
|
2004-08-14 17:04:18 +04:00
|
|
|
|
|
|
|
error = inst->back->init((void *)inst, &inst->backhandle,
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->conf,
|
|
|
|
conf_get_str(inst->conf, CONF_host),
|
|
|
|
conf_get_int(inst->conf, CONF_port),
|
|
|
|
&realhost,
|
|
|
|
conf_get_int(inst->conf, CONF_tcp_nodelay),
|
|
|
|
conf_get_int(inst->conf, CONF_tcp_keepalives));
|
2004-08-14 17:04:18 +04:00
|
|
|
|
|
|
|
if (error) {
|
|
|
|
char *msg = dupprintf("Unable to open connection to %s:\n%s",
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
conf_get_str(inst->conf, CONF_host), error);
|
2004-08-14 17:04:18 +04:00
|
|
|
inst->exited = TRUE;
|
|
|
|
fatal_message_box(inst->window, msg);
|
|
|
|
sfree(msg);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
s = conf_get_str(inst->conf, CONF_wintitle);
|
|
|
|
if (s[0]) {
|
|
|
|
set_title_and_icon(inst, s, s);
|
2004-08-14 17:04:18 +04:00
|
|
|
} else {
|
|
|
|
char *title = make_default_wintitle(realhost);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
set_title_and_icon(inst, title, title);
|
2004-08-14 17:04:18 +04:00
|
|
|
sfree(title);
|
|
|
|
}
|
2006-03-15 01:01:27 +03:00
|
|
|
sfree(realhost);
|
|
|
|
|
2004-08-14 17:04:18 +04:00
|
|
|
inst->back->provide_logctx(inst->backhandle, inst->logctx);
|
|
|
|
|
|
|
|
term_provide_resize_fn(inst->term, inst->back->size, inst->backhandle);
|
|
|
|
|
|
|
|
inst->ldisc =
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
ldisc_create(inst->conf, inst->term, inst->back, inst->backhandle,
|
2004-08-14 17:04:18 +04:00
|
|
|
inst);
|
|
|
|
|
2009-09-14 03:41:55 +04:00
|
|
|
gtk_widget_set_sensitive(inst->restartitem, FALSE);
|
2004-08-14 17:04:18 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
int pt_main(int argc, char **argv)
|
|
|
|
{
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
extern int cfgbox(Conf *conf);
|
2002-10-26 16:58:13 +04:00
|
|
|
struct gui_data *inst;
|
2002-10-16 18:32:06 +04:00
|
|
|
|
2012-06-17 11:26:23 +04:00
|
|
|
setlocale(LC_CTYPE, "");
|
|
|
|
|
2003-04-12 21:37:15 +04:00
|
|
|
/*
|
|
|
|
* Create an instance structure and initialise to zeroes
|
|
|
|
*/
|
|
|
|
inst = snew(struct gui_data);
|
|
|
|
memset(inst, 0, sizeof(*inst));
|
|
|
|
inst->alt_keycode = -1; /* this one needs _not_ to be zero */
|
2005-02-15 20:05:58 +03:00
|
|
|
inst->busy_status = BUSY_NOT;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->conf = conf_new();
|
|
|
|
inst->wintitle = inst->icontitle = NULL;
|
2003-04-12 21:37:15 +04:00
|
|
|
|
2002-11-02 17:35:57 +03:00
|
|
|
/* defer any child exit handling until we're ready to deal with
|
|
|
|
* it */
|
|
|
|
block_signal(SIGCHLD, 1);
|
|
|
|
|
2003-04-12 21:37:15 +04:00
|
|
|
inst->progname = argv[0];
|
2002-10-25 15:58:59 +04:00
|
|
|
/*
|
2003-04-12 21:37:15 +04:00
|
|
|
* Copy the original argv before letting gtk_init fiddle with
|
|
|
|
* it. It will be required later.
|
2002-10-25 15:58:59 +04:00
|
|
|
*/
|
2003-04-12 21:37:15 +04:00
|
|
|
{
|
|
|
|
int i, oldargc;
|
|
|
|
inst->gtkargvstart = snewn(argc-1, char *);
|
|
|
|
for (i = 1; i < argc; i++)
|
|
|
|
inst->gtkargvstart[i-1] = dupstr(argv[i]);
|
|
|
|
oldargc = argc;
|
|
|
|
gtk_init(&argc, &argv);
|
|
|
|
inst->ngtkargs = oldargc - argc;
|
|
|
|
}
|
2002-10-25 15:58:59 +04:00
|
|
|
|
2003-04-12 21:37:15 +04:00
|
|
|
if (argc > 1 && !strncmp(argv[1], "---", 3)) {
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
read_dupsession_data(inst, inst->conf, argv[1]);
|
2003-04-12 21:37:15 +04:00
|
|
|
/* Splatter this argument so it doesn't clutter a ps listing */
|
2012-07-22 23:51:50 +04:00
|
|
|
smemclr(argv[1], strlen(argv[1]));
|
2003-04-12 21:37:15 +04:00
|
|
|
} else {
|
2007-02-25 03:50:24 +03:00
|
|
|
/* By default, we bring up the config dialog, rather than launching
|
|
|
|
* a session. This gets set to TRUE if something happens to change
|
|
|
|
* that (e.g., a hostname is specified on the command-line). */
|
|
|
|
int allow_launch = FALSE;
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (do_cmdline(argc, argv, 0, &allow_launch, inst, inst->conf))
|
2003-04-12 21:37:15 +04:00
|
|
|
exit(1); /* pre-defaults pass to get -class */
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
do_defaults(NULL, inst->conf);
|
|
|
|
if (do_cmdline(argc, argv, 1, &allow_launch, inst, inst->conf))
|
2003-04-12 21:37:15 +04:00
|
|
|
exit(1); /* post-defaults, do everything */
|
2003-01-12 18:45:29 +03:00
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
cmdline_run_saved(inst->conf);
|
2003-03-31 16:10:53 +04:00
|
|
|
|
2007-02-25 03:50:24 +03:00
|
|
|
if (loaded_session)
|
|
|
|
allow_launch = TRUE;
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if ((!allow_launch || !conf_launchable(inst->conf)) &&
|
|
|
|
!cfgbox(inst->conf))
|
2003-04-12 21:37:15 +04:00
|
|
|
exit(0); /* config box hit Cancel */
|
|
|
|
}
|
2003-03-29 22:52:50 +03:00
|
|
|
|
2003-04-11 21:40:52 +04:00
|
|
|
if (!compound_text_atom)
|
|
|
|
compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE);
|
|
|
|
if (!utf8_string_atom)
|
|
|
|
utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
|
2002-10-14 03:48:31 +04:00
|
|
|
|
2008-03-22 21:11:17 +03:00
|
|
|
inst->area = gtk_drawing_area_new();
|
|
|
|
|
2012-06-17 11:26:23 +04:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
inst->imc = gtk_im_multicontext_new();
|
|
|
|
#endif
|
|
|
|
|
2013-01-14 01:59:10 +04:00
|
|
|
{
|
|
|
|
char *errmsg = setup_fonts_ucs(inst);
|
|
|
|
if (errmsg) {
|
|
|
|
fprintf(stderr, "%s: %s\n", appname, errmsg);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
2003-08-21 22:07:27 +04:00
|
|
|
init_cutbuffers();
|
2002-10-09 22:09:42 +04:00
|
|
|
|
2002-10-14 04:05:37 +04:00
|
|
|
inst->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
{
|
|
|
|
const char *winclass = conf_get_str(inst->conf, CONF_winclass);
|
|
|
|
if (*winclass)
|
|
|
|
gtk_window_set_wmclass(GTK_WINDOW(inst->window),
|
|
|
|
winclass, winclass);
|
|
|
|
}
|
2002-10-14 04:05:37 +04:00
|
|
|
|
2002-10-15 18:31:06 +04:00
|
|
|
/*
|
|
|
|
* Set up the colour map.
|
|
|
|
*/
|
2002-10-26 16:58:13 +04:00
|
|
|
palette_reset(inst);
|
2002-10-15 18:31:06 +04:00
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->width = conf_get_int(inst->conf, CONF_width);
|
|
|
|
inst->height = conf_get_int(inst->conf, CONF_height);
|
|
|
|
cache_conf_values(inst);
|
2003-04-10 22:00:50 +04:00
|
|
|
|
2002-10-07 20:45:23 +04:00
|
|
|
gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area),
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->font_width * inst->width + 2*inst->window_border,
|
|
|
|
inst->font_height * inst->height + 2*inst->window_border);
|
2003-04-10 22:00:50 +04:00
|
|
|
inst->sbar_adjust = GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,0,0,0));
|
|
|
|
inst->sbar = gtk_vscrollbar_new(inst->sbar_adjust);
|
2002-10-13 13:54:36 +04:00
|
|
|
inst->hbox = GTK_BOX(gtk_hbox_new(FALSE, 0));
|
2003-04-10 22:00:50 +04:00
|
|
|
/*
|
|
|
|
* We always create the scrollbar; it remains invisible if
|
|
|
|
* unwanted, so we can pop it up quickly if it suddenly becomes
|
|
|
|
* desirable.
|
|
|
|
*/
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(inst->conf, CONF_scrollbar_on_left))
|
2003-04-10 22:00:50 +04:00
|
|
|
gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0);
|
2002-10-13 16:44:01 +04:00
|
|
|
gtk_box_pack_start(inst->hbox, inst->area, TRUE, TRUE, 0);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (!conf_get_int(inst->conf, CONF_scrollbar_on_left))
|
2003-04-10 22:00:50 +04:00
|
|
|
gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0);
|
2002-10-13 13:54:36 +04:00
|
|
|
|
2002-10-14 04:05:37 +04:00
|
|
|
gtk_container_add(GTK_CONTAINER(inst->window), GTK_WIDGET(inst->hbox));
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2003-04-10 22:00:50 +04:00
|
|
|
set_geom_hints(inst);
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2003-04-08 17:49:12 +04:00
|
|
|
gtk_widget_show(inst->area);
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(inst->conf, CONF_scrollbar))
|
2003-04-08 17:49:12 +04:00
|
|
|
gtk_widget_show(inst->sbar);
|
2003-04-10 22:00:50 +04:00
|
|
|
else
|
|
|
|
gtk_widget_hide(inst->sbar);
|
2003-04-08 17:49:12 +04:00
|
|
|
gtk_widget_show(GTK_WIDGET(inst->hbox));
|
|
|
|
|
|
|
|
if (inst->gotpos) {
|
|
|
|
int x = inst->xpos, y = inst->ypos;
|
|
|
|
GtkRequisition req;
|
|
|
|
gtk_widget_size_request(GTK_WIDGET(inst->window), &req);
|
|
|
|
if (inst->gravity & 1) x += gdk_screen_width() - req.width;
|
|
|
|
if (inst->gravity & 2) y += gdk_screen_height() - req.height;
|
|
|
|
gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE);
|
|
|
|
gtk_widget_set_uposition(GTK_WIDGET(inst->window), x, y);
|
|
|
|
}
|
|
|
|
|
2002-10-14 04:05:37 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->window), "destroy",
|
2002-10-07 20:45:23 +04:00
|
|
|
GTK_SIGNAL_FUNC(destroy), inst);
|
2002-10-14 04:05:37 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->window), "delete_event",
|
2002-10-07 20:45:23 +04:00
|
|
|
GTK_SIGNAL_FUNC(delete_window), inst);
|
2002-10-14 04:05:37 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event",
|
2002-10-07 20:45:23 +04:00
|
|
|
GTK_SIGNAL_FUNC(key_event), inst);
|
2002-10-15 21:18:24 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->window), "key_release_event",
|
|
|
|
GTK_SIGNAL_FUNC(key_event), inst);
|
2002-10-14 04:05:37 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->window), "focus_in_event",
|
2002-10-07 20:45:23 +04:00
|
|
|
GTK_SIGNAL_FUNC(focus_event), inst);
|
2002-10-14 04:05:37 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event",
|
2002-10-07 20:45:23 +04:00
|
|
|
GTK_SIGNAL_FUNC(focus_event), inst);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "configure_event",
|
|
|
|
GTK_SIGNAL_FUNC(configure_area), inst);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "expose_event",
|
|
|
|
GTK_SIGNAL_FUNC(expose_area), inst);
|
2002-10-13 15:24:25 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "button_press_event",
|
|
|
|
GTK_SIGNAL_FUNC(button_event), inst);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "button_release_event",
|
|
|
|
GTK_SIGNAL_FUNC(button_event), inst);
|
2008-06-11 00:18:23 +04:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "scroll_event",
|
|
|
|
GTK_SIGNAL_FUNC(scroll_event), inst);
|
|
|
|
#endif
|
2002-10-13 15:24:25 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "motion_notify_event",
|
|
|
|
GTK_SIGNAL_FUNC(motion_event), inst);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "selection_received",
|
|
|
|
GTK_SIGNAL_FUNC(selection_received), inst);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "selection_get",
|
|
|
|
GTK_SIGNAL_FUNC(selection_get), inst);
|
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->area), "selection_clear_event",
|
|
|
|
GTK_SIGNAL_FUNC(selection_clear), inst);
|
2012-06-17 11:26:23 +04:00
|
|
|
#if GTK_CHECK_VERSION(2,0,0)
|
|
|
|
g_signal_connect(G_OBJECT(inst->imc), "commit",
|
|
|
|
G_CALLBACK(input_method_commit_event), inst);
|
|
|
|
#endif
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
if (conf_get_int(inst->conf, CONF_scrollbar))
|
2002-10-15 18:55:19 +04:00
|
|
|
gtk_signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed",
|
|
|
|
GTK_SIGNAL_FUNC(scrollbar_moved), inst);
|
2002-10-07 20:45:23 +04:00
|
|
|
gtk_widget_add_events(GTK_WIDGET(inst->area),
|
2002-10-13 15:24:25 +04:00
|
|
|
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK |
|
|
|
|
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
|
2002-10-14 13:58:27 +04:00
|
|
|
GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK);
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2007-01-06 21:27:00 +03:00
|
|
|
{
|
|
|
|
extern const char *const *const main_icon[];
|
|
|
|
extern const int n_main_icon;
|
|
|
|
set_window_icon(inst->window, main_icon, n_main_icon);
|
|
|
|
}
|
|
|
|
|
2002-10-14 04:05:37 +04:00
|
|
|
gtk_widget_show(inst->window);
|
2002-10-07 20:45:23 +04:00
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
set_window_background(inst);
|
2002-10-25 15:58:59 +04:00
|
|
|
|
2003-04-05 20:05:00 +04:00
|
|
|
/*
|
|
|
|
* Set up the Ctrl+rightclick context menu.
|
|
|
|
*/
|
|
|
|
{
|
|
|
|
GtkWidget *menuitem;
|
|
|
|
char *s;
|
2003-04-12 21:37:15 +04:00
|
|
|
extern const int use_event_log, new_session, saved_sessions;
|
2003-04-05 20:05:00 +04:00
|
|
|
|
|
|
|
inst->menu = gtk_menu_new();
|
|
|
|
|
2011-05-07 14:57:19 +04:00
|
|
|
#define MKMENUITEM(title, func) do \
|
|
|
|
{ \
|
|
|
|
menuitem = gtk_menu_item_new_with_label(title); \
|
|
|
|
gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \
|
|
|
|
gtk_widget_show(menuitem); \
|
|
|
|
gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \
|
|
|
|
GTK_SIGNAL_FUNC(func), inst); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define MKSUBMENU(title) do \
|
|
|
|
{ \
|
|
|
|
menuitem = gtk_menu_item_new_with_label(title); \
|
|
|
|
gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \
|
|
|
|
gtk_widget_show(menuitem); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define MKSEP() do \
|
|
|
|
{ \
|
|
|
|
menuitem = gtk_menu_item_new(); \
|
|
|
|
gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \
|
|
|
|
gtk_widget_show(menuitem); \
|
|
|
|
} while (0)
|
|
|
|
|
2003-04-12 21:37:15 +04:00
|
|
|
if (new_session)
|
2009-09-14 03:37:55 +04:00
|
|
|
MKMENUITEM("New Session...", new_session_menuitem);
|
2004-08-14 17:04:18 +04:00
|
|
|
MKMENUITEM("Restart Session", restart_session_menuitem);
|
|
|
|
inst->restartitem = menuitem;
|
2009-09-14 03:41:55 +04:00
|
|
|
gtk_widget_set_sensitive(inst->restartitem, FALSE);
|
2003-04-12 21:37:15 +04:00
|
|
|
MKMENUITEM("Duplicate Session", dup_session_menuitem);
|
|
|
|
if (saved_sessions) {
|
|
|
|
inst->sessionsmenu = gtk_menu_new();
|
2005-04-07 05:36:28 +04:00
|
|
|
/* sessionsmenu will be updated when it's invoked */
|
|
|
|
/* XXX is this the right way to do dynamic menus in Gtk? */
|
|
|
|
MKMENUITEM("Saved Sessions", update_savedsess_menu);
|
2003-04-12 21:37:15 +04:00
|
|
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),
|
|
|
|
inst->sessionsmenu);
|
|
|
|
}
|
2011-05-07 14:57:19 +04:00
|
|
|
MKSEP();
|
2009-09-14 03:37:55 +04:00
|
|
|
MKMENUITEM("Change Settings...", change_settings_menuitem);
|
2011-05-07 14:57:19 +04:00
|
|
|
MKSEP();
|
2003-04-09 22:46:45 +04:00
|
|
|
if (use_event_log)
|
|
|
|
MKMENUITEM("Event Log", event_log_menuitem);
|
2011-05-07 14:57:19 +04:00
|
|
|
MKSUBMENU("Special Commands");
|
2003-04-05 20:05:00 +04:00
|
|
|
inst->specialsmenu = gtk_menu_new();
|
|
|
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->specialsmenu);
|
|
|
|
inst->specialsitem1 = menuitem;
|
2011-05-07 14:57:19 +04:00
|
|
|
MKSEP();
|
2003-04-05 20:05:00 +04:00
|
|
|
inst->specialsitem2 = menuitem;
|
2004-10-17 18:44:27 +04:00
|
|
|
gtk_widget_hide(inst->specialsitem1);
|
|
|
|
gtk_widget_hide(inst->specialsitem2);
|
2003-04-05 20:05:00 +04:00
|
|
|
MKMENUITEM("Clear Scrollback", clear_scrollback_menuitem);
|
|
|
|
MKMENUITEM("Reset Terminal", reset_terminal_menuitem);
|
2003-04-11 21:59:36 +04:00
|
|
|
MKMENUITEM("Copy All", copy_all_menuitem);
|
2011-05-07 14:57:19 +04:00
|
|
|
MKSEP();
|
2003-04-05 20:05:00 +04:00
|
|
|
s = dupcat("About ", appname, NULL);
|
|
|
|
MKMENUITEM(s, about_menuitem);
|
|
|
|
sfree(s);
|
|
|
|
#undef MKMENUITEM
|
2011-05-07 14:57:19 +04:00
|
|
|
#undef MKSUBMENU
|
|
|
|
#undef MKSEP
|
2003-04-05 20:05:00 +04:00
|
|
|
}
|
|
|
|
|
2002-10-26 16:58:13 +04:00
|
|
|
inst->textcursor = make_mouse_ptr(inst, GDK_XTERM);
|
|
|
|
inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR);
|
2005-02-15 20:05:58 +03:00
|
|
|
inst->waitcursor = make_mouse_ptr(inst, GDK_WATCH);
|
2002-10-26 16:58:13 +04:00
|
|
|
inst->blankcursor = make_mouse_ptr(inst, -1);
|
|
|
|
make_mouse_ptr(inst, -2); /* clean up cursor font */
|
2002-10-14 13:58:27 +04:00
|
|
|
inst->currcursor = inst->textcursor;
|
2002-10-26 16:58:13 +04:00
|
|
|
show_mouseptr(inst, 1);
|
2002-10-10 14:40:30 +04:00
|
|
|
|
2003-04-09 22:46:45 +04:00
|
|
|
inst->eventlogstuff = eventlogstuff_new();
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
inst->term = term_init(inst->conf, &inst->ucsdata, inst);
|
|
|
|
inst->logctx = log_init(inst, inst->conf);
|
2002-10-26 16:58:13 +04:00
|
|
|
term_provide_logctx(inst->term, inst->logctx);
|
2002-10-22 20:11:33 +04:00
|
|
|
|
2003-03-29 21:30:14 +03:00
|
|
|
uxsel_init();
|
|
|
|
|
Post-release destabilisation! Completely remove the struct type
'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]
2011-07-14 22:52:21 +04:00
|
|
|
term_size(inst->term, inst->height, inst->width,
|
|
|
|
conf_get_int(inst->conf, CONF_savelines));
|
2003-04-01 22:10:25 +04:00
|
|
|
|
2004-08-14 17:04:18 +04:00
|
|
|
start_backend(inst);
|
2002-10-15 16:29:52 +04:00
|
|
|
|
2002-10-26 14:16:19 +04:00
|
|
|
ldisc_send(inst->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */
|
2002-10-15 16:29:52 +04:00
|
|
|
|
2002-11-02 17:35:57 +03:00
|
|
|
/* now we're reday to deal with the child exit handler being
|
|
|
|
* called */
|
|
|
|
block_signal(SIGCHLD, 0);
|
2003-03-29 21:30:14 +03:00
|
|
|
|
2003-04-25 19:44:01 +04:00
|
|
|
/*
|
|
|
|
* Block SIGPIPE: if we attempt Duplicate Session or similar
|
|
|
|
* and it falls over in some way, we certainly don't want
|
|
|
|
* SIGPIPE terminating the main pterm/PuTTY. Note that we do
|
|
|
|
* this _after_ (at least pterm) forks off its child process,
|
|
|
|
* since the child wants SIGPIPE handled in the usual way.
|
|
|
|
*/
|
|
|
|
block_signal(SIGPIPE, 1);
|
|
|
|
|
2003-03-29 21:30:14 +03:00
|
|
|
inst->exited = FALSE;
|
|
|
|
|
2002-10-07 20:45:23 +04:00
|
|
|
gtk_main();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|