More go fmt.

This commit is contained in:
Pietro Gagliardi 2014-06-10 10:14:35 -04:00
parent 43b3f1c2a8
commit 94f9684e68
1 changed files with 178 additions and 178 deletions

View File

@ -4,127 +4,127 @@ package ui
import ( import (
"fmt" "fmt"
"sync"
"syscall" "syscall"
"unsafe" "unsafe"
"sync"
) )
type sysData struct { type sysData struct {
cSysData cSysData
hwnd _HWND hwnd _HWND
children map[_HMENU]*sysData children map[_HMENU]*sysData
nextChildID _HMENU nextChildID _HMENU
childrenLock sync.Mutex childrenLock sync.Mutex
isMarquee bool // for sysData.setProgress() isMarquee bool // for sysData.setProgress()
// unlike with GTK+ and Mac OS X, we're responsible for sizing Area properly ourselves // unlike with GTK+ and Mac OS X, we're responsible for sizing Area properly ourselves
areawidth int areawidth int
areaheight int areaheight int
clickCounter clickCounter clickCounter clickCounter
lastfocus _HWND lastfocus _HWND
} }
type classData struct { type classData struct {
name *uint16 name *uint16
style uint32 style uint32
xstyle uint32 xstyle uint32
altStyle uint32 altStyle uint32
storeSysData bool storeSysData bool
doNotLoadFont bool doNotLoadFont bool
appendMsg uintptr appendMsg uintptr
insertBeforeMsg uintptr insertBeforeMsg uintptr
deleteMsg uintptr deleteMsg uintptr
selectedIndexMsg uintptr selectedIndexMsg uintptr
selectedIndexErr uintptr selectedIndexErr uintptr
addSpaceErr uintptr addSpaceErr uintptr
lenMsg uintptr lenMsg uintptr
} }
const controlstyle = _WS_CHILD | _WS_VISIBLE | _WS_TABSTOP const controlstyle = _WS_CHILD | _WS_VISIBLE | _WS_TABSTOP
const controlxstyle = 0 const controlxstyle = 0
var classTypes = [nctypes]*classData{ var classTypes = [nctypes]*classData{
c_window: &classData{ c_window: &classData{
name: stdWndClass, name: 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: toUTF16("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: toUTF16("BUTTON"), name: toUTF16("BUTTON"),
// don't use BS_AUTOCHECKBOX because http://blogs.msdn.com/b/oldnewthing/archive/2014/05/22/10527522.aspx // don't use BS_AUTOCHECKBOX because http://blogs.msdn.com/b/oldnewthing/archive/2014/05/22/10527522.aspx
style: _BS_CHECKBOX | controlstyle, style: _BS_CHECKBOX | controlstyle,
xstyle: 0 | controlxstyle, xstyle: 0 | controlxstyle,
}, },
c_combobox: &classData{ c_combobox: &classData{
name: toUTF16("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,
appendMsg: _CB_ADDSTRING, appendMsg: _CB_ADDSTRING,
insertBeforeMsg: _CB_INSERTSTRING, insertBeforeMsg: _CB_INSERTSTRING,
deleteMsg: _CB_DELETESTRING, deleteMsg: _CB_DELETESTRING,
selectedIndexMsg: _CB_GETCURSEL, selectedIndexMsg: _CB_GETCURSEL,
selectedIndexErr: negConst(_CB_ERR), selectedIndexErr: negConst(_CB_ERR),
addSpaceErr: negConst(_CB_ERRSPACE), addSpaceErr: negConst(_CB_ERRSPACE),
lenMsg: _CB_GETCOUNT, lenMsg: _CB_GETCOUNT,
}, },
c_lineedit: &classData{ c_lineedit: &classData{
name: toUTF16("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,
xstyle: _WS_EX_CLIENTEDGE | controlxstyle, xstyle: _WS_EX_CLIENTEDGE | controlxstyle,
altStyle: _ES_PASSWORD | _ES_AUTOHSCROLL | controlstyle, altStyle: _ES_PASSWORD | _ES_AUTOHSCROLL | controlstyle,
}, },
c_label: &classData{ c_label: &classData{
name: toUTF16("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
// controls are vertically aligned to the top by default (thanks Xeek in irc.freenode.net/#winapi) // controls are vertically aligned to the top by default (thanks Xeek in irc.freenode.net/#winapi)
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: toUTF16("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)
style: _LBS_NOTIFY | _LBS_NOINTEGRALHEIGHT | _WS_VSCROLL | controlstyle, style: _LBS_NOTIFY | _LBS_NOINTEGRALHEIGHT | _WS_VSCROLL | controlstyle,
xstyle: _WS_EX_CLIENTEDGE | controlxstyle, xstyle: _WS_EX_CLIENTEDGE | controlxstyle,
altStyle: _LBS_EXTENDEDSEL | _LBS_NOTIFY | _LBS_NOINTEGRALHEIGHT | _WS_VSCROLL | controlstyle, altStyle: _LBS_EXTENDEDSEL | _LBS_NOTIFY | _LBS_NOINTEGRALHEIGHT | _WS_VSCROLL | controlstyle,
appendMsg: _LB_ADDSTRING, appendMsg: _LB_ADDSTRING,
insertBeforeMsg: _LB_INSERTSTRING, insertBeforeMsg: _LB_INSERTSTRING,
deleteMsg: _LB_DELETESTRING, deleteMsg: _LB_DELETESTRING,
selectedIndexMsg: _LB_GETCURSEL, selectedIndexMsg: _LB_GETCURSEL,
selectedIndexErr: negConst(_LB_ERR), selectedIndexErr: negConst(_LB_ERR),
addSpaceErr: negConst(_LB_ERRSPACE), addSpaceErr: negConst(_LB_ERRSPACE),
lenMsg: _LB_GETCOUNT, lenMsg: _LB_GETCOUNT,
}, },
c_progressbar: &classData{ c_progressbar: &classData{
name: toUTF16(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: areaWndClass,
style: areastyle, style: areastyle,
xstyle: areaxstyle, xstyle: areaxstyle,
storeSysData: true, storeSysData: true,
doNotLoadFont: true, doNotLoadFont: true,
}, },
} }
func (s *sysData) addChild(child *sysData) _HMENU { func (s *sysData) addChild(child *sysData) _HMENU {
s.childrenLock.Lock() s.childrenLock.Lock()
defer s.childrenLock.Unlock() defer s.childrenLock.Unlock()
s.nextChildID++ // start at 1 s.nextChildID++ // start at 1
if s.children == nil { if s.children == nil {
s.children = map[_HMENU]*sysData{} s.children = map[_HMENU]*sysData{}
} }
@ -140,7 +140,7 @@ func (s *sysData) delChild(id _HMENU) {
var ( var (
_blankString = toUTF16("") _blankString = toUTF16("")
blankString = utf16ToArg(_blankString) blankString = utf16ToArg(_blankString)
) )
func (s *sysData) make(window *sysData) (err error) { func (s *sysData) make(window *sysData) (err error) {
@ -149,7 +149,7 @@ func (s *sysData) make(window *sysData) (err error) {
ct := classTypes[s.ctype] ct := classTypes[s.ctype]
cid := _HMENU(0) cid := _HMENU(0)
pwin := uintptr(_NULL) pwin := uintptr(_NULL)
if window != nil { // this is a child control if window != nil { // this is a child control
cid = window.addChild(s) cid = window.addChild(s)
pwin = uintptr(window.hwnd) pwin = uintptr(window.hwnd)
} }
@ -162,11 +162,11 @@ func (s *sysData) make(window *sysData) (err error) {
lpParam = uintptr(unsafe.Pointer(s)) lpParam = uintptr(unsafe.Pointer(s))
} }
uitask <- &uimsg{ uitask <- &uimsg{
call: _createWindowEx, call: _createWindowEx,
p: []uintptr{ p: []uintptr{
uintptr(ct.xstyle), uintptr(ct.xstyle),
utf16ToArg(ct.name), utf16ToArg(ct.name),
blankString, // 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),
@ -177,30 +177,30 @@ func (s *sysData) make(window *sysData) (err error) {
uintptr(hInstance), uintptr(hInstance),
lpParam, lpParam,
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == 0 { // failure if r.ret == 0 { // failure
if window != nil { if window != nil {
window.delChild(cid) window.delChild(cid)
} }
return fmt.Errorf("error actually creating window/control: %v", r.err) return fmt.Errorf("error actually creating window/control: %v", r.err)
} }
if !ct.storeSysData { // regular control; store s.hwnd ourselves if !ct.storeSysData { // regular control; store s.hwnd ourselves
s.hwnd = _HWND(r.ret) s.hwnd = _HWND(r.ret)
} else if s.hwnd != _HWND(r.ret) { // we store sysData in storeSysData(); sanity check } else if s.hwnd != _HWND(r.ret) { // we store sysData in storeSysData(); sanity check
panic(fmt.Errorf("hwnd mismatch creating window/control: storeSysData() stored 0x%X but CreateWindowEx() returned 0x%X", s.hwnd, ret)) panic(fmt.Errorf("hwnd mismatch creating window/control: storeSysData() stored 0x%X but CreateWindowEx() returned 0x%X", s.hwnd, ret))
} }
if !ct.doNotLoadFont { if !ct.doNotLoadFont {
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_WM_SETFONT), uintptr(_WM_SETFONT),
uintptr(_WPARAM(controlFont)), uintptr(_WPARAM(controlFont)),
uintptr(_LPARAM(_TRUE)), uintptr(_LPARAM(_TRUE)),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
} }
@ -218,21 +218,21 @@ func (s *sysData) firstShow() error {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _showWindow, call: _showWindow,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(nCmdShow), uintptr(nCmdShow),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
uitask <- &uimsg{ uitask <- &uimsg{
call: _updateWindow, call: _updateWindow,
p: []uintptr{uintptr(s.hwnd)}, p: []uintptr{uintptr(s.hwnd)},
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == 0 { // failure if r.ret == 0 { // failure
return fmt.Errorf("error updating window for the first time: %v", r.err) return fmt.Errorf("error updating window for the first time: %v", r.err)
} }
return nil return nil
@ -242,12 +242,12 @@ func (s *sysData) show() {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _showWindow, call: _showWindow,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_SW_SHOW), uintptr(_SW_SHOW),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
} }
@ -256,12 +256,12 @@ func (s *sysData) hide() {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _showWindow, call: _showWindow,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_SW_HIDE), uintptr(_SW_HIDE),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
} }
@ -271,15 +271,15 @@ func (s *sysData) setText(text string) {
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),
utf16ToArg(ptext), utf16ToArg(ptext),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == 0 { // failure if r.ret == 0 { // failure
panic(fmt.Errorf("error setting window/control text: %v", r.err)) panic(fmt.Errorf("error setting window/control text: %v", r.err))
} }
} }
@ -292,7 +292,7 @@ func (s *sysData) setRect(x int, y int, width int, height int, winheight int) er
uintptr(width), uintptr(width),
uintptr(height), uintptr(height),
uintptr(_TRUE)) uintptr(_TRUE))
if r1 == 0 { // failure if r1 == 0 { // failure
return fmt.Errorf("error setting window/control rect: %v", err) return fmt.Errorf("error setting window/control rect: %v", err)
} }
return nil return nil
@ -302,14 +302,14 @@ func (s *sysData) isChecked() bool {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_BM_GETCHECK), uintptr(_BM_GETCHECK),
uintptr(0), uintptr(0),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
return r.ret == _BST_CHECKED return r.ret == _BST_CHECKED
@ -321,27 +321,27 @@ func (s *sysData) text() (str string) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_WM_GETTEXTLENGTH), uintptr(_WM_GETTEXTLENGTH),
uintptr(0), uintptr(0),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
length := r.ret + 1 // terminating null length := r.ret + 1 // terminating null
tc = make([]uint16, length) tc = make([]uint16, length)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_WM_GETTEXT), uintptr(_WM_GETTEXT),
uintptr(_WPARAM(length)), uintptr(_WPARAM(length)),
uintptr(_LPARAM(unsafe.Pointer(&tc[0]))), uintptr(_LPARAM(unsafe.Pointer(&tc[0]))),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
return syscall.UTF16ToString(tc) return syscall.UTF16ToString(tc)
@ -352,14 +352,14 @@ func (s *sysData) append(what string) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(classTypes[s.ctype].appendMsg), uintptr(classTypes[s.ctype].appendMsg),
uintptr(_WPARAM(0)), uintptr(_WPARAM(0)),
utf16ToLPARAM(pwhat), utf16ToLPARAM(pwhat),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) { if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) {
@ -374,14 +374,14 @@ func (s *sysData) insertBefore(what string, index int) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(classTypes[s.ctype].insertBeforeMsg), uintptr(classTypes[s.ctype].insertBeforeMsg),
uintptr(_WPARAM(index)), uintptr(_WPARAM(index)),
utf16ToLPARAM(pwhat), utf16ToLPARAM(pwhat),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) { if r.ret == uintptr(classTypes[s.ctype].addSpaceErr) {
@ -395,24 +395,24 @@ func (s *sysData) selectedIndex() int {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(classTypes[s.ctype].selectedIndexMsg), uintptr(classTypes[s.ctype].selectedIndexMsg),
uintptr(_WPARAM(0)), uintptr(_WPARAM(0)),
uintptr(_LPARAM(0)), uintptr(_LPARAM(0)),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) { // no selection or manually entered text (apparently, for the latter) if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) { // no selection or manually entered text (apparently, for the latter)
return -1 return -1
} }
return int(r.ret) return int(r.ret)
} }
func (s *sysData) selectedIndices() []int { func (s *sysData) selectedIndices() []int {
if !s.alternate { // single-selection list box; use single-selection method if !s.alternate { // single-selection list box; use single-selection method
index := s.selectedIndex() index := s.selectedIndex()
if index == -1 { if index == -1 {
return nil return nil
@ -423,32 +423,32 @@ func (s *sysData) selectedIndices() []int {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_LB_GETSELCOUNT), uintptr(_LB_GETSELCOUNT),
uintptr(0), uintptr(0),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == negConst(_LB_ERR) { if r.ret == negConst(_LB_ERR) {
panic("UI library internal error: LB_ERR from LB_GETSELCOUNT in what we know is a multi-selection listbox") panic("UI library internal error: LB_ERR from LB_GETSELCOUNT in what we know is a multi-selection listbox")
} }
if r.ret == 0 { // nothing selected if r.ret == 0 { // nothing selected
return nil return nil
} }
indices := make([]int, r.ret) indices := make([]int, r.ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_LB_GETSELITEMS), uintptr(_LB_GETSELITEMS),
uintptr(_WPARAM(r.ret)), uintptr(_WPARAM(r.ret)),
uintptr(_LPARAM(unsafe.Pointer(&indices[0]))), uintptr(_LPARAM(unsafe.Pointer(&indices[0]))),
}, },
ret: ret, ret: ret,
} }
r = <-ret r = <-ret
if r.ret == negConst(_LB_ERR) { if r.ret == negConst(_LB_ERR) {
@ -464,14 +464,14 @@ func (s *sysData) selectedTexts() []string {
strings := make([]string, len(indices)) strings := make([]string, len(indices))
for i, v := range indices { for i, v := range indices {
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_LB_GETTEXTLEN), uintptr(_LB_GETTEXTLEN),
uintptr(_WPARAM(v)), uintptr(_WPARAM(v)),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == negConst(_LB_ERR) { if r.ret == negConst(_LB_ERR) {
@ -479,14 +479,14 @@ func (s *sysData) selectedTexts() []string {
} }
str := make([]uint16, r.ret) str := make([]uint16, r.ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_LB_GETTEXT), uintptr(_LB_GETTEXT),
uintptr(_WPARAM(v)), uintptr(_WPARAM(v)),
uintptr(_LPARAM(unsafe.Pointer(&str[0]))), uintptr(_LPARAM(unsafe.Pointer(&str[0]))),
}, },
ret: ret, ret: ret,
} }
r = <-ret r = <-ret
if r.ret == negConst(_LB_ERR) { if r.ret == negConst(_LB_ERR) {
@ -503,12 +503,12 @@ func (s *sysData) setWindowSize(width int, height int) error {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _getClientRect, call: _getClientRect,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(unsafe.Pointer(&rect)), uintptr(unsafe.Pointer(&rect)),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == 0 { if r.ret == 0 {
@ -526,14 +526,14 @@ func (s *sysData) delete(index int) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(classTypes[s.ctype].deleteMsg), uintptr(classTypes[s.ctype].deleteMsg),
uintptr(_WPARAM(index)), uintptr(_WPARAM(index)),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) { if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) {
@ -545,27 +545,27 @@ func (s *sysData) setIndeterminate() {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _setWindowLongPtr, call: _setWindowLongPtr,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
negConst(_GWL_STYLE), negConst(_GWL_STYLE),
uintptr(classTypes[s.ctype].style | _PBS_MARQUEE), uintptr(classTypes[s.ctype].style | _PBS_MARQUEE),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == 0 { if r.ret == 0 {
panic(fmt.Errorf("error setting progress bar style to enter indeterminate mode: %v", r.err)) panic(fmt.Errorf("error setting progress bar style to enter indeterminate mode: %v", r.err))
} }
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_PBM_SETMARQUEE), uintptr(_PBM_SETMARQUEE),
uintptr(_WPARAM(_TRUE)), uintptr(_WPARAM(_TRUE)),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
s.isMarquee = true s.isMarquee = true
@ -581,24 +581,24 @@ func (s *sysData) setProgress(percent int) {
if s.isMarquee { if s.isMarquee {
// turn off marquee before switching back // turn off marquee before switching back
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(_PBM_SETMARQUEE), uintptr(_PBM_SETMARQUEE),
uintptr(_WPARAM(_FALSE)), uintptr(_WPARAM(_FALSE)),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
uitask <- &uimsg{ uitask <- &uimsg{
call: _setWindowLongPtr, call: _setWindowLongPtr,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
negConst(_GWL_STYLE), negConst(_GWL_STYLE),
uintptr(classTypes[s.ctype].style), uintptr(classTypes[s.ctype].style),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == 0 { if r.ret == 0 {
@ -608,14 +608,14 @@ func (s *sysData) setProgress(percent int) {
} }
send := func(msg uintptr, n int, l _LPARAM) { send := func(msg uintptr, n int, l _LPARAM) {
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
msg, msg,
uintptr(_WPARAM(n)), uintptr(_WPARAM(n)),
uintptr(l), uintptr(l),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
} }
@ -627,7 +627,7 @@ func (s *sysData) setProgress(percent int) {
if percent == 100 { if percent == 100 {
send(_PBM_SETRANGE32, 0, 101) send(_PBM_SETRANGE32, 0, 101)
} }
send(_PBM_SETPOS, percent + 1, 0) send(_PBM_SETPOS, percent+1, 0)
send(_PBM_SETPOS, percent, 0) send(_PBM_SETPOS, percent, 0)
if percent == 100 { if percent == 100 {
send(_PBM_SETRANGE32, 0, 100) send(_PBM_SETRANGE32, 0, 100)
@ -638,14 +638,14 @@ func (s *sysData) len() int {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(classTypes[s.ctype].lenMsg), uintptr(classTypes[s.ctype].lenMsg),
uintptr(_WPARAM(0)), uintptr(_WPARAM(0)),
uintptr(_LPARAM(0)), uintptr(_LPARAM(0)),
}, },
ret: ret, ret: ret,
} }
r := <-ret r := <-ret
if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) { if r.ret == uintptr(classTypes[s.ctype].selectedIndexErr) {
@ -658,14 +658,14 @@ func (s *sysData) setAreaSize(width int, height int) {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(msgSetAreaSize), uintptr(msgSetAreaSize),
uintptr(width), // WPARAM is UINT_PTR on Windows XP and newer at least, so we're good with this uintptr(width), // WPARAM is UINT_PTR on Windows XP and newer at least, so we're good with this
uintptr(height), uintptr(height),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
} }
@ -674,14 +674,14 @@ func (s *sysData) repaintAll() {
ret := make(chan uiret) ret := make(chan uiret)
defer close(ret) defer close(ret)
uitask <- &uimsg{ uitask <- &uimsg{
call: _sendMessage, call: _sendMessage,
p: []uintptr{ p: []uintptr{
uintptr(s.hwnd), uintptr(s.hwnd),
uintptr(msgRepaintAll), uintptr(msgRepaintAll),
uintptr(0), uintptr(0),
uintptr(0), uintptr(0),
}, },
ret: ret, ret: ret,
} }
<-ret <-ret
} }