| /* |
| * Interface code to CAPTION widget |
| * |
| * Copyright Martin Ayotte, 1994 |
| * |
| */ |
| |
| /* |
| #define DEBUG_CAPTION |
| */ |
| |
| static char Copyright[] = "Copyright Martin Ayotte, 1994"; |
| |
| #include <X11/Intrinsic.h> |
| #include <X11/StringDefs.h> |
| #include "windows.h" |
| #include "caption.h" |
| #include "heap.h" |
| #include "win.h" |
| #include <sys/types.h> |
| #include <dirent.h> |
| #include <sys/stat.h> |
| |
| HBITMAP hStdClose = (HBITMAP)NULL; |
| HBITMAP hStdCloseD = (HBITMAP)NULL; |
| HBITMAP hStdMinim = (HBITMAP)NULL; |
| HBITMAP hStdMinimD = (HBITMAP)NULL; |
| HBITMAP hStdMaxim = (HBITMAP)NULL; |
| HBITMAP hStdMaximD = (HBITMAP)NULL; |
| HMENU hStdSysMenu = (HMENU)NULL; |
| |
| LPHEADCAPTION CaptionBarGetWindowAndStorage(HWND hWnd, WND **wndPtr); |
| LPHEADCAPTION CaptionBarGetStorageHeader(HWND hWnd); |
| void SetMenuLogicalParent(HMENU hMenu, HWND hWnd); |
| |
| |
| /*********************************************************************** |
| * CaptionBarWndProc |
| */ |
| LONG CaptionBarWndProc( HWND hWnd, WORD message, WORD wParam, LONG lParam ) |
| { |
| WORD wRet; |
| short x, y; |
| short width, height; |
| WND *wndPtr; |
| LPHEADCAPTION lphs; |
| PAINTSTRUCT ps; |
| HDC hDC; |
| HDC hMemDC; |
| BITMAP bm; |
| RECT rect; |
| char str[128]; |
| switch(message) |
| { |
| case WM_CREATE: |
| wndPtr = WIN_FindWndPtr(hWnd); |
| lphs = (LPHEADCAPTION)malloc(sizeof(HEADCAPTION)); |
| if (lphs == 0) { |
| printf("Bad Memory Alloc on CAPTIONBAR !\n"); |
| return 0; |
| } |
| memset(lphs, 0, sizeof(HEADCAPTION)); |
| #ifdef DEBUG_CAPTION |
| printf("CreateCaptionBarStruct %lX !\n", lphs); |
| #endif |
| *((LPHEADCAPTION *)&wndPtr->wExtra[1]) = lphs; |
| if (hStdClose == (HBITMAP)NULL) |
| hStdClose = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CLOSE)); |
| lphs->hClose = hStdClose; |
| if (hStdMinim == (HBITMAP)NULL) |
| hStdMinim = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_REDUCE)); |
| lphs->hMinim = hStdMinim; |
| if (hStdMaxim == (HBITMAP)NULL) |
| hStdMaxim = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RESTORE)); |
| lphs->hMaxim = hStdMaxim; |
| if (hStdCloseD == (HBITMAP)NULL) |
| hStdCloseD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CLOSE)); |
| if (hStdMinimD == (HBITMAP)NULL) |
| hStdMinimD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_REDUCED)); |
| if (hStdMaximD == (HBITMAP)NULL) |
| hStdMaximD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RESTORED)); |
| if (hStdSysMenu == (HBITMAP)NULL) |
| hStdSysMenu = LoadMenu((HINSTANCE)NULL, "SYSMENU"); |
| lphs->hSysMenu = hStdSysMenu; |
| printf("CaptionBar SYSMENU %04X !\n", lphs->hSysMenu); |
| if (lphs->hSysMenu == 0) lphs->hSysMenu = CreatePopupMenu(); |
| AppendMenu(lphs->hSysMenu, MF_STRING, 9999, "About &Wine ..."); |
| GetClientRect(hWnd, &rect); |
| CopyRect(&lphs->rectClose, &rect); |
| CopyRect(&lphs->rectMaxim, &rect); |
| lphs->rectClose.right = lphs->rectClose.left + |
| lphs->rectClose.bottom + lphs->rectClose.top; |
| lphs->rectMaxim.left = lphs->rectMaxim.right - |
| lphs->rectMaxim.bottom + lphs->rectMaxim.top; |
| CopyRect(&lphs->rectMinim, &lphs->rectMaxim); |
| if (lphs->hMaxim != 0) { |
| lphs->rectMinim.left = lphs->rectMaxim.bottom + lphs->rectMaxim.top; |
| lphs->rectMinim.right = lphs->rectMaxim.bottom + lphs->rectMaxim.top; |
| } |
| if (lphs->hClose == 0) lphs->rectClose.right = lphs->rectClose.left; |
| printf("CAPTION Close.right=%d Maxim.left=%d Minim.left=%d !\n", |
| lphs->rectClose.right, lphs->rectMaxim.left, lphs->rectMinim.left); |
| return 0; |
| case WM_DESTROY: |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| if (lphs == 0) return 0; |
| #ifdef DEBUG_CAPTION |
| printf("CaptionBar WM_DESTROY %lX !\n", lphs); |
| #endif |
| DestroyMenu(lphs->hSysMenu); |
| free(lphs); |
| *((LPHEADCAPTION *)&wndPtr->wExtra[1]) = 0; |
| return 0; |
| case WM_COMMAND: |
| #ifdef DEBUG_CAPTION |
| printf("CaptionBar WM_COMMAND %04X %08X !\n", wParam, lParam); |
| #endif |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| if (wParam == 9999) { |
| printf("CaptionBar Show 'About Wine ...' !\n"); |
| } |
| SendMessage(wndPtr->hwndParent, message, wParam, lParam); |
| break; |
| case WM_SIZE: |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| width = LOWORD(lParam); |
| height = HIWORD(lParam); |
| if (lphs->hClose != 0) |
| SetRect(&lphs->rectClose, 0, 0, height, height); |
| if (lphs->hMinim != 0) { |
| if (lphs->hMaxim != 0) |
| SetRect(&lphs->rectMinim, width - 2 * height, 0, |
| width - height, height); |
| else |
| SetRect(&lphs->rectMinim, width - height, 0, width, height); |
| } |
| if (lphs->hMaxim != 0) |
| SetRect(&lphs->rectMaxim, width - height, 0, width, height); |
| break; |
| case WM_LBUTTONDOWN: |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| SetCapture(hWnd); |
| x = LOWORD(lParam); |
| y = HIWORD(lParam); |
| hDC = GetDC(hWnd); |
| if (x > lphs->rectClose.left && x < lphs->rectClose.right) { |
| lphs->hClose = hStdCloseD; |
| InvalidateRect(hWnd, &lphs->rectClose, TRUE); |
| UpdateWindow(hWnd); |
| } |
| if (x > lphs->rectMinim.left && x < lphs->rectMinim.right) { |
| lphs->hMinim = hStdMinimD; |
| InvalidateRect(hWnd, &lphs->rectMinim, TRUE); |
| UpdateWindow(hWnd); |
| } |
| if (x > lphs->rectMaxim.left && x < lphs->rectMaxim.right && |
| lphs->hMaxim != 0) { |
| lphs->hMaxim = hStdMaximD; |
| InvalidateRect(hWnd, &lphs->rectMaxim, TRUE); |
| UpdateWindow(hWnd); |
| } |
| ReleaseDC(hWnd, hDC); |
| break; |
| case WM_LBUTTONUP: |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| ReleaseCapture(); |
| #ifdef DEBUG_CAPTION |
| printf("CaptionBar WM_LBUTTONUP %lX !\n", lParam); |
| #endif |
| x = LOWORD(lParam); |
| y = HIWORD(lParam); |
| if (x > lphs->rectClose.left && x < lphs->rectClose.right) { |
| lphs->hClose = hStdClose; |
| InvalidateRect(hWnd, &lphs->rectClose, TRUE); |
| UpdateWindow(hWnd); |
| TrackPopupMenu(lphs->hSysMenu, TPM_LEFTBUTTON, 0, -20, |
| 0, wndPtr->hwndParent, (LPRECT)NULL); |
| SetMenuLogicalParent(lphs->hSysMenu, hWnd); |
| printf("CAPTION Pop the SYSMENU !\n"); |
| break; |
| } |
| if (x > lphs->rectMinim.left && x < lphs->rectMinim.right) { |
| SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_MINIMIZE, 0L); |
| lphs->hMinim = hStdMinim; |
| InvalidateRect(hWnd, &lphs->rectMinim, TRUE); |
| UpdateWindow(hWnd); |
| printf("CAPTION Minimize Window !\n"); |
| break; |
| } |
| if (x > lphs->rectMaxim.left && x < lphs->rectMaxim.right) { |
| lphs->hMaxim = hStdMaxim; |
| InvalidateRect(hWnd, &lphs->rectMaxim, TRUE); |
| UpdateWindow(hWnd); |
| SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_MAXIMIZE, 0L); |
| printf("CAPTION Maximize Window !\n"); |
| break; |
| } |
| break; |
| |
| case WM_LBUTTONDBLCLK: |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| #ifdef DEBUG_CAPTION |
| printf("CaptionBar WM_LBUTTONDBLCLK %lX !\n", lParam); |
| #endif |
| x = LOWORD(lParam); |
| y = HIWORD(lParam); |
| if (x > lphs->rectClose.left && x < lphs->rectClose.right) { |
| SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_CLOSE, 0L); |
| printf("CAPTION DoubleClick Close Window !\n"); |
| break; |
| } |
| break; |
| |
| case WM_KEYDOWN: |
| case WM_KEYUP: |
| case WM_CHAR: |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| return(SendMessage(wndPtr->hwndParent, message, wParam, lParam)); |
| |
| case WM_PAINT: |
| GetWindowRect(hWnd, &rect); |
| #ifdef DEBUG_CAPTION |
| printf("CaptionBar WM_PAINT left=%d top=%d right=%d bottom=%d !\n", |
| rect.left, rect.top, rect.right, rect.bottom); |
| #endif |
| lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr); |
| hDC = BeginPaint(hWnd, &ps); |
| hMemDC = CreateCompatibleDC(hDC); |
| if (lphs->hClose != 0) { |
| GetObject(lphs->hClose, sizeof(BITMAP), (LPSTR)&bm); |
| SelectObject(hMemDC, lphs->hClose); |
| BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); |
| } |
| if (lphs->hMinim != 0) { |
| GetObject(lphs->hMinim, sizeof(BITMAP), (LPSTR)&bm); |
| SelectObject(hMemDC, lphs->hMinim); |
| BitBlt(hDC, lphs->rectMinim.left, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); |
| } |
| if (lphs->hMaxim != 0) { |
| GetObject(lphs->hMaxim, sizeof(BITMAP), (LPSTR)&bm); |
| SelectObject(hMemDC, lphs->hMaxim); |
| BitBlt(hDC, lphs->rectMaxim.left, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); |
| } |
| DeleteDC(hMemDC); |
| GetClientRect(hWnd, &rect); |
| FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH)); |
| rect.left = lphs->rectClose.right; |
| rect.right = lphs->rectMinim.left; |
| #ifdef DEBUG_CAPTION |
| printf("CaptionBar WM_PAINT left=%d top=%d right=%d bottom=%d !\n", |
| rect.left, rect.top, rect.right, rect.bottom); |
| #endif |
| FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH)); |
| if (GetWindowTextLength(wndPtr->hwndParent) > 0) { |
| GetWindowText(wndPtr->hwndParent, str, sizeof(str)); |
| width = GetTextExtent(hDC, str, strlen(str)); |
| DrawText(hDC, str, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); |
| } |
| EndPaint(hWnd, &ps); |
| break; |
| default: |
| return DefWindowProc( hWnd, message, wParam, lParam ); |
| } |
| return(0); |
| } |
| |
| |
| |
| LPHEADCAPTION CaptionBarGetWindowAndStorage(HWND hWnd, WND **wndPtr) |
| { |
| WND *Ptr; |
| LPHEADCAPTION lphs; |
| *(wndPtr) = Ptr = WIN_FindWndPtr(hWnd); |
| if (Ptr == 0) { |
| printf("Bad Window handle on CaptionBar !\n"); |
| return 0; |
| } |
| lphs = *((LPHEADCAPTION *)&Ptr->wExtra[1]); |
| return lphs; |
| } |
| |
| |
| LPHEADCAPTION CaptionBarGetStorageHeader(HWND hWnd) |
| { |
| WND *wndPtr; |
| LPHEADCAPTION lphs; |
| wndPtr = WIN_FindWndPtr(hWnd); |
| if (wndPtr == 0) { |
| printf("Bad Window handle on CaptionBar !\n"); |
| return 0; |
| } |
| lphs = *((LPHEADCAPTION *)&wndPtr->wExtra[1]); |
| return lphs; |
| } |
| |
| |