From 1cff13202c4c2cabbf77eac5656b327055ab11e7 Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 27 Nov 2004 19:34:45 +0000 Subject: [PATCH] Slight improvement to cursor blink timing: since the cursor doesn't blink when the window doesn't have focus, we don't schedule blink timers at that point either. Infrastructure change: term->has_focus should now not be written directly from outside terminal.c. Instead, use the function term_set_focus, which will sort out the blink timers as well. git-svn-id: svn://svn.tartarus.org/sgt/putty@4911 cda61777-01e9-0310-a592-d414129be87e --- mac/macterm.c | 2 +- putty.h | 1 + terminal.c | 18 +++++++++++------- unix/pterm.c | 2 +- windows/window.c | 8 ++++---- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/mac/macterm.c b/mac/macterm.c index 5831cd26..f308808f 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1042,7 +1042,7 @@ static void mac_activateterm(WindowPtr window, EventRecord *event) Boolean active = (event->modifiers & activeFlag) != 0; s = mac_windowsession(window); - s->term->has_focus = active; + term_set_focus(s->term, active); term_update(s->term); if (active) ShowControl(s->scrollbar); diff --git a/putty.h b/putty.h index b1043a61..4ad3124a 100644 --- a/putty.h +++ b/putty.h @@ -664,6 +664,7 @@ void term_provide_resize_fn(Terminal *term, void (*resize_fn)(void *, int, int), void *resize_ctx); void term_provide_logctx(Terminal *term, void *logctx); +void term_set_focus(Terminal *term, int has_focus); /* * Exports from logging.c. diff --git a/terminal.c b/terminal.c index f070579b..9003cc49 100644 --- a/terminal.c +++ b/terminal.c @@ -1043,10 +1043,9 @@ static void seen_disp_event(Terminal *term) */ static void term_schedule_tblink(Terminal *term) { - if (term->tblink_pending) - return; /* already well in hand */ if (term->blink_is_real) { - term->next_tblink = schedule_timer(TBLINK_DELAY, term_timer, term); + if (!term->tblink_pending) + term->next_tblink = schedule_timer(TBLINK_DELAY, term_timer, term); term->tblink_pending = TRUE; } else { term->tblinker = 1; /* reset when not in use */ @@ -1059,10 +1058,9 @@ static void term_schedule_tblink(Terminal *term) */ static void term_schedule_cblink(Terminal *term) { - if (term->cblink_pending) - return; /* already well in hand */ - if (term->cfg.blink_cur) { - term->next_cblink = schedule_timer(CBLINK_DELAY, term_timer, term); + if (term->cfg.blink_cur && term->has_focus) { + if (!term->cblink_pending) + term->next_cblink = schedule_timer(CBLINK_DELAY, term_timer, term); term->cblink_pending = TRUE; } else { term->cblinker = 1; /* reset when not in use */ @@ -6074,3 +6072,9 @@ void term_provide_logctx(Terminal *term, void *logctx) { term->logctx = logctx; } + +void term_set_focus(Terminal *term, int has_focus) +{ + term->has_focus = has_focus; + term_schedule_cblink(term); +} diff --git a/unix/pterm.c b/unix/pterm.c index a374d506..59a99c1e 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -1218,7 +1218,7 @@ void destroy(GtkWidget *widget, gpointer data) gint focus_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) { struct gui_data *inst = (struct gui_data *)data; - inst->term->has_focus = event->in; + term_set_focus(inst->term, event->in); term_update(inst->term); show_mouseptr(inst, 1); return FALSE; diff --git a/windows/window.c b/windows/window.c index b460b534..6b7fc17a 100644 --- a/windows/window.c +++ b/windows/window.c @@ -770,7 +770,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) logpal = NULL; init_palette(); - term->has_focus = (GetForegroundWindow() == hwnd); + term_set_focus(term, GetForegroundWindow() == hwnd); UpdateWindow(hwnd); if (GetMessage(&msg, NULL, 0, 0) == 1) { @@ -787,7 +787,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) continue; /* The messages seem unreliable; especially if we're being tricky */ - term->has_focus = (GetForegroundWindow() == hwnd); + term_set_focus(term, GetForegroundWindow() == hwnd); net_pending_errors(); @@ -2317,7 +2317,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, net_pending_errors(); return 0; case WM_SETFOCUS: - term->has_focus = TRUE; + term_set_focus(term, TRUE); CreateCaret(hwnd, caretbm, font_width, font_height); ShowCaret(hwnd); flash_window(0); /* stop */ @@ -2326,7 +2326,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, break; case WM_KILLFOCUS: show_mouseptr(1); - term->has_focus = FALSE; + term_set_focus(term, FALSE); DestroyCaret(); caret_x = caret_y = -1; /* ensure caret is replaced next time */ term_update(term); -- 2.11.0