Line discipline module now uses dynamically allocated data. Also
[u/mdw/putty] / unix / pterm.c
index 73cd4bc..2791693 100644 (file)
@@ -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;