Only engage a GTK idle function when absolutely necessary, otherwise
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 14 Oct 2002 23:32:00 +0000 (23:32 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 14 Oct 2002 23:32:00 +0000 (23:32 +0000)
the whole app spins on it and takes up CPU all the time.

git-svn-id: svn://svn.tartarus.org/sgt/putty@2052 cda61777-01e9-0310-a592-d414129be87e

putty.h
terminal.c
unix/pterm.c

diff --git a/putty.h b/putty.h
index 793e976..f0b93a5 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -484,6 +484,7 @@ void term_update(void);
 void term_invalidate(void);
 void term_blink(int set_cursor);
 void term_do_paste(void);
+int term_paste_pending(void);
 void term_paste(void);
 void term_nopaste(void);
 int term_ldisc(int option);
index 7bb0b16..c9e59de 100644 (file)
@@ -3708,6 +3708,11 @@ void term_nopaste()
     paste_len = 0;
 }
 
+int term_paste_pending(void)
+{
+    return paste_len != 0;
+}
+
 void term_paste()
 {
     static long last_paste = 0;
index 9258b61..0c1dc7c 100644 (file)
@@ -38,6 +38,7 @@ struct gui_data {
     int pasteout_data_len;
     int font_width, font_height;
     int ignore_sbar;
+    guint term_paste_idle_id;
     GdkAtom compound_text_atom;
     char wintitle[sizeof(((Config *)0)->wintitle)];
 };
@@ -750,13 +751,6 @@ gint timer_func(gpointer data)
     return TRUE;
 }
 
-gint idle_func(gpointer data)
-{
-    /* struct gui_data *inst = (struct gui_data *)data; */
-    term_paste();
-    return TRUE;
-}
-
 void pty_input_func(gpointer data, gint sourcefd, GdkInputCondition condition)
 {
     /* struct gui_data *inst = (struct gui_data *)data; */
@@ -924,6 +918,8 @@ void request_paste(void)
                          GDK_SELECTION_TYPE_STRING, GDK_CURRENT_TIME);
 }
 
+gint idle_paste_func(gpointer data);   /* forward ref */
+
 void selection_received(GtkWidget *widget, GtkSelectionData *seldata,
                        gpointer data)
 {
@@ -940,8 +936,24 @@ void selection_received(GtkWidget *widget, GtkSelectionData *seldata,
             inst->pastein_data, inst->pastein_data_len);
 
     term_do_paste();
+
+    if (term_paste_pending())
+       inst->term_paste_idle_id = gtk_idle_add(idle_paste_func, inst);
+}
+
+gint idle_paste_func(gpointer data)
+{
+    struct gui_data *inst = (struct gui_data *)data;
+
+    if (term_paste_pending())
+       term_paste();
+    else
+       gtk_idle_remove(inst->term_paste_idle_id);
+
+    return TRUE;
 }
 
+
 void get_clip(wchar_t ** p, int *len)
 {
     if (p) {
@@ -1345,7 +1357,6 @@ int main(int argc, char **argv)
                       GTK_SIGNAL_FUNC(selection_clear), inst);
     gtk_signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed",
                       GTK_SIGNAL_FUNC(scrollbar_moved), inst);
-    gtk_idle_add(idle_func, inst);
     gtk_timeout_add(20, timer_func, inst);
     gdk_input_add(pty_master_fd, GDK_INPUT_READ, pty_input_func, inst);
     gtk_widget_add_events(GTK_WIDGET(inst->area),