/* * doMaximizeAll - maximize all children */ static void doMaximizeAll( HWND first ) { mdi_data *md; bool was_max; was_max = childrenMaximized; childrenMaximized = TRUE; doMaximize( first ); if( !was_max ) { md = mdiHead; while( md != NULL ) { if( md->hwnd != first ) { if( _wpi_isiconic( md->hwnd ) ) { doMaximize( md->hwnd ); } } md = md->next; } } SetSystemMenu( first ); } /* doMaximizeAll */
void Q3TitleBar::mouseReleaseEvent(QMouseEvent *e) { Q_D(Q3TitleBar); if (e->button() == Qt::LeftButton && d->pressed) { e->accept(); QStyleOptionTitleBar opt = d->getStyleOption(); QStyle::SubControl ctrl = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, e->pos(), this); d->pressed = false; if (ctrl == d->buttonDown) { d->buttonDown = QStyle::SC_None; repaint(); switch(ctrl) { case QStyle::SC_TitleBarShadeButton: case QStyle::SC_TitleBarUnshadeButton: if(d->flags & Qt::WindowShadeButtonHint) emit doShade(); break; case QStyle::SC_TitleBarNormalButton: if(d->flags & Qt::WindowMaximizeButtonHint) emit doNormal(); break; case QStyle::SC_TitleBarMinButton: if(d->flags & Qt::WindowMinimizeButtonHint) { if (d->window && d->window->isMinimized()) emit doNormal(); else emit doMinimize(); } break; case QStyle::SC_TitleBarMaxButton: if(d->flags & Qt::WindowMaximizeButtonHint) { if(d->window && d->window->isMaximized()) emit doNormal(); else emit doMaximize(); } break; case QStyle::SC_TitleBarCloseButton: if(d->flags & Qt::WindowSystemMenuHint) { d->buttonDown = QStyle::SC_None; repaint(); emit doClose(); return; } break; default: break; } } } else { e->ignore(); } }
bool KWM::isDoMaximize(Window w){ static Atom a = 0; if (!a) a = XInternAtom(qt_xdisplay(), "KWM_MAXIMIZE_WINDOW", False); long result = 0; if (!getSimpleProperty(w, a, result)){ doMaximize(w, result != 0); } return result != 0; }
/* * MDINewWindow - a new MDI window has been created */ int MDINewWindow( HWND hwnd ) { mdi_data *md; md = (mdi_data *)MemAlloc( sizeof( mdi_data ) ); if( md == NULL ) { return( FALSE ); } md->hwnd = hwnd; _wpi_setwindowlong( hwnd, mdiInfo.data_off, (LONG)md ); if( mdiHead == NULL ) { mdiHead = mdiTail = md; } else { mdiTail->next = md; mdiTail = md; } if( childrenMaximized ) { doMaximize( hwnd ); mdiInfo.set_window_title( hwnd ); } return( TRUE ); } /* MDINewWindow */
LRESULT CALLBACK StringTableDrawProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static HCURSOR origCurs; RECT r; LPCREATESTRUCT createStruct; struct resRes *stringTableData; LVHITTESTINFO hittest; int i; struct stringTableUndo *undo; switch (iMessage) { case WM_MDIACTIVATE: if ((HWND)lParam == hwnd) { doMaximize(); } break; case WM_SETFOCUS: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); SetFocus(stringTableData->gd.childWindow); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case LVN_GETDISPINFO: { LV_DISPINFO *plvdi = (LV_DISPINFO*)lParam; STRINGS *strings; plvdi->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM; plvdi->item.mask &= ~LVIF_IMAGE; strings = (STRINGS *)plvdi->item.lParam; switch (plvdi->item.iSubItem) { char id[256]; case 1: FormatVersionString(id, strings->string, strings->length);//FIXME id plvdi->item.pszText = id; break; } break; } case LVN_KEYDOWN: { stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); switch (((LPNMLVKEYDOWN)lParam)->wVKey) { case 'S': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_SAVE, 0); return TRUE; } break; case 'Z': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_UNDO, 0); return TRUE; } break; case VK_INSERT: stringTableData->gd.selectedRow = ListView_GetNextItem(stringTableData->gd.childWindow, -1, LVNI_SELECTED); PostMessage(hwnd, WM_COMMAND, IDM_INSERT, 0); return TRUE; case VK_DELETE: stringTableData->gd.selectedRow = ListView_GetNextItem(stringTableData->gd.childWindow, -1, LVNI_SELECTED); PostMessage(hwnd, WM_COMMAND, IDM_DELETE, 0); return TRUE; } } break; case NM_CLICK: { SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); } break; case NM_RCLICK: { POINT pt; stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); GetCursorPos(&hittest.pt); pt = hittest.pt; ScreenToClient(stringTableData->gd.childWindow, &hittest.pt); if (ListView_HitTest(stringTableData->gd.childWindow, &hittest) < 0) { hittest.iItem = ListView_GetItemCount(stringTableData->gd.childWindow); hittest.iSubItem = 0; } { HMENU menu, popup; SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); menu = LoadMenuGeneric(hInstance, "RESSTRINGSMENU"); stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); stringTableData->gd.selectedRow = hittest.iItem; stringTableData->gd.selectedColumn = hittest.iSubItem; popup = GetSubMenu(menu, 0); InsertBitmapsInMenu(popup); TrackPopupMenuEx(popup, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, hwnd, NULL); DestroyMenu(menu); } return 1; } break; case NM_DBLCLK: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); GetCursorPos(&hittest.pt); ScreenToClient(stringTableData->gd.childWindow, &hittest.pt); if (ListView_SubItemHitTest(stringTableData->gd.childWindow, &hittest) >= 0) { stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); stringTableData->gd.selectedRow = hittest.iItem; stringTableData->gd.selectedColumn = hittest.iSubItem; PostMessage(hwnd, WM_HANDLEDBLCLICK, 0, 0); } break; case NM_SETFOCUS: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); SetResourceProperties(stringTableData, &accFuncs); break; case NM_KILLFOCUS: // SetResourceProperties(NULL, NULL); break; } break; case WM_HANDLEDBLCLICK: { STRINGS *strings; RECT r; stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); if (stringTableData->gd.editWindow) { DestroyWindow(stringTableData->gd.editWindow); stringTableData->gd.editWindow = NULL; } strings = stringTableData->resource->u.stringtable; i = 0; while (strings && strings->next && i < stringTableData->gd.selectedRow) strings = strings->next, i++; if (strings) { ListView_GetSubItemRect(stringTableData->gd.childWindow, stringTableData->gd.selectedRow, stringTableData->gd.selectedColumn, LVIR_BOUNDS, &r); stringTableData->gd.editWindow = CreateWindow("edit", "", WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER, r.left,r.top,r.right-r.left,16, hwnd, (HMENU)ID_EDIT, hInstance, NULL); SetParent(stringTableData->gd.editWindow, stringTableData->gd.childWindow); AccSubclassEditWnd(hwnd, stringTableData->gd.editWindow); switch(stringTableData->gd.selectedColumn) { char buf[256]; case 0: buf[0] = 0; FormatExp(buf, strings->id); SendMessage(stringTableData->gd.editWindow, WM_SETTEXT, 0, (LPARAM)buf); break; case 1: FormatVersionString(buf, strings->string, strings->length); buf[strlen(buf)-1] = 0; SendMessage(stringTableData->gd.editWindow, WM_SETTEXT, 0, (LPARAM)buf+1); break; } SendMessage(stringTableData->gd.editWindow, EM_SETSEL, 0, -1); SetFocus(stringTableData->gd.editWindow); } } break; case WM_TIMER: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); ListView_Scroll(stringTableData->gd.childWindow, 0, (stringTableData->gd.lvscroll & 1) ? -16 : 16); break; case WM_COMMAND: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case ID_EDIT: if (HIWORD(wParam) == CBN_KILLFOCUS || HIWORD(wParam) == EN_KILLFOCUS) { static BOOL inKillFocus; if (stringTableData->gd.editWindow && !inKillFocus) { STRINGS *strings = stringTableData->resource->u.stringtable; i = 0; while (strings && strings->next && i < stringTableData->gd.selectedRow) strings = strings->next,i++; if (strings) { char buf[256]; buf[GetWindowText(stringTableData->gd.editWindow, buf, sizeof(buf)-1)] = 0; StringTableSetChanged(stringTableData, strings); if (stringTableData->gd.selectedColumn == 0) { PropSetIdName(stringTableData, buf, &strings->id, NULL); } else { int len; char *p = ParseVersionString(buf, &len); //FIXME ? strings->length = StringAsciiToWChar(&strings->string, p, len); ResGetStringItemName(strings->id, p); } ListView_DeleteItem(stringTableData->gd.childWindow, stringTableData->gd.selectedRow); PopulateItem(stringTableData->gd.childWindow, strings, stringTableData->gd.selectedRow); } i = 0; inKillFocus = TRUE; DestroyWindow(stringTableData->gd.editWindow); inKillFocus = FALSE; stringTableData->gd.editWindow = NULL; } } break; case IDM_INSERT: StringTableInsert(stringTableData, stringTableData->gd.selectedRow); break; case IDM_DELETE: StringTableDelete(stringTableData, stringTableData->gd.selectedRow); break; case IDM_SAVE: if (stringTableData->resource->changed) { ResSaveCurrent(workArea, stringTableData); } break; case IDM_UNDO: StringTableUndo(hwnd, stringTableData); break; } break; case EM_CANUNDO: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); return stringTableData->gd.undoData != NULL; case WM_CREATE: GetClientRect(hwnd, &r); createStruct = (LPCREATESTRUCT)lParam; stringTableData = (struct resRes *)((LPMDICREATESTRUCT)(createStruct->lpCreateParams))->lParam; SetWindowLong(hwnd, 0, (long)stringTableData); stringTableData->activeHwnd = hwnd; stringTableData->gd.childWindow = CreateWindowEx(0, WC_LISTVIEW, "", WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SINGLESEL, 0, 0, r.right, r.bottom, hwnd, (HMENU)ID_TREEVIEW, hInstance, NULL); SetListViewColumns(hwnd, stringTableData->gd.childWindow); PopulateStrings(hwnd, stringTableData ); break; case WM_CLOSE: SendMessage(hwndSrcTab, TABM_REMOVE, 0, (LPARAM)hwnd); break; case WM_DESTROY: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); if (stringTableData->gd.editWindow) DestroyWindow(stringTableData->gd.editWindow); stringTableData->gd.editWindow = NULL; undo = stringTableData->gd.undoData; if (undo) stringTableData->gd.cantClearUndo = TRUE; while (undo) { struct stringTableUndo *next = undo->next; free(undo); undo = next; } stringTableData->gd.undoData = NULL; stringTableData->activeHwnd = NULL; break; case WM_SIZE: stringTableData = (struct resRes *)GetWindowLong(hwnd, 0); MoveWindow(stringTableData->gd.childWindow, 0, 0, LOWORD(lParam), HIWORD(lParam), 1); break; default: break; } return DefMDIChildProc(hwnd, iMessage, wParam, lParam); }
LRESULT CALLBACK MenuDrawProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static MENUITEM *start; static BOOL dragging; static HCURSOR oldcurs; static struct resRes *resData; static struct propertyFuncs *resFuncs; POINT mouse; RECT r; PAINTSTRUCT paint; HDC dc; LPCREATESTRUCT createStruct; struct resRes *menuData; int i; struct menuUndo *undo; switch (iMessage) { case WM_MDIACTIVATE: if ((HWND)lParam == hwnd) { doMaximize(); } break; case WM_SETFOCUS: menuData = (struct resRes *)GetWindowLong(hwnd, 0); SetResourceProperties(resData, resFuncs); break; case EM_CANUNDO: menuData = (struct resRes *)GetWindowLong(hwnd, 0); return menuData->gd.undoData != NULL; case WM_KEYDOWN: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (wParam) { case 'S': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_SAVE, 0); } break; case 'Z': if (GetKeyState(VK_CONTROL) &0x80000000) { PostMessage(hwnd, WM_COMMAND, IDM_UNDO, 0); } break; } break; case WM_CREATE: createStruct = (LPCREATESTRUCT)lParam; menuData = (struct resRes *)((LPMDICREATESTRUCT)(createStruct->lpCreateParams))->lParam; SetWindowLong(hwnd, 0, (long)menuData); menuData->activeHwnd = hwnd; resData = menuData; resFuncs = &menuFuncs; MarkUnexpanded(menuData->resource->u.menu->items); break; case WM_CLOSE: SendMessage(hwndSrcTab, TABM_REMOVE, 0, (LPARAM)hwnd); break; case WM_DESTROY: menuData = (struct resRes *)GetWindowLong(hwnd, 0); menuData->activeHwnd = NULL; undo = menuData->gd.undoData; menuData->gd.undoData = NULL; if (undo) menuData->gd.cantClearUndo = TRUE; while (undo) { struct menuUndo *next = undo->next; free(undo); undo = next; } break; // case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_MBUTTONDOWN: case WM_RBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONUP: SetFocus(hwnd); return 1; case WM_PAINT: menuData = (struct resRes *)GetWindowLong(hwnd, 0); GetClientRect(hwnd, &r); dc = BeginPaint(hwnd, &paint); DoPaint(hwnd, dc, &paint, &r, menuData); EndPaint(hwnd, &paint); break; case WM_RBUTTONDOWN: menuData = (struct resRes *)GetWindowLong(hwnd, 0); SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); i = menuHitTest(hwnd, menuData, mouse); if (i) { HMENU menu, popup; SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_EDIT, CBN_KILLFOCUS), 0); menu = LoadMenuGeneric(hInstance, "RESMENUMENU"); if (i & 2) EnableMenuItem(menu, IDM_DELETE, MF_BYCOMMAND | MF_GRAYED); if (i & 4) EnableMenuItem(menu, IDM_INSERT_SEPARATOR, MF_BYCOMMAND | MF_GRAYED); menuData->gd.selectedRow = mouse.y + menuData->gd.scrollPos.y; menuData->gd.selectedColumn = mouse.x + menuData->gd.scrollPos.x; popup = GetSubMenu(menu, 0); ClientToScreen(hwnd, &mouse); InsertBitmapsInMenu(popup); TrackPopupMenuEx(popup, TPM_TOPALIGN | TPM_LEFTALIGN | TPM_LEFTBUTTON, mouse.x, mouse.y, hwnd, NULL); DestroyMenu(menu); } return 1; case WM_LBUTTONDBLCLK: SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); SetFocus(hwnd); menuData = (struct resRes *)GetWindowLong(hwnd, 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); SelectSubmenu(hwnd, menuData, mouse, TRUE); break; case WM_MOUSEMOVE: if (dragging) { menuData = (struct resRes *)GetWindowLong(hwnd, 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); menuData->gd.selectedMenu = start; i = menuHitTest(hwnd, menuData, mouse); if (!oldcurs) oldcurs = GetCursor(); SetCursor(i & 8 ? dragCur : noCur); } break; case WM_LBUTTONDOWN: SetFocus(hwnd); menuData = (struct resRes *)GetWindowLong(hwnd, 0); SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); i = menuHitTest(hwnd, menuData, mouse); if (i & 1) { resData = menuData; resFuncs = &menuItemFuncs; start = menuData->gd.selectedMenu; dragging = TRUE; SetCapture(hwnd); } else { resData = menuData; resFuncs = &menuFuncs; } SetResourceProperties(resData, resFuncs); break; case WM_LBUTTONUP: if (dragging) { dragging = FALSE; ReleaseCapture(); } menuData = (struct resRes *)GetWindowLong(hwnd, 0); if (oldcurs) { if (GetCursor() == dragCur) { mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); i = menuHitTest(hwnd, menuData, mouse); DoMove(menuData, start, menuData->gd.selectedMenu); } SetCursor(oldcurs); oldcurs = NULL; } else { SendMessage(hwnd, WM_COMMAND, ID_EDIT + (EN_KILLFOCUS << 16), 0); SetFocus(hwnd); mouse.x = LOWORD(lParam); mouse.y = HIWORD(lParam); SelectSubmenu(hwnd, menuData, mouse, FALSE); } break; case WM_COMMAND: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case ID_EDIT: if (HIWORD(wParam) == EN_KILLFOCUS) { static BOOL inKillFocus; if (menuData->gd.editWindow && !inKillFocus) { char buf[256]; char buf2[256]; UndoChange(menuData, menuData->gd.selectedMenu); buf[GetWindowText(menuData->gd.editWindow, buf, sizeof(buf))] = 0; StringWToA(buf2, menuData->gd.selectedMenu->text, wcslen(menuData->gd.selectedMenu->text)); if (strcmp(buf, buf2)) { ResGetHeap(workArea, menuData); if (menuData->gd.selectedMenu->id) ResGetMenuItemName(menuData->gd.selectedMenu->id, buf); StringAsciiToWChar(&menuData->gd.selectedMenu->text, buf, strlen(buf)); ResSetDirty(menuData); } InvalidateRect(hwnd, 0, FALSE); inKillFocus = TRUE; DestroyWindow(menuData->gd.editWindow); inKillFocus = FALSE; menuData->gd.editWindow = NULL; } } break; case IDM_DELETE: case IDM_INSERT: case IDM_INSERT_SEPARATOR: InsertDelete(hwnd, menuData, LOWORD(wParam)); break; case IDM_SAVE: if (menuData->resource->changed) { ResSaveCurrent(workArea, menuData); } break; case IDM_UNDO: DoUndo(menuData); break; } break; case WM_VSCROLL: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case SB_BOTTOM: menuData->gd.scrollPos.y = menuData->gd.scrollMax.y; break; case SB_TOP: menuData->gd.scrollPos.y = 0; break; case SB_LINEDOWN: menuData->gd.scrollPos.y += 8; break; case SB_LINEUP: menuData->gd.scrollPos.y -= 8; break; case SB_PAGEDOWN: menuData->gd.scrollPos.y += 64; break; case SB_PAGEUP: menuData->gd.scrollPos.y -= 64; break; case SB_ENDSCROLL: return 0; case SB_THUMBPOSITION: case SB_THUMBTRACK: { SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; GetScrollInfo(hwnd, SB_VERT, &si); menuData->gd.scrollPos.y = si.nTrackPos; } break; default: return 0; } if (menuData->gd.scrollPos.y < 0) menuData->gd.scrollPos.y = 0; if (menuData->gd.scrollPos.y >= menuData->gd.scrollMax.y) menuData->gd.scrollPos.y = menuData->gd.scrollMax.y; SetScrollPos(hwnd, SB_VERT, menuData->gd.scrollPos.y, TRUE); InvalidateRect(hwnd,0,FALSE); return 0; case WM_HSCROLL: menuData = (struct resRes *)GetWindowLong(hwnd, 0); switch (LOWORD(wParam)) { case SB_LEFT: menuData->gd.scrollPos.x = 0; break; case SB_RIGHT: menuData->gd.scrollPos.x = menuData->gd.scrollMax.x; break; case SB_LINELEFT: menuData->gd.scrollPos.x -= 8; break; case SB_LINERIGHT: menuData->gd.scrollPos.x += 8; break; case SB_PAGERIGHT: menuData->gd.scrollPos.x += 64; break; case SB_PAGELEFT: menuData->gd.scrollPos.x -= 64; break; case SB_ENDSCROLL: return 0; case SB_THUMBPOSITION: case SB_THUMBTRACK: { SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; GetScrollInfo(hwnd, SB_HORZ, &si); menuData->gd.scrollPos.x = si.nTrackPos; } break; } if (menuData->gd.scrollPos.x < 0) menuData->gd.scrollPos.x = 0; if (menuData->gd.scrollPos.x >= menuData->gd.scrollMax.x) menuData->gd.scrollPos.x = menuData->gd.scrollMax.x; SetScrollPos(hwnd, SB_HORZ, menuData->gd.scrollPos.x, TRUE); SetWindowPos(menuData->gd.childWindow, NULL, menuData->gd.origin.x - menuData->gd.scrollPos.x, menuData->gd.origin.y - menuData->gd.scrollPos.y, 0,0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); InvalidateRect(hwnd,0,FALSE); return 0; case WM_SIZE: InvalidateRect(hwnd, 0, FALSE); break; default: break; } return DefMDIChildProc(hwnd, iMessage, wParam, lParam); }