[tekui-devel] tekui: Windows display driver now provides most basic functionality

Timm S. Mueller tmueller at schulze-mueller.de
Sun Mar 15 23:00:01 CET 2009


details:   http://hg.teklib.org/tekui/rev/db91666256b7
changeset: 55:db91666256b7
user:      Timm S. Mueller <tmueller at schulze-mueller.de>
date:      Sun Mar 15 22:50:42 2009 +0100
description:
Windows display driver now provides most basic functionality

diffs (truncated from 963 to 100 lines):

diff -r d0ef472e2599 -r db91666256b7 src/display_windows/display_win_api.c
--- a/src/display_windows/display_win_api.c	Sat Mar 14 22:04:48 2009 +0100
+++ b/src/display_windows/display_win_api.c	Sun Mar 15 22:50:42 2009 +0100
@@ -30,8 +30,10 @@
 		RECT wrect;
 		BITMAPINFOHEADER *bmi;
 		TUINT style;
+		TUINT exstyle;
 		TIMSG *imsg;
 		const char *classname;
+		TSTRPTR title;
 
 		win = TAlloc0(mod->fbd_MemMgr, sizeof(WINWINDOW));
 		if (win == TNULL)
@@ -48,36 +50,61 @@
 		win->fbv_Borderless = TGetTag(tags, TVisual_Borderless, TFALSE);
 		win->fbv_UserData = TGetTag(tags, TVisual_UserData, TNULL);
 
+		win->fbv_MinWidth = (TINT) TGetTag(tags, TVisual_MinWidth, (TTAG) -1);
+		win->fbv_MinHeight = (TINT) TGetTag(tags, TVisual_MinHeight, (TTAG) -1);
+		win->fbv_MaxWidth = (TINT) TGetTag(tags, TVisual_MaxWidth, (TTAG) -1);
+		win->fbv_MaxHeight = (TINT) TGetTag(tags, TVisual_MaxHeight, (TTAG) -1);
+
 		if (win->fbv_Borderless)
 		{
-			style = WS_OVERLAPPEDWINDOW;
-			classname = FB_DISPLAY_CLASSNAME; /* TODO: own class */
+			style = (WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS) & ~WS_BORDER;
+			classname = FB_DISPLAY_CLASSNAME_POPUP;
+			title = NULL;
+			exstyle = WS_EX_TOPMOST | WS_EX_TOOLWINDOW;
 		}
 		else
 		{
 			style = WS_OVERLAPPEDWINDOW;
 			classname = FB_DISPLAY_CLASSNAME;
+			title = win->fbv_Title;
+			exstyle = 0;
+		}
+
+		wrect.left = wrect.right = wrect.top = wrect.bottom = 0;
+		AdjustWindowRectEx(&wrect, style, FALSE, exstyle);
+		win->fbv_BorderWidth = wrect.right - wrect.left;
+		win->fbv_BorderHeight = wrect.bottom - wrect.top;
+		win->fbv_BorderLeft = -wrect.left;
+		win->fbv_BorderTop = -wrect.top;
+
+		if (!win->fbv_Borderless)
+		{
+			TINT m1, m2, m3, m4;
+			win_getminmax(win, &m1, &m2, &m3, &m4, TTRUE);
+			win->fbv_Width = TCLAMP(m1, win->fbv_Width, m3);
+			win->fbv_Height = TCLAMP(m2, win->fbv_Height, m4);
 		}
 
 		if (win->fbv_Left != 0xffffffff && win->fbv_Top != 0xffffffff)
 		{
 			wrect.left = win->fbv_Left;
 			wrect.top = win->fbv_Top;
-			wrect.right = win->fbv_Left + win->fbv_Width - 1;
-			wrect.bottom = win->fbv_Top + win->fbv_Height - 1;
-			if (!AdjustWindowRectEx(&wrect, style, FALSE, 0))
+			wrect.right = win->fbv_Left + win->fbv_Width;
+			wrect.bottom = win->fbv_Top + win->fbv_Height;
+			if (!AdjustWindowRectEx(&wrect, style, FALSE, exstyle))
 				break;
+
 			win->fbv_Left = wrect.left;
 			win->fbv_Top = wrect.top;
-			win->fbv_HWnd = CreateWindowEx(0, classname,
-				win->fbv_Title, style, win->fbv_Left, win->fbv_Top,
-				wrect.right - wrect.left + 1, wrect.bottom - wrect.top + 1,
+			win->fbv_HWnd = CreateWindowEx(exstyle, classname,
+				title, style, win->fbv_Left, win->fbv_Top,
+				wrect.right - wrect.left, wrect.bottom - wrect.top,
 				(HWND) NULL, (HMENU) NULL, mod->fbd_HInst, (LPVOID) NULL);
 		}
 		else
 		{
-			win->fbv_HWnd = CreateWindowEx(0, classname,
-				win->fbv_Title, style, CW_USEDEFAULT, CW_USEDEFAULT,
+			win->fbv_HWnd = CreateWindowEx(exstyle, classname,
+				title, style, CW_USEDEFAULT, CW_USEDEFAULT,
 				win->fbv_Width, win->fbv_Height,
 				(HWND) NULL, (HMENU) NULL, mod->fbd_HInst, (LPVOID) NULL);
 		}
@@ -86,10 +113,10 @@
 			break;
 
 		GetWindowRect(win->fbv_HWnd, &wrect);
-		win->fbv_Left = wrect.left;
-		win->fbv_Top = wrect.top;
-		win->fbv_Width = wrect.right - wrect.left + 1;
-		win->fbv_Height = wrect.bottom - wrect.top + 1;
+		win->fbv_Left = wrect.left + win->fbv_BorderLeft;
+		win->fbv_Top = wrect.top + win->fbv_BorderHeight;
+		win->fbv_Width = wrect.right - wrect.left - win->fbv_BorderWidth;
+		win->fbv_Height = wrect.bottom - wrect.top - win->fbv_BorderHeight;
 
 		SetWindowLong(win->fbv_HWnd, GWL_USERDATA, (LONG) win);


More information about the tekui-devel mailing list