X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/90cfd8f45ac8602f4c533a71e67d7a08cebdc58b..b9d7bcadee831e9b59fb785f2464a5fc1897bd1a:/unix/pterm.c diff --git a/unix/pterm.c b/unix/pterm.c index 73cd4bcb..2791693a 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -53,13 +53,14 @@ struct gui_data { char wintitle[sizeof(((Config *)0)->wintitle)]; char icontitle[sizeof(((Config *)0)->wintitle)]; int master_fd, master_func_id, exited; + void *ldisc; }; static struct gui_data the_inst; static struct gui_data *inst = &the_inst; /* so we always write `inst->' */ static int send_raw_mouse; -void ldisc_update(int echo, int edit) +void ldisc_update(void *frontend, int echo, int edit) { /* * This is a stub in pterm. If I ever produce a Unix @@ -792,7 +793,7 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) printf("\n"); #endif - ldisc_send(output+start, end-start, 1); + ldisc_send(inst->ldisc, output+start, end-start, 1); show_mouseptr(0); term_seen_key_event(term); term_out(term); @@ -886,8 +887,8 @@ void done_with_pty(struct gui_data *inst) gtk_input_remove(inst->master_func_id); } - if (!inst->exited && back->exitcode() >= 0) { - int exitcode = back->exitcode(); + if (!inst->exited && back->exitcode(backhandle) >= 0) { + int exitcode = back->exitcode(backhandle); int clean; clean = WIFEXITED(exitcode) && (WEXITSTATUS(exitcode) == 0); @@ -924,8 +925,10 @@ void done_with_pty(struct gui_data *inst) } } -void frontend_keypress(void) +void frontend_keypress(void *handle) { + struct gui_data *inst = (struct gui_data *)handle; + /* * If our child process has exited but not closed, terminate on * any keypress. @@ -938,7 +941,7 @@ gint timer_func(gpointer data) { struct gui_data *inst = (struct gui_data *)data; - if (back->exitcode() >= 0) { + if (back->exitcode(backhandle) >= 0) { /* * The primary child process died. We could keep the * terminal open for remaining subprocesses to output to, @@ -1089,6 +1092,14 @@ void real_palette_set(int n, int r, int g, int b) n, r, g, b); } +void set_window_background(void) +{ + if (inst->area && inst->area->window) + gdk_window_set_background(inst->area->window, &inst->cols[18]); + if (inst->window && inst->window->window) + gdk_window_set_background(inst->window->window, &inst->cols[18]); +} + void palette_set(int n, int r, int g, int b) { static const int first[21] = { @@ -1099,6 +1110,8 @@ void palette_set(int n, int r, int g, int b) real_palette_set(first[n], r, g, b); if (first[n] >= 18) real_palette_set(first[n] + 1, r, g, b); + if (first[n] == 18) + set_window_background(); } void palette_reset(void) @@ -1133,6 +1146,8 @@ void palette_reset(void) g_error("pterm: couldn't allocate colour %d (#%02x%02x%02x)\n", i, cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); } + + set_window_background(); } void write_clip(wchar_t * data, int len, int must_deselect) @@ -1820,6 +1835,11 @@ int main(int argc, char **argv) if (do_cmdline(argc, argv, 1)) /* post-defaults, do everything */ exit(1); + /* + * Initialise the whole instance structure to zeroes + */ + memset(inst, 0, sizeof(*inst)); + inst->fonts[0] = gdk_font_load(cfg.font); if (!inst->fonts[0]) { fprintf(stderr, "pterm: unable to load font \"%s\"\n", cfg.font); @@ -1931,6 +1951,8 @@ int main(int argc, char **argv) gtk_widget_show(GTK_WIDGET(inst->hbox)); gtk_widget_show(inst->window); + set_window_background(); + inst->textcursor = make_mouse_ptr(GDK_XTERM); inst->rawcursor = make_mouse_ptr(GDK_LEFT_PTR); inst->blankcursor = make_mouse_ptr(-1); @@ -1941,10 +1963,14 @@ int main(int argc, char **argv) term = term_init(); back = &pty_backend; - back->init((void *)term, NULL, 0, NULL, 0); + back->init((void *)term, &backhandle, NULL, 0, NULL, 0); + + term_provide_resize_fn(term, back->size, backhandle); term_size(term, cfg.height, cfg.width, cfg.savelines); - ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */ + + inst->ldisc = ldisc_create(term, back, backhandle, inst); + ldisc_send(inst->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ inst->master_fd = pty_master_fd; inst->exited = FALSE;