Created
September 29, 2012 04:51
-
-
Save hankei6km/3803212 to your computer and use it in GitHub Desktop.
Patch for D2D/DW PuTTY 2012/02/11
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/terminal.c b/terminal.c | |
index e3a01bf..264dc8b 100644 | |
--- a/terminal.c | |
+++ b/terminal.c | |
@@ -1297,7 +1297,7 @@ static void power_on(Terminal *term, int clear) | |
term_schedule_cblink(term); | |
} | |
-extern void window_begin(); | |
+extern int window_begin(); | |
extern void window_end(); | |
/* | |
@@ -1311,28 +1311,32 @@ void term_update(Terminal *term) | |
// d2d | |
// printf("term_update: f=%d\n", term->window_update_pending); | |
- window_begin(); | |
+ if(window_begin() == 0){ | |
// | |
- ctx = get_ctx(term->frontend); | |
- if (ctx) { | |
- int need_sbar_update = term->seen_disp_event; | |
- if (term->seen_disp_event && term->cfg.scroll_on_disp) { | |
- term->disptop = 0; /* return to main screen */ | |
- term->seen_disp_event = 0; | |
- need_sbar_update = TRUE; | |
+ ctx = get_ctx(term->frontend); | |
+ if (ctx) { | |
+ int need_sbar_update = term->seen_disp_event; | |
+ if (term->seen_disp_event && term->cfg.scroll_on_disp) { | |
+ term->disptop = 0; /* return to main screen */ | |
+ term->seen_disp_event = 0; | |
+ need_sbar_update = TRUE; | |
+ } | |
+ | |
+ if (need_sbar_update) | |
+ update_sbar(term); | |
+ do_paint(term, ctx, TRUE); | |
+ sys_cursor(term->frontend, term->curs.x, term->curs.y - term->disptop); | |
+ free_ctx(ctx); | |
} | |
- if (need_sbar_update) | |
- update_sbar(term); | |
- do_paint(term, ctx, TRUE); | |
- sys_cursor(term->frontend, term->curs.x, term->curs.y - term->disptop); | |
- free_ctx(ctx); | |
+ // d2d | |
+ window_end(); | |
+ // | |
+ }else{ | |
+ // d2d_init failed. | |
+ // TODO: alert message & recovery. | |
} | |
- | |
- // d2d | |
- window_end(); | |
- // | |
} | |
/* | |
diff --git a/windows/window.cpp b/windows/window.cpp | |
index 40e62a3..2028ad6 100644 | |
--- a/windows/window.cpp | |
+++ b/windows/window.cpp | |
@@ -281,7 +281,7 @@ static void d2d_create(); | |
static void d2d_release(); | |
static void d2d_init(); | |
static void d2d_deinit(); | |
-static void d2d_begin(); | |
+static int d2d_begin(); | |
static void d2d_end(); | |
static void d2d_clear(); | |
static void d2d_resize(); | |
@@ -299,7 +299,7 @@ static void dw_textout(int x, int y, UINT opt, const RECT *rc, | |
static LCID getLCID(DWORD CharSet); | |
-extern "C" void window_begin(); | |
+extern "C" int window_begin(); | |
extern "C" void window_end(); | |
#ifndef D2DBG | |
@@ -6199,16 +6199,19 @@ void agent_schedule_callback(void (*callback) (void *, void *, int), | |
// d2d | |
-void window_begin() | |
+int window_begin() | |
{ | |
- d2d_begin(); | |
- d2d_clear(); | |
+ int ret = d2d_begin(); | |
+ if(ret == 0){ | |
+ d2d_clear(); | |
- for (int i = 0; i < term->rows; i++) { | |
- for (int j = 0; j < term->cols; j++) { | |
- term->disptext[i]->chars[j].attr |= ATTR_INVALID; | |
+ for (int i = 0; i < term->rows; i++) { | |
+ for (int j = 0; j < term->cols; j++) { | |
+ term->disptext[i]->chars[j].attr |= ATTR_INVALID; | |
+ } | |
} | |
} | |
+ return ret; | |
} | |
void window_end() | |
@@ -6363,13 +6366,20 @@ d2d_deinit() | |
} | |
} | |
-static void | |
+static int | |
d2d_begin() | |
{ | |
+ if (d2dF != NULL && d2dRT == NULL) { | |
+ // re-create the render target and related resources. | |
+ d2d_init(); | |
+ } | |
+ | |
if (!d2dRT) { | |
- return; | |
+ // TODO: define err code. | |
+ return 1; | |
} | |
d2dRT->BeginDraw(); | |
+ return 0; | |
} | |
static void | |
@@ -6379,7 +6389,8 @@ d2d_end() | |
return; | |
} | |
if (d2dRT->EndDraw() == D2DERR_RECREATE_TARGET) { | |
- d2d_release(); | |
+ // release the render target and related resources(keep d2dF). | |
+ d2d_deinit(); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment