From 1eeadc000ae796bd022879196c4f2bae3bb189de Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Wed, 25 Jun 2014 23:21:57 -0400 Subject: [PATCH] Made the new sizing system work on Windows. --- area.go | 4 ++-- button.go | 2 +- checkbox.go | 2 +- combobox.go | 2 +- controlsize.go | 4 ++-- controlsize_windows.go | 18 +++++++++--------- grid.go | 2 +- label.go | 2 +- lineedit.go | 2 +- listbox.go | 2 +- progressbar.go | 2 +- stdwndclass_windows.go | 6 +++--- sysdata.go | 5 +---- window.go | 2 +- 14 files changed, 26 insertions(+), 29 deletions(-) diff --git a/area.go b/area.go index 211dea1..0871eef 100644 --- a/area.go +++ b/area.go @@ -350,8 +350,8 @@ func (a *Area) preferredSize(d *sysSizeData) (width int, height int) { return a.sysData.preferredSize(d) } -func (a *Area) commitResize(a *allocation, d *sysSizeData) { - a.sysData.preferredSize(a, d) +func (a *Area) commitResize(c *allocation, d *sysSizeData) { + a.sysData.commitResize(c, d) } func (a *Area) getAuxResizeInfo(d *sysSizeData) { diff --git a/button.go b/button.go index 1a352dd..96a68ed 100644 --- a/button.go +++ b/button.go @@ -80,7 +80,7 @@ func (b *Button) preferredSize(d *sysSizeData) (width int, height int) { } func (b *Button) commitResize(a *allocation, d *sysSizeData) { - b.sysData.preferredSize(a, d) + b.sysData.commitResize(a, d) } func (b *Button) getAuxResizeInfo(d *sysSizeData) { diff --git a/checkbox.go b/checkbox.go index 1f2ea58..d079e17 100644 --- a/checkbox.go +++ b/checkbox.go @@ -85,7 +85,7 @@ func (c *Checkbox) preferredSize(d *sysSizeData) (width int, height int) { } func (c *Checkbox) commitResize(a *allocation, d *sysSizeData) { - c.sysData.preferredSize(a, d) + c.sysData.commitResize(a, d) } func (c *Checkbox) getAuxResizeInfo(d *sysSizeData) { diff --git a/combobox.go b/combobox.go index 9298f87..83024ed 100644 --- a/combobox.go +++ b/combobox.go @@ -162,7 +162,7 @@ func (c *Combobox) preferredSize(d *sysSizeData) (width int, height int) { } func (c *Combobox) commitResize(a *allocation, d *sysSizeData) { - c.sysData.preferredSize(a, d) + c.sysData.commitResize(a, d) } func (c *Combobox) getAuxResizeInfo(d *sysSizeData) { diff --git a/controlsize.go b/controlsize.go index ff0973b..d0a5eaf 100644 --- a/controlsize.go +++ b/controlsize.go @@ -19,7 +19,7 @@ type cSysSizeData struct { } // for verification; see sysdata.go -type sysDataSizeFuncs interface { +type sysDataSizingFunctions interface { beginResize() *sysSizeData endResize(*sysSizeData) translateAllocationCoords([]*allocation, int, int) @@ -32,7 +32,7 @@ func (s *sysData) resizeWindow(width, height int) { d := s.beginResize() allocations := s.allocate(0, 0, width, height, d) s.translateAllocationCoords(allocations, width, height) - for _, c := range s.allocations { + for _, c := range allocations { c.this.commitResize(c, d) } s.endResize(d) diff --git a/controlsize_windows.go b/controlsize_windows.go index 3bb3ecb..6e1c860 100644 --- a/controlsize_windows.go +++ b/controlsize_windows.go @@ -21,15 +21,17 @@ type sysSizeData struct { const ( marginDialogUnits = 7 paddingDialogUnits = 4 -} +) func (s *sysData) beginResize() (d *sysSizeData) { d = new(sysSizeData) dc := getTextDC(s.hwnd) - defer releaseTextDC(dc) + defer releaseTextDC(s.hwnd, dc) - r1, _, err = _getTextMetrics.Call( + var tm _TEXTMETRICS + + r1, _, err := _getTextMetrics.Call( uintptr(dc), uintptr(unsafe.Pointer(&tm))) if r1 == 0 { // failure @@ -66,7 +68,7 @@ func (s *sysData) commitResize(c *allocation, d *sysSizeData) { } c.y += yoff // TODO move this here - s.setRect(c.x, c.y, c.width, c.height) + s.setRect(c.x, c.y, c.width, c.height, 0) } func (s *sysData) getAuxResizeInfo(d *sysSizeData) { @@ -150,8 +152,6 @@ var ( ) func getTextDC(hwnd _HWND) (dc _HANDLE) { - var tm _TEXTMETRICS - r1, _, err := _getDC.Call(uintptr(hwnd)) if r1 == 0 { // failure panic(fmt.Errorf("error getting DC for preferred size calculations: %v", err)) @@ -167,7 +167,7 @@ func getTextDC(hwnd _HWND) (dc _HANDLE) { } func releaseTextDC(hwnd _HWND, dc _HANDLE) { - r1, _, err = _releaseDC.Call( + r1, _, err := _releaseDC.Call( uintptr(hwnd), uintptr(dc)) if r1 == 0 { // failure @@ -179,7 +179,7 @@ func releaseTextDC(hwnd _HWND, dc _HANDLE) { func (s *sysData) preferredSize(d *sysSizeData) (width int, height int) { // the preferred size of an Area is its size if stdDlgSizes[s.ctype].area { - return s.areawidth, s.areaheight, 0 // no yoff for areas + return s.areawidth, s.areaheight } if msg := stdDlgSizes[s.ctype].getsize; msg != 0 { @@ -191,7 +191,7 @@ func (s *sysData) preferredSize(d *sysSizeData) (width int, height int) { uintptr(0), uintptr(unsafe.Pointer(&size))) if r1 != uintptr(_FALSE) { // success - return int(size.cx), int(size.cy), 0 // TODO + return int(size.cx), int(size.cy) } // otherwise the message approach failed, so fall back to the regular approach println("message failed; falling back") diff --git a/grid.go b/grid.go index 58a2dbb..a298834 100644 --- a/grid.go +++ b/grid.go @@ -184,7 +184,7 @@ _=ymargin w = g.colwidths[col] h = g.rowheights[row] } - as := c.allocation(x, y, w, h, d) + as := c.allocate(x, y, w, h, d) if current != nil { // connect first left to first right current.neighbor = c } diff --git a/label.go b/label.go index 6d9ed3b..ca17aca 100644 --- a/label.go +++ b/label.go @@ -89,7 +89,7 @@ func (l *Label) preferredSize(d *sysSizeData) (width int, height int) { } func (l *Label) commitResize(a *allocation, d *sysSizeData) { - l.sysData.preferredSize(a, d) + l.sysData.commitResize(a, d) } func (l *Label) getAuxResizeInfo(d *sysSizeData) { diff --git a/lineedit.go b/lineedit.go index 3e71db1..a45a443 100644 --- a/lineedit.go +++ b/lineedit.go @@ -83,7 +83,7 @@ func (l *LineEdit) preferredSize(d *sysSizeData) (width int, height int) { } func (l *LineEdit) commitResize(a *allocation, d *sysSizeData) { - l.sysData.preferredSize(a, d) + l.sysData.commitResize(a, d) } func (l *LineEdit) getAuxResizeInfo(d *sysSizeData) { diff --git a/listbox.go b/listbox.go index cd7aab1..fc57142 100644 --- a/listbox.go +++ b/listbox.go @@ -165,7 +165,7 @@ func (l *Listbox) preferredSize(d *sysSizeData) (width int, height int) { } func (l *Listbox) commitResize(a *allocation, d *sysSizeData) { - l.sysData.preferredSize(a, d) + l.sysData.commitResize(a, d) } func (l *Listbox) getAuxResizeInfo(d *sysSizeData) { diff --git a/progressbar.go b/progressbar.go index c2cd289..e7c7149 100644 --- a/progressbar.go +++ b/progressbar.go @@ -71,7 +71,7 @@ func (p *ProgressBar) preferredSize(d *sysSizeData) (width int, height int) { } func (p *ProgressBar) commitResize(a *allocation, d *sysSizeData) { - p.sysData.preferredSize(a, d) + p.sysData.commitResize(a, d) } func (p *ProgressBar) getAuxResizeInfo(d *sysSizeData) { diff --git a/stdwndclass_windows.go b/stdwndclass_windows.go index f907b43..9d6fc35 100644 --- a/stdwndclass_windows.go +++ b/stdwndclass_windows.go @@ -148,7 +148,7 @@ func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESUL _ = mm return 0 case _WM_SIZE: - if s.resize != nil { + if s.allocate != nil { var r _RECT r1, _, err := _getClientRect.Call( @@ -157,8 +157,8 @@ func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESUL if r1 == 0 { panic("GetClientRect failed: " + err.Error()) } - // top-left corner is (0,0) so no need for winheight - s.doResize(int(r.left), int(r.top), int(r.right-r.left), int(r.bottom-r.top), 0) + // top-left corner of a client rect is (0,0) so no need for left/top + s.resizeWindow(int(r.right), int(r.bottom)) // TODO use the Defer movement functions here? // TODO redraw window and all children here? } diff --git a/sysdata.go b/sysdata.go index 306fd81..10f2546 100644 --- a/sysdata.go +++ b/sysdata.go @@ -13,7 +13,7 @@ func newEvent() chan struct{} { type cSysData struct { ctype int event chan struct{} - resize func(x int, y int, width int, height int, rr *[]resizerequest) + allocate func(x int, y int, width int, height int, d *sysSizeData) []*allocation spaced bool alternate bool // editable for Combobox, multi-select for listbox, password for lineedit handler AreaHandler // for Areas @@ -75,8 +75,5 @@ func mksysdata(ctype int) *sysData { ctype: ctype, }, } - if ctype == c_window { // make resizes non-nil so it can be passed in - s.resizes = make([]resizerequest, 0, 0) - } return s } diff --git a/window.go b/window.go index 0ed65b6..8de638a 100644 --- a/window.go +++ b/window.go @@ -100,7 +100,7 @@ func (w *Window) Create(control Control) { panic(fmt.Errorf("error opening window: %v", err)) } if control != nil { - w.sysData.resize = control.setRect + w.sysData.allocate = control.allocate err = control.make(w.sysData) if err != nil { panic(fmt.Errorf("error adding window's control: %v", err))