Skip to content

Instantly share code, notes, and snippets.

@hankei6km
Created September 29, 2012 04:51
Show Gist options
  • Save hankei6km/3803212 to your computer and use it in GitHub Desktop.
Save hankei6km/3803212 to your computer and use it in GitHub Desktop.
Patch for D2D/DW PuTTY 2012/02/11
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