summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-07-17 22:47:04 -0400
committerPietro Gagliardi <[email protected]>2014-07-17 22:47:04 -0400
commit29b80f7542423c74e320c847a81874f457c957e3 (patch)
tree33a60314a9b9339e54d96b9c3c835dd9a52f83a6
parent2c025a97efe8f9b15af6af643126f75085e75476 (diff)
Migrated sizing_windows.go to C.
-rw-r--r--redo/sizing_windows.c37
-rw-r--r--redo/sizing_windows.go52
-rw-r--r--redo/winapi_windows.h6
3 files changed, 56 insertions, 39 deletions
diff --git a/redo/sizing_windows.c b/redo/sizing_windows.c
new file mode 100644
index 0000000..0b1620b
--- /dev/null
+++ b/redo/sizing_windows.c
@@ -0,0 +1,37 @@
+/* 17 july 2014 */
+
+#include "winapi_windows.h"
+
+HDC getDC(HWND hwnd)
+{
+ HDC dc;
+
+ dc = GetDC(hwnd);
+ if (dc == NULL)
+ xpanic("error getting DC for preferred size calculations", GetLastError());
+/* TODO */
+ /* TODO save for restoring later */
+/*
+ if (SelectObject(dc, controlFont) == NULL)
+ xpanic("error loading control font into device context for preferred size calculation", GetLastError());
+*/
+ return dc;
+}
+
+void releaseDC(HWND hwnd, HDC dc)
+{
+ if (ReleaseDC(hwnd, dc) == 0)
+ xpanic("error releasing DC for preferred size calculations", GetLastError());
+}
+
+void getTextMetricsW(HDC dc, TEXTMETRICW *tm)
+{
+ if (GetTextMetricsW(dc, tm) == 0)
+ xpanic("error getting text metrics for preferred size calculations", GetLastError());
+}
+
+void moveWindow(HWND hwnd, int x, int y, int width, int height)
+{
+ if (MoveWindow(hwnd, x, y, width, height, TRUE) == 0)
+ xpanic("error setting window/control rect", GetLastError());
+}
diff --git a/redo/sizing_windows.go b/redo/sizing_windows.go
index 7455dc0..ede3101 100644
--- a/redo/sizing_windows.go
+++ b/redo/sizing_windows.go
@@ -6,6 +6,9 @@ import (
"fmt"
)
+// #include "winapi_windows.h"
+import "C"
+
type sizing struct {
sizingbase
@@ -25,23 +28,20 @@ const (
func (w *window) beginResize() (d *sizing) {
d = new(sizing)
- dc := getTextDC(w.hwnd)
- defer releaseTextDC(w.hwnd, dc)
+ dc := C.getDC(w.hwnd)
+ defer C.releaseDC(w.hwnd, dc)
- var tm s_TEXTMETRICW
+ var tm C.TEXTMETRICW
- res, err := f_GetTextMetricsW(dc, &tm)
- if res == 0 {
- panic(fmt.Errorf("error getting text metrics for preferred size calculations: %v", err))
- }
+ C.getTextMetricsW(dc, &tm)
d.baseX = int(tm.tmAveCharWidth) // TODO not optimal; third reference below has better way
d.baseY = int(tm.tmHeight)
if w.spaced {
- d.xmargin = f_MulDiv(marginDialogUnits, d.baseX, 4)
- d.ymargin = f_MulDiv(marginDialogUnits, d.baseY, 8)
- d.xpadding = f_MulDiv(paddingDialogUnits, d.baseX, 4)
- d.ypadding = f_MulDiv(paddingDialogUnits, d.baseY, 8)
+ d.xmargin = int(C.MulDiv(marginDialogUnits, d.baseX, 4))
+ d.ymargin = int(C.MulDiv(marginDialogUnits, d.baseY, 8))
+ d.xpadding = int(C.MulDiv(paddingDialogUnits, d.baseX, 4))
+ d.ypadding = int(C.MulDiv(paddingDialogUnits, d.baseY, 8))
}
return d
@@ -75,14 +75,11 @@ func (w *widgetbase) commitResize(c *allocation, d *sizing) {
yoff = stdDlgSizes[s.ctype].yoffalt
}
if yoff != 0 {
- yoff = f_MulDiv(yoff, d.baseY, 8)
+ yoff = int(C.MulDiv(yoff, d.baseY, 8))
}
c.y += yoff
*/
- res, err := f_MoveWindow(w.hwnd, c.x, c.y, c.width, c.height, c_TRUE)
- if res == 0 {
- panic(fmt.Errorf("error setting window/control rect: %v", err))
- }
+ C.moveWindow(w.hwnd, int(c.x), int(c.y), int(c.width), int(c.height))
}
func (w *widgetbase) getAuxResizeInfo(d *sizing) {
@@ -160,29 +157,6 @@ var stdDlgSizes = [nctypes]dlgunits{
}
*/
-func getTextDC(hwnd uintptr) (dc uintptr) {
- dc, err := f_GetDC(hwnd)
- if dc == hNULL {
- panic(fmt.Errorf("error getting DC for preferred size calculations: %v", err))
- }
-// TODO
-/*
- // TODO save so it can be restored later
- res, err = f_SelectObject(dc, controlFont)
- if res == hNULL {
- panic(fmt.Errorf("error loading control font into device context for preferred size calculation: %v", err))
- }
-*/
- return dc
-}
-
-func releaseTextDC(hwnd uintptr, dc uintptr) {
- res, err := f_ReleaseDC(hwnd, dc)
- if res == 0 {
- panic(fmt.Errorf("error releasing DC for preferred size calculations: %v", err))
- }
-}
-
func (w *widgetbase) preferredSize(d *sizing) (width int, height int) {
// TODO
/*
diff --git a/redo/winapi_windows.h b/redo/winapi_windows.h
index e99cf86..1dce454 100644
--- a/redo/winapi_windows.h
+++ b/redo/winapi_windows.h
@@ -45,3 +45,9 @@ extern int nCmdShow;
extern HICON hDefaultIcon;
extern HCURSOR hArrowCursor;
extern DWORD initWindows(char **);
+
+/* sizing_windows.c */
+extern HDC getDC(HWND);
+extern void releaseDC(HWND, HDC);
+extern void getTextMetricsW(HDC, TEXTMETRICW *);
+extern void moveWindow(HWND, int, int, int, int);