X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/f579cda810e80c59cc719e0feea999e88ab09907..9c1609600d32ad27a7e154adecaa49494d7f5ec1:/unix/gtkwin.c diff --git a/unix/gtkwin.c b/unix/gtkwin.c index f969b046..cd8c7150 100644 --- a/unix/gtkwin.c +++ b/unix/gtkwin.c @@ -189,6 +189,22 @@ int from_backend(void *frontend, int is_stderr, const char *data, int len) return term_data(inst->term, is_stderr, data, len); } +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); +} + +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; +} + void logevent(void *frontend, const char *string) { struct gui_data *inst = (struct gui_data *)frontend; @@ -713,19 +729,21 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) if (inst->cfg.nethack_keypad) { char *keys = NULL; switch (event->keyval) { - case GDK_KP_1: case GDK_KP_End: keys = "bB"; break; - case GDK_KP_2: case GDK_KP_Down: keys = "jJ"; break; - case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN"; break; - case GDK_KP_4: case GDK_KP_Left: keys = "hH"; break; - case GDK_KP_5: case GDK_KP_Begin: keys = ".."; break; - case GDK_KP_6: case GDK_KP_Right: keys = "lL"; break; - case GDK_KP_7: case GDK_KP_Home: keys = "yY"; break; - case GDK_KP_8: case GDK_KP_Up: keys = "kK"; break; - case GDK_KP_9: case GDK_KP_Page_Up: keys = "uU"; break; + 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; } if (keys) { end = 2; - if (event->state & GDK_SHIFT_MASK) + if (event->state & GDK_CONTROL_MASK) + output[1] = keys[2]; + else if (event->state & GDK_SHIFT_MASK) output[1] = keys[1]; else output[1] = keys[0]; @@ -1374,8 +1392,13 @@ void palette_set(void *frontend, int n, int r, int g, int b) if (n > NALLCOLOURS) return; real_palette_set(inst, n, r, g, b); - if (n == 258) + if (n == 258) { + /* Default Background changed. Ensure space between text area and + * window border is redrawn */ set_window_background(inst); + draw_backing_rect(inst); + gtk_widget_queue_draw(inst->area); + } } void palette_reset(void *frontend) @@ -1407,12 +1430,12 @@ void palette_reset(void *frontend) for (i = 0; i < NEXTCOLOURS; i++) { if (i < 216) { int r = i / 36, g = (i / 6) % 6, b = i % 6; - inst->cols[i+16].red = r * 0x3333; - inst->cols[i+16].green = g * 0x3333; - inst->cols[i+16].blue = b * 0x3333; + inst->cols[i+16].red = r ? r * 0x2828 + 0x3737 : 0; + inst->cols[i+16].green = g ? g * 0x2828 + 0x3737 : 0; + inst->cols[i+16].blue = b ? b + 0x2828 + 0x3737 : 0; } else { int shade = i - 216; - shade = (shade + 1) * 0xFFFF / (NEXTCOLOURS - 216 + 1); + shade = shade * 0x0a0a + 0x0808; inst->cols[i+16].red = inst->cols[i+16].green = inst->cols[i+16].blue = shade; } @@ -1427,7 +1450,13 @@ void palette_reset(void *frontend) inst->cfg.colours[i][1], inst->cfg.colours[i][2]); } + /* Since Default Background may have changed, ensure that space + * between text area and window border is refreshed. */ set_window_background(inst); + if (inst->area) { + draw_backing_rect(inst); + gtk_widget_queue_draw(inst->area); + } } /* Ensure that all the cut buffers exist - according to the ICCCM, we must @@ -1475,7 +1504,7 @@ char * retrieve_cutbuffer(int * nbytes) return ptr; } -void write_clip(void *frontend, wchar_t * data, int len, int must_deselect) +void write_clip(void *frontend, wchar_t * data, int *attr, int len, int must_deselect) { struct gui_data *inst = (struct gui_data *)frontend; if (inst->pasteout_data) @@ -1832,7 +1861,7 @@ void sys_cursor(void *frontend, int x, int y) * may want to perform additional actions on any kind of bell (for * example, taskbar flashing in Windows). */ -void beep(void *frontend, int mode) +void do_beep(void *frontend, int mode) { if (mode != BELL_VISUAL) gdk_beep(); @@ -2842,7 +2871,7 @@ void clear_scrollback_menuitem(GtkMenuItem *item, gpointer data) void reset_terminal_menuitem(GtkMenuItem *item, gpointer data) { struct gui_data *inst = (struct gui_data *)data; - term_pwron(inst->term); + term_pwron(inst->term, TRUE); if (inst->ldisc) ldisc_send(inst->ldisc, NULL, 0, 0); } @@ -3213,6 +3242,7 @@ void restart_session_menuitem(GtkMenuItem *item, gpointer data) if (!inst->back) { logevent(inst, "----- Session restarted -----"); + term_pwron(inst->term, FALSE); start_backend(inst); inst->exited = FALSE; }