From: Jeffrey Altman Date: Fri, 24 Aug 2007 14:37:07 +0000 (+0000) Subject: NIM: Handle WM_PAINT messages without update regions X-Git-Tag: krb5-1.7-alpha1~939 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=1217c6a7ebf00df220fdf6c45e0ffc23968a41fe;p=krb5.git NIM: Handle WM_PAINT messages without update regions It is possible to receive a WM_PAINT message in Windows without there being an update region. For example, this can be caused by someone calling RedrawWindow() with the RDW_INTERNALPAINT flag set. In this case, GetUpdateRect() will indicate that there is no update region and calling BeginPaint()/EndPaint() results in incorrect behavior. The credentials window in Network Identity Manager needs to perform special handling for this case by obtaining a proper device context and completing the drawing operation. ticket: new component: windows git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@19859 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/windows/identity/ui/credwnd.c b/src/windows/identity/ui/credwnd.c index ed9cad735..222d3038a 100644 --- a/src/windows/identity/ui/credwnd.c +++ b/src/windows/identity/ui/credwnd.c @@ -3127,6 +3127,7 @@ cw_wm_paint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) int selected = 0; int rowheight = 0; BOOL has_dc = FALSE; + BOOL has_updaterect = TRUE; tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); if (tbl == NULL) @@ -3140,15 +3141,16 @@ cw_wm_paint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) has_dc = TRUE; } - if(!has_dc && !GetUpdateRect(hwnd, &r, FALSE)) { -#ifdef DEBUG - assert(FALSE); -#endif - goto _exit; + if (!has_dc && !GetUpdateRect(hwnd, &r, FALSE)) { + has_updaterect = FALSE; } - if (!has_dc) - hdc = BeginPaint(hwnd, &ps); + if (!has_dc) { + if (has_updaterect) + hdc = BeginPaint(hwnd, &ps); + else + hdc = GetDC(hwnd); + } if(tbl->hf_normal) hf_old = SelectFont(hdc, tbl->hf_normal); @@ -3377,8 +3379,12 @@ cw_wm_paint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if(tbl->hf_normal) SelectFont(hdc, hf_old); - if (!has_dc) - EndPaint(hwnd,&ps); + if (!has_dc) { + if (has_updaterect) + EndPaint(hwnd,&ps); + else + ReleaseDC(hwnd, hdc); + } _exit: return TRUE;