From 0f660c8fcff217b1c4518aa77b038adae45f3601 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 14 Oct 2002 23:32:00 +0000 Subject: [PATCH] Only engage a GTK idle function when absolutely necessary, otherwise 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 | 1 + terminal.c | 5 +++++ unix/pterm.c | 27 +++++++++++++++++++-------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/putty.h b/putty.h index 793e9763..f0b93a5f 100644 --- 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); diff --git a/terminal.c b/terminal.c index 7bb0b161..c9e59de5 100644 --- a/terminal.c +++ b/terminal.c @@ -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; diff --git a/unix/pterm.c b/unix/pterm.c index 9258b613..0c1dc7c4 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -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), -- 2.11.0