LOCAL void fb_setattrs(WINDISPLAY *mod, struct TVRequest *req) { struct attrdata data; struct THook hook; WINWINDOW *win = req->tvr_Op.SetAttrs.Window; TINT neww, newh; data.v = win; data.num = 0; data.mod = mod; data.neww = -1; data.newh = -1; TInitHook(&hook, setattrfunc, &data); TForEachTag(req->tvr_Op.SetAttrs.Tags, &hook); req->tvr_Op.SetAttrs.Num = data.num; win_getminmax(win, &win->fbv_MinWidth, &win->fbv_MinHeight, &win->fbv_MaxWidth, &win->fbv_MaxHeight, TFALSE); neww = data.neww < 0 ? (TINT) win->fbv_Width : data.neww; newh = data.newh < 0 ? (TINT) win->fbv_Height : data.newh; if (neww < win->fbv_MinWidth || newh < win->fbv_MinHeight) { neww = TMAX(neww, win->fbv_MinWidth); newh = TMAX(newh, win->fbv_MinHeight); neww += win->fbv_BorderWidth; newh += win->fbv_BorderHeight; SetWindowPos(win->fbv_HWnd, NULL, 0, 0, neww, newh, SWP_NOMOVE); } }
LOCAL void fb_setattrs(WINDISPLAY *mod, struct TVRequest *req) { struct attrdata data; struct THook hook; WINWINDOW *win = req->tvr_Op.SetAttrs.Window; TINT noww, nowh, neww, newh, minw, minh; data.v = win; data.num = 0; data.mod = mod; data.neww = -1; data.newh = -1; TInitHook(&hook, setattrfunc, &data); EnterCriticalSection(&win->fbv_LockExtents); TForEachTag(req->tvr_Op.SetAttrs.Tags, &hook); win_getminmax(win, &win->fbv_MinWidth, &win->fbv_MinHeight, &win->fbv_MaxWidth, &win->fbv_MaxHeight, TFALSE); noww = (TINT) win->fbv_Width; nowh = (TINT) win->fbv_Height; minw = (TINT) win->fbv_MinWidth; minh = (TINT) win->fbv_MinHeight; LeaveCriticalSection(&win->fbv_LockExtents); neww = data.neww < 0 ? noww : data.neww; newh = data.newh < 0 ? nowh : data.newh; if (neww < minw || newh < minh) { neww = TMAX(neww, minw); newh = TMAX(newh, minh); neww += win->fbv_BorderWidth; newh += win->fbv_BorderHeight; SetWindowPos(win->fbv_HWnd, NULL, 0, 0, neww, newh, SWP_NOMOVE); } req->tvr_Op.SetAttrs.Num = data.num; }
static LRESULT CALLBACK win_wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { WINWINDOW *win = (WINWINDOW *) GetWindowLong(hwnd, GWL_USERDATA); WINDISPLAY *mod = win ? win->fbv_Display : TNULL; if (mod) { TIMSG *imsg; switch (uMsg) { default: TDBPRINTF(TDB_TRACE,("uMsg: %08x\n", uMsg)); break; case WM_CLOSE: if ((win->fbv_InputMask & TITYPE_CLOSE) && (fb_getimsg(mod, win, &imsg, TITYPE_CLOSE))) fb_sendimsg(mod, win, imsg); return 0; case WM_ERASEBKGND: return 0; case WM_GETMINMAXINFO: { LPMINMAXINFO mm = (LPMINMAXINFO) lParam; TINT m1, m2, m3, m4; win_getminmax(win, &m1, &m2, &m3, &m4, TTRUE); mm->ptMinTrackSize.x = m1; mm->ptMinTrackSize.y = m2; mm->ptMaxTrackSize.x = m3; mm->ptMaxTrackSize.y = m4; return 0; } case WM_PAINT: { PAINTSTRUCT ps; if (BeginPaint(win->fbv_HWnd, &ps)) { if ((win->fbv_InputMask & TITYPE_REFRESH) && (fb_getimsg(mod, win, &imsg, TITYPE_REFRESH))) { imsg->timsg_X = ps.rcPaint.left; imsg->timsg_Y = ps.rcPaint.top; imsg->timsg_Width = ps.rcPaint.right - ps.rcPaint.left; imsg->timsg_Height = ps.rcPaint.bottom - ps.rcPaint.top; TDBPRINTF(TDB_TRACE,("dirty: %d %d %d %d\n", imsg->timsg_X, imsg->timsg_Y, imsg->timsg_Width, imsg->timsg_Height)); fb_sendimsg(mod, win, imsg); } EndPaint(win->fbv_HWnd, &ps); } return 0; } case WM_ACTIVATE: #if 0 TDBPRINTF(TDB_INFO,("Window %p - Focus: %d\n", win, (LOWORD(wParam) != WA_INACTIVE))); if (!win->fbv_Borderless && (win->fbv_InputMask & TITYPE_FOCUS) && (fb_getimsg(mod, win, &imsg, TITYPE_FOCUS))) { imsg->timsg_Code = (LOWORD(wParam) != WA_INACTIVE); fb_sendimsg(mod, win, imsg); } #endif return 0; case WM_SIZE: win->fbv_Width = LOWORD(lParam); win->fbv_Height = HIWORD(lParam); if ((win->fbv_InputMask & TITYPE_NEWSIZE) && (fb_getimsg(mod, win, &imsg, TITYPE_NEWSIZE))) { imsg->timsg_Width = win->fbv_Width; imsg->timsg_Height = win->fbv_Height; fb_sendimsg(mod, win, imsg); } return 0; case WM_CAPTURECHANGED: TDBPRINTF(TDB_INFO,("Capture changed\n")); break; case WM_MOUSEMOVE: { TINT x = LOWORD(lParam); TINT y = HIWORD(lParam); win->fbv_MouseX = x; win->fbv_MouseY = y; if ((win->fbv_InputMask & TITYPE_MOUSEMOVE) && (fb_getimsg(mod, win, &imsg, TITYPE_MOUSEMOVE))) { imsg->timsg_MouseX = x; imsg->timsg_MouseY = y; fb_sendimsg(mod, win, imsg); } if (win->fbv_InputMask & TITYPE_MOUSEOVER) { POINT scrpos; GetCursorPos(&scrpos); // TDBPRINTF(20,("in window: %d\n", // (WindowFromPoint(scrpos) == win->fbv_HWnd))); #if 0 POINT scrpos; if (GetCapture() != win->fbv_HWnd) { SetCapture(win->fbv_HWnd); if (fb_getimsg(mod, win, &imsg, TITYPE_MOUSEOVER)) { imsg->timsg_Code = 1; TDBPRINTF(20,("Mouseover=true\n")); fb_sendimsg(mod, win, imsg); } } else { POINT scrpos; GetCursorPos(&scrpos); if ((WindowFromPoint(scrpos) != win->fbv_HWnd) || (x < 0) || (y < 0) || (x >= win->fbv_Width) || (y >= win->fbv_Height)) { ReleaseCapture(); if (fb_getimsg(mod, win, &imsg, TITYPE_MOUSEOVER)) { imsg->timsg_Code = 0; TDBPRINTF(20,("Mouseover=false\n")); fb_sendimsg(mod, win, imsg); } } } #endif } return 0; } case WM_LBUTTONDOWN: if ((win->fbv_InputMask & TITYPE_MOUSEBUTTON) && fb_getimsg(mod, win, &imsg, TITYPE_MOUSEBUTTON)) { imsg->timsg_Code = TMBCODE_LEFTDOWN; fb_sendimsg(mod, win, imsg); } return 0; case WM_LBUTTONUP: if ((win->fbv_InputMask & TITYPE_MOUSEBUTTON) && fb_getimsg(mod, win, &imsg, TITYPE_MOUSEBUTTON)) { imsg->timsg_Code = TMBCODE_LEFTUP; fb_sendimsg(mod, win, imsg); } return 0; case WM_RBUTTONDOWN: if ((win->fbv_InputMask & TITYPE_MOUSEBUTTON) && fb_getimsg(mod, win, &imsg, TITYPE_MOUSEBUTTON)) { imsg->timsg_Code = TMBCODE_RIGHTDOWN; fb_sendimsg(mod, win, imsg); } return 0; case WM_RBUTTONUP: if ((win->fbv_InputMask & TITYPE_MOUSEBUTTON) && fb_getimsg(mod, win, &imsg, TITYPE_MOUSEBUTTON)) { imsg->timsg_Code = TMBCODE_RIGHTUP; fb_sendimsg(mod, win, imsg); } return 0; case WM_MBUTTONDOWN: if ((win->fbv_InputMask & TITYPE_MOUSEBUTTON) && fb_getimsg(mod, win, &imsg, TITYPE_MOUSEBUTTON)) { imsg->timsg_Code = TMBCODE_MIDDLEDOWN; fb_sendimsg(mod, win, imsg); } return 0; case WM_MBUTTONUP: if ((win->fbv_InputMask & TITYPE_MOUSEBUTTON) && fb_getimsg(mod, win, &imsg, TITYPE_MOUSEBUTTON)) { imsg->timsg_Code = TMBCODE_MIDDLEUP; fb_sendimsg(mod, win, imsg); } return 0; case WM_SYSKEYDOWN: processkey(mod, win, TITYPE_KEYDOWN, 0); return 0; case WM_SYSKEYUP: processkey(mod, win, TITYPE_KEYUP, 0); return 0; case WM_KEYDOWN: processkey(mod, win, TITYPE_KEYDOWN, wParam); return 0; case WM_KEYUP: processkey(mod, win, TITYPE_KEYUP, wParam); return 0; case 0x020a: if (win->fbv_InputMask & TITYPE_MOUSEBUTTON) { TINT16 zdelta = (TINT16) HIWORD(wParam); if (zdelta != 0 && fb_getimsg(mod, win, &imsg, TITYPE_MOUSEBUTTON)) { imsg->timsg_Code = zdelta > 0 ? TMBCODE_WHEELUP : TMBCODE_WHEELDOWN; fb_sendimsg(mod, win, imsg); } } return 0; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
LOCAL void fb_openwindow(WINDISPLAY *mod, struct TVRequest *req) { struct TExecBase *TExecBase = TGetExecBase(mod); TTAGITEM *tags = req->tvr_Op.OpenWindow.Tags; WINWINDOW *win; req->tvr_Op.OpenWindow.Window = TNULL; for (;;) { 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) break; TInitList(&win->penlist); InitializeCriticalSection(&win->fbv_LockExtents); win->fbv_Width = (TUINT) TGetTag(tags, TVisual_Width, FB_DEF_WIDTH); win->fbv_Height = (TUINT) TGetTag(tags, TVisual_Height, FB_DEF_HEIGHT); win->fbv_Left = (TUINT) TGetTag(tags, TVisual_WinLeft, 0xffffffff); win->fbv_Top = (TUINT) TGetTag(tags, TVisual_WinTop, 0xffffffff); win->fbv_Title = (TSTRPTR) TGetTag(tags, TVisual_Title, (TTAG) "TEKlib Visual"); 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_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, (TINT) win->fbv_Width, m3); win->fbv_Height = TCLAMP(m2, (TINT) 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; 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(exstyle, classname, title, style, win->fbv_Left, win->fbv_Top, wrect.right - wrect.left - win->fbv_BorderWidth, wrect.bottom - wrect.top - win->fbv_BorderHeight, (HWND) NULL, (HMENU) NULL, mod->fbd_HInst, (LPVOID) NULL); } else { 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); } if (win->fbv_HWnd == TNULL) break; GetWindowRect(win->fbv_HWnd, &wrect); 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; SetWindowLongPtr(win->fbv_HWnd, GWLP_USERDATA, (LONG_PTR) win); win->fbv_HDC = GetDC(win->fbv_HWnd); win->fbv_Display = mod; win->fbv_InputMask = (TUINT) TGetTag(tags, TVisual_EventMask, 0); win->fbv_IMsgPort = req->tvr_Op.OpenWindow.IMsgPort; bmi = &win->fbv_DrawBitMap; bmi->biSize = sizeof(BITMAPINFOHEADER); bmi->biPlanes = 1; bmi->biBitCount = 32; bmi->biCompression = BI_RGB; bmi->biSizeImage = 0; bmi->biXPelsPerMeter = 1; bmi->biYPelsPerMeter = 1; bmi->biClrUsed = 0; bmi->biClrImportant = 0; TInitList(&win->fbv_IMsgQueue); req->tvr_Op.OpenWindow.Window = win; /* init default font */ win->fbv_CurrentFont = mod->fbd_FontManager.deffont; mod->fbd_FontManager.defref++; if (win->fbv_InputMask & TITYPE_INTERVAL) ++mod->fbd_NumInterval; /* register default font */ /*TDBPRINTF(TDB_TRACE,("Add window: %p\n", win->window));*/ /* add window on top of window stack: */ TAddHead(&mod->fbd_VisualList, &win->fbv_Node); SetBkMode(win->fbv_HDC, TRANSPARENT); ShowWindow(win->fbv_HWnd, SW_SHOWNORMAL); UpdateWindow(win->fbv_HWnd); if ((win->fbv_InputMask & TITYPE_FOCUS) && (fb_getimsg(mod, win, &imsg, TITYPE_FOCUS))) { imsg->timsg_Code = 1; TAddTail(&win->fbv_IMsgQueue, &imsg->timsg_Node); } if ((win->fbv_InputMask & TITYPE_REFRESH) && (fb_getimsg(mod, win, &imsg, TITYPE_REFRESH))) { imsg->timsg_X = 0; imsg->timsg_Y = 0; imsg->timsg_Width = win->fbv_Width; imsg->timsg_Height = win->fbv_Height; TAddTail(&win->fbv_IMsgQueue, &imsg->timsg_Node); } return; } TDBPRINTF(TDB_ERROR,("Window open failed\n")); fb_closeall(mod, win, TFALSE); }