From ffa1bbe0b91a8c812ddcea5c5d65e55f60d07f33 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Mon, 30 Jun 2014 22:48:12 -0400 Subject: Restored the previous new API. I'm going to change it so that events are callbacks rather than using a window handler, but other than that... yeah. --- sysdata_windows.go | 594 +++++++++++++++++++++-------------------------------- 1 file changed, 232 insertions(+), 362 deletions(-) (limited to 'sysdata_windows.go') diff --git a/sysdata_windows.go b/sysdata_windows.go index 504b715..1d3541a 100644 --- a/sysdata_windows.go +++ b/sysdata_windows.go @@ -148,58 +148,52 @@ var ( ) func (s *sysData) make(window *sysData) (err error) { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - ct := classTypes[s.ctype] - cid := _HMENU(0) - pwin := uintptr(_NULL) - if window != nil { // this is a child control - cid = window.addChild(s) - pwin = uintptr(window.hwnd) - } - style := uintptr(ct.style) - if s.alternate { - style = uintptr(ct.altStyle) - } - lpParam := uintptr(_NULL) - if ct.storeSysData { - lpParam = uintptr(unsafe.Pointer(s)) - } - r1, _, err := _createWindowEx.Call( - uintptr(ct.xstyle), - utf16ToArg(ct.name), - blankString, // we set the window text later - style, - negConst(_CW_USEDEFAULT), - negConst(_CW_USEDEFAULT), - negConst(_CW_USEDEFAULT), - negConst(_CW_USEDEFAULT), - pwin, - uintptr(cid), - uintptr(hInstance), - lpParam) - if r1 == 0 { // failure - if window != nil { - window.delChild(cid) - } - panic(fmt.Errorf("error actually creating window/control: %v", err)) - } - if !ct.storeSysData { // regular control; store s.hwnd ourselves - s.hwnd = _HWND(r1) - } else if s.hwnd != _HWND(r1) { // 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, r1)) - } - if !ct.doNotLoadFont { - _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_WM_SETFONT), - uintptr(_WPARAM(controlFont)), - uintptr(_LPARAM(_TRUE))) + ct := classTypes[s.ctype] + cid := _HMENU(0) + pwin := uintptr(_NULL) + if window != nil { // this is a child control + cid = window.addChild(s) + pwin = uintptr(window.hwnd) + } + style := uintptr(ct.style) + if s.alternate { + style = uintptr(ct.altStyle) + } + lpParam := uintptr(_NULL) + if ct.storeSysData { + lpParam = uintptr(unsafe.Pointer(s)) + } + r1, _, err := _createWindowEx.Call( + uintptr(ct.xstyle), + utf16ToArg(ct.name), + blankString, // we set the window text later + style, + negConst(_CW_USEDEFAULT), + negConst(_CW_USEDEFAULT), + negConst(_CW_USEDEFAULT), + negConst(_CW_USEDEFAULT), + pwin, + uintptr(cid), + uintptr(hInstance), + lpParam) + if r1 == 0 { // failure + if window != nil { + window.delChild(cid) } - ret <- struct{}{} + panic(fmt.Errorf("error actually creating window/control: %v", err)) + } + if !ct.storeSysData { // regular control; store s.hwnd ourselves + s.hwnd = _HWND(r1) + } else if s.hwnd != _HWND(r1) { // 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, r1)) + } + if !ct.doNotLoadFont { + _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_WM_SETFONT), + uintptr(_WPARAM(controlFont)), + uintptr(_LPARAM(_TRUE))) } - <-ret return nil } @@ -211,63 +205,38 @@ var ( // ShowWindow(hwnd, nCmdShow); // UpdateWindow(hwnd); func (s *sysData) firstShow() error { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - _showWindow.Call( - uintptr(s.hwnd), - uintptr(nCmdShow)) - r1, _, err := _updateWindow.Call(uintptr(s.hwnd)) - if r1 == 0 { // failure - panic(fmt.Errorf("error updating window for the first time: %v", err)) - } - ret <- struct{}{} + _showWindow.Call( + uintptr(s.hwnd), + uintptr(nCmdShow)) + r1, _, err := _updateWindow.Call(uintptr(s.hwnd)) + if r1 == 0 { // failure + panic(fmt.Errorf("error updating window for the first time: %v", err)) } - <-ret return nil } func (s *sysData) show() { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - _showWindow.Call( - uintptr(s.hwnd), - uintptr(_SW_SHOW)) - ret <- struct{}{} - } - <-ret + _showWindow.Call( + uintptr(s.hwnd), + uintptr(_SW_SHOW)) } func (s *sysData) hide() { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - _showWindow.Call( - uintptr(s.hwnd), - uintptr(_SW_HIDE)) - ret <- struct{}{} - } - <-ret + _showWindow.Call( + uintptr(s.hwnd), + uintptr(_SW_HIDE)) } func (s *sysData) setText(text string) { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - ptext := toUTF16(text) - r1, _, err := _setWindowText.Call( - uintptr(s.hwnd), - utf16ToArg(ptext)) - if r1 == 0 { // failure - panic(fmt.Errorf("error setting window/control text: %v", err)) - } - ret <- struct{}{} + ptext := toUTF16(text) + r1, _, err := _setWindowText.Call( + uintptr(s.hwnd), + utf16ToArg(ptext)) + if r1 == 0 { // failure + panic(fmt.Errorf("error setting window/control text: %v", err)) } - <-ret } -// runs on uitask func (s *sysData) setRect(x int, y int, width int, height int, winheight int) error { r1, _, err := _moveWindow.Call( uintptr(s.hwnd), @@ -283,84 +252,61 @@ func (s *sysData) setRect(x int, y int, width int, height int, winheight int) er } func (s *sysData) isChecked() bool { - ret := make(chan bool) - defer close(ret) - uitask <- func() { - r1, _, _ := _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_BM_GETCHECK), - uintptr(0), - uintptr(0)) - ret <- r1 == _BST_CHECKED - } - return <-ret + r1, _, _ := _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_BM_GETCHECK), + uintptr(0), + uintptr(0)) + return r1 == _BST_CHECKED } func (s *sysData) text() (str string) { - ret := make(chan string) - defer close(ret) - uitask <- func() { - var tc []uint16 + var tc []uint16 - r1, _, _ := _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_WM_GETTEXTLENGTH), - uintptr(0), - uintptr(0)) - length := r1 + 1 // terminating null - tc = make([]uint16, length) - _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_WM_GETTEXT), - uintptr(_WPARAM(length)), - uintptr(_LPARAM(unsafe.Pointer(&tc[0])))) - ret <- syscall.UTF16ToString(tc) - } - return <-ret + r1, _, _ := _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_WM_GETTEXTLENGTH), + uintptr(0), + uintptr(0)) + length := r1 + 1 // terminating null + tc = make([]uint16, length) + _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_WM_GETTEXT), + uintptr(_WPARAM(length)), + uintptr(_LPARAM(unsafe.Pointer(&tc[0])))) + return syscall.UTF16ToString(tc) } func (s *sysData) append(what string) { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - pwhat := toUTF16(what) - r1, _, err := _sendMessage.Call( - uintptr(s.hwnd), - uintptr(classTypes[s.ctype].appendMsg), - uintptr(_WPARAM(0)), - utf16ToLPARAM(pwhat)) - if r1 == uintptr(classTypes[s.ctype].addSpaceErr) { - panic(fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", err)) - } else if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { - panic(fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", err)) - } - ret <- struct{}{} + pwhat := toUTF16(what) + r1, _, err := _sendMessage.Call( + uintptr(s.hwnd), + uintptr(classTypes[s.ctype].appendMsg), + uintptr(_WPARAM(0)), + utf16ToLPARAM(pwhat)) + if r1 == uintptr(classTypes[s.ctype].addSpaceErr) { + panic(fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", err)) + } else if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { + panic(fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", err)) } - <-ret } func (s *sysData) insertBefore(what string, index int) { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - pwhat := toUTF16(what) - r1, _, err := _sendMessage.Call( - uintptr(s.hwnd), - uintptr(classTypes[s.ctype].insertBeforeMsg), - uintptr(_WPARAM(index)), - utf16ToLPARAM(pwhat)) - if r1 == uintptr(classTypes[s.ctype].addSpaceErr) { - panic(fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", err)) - } else if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { - panic(fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", err)) - } - ret <- struct{}{} + pwhat := toUTF16(what) + r1, _, err := _sendMessage.Call( + uintptr(s.hwnd), + uintptr(classTypes[s.ctype].insertBeforeMsg), + uintptr(_WPARAM(index)), + utf16ToLPARAM(pwhat)) + if r1 == uintptr(classTypes[s.ctype].addSpaceErr) { + panic(fmt.Errorf("out of space adding item to combobox/listbox (last error: %v)", err)) + } else if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { + panic(fmt.Errorf("failed to add item to combobox/listbox (last error: %v)", err)) } - <-ret } -// runs on uitask -func (s *sysData) doSelectedIndex() int { +func (s *sysData) selectedIndex() int { r1, _, _ := _sendMessage.Call( uintptr(s.hwnd), uintptr(classTypes[s.ctype].selectedIndexMsg), @@ -372,19 +318,9 @@ func (s *sysData) doSelectedIndex() int { return int(r1) } -func (s *sysData) selectedIndex() int { - ret := make(chan int) - defer close(ret) - uitask <- func() { - ret <- s.doSelectedIndex() - } - return <-ret -} - -// runs on uitask -func (s *sysData) doSelectedIndices() []int { +func (s *sysData) selectedIndices() []int { if !s.alternate { // single-selection list box; use single-selection method - index := s.doSelectedIndex() + index := s.selectedIndex() if index == -1 { return nil } @@ -414,107 +350,75 @@ func (s *sysData) doSelectedIndices() []int { return indices } -func (s *sysData) selectedIndices() []int { - ret := make(chan []int) - defer close(ret) - uitask <- func() { - ret <- s.doSelectedIndices() - } - return <-ret -} - func (s *sysData) selectedTexts() []string { - ret := make(chan []string) - defer close(ret) - uitask <- func() { - indices := s.doSelectedIndices() - strings := make([]string, len(indices)) - for i, v := range indices { - r1, _, err := _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_LB_GETTEXTLEN), - uintptr(_WPARAM(v)), - uintptr(0)) - if r1 == negConst(_LB_ERR) { - panic(fmt.Errorf("error: LB_ERR from LB_GETTEXTLEN in what we know is a valid listbox index (came from LB_GETSELITEMS): %v", err)) - } - str := make([]uint16, r1) - r1, _, err = _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_LB_GETTEXT), - uintptr(_WPARAM(v)), - uintptr(_LPARAM(unsafe.Pointer(&str[0])))) - if r1 == negConst(_LB_ERR) { - panic(fmt.Errorf("error: LB_ERR from LB_GETTEXT in what we know is a valid listbox index (came from LB_GETSELITEMS): %v", err)) - } - strings[i] = syscall.UTF16ToString(str) + indices := s.selectedIndices() + strings := make([]string, len(indices)) + for i, v := range indices { + r1, _, err := _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_LB_GETTEXTLEN), + uintptr(_WPARAM(v)), + uintptr(0)) + if r1 == negConst(_LB_ERR) { + panic(fmt.Errorf("error: LB_ERR from LB_GETTEXTLEN in what we know is a valid listbox index (came from LB_GETSELITEMS): %v", err)) + } + str := make([]uint16, r1) + r1, _, err = _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_LB_GETTEXT), + uintptr(_WPARAM(v)), + uintptr(_LPARAM(unsafe.Pointer(&str[0])))) + if r1 == negConst(_LB_ERR) { + panic(fmt.Errorf("error: LB_ERR from LB_GETTEXT in what we know is a valid listbox index (came from LB_GETSELITEMS): %v", err)) } - ret <- strings + strings[i] = syscall.UTF16ToString(str) } - return <-ret + return strings } func (s *sysData) setWindowSize(width int, height int) error { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - var rect _RECT + var rect _RECT - r1, _, err := _getClientRect.Call( - uintptr(s.hwnd), - uintptr(unsafe.Pointer(&rect))) - if r1 == 0 { - panic(fmt.Errorf("error getting upper-left of window for resize: %v", err)) - } - // TODO AdjustWindowRect() on the result - // 0 because (0,0) is top-left so no winheight - err = s.setRect(int(rect.left), int(rect.top), width, height, 0) - if err != nil { - panic(fmt.Errorf("error actually resizing window: %v", err)) - } - ret <- struct{}{} + r1, _, err := _getClientRect.Call( + uintptr(s.hwnd), + uintptr(unsafe.Pointer(&rect))) + if r1 == 0 { + panic(fmt.Errorf("error getting upper-left of window for resize: %v", err)) + } + // TODO AdjustWindowRect() on the result + // 0 because (0,0) is top-left so no winheight + err = s.setRect(int(rect.left), int(rect.top), width, height, 0) + if err != nil { + panic(fmt.Errorf("error actually resizing window: %v", err)) } - <-ret return nil } func (s *sysData) delete(index int) { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - r1, _, err := _sendMessage.Call( - uintptr(s.hwnd), - uintptr(classTypes[s.ctype].deleteMsg), - uintptr(_WPARAM(index)), - uintptr(0)) - if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { - panic(fmt.Errorf("failed to delete item from combobox/listbox (last error: %v)", err)) - } - ret <- struct{}{} + r1, _, err := _sendMessage.Call( + uintptr(s.hwnd), + uintptr(classTypes[s.ctype].deleteMsg), + uintptr(_WPARAM(index)), + uintptr(0)) + if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { + panic(fmt.Errorf("failed to delete item from combobox/listbox (last error: %v)", err)) } - <-ret } func (s *sysData) setIndeterminate() { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - r1, _, err := _setWindowLongPtr.Call( - uintptr(s.hwnd), - negConst(_GWL_STYLE), - uintptr(classTypes[s.ctype].style | _PBS_MARQUEE)) - if r1 == 0 { - panic(fmt.Errorf("error setting progress bar style to enter indeterminate mode: %v", err)) - } - _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_PBM_SETMARQUEE), - uintptr(_WPARAM(_TRUE)), - uintptr(0)) - s.isMarquee = true - ret <- struct{}{} + r1, _, err := _setWindowLongPtr.Call( + uintptr(s.hwnd), + negConst(_GWL_STYLE), + uintptr(classTypes[s.ctype].style | _PBS_MARQUEE)) + if r1 == 0 { + panic(fmt.Errorf("error setting progress bar style to enter indeterminate mode: %v", err)) } - <-ret + _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_PBM_SETMARQUEE), + uintptr(_WPARAM(_TRUE)), + uintptr(0)) + s.isMarquee = true } func (s *sysData) setProgress(percent int) { @@ -522,134 +426,100 @@ func (s *sysData) setProgress(percent int) { s.setIndeterminate() return } - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - if s.isMarquee { - // turn off marquee before switching back - _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_PBM_SETMARQUEE), - uintptr(_WPARAM(_FALSE)), - uintptr(0)) - r1, _, err := _setWindowLongPtr.Call( - uintptr(s.hwnd), - negConst(_GWL_STYLE), - uintptr(classTypes[s.ctype].style)) - if r1 == 0 { - panic(fmt.Errorf("error setting progress bar style to leave indeterminate mode (percent %d): %v", percent, err)) - } - s.isMarquee = false - } - send := func(msg uintptr, n int, l _LPARAM) { - _sendMessage.Call( - uintptr(s.hwnd), - msg, - uintptr(_WPARAM(n)), - uintptr(l)) - } - // Windows 7 has a non-disableable slowly-animating progress bar increment - // there isn't one for decrement, so we'll work around by going one higher and then lower again - // for the case where percent == 100, we need to increase the range temporarily - // sources: http://social.msdn.microsoft.com/Forums/en-US/61350dc7-6584-4c4e-91b0-69d642c03dae/progressbar-disable-smooth-animation http://stackoverflow.com/questions/2217688/windows-7-aero-theme-progress-bar-bug http://discuss.joelonsoftware.com/default.asp?dotnet.12.600456.2 http://stackoverflow.com/questions/22469876/progressbar-lag-when-setting-position-with-pbm-setpos http://stackoverflow.com/questions/6128287/tprogressbar-never-fills-up-all-the-way-seems-to-be-updating-too-fast - if percent == 100 { - send(_PBM_SETRANGE32, 0, 101) - } - send(_PBM_SETPOS, percent+1, 0) - send(_PBM_SETPOS, percent, 0) - if percent == 100 { - send(_PBM_SETRANGE32, 0, 100) + if s.isMarquee { + // turn off marquee before switching back + _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_PBM_SETMARQUEE), + uintptr(_WPARAM(_FALSE)), + uintptr(0)) + r1, _, err := _setWindowLongPtr.Call( + uintptr(s.hwnd), + negConst(_GWL_STYLE), + uintptr(classTypes[s.ctype].style)) + if r1 == 0 { + panic(fmt.Errorf("error setting progress bar style to leave indeterminate mode (percent %d): %v", percent, err)) } - ret <- struct{}{} + s.isMarquee = false + } + send := func(msg uintptr, n int, l _LPARAM) { + _sendMessage.Call( + uintptr(s.hwnd), + msg, + uintptr(_WPARAM(n)), + uintptr(l)) + } + // Windows 7 has a non-disableable slowly-animating progress bar increment + // there isn't one for decrement, so we'll work around by going one higher and then lower again + // for the case where percent == 100, we need to increase the range temporarily + // sources: http://social.msdn.microsoft.com/Forums/en-US/61350dc7-6584-4c4e-91b0-69d642c03dae/progressbar-disable-smooth-animation http://stackoverflow.com/questions/2217688/windows-7-aero-theme-progress-bar-bug http://discuss.joelonsoftware.com/default.asp?dotnet.12.600456.2 http://stackoverflow.com/questions/22469876/progressbar-lag-when-setting-position-with-pbm-setpos http://stackoverflow.com/questions/6128287/tprogressbar-never-fills-up-all-the-way-seems-to-be-updating-too-fast + if percent == 100 { + send(_PBM_SETRANGE32, 0, 101) + } + send(_PBM_SETPOS, percent+1, 0) + send(_PBM_SETPOS, percent, 0) + if percent == 100 { + send(_PBM_SETRANGE32, 0, 100) } - <-ret } func (s *sysData) len() int { - ret := make(chan int) - defer close(ret) - uitask <- func() { - r1, _, err := _sendMessage.Call( - uintptr(s.hwnd), - uintptr(classTypes[s.ctype].lenMsg), - uintptr(_WPARAM(0)), - uintptr(_LPARAM(0))) - if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { - panic(fmt.Errorf("unexpected error return from sysData.len(); GetLastError() says %v", err)) - } - ret <- int(r1) + r1, _, err := _sendMessage.Call( + uintptr(s.hwnd), + uintptr(classTypes[s.ctype].lenMsg), + uintptr(_WPARAM(0)), + uintptr(_LPARAM(0))) + if r1 == uintptr(classTypes[s.ctype].selectedIndexErr) { + panic(fmt.Errorf("unexpected error return from sysData.len(); GetLastError() says %v", err)) } - return <-ret + return int(r1) } func (s *sysData) setAreaSize(width int, height int) { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - _sendMessage.Call( - uintptr(s.hwnd), - uintptr(msgSetAreaSize), - uintptr(width), // WPARAM is UINT_PTR on Windows XP and newer at least, so we're good with this - uintptr(height)) - ret <- struct{}{} - } - <-ret + _sendMessage.Call( + uintptr(s.hwnd), + uintptr(msgSetAreaSize), + uintptr(width), // WPARAM is UINT_PTR on Windows XP and newer at least, so we're good with this + uintptr(height)) } func (s *sysData) repaintAll() { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - _sendMessage.Call( - uintptr(s.hwnd), - uintptr(msgRepaintAll), - uintptr(0), - uintptr(0)) - ret <- struct{}{} - } - <-ret + _sendMessage.Call( + uintptr(s.hwnd), + uintptr(msgRepaintAll), + uintptr(0), + uintptr(0)) } func (s *sysData) center() { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - var ws _RECT + var ws _RECT - r1, _, err := _getWindowRect.Call( - uintptr(s.hwnd), - uintptr(unsafe.Pointer(&ws))) - if r1 == 0 { - panic(fmt.Errorf("error getting window rect for sysData.center(): %v", err)) - } - // TODO should this be using the monitor functions instead? http://blogs.msdn.com/b/oldnewthing/archive/2005/05/05/414910.aspx - // error returns from GetSystemMetrics() is meaningless because the return value, 0, is still valid - dw, _, _ := _getSystemMetrics.Call(uintptr(_SM_CXFULLSCREEN)) - dh, _, _ := _getSystemMetrics.Call(uintptr(_SM_CYFULLSCREEN)) - ww := ws.right - ws.left - wh := ws.bottom - ws.top - wx := (int32(dw) / 2) - (ww / 2) - wy := (int32(dh) / 2) - (wh / 2) - s.setRect(int(wx), int(wy), int(ww), int(wh), 0) - ret <- struct{}{} + r1, _, err := _getWindowRect.Call( + uintptr(s.hwnd), + uintptr(unsafe.Pointer(&ws))) + if r1 == 0 { + panic(fmt.Errorf("error getting window rect for sysData.center(): %v", err)) } - <-ret + // TODO should this be using the monitor functions instead? http://blogs.msdn.com/b/oldnewthing/archive/2005/05/05/414910.aspx + // error returns from GetSystemMetrics() is meaningless because the return value, 0, is still valid + // TODO should this be using the client rect and not the window rect? + dw, _, _ := _getSystemMetrics.Call(uintptr(_SM_CXFULLSCREEN)) + dh, _, _ := _getSystemMetrics.Call(uintptr(_SM_CYFULLSCREEN)) + ww := ws.right - ws.left + wh := ws.bottom - ws.top + wx := (int32(dw) / 2) - (ww / 2) + wy := (int32(dh) / 2) - (wh / 2) + s.setRect(int(wx), int(wy), int(ww), int(wh), 0) } func (s *sysData) setChecked(checked bool) { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - c := uintptr(_BST_CHECKED) - if !checked { - c = uintptr(_BST_UNCHECKED) - } - _sendMessage.Call( - uintptr(s.hwnd), - uintptr(_BM_SETCHECK), - c, - uintptr(0)) - ret <- struct{}{} + c := uintptr(_BST_CHECKED) + if !checked { + c = uintptr(_BST_UNCHECKED) } - <-ret + _sendMessage.Call( + uintptr(s.hwnd), + uintptr(_BM_SETCHECK), + c, + uintptr(0)) } -- cgit v1.2.3