#define NCOLOURS (lenof(((Config *)0)->colours))
+GdkAtom compound_text_atom, utf8_string_atom;
+
struct gui_data {
GtkWidget *window, *area, *sbar;
GtkBox *hbox;
int ignore_sbar;
int mouseptr_visible;
guint term_paste_idle_id;
- GdkAtom compound_text_atom, utf8_string_atom;
int alt_keycode;
int alt_digits;
char wintitle[sizeof(((Config *)0)->wintitle)];
void connection_fatal(void *frontend, char *p, ...)
{
- Terminal *term = (Terminal *)frontend;
- struct gui_data *inst = (struct gui_data *)term->frontend;
+ struct gui_data *inst = (struct gui_data *)frontend;
va_list ap;
char *msg;
*/
}
-int askappend(void *frontend, Filename filename)
+int from_backend(void *frontend, int is_stderr, const char *data, int len)
{
- /*
- * Logging in an xterm-alike is liable to be something you only
- * do at serious diagnostic need. Hence, I'm going to take the
- * easy option for now and assume we always want to overwrite
- * log files. I can always make it properly configurable later.
- */
- return 2;
+ struct gui_data *inst = (struct gui_data *)frontend;
+ return term_data(inst->term, is_stderr, data, len);
}
void logevent(void *frontend, char *string)
{
- Terminal *term = (Terminal *)frontend;
- struct gui_data *inst = (struct gui_data *)term->frontend;
+ struct gui_data *inst = (struct gui_data *)frontend;
log_eventlog(inst->logctx, string);
*/
void *get_window(void *frontend)
{
- Terminal *term = (Terminal *)frontend;
- struct gui_data *inst = (struct gui_data *)term->frontend;
+ struct gui_data *inst = (struct gui_data *)frontend;
return inst->window;
}
gint delete_window(GtkWidget *widget, GdkEvent *event, gpointer data)
{
- /*
- * We could implement warn-on-close here if we really wanted
- * to.
- */
+ struct gui_data *inst = (struct gui_data *)data;
+ if (!inst->exited && inst->cfg.warn_on_close) {
+ if (!reallyclose(inst))
+ return TRUE;
+ }
return FALSE;
}
gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY,
GDK_SELECTION_TYPE_STRING, 1);
gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY,
- inst->compound_text_atom, 1);
+ compound_text_atom, 1);
if (inst->pasteout_data_utf8)
gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY,
- inst->utf8_string_atom, 1);
+ utf8_string_atom, 1);
}
+
+ if (must_deselect)
+ term_deselect(inst->term);
}
void selection_get(GtkWidget *widget, GtkSelectionData *seldata,
guint info, guint time_stamp, gpointer data)
{
struct gui_data *inst = (struct gui_data *)data;
- if (seldata->target == inst->utf8_string_atom)
+ if (seldata->target == utf8_string_atom)
gtk_selection_data_set(seldata, seldata->target, 8,
inst->pasteout_data_utf8,
inst->pasteout_data_utf8_len);
* fall back to an ordinary string.
*/
gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY,
- inst->utf8_string_atom, GDK_CURRENT_TIME);
+ utf8_string_atom, GDK_CURRENT_TIME);
} else {
/*
* If we're in direct-to-font mode, we disable UTF-8
{
struct gui_data *inst = (struct gui_data *)data;
- if (seldata->target == inst->utf8_string_atom && seldata->length <= 0) {
+ if (seldata->target == utf8_string_atom && seldata->length <= 0) {
/*
* Failed to get a UTF-8 selection string. Try an ordinary
* string.
*/
if (seldata->length <= 0 ||
(seldata->type != GDK_SELECTION_TYPE_STRING &&
- seldata->type != inst->utf8_string_atom))
+ seldata->type != utf8_string_atom))
return; /* Nothing happens. */
if (inst->pastein_data)
inst->pastein_data = snewn(seldata->length, wchar_t);
inst->pastein_data_len = seldata->length;
inst->pastein_data_len =
- mb_to_wc((seldata->type == inst->utf8_string_atom ?
+ mb_to_wc((seldata->type == utf8_string_atom ?
CS_UTF8 : inst->ucsdata.line_codepage),
0, seldata->data, seldata->length,
inst->pastein_data, inst->pastein_data_len);
long get_windowid(void *frontend)
{
- Terminal *term = (Terminal *)frontend;
- struct gui_data *inst = (struct gui_data *)(term->frontend);
+ struct gui_data *inst = (struct gui_data *)frontend;
return (long)GDK_WINDOW_XWINDOW(inst->area->window);
}
ldisc_send(inst->ldisc, NULL, 0, 0);
}
+void copy_all_menuitem(GtkMenuItem *item, gpointer data)
+{
+ struct gui_data *inst = (struct gui_data *)data;
+ term_copyall(inst->term);
+}
+
void special_menuitem(GtkMenuItem *item, gpointer data)
{
struct gui_data *inst = (struct gui_data *)data;
oldcfg.window_border != cfg2.window_border || need_size) {
set_geom_hints(inst);
request_resize(inst, cfg2.width, cfg2.height);
- //term_size(inst->term, cfg2.height, cfg2.width, cfg2.savelines);
- // where TF is our configure event going?!
}
term_invalidate(inst->term);
void update_specials_menu(void *frontend)
{
- Terminal *term = (Terminal *)frontend;
- struct gui_data *inst = (struct gui_data *)term->frontend;
+ struct gui_data *inst = (struct gui_data *)frontend;
const struct telnet_special *specials;
if (!*inst->cfg.host && !cfgbox(&inst->cfg))
exit(0); /* config box hit Cancel */
- inst->compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE);
- inst->utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE);
+ 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);
setup_fonts_ucs(inst);
inst->specialsitem2 = menuitem;
MKMENUITEM("Clear Scrollback", clear_scrollback_menuitem);
MKMENUITEM("Reset Terminal", reset_terminal_menuitem);
+ MKMENUITEM("Copy All", copy_all_menuitem);
MKMENUITEM(NULL, NULL);
s = dupcat("About ", appname, NULL);
MKMENUITEM(s, about_menuitem);
{
char *realhost, *error;
- error = inst->back->init((void *)inst->term, &inst->backhandle,
+ error = inst->back->init((void *)inst, &inst->backhandle,
&inst->cfg, inst->cfg.host, inst->cfg.port,
&realhost, inst->cfg.tcp_nodelay);
}
}
inst->back->provide_logctx(inst->backhandle, inst->logctx);
- update_specials_menu(inst->term);
+ update_specials_menu(inst);
term_provide_resize_fn(inst->term, inst->back->size, inst->backhandle);