From e06c0c98e5ef0c4cf85005b780cf64c9adcab9e8 Mon Sep 17 00:00:00 2001 From: Avasam Date: Fri, 15 Mar 2024 13:13:59 -0400 Subject: [PATCH 1/6] pywin32 stashed improvements --- stubs/pywin32/_win32typing.pyi | 6 ++++-- stubs/pywin32/pythoncom.pyi | 21 ++++++++++++++------- stubs/pywin32/win32/lib/pywintypes.pyi | 6 +++--- stubs/pywin32/win32/win32api.pyi | 2 +- stubs/pywin32/win32/win32ras.pyi | 2 +- stubs/pywin32/win32com/server/util.pyi | 5 +++-- stubs/pywin32/win32com/universal.pyi | 10 +++++++++- stubs/pywin32/win32comext/mapi/mapi.pyi | 2 +- stubs/pywin32/win32comext/shell/shell.pyi | 4 +++- 9 files changed, 39 insertions(+), 19 deletions(-) diff --git a/stubs/pywin32/_win32typing.pyi b/stubs/pywin32/_win32typing.pyi index 9f96f7b9f0dc..63093b995f11 100644 --- a/stubs/pywin32/_win32typing.pyi +++ b/stubs/pywin32/_win32typing.pyi @@ -2368,7 +2368,7 @@ class Pymmapfile: def read_byte(self): ... def read_line(self): ... def resize(self, MaximumSize, FileOffset: int = ..., NumberOfBytesToMap: int = ...) -> None: ... - def seek(self, dist, how: int = ..., /) -> None: ... + def seek(self, dist: int, how: int = ..., /) -> None: ... def size(self): ... def tell(self): ... def write(self, data, /) -> None: ... @@ -4775,7 +4775,9 @@ class SHFILEOPSTRUCT: ... class SI_ACCESS: ... class SI_INHERIT_TYPE: ... class SI_OBJECT_INFO: ... -class STATSTG: ... + +STATSTG: TypeAlias = tuple[str | None, int, int, TimeType, TimeType, TimeType, int, int, PyIID, int, int] + class TLIBATTR: ... class TYPEATTR: diff --git a/stubs/pywin32/pythoncom.pyi b/stubs/pywin32/pythoncom.pyi index de4a15002212..9bac2896430a 100644 --- a/stubs/pywin32/pythoncom.pyi +++ b/stubs/pywin32/pythoncom.pyi @@ -1,4 +1,5 @@ -from _typeshed import Incomplete +from _typeshed import Incomplete, Unused +from typing import overload from typing_extensions import TypeAlias, deprecated import _win32typing @@ -101,28 +102,34 @@ def RevokeActiveObject(handle, /) -> None: ... def RegisterDragDrop(hwnd: int, dropTarget: _win32typing.PyIDropTarget, /) -> None: ... def RevokeDragDrop(hwnd: int, /) -> None: ... def DoDragDrop() -> None: ... -def StgCreateDocfile(name: str, mode, reserved: int = ..., /) -> _win32typing.PyIStorage: ... +def StgCreateDocfile(name: str | None, mode: int, reserved: int = ..., /) -> _win32typing.PyIStorage: ... def StgCreateDocfileOnILockBytes(lockBytes: _win32typing.PyILockBytes, mode, reserved=..., /) -> _win32typing.PyIStorage: ... def StgOpenStorageOnILockBytes( lockBytes: _win32typing.PyILockBytes, stgPriority: _win32typing.PyIStorage, + mode, snbExclude: Incomplete | None = ..., reserved: int = ..., /, ) -> _win32typing.PyIStorage: ... def StgIsStorageFile(name: str, /): ... def STGMEDIUM() -> _win32typing.PySTGMEDIUM: ... +@overload def StgOpenStorage( - name: str, other: _win32typing.PyIStorage, mode, snbExclude: Incomplete | None = ..., reserved=..., / + name: str | None, other: _win32typing.PyIStorage, mode: int, snbExclude: Unused = ..., reserved: int = ..., / +) -> _win32typing.PyIStorage: ... +@overload +def StgOpenStorage( + name: str, other: _win32typing.PyIStorage | None, mode: int, snbExclude: Unused = ..., reserved: int = ..., / ) -> _win32typing.PyIStorage: ... def StgOpenStorageEx( - Name: str, Mode, stgfmt, Attrs, riid: _win32typing.PyIID, StgOptions: Incomplete | None = ... + Name: str, Mode: int, stgfmt: int, Attrs: int, riid: _win32typing.PyIID, StgOptions: Incomplete | None = ... ) -> _win32typing.PyIStorage: ... def StgCreateStorageEx( Name: str, - Mode, - stgfmt, - Attrs, + Mode: int, + stgfmt: int, + Attrs: int, riid: _win32typing.PyIID, StgOptions: Incomplete | None = ..., SecurityDescriptor: _win32typing.PySECURITY_DESCRIPTOR | None = ..., diff --git a/stubs/pywin32/win32/lib/pywintypes.pyi b/stubs/pywin32/win32/lib/pywintypes.pyi index 87db6d51df73..21e488135a57 100644 --- a/stubs/pywin32/win32/lib/pywintypes.pyi +++ b/stubs/pywin32/win32/lib/pywintypes.pyi @@ -2,7 +2,7 @@ # Otherwise you get the error: "KeyError: 'pywintypes'" from _typeshed import Incomplete from datetime import datetime -from typing import ClassVar, Literal, NoReturn, overload +from typing import ClassVar, Final, NoReturn, overload from typing_extensions import Never, TypeAlias, deprecated import _win32typing @@ -53,6 +53,6 @@ def TimeStamp(timestamp: tuple[int, int], /) -> TimeType: ... @overload def TimeStamp(timestamp: int, /) -> TimeType: ... -FALSE: Literal[False] -TRUE: Literal[True] +FALSE: Final = False +TRUE: Final = True WAVE_FORMAT_PCM: int diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index 86390d4ee74e..fa9184855be5 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -154,7 +154,7 @@ def LoadLibraryEx(fileName: str, handle: int, handle1, /) -> int: ... def LoadResource(handle: int, _type: _win32typing.PyResourceId, name: _win32typing.PyResourceId, language, /) -> str: ... def LoadString(handle: int, stringId, numChars: int = ..., /) -> str: ... def MessageBeep(arg, /): ... -def MessageBox(hwnd: int, message: str, title: str, arg, arg1, /): ... +def MessageBox(hwnd: int | None, message: str, title: str | None = ..., style=..., language=..., /) -> int: ... def MonitorFromPoint(pt: tuple[Incomplete, Incomplete], Flags: int = ...) -> int: ... def MonitorFromRect(rc: _win32typing.PyRECT | tuple[int, int, int, int], Flags: int = ...) -> int: ... def MonitorFromWindow(hwnd: int, Flags: int = ...) -> int: ... diff --git a/stubs/pywin32/win32/win32ras.pyi b/stubs/pywin32/win32/win32ras.pyi index 99290eb52535..368ca438a19e 100644 --- a/stubs/pywin32/win32/win32ras.pyi +++ b/stubs/pywin32/win32/win32ras.pyi @@ -13,7 +13,7 @@ def EnumEntries(reserved: str | None = ..., fileName: str | None = ..., /) -> No def GetConnectStatus(hrasconn, /) -> tuple[Incomplete, Incomplete, str, str]: ... def GetEntryDialParams( fileName: str, entryName: str, / -) -> tuple[Incomplete, Incomplete, Incomplete, Incomplete, Incomplete, Incomplete, Incomplete]: ... +) -> tuple[tuple[Incomplete, Incomplete, Incomplete, Incomplete, Incomplete, Incomplete], bool]: ... def GetErrorString(error, /) -> str: ... # noqa: F811 def HangUp(hras, /) -> None: ... def IsHandleValid(hras: int | None, /) -> bool: ... diff --git a/stubs/pywin32/win32com/server/util.pyi b/stubs/pywin32/win32com/server/util.pyi index 14fe4b0f4bad..7e5001429cb1 100644 --- a/stubs/pywin32/win32com/server/util.pyi +++ b/stubs/pywin32/win32com/server/util.pyi @@ -1,5 +1,6 @@ from _typeshed import Incomplete +import _win32typing from win32com.server import policy as policy from win32com.server.exception import COMException as COMException @@ -32,9 +33,9 @@ def NewCollection(seq, cls=...): ... class FileStream: file: Incomplete - def __init__(self, file) -> None: ... + def __init__(self, file: _win32typing.Pymmapfile) -> None: ... def Read(self, amount): ... def Write(self, data): ... def Clone(self): ... def CopyTo(self, dest, cb): ... - def Seek(self, offset, origin): ... + def Seek(self, offset: int, origin: int) -> int: ... diff --git a/stubs/pywin32/win32com/universal.pyi b/stubs/pywin32/win32com/universal.pyi index f10b28b8a29d..29452a20d579 100644 --- a/stubs/pywin32/win32com/universal.pyi +++ b/stubs/pywin32/win32com/universal.pyi @@ -1,8 +1,16 @@ from _typeshed import Incomplete +from collections.abc import Callable +from typing_extensions import TypeAlias from pythoncom import com_error as com_error from win32com.client import gencache as gencache +# Type of pythoncom._univgw.WriteFromOutTuple +# The two tuples must be of equal length +_WriteFromOutTupleType: TypeAlias = Callable[ + [tuple[Incomplete, ...] | None, tuple[Incomplete, ...] | None, int], Incomplete | None +] + def RegisterInterfaces(typelibGUID, lcid, major, minor, interface_names: Incomplete | None = ...): ... class Arg: @@ -24,4 +32,4 @@ class Definition: def iid(self): ... def vtbl_argsizes(self): ... def vtbl_argcounts(self): ... - def dispatch(self, ob, index, argPtr, ReadFromInTuple=..., WriteFromOutTuple=...): ... + def dispatch(self, ob, index, argPtr, ReadFromInTuple=..., WriteFromOutTuple: _WriteFromOutTupleType = ...): ... diff --git a/stubs/pywin32/win32comext/mapi/mapi.pyi b/stubs/pywin32/win32comext/mapi/mapi.pyi index fd1af1e110ae..6b3a42261355 100644 --- a/stubs/pywin32/win32comext/mapi/mapi.pyi +++ b/stubs/pywin32/win32comext/mapi/mapi.pyi @@ -18,7 +18,7 @@ def HrQueryAllRows( ): ... def RTFSync(message: _win32typing.PyIMessage, flags, /): ... def WrapCompressedRTFStream(stream: _win32typing.PyIStream, flags, /) -> _win32typing.PyIStream: ... -def WrapCompressedRTFStreamEx() -> tuple[_win32typing.PyIStream, Incomplete]: ... +def WrapCompressedRTFStreamEx(stream: _win32typing.PyIStream, wcsinfo, /) -> tuple[_win32typing.PyIStream, Incomplete]: ... def OpenIMsgSession(): ... def CloseIMsgSession() -> None: ... def OpenIMsgOnIStg( diff --git a/stubs/pywin32/win32comext/shell/shell.pyi b/stubs/pywin32/win32comext/shell/shell.pyi index ce587781c2f8..f8702c785dce 100644 --- a/stubs/pywin32/win32comext/shell/shell.pyi +++ b/stubs/pywin32/win32comext/shell/shell.pyi @@ -97,7 +97,9 @@ def SHCreateShellItem( pidlParent: _win32typing.PyIDL, sfParent: _win32typing.PyIShellFolder, Child: _win32typing.PyIDL, / ) -> _win32typing.PyIShellItem: ... def SHOpenFolderAndSelectItems(Folder: _win32typing.PyIDL, Items: tuple[_win32typing.PyIDL, ...], Flags=...) -> None: ... -def SHCreateStreamOnFileEx(File, Mode, Attributes, Create, Template: Incomplete | None = ...) -> _win32typing.PyIStream: ... +def SHCreateStreamOnFileEx( + File: str, Mode: int, Attributes: int, Create: bool, Template: None = ... +) -> _win32typing.PyIStream: ... def SetCurrentProcessExplicitAppUserModelID(AppID: str, /) -> None: ... def GetCurrentProcessExplicitAppUserModelID() -> str: ... def SHParseDisplayName(Name, Attributes, BindCtx: _win32typing.PyIBindCtx | None = ...) -> tuple[list[bytes], int]: ... From 9e89c27d3f523bb261c7e61771e197236c6e6ef2 Mon Sep 17 00:00:00 2001 From: Avasam Date: Fri, 15 Mar 2024 13:34:30 -0400 Subject: [PATCH 2/6] TimeType methods improvements from recent testing --- stubs/pywin32/pythoncom.pyi | 5 +++-- stubs/pywin32/win32/lib/pywintypes.pyi | 7 ++++--- stubs/pywin32/win32/win32file.pyi | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/stubs/pywin32/pythoncom.pyi b/stubs/pywin32/pythoncom.pyi index 9bac2896430a..70e020953adc 100644 --- a/stubs/pywin32/pythoncom.pyi +++ b/stubs/pywin32/pythoncom.pyi @@ -1,5 +1,6 @@ from _typeshed import Incomplete, Unused -from typing import overload +from collections.abc import Sequence +from typing import SupportsInt, overload from typing_extensions import TypeAlias, deprecated import _win32typing @@ -73,7 +74,7 @@ def MakePyFactory(iid: _win32typing.PyIID, /) -> _win32typing.PyIClassFactory: . @deprecated("Use pywintypes.IID() instead.") def MakeIID(iidString: str, is_bytes: bool = ..., /) -> _win32typing.PyIID: ... @deprecated("Use pywintypes.Time() instead.") -def MakeTime(timeRepr, /) -> TimeType: ... +def MakeTime(timeRepr: SupportsInt | Sequence[SupportsInt] | TimeType, /) -> TimeType: ... def MkParseDisplayName( displayName: str, bindCtx: _win32typing.PyIBindCtx | None = ..., / ) -> tuple[_win32typing.PyIMoniker, Incomplete, _win32typing.PyIBindCtx]: ... diff --git a/stubs/pywin32/win32/lib/pywintypes.pyi b/stubs/pywin32/win32/lib/pywintypes.pyi index 21e488135a57..be2ecba41723 100644 --- a/stubs/pywin32/win32/lib/pywintypes.pyi +++ b/stubs/pywin32/win32/lib/pywintypes.pyi @@ -1,8 +1,9 @@ # Can't generate with stubgen because `import pywintypes` must be called first. # Otherwise you get the error: "KeyError: 'pywintypes'" from _typeshed import Incomplete +from collections.abc import Sequence from datetime import datetime -from typing import ClassVar, Final, NoReturn, overload +from typing import ClassVar, Final, NoReturn, SupportsInt, overload from typing_extensions import Never, TypeAlias, deprecated import _win32typing @@ -32,13 +33,13 @@ class TimeType(datetime): # aka: PyTime, PyDateTime IIDType = _win32typing.PyIID -def DosDateTimeToTime() -> TimeType: ... +def DosDateTimeToTime(FatDate: int, FatTime: int, /) -> TimeType: ... def Unicode() -> str: ... def UnicodeFromRaw(_str: str, /) -> str: ... def IsTextUnicode(_str: str, flags, /) -> tuple[Incomplete, Incomplete]: ... def OVERLAPPED() -> _win32typing.PyOVERLAPPED: ... def IID(iidString: str, is_bytes: bool = ..., /) -> _win32typing.PyIID: ... -def Time(timeRepr, /) -> TimeType: ... +def Time(timeRepr: SupportsInt | Sequence[SupportsInt] | TimeType, /) -> TimeType: ... def CreateGuid() -> _win32typing.PyIID: ... def ACL(bufSize: int = ..., /) -> _win32typing.PyACL: ... def SID(buffer, idAuthority, subAuthorities, bufSize=..., /) -> _win32typing.PySID: ... diff --git a/stubs/pywin32/win32/win32file.pyi b/stubs/pywin32/win32/win32file.pyi index c186b12a5cef..aef4e1af9c2e 100644 --- a/stubs/pywin32/win32/win32file.pyi +++ b/stubs/pywin32/win32/win32file.pyi @@ -36,7 +36,7 @@ def FindCloseChangeNotification(hChangeHandle, /) -> None: ... def FindFirstChangeNotification(pathName: str, bWatchSubtree, notifyFilter, /): ... def FindNextChangeNotification(hChangeHandle, /): ... def FlushFileBuffers(hFile: int, /) -> None: ... -def GetBinaryType(appName: str, /): ... +def GetBinaryType(appName: str, /) -> int: ... def GetDiskFreeSpace(rootPathName: str, /) -> tuple[Incomplete, Incomplete, Incomplete, Incomplete]: ... def GetDiskFreeSpaceEx(rootPathName: str, /) -> tuple[int, int, int]: ... def GetDriveType(rootPathName: str, /): ... From cf5977bf153b595a159f7f3ef5f8346803f35e74 Mon Sep 17 00:00:00 2001 From: Avasam Date: Fri, 15 Mar 2024 15:38:45 -0400 Subject: [PATCH 3/6] PyHKEY fixes --- stubs/pywin32/_win32typing.pyi | 42 ++++++++++++++------------------ stubs/pywin32/win32/win32api.pyi | 6 ++--- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/stubs/pywin32/_win32typing.pyi b/stubs/pywin32/_win32typing.pyi index 63093b995f11..9148c35dfaea 100644 --- a/stubs/pywin32/_win32typing.pyi +++ b/stubs/pywin32/_win32typing.pyi @@ -74,30 +74,24 @@ class PyNCB: @property def Bufflen(self): ... @property - def Callname(self): ... - @property - def Cmd_cplt(self): ... - @property - def Command(self): ... - @property - def Event(self): ... - @property - def Lana_num(self): ... - @property - def Lsn(self): ... - @property - def Name(self): ... - @property - def Num(self): ... - @property - def Post(self): ... - def Reset(self, *args): ... # incomplete - @property - def Retcode(self): ... - @property - def Rto(self): ... + def Callname(self) -> str: ... + @Callname.setter + def Callname(self, value: str | bytes) -> None: ... + Cmd_cplt: int + Command: int + Event: int + Lana_num: int + Lsn: int @property - def Sto(self): ... + def Name(self) -> str: ... + @Name.setter + def Name(self, value: str | bytes) -> None: ... + Num: int + Post: int + def Reset(self) -> None: ... + Retcode: int + Rto: int + Sto: int class COMMTIMEOUTS: ... class CopyProgressRoutine: ... @@ -613,7 +607,7 @@ class PyConsoleScreenBuffer: class PyCredHandle: def Detach(self): ... def FreeCredentialsHandle(self) -> None: ... - def QueryCredentialsAttributes(self, Attribute, /) -> None: ... + def QueryCredentialsAttributes(self, Attribute: int, /) -> str: ... class PyCtxtHandle: def Detach(self): ... diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index fa9184855be5..ecc636c5136a 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -189,7 +189,7 @@ def RegEnumValue(key: _win32typing.PyHKEY, index, /) -> tuple[str, Incomplete, I def RegFlushKey(key: _win32typing.PyHKEY, /) -> None: ... def RegGetKeySecurity(key: _win32typing.PyHKEY, security_info, /) -> _win32typing.PySECURITY_DESCRIPTOR: ... def RegLoadKey(key: _win32typing.PyHKEY, subKey: str, filename: str, /) -> None: ... -def RegOpenCurrentUser(samDesired, /) -> _win32typing.PyHKEY: ... +def RegOpenCurrentUser(samDesired=..., /) -> _win32typing.PyHKEY: ... def RegOpenKey( key: _win32typing.PyHKEY | int, subkey: str | None, reserved: bool = ..., sam: int = ..., / ) -> _win32typing.PyHKEY: ... @@ -198,8 +198,8 @@ def RegOpenKeyTransacted( Key: _win32typing.PyHKEY, SubKey: str, samDesired, Transaction: int, Options: int = ... ) -> _win32typing.PyHKEY: ... def RegOverridePredefKey(Key: _win32typing.PyHKEY, NewKey: _win32typing.PyHKEY) -> None: ... -def RegQueryValue(key: _win32typing.PyHKEY, subKey: str, /) -> str: ... -def RegQueryValueEx(key: _win32typing.PyHKEY | int, valueName: str | None, /) -> tuple[str, int]: ... +def RegQueryValue(key: _win32typing.PyHKEY | int, subKey: str | None, /) -> str: ... +def RegQueryValueEx(key: _win32typing.PyHKEY | int, valueName: str, /) -> tuple[str, int]: ... def RegQueryInfoKey(key: _win32typing.PyHKEY, /) -> tuple[Incomplete, Incomplete, Incomplete]: ... def RegQueryInfoKeyW(Key: _win32typing.PyHKEY, /): ... def RegRestoreKey(Key: _win32typing.PyHKEY, File: str, Flags: int = ...) -> None: ... From 2db820071754c0140583980772b97688a4fd93f6 Mon Sep 17 00:00:00 2001 From: Avasam Date: Sun, 24 Mar 2024 11:53:11 -0400 Subject: [PATCH 4/6] More type fixes for pywin32 --- stubs/pywin32/_win32typing.pyi | 21 ++++++++++++--------- stubs/pywin32/pythonwin/win32ui.pyi | 19 +++++++++++-------- stubs/pywin32/pythonwin/win32uiole.pyi | 2 +- stubs/pywin32/win32/win32api.pyi | 15 +++++++++------ stubs/pywin32/win32/win32gui.pyi | 10 ++++++---- stubs/pywin32/win32/win32service.pyi | 4 +++- 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/stubs/pywin32/_win32typing.pyi b/stubs/pywin32/_win32typing.pyi index 9148c35dfaea..a83bffd2b190 100644 --- a/stubs/pywin32/_win32typing.pyi +++ b/stubs/pywin32/_win32typing.pyi @@ -1,11 +1,13 @@ # Not available at runtime. Contains type definitions that are otherwise not exposed and not part of a specific module. from _typeshed import Incomplete, Unused -from collections.abc import Iterable -from typing import Literal, final, overload +from collections.abc import Iterable, Sequence +from typing import Literal, SupportsIndex, final, overload from typing_extensions import Self, TypeAlias, deprecated from win32.lib.pywintypes import TimeType +_TwoIntSequence: TypeAlias = Sequence[int] + class ArgNotFound: ... class PyOleEmpty: ... class PyOleMissing: ... @@ -1662,6 +1664,7 @@ class PySecBufferDesc: Version: Incomplete Buffer: Incomplete def append(self, buffer, /) -> None: ... + def __getitem__(self, index: SupportsIndex) -> PySecBuffer: ... class PyTOKEN_GROUPS: ... class PyTOKEN_PRIVILEGES: ... @@ -4857,7 +4860,7 @@ class PyCBitmap: def SaveBitmapFile(self, dcObject: PyCDC, Filename: str, /): ... class PyCBrush: - def CreateSolidBrush(self) -> None: ... + def CreateSolidBrush(self, i: int) -> None: ... def GetSafeHandle(self): ... class PyCButton: @@ -5400,7 +5403,7 @@ class PyCMenu: def GetSubMenu(self, pos, /) -> PyCMenu: ... def InsertMenu(self, pos, flags, _id: PyCMenu | int = ..., value: str | None = ..., /) -> None: ... def ModifyMenu(self, pos, flags, _id: int = ..., value: str | None = ..., /) -> None: ... - def TrackPopupMenu(self, arg: tuple[Incomplete, Incomplete], arg1, arg2: PyCWnd, /) -> None: ... + def TrackPopupMenu(self, x_y: _TwoIntSequence, flags: int = ..., owner: PyCWnd = ..., /) -> None: ... class PyCOleClientItem: def CreateNewItem(self) -> None: ... @@ -5646,10 +5649,10 @@ class PyCSpinButtonCtrl: def SetRange(self): ... def SetRange32(self): ... -class PyCSplitterWnd: +class PyCSplitterWnd: # aka PyCSplitter def GetPane(self, row, col, /) -> PyCWnd: ... def CreateView(self, view: PyCView, row, col, arg: tuple[Incomplete, Incomplete], /) -> None: ... - def CreateStatic(self, parent, rows, cols, style, _id, /) -> None: ... + def CreateStatic(self, parent: PyCSplitterWnd, rows, cols, style=..., _id=..., /) -> None: ... def SetColumnInfo(self, column, ideal, _min, /) -> None: ... def SetRowInfo(self, row, ideal, _min, /) -> None: ... def IdFromRowCol(self, row, col, /) -> None: ... @@ -5963,15 +5966,15 @@ class PyCWnd: def RunModalLoop(self, flags, /): ... def PostMessage(self, idMessage, wParam: int = ..., lParam: int = ..., /) -> None: ... def SendMessageToDescendants(self, idMessage, wParam: int = ..., lParam: int = ..., bDeep: int = ..., /) -> None: ... - def SendMessage(self, idMessage, idMessage1, ob, wParam: int = ..., lParam: int = ..., /) -> None: ... + def SendMessage(self, idMessage, wParam: int = ..., lParam: int = ..., /) -> None: ... def SetActiveWindow(self) -> PyCWnd: ... def SetForegroundWindow(self) -> None: ... def SetWindowPos( self, hWndInsertAfter, position: tuple[Incomplete, Incomplete, Incomplete, Incomplete], flags, / ) -> None: ... def ScreenToClient( - self, rect: tuple[Incomplete, Incomplete, Incomplete, Incomplete, Incomplete], pnt, / - ) -> tuple[Incomplete, Incomplete, Incomplete, Incomplete, Incomplete]: ... + self, rect: tuple[Incomplete, Incomplete, Incomplete, Incomplete], / + ) -> tuple[Incomplete, Incomplete, Incomplete, Incomplete]: ... def SetCapture(self) -> None: ... def SetDlgItemText(self, idControl, text: str, /) -> None: ... def SetFocus(self) -> None: ... diff --git a/stubs/pywin32/pythonwin/win32ui.pyi b/stubs/pywin32/pythonwin/win32ui.pyi index 38b52d8bdab1..b9ea26ca26e6 100644 --- a/stubs/pywin32/pythonwin/win32ui.pyi +++ b/stubs/pywin32/pythonwin/win32ui.pyi @@ -1,4 +1,5 @@ -from _typeshed import Incomplete, Unused +from _typeshed import Incomplete, OptExcInfo, Unused +from collections.abc import Callable import _win32typing @@ -70,10 +71,12 @@ def CreateRichEditDocTemplate(idRes, /) -> _win32typing.PyCRichEditDocTemplate: def CreateRichEditView(doc: _win32typing.PyCDocument | None = ..., /) -> _win32typing.PyCRichEditView: ... def CreateSliderCtrl() -> _win32typing.PyCSliderCtrl: ... def CreateSplitter() -> _win32typing.PyCSplitterWnd: ... -def CreateStatusBar(parent: _win32typing.PyCWnd, arg, arg1, ctrlStype=..., /) -> _win32typing.PyCStatusBar: ... +def CreateStatusBar( + parent: _win32typing.PyCWnd, style: int = ..., windowId: int = ..., ctrlStype: int = ..., / +) -> _win32typing.PyCStatusBar: ... def CreateStatusBarCtrl() -> _win32typing.PyCStatusBarCtrl: ... def CreateFont(properties, /) -> _win32typing.PyCFont: ... -def CreateToolBar(parent: _win32typing.PyCWnd, style, arg, /) -> _win32typing.PyCToolBar: ... +def CreateToolBar(parent: _win32typing.PyCWnd, style: int, windowId: int = ..., /) -> _win32typing.PyCToolBar: ... def CreateToolBarCtrl() -> _win32typing.PyCToolBarCtrl: ... def CreateToolTipCtrl() -> _win32typing.PyCToolTipCtrl: ... def CreateThread() -> _win32typing.PyCWinThread: ... @@ -84,7 +87,7 @@ def CreateWindowFromHandle(hwnd: int, /) -> _win32typing.PyCWnd: ... def CreateWnd() -> _win32typing.PyCWnd: ... def DestroyDebuggerThread() -> None: ... def DoWaitCursor(code, /) -> None: ... -def DisplayTraceback() -> None: ... +def DisplayTraceback(exc_info: OptExcInfo, title: str, /) -> None: ... def Enable3dControls(): ... def FindWindow(className: str, windowName: str, /) -> _win32typing.PyCWnd: ... def FindWindowEx( @@ -111,16 +114,16 @@ def GetResource() -> _win32typing.PyDLL: ... def GetThread() -> _win32typing.PyCWinApp: ... def GetType(): ... def InitRichEdit() -> str: ... -def InstallCallbackCaller(): ... +def InstallCallbackCaller(caller: Callable[..., Incomplete] | None): ... def IsDebug() -> int: ... def IsWin32s() -> int: ... def IsObject(o: object, /) -> bool: ... def LoadDialogResource(idRes, dll: _win32typing.PyDLL | None = ..., /): ... def LoadLibrary(fileName: str, /) -> _win32typing.PyDLL: ... def LoadMenu(_id, dll: _win32typing.PyDLL | None = ..., /) -> _win32typing.PyCMenu: ... -def LoadStdProfileSettings(maxFiles, /) -> None: ... +def LoadStdProfileSettings(maxFiles: int = ..., /) -> None: ... def LoadString(stringId, /) -> str: ... -def MessageBox(message: str, arg, title: str | None = ..., /): ... +def MessageBox(message: str, title: str | None = ..., style=..., /): ... def OutputDebugString(msg: str, /) -> None: ... def EnableControlContainer(): ... def PrintTraceback(tb, output, /) -> None: ... @@ -131,7 +134,7 @@ def SetAppHelpPath(): ... def SetAppName(appName: str, /): ... def SetCurrentInstanceHandle(newVal, /): ... def SetCurrentResourceHandle(newVal, /): ... -def SetDialogBkColor(arg, arg1, /): ... +def SetDialogBkColor(clrCtlBk: int = ..., clrCtlText: int = ..., /) -> None: ... def SetProfileFileName(filename: str, /) -> None: ... def SetRegistryKey(key: str, /) -> None: ... def SetResource(dll, /) -> _win32typing.PyDLL: ... diff --git a/stubs/pywin32/pythonwin/win32uiole.pyi b/stubs/pywin32/pythonwin/win32uiole.pyi index b30d03947273..dd9ad968e523 100644 --- a/stubs/pywin32/pythonwin/win32uiole.pyi +++ b/stubs/pywin32/pythonwin/win32uiole.pyi @@ -5,7 +5,7 @@ def CreateInsertDialog() -> _win32typing.PyCOleInsertDialog: ... def CreateOleClientItem() -> _win32typing.PyCOleClientItem: ... def CreateOleDocument(template: _win32typing.PyCDocTemplate, fileName: str | None = ..., /) -> _win32typing.PyCOleDocument: ... def DaoGetEngine() -> _win32typing.PyIDispatch: ... -def GetIDispatchForWindow() -> _win32typing.PyIDispatch: ... +def GetIDispatchForWindow(Wnd, /) -> _win32typing.PyIDispatch: ... def OleGetUserCtrl(): ... def OleSetUserCtrl(bUserCtrl, /): ... def SetMessagePendingDelay(delay, /) -> None: ... diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index ecc636c5136a..f69047d2b454 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -1,7 +1,7 @@ from _typeshed import Incomplete, ReadableBuffer from collections.abc import Callable, Iterable -from typing import TypedDict -from typing_extensions import deprecated +from typing import NoReturn, TypedDict, overload +from typing_extensions import Never, deprecated import _win32typing from win32.lib.pywintypes import TimeType, error as error @@ -119,7 +119,7 @@ def GetProcAddress(hModule: int, functionName: _win32typing.PyResourceId, /): .. def GetProfileVal(section: str, entry: str, defValue: str, iniName: str | None = ..., /) -> str: ... def GetShortPathName(path: str, /) -> str: ... def GetStdHandle(handle: int, /) -> _win32typing.PyHANDLE: ... -def GetSysColor(index, /): ... +def GetSysColor(index: int, /) -> int: ... def GetSystemDefaultLangID(): ... def GetSystemDefaultLCID(): ... def GetSystemDirectory() -> str: ... @@ -153,7 +153,7 @@ def LoadLibrary(fileName: str, /): ... def LoadLibraryEx(fileName: str, handle: int, handle1, /) -> int: ... def LoadResource(handle: int, _type: _win32typing.PyResourceId, name: _win32typing.PyResourceId, language, /) -> str: ... def LoadString(handle: int, stringId, numChars: int = ..., /) -> str: ... -def MessageBeep(arg, /): ... +def MessageBeep(type: int, /): ... def MessageBox(hwnd: int | None, message: str, title: str | None = ..., style=..., language=..., /) -> int: ... def MonitorFromPoint(pt: tuple[Incomplete, Incomplete], Flags: int = ...) -> int: ... def MonitorFromRect(rc: _win32typing.PyRECT | tuple[int, int, int, int], Flags: int = ...) -> int: ... @@ -248,6 +248,9 @@ def Sleep(time, bAlterable: int = ..., /): ... def TerminateProcess(handle: int, exitCode: int, /) -> None: ... def ToAsciiEx(vk, scancode, keyboardstate, flags: int = ..., hlayout: Incomplete | None = ..., /): ... def Unicode() -> str: ... +@overload +def UpdateResource(handle: Never, type: Never, name: Never, data: str, language: Never, /) -> NoReturn: ... +@overload def UpdateResource( handle: int, type: _win32typing.PyResourceId | int, @@ -256,7 +259,7 @@ def UpdateResource( language: int = ..., /, ) -> None: ... -def VkKeyScan(char, char1, /): ... +def VkKeyScan(char: str | bytes, /): ... def WinExec(cmdLine: str, arg, /) -> None: ... def WinHelp(hwnd: int, hlpFile: str, cmd, data: str | int = ..., /) -> None: ... @deprecated("This function is obsolete, applications should use the registry instead.") @@ -267,7 +270,7 @@ def HIBYTE(val: int, /) -> int: ... def LOBYTE(val: int, /) -> int: ... def HIWORD(val: int, /) -> int: ... def LOWORD(val: int, /) -> int: ... -def RGB(red, green, blue, /): ... +def RGB(red: int, green: int, blue: int, /) -> int: ... def MAKELANGID(PrimaryLanguage, SubLanguage, /): ... def MAKEWORD(low, high, /): ... def MAKELONG(low, high, /): ... diff --git a/stubs/pywin32/win32/win32gui.pyi b/stubs/pywin32/win32/win32gui.pyi index a4f6a7f4729a..895689a9468f 100644 --- a/stubs/pywin32/win32/win32gui.pyi +++ b/stubs/pywin32/win32/win32gui.pyi @@ -145,7 +145,7 @@ def AlphaBlend( blendFunction: _win32typing.PyBLENDFUNCTION, /, ) -> None: ... -def MessageBox(parent, text: str, caption: str, flags, /): ... +def MessageBox(parent: _win32typing.PyHANDLE | int | None, text: str, caption: str, flags, /): ... def MessageBeep(_type, /) -> None: ... def CreateWindow( className: str | _win32typing.PyResourceId, @@ -227,7 +227,9 @@ 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, Point: tuple[Incomplete, Incomplete], /) -> tuple[Incomplete, Incomplete]: ... +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 PaintDesktop(hdc: int, /) -> None: ... def RedrawWindow(hWnd: int, rcUpdate: tuple[int, int, int, int], hrgnUpdate: _win32typing.PyGdiHANDLE, flags, /) -> None: ... @@ -347,7 +349,7 @@ def CreateSolidBrush(Color, /) -> _win32typing.PyGdiHANDLE: ... def CreatePatternBrush(hbmp: _win32typing.PyGdiHANDLE, /) -> _win32typing.PyGdiHANDLE: ... def CreateHatchBrush(Style, clrref, /) -> _win32typing.PyGdiHANDLE: ... def CreatePen(PenStyle, Width, Color, /) -> _win32typing.PyGdiHANDLE: ... -def GetSysColor(Index, /): ... +def GetSysColor(Index: int, /) -> int: ... def GetSysColorBrush(Index, /) -> _win32typing.PyGdiHANDLE: ... def InvalidateRect(hWnd: int, Rect: _win32typing.PyRECT, Erase, /) -> None: ... def FrameRect(hDC: int, rc: _win32typing.PyRECT, hbr: _win32typing.PyGdiHANDLE, /) -> None: ... @@ -355,7 +357,7 @@ def InvertRect(hDC: int, rc: _win32typing.PyRECT, /) -> None: ... def WindowFromDC(hDC: int, /) -> int: ... def GetUpdateRgn(hWnd: int, hRgn: _win32typing.PyGdiHANDLE, Erase, /): ... def GetWindowRgn(hWnd: int, hRgn: _win32typing.PyGdiHANDLE, /): ... -def SetWindowRgn(hWnd: int, hRgn: _win32typing.PyGdiHANDLE, Redraw, /) -> None: ... +def SetWindowRgn(hWnd: int, hRgn: _win32typing.PyGdiHANDLE | None, Redraw: bool, /) -> None: ... 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]: ... diff --git a/stubs/pywin32/win32/win32service.pyi b/stubs/pywin32/win32/win32service.pyi index 81dbb56a2e10..e066194ea49d 100644 --- a/stubs/pywin32/win32/win32service.pyi +++ b/stubs/pywin32/win32/win32service.pyi @@ -18,7 +18,9 @@ def GetProcessWindowStation() -> _win32typing.PyHWINSTA: ... def CreateWindowStation( WindowStation, Flags, DesiredAccess, SecurityAttributes: _win32typing.PySECURITY_ATTRIBUTES, / ) -> _win32typing.PyHWINSTA: ... -def EnumServicesStatus(hSCManager: _win32typing.PySC_HANDLE, ServiceType, ServiceState, /) -> tuple[Incomplete, ...]: ... +def EnumServicesStatus( + hSCManager: _win32typing.PySC_HANDLE | int, ServiceType: int = ..., ServiceState: int = ..., / +) -> tuple[Incomplete, ...]: ... def EnumServicesStatusEx( SCManager: _win32typing.PySC_HANDLE, ServiceType, ServiceState, InfoLevel, GroupName: Incomplete | None = ..., / ) -> tuple[Incomplete, ...]: ... From f2e948440bf1cabe8acac24e7f3951a3710732de Mon Sep 17 00:00:00 2001 From: Avasam Date: Mon, 25 Mar 2024 22:26:56 -0400 Subject: [PATCH 5/6] callback expects int | None --- stubs/pywin32/win32/win32gui.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stubs/pywin32/win32/win32gui.pyi b/stubs/pywin32/win32/win32gui.pyi index 895689a9468f..46c34e8ed359 100644 --- a/stubs/pywin32/win32/win32gui.pyi +++ b/stubs/pywin32/win32/win32gui.pyi @@ -54,9 +54,9 @@ def RegisterWindowMessage(name: str, /): ... def DefWindowProc( hwnd: int | None, message: int, wparam: ReadableBuffer | float | None, lparam: ReadableBuffer | float | None, / ) -> int: ... -def EnumWindows(callback: Callable[[int, _T], object], extra: _T, /) -> None: ... -def EnumThreadWindows(dwThreadId, callback: Callable[[int, _T], object], extra: _T, /) -> None: ... -def EnumChildWindows(hwnd: int | None, callback: Callable[[int, _T], object], extra: _T, /) -> None: ... +def EnumWindows(callback: Callable[[int, _T], int | None], extra: _T, /) -> None: ... +def EnumThreadWindows(dwThreadId, callback: Callable[[int, _T], int | None], extra: _T, /) -> None: ... +def EnumChildWindows(hwnd: int | None, callback: Callable[[int, _T], int | None], extra: _T, /) -> None: ... def DialogBox(hInstance: int, TemplateName: _win32typing.PyResourceId, hWndParent: int, DialogFunc, InitParam: int = ..., /): ... def DialogBoxParam(): ... def DialogBoxIndirect( From a8facd2e3853e502dd522ba3e52f0dbcc5cce5ac Mon Sep 17 00:00:00 2001 From: Avasam Date: Sat, 30 Mar 2024 14:16:44 -0400 Subject: [PATCH 6/6] Post-merge fixes and updates --- stubs/pywin32/_win32typing.pyi | 10 +++++++--- stubs/pywin32/win32/win32api.pyi | 9 +++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/stubs/pywin32/_win32typing.pyi b/stubs/pywin32/_win32typing.pyi index 7c4eb6d57815..c80e822b0d10 100644 --- a/stubs/pywin32/_win32typing.pyi +++ b/stubs/pywin32/_win32typing.pyi @@ -7,6 +7,7 @@ from typing_extensions import Self, TypeAlias, deprecated from win32.lib.pywintypes import TimeType _TwoIntSequence: TypeAlias = Sequence[int] +_FourIntSequence: TypeAlias = Sequence[int] class ArgNotFound: ... class PyOleEmpty: ... @@ -5969,9 +5970,12 @@ class PyCWnd: def SetWindowPos( self, hWndInsertAfter, position: tuple[Incomplete, Incomplete, Incomplete, Incomplete], flags, / ) -> None: ... - def ScreenToClient( - self, rect: tuple[Incomplete, Incomplete, Incomplete, Incomplete], / - ) -> tuple[Incomplete, Incomplete, Incomplete, Incomplete]: ... + @overload + def ScreenToClient(self, rect: tuple[int, int], /) -> tuple[int, int]: ... + @overload + def ScreenToClient(self, rect: tuple[int, int, int, int], /) -> tuple[int, int, int, int]: ... + @overload + def ScreenToClient(self, rect: _TwoIntSequence | _FourIntSequence, /) -> tuple[int, int] | tuple[int, int, int, int]: ... def SetCapture(self) -> None: ... def SetDlgItemText(self, idControl, text: str, /) -> None: ... def SetFocus(self) -> None: ... diff --git a/stubs/pywin32/win32/win32api.pyi b/stubs/pywin32/win32/win32api.pyi index f69047d2b454..658a50174835 100644 --- a/stubs/pywin32/win32/win32api.pyi +++ b/stubs/pywin32/win32/win32api.pyi @@ -1,7 +1,7 @@ from _typeshed import Incomplete, ReadableBuffer from collections.abc import Callable, Iterable -from typing import NoReturn, TypedDict, overload -from typing_extensions import Never, deprecated +from typing import TypedDict +from typing_extensions import deprecated import _win32typing from win32.lib.pywintypes import TimeType, error as error @@ -199,7 +199,7 @@ def RegOpenKeyTransacted( ) -> _win32typing.PyHKEY: ... def RegOverridePredefKey(Key: _win32typing.PyHKEY, NewKey: _win32typing.PyHKEY) -> None: ... def RegQueryValue(key: _win32typing.PyHKEY | int, subKey: str | None, /) -> str: ... -def RegQueryValueEx(key: _win32typing.PyHKEY | int, valueName: str, /) -> tuple[str, int]: ... +def RegQueryValueEx(key: _win32typing.PyHKEY | int, valueName: str | None, /) -> tuple[str, int]: ... def RegQueryInfoKey(key: _win32typing.PyHKEY, /) -> tuple[Incomplete, Incomplete, Incomplete]: ... def RegQueryInfoKeyW(Key: _win32typing.PyHKEY, /): ... def RegRestoreKey(Key: _win32typing.PyHKEY, File: str, Flags: int = ...) -> None: ... @@ -248,9 +248,6 @@ def Sleep(time, bAlterable: int = ..., /): ... def TerminateProcess(handle: int, exitCode: int, /) -> None: ... def ToAsciiEx(vk, scancode, keyboardstate, flags: int = ..., hlayout: Incomplete | None = ..., /): ... def Unicode() -> str: ... -@overload -def UpdateResource(handle: Never, type: Never, name: Never, data: str, language: Never, /) -> NoReturn: ... -@overload def UpdateResource( handle: int, type: _win32typing.PyResourceId | int,