Converted sysdata_windows.go to use the new string conversion setup from the previous commit. This has to be first, otherwise a few other things will fail to compile...

This commit is contained in:
Pietro Gagliardi 2014-06-03 03:19:19 -04:00
parent d8ee23ff74
commit 38800f027f
2 changed files with 27 additions and 15 deletions

View File

@ -83,6 +83,10 @@ func utf16ToArg(s *uint16) uintptr {
return uintptr(unsafe.Pointer(s)) return uintptr(unsafe.Pointer(s))
} }
func utf16ToLPARAM(s *uint16) uintptr {
return uintptr(_LPARAM(unsafe.Pointer(s)))
}
var ( var (
_adjustWindowRectEx = user32.NewProc("AdjustWindowRectEx") _adjustWindowRectEx = user32.NewProc("AdjustWindowRectEx")
_createWindowEx = user32.NewProc("CreateWindowExW") _createWindowEx = user32.NewProc("CreateWindowExW")

View File

@ -24,7 +24,7 @@ type sysData struct {
} }
type classData struct { type classData struct {
name string name *uint16
style uint32 style uint32
xstyle uint32 xstyle uint32
altStyle uint32 altStyle uint32
@ -44,24 +44,24 @@ const controlxstyle = 0
var classTypes = [nctypes]*classData{ var classTypes = [nctypes]*classData{
c_window: &classData{ c_window: &classData{
name: stdWndClass, name: toUTF16(stdWndClass),
style: _WS_OVERLAPPEDWINDOW, style: _WS_OVERLAPPEDWINDOW,
xstyle: 0, xstyle: 0,
storeSysData: true, storeSysData: true,
doNotLoadFont: true, doNotLoadFont: true,
}, },
c_button: &classData{ c_button: &classData{
name: "BUTTON", name: toUTF16("BUTTON"),
style: _BS_PUSHBUTTON | controlstyle, style: _BS_PUSHBUTTON | controlstyle,
xstyle: 0 | controlxstyle, xstyle: 0 | controlxstyle,
}, },
c_checkbox: &classData{ c_checkbox: &classData{
name: "BUTTON", name: toUTF16("BUTTON"),
style: _BS_AUTOCHECKBOX | controlstyle, style: _BS_AUTOCHECKBOX | controlstyle,
xstyle: 0 | controlxstyle, xstyle: 0 | controlxstyle,
}, },
c_combobox: &classData{ c_combobox: &classData{
name: "COMBOBOX", name: toUTF16("COMBOBOX"),
style: _CBS_DROPDOWNLIST | _WS_VSCROLL | controlstyle, style: _CBS_DROPDOWNLIST | _WS_VSCROLL | controlstyle,
xstyle: 0 | controlxstyle, xstyle: 0 | controlxstyle,
altStyle: _CBS_DROPDOWN | _CBS_AUTOHSCROLL | _WS_VSCROLL | controlstyle, altStyle: _CBS_DROPDOWN | _CBS_AUTOHSCROLL | _WS_VSCROLL | controlstyle,
@ -74,7 +74,7 @@ var classTypes = [nctypes]*classData{
lenMsg: _CB_GETCOUNT, lenMsg: _CB_GETCOUNT,
}, },
c_lineedit: &classData{ c_lineedit: &classData{
name: "EDIT", name: toUTF16("EDIT"),
// WS_EX_CLIENTEDGE without WS_BORDER will apply visual styles // WS_EX_CLIENTEDGE without WS_BORDER will apply visual styles
// thanks to MindChild in irc.efnet.net/#winprog // thanks to MindChild in irc.efnet.net/#winprog
style: _ES_AUTOHSCROLL | controlstyle, style: _ES_AUTOHSCROLL | controlstyle,
@ -82,14 +82,14 @@ var classTypes = [nctypes]*classData{
altStyle: _ES_PASSWORD | _ES_AUTOHSCROLL | controlstyle, altStyle: _ES_PASSWORD | _ES_AUTOHSCROLL | controlstyle,
}, },
c_label: &classData{ c_label: &classData{
name: "STATIC", name: toUTF16("STATIC"),
// SS_NOPREFIX avoids accelerator translation; SS_LEFTNOWORDWRAP clips text past the end // SS_NOPREFIX avoids accelerator translation; SS_LEFTNOWORDWRAP clips text past the end
// TODO find out if the default behavior is not to ellipsize // TODO find out if the default behavior is not to ellipsize
style: _SS_NOPREFIX | _SS_LEFTNOWORDWRAP | controlstyle, style: _SS_NOPREFIX | _SS_LEFTNOWORDWRAP | controlstyle,
xstyle: 0 | controlxstyle, xstyle: 0 | controlxstyle,
}, },
c_listbox: &classData{ c_listbox: &classData{
name: "LISTBOX", name: toUTF16("LISTBOX"),
// we don't use LBS_STANDARD because it sorts (and has WS_BORDER; see above) // we don't use LBS_STANDARD because it sorts (and has WS_BORDER; see above)
// LBS_NOINTEGRALHEIGHT gives us exactly the size we want // LBS_NOINTEGRALHEIGHT gives us exactly the size we want
// LBS_MULTISEL sounds like it does what we want but it actually doesn't; instead, it toggles item selection regardless of modifier state, which doesn't work like anything else (see http://msdn.microsoft.com/en-us/library/windows/desktop/bb775149%28v=vs.85%29.aspx and http://msdn.microsoft.com/en-us/library/windows/desktop/aa511485.aspx) // LBS_MULTISEL sounds like it does what we want but it actually doesn't; instead, it toggles item selection regardless of modifier state, which doesn't work like anything else (see http://msdn.microsoft.com/en-us/library/windows/desktop/bb775149%28v=vs.85%29.aspx and http://msdn.microsoft.com/en-us/library/windows/desktop/aa511485.aspx)
@ -105,13 +105,13 @@ var classTypes = [nctypes]*classData{
lenMsg: _LB_GETCOUNT, lenMsg: _LB_GETCOUNT,
}, },
c_progressbar: &classData{ c_progressbar: &classData{
name: x_PROGRESS_CLASS, name: toUTF16(x_PROGRESS_CLASS),
style: _PBS_SMOOTH | controlstyle, style: _PBS_SMOOTH | controlstyle,
xstyle: 0 | controlxstyle, xstyle: 0 | controlxstyle,
doNotLoadFont: true, doNotLoadFont: true,
}, },
c_area: &classData{ c_area: &classData{
name: areaWndClass, name: toUTF16(areaWndClass),
style: areastyle, style: areastyle,
xstyle: areaxstyle, xstyle: areaxstyle,
storeSysData: true, storeSysData: true,
@ -136,6 +136,11 @@ func (s *sysData) delChild(id _HMENU) {
delete(s.children, id) delete(s.children, id)
} }
var (
_blankString = toUTF16("")
blankString = utf16ToArg(_blankString)
)
func (s *sysData) make(window *sysData) (err error) { func (s *sysData) make(window *sysData) (err error) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
@ -158,8 +163,8 @@ func (s *sysData) make(window *sysData) (err error) {
call: _createWindowEx, call: _createWindowEx,
p: []uintptr{ p: []uintptr{
uintptr(ct.xstyle), uintptr(ct.xstyle),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(ct.name))), utf16ToArg(ct.name),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(""))), // we set the window text later blankString, // we set the window text later
style, style,
negConst(_CW_USEDEFAULT), negConst(_CW_USEDEFAULT),
negConst(_CW_USEDEFAULT), negConst(_CW_USEDEFAULT),
@ -261,13 +266,14 @@ func (s *sysData) hide() {
} }
func (s *sysData) setText(text string) { func (s *sysData) setText(text string) {
ptext := toUTF16(text)
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _setWindowText, call: _setWindowText,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), utf16ToArg(ptext),
}, },
ret: ret, ret: ret,
} }
@ -341,6 +347,7 @@ func (s *sysData) text() (str string) {
} }
func (s *sysData) append(what string) { func (s *sysData) append(what string) {
pwhat := toUTF16(what)
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
@ -349,7 +356,7 @@ func (s *sysData) append(what string) {
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(classTypes[s.ctype].appendMsg), uintptr(classTypes[s.ctype].appendMsg),
uintptr(_WPARAM(0)), uintptr(_WPARAM(0)),
uintptr(_LPARAM(unsafe.Pointer(syscall.StringToUTF16Ptr(what)))), utf16ToLPARAM(pwhat),
}, },
ret: ret, ret: ret,
} }
@ -362,6 +369,7 @@ func (s *sysData) append(what string) {
} }
func (s *sysData) insertBefore(what string, index int) { func (s *sysData) insertBefore(what string, index int) {
pwhat := toUTF16(what)
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
@ -370,7 +378,7 @@ func (s *sysData) insertBefore(what string, index int) {
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(classTypes[s.ctype].insertBeforeMsg), uintptr(classTypes[s.ctype].insertBeforeMsg),
uintptr(_WPARAM(index)), uintptr(_WPARAM(index)),
uintptr(_LPARAM(unsafe.Pointer(syscall.StringToUTF16Ptr(what)))), utf16ToLPARAM(pwhat),
}, },
ret: ret, ret: ret,
} }