diff --git a/stubs/pywin32/win32/win32gui.pyi b/stubs/pywin32/win32/win32gui.pyi index a6e91aa5a14e..66ee8849c47e 100644 --- a/stubs/pywin32/win32/win32gui.pyi +++ b/stubs/pywin32/win32/win32gui.pyi @@ -1,12 +1,15 @@ from _typeshed import Incomplete, ReadableBuffer, WriteableBuffer -from collections.abc import Callable -from typing import Any, Literal, TypeVar +from collections.abc import Callable, Iterable +from typing import Any, Literal, TypeAlias, TypeVar import _win32typing from win32.lib.pywintypes import error as error _T = TypeVar("_T") +# (hdc, fErase, rcPaint, fRestore, fIncUpdate, rgbReserved) +_PaintStruct: TypeAlias = tuple[int, int, tuple[int, int, int, int], int, int, bytes] + def EnumFontFamilies(hdc: int, Family: str, EnumFontFamProc, Param, /): ... def set_logger(logger, /) -> None: ... def LOGFONT() -> _win32typing.PyLOGFONT: ... @@ -89,7 +92,7 @@ def LoadCursor(hinstance, resid, /): ... def SetCursor(hcursor, /): ... def GetCursor(): ... def GetCursorInfo() -> tuple[int, int, int, int]: ... -def CreateAcceleratorTable(accels: tuple[tuple[Incomplete, Incomplete, Incomplete], ...], /): ... +def CreateAcceleratorTable(accels: Iterable[tuple[int, int, int]], /): ... def LoadMenu(hinstance, resource_id: str, /): ... def DestroyMenu() -> None: ... def SetMenu(hwnd: int, hmenu, /) -> None: ... @@ -164,7 +167,7 @@ def CreateWindow( parent: int, menu: int, hinstance: int, - reserved: Incomplete | None, + reserved: None, /, ) -> int: ... def DestroyWindow(_hwnd: int, /) -> None: ... @@ -174,12 +177,12 @@ def FindWindowEx( Parent: int | None, ChildAfter: int | None, ClassName: _win32typing.PyResourceId | str | None, WindowName: str | None, / ) -> int: ... def DragAcceptFiles(hwnd: int, fAccept, /) -> None: ... -def DragDetect(hwnd: int, point: tuple[Incomplete, Incomplete], /) -> None: ... +def DragDetect(hwnd: int, point: tuple[int, int], /) -> None: ... def SetDoubleClickTime(newVal, /) -> None: ... def GetDoubleClickTime(): ... def HideCaret(hWnd: int, /) -> None: ... def SetCaretPos(x, y, /) -> None: ... -def GetCaretPos() -> tuple[Incomplete, Incomplete]: ... +def GetCaretPos() -> tuple[int, int]: ... def ShowCaret(hWnd: int, /) -> None: ... def ShowWindow(hWnd: int | None, cmdShow: int, /) -> int: ... def IsWindowVisible(hwnd: int | None, /) -> int: ... @@ -233,13 +236,11 @@ def ExtractIcon(hinstance, moduleName: str, index, /): ... def ExtractIconEx(moduleName: str, index, numIcons: int = ..., /): ... def DestroyIcon(hicon, /) -> None: ... def GetIconInfo(hicon: int, /) -> _win32typing.PyICONINFO: ... -def ScreenToClient( - hWnd: int | _win32typing.PyHANDLE, Point: tuple[Incomplete, Incomplete], / -) -> tuple[Incomplete, Incomplete]: ... -def ClientToScreen(hWnd: int, Point: tuple[Incomplete, Incomplete], /) -> tuple[Incomplete, Incomplete]: ... +def ScreenToClient(hWnd: int | _win32typing.PyHANDLE, Point: tuple[int, int], /) -> tuple[int, int]: ... +def ClientToScreen(hWnd: int, Point: tuple[int, int], /) -> tuple[int, int]: ... def PaintDesktop(hdc: int, /) -> None: ... def RedrawWindow(hWnd: int, rcUpdate: tuple[int, int, int, int], hrgnUpdate: _win32typing.PyGdiHANDLE, flags, /) -> None: ... -def GetTextExtentPoint32(hdc: int, _str: str, /) -> tuple[Incomplete, Incomplete]: ... +def GetTextExtentPoint32(hdc: int, _str: str, /) -> tuple[int, int]: ... def GetTextMetrics(): ... def GetTextCharacterExtra(hdc: int, /): ... def SetTextCharacterExtra(hdc: int, CharExtra, /): ... @@ -258,14 +259,14 @@ def GetWorldTransform(hdc: int, /) -> _win32typing.PyXFORM: ... def SetWorldTransform(hdc: int, Xform: _win32typing.PyXFORM, /) -> None: ... def ModifyWorldTransform(hdc: int, Xform: _win32typing.PyXFORM, Mode, /) -> None: ... def CombineTransform(xform1: _win32typing.PyXFORM, xform2: _win32typing.PyXFORM, /) -> _win32typing.PyXFORM: ... -def GetWindowOrgEx(hdc: int, /) -> tuple[Incomplete, Incomplete]: ... -def SetWindowOrgEx(hdc: int, X, Y, /) -> tuple[Incomplete, Incomplete]: ... -def GetViewportOrgEx(hdc: int, /) -> tuple[Incomplete, Incomplete]: ... -def SetViewportOrgEx(hdc: int, X, Y, /) -> tuple[Incomplete, Incomplete]: ... -def GetWindowExtEx(hdc: int, /) -> tuple[Incomplete, Incomplete]: ... -def SetWindowExtEx(hdc: int, XExtent, YExtent, /) -> tuple[Incomplete, Incomplete]: ... -def GetViewportExtEx(hdc: int, /) -> tuple[Incomplete, Incomplete]: ... -def SetViewportExtEx(hdc: int, XExtent, YExtent, /) -> tuple[Incomplete, Incomplete]: ... +def GetWindowOrgEx(hdc: int, /) -> tuple[int, int]: ... +def SetWindowOrgEx(hdc: int, X, Y, /) -> tuple[int, int]: ... +def GetViewportOrgEx(hdc: int, /) -> tuple[int, int]: ... +def SetViewportOrgEx(hdc: int, X, Y, /) -> tuple[int, int]: ... +def GetWindowExtEx(hdc: int, /) -> tuple[int, int]: ... +def SetWindowExtEx(hdc: int, XExtent, YExtent, /) -> tuple[int, int]: ... +def GetViewportExtEx(hdc: int, /) -> tuple[int, int]: ... +def SetViewportExtEx(hdc: int, XExtent, YExtent, /) -> tuple[int, int]: ... def GradientFill(hdc, Vertex: tuple[_win32typing.PyTRIVERTEX, ...], Mesh, Mode, /) -> None: ... def GetOpenFileName(OPENFILENAME: str, /): ... def InsertMenuItem(hMenu, uItem, fByPosition, menuItem, /) -> None: ... @@ -292,7 +293,9 @@ def CheckMenuRadioItem(hMenu, idFirst, idLast, idCheck, uFlags, /) -> None: ... def SetMenuInfo(hmenu, info, /) -> None: ... def GetMenuInfo(hmenu: int, info: WriteableBuffer, /) -> None: ... def DrawFocusRect(hDC: int, rc: tuple[int, int, int, int], /) -> None: ... -def DrawText(hDC: int, String, nCount, Rect: _win32typing.PyRECT, Format, /) -> tuple[Incomplete, _win32typing.PyRECT]: ... + +# Actually returns a list, but the length is always fixed +def DrawText(hDC: int, String, nCount, Rect: _win32typing.PyRECT, Format, /) -> tuple[int, tuple[int, int, int, int]]: ... def LineTo(hdc: int, XEnd, YEnd, /) -> None: ... def Ellipse(hdc: int, LeftRect, TopRect, RightRect, BottomRect, /) -> None: ... def Pie(hdc: int, LeftRect, TopRect, RightRect, BottomRect, XRadial1, YRadial1, XRadial2, YRadial2, /) -> None: ... @@ -306,15 +309,15 @@ def GetPixel(hdc: int, XPos, YPos, /): ... def GetROP2(hdc: int, /): ... def SetROP2(hdc: int, DrawMode, /): ... def SetPixelV(hdc: int, X, Y, Color, /) -> None: ... -def MoveToEx(hdc: int, X, Y, /) -> tuple[Incomplete, Incomplete]: ... -def GetCurrentPositionEx(hdc: int, /) -> tuple[Incomplete, Incomplete]: ... +def MoveToEx(hdc: int, X, Y, /) -> tuple[int, int]: ... +def GetCurrentPositionEx(hdc: int, /) -> tuple[int, int]: ... def GetArcDirection(hdc: int, /): ... def SetArcDirection(hdc: int, ArcDirection, /): ... -def Polygon(hdc: int, Points: list[tuple[Incomplete, Incomplete]], /) -> None: ... -def Polyline(hdc: int, Points: list[tuple[Incomplete, Incomplete]], /) -> None: ... -def PolylineTo(hdc: int, Points: list[tuple[Incomplete, Incomplete]], /) -> None: ... -def PolyBezier(hdc: int, Points: list[tuple[Incomplete, Incomplete]], /) -> None: ... -def PolyBezierTo(hdc: int, Points: list[tuple[Incomplete, Incomplete]], /) -> None: ... +def Polygon(hdc: int, Points: Iterable[tuple[int, int]], /) -> None: ... +def Polyline(hdc: int, Points: Iterable[tuple[int, int]], /) -> None: ... +def PolylineTo(hdc: int, Points: Iterable[tuple[int, int]], /) -> None: ... +def PolyBezier(hdc: int, Points: Iterable[tuple[int, int]], /) -> None: ... +def PolyBezierTo(hdc: int, Points: Iterable[tuple[int, int]], /) -> None: ... def PlgBlt( Dest: int, Point, @@ -328,10 +331,17 @@ def PlgBlt( yMask: int = ..., /, ) -> None: ... -def CreatePolygonRgn(Points: list[tuple[Incomplete, Incomplete]], PolyFillMode, /) -> _win32typing.PyGdiHANDLE: ... +def CreatePolygonRgn(Points: Iterable[tuple[int, int]], PolyFillMode, /) -> _win32typing.PyGdiHANDLE: ... def ExtTextOut( - hdc: int, _int, _int1, _int2, rect: _win32typing.PyRECT, string, _tuple: tuple[tuple[Incomplete, Incomplete], ...], / -): ... + hdc: int, + _int: int, + _int1: int, + _int2: int, + rect: _win32typing.PyRECT | tuple[int, int, int, int] | None, + string: str, + _tuple: tuple[int, ...] | None = None, + /, +) -> None: ... def GetTextColor(hdc, /): ... def SetTextColor(hdc, color, /): ... def GetBkMode(hdc: int, /): ... @@ -346,7 +356,7 @@ def FrameRgn(hdc: int, hrgn, hbr, Width, Height, /) -> None: ... def InvertRgn(hdc: int, hrgn, /) -> None: ... def EqualRgn(SrcRgn1, SrcRgn2, /): ... def PtInRegion(hrgn, X, Y, /): ... -def PtInRect(rect: tuple[int, int, int, int], point: tuple[Incomplete, Incomplete], /): ... +def PtInRect(rect: tuple[int, int, int, int], point: tuple[int, int], /): ... def RectInRegion(hrgn, rc: _win32typing.PyRECT, /): ... def SetRectRgn(hrgn, LeftRect, TopRect, RightRect, BottomRect, /) -> None: ... def CombineRgn(Dest, Src1, Src2, CombineMode, /): ... @@ -369,12 +379,16 @@ def SetWindowRgn(hWnd: int, hRgn: _win32typing.PyGdiHANDLE | None, Redraw: bool, def GetWindowRgnBox(hWnd: _win32typing.PyHANDLE | int | None) -> tuple[int, tuple[int, int, int, int]]: ... def ValidateRgn(hWnd: int, hRgn: _win32typing.PyGdiHANDLE, /) -> None: ... def InvalidateRgn(hWnd: int, hRgn: _win32typing.PyGdiHANDLE, Erase, /) -> None: ... -def GetRgnBox(hrgn: _win32typing.PyGdiHANDLE, /) -> tuple[Incomplete, _win32typing.PyRECT]: ... + +# Actually returns a list, but the length is always fixed +def GetRgnBox(hrgn: _win32typing.PyGdiHANDLE, /) -> tuple[int, tuple[int, int, int, int]]: ... def OffsetRgn(hrgn: _win32typing.PyGdiHANDLE, XOffset, YOffset, /): ... def Rectangle(hdc: int, LeftRect, TopRect, RightRect, BottomRect, /) -> None: ... def RoundRect(hdc: int, LeftRect, TopRect, RightRect, BottomRect, Width, Height, /) -> None: ... -def BeginPaint() -> tuple[Incomplete, Incomplete]: ... -def EndPaint(hwnd: int, ps, /) -> None: ... + +# Actually returns a list, but the length is always fixed +def BeginPaint(hwnd: int, /) -> tuple[int, _PaintStruct]: ... +def EndPaint(hwnd: int, ps: _PaintStruct, /) -> None: ... def BeginPath(hdc: int, /) -> None: ... def EndPath(hdc: int, /) -> None: ... def AbortPath(hdc: int, /) -> None: ... @@ -387,7 +401,7 @@ def StrokeAndFillPath(hdc: int, /) -> None: ... def GetMiterLimit(hdc: int, /) -> float: ... def SetMiterLimit(hdc: int, NewLimit: float, /) -> float: ... def PathToRegion(hdc: int, /) -> _win32typing.PyGdiHANDLE: ... -def GetPath(hdc: int, /) -> tuple[Incomplete, Incomplete]: ... +def GetPath(hdc: int, /) -> tuple[tuple[tuple[int, int], ...], tuple[int, ...]]: ... def CreateRoundRectRgn(LeftRect, TopRect, RightRect, BottomRect, WidthEllipse, HeightEllipse, /): ... def CreateRectRgnIndirect(rc: _win32typing.PyRECT, /): ... def CreateEllipticRgnIndirect(rc: _win32typing.PyRECT, /): ... @@ -396,7 +410,7 @@ def CreateWindowEx( ): ... def GetParent(child: int, /) -> int: ... def SetParent(child: int, child1: int | _win32typing.PyHANDLE | None, /) -> int: ... -def GetCursorPos() -> tuple[Incomplete, Incomplete]: ... +def GetCursorPos() -> tuple[int, int]: ... def GetDesktopWindow(): ... def GetWindow(hWnd: int, uCmd: int, /) -> int: ... def GetWindowDC(hWnd: int | _win32typing.PyHANDLE | None, /) -> int: ... @@ -413,65 +427,66 @@ def _TrackMouseEvent(tme: tuple[int, int, int], /) -> _win32typing.TRACKMOUSEEVE def ReleaseDC(hWnd: int | _win32typing.PyHANDLE | None, hDC: int | _win32typing.PyHANDLE | None, /) -> Literal[0, 1]: ... def CreateCaret(hWnd: int, hBitmap: _win32typing.PyGdiHANDLE, nWidth, nHeight, /) -> None: ... def DestroyCaret() -> None: ... + +# Actually returns a list, but the length is always fixed def ScrollWindowEx( hWnd: int, dx, dy, rcScroll: _win32typing.PyRECT, rcClip: _win32typing.PyRECT, hrgnUpdate, flags, / -) -> tuple[Incomplete, _win32typing.PyRECT]: ... +) -> tuple[int, tuple[int, int, int, int]]: ... def SetScrollInfo(hwnd: int, nBar, scollInfo: _win32typing.PySCROLLINFO, bRedraw=..., /) -> None: ... def GetScrollInfo(hwnd: int, nBar, mask, /) -> _win32typing.PySCROLLINFO: ... def GetClassName(hwnd: _win32typing.PyHANDLE | int | None, /) -> str | None: ... def RealGetWindowClass(hwnd: _win32typing.PyHANDLE | int | None, /) -> str | None: ... def WindowFromPoint(point: tuple[int, int], /) -> int: ... -def ChildWindowFromPoint(hwndParent: int, point: tuple[Incomplete, Incomplete], /): ... +def ChildWindowFromPoint(hwndParent: int, point: tuple[int, int], /): ... def CreateDC(Driver: str, Device: str, InitData: _win32typing.PyDEVMODEW, /): ... def GetSaveFileNameW( hwndOwner: int | None = ..., hInstance: int | None = ..., - Filter: Incomplete | None = ..., - CustomFilter: Incomplete | None = ..., + Filter: str | None = ..., + CustomFilter: str | None = ..., FilterIndex: int = ..., - File: Incomplete | None = ..., + File: str | None = ..., MaxFile: int = ..., - InitialDir: Incomplete | None = ..., - Title: Incomplete | None = ..., + InitialDir: str | None = ..., + Title: str | None = ..., Flags: int = ..., - DefExt: Incomplete | None = ..., + DefExt: str | None = ..., TemplateName: _win32typing.PyResourceId | None = ..., - /, -) -> tuple[Incomplete, Incomplete, Incomplete]: ... +) -> tuple[str, str | None, int]: ... def GetOpenFileNameW( hwndOwner: int | None = ..., hInstance: int | None = ..., - Filter: Incomplete | None = ..., - CustomFilter: Incomplete | None = ..., + Filter: str | None = ..., + CustomFilter: str | None = ..., FilterIndex: int = ..., - File: Incomplete | None = ..., + File: str | None = ..., MaxFile: int = ..., - InitialDir: Incomplete | None = ..., - Title: Incomplete | None = ..., + InitialDir: str | None = ..., + Title: str | None = ..., Flags: int = ..., - DefExt: Incomplete | None = ..., + DefExt: str | None = ..., TemplateName: _win32typing.PyResourceId | None = ..., -) -> tuple[Incomplete, Incomplete, Incomplete]: ... +) -> tuple[str, str | None, int]: ... # Any: Return type is too varied based on Action. This would require an overload for all win32con.SPI_* literals def SystemParametersInfo(Action: int, Param: Incomplete | None = ..., WinIni: int = ...) -> Any: ... def SetLayeredWindowAttributes(hwnd: int, Key, Alpha, Flags) -> None: ... -def GetLayeredWindowAttributes(hwnd: int) -> tuple[Incomplete, Incomplete, Incomplete]: ... +def GetLayeredWindowAttributes(hwnd: int) -> tuple[int, int, int]: ... def UpdateLayeredWindow( hwnd: int, hdcDst: int | None = ..., - ptDst: tuple[Incomplete, Incomplete] | None = ..., - size: tuple[Incomplete, Incomplete] | None = ..., - hdcSrc: Incomplete | None = ..., - ptSrc: tuple[Incomplete, Incomplete] | None = ..., + ptDst: tuple[int, int] | None = ..., + size: tuple[int, int] | None = ..., + hdcSrc: int | None = ..., + ptSrc: tuple[int, int] | None = ..., Key: int = ..., blend: tuple[int, int, int, int] = ..., Flags: int = ..., ) -> None: ... def AnimateWindow(hwnd: int, Time, Flags) -> None: ... def CreateBrushIndirect(lb: _win32typing.PyLOGBRUSH, /) -> _win32typing.PyGdiHANDLE: ... -def ExtCreatePen(PenStyle, Width, lb: _win32typing.PyLOGBRUSH, Style: tuple[Incomplete, ...] | None = ..., /) -> int: ... -def DrawTextW(hDC: int, String: str, Count, Rect: _win32typing.PyRECT, Format) -> tuple[Incomplete, _win32typing.PyRECT]: ... +def ExtCreatePen(PenStyle, Width, lb: _win32typing.PyLOGBRUSH, Style: Iterable[int] | None = ..., /) -> int: ... +def DrawTextW(hDC: int, String: str, Count, Rect: _win32typing.PyRECT, Format) -> tuple[int, tuple[int, int, int, int]]: ... def EnumPropsEx(hWnd: int, EnumFunc, Param, /) -> None: ... def RegisterDeviceNotification(handle: int, _filter, flags, /) -> _win32typing.PyHDEVNOTIFY: ... def UnregisterDeviceNotification() -> None: ... @@ -479,7 +494,7 @@ def RegisterHotKey(hWnd: _win32typing.PyHANDLE | int | None, _id: int, Modifiers def UnregisterHotKey(hWnd: _win32typing.PyHANDLE | int | None, _id: int, /) -> None: ... def GetAncestor(hwnd: int, gaFlags: int, /) -> int: ... def GetTopWindow(hWnd: int | None, /) -> int: ... -def ChildWindowFromPointEx(hwndParent: int, point: tuple[Incomplete, Incomplete], flags: int, /): ... +def ChildWindowFromPointEx(hwndParent: int, point: tuple[int, int], flags: int, /): ... def CreateDialogIndirectParam(hInstance, controlList, hWndParent, DialogFunc, InitParam: int = 0, /) -> int: ... def DestroyAcceleratorTable(haccel, /): ... def Edit_GetLine(hwnd, line, size=..., /): ...