# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1344065713 0 # Node ID 209c57a14b093a23882f56b627c425d36760a605 # Parent a640714f908740545f2a0296fbf79df1b308bc7d Rewrite dw_window_set_style() on Windows to properly handle the static control. Apparently the first few style bits are not bits at all, they are a number of individual values, so combining them like bits causes all sorts of havok. diff -r a640714f9087 -r 209c57a14b09 dw.h --- a/dw.h Sat Aug 04 01:14:17 2012 +0000 +++ b/dw.h Sat Aug 04 07:35:13 2012 +0000 @@ -503,11 +503,11 @@ #define DW_DT_CENTER SS_CENTER #define DW_DT_RIGHT SS_RIGHT #define DW_DT_TOP 0 -#define DW_DT_VCENTER SS_NOPREFIX +#define DW_DT_VCENTER (1 << 29) #define DW_DT_BOTTOM 0 #define DW_DT_HALFTONE 0 #define DW_DT_MNEMONIC 0 -#define DW_DT_WORDBREAK SS_LEFT +#define DW_DT_WORDBREAK (1 << 28) #define DW_DT_ERASERECT 0 #define DW_FCF_CLOSEBUTTON 0 diff -r a640714f9087 -r 209c57a14b09 win/dw.c --- a/win/dw.c Sat Aug 04 01:14:17 2012 +0000 +++ b/win/dw.c Sat Aug 04 07:35:13 2012 +0000 @@ -5979,8 +5979,8 @@ { HWND tmp = CreateWindow(STATICCLASSNAME, UTF8toWide(text), - SS_NOPREFIX | SS_NOTIFY | WS_VISIBLE | - WS_CHILD | WS_CLIPCHILDREN, + SS_NOPREFIX | SS_NOTIFY | SS_LEFTNOWORDWRAP | + WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN, 0,0,0,0, DW_HWND_OBJECT, (HMENU)id, @@ -7637,7 +7637,7 @@ ColorInfo *cinfo; TCHAR tmpbuf[100] = {0}; - if(!handle) + if(!handle || !mask) return; if(handle < (HWND)65536) @@ -7680,7 +7680,7 @@ tmp = currentstyle | mask; tmp ^= mask; - tmp |= style; + tmp |= style & mask; if(_tcsnicmp(tmpbuf, ClassName, _tcslen(ClassName)+1)==0) { @@ -7710,26 +7710,46 @@ } #endif } - else - { - /* We are using SS_NOPREFIX as a VCENTER flag */ - if(tmp & SS_NOPREFIX) - { - - if(cinfo) - cinfo->vcenter = 1; - else - { - cinfo = calloc(1, sizeof(ColorInfo)); - cinfo->fore = cinfo->back = -1; - cinfo->vcenter = 1; - - cinfo->pOldProc = SubclassWindow(handle, _colorwndproc); - SetWindowLongPtr(handle, GWLP_USERDATA, (LONG_PTR)cinfo); - } - } - else if(cinfo) - cinfo->vcenter = 0; + else if(_tcsnicmp(tmpbuf, STATICCLASSNAME, _tcslen(STATICCLASSNAME)+1)==0) + { + static ULONG halign = (SS_LEFTNOWORDWRAP | SS_RIGHT | SS_CENTER); + ULONG thismask = mask & ~(DW_DT_VCENTER | DW_DT_WORDBREAK); + ULONG thisstyle = style & ~(DW_DT_VCENTER | DW_DT_WORDBREAK); + ULONG type = style & mask & 0xFL; + + /* Need to filter out bits that shouldn't be set */ + tmp = currentstyle | thismask; + tmp ^= thismask; + tmp |= thisstyle & thismask; + + if(mask & DW_DT_VCENTER) + { + if(style & DW_DT_VCENTER) + { + if(cinfo) + cinfo->vcenter = 1; + else + { + cinfo = calloc(1, sizeof(ColorInfo)); + cinfo->fore = cinfo->back = -1; + cinfo->vcenter = 1; + + cinfo->pOldProc = SubclassWindow(handle, _colorwndproc); + SetWindowLongPtr(handle, GWLP_USERDATA, (LONG_PTR)cinfo); + } + } + else if(cinfo) + cinfo->vcenter = 0; + } + /* Alignment style is 0 for word wrap */ + if((style & DW_DT_WORDBREAK) && (mask & DW_DT_WORDBREAK)) + tmp &= ~(0xFL); + else if(type == SS_LEFTNOWORDWRAP) + tmp = (tmp & ~(0xFL)) | SS_LEFTNOWORDWRAP; + else if(type == SS_CENTER) + tmp = (tmp & ~(0xFL)) | SS_CENTER; + else if(type == SS_RIGHT) + tmp = (tmp & ~(0xFL)) | SS_RIGHT; } SetWindowLong(handle, GWL_STYLE, tmp);