From f2dd0ac3f143ef96c4e01409fc38dc46c29889d8 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 20:58:41 -0700 Subject: [PATCH 01/62] dx9 --- CMakeLists.txt | 23 +++ Jenkinsfile | 8 +- NTMakefile | 21 ++- WatMakefile | 9 +- configure | 8 +- examples/CMakeLists.txt | 9 +- examples/dxdemos/CMakeLists.txt | 24 +++ examples/dxdemos/directx9.c | 93 +++++++++ include/Mw/Widget/DirectX.h | 53 ++++++ pl/rules.pl | 8 + resource/FindDirectX.cmake | 325 ++++++++++++++++++++++++++++++++ src/widget/directx.c | 96 ++++++++++ tools/genmk.pl | 36 +++- 13 files changed, 698 insertions(+), 15 deletions(-) create mode 100644 examples/dxdemos/CMakeLists.txt create mode 100644 examples/dxdemos/directx9.c create mode 100644 include/Mw/Widget/DirectX.h create mode 100644 resource/FindDirectX.cmake create mode 100644 src/widget/directx.c diff --git a/CMakeLists.txt b/CMakeLists.txt index f5bb7805..622df5d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,10 @@ else() option(MW_TRY_OPENGL "Try to compile OpenGL widget or not" ON) option(MW_TRY_VULKAN "Try to compile Vulkan widget or not" ON) endif() +if(${CMAKE_SYSTEM_NAME} MATCHES Windows) + option(MW_TRY_DIRECTX "Try to compile DirectX widget or not" ON) +endif() + option(MW_INSTALL_HEADERS "Install headers" ON) @@ -90,6 +94,16 @@ if(MW_TRY_VULKAN) endif() endif() +if(MW_TRY_DIRECTX) + include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) + if(DIRECTX_FOUND) + set(MW_BUILD_DIRECTX ON) + message(STATUS "DirectX widget has been enabled") + else() + message(STATUS "DirectX widget has been disabled") + endif() +endif() + if(MW_BUILD_STATIC) message(STATUS "Building Milsko as a static library") add_library( @@ -477,6 +491,15 @@ if(MW_BUILD_VULKAN) endif() endif() +if(MW_BUILD_DIRECTX) + list(APPEND LIBRARIES ${DIRECTX_D3DX9_LIBRARIES}) + target_compile_definitions( + Mw + PRIVATE + MW_DIRECTX + ) +endif() + target_compile_definitions( Mw PRIVATE diff --git a/Jenkinsfile b/Jenkinsfile index 9b7d6397..6d93874c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-vulkan --without-vulkan-string-helper") + sh("./configure --enable-opengl --enable-directx --enable-vulkan --without-vulkan-string-helper") sh("make -j4") sh("mv src/libMw.so libMw64.so") archiveArtifacts("libMw64.so") @@ -42,7 +42,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --cross --target=Windows --host=i686-w64-mingw32") + sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=i686-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw32.dll") sh("mv src/libMw.dll.a libMw32.dll.a") @@ -55,7 +55,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --cross --target=Windows --host=x86_64-w64-mingw32") + sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=x86_64-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw64.dll") sh("mv src/libMw.dll.a libMw64.dll.a") @@ -80,7 +80,7 @@ pipeline { } environment { WATCOM = "/usr/watcom" - INCLUDE = "/usr/watcom/h:/usr/watcom/h/nt" + INCLUDE = "/usr/watcom/h:/usr/watcom/h/nt:/usr/watcom/h/nt/directx" PATH = "/usr/watcom/binl64:${env.PATH}" } steps { diff --git a/NTMakefile b/NTMakefile index b07f798a..37b4a950 100644 --- a/NTMakefile +++ b/NTMakefile @@ -1,7 +1,20 @@ CC = cl /TC /c /nologo LD = link /nologo -MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL +!if [where d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!endif +!else +!if [echo DX9_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx9flags.mk") +!include "dx9flags.mk" +!else +DX9_FLAGS = +!endif + +MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX9_FLAGS) MW_LDFLAGS = /DLL EXE_CFLAGS = /Iinclude EXE_LDFLAGS = @@ -86,6 +99,7 @@ clean: del /f /q src\widget\checkbox.obj del /f /q src\widget\clock.obj del /f /q src\widget\combobox.obj + del /f /q src\widget\directx.obj del /f /q src\widget\document.obj del /f /q src\widget\entry.obj del /f /q src\widget\frame.obj @@ -108,6 +122,7 @@ clean: del /f /q src\widget\window.obj del /f /q src\Mw.dll del /f /q src\Mw.lib + del /f /q dx9flags.mk del /f /q examples\basic\box.obj del /f /q examples\basic\calculator.obj del /f /q examples\basic\checkbox.obj @@ -342,8 +357,8 @@ examples\gldemos\tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) /Fo$@ examples/gldemos/tripaint.c -src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj - $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib +src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj + $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib .c.obj: diff --git a/WatMakefile b/WatMakefile index fd980790..09a942d0 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,7 +1,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt @@ -85,6 +85,7 @@ clean: .SYMBOLIC %erase src/widget/checkbox.obj %erase src/widget/clock.obj %erase src/widget/combobox.obj + %erase src/widget/directx.obj %erase src/widget/document.obj %erase src/widget/entry.obj %erase src/widget/frame.obj @@ -341,8 +342,8 @@ examples/gldemos/tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/gldemos/tripaint.c -src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj - $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib +src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/directx.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj + $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/directx.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib @@ -498,6 +499,8 @@ src/widget/clock.obj: src/widget/clock.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/clock.c src/widget/combobox.obj: src/widget/combobox.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/combobox.c +src/widget/directx.obj: src/widget/directx.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/directx.c src/widget/document.obj: src/widget/document.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/document.c src/widget/entry.obj: src/widget/entry.c diff --git a/configure b/configure index 44db66d8..f6ff13bc 100755 --- a/configure +++ b/configure @@ -54,6 +54,9 @@ param_set("examples", 1); # (option that only makes sense on x11) param_set("allow-sloppy-focus", 0); +# (option that only makes sense on Windows) +param_set("directx", 0); + my %features = ( "classic-theme" => "use classic theme", "stb-image" => "use stb_image, instead use libjpeg/libpng", @@ -69,7 +72,8 @@ my %features = ( "wayland" => "enable wayland backend", "gnustep" => "use gnustep", "dbus" => "use DBus on supported platform", - "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus" + "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus", + "directx" => "(Windows only) build DirectX widget" ); my @features_keys = ( "1classic-theme", "1stb-image", @@ -78,7 +82,7 @@ my @features_keys = ( "1vulkan", "2vulkan-string-helper", "1shared", "1static", "1wayland", "1gnustep", - "1dbus" + "1dbus", "1directx" ); sub def_platform { diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5baed4a8..4ac6962b 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,12 @@ add_subdirectory(basic) if(${MW_TRY_OPENGL}) -add_subdirectory(gldemos) + add_subdirectory(gldemos) endif() if(${MW_TRY_VULKAN}) -add_subdirectory(vkdemos) + add_subdirectory(vkdemos) +endif() +if(WIN32) + if(${MW_TRY_DIRECTX}) + add_subdirectory(dxdemos) + endif() endif() diff --git a/examples/dxdemos/CMakeLists.txt b/examples/dxdemos/CMakeLists.txt new file mode 100644 index 00000000..38265e1c --- /dev/null +++ b/examples/dxdemos/CMakeLists.txt @@ -0,0 +1,24 @@ +file( + GLOB + EXAMPLES_DIRECTX_SOURCES + *.c +) +include(${CMAKE_CURRENT_SOURCE_DIR}/../../resource/FindDirectX.cmake) + +if(${DIRECTX_FOUND}) + foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) + get_filename_component(TARGET ${PATH} NAME_WE) + add_executable(${TARGET} MACOSX_BUNDLE ${PATH}) + target_include_directories( + ${TARGET} + PRIVATE + ${DIRECTX_INCLUDE_DIRS} + ) + target_link_libraries( + ${TARGET} + PRIVATE + Mw + ${DIRECTX_D3DX9_LIBRARIES} + ) + endforeach() +endif() diff --git a/examples/dxdemos/directx9.c b/examples/dxdemos/directx9.c new file mode 100644 index 00000000..6b28ac02 --- /dev/null +++ b/examples/dxdemos/directx9.c @@ -0,0 +1,93 @@ +/* + * Adapted from: + * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-1 + * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-4 + */ +#include +#include + +MwWidget window, d3d9; +LPDIRECT3D9 d3d; +LPDIRECT3DDEVICE9 d3ddev; +LPDIRECT3DVERTEXBUFFER9 v_buffer; + +struct CUSTOMVERTEX { + FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag + DWORD color; // from the D3DFVF_DIFFUSE flag +}; +#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) + +static void MWAPI draw(MwWidget handle, void* user, void* client) { + // clear the window to a deep blue + d3ddev->lpVtbl->Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); + + d3ddev->lpVtbl->BeginScene(d3ddev); // begins the 3D scene + + // select which vertex format we are using + d3ddev->lpVtbl->SetFVF(d3ddev, CUSTOMFVF); + + // select the vertex buffer to display + d3ddev->lpVtbl->SetStreamSource(d3ddev, 0, v_buffer, 0, sizeof(struct CUSTOMVERTEX)); + + // copy the vertex buffer to the back buffer + d3ddev->lpVtbl->DrawPrimitive(d3ddev, D3DPT_TRIANGLELIST, 0, 1); + + d3ddev->lpVtbl->EndScene(d3ddev); // ends the 3D scene + + d3ddev->lpVtbl->Present(d3ddev, NULL, NULL, NULL, NULL); // displays the created frame +} + +int main() { + MwLibraryInit(); + + window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); + + d3d9 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + + d3d = MwDirectXGetD3D9(d3d9); + d3ddev = MwDirectXGetD3Dev9(d3d9); + + // create three vertices using the CUSTOMVERTEX struct built earlier + struct CUSTOMVERTEX vertices[] = + { + { + 400.0f, + 0.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 0, 255), + }, + { + 800.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 255, 0), + }, + { + 0.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(255, 0, 0), + }, + }; + + d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, + 3 * sizeof(struct CUSTOMVERTEX), + 0, + CUSTOMFVF, + D3DPOOL_MANAGED, + &v_buffer, + NULL); + + VOID* pVoid; // the void pointer + + v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (void**)&pVoid, 0); // lock the vertex buffer + memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer + v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer + + MwAddUserHandler(window, MwNtickHandler, draw, NULL); + + MwLoop(window); +} diff --git a/include/Mw/Widget/DirectX.h b/include/Mw/Widget/DirectX.h new file mode 100644 index 00000000..a81b4aee --- /dev/null +++ b/include/Mw/Widget/DirectX.h @@ -0,0 +1,53 @@ +/*! + * @file Mw/Widget/DirectX.h + * @brief DirectX widget. + * @warning Only avaliable on Windows. + */ +#ifndef __MW_WIDGET_DIRECTX_H__ +#define __MW_WIDGET_DIRECTX_H__ + +#include +#include +#include + +#if !defined(MW_DIRECTX_NO_INCLUDE) + +/* https://github.com/microsoft/Windows-classic-samples/issues/317 */ +#if defined(__MINGW32__) || defined(__MINGW64__) +#define NTDDI_VERSION 0x07000000 +#define _WIN32_WINNT 0x0A00 + +#endif + +#include +#endif + +#ifndef _WIN32 +#error DirectX widget only avaliable for Win32 backends +#endif + +/*! + * @brief D3D9 widget class + */ +MWDECL MwClass MwD3D9Class; + +#ifdef __cplusplus +extern "C" { +#endif + +MwInline LPDIRECT3D9 MwDirectXGetD3D9(MwWidget handle) { + LPDIRECT3D9 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); + return out; +}; +MwInline LPDIRECT3DDEVICE9 MwDirectXGetD3Dev9(MwWidget handle) { + LPDIRECT3DDEVICE9 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); + return out; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pl/rules.pl b/pl/rules.pl index f12c0922..2f336cb0 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -178,6 +178,7 @@ new_object("src/widget/window.c"); new_object("src/widget/opengl.c"); new_object("src/widget/vulkan.c"); +new_object("src/widget/directx.c"); if (param_get("opengl")) { add_cflags("-DMW_OPENGL"); @@ -185,6 +186,9 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } +if (param_get("directx")) { + add_cflags("-DMW_DIRECTX"); +} new_object("src/dialog/*.c"); @@ -230,4 +234,8 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } +if (param_get("directx")) { + new_example("examples/dxdemos/directx9"); +} + 1; diff --git a/resource/FindDirectX.cmake b/resource/FindDirectX.cmake new file mode 100644 index 00000000..89b96ec0 --- /dev/null +++ b/resource/FindDirectX.cmake @@ -0,0 +1,325 @@ +# - try to find part of DirectX SDK +# +# Cache Variables: (probably not for direct use in your scripts) +# DIRECTX_INCLUDE_DIR +# +# Variables you should use in your CMakeLists.txt: +# DIRECTX_DXGUID_LIBRARY - deprecated, see below +# DIRECTX_DXERR_LIBRARY - deprecated, see http://blogs.msdn.com/b/chuckw/archive/2012/04/24/where-s-dxerr-lib.aspx +# DIRECTX_DINPUT_LIBRARY +# DIRECTX_DINPUT_INCLUDE_DIR +# DIRECTX_D3D9_LIBRARY +# DIRECTX_D3DXOF_LIBRARY +# DIRECTX_D3DX9_LIBRARIES +# DIRECTX_INCLUDE_DIRS +# DIRECTX_FOUND - if this is not true, do not attempt to use this library +# +# Defines these macros: +# find_directx_include - wrapper for find_path that provides PATHS, HINTS, and PATH_SUFFIXES. +# find_directx_library - wrapper for find_library that provides PATHS, HINTS, and PATH_SUFFIXES. +# Requires these CMake modules: +# FindPackageHandleStandardArgs (known included with CMake >=2.6.2) +# SelectLibraryConfigurations +# +# Original Author: +# 2012 Rylie Pavlik +# https://ryliepavlik.com/ +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright 2012, Iowa State University +# +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) +# +# SPDX-License-Identifier: BSL-1.0 + + +set(DIRECTX_ROOT_DIR + "${DIRECTX_ROOT_DIR}" + CACHE + PATH + "Root directory to search for DirectX") + +if(MSVC) + file(TO_CMAKE_PATH "$ENV{ProgramFiles}" _PROG_FILES) + set(_PF86 "ProgramFiles(x86)") + file(TO_CMAKE_PATH "$ENV{${_PF86}}" _PROG_FILES_X86) + if(_PROG_FILES_X86) + set(_PROG_FILES "${_PROG_FILES_X86}") + endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_dx_lib_suffixes lib/x64 lib) + else() + set(_dx_lib_suffixes lib/x86 lib) + endif() + set(DXSDK_DIRS) + + set(_dx_quiet) + if(DirectX_FIND_QUIETLY) + set(_dx_quiet QUIET) + endif() + find_package(WindowsSDK ${_dx_quiet}) + if(WINDOWSSDK_FOUND) + foreach(_dir ${WINDOWSSDK_DIRS}) + get_windowssdk_include_dirs(${_dir} _include_dirs) + if(_include_dirs) + list(APPEND DXSDK_DIRS ${_include_dirs}) + endif() + endforeach() + endif() + + macro(_append_dxsdk_in_inclusive_range _low _high) + if((NOT MSVC_VERSION LESS ${_low}) AND (NOT MSVC_VERSION GREATER ${_high})) + list(APPEND DXSDK_DIRS ${ARGN}) + endif() + endmacro() + _append_dxsdk_in_inclusive_range(1500 1600 "${_PROG_FILES}/Microsoft DirectX SDK (June 2010)") + _append_dxsdk_in_inclusive_range(1400 1600 + "${_PROG_FILES}/Microsoft DirectX SDK (February 2010)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2009)" + "${_PROG_FILES}/Microsoft DirectX SDK (March 2009)" + "${_PROG_FILES}/Microsoft DirectX SDK (November 2008)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2008)" + "${_PROG_FILES}/Microsoft DirectX SDK (June 2008)" + "${_PROG_FILES}/Microsoft DirectX SDK (March 2008)") + _append_dxsdk_in_inclusive_range(1310 1500 + "${_PROG_FILES}/Microsoft DirectX SDK (November 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (June 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (April 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (February 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (December 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (October 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (June 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (April 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (February 2006)") + + file(TO_CMAKE_PATH "$ENV{DXSDK_DIR}" ENV_DXSDK_DIR) + if(ENV_DXSDK_DIR) + list(APPEND DXSDK_DIRS ${ENV_DXSDK_DIR}) + endif() +else() + set(_dx_lib_suffixes lib) + set(DXSDK_DIRS /mingw) +endif() + +find_path(DIRECTX_INCLUDE_DIR + NAMES + dxdiag.h + dinput.h + dxerr8.h + PATHS + ${DXSDK_DIRS} + HINTS + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + include) +find_path(DIRECTX_DINPUT_INCLUDE_DIR + NAMES + dinput.h + PATHS + ${DXSDK_DIRS} + HINTS + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + include) + +set(DXLIB_HINTS) +if(WINDOWSSDK_FOUND AND DIRECTX_INCLUDE_DIR) + get_windowssdk_from_component("${DIRECTX_INCLUDE_DIR}" _winsdk) + if(_winsdk) + get_windowssdk_library_dirs("${_winsdk}" _libdirs) + if(_libdirs) + list(APPEND DXLIB_HINTS ${_libdirs}) + endif() + endif() +endif() + +if(WINDOWSSDK_FOUND AND DIRECTX_DINPUT_INCLUDE_DIR) + get_windowssdk_from_component("${DIRECTX_DINPUT_INCLUDE_DIR}" _winsdk) + if(_winsdk) + get_windowssdk_library_dirs("${_winsdk}" _includes) + if(_includes) + list(APPEND DXLIB_HINTS ${_includes}) + endif() + endif() +endif() + +find_library(DIRECTX_DXGUID_LIBRARY + NAMES + dxguid + PATHS + ${DXLIB_HINTS} + ${DXSDK_DIRS} + HINTS + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +if(DIRECTX_DXGUID_LIBRARY) + get_filename_component(_dxsdk_lib_dir ${DIRECTX_DXGUID_LIBRARY} PATH) + list(APPEND DXLIB_HINTS "${_dxsdk_lib_dir}") +endif() + +find_library(DIRECTX_DINPUT_LIBRARY + NAMES + dinput8 + dinput + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_DXERR_LIBRARY + NAMES + dxerr + dxerr9 + dxerr8 + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3D9_LIBRARY + NAMES + d3d9 + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3DXOF_LIBRARY + NAMES + d3dxof + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3DX9_LIBRARY_RELEASE + NAMES + d3dx9 + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3DX9_LIBRARY_DEBUG + NAMES + d3dx9d + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_XINPUT_LIBRARY + NAMES + Xinput9_1_0 + Xinput + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +include(SelectLibraryConfigurations) +select_library_configurations(DIRECTX_D3DX9) + +set(DIRECTX_EXTRA_CHECK) +if(DIRECTX_INCLUDE_DIR) + if(MSVC80) + set(DXSDK_DEPRECATION_BUILD 1962) + endif() + + if(DXSDK_DEPRECATION_BUILD) + include(CheckCSourceCompiles) + set(_dinput_old_includes ${CMAKE_REQUIRED_INCLUDES}) + set(CMAKE_REQUIRED_INCLUDES "${DIRECTX_INCLUDE_DIR}") + check_c_source_compiles(" + #include + #if _DXSDK_BUILD_MAJOR >= ${DXSDK_DEPRECATION_BUILD} + #error + #else + int main(int argc, char * argv[]) { + return 0; + } + #endif + " + DIRECTX_SDK_SUPPORTS_COMPILER) + set(DIRECTX_EXTRA_CHECK DIRECTX_SDK_SUPPORTS_COMPILER) + set(CMAKE_REQUIRED_INCLUDES "${_dinput_old_includes}") + else() + # Until proven otherwise. + set(DIRECTX_SDK_SUPPORTS_COMPILER TRUE) + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(DirectX + DEFAULT_MSG + DIRECTX_DXGUID_LIBRARY + DIRECTX_DINPUT_LIBRARY + DIRECTX_INCLUDE_DIR + ${DIRECTX_EXTRA_CHECK}) + +if(DIRECTX_FOUND) + set(DIRECTX_LIBRARIES + "${DIRECTX_DXGUID_LIBRARY}" + "${DIRECTX_DINPUT_LIBRARY}") + + set(DIRECTX_INCLUDE_DIRS "${DIRECTX_INCLUDE_DIR}") + + mark_as_advanced(DIRECTX_ROOT_DIR) +endif() + +macro(find_directx_library) + find_library(${ARGN} + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) +endmacro() +macro(find_directx_include) + find_path(${ARGN} + PATHS + ${DXSDK_DIRS} + HINTS + ${DIRECTX_INCLUDE_DIR} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + include) +endmacro() + +mark_as_advanced(DIRECTX_DINPUT_LIBRARY + DIRECTX_DXGUID_LIBRARY + DIRECTX_DXERR_LIBRARY + DIRECTX_D3D9_LIBRARY + DIRECTX_D3DXOF_LIBRARY + DIRECTX_D3DX9_LIBRARY_RELEASE + DIRECTX_D3DX9_LIBRARY_DEBUG + DIRECTX_INCLUDE_DIR) diff --git a/src/widget/directx.c b/src/widget/directx.c new file mode 100644 index 00000000..7465d69d --- /dev/null +++ b/src/widget/directx.c @@ -0,0 +1,96 @@ +#include + +#ifndef MW_DIRECTX +#define MW_DIRECTX_NO_INCLUDE +MWDECL MwClass MwDX9Class; + +MwClass MwDX9Class = NULL; +#else +#include + +typedef struct gdid3d9 { + void* d3d9dll; + IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); + + LPDIRECT3D9 d3d; // the pointer to our Direct3D interface + LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class\ + +} gdid3d9_t; + +static int wcreate(MwWidget handle) { + void* r = NULL; + MwWidget w = handle; + gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); + + o->d3d9dll = LoadLibrary("d3d9.dll"); + if(!o->d3d9dll) { + MessageBox(NULL, "d3d9.dll not found! Is DirectX9 installed?", "Error", MB_OK); + ExitProcess(-1); + } + o->Direct3DCreate9 = (void*)GetProcAddress(o->d3d9dll, "Direct3DCreate9"); + + o->d3d = o->Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface + + D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information + + ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use + d3dpp.Windowed = TRUE; // program windowed, not fullscreen + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames + d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; // set the window to be used by Direct3D + + // create a device class using this information and information from the d3dpp stuct + o->d3d->lpVtbl->CreateDevice(o->d3d, + D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + handle->lowlevel->gdi.hWnd, + D3DCREATE_MIXED_VERTEXPROCESSING, + &d3dpp, + &o->d3ddev); + + handle->internal = o; + + return 0; +} + +static void destroy(MwWidget handle) { + MwWidget w = handle; + gdid3d9_t* o = handle->internal; + + o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device + o->d3d->lpVtbl->Release(o->d3d); // close and release Direct3D + + free(handle->internal); +} + +static void func_handler(MwWidget handle, const char* name, void* out, + va_list va) { + gdid3d9_t* o = handle->internal; + + if(strcmp(name, "mwDirectXGetD3D9") == 0) { + *(LPDIRECT3D9*)out = o->d3d; + } + if(strcmp(name, "mwDirectXGetD3Dev9") == 0) { + *(LPDIRECT3DDEVICE9*)out = o->d3ddev; + } +} + +MwClassRec MwDX9ClassRec = {wcreate, /* create */ + destroy, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ + NULL, NULL, NULL}; +MwClass MwD3D9Class = &MwDX9ClassRec; +#endif diff --git a/tools/genmk.pl b/tools/genmk.pl index 26a7ebbb..ad1495f4 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,6 +42,23 @@ sub cobjs { return $r; } +sub dx9_detect_block { + return <<'EOF'; +!if [where d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!endif +!else +!if [echo DX9_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx9flags.mk") +!include "dx9flags.mk" +!else +DX9_FLAGS = +!endif +EOF +} + sub generate { my ($output, $type) = @_; @@ -65,6 +82,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; + my $dx9_flags = ""; + my $dx9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -88,6 +107,12 @@ sub generate { $def = "/D"; $inc = "/I"; $dll = "/DLL"; + + # DX9 headers aren't part of every MSVC/Windows SDK install, so probe + # PATH for a d3d9.h at build time (on the machine actually running + # nmake) rather than baking in a yes/no here. + $dx9_flags = "\$(DX9_FLAGS)"; + $dx9_block = dx9_detect_block(); } elsif ($type eq "Watcom") { $cc = "wcc386 -bt=nt -q"; @@ -109,14 +134,20 @@ sub generate { $prefobj = "file "; $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; + + $dx9_flags = "${def}MW_DIRECTX"; } open(OUT, ">", $output); print(OUT "CC = $cc\n"); print(OUT "LD = $link\n"); print(OUT "\n"); + if ($dx9_block ne "") { + print(OUT $dx9_block); + print(OUT "\n"); + } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); @@ -152,6 +183,9 @@ sub generate { } print(OUT " $del src${dir}Mw.dll\n"); print(OUT " $del src${dir}Mw.lib\n"); + if ($dx9_block ne "") { + print(OUT " $del dx9flags.mk\n"); + } foreach my $f (@examples) { my $b = $f; $b =~ s/\.c$/.obj/; From 2b15e7e0a3a5aac4fff6af8ad7c26a7d73821108 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 13:11:34 +0900 Subject: [PATCH 02/62] introducde underline and strikethrough --- include/Mw/StringDefs.h | 2 ++ milsko.xml | 8 +++++--- src/core.c | 24 ++++++++++++++++-------- src/draw.c | 4 +++- src/text/text.c | 33 +++++++++++++++++++++++++++------ 5 files changed, 53 insertions(+), 18 deletions(-) diff --git a/include/Mw/StringDefs.h b/include/Mw/StringDefs.h index cf0a7233..8d00b409 100644 --- a/include/Mw/StringDefs.h +++ b/include/Mw/StringDefs.h @@ -58,6 +58,8 @@ #define MwNminute "Iminute" #define MwNsecond "Isecond" #define MwNtype "Itype" +#define MwNstrikethrough "Istrikethrough" +#define MwNunderline "Iunderline" #define MwNtitle "Stitle" #define MwNtext "Stext" diff --git a/milsko.xml b/milsko.xml index 5b904100..7a7410a9 100644 --- a/milsko.xml +++ b/milsko.xml @@ -105,13 +105,15 @@ - - - + + + + + diff --git a/src/core.c b/src/core.c index 481fa340..1403310f 100644 --- a/src/core.c +++ b/src/core.c @@ -69,7 +69,8 @@ static void lldrawhandler(MwLL handle, void* data) { static void lluphandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; MwMouse* p = data; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; if(p->button == MwMOUSE_LEFT) h->pressed = 0; h->mouse_point.x = p->point.x; @@ -83,7 +84,8 @@ static void lluphandler(MwLL handle, void* data) { static void lldownhandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; MwMouse* p = data; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; if(p->button == MwMOUSE_LEFT) h->pressed = 1; h->mouse_point.x = p->point.x; @@ -158,7 +160,8 @@ static void llmovehandler(MwLL handle, void* data) { static void llkeyhandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; int key = *(int*)data; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; MwDispatch3(h, key, key); MwDispatchUserHandler(h, MwNkeyHandler, data); @@ -166,28 +169,32 @@ static void llkeyhandler(MwLL handle, void* data) { static void llkeyrelhandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; MwDispatchUserHandler(h, MwNkeyReleaseHandler, data); } static void llfocusinhandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; MwDispatchUserHandler(h, MwNfocusInHandler, data); } static void llfocusouthandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; MwDispatchUserHandler(h, MwNfocusOutHandler, data); } static void llclipboardhandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; MwDispatch3(h, clipboard, data); MwDispatchUserHandler(h, MwNclipboardHandler, data); @@ -195,7 +202,8 @@ static void llclipboardhandler(MwLL handle, void* data) { static void lldraganddrophandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; - if(MwGetInteger(h, MwNdisabled) == 1) return; + int n; + if((n = MwGetInteger(h, MwNdisabled)) != MwDEFAULT && n) return; MwDispatchUserHandler(h, MwNdragAndDropHandler, data); } diff --git a/src/draw.c b/src/draw.c index eb15c76b..ab4c9cb2 100644 --- a/src/draw.c +++ b/src/draw.c @@ -39,7 +39,9 @@ static int hex(const char* txt, int len) { } static void color_set_disabled_if_disabled(MwWidget handle, MwLLColor rgb) { - if(MwGetInteger(handle, MwNdisabled) == 1) { + int n; + + if((n = MwGetInteger(handle, MwNdisabled)) != MwDEFAULT && n) { MwLLColor c = handle->parent == NULL ? NULL : MwParseColor(handle->parent, MwGetText(handle->parent, MwNbackground)); if(c != NULL) { diff --git a/src/text/text.c b/src/text/text.c index 45e58860..1c9f6e6d 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -82,8 +82,9 @@ void MwDrawText(MwWidget handle, MwFLFont ttf, MwPoint* point, const char* text, char* last = input; int cp; MwLLColor fadedColor = NULL; + int n; - if(MwGetInteger(handle, MwNdisabled) == 1) { + if((n = MwGetInteger(handle, MwNdisabled)) != MwDEFAULT && n) { MwLLColor c = handle->parent == NULL ? NULL : MwParseColor(handle->parent, MwGetText(handle->parent, MwNbackground)); if(c != NULL) { @@ -107,8 +108,10 @@ void MwDrawText(MwWidget handle, MwFLFont ttf, MwPoint* point, const char* text, input += MwUTF8ToUTF32(input, &cp); if(*input == 0 || cp == '\n') { - char* line = malloc(input - last + 1); - int i; + char* line = malloc(input - last + 1); + int i; + MwPoint l[2]; + int tw, th; if(!line) { printf("Out Of Memory\n"); @@ -134,20 +137,38 @@ void MwDrawText(MwWidget handle, MwFLFont ttf, MwPoint* point, const char* text, continue; } + tw = MwTextWidth(handle, ttf, line); + th = MwTextHeight(handle, ttf, line); + p.x = point->x; if(align == MwALIGNMENT_CENTER) { - p.x -= MwTextWidth(handle, ttf, line) / 2; + p.x -= tw / 2; } else if(align == MwALIGNMENT_END) { - p.x -= MwTextWidth(handle, ttf, line); + p.x -= tw; } + l[0].x = p.x; + l[1].x = l[0].x + tw; + #ifdef TTF if(MwFLDrawText) if(is_bitmap(handle, ttf) || ttf == NULL || MwFLDrawText(handle, ttf, &p, line, fadedColor ? fadedColor : color)) #endif bitmap_MwDrawText(handle, &p, line, is_bold(handle, ttf), fadedColor ? fadedColor : color); - p.y += MwTextHeight(handle, ttf, line); + l[0].y = l[1].y = p.y; + + if((n = MwGetInteger(handle, MwNstrikethrough)) != MwDEFAULT && n) { + MwLLLine(handle->lowlevel, l, color); + } + + if((n = MwGetInteger(handle, MwNunderline)) != MwDEFAULT && n) { + l[0].y += th / 2; + l[1].y += th / 2; + MwLLLine(handle->lowlevel, l, color); + } + + p.y += th; free(line); From 9a6a0e73938860810ee13b789d2ab43fa4b78a3f Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 21:44:55 -0700 Subject: [PATCH 03/62] d3d8 too --- CMakeLists.txt | 37 +++++--- NTMakefile | 4 +- WatMakefile | 2 +- examples/CMakeLists.txt | 3 +- examples/dxdemos/CMakeLists.txt | 11 ++- examples/dxdemos/d3d8.c | 91 ++++++++++++++++++++ examples/dxdemos/{directx9.c => d3d9.c} | 14 ++-- include/Mw/Widget/D3D8.h | 55 ++++++++++++ include/Mw/Widget/{DirectX.h => D3D9.h} | 17 ++-- src/widget/d3d8.c | 107 ++++++++++++++++++++++++ src/widget/{directx.c => d3d9.c} | 48 +++++------ tools/genmk.pl | 32 +++++-- 12 files changed, 355 insertions(+), 66 deletions(-) create mode 100644 examples/dxdemos/d3d8.c rename examples/dxdemos/{directx9.c => d3d9.c} (90%) create mode 100644 include/Mw/Widget/D3D8.h rename include/Mw/Widget/{DirectX.h => D3D9.h} (83%) create mode 100644 src/widget/d3d8.c rename src/widget/{directx.c => d3d9.c} (68%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 622df5d8..8863d43f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,8 +32,10 @@ else() option(MW_TRY_OPENGL "Try to compile OpenGL widget or not" ON) option(MW_TRY_VULKAN "Try to compile Vulkan widget or not" ON) endif() + if(${CMAKE_SYSTEM_NAME} MATCHES Windows) - option(MW_TRY_DIRECTX "Try to compile DirectX widget or not" ON) + option(MW_TRY_D3D8 "Try to compile D3D8 widget or not" ON) + option(MW_TRY_D3D9 "Try to compile D3D9 widget or not" ON) endif() @@ -94,13 +96,19 @@ if(MW_TRY_VULKAN) endif() endif() -if(MW_TRY_DIRECTX) +if(MW_TRY_D3D8 OR MW_TRY_D3D9) include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) if(DIRECTX_FOUND) - set(MW_BUILD_DIRECTX ON) - message(STATUS "DirectX widget has been enabled") + if(MW_TRY_D3D8) + set(MW_BUILD_D3D8 ON) + message(STATUS "D3D8 widget has been enabled") + endif() + if(MW_TRY_D3D9) + set(MW_BUILD_D3D9 ON) + message(STATUS "D3D9 widget has been enabled") + endif() else() - message(STATUS "DirectX widget has been disabled") + message(STATUS "DirectX widgets have been disabled (DirectX not found)") endif() endif() @@ -491,13 +499,20 @@ if(MW_BUILD_VULKAN) endif() endif() -if(MW_BUILD_DIRECTX) - list(APPEND LIBRARIES ${DIRECTX_D3DX9_LIBRARIES}) +if(MW_BUILD_D3D8) target_compile_definitions( - Mw - PRIVATE - MW_DIRECTX - ) + Mw + PUBLIC + MW_DIRECTX8 + ) +endif() + +if(MW_BUILD_D3D9) + target_compile_definitions( + Mw + PUBLIC + MW_DIRECTX9 + ) endif() target_compile_definitions( diff --git a/NTMakefile b/NTMakefile index 37b4a950..12b6446a 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,7 +2,7 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -14,7 +14,7 @@ LD = link /nologo DX9_FLAGS = !endif -MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX9_FLAGS) +MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) MW_LDFLAGS = /DLL EXE_CFLAGS = /Iinclude EXE_LDFLAGS = diff --git a/WatMakefile b/WatMakefile index 09a942d0..9c7f0892 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,7 +1,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX8 -dMW_DIRECTX9 MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 4ac6962b..87225f1a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -5,8 +5,9 @@ endif() if(${MW_TRY_VULKAN}) add_subdirectory(vkdemos) endif() + if(WIN32) - if(${MW_TRY_DIRECTX}) + if(${MW_TRY_D3D8} OR ${MW_BUILD_D3D8}) add_subdirectory(dxdemos) endif() endif() diff --git a/examples/dxdemos/CMakeLists.txt b/examples/dxdemos/CMakeLists.txt index 38265e1c..aa09d638 100644 --- a/examples/dxdemos/CMakeLists.txt +++ b/examples/dxdemos/CMakeLists.txt @@ -8,17 +8,16 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/../../resource/FindDirectX.cmake) if(${DIRECTX_FOUND}) foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) get_filename_component(TARGET ${PATH} NAME_WE) - add_executable(${TARGET} MACOSX_BUNDLE ${PATH}) + add_executable(${TARGET} ${PATH}) target_include_directories( ${TARGET} PRIVATE ${DIRECTX_INCLUDE_DIRS} ) target_link_libraries( - ${TARGET} - PRIVATE - Mw - ${DIRECTX_D3DX9_LIBRARIES} - ) +${TARGET} +PRIVATE +Mw +) endforeach() endif() diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c new file mode 100644 index 00000000..400adc6c --- /dev/null +++ b/examples/dxdemos/d3d8.c @@ -0,0 +1,91 @@ +/* + * Adapted from: + * https://web.archive.org/web/20211126225651/https://www.codeguru.com/multimedia/using-direct3d8-the-basics/ + */ +#include +#include + +MwWidget window, d3d8; +LPDIRECT3D8 d3d; +LPDIRECT3DDEVICE8 d3ddev; +LPDIRECT3DVERTEXBUFFER8 v_buffer; + +struct CUSTOMVERTEX { + FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag + DWORD color; // from the D3DFVF_DIFFUSE flag +}; +#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) + +static void MWAPI draw(MwWidget handle, void* user, void* client) { + // clear the window to a deep blue + d3ddev->lpVtbl->Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); + + d3ddev->lpVtbl->BeginScene(d3ddev); // begins the 3D scene + + // select which vertex format we are using + d3ddev->lpVtbl->SetVertexShader(d3ddev, CUSTOMFVF); + + // select the vertex buffer to display + d3ddev->lpVtbl->SetStreamSource(d3ddev, 0, v_buffer, sizeof(struct CUSTOMVERTEX)); + + // // copy the vertex buffer to the back buffer + d3ddev->lpVtbl->DrawPrimitive(d3ddev, D3DPT_TRIANGLELIST, 0, 1); + + d3ddev->lpVtbl->EndScene(d3ddev); // ends the 3D scene + + d3ddev->lpVtbl->Present(d3ddev, NULL, NULL, NULL, NULL); // displays the created frame +} + +int main() { + BYTE* pVoid; + + MwLibraryInit(); + + window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); + + d3d8 = MwCreateWidget(MwD3D8Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + + d3d = MwDirectXGetD3D8(d3d8); + d3ddev = MwDirectXGetD3Dev8(d3d8); + + // create three vertices using the CUSTOMVERTEX struct built earlier + struct CUSTOMVERTEX vertices[] = + { + { + 400.0f, + 0.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 0, 255), + }, + { + 800.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 255, 0), + }, + { + 0.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(255, 0, 0), + }, + }; + + d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, + 3 * sizeof(struct CUSTOMVERTEX), + 0, + CUSTOMFVF, + D3DPOOL_MANAGED, + &v_buffer); + + v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (BYTE**)&pVoid, 0); // lock the vertex buffer + memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer + v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer + + MwAddUserHandler(window, MwNtickHandler, draw, NULL); + + MwLoop(window); +} diff --git a/examples/dxdemos/directx9.c b/examples/dxdemos/d3d9.c similarity index 90% rename from examples/dxdemos/directx9.c rename to examples/dxdemos/d3d9.c index 6b28ac02..5975739d 100644 --- a/examples/dxdemos/directx9.c +++ b/examples/dxdemos/d3d9.c @@ -4,9 +4,9 @@ * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-4 */ #include -#include +#include -MwWidget window, d3d9; +MwWidget window, d3d8; LPDIRECT3D9 d3d; LPDIRECT3DDEVICE9 d3ddev; LPDIRECT3DVERTEXBUFFER9 v_buffer; @@ -38,14 +38,16 @@ static void MWAPI draw(MwWidget handle, void* user, void* client) { } int main() { + VOID* pVoid; + MwLibraryInit(); window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); - d3d9 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + d3d8 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirectXGetD3D9(d3d9); - d3ddev = MwDirectXGetD3Dev9(d3d9); + d3d = MwDirectXGetD3D9(d3d8); + d3ddev = MwDirectXGetD3Dev9(d3d8); // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = @@ -81,8 +83,6 @@ int main() { &v_buffer, NULL); - VOID* pVoid; // the void pointer - v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (void**)&pVoid, 0); // lock the vertex buffer memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h new file mode 100644 index 00000000..022e7bc9 --- /dev/null +++ b/include/Mw/Widget/D3D8.h @@ -0,0 +1,55 @@ +/*! + * @file Mw/Widget/D3D8.h + * @brief D3D8 widget. + * @warning Only avaliable on Windows. + */ +#ifndef __MW_WIDGET_D3D8_H__ +#define __MW_WIDGET_D3D8_H__ + +#include +#include +#include + +#if !defined(MW_D3D8_NO_INCLUDE) + +/* https://github.com/microsoft/Windows-classic-samples/issues/317 */ +#if defined(__MINGW32__) || defined(__MINGW64__) +#define NTDDI_VERSION 0x07000000 +#define _WIN32_WINNT 0x0A00 + +#endif +#endif + +#ifndef _WIN32 +#error D3D8 widget only avaliable for Win32 backends +#else +#ifdef MW_DIRECTX8 +#include +#endif +#endif + +/*! + * @brief D3D8 widget class + */ +MWDECL MwClass MwD3D8Class; + +#ifdef __cplusplus +extern "C" { +#endif + +MwInline LPDIRECT3D8 MwDirectXGetD3D8(MwWidget handle) { + LPDIRECT3D8 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); + return out; +}; +MwInline LPDIRECT3DDEVICE8 MwDirectXGetD3Dev8(MwWidget handle) { + LPDIRECT3DDEVICE8 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); + return out; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/Mw/Widget/DirectX.h b/include/Mw/Widget/D3D9.h similarity index 83% rename from include/Mw/Widget/DirectX.h rename to include/Mw/Widget/D3D9.h index a81b4aee..2639e175 100644 --- a/include/Mw/Widget/DirectX.h +++ b/include/Mw/Widget/D3D9.h @@ -3,27 +3,28 @@ * @brief DirectX widget. * @warning Only avaliable on Windows. */ -#ifndef __MW_WIDGET_DIRECTX_H__ -#define __MW_WIDGET_DIRECTX_H__ +#ifndef __MW_WIDGET_D3D9_H__ +#define __MW_WIDGET_D3D9_H__ #include #include #include -#if !defined(MW_DIRECTX_NO_INCLUDE) +#if !defined(MW_D3D9_NO_INCLUDE) /* https://github.com/microsoft/Windows-classic-samples/issues/317 */ #if defined(__MINGW32__) || defined(__MINGW64__) #define NTDDI_VERSION 0x07000000 #define _WIN32_WINNT 0x0A00 - -#endif - -#include #endif #ifndef _WIN32 -#error DirectX widget only avaliable for Win32 backends +#error D3D9 widget only avaliable for Win32 backends +#else +#ifdef MW_DIRECTX9 +#include +#endif +#endif #endif /*! diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c new file mode 100644 index 00000000..13e656d4 --- /dev/null +++ b/src/widget/d3d8.c @@ -0,0 +1,107 @@ +#include + +#ifndef MW_DIRECTX8 +#define MW_DIRECTX8_NO_INCLUDE +MWDECL MwClass MwDX8Class; + +MwClass MwDX8Class = NULL; +#else +#include + +typedef struct gdid3d8 { + void* d3d8dll; + IDirect3D8* (*Direct3DCreate8)(UINT sdk_version); + + LPDIRECT3D8 d3d; // the pointer to our Direct3D interface + LPDIRECT3DDEVICE8 d3ddev; // the pointer to the device class\ + +} gdid3d8_t; + +static int wcreate_d3d8(MwWidget handle) { + void* r = NULL; + MwWidget w = handle; + gdid3d8_t* o = malloc(sizeof(gdid3d8_t)); + D3DPRESENT_PARAMETERS d3dpp; + D3DDISPLAYMODE dispMode; + + o->d3d8dll = LoadLibrary("d3d8.dll"); + if(!o->d3d8dll) { + MessageBox(NULL, "d3d8.dll not found! Is DirectX8 installed?", "Error", MB_OK); + ExitProcess(-1); + } + o->Direct3DCreate8 = (void*)GetProcAddress(o->d3d8dll, "Direct3DCreate8"); + if(!o->Direct3DCreate8) { + MessageBox(NULL, "Direct3DCreate8 not found! Is DirectX8 installed properly?", "Error", MB_OK); + ExitProcess(-1); + } + + o->d3d = o->Direct3DCreate8(D3D_SDK_VERSION); + + o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); + + ZeroMemory(&d3dpp, sizeof(d3dpp)); + d3dpp.Windowed = TRUE; + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; + d3dpp.BackBufferFormat = dispMode.Format; + d3dpp.EnableAutoDepthStencil = TRUE; + d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + + // create a device class using this information and information from the d3dpp stuct + o->d3d->lpVtbl->CreateDevice(o->d3d, + D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + handle->lowlevel->gdi.hWnd, + D3DCREATE_MIXED_VERTEXPROCESSING, + &d3dpp, + &o->d3ddev); + + o->d3ddev->lpVtbl->SetRenderState(o->d3ddev, D3DRS_LIGHTING, FALSE); + + handle->internal = o; + + return 0; +} + +static void destroy_d3d8(MwWidget handle) { + MwWidget w = handle; + gdid3d8_t* o = handle->internal; + + o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device + o->d3d->lpVtbl->Release(o->d3d); // close and release Direct3D + + free(handle->internal); +} + +static void func_handler_d3d8(MwWidget handle, const char* name, void* out, + va_list va) { + gdid3d8_t* o = handle->internal; + + if(strcmp(name, "mwDirectXGetD3D8") == 0) { + *(LPDIRECT3D8*)out = o->d3d; + } + if(strcmp(name, "mwDirectXGetD3Dev8") == 0) { + *(LPDIRECT3DDEVICE8*)out = o->d3ddev; + } +} + +MwClassRec MwDX8ClassRec = {wcreate_d3d8, /* create */ + destroy_d3d8, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler_d3d8, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ + NULL, NULL, NULL}; +MwClass MwD3D8Class = &MwDX8ClassRec; +#endif diff --git a/src/widget/directx.c b/src/widget/d3d9.c similarity index 68% rename from src/widget/directx.c rename to src/widget/d3d9.c index 7465d69d..f6fc5d96 100644 --- a/src/widget/directx.c +++ b/src/widget/d3d9.c @@ -1,12 +1,12 @@ #include -#ifndef MW_DIRECTX -#define MW_DIRECTX_NO_INCLUDE +#ifndef MW_DIRECTX9 +#define MW_DIRECTX9_NO_INCLUDE MWDECL MwClass MwDX9Class; MwClass MwDX9Class = NULL; #else -#include +#include typedef struct gdid3d9 { void* d3d9dll; @@ -17,7 +17,7 @@ typedef struct gdid3d9 { } gdid3d9_t; -static int wcreate(MwWidget handle) { +static int wcreate_d3d9(MwWidget handle) { void* r = NULL; MwWidget w = handle; gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); @@ -52,7 +52,7 @@ static int wcreate(MwWidget handle) { return 0; } -static void destroy(MwWidget handle) { +static void destroy_d3d9(MwWidget handle) { MwWidget w = handle; gdid3d9_t* o = handle->internal; @@ -62,8 +62,8 @@ static void destroy(MwWidget handle) { free(handle->internal); } -static void func_handler(MwWidget handle, const char* name, void* out, - va_list va) { +static void func_handler_d3d9(MwWidget handle, const char* name, void* out, + va_list va) { gdid3d9_t* o = handle->internal; if(strcmp(name, "mwDirectXGetD3D9") == 0) { @@ -74,23 +74,23 @@ static void func_handler(MwWidget handle, const char* name, void* out, } } -MwClassRec MwDX9ClassRec = {wcreate, /* create */ - destroy, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - func_handler, /* execute */ - NULL, /* tick */ - NULL, /* resize */ - NULL, /* children_update */ - NULL, /* children_prop_change */ - NULL, /* clipboard */ - NULL, /* props_change */ +MwClassRec MwDX9ClassRec = {wcreate_d3d9, /* create */ + destroy_d3d9, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler_d3d9, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ NULL, NULL, NULL}; MwClass MwD3D9Class = &MwDX9ClassRec; #endif diff --git a/tools/genmk.pl b/tools/genmk.pl index ad1495f4..a249e24c 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,10 +42,28 @@ sub cobjs { return $r; } + +sub dx8_detect_block { + return <<'EOF'; +!if [where d3d8.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d8.h 2^>nul') do @echo DX8_FLAGS = /DMW_DIRECTX8 /I"%~dpP">dx8flags.mk] +!endif +!else +!if [echo DX8_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx8flags.mk") +!include "dx8flags.mk" +!else +DX8_FLAGS = +!endif +EOF +} + sub dx9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -82,6 +100,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; + my $dx8_flags = ""; + my $dx8_block = ""; my $dx9_flags = ""; my $dx9_block = ""; @@ -108,9 +128,8 @@ sub generate { $inc = "/I"; $dll = "/DLL"; - # DX9 headers aren't part of every MSVC/Windows SDK install, so probe - # PATH for a d3d9.h at build time (on the machine actually running - # nmake) rather than baking in a yes/no here. + $dx8_flags = "\$(DX8_FLAGS)"; + $dx8_block = dx8_detect_block(); $dx9_flags = "\$(DX9_FLAGS)"; $dx9_block = dx9_detect_block(); } @@ -135,7 +154,8 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx9_flags = "${def}MW_DIRECTX"; + $dx8_flags = "${def}MW_DIRECTX8"; + $dx9_flags = "${def}MW_DIRECTX9"; } open(OUT, ">", $output); @@ -147,7 +167,7 @@ sub generate { print(OUT "\n"); } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx8_flags} ${dx9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); From 20c39b86f4d37ecfa4aff69250b5d34bfce6954c Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:02:27 -0700 Subject: [PATCH 04/62] perl --- configure | 8 +++++--- examples/dxdemos/d3d8.c | 4 ++++ examples/dxdemos/d3d9.c | 4 ++++ include/Mw/Widget/D3D8.h | 12 ++++++++++++ include/Mw/Widget/D3D9.h | 12 ++++++++++++ pl/rules.pl | 18 +++++++++++++----- src/widget/d3d8.c | 12 +++++------- src/widget/d3d9.c | 12 +++++------- tools/gendcl.pl | 2 ++ 9 files changed, 62 insertions(+), 22 deletions(-) diff --git a/configure b/configure index f6ff13bc..a2d0ba61 100755 --- a/configure +++ b/configure @@ -55,7 +55,8 @@ param_set("examples", 1); param_set("allow-sloppy-focus", 0); # (option that only makes sense on Windows) -param_set("directx", 0); +param_set("dxd8", 0); +param_set("dxd9", 0); my %features = ( "classic-theme" => "use classic theme", @@ -73,7 +74,8 @@ my %features = ( "gnustep" => "use gnustep", "dbus" => "use DBus on supported platform", "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus", - "directx" => "(Windows only) build DirectX widget" + "directx8" => "(Windows only) build DXD8 widget", + "directx9" => "(Windows only) build DXD9 widget" ); my @features_keys = ( "1classic-theme", "1stb-image", @@ -82,7 +84,7 @@ my @features_keys = ( "1vulkan", "2vulkan-string-helper", "1shared", "1static", "1wayland", "1gnustep", - "1dbus", "1directx" + "1dbus", "1direct8", "1directx9" ); sub def_platform { diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c index 400adc6c..2ef08a38 100644 --- a/examples/dxdemos/d3d8.c +++ b/examples/dxdemos/d3d8.c @@ -5,6 +5,8 @@ #include #include +#ifdef MW_DIRECTX8 + MwWidget window, d3d8; LPDIRECT3D8 d3d; LPDIRECT3DDEVICE8 d3ddev; @@ -89,3 +91,5 @@ int main() { MwLoop(window); } + +#endif diff --git a/examples/dxdemos/d3d9.c b/examples/dxdemos/d3d9.c index 5975739d..9fe685c3 100644 --- a/examples/dxdemos/d3d9.c +++ b/examples/dxdemos/d3d9.c @@ -6,6 +6,8 @@ #include #include +#ifdef MW_DIRECTX9 + MwWidget window, d3d8; LPDIRECT3D9 d3d; LPDIRECT3DDEVICE9 d3ddev; @@ -91,3 +93,5 @@ int main() { MwLoop(window); } + +#endif diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h index 022e7bc9..ee1bf052 100644 --- a/include/Mw/Widget/D3D8.h +++ b/include/Mw/Widget/D3D8.h @@ -22,6 +22,7 @@ #ifndef _WIN32 #error D3D8 widget only avaliable for Win32 backends +#undef MW_DIRECTX8 #else #ifdef MW_DIRECTX8 #include @@ -37,6 +38,7 @@ MWDECL MwClass MwD3D8Class; extern "C" { #endif +#ifdef MW_DIRECTX8 MwInline LPDIRECT3D8 MwDirectXGetD3D8(MwWidget handle) { LPDIRECT3D8 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); @@ -47,6 +49,16 @@ MwInline LPDIRECT3DDEVICE8 MwDirectXGetD3Dev8(MwWidget handle) { MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); return out; }; +#else +MwInline void* MwDirectXGetD3D8(MwWidget handle) { + (void)handle; + return NULL; +}; +MwInline void* MwDirectXGetD3Dev8(MwWidget handle) { + (void)handle; + return NULL; +}; +#endif #ifdef __cplusplus } diff --git a/include/Mw/Widget/D3D9.h b/include/Mw/Widget/D3D9.h index 2639e175..e7a7149b 100644 --- a/include/Mw/Widget/D3D9.h +++ b/include/Mw/Widget/D3D9.h @@ -20,6 +20,7 @@ #ifndef _WIN32 #error D3D9 widget only avaliable for Win32 backends +#undef MW_DIRECTX9 #else #ifdef MW_DIRECTX9 #include @@ -36,6 +37,7 @@ MWDECL MwClass MwD3D9Class; extern "C" { #endif +#ifdef MW_DIRECTX9 MwInline LPDIRECT3D9 MwDirectXGetD3D9(MwWidget handle) { LPDIRECT3D9 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); @@ -46,6 +48,16 @@ MwInline LPDIRECT3DDEVICE9 MwDirectXGetD3Dev9(MwWidget handle) { MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); return out; }; +#else +MwInline void* MwDirectXGetD3D9(MwWidget handle) { + (void)handle; + return NULL; +}; +MwInline void* MwDirectXGetD3Dev9(MwWidget handle) { + (void)handle; + return NULL; +}; +#endif #ifdef __cplusplus } diff --git a/pl/rules.pl b/pl/rules.pl index 2f336cb0..b12b76cc 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -178,7 +178,8 @@ new_object("src/widget/window.c"); new_object("src/widget/opengl.c"); new_object("src/widget/vulkan.c"); -new_object("src/widget/directx.c"); +new_object("src/widget/d3d8.c"); +new_object("src/widget/d3d9.c"); if (param_get("opengl")) { add_cflags("-DMW_OPENGL"); @@ -186,8 +187,11 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } -if (param_get("directx")) { - add_cflags("-DMW_DIRECTX"); +if (param_get("directx8")) { + add_cflags("-DMW_DIRECTX8"); +} +if (param_get("directx9")) { + add_cflags("-DMW_DIRECTX9"); } new_object("src/dialog/*.c"); @@ -234,8 +238,12 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } -if (param_get("directx")) { - new_example("examples/dxdemos/directx9"); +if (param_get("directx8")) { + new_example("examples/dxdemos/d3d8"); +} + +if (param_get("directx9")) { + new_example("examples/dxdemos/d3d9"); } 1; diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c index 13e656d4..06633210 100644 --- a/src/widget/d3d8.c +++ b/src/widget/d3d8.c @@ -1,13 +1,7 @@ #include -#ifndef MW_DIRECTX8 -#define MW_DIRECTX8_NO_INCLUDE -MWDECL MwClass MwDX8Class; - -MwClass MwDX8Class = NULL; -#else +#ifdef MW_DIRECTX8 #include - typedef struct gdid3d8 { void* d3d8dll; IDirect3D8* (*Direct3DCreate8)(UINT sdk_version); @@ -104,4 +98,8 @@ MwClassRec MwDX8ClassRec = {wcreate_d3d8, /* create */ NULL, /* props_change */ NULL, NULL, NULL}; MwClass MwD3D8Class = &MwDX8ClassRec; +#else +MWDECL MwClass MwDX8Class; + +MwClass MwDX8Class = NULL; #endif diff --git a/src/widget/d3d9.c b/src/widget/d3d9.c index f6fc5d96..3246cafb 100644 --- a/src/widget/d3d9.c +++ b/src/widget/d3d9.c @@ -1,13 +1,7 @@ #include -#ifndef MW_DIRECTX9 -#define MW_DIRECTX9_NO_INCLUDE -MWDECL MwClass MwDX9Class; - -MwClass MwDX9Class = NULL; -#else +#ifdef MW_DIRECTX9 #include - typedef struct gdid3d9 { void* d3d9dll; IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); @@ -93,4 +87,8 @@ MwClassRec MwDX9ClassRec = {wcreate_d3d9, /* create */ NULL, /* props_change */ NULL, NULL, NULL}; MwClass MwD3D9Class = &MwDX9ClassRec; +#else +MWDECL MwClass MwDX9Class; + +MwClass MwDX9Class = NULL; #endif diff --git a/tools/gendcl.pl b/tools/gendcl.pl index f2e3399c..ccc29dc8 100755 --- a/tools/gendcl.pl +++ b/tools/gendcl.pl @@ -59,6 +59,8 @@ sub scan { while (my $file = readdir($dh)) { if ( !(($dir . "/" . $file) eq "src/widget/opengl.c") && !(($dir . "/" . $file) eq "src/widget/vulkan.c") + && !(($dir . "/" . $file) eq "src/widget/d3d8.c") + && !(($dir . "/" . $file) eq "src/widget/d3d9.c") && !(($dir . "/" . $file) eq "external/stb_truetype.c") && !(($dir . "/" . $file) eq "external/stb_image.c") && ($file =~ /\.c$/)) From 2ef5092854710adbe33145119978e59538f93d82 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:05:40 -0700 Subject: [PATCH 05/62] genmk --- NTMakefile | 7 ++++--- WatMakefile | 13 ++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/NTMakefile b/NTMakefile index 12b6446a..f42873ba 100644 --- a/NTMakefile +++ b/NTMakefile @@ -99,7 +99,8 @@ clean: del /f /q src\widget\checkbox.obj del /f /q src\widget\clock.obj del /f /q src\widget\combobox.obj - del /f /q src\widget\directx.obj + del /f /q src\widget\d3d8.obj + del /f /q src\widget\d3d9.obj del /f /q src\widget\document.obj del /f /q src\widget\entry.obj del /f /q src\widget\frame.obj @@ -357,8 +358,8 @@ examples\gldemos\tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) /Fo$@ examples/gldemos/tripaint.c -src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj - $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib +src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj + $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib .c.obj: diff --git a/WatMakefile b/WatMakefile index 9c7f0892..55bc6b8e 100644 --- a/WatMakefile +++ b/WatMakefile @@ -85,7 +85,8 @@ clean: .SYMBOLIC %erase src/widget/checkbox.obj %erase src/widget/clock.obj %erase src/widget/combobox.obj - %erase src/widget/directx.obj + %erase src/widget/d3d8.obj + %erase src/widget/d3d9.obj %erase src/widget/document.obj %erase src/widget/entry.obj %erase src/widget/frame.obj @@ -342,8 +343,8 @@ examples/gldemos/tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/gldemos/tripaint.c -src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/directx.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj - $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/directx.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib +src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/d3d8.obj src/widget/d3d9.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj + $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/d3d8.obj file src/widget/d3d9.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib @@ -499,8 +500,10 @@ src/widget/clock.obj: src/widget/clock.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/clock.c src/widget/combobox.obj: src/widget/combobox.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/combobox.c -src/widget/directx.obj: src/widget/directx.c - $(CC) $(MW_CFLAGS) -fo=$@ src/widget/directx.c +src/widget/d3d8.obj: src/widget/d3d8.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d8.c +src/widget/d3d9.obj: src/widget/d3d9.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d9.c src/widget/document.obj: src/widget/document.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/document.c src/widget/entry.obj: src/widget/entry.c From 037b8e21208020129e90377f5915efab29c64abe Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:11:17 -0700 Subject: [PATCH 06/62] have watcom check for d3d8.h/d3d9.h --- WatMakefile | 16 +++++++++++++++- tools/genmk.pl | 6 ++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/WatMakefile b/WatMakefile index 55bc6b8e..02205a74 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,7 +1,20 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX8 -dMW_DIRECTX9 +!if [where d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!endif +!else +!if [echo DX9_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx9flags.mk") +!include "dx9flags.mk" +!else +DX9_FLAGS = +!endif + +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt @@ -109,6 +122,7 @@ clean: .SYMBOLIC %erase src/widget/window.obj %erase src/Mw.dll %erase src/Mw.lib + %erase dx9flags.mk %erase examples/basic/box.obj %erase examples/basic/calculator.obj %erase examples/basic/checkbox.obj diff --git a/tools/genmk.pl b/tools/genmk.pl index a249e24c..9f45add9 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -154,8 +154,10 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx8_flags = "${def}MW_DIRECTX8"; - $dx9_flags = "${def}MW_DIRECTX9"; + $dx8_flags = "\$(DX8_FLAGS)"; + $dx8_block = dx8_detect_block(); + $dx9_flags = "\$(DX9_FLAGS)"; + $dx9_block = dx9_detect_block(); } open(OUT, ">", $output); From bc0e90dbec798071e8f8c401f5952fb5a94ef3ef Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:16:16 -0700 Subject: [PATCH 07/62] error handling for d3d8 and d3d9 --- src/widget/d3d8.c | 32 +++++++++++++++++++++++++++----- src/widget/d3d9.c | 34 ++++++++++++++++++++++------------ 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c index 06633210..d569f530 100644 --- a/src/widget/d3d8.c +++ b/src/widget/d3d8.c @@ -17,21 +17,33 @@ static int wcreate_d3d8(MwWidget handle) { gdid3d8_t* o = malloc(sizeof(gdid3d8_t)); D3DPRESENT_PARAMETERS d3dpp; D3DDISPLAYMODE dispMode; + HRESULT hr; + char errbuf[2048] = {0}; o->d3d8dll = LoadLibrary("d3d8.dll"); if(!o->d3d8dll) { - MessageBox(NULL, "d3d8.dll not found! Is DirectX8 installed?", "Error", MB_OK); - ExitProcess(-1); + MwDispatchError(1, "d3d8.dll not found! Is DirectX8 installed?"); + return 1; } o->Direct3DCreate8 = (void*)GetProcAddress(o->d3d8dll, "Direct3DCreate8"); if(!o->Direct3DCreate8) { - MessageBox(NULL, "Direct3DCreate8 not found! Is DirectX8 installed properly?", "Error", MB_OK); - ExitProcess(-1); + MwDispatchError(1, "Direct3DCreate8 not found! Is DirectX8 installed properly?"); + return 1; } o->d3d = o->Direct3DCreate8(D3D_SDK_VERSION); + if(!o->Direct3DCreate8) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "Direct3DCreate8 NULL: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } - o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); + hr = o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "GetAdapterDisplayMode ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; @@ -49,8 +61,18 @@ static int wcreate_d3d8(MwWidget handle) { D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &o->d3ddev); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "CreateDevice ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } o->d3ddev->lpVtbl->SetRenderState(o->d3ddev, D3DRS_LIGHTING, FALSE); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "SetRenderState ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } handle->internal = o; diff --git a/src/widget/d3d9.c b/src/widget/d3d9.c index 3246cafb..7219e58a 100644 --- a/src/widget/d3d9.c +++ b/src/widget/d3d9.c @@ -12,9 +12,12 @@ typedef struct gdid3d9 { } gdid3d9_t; static int wcreate_d3d9(MwWidget handle) { - void* r = NULL; - MwWidget w = handle; - gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); + void* r = NULL; + MwWidget w = handle; + gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); + HRESULT hr; + char errbuf[2048]; + D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information o->d3d9dll = LoadLibrary("d3d9.dll"); if(!o->d3d9dll) { @@ -24,8 +27,10 @@ static int wcreate_d3d9(MwWidget handle) { o->Direct3DCreate9 = (void*)GetProcAddress(o->d3d9dll, "Direct3DCreate9"); o->d3d = o->Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface - - D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information + if(hr != D3D_OK) { + MwDispatchError(1, "Direct3DCreate9 NULL"); + return 1; + } ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use d3dpp.Windowed = TRUE; // program windowed, not fullscreen @@ -33,13 +38,18 @@ static int wcreate_d3d9(MwWidget handle) { d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; // set the window to be used by Direct3D // create a device class using this information and information from the d3dpp stuct - o->d3d->lpVtbl->CreateDevice(o->d3d, - D3DADAPTER_DEFAULT, - D3DDEVTYPE_HAL, - handle->lowlevel->gdi.hWnd, - D3DCREATE_MIXED_VERTEXPROCESSING, - &d3dpp, - &o->d3ddev); + hr = o->d3d->lpVtbl->CreateDevice(o->d3d, + D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + handle->lowlevel->gdi.hWnd, + D3DCREATE_MIXED_VERTEXPROCESSING, + &d3dpp, + &o->d3ddev); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "CreateDevice ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } handle->internal = o; From 92ea06a6ffc1e76f9212bcf513562d80fc8c2d20 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:16:43 -0700 Subject: [PATCH 08/62] put nul in gitignore for watcom cross compile --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3faccd35..ce6459a0 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ compile_flags.txt flamegraph.svg perf.* + +nul From 2db411180dd8ea9cbcc3959533ef26a8b7b302b8 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:21:25 -0700 Subject: [PATCH 09/62] xml --- examples/dxdemos/d3d8.c | 4 ++-- examples/dxdemos/d3d9.c | 4 ++-- include/Mw/Widget/D3D8.h | 8 ++++---- include/Mw/Widget/D3D9.h | 8 ++++---- milsko.xml | 32 ++++++++++++++++++++++++++++---- 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c index 2ef08a38..c5d65d90 100644 --- a/examples/dxdemos/d3d8.c +++ b/examples/dxdemos/d3d8.c @@ -47,8 +47,8 @@ int main() { d3d8 = MwCreateWidget(MwD3D8Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirectXGetD3D8(d3d8); - d3ddev = MwDirectXGetD3Dev8(d3d8); + d3d = MwD3D8GetD3D(d3d8); + d3ddev = MwD3D8GetD3Dev(d3d8); // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = diff --git a/examples/dxdemos/d3d9.c b/examples/dxdemos/d3d9.c index 9fe685c3..86186ae8 100644 --- a/examples/dxdemos/d3d9.c +++ b/examples/dxdemos/d3d9.c @@ -48,8 +48,8 @@ int main() { d3d8 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirectXGetD3D9(d3d8); - d3ddev = MwDirectXGetD3Dev9(d3d8); + d3d = MwD3D9GetD3D(d3d8); + d3ddev = MwD3D9GetD3Dev(d3d8); // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h index ee1bf052..9b0ae6eb 100644 --- a/include/Mw/Widget/D3D8.h +++ b/include/Mw/Widget/D3D8.h @@ -39,22 +39,22 @@ extern "C" { #endif #ifdef MW_DIRECTX8 -MwInline LPDIRECT3D8 MwDirectXGetD3D8(MwWidget handle) { +MwInline LPDIRECT3D8 MwD3D8GetD3D(MwWidget handle) { LPDIRECT3D8 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE8 MwDirectXGetD3Dev8(MwWidget handle) { +MwInline LPDIRECT3DDEVICE8 MwD3D8GetD3Dev(MwWidget handle) { LPDIRECT3DDEVICE8 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); return out; }; #else -MwInline void* MwDirectXGetD3D8(MwWidget handle) { +MwInline void* MwD3D8GetD3D(MwWidget handle) { (void)handle; return NULL; }; -MwInline void* MwDirectXGetD3Dev8(MwWidget handle) { +MwInline void* MwD3D8GetD3Dev(MwWidget handle) { (void)handle; return NULL; }; diff --git a/include/Mw/Widget/D3D9.h b/include/Mw/Widget/D3D9.h index e7a7149b..3831301d 100644 --- a/include/Mw/Widget/D3D9.h +++ b/include/Mw/Widget/D3D9.h @@ -38,22 +38,22 @@ extern "C" { #endif #ifdef MW_DIRECTX9 -MwInline LPDIRECT3D9 MwDirectXGetD3D9(MwWidget handle) { +MwInline LPDIRECT3D9 MwD3D9GetD3D(MwWidget handle) { LPDIRECT3D9 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE9 MwDirectXGetD3Dev9(MwWidget handle) { +MwInline LPDIRECT3DDEVICE9 MwD3D9GetD3Dev(MwWidget handle) { LPDIRECT3DDEVICE9 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); return out; }; #else -MwInline void* MwDirectXGetD3D9(MwWidget handle) { +MwInline void* MwD3D9GetD3D(MwWidget handle) { (void)handle; return NULL; }; -MwInline void* MwDirectXGetD3Dev9(MwWidget handle) { +MwInline void* MwD3D9GetD3Dev(MwWidget handle) { (void)handle; return NULL; }; diff --git a/milsko.xml b/milsko.xml index 5b904100..2ff60c7c 100644 --- a/milsko.xml +++ b/milsko.xml @@ -1070,10 +1070,34 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f69d7b97d06eeb19b8f3401ecea824f54e8dbc66 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:24:48 -0700 Subject: [PATCH 10/62] oh wait the jenkinsfile can at least use enable-d3d --- Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6d93874c..c688af01 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-directx --enable-vulkan --without-vulkan-string-helper") + sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --enable-vulkan --without-vulkan-string-helper") sh("make -j4") sh("mv src/libMw.so libMw64.so") archiveArtifacts("libMw64.so") @@ -42,7 +42,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=i686-w64-mingw32") + sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=i686-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw32.dll") sh("mv src/libMw.dll.a libMw32.dll.a") @@ -55,7 +55,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=x86_64-w64-mingw32") + sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=x86_64-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw64.dll") sh("mv src/libMw.dll.a libMw64.dll.a") From 59012910628c709db757116d26c747c4c0b5ddb5 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:42:10 +0900 Subject: [PATCH 11/62] Update configure --- configure | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/configure b/configure index a2d0ba61..c4fc7e9b 100755 --- a/configure +++ b/configure @@ -54,10 +54,6 @@ param_set("examples", 1); # (option that only makes sense on x11) param_set("allow-sloppy-focus", 0); -# (option that only makes sense on Windows) -param_set("dxd8", 0); -param_set("dxd9", 0); - my %features = ( "classic-theme" => "use classic theme", "stb-image" => "use stb_image, instead use libjpeg/libpng", @@ -91,6 +87,8 @@ sub def_platform { if($target eq "Windows") { param_set("freetype2", 0); param_set("stb-truetype", 0); + param_set("dxd8", 1); + param_set("dxd9", 1); } elsif($target ne "Darwin" and $target ne "ClassicMacOS" and $target ne "Haiku") { param_set("freetype2", 1); param_set("stb-truetype", 0); From 6026c390d9fa648026c630cbc3358fd66f5ed4ee Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:45:38 +0900 Subject: [PATCH 12/62] Update configure --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index c4fc7e9b..5463444f 100755 --- a/configure +++ b/configure @@ -87,8 +87,8 @@ sub def_platform { if($target eq "Windows") { param_set("freetype2", 0); param_set("stb-truetype", 0); - param_set("dxd8", 1); - param_set("dxd9", 1); + param_set("d3d8", 1); + param_set("d3d9", 1); } elsif($target ne "Darwin" and $target ne "ClassicMacOS" and $target ne "Haiku") { param_set("freetype2", 1); param_set("stb-truetype", 0); From ab358a492a73bc35a363774faa83311d152ef0e6 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:46:57 +0900 Subject: [PATCH 13/62] Update pl/rules.pl --- pl/rules.pl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pl/rules.pl b/pl/rules.pl index b12b76cc..8e4a611e 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -187,10 +187,10 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } -if (param_get("directx8")) { +if (param_get("d3d8")) { add_cflags("-DMW_DIRECTX8"); } -if (param_get("directx9")) { +if (param_get("d3d9")) { add_cflags("-DMW_DIRECTX9"); } @@ -238,11 +238,11 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } -if (param_get("directx8")) { +if (param_get("d3d8")) { new_example("examples/dxdemos/d3d8"); } -if (param_get("directx9")) { +if (param_get("d3d9")) { new_example("examples/dxdemos/d3d9"); } From e6f1385d5e8df459954d22d03d6dc1a841a25e4d Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:49:44 +0900 Subject: [PATCH 14/62] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c688af01..c506028d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --enable-vulkan --without-vulkan-string-helper") + sh("./configure --enable-opengl --enable-vulkan --without-vulkan-string-helper") sh("make -j4") sh("mv src/libMw.so libMw64.so") archiveArtifacts("libMw64.so") From eef1c32c1b3905e6c68264c972ae774d3b6fcce2 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:43:15 +0900 Subject: [PATCH 15/62] direct3d9 --- CMakeLists.txt | 29 ++--- NTMakefile | 2 +- WatMakefile | 2 +- configure | 8 +- examples/CMakeLists.txt | 2 +- examples/dxdemos/d3d8.c | 95 ---------------- examples/dxdemos/{d3d9.c => direct3d9.c} | 27 ++--- include/Mw/Widget/D3D8.h | 67 ------------ include/Mw/Widget/{D3D9.h => Direct3D9.h} | 34 ++---- milsko.xml | 18 +-- pl/rules.pl | 20 +--- src/backend/cairo.c | 12 +- src/widget/d3d8.c | 127 ---------------------- src/widget/{d3d9.c => direct3d9.c} | 59 +++++----- tools/genmk.pl | 30 +---- 15 files changed, 83 insertions(+), 449 deletions(-) delete mode 100644 examples/dxdemos/d3d8.c rename examples/dxdemos/{d3d9.c => direct3d9.c} (90%) delete mode 100644 include/Mw/Widget/D3D8.h rename include/Mw/Widget/{D3D9.h => Direct3D9.h} (53%) delete mode 100644 src/widget/d3d8.c rename src/widget/{d3d9.c => direct3d9.c} (65%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8863d43f..462643e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,8 +34,9 @@ else() endif() if(${CMAKE_SYSTEM_NAME} MATCHES Windows) - option(MW_TRY_D3D8 "Try to compile D3D8 widget or not" ON) - option(MW_TRY_D3D9 "Try to compile D3D9 widget or not" ON) + option(MW_TRY_DIRECT3D9 "Try to compile Direct3D9 widget or not" ON) +else() + option(MW_TRY_DIRECT3D9 "Try to compile Direct3D9 widget or not" OFF) endif() @@ -96,16 +97,12 @@ if(MW_TRY_VULKAN) endif() endif() -if(MW_TRY_D3D8 OR MW_TRY_D3D9) +if(MW_TRY_DIRECT3D9) include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) if(DIRECTX_FOUND) - if(MW_TRY_D3D8) - set(MW_BUILD_D3D8 ON) - message(STATUS "D3D8 widget has been enabled") - endif() - if(MW_TRY_D3D9) - set(MW_BUILD_D3D9 ON) - message(STATUS "D3D9 widget has been enabled") + if(MW_TRY_DIRECT3D9) + set(MW_BUILD_DIRECT3D9 ON) + message(STATUS "Direct3D9 widget has been enabled") endif() else() message(STATUS "DirectX widgets have been disabled (DirectX not found)") @@ -499,19 +496,11 @@ if(MW_BUILD_VULKAN) endif() endif() -if(MW_BUILD_D3D8) +if(MW_BUILD_DIRECT3D9) target_compile_definitions( Mw PUBLIC - MW_DIRECTX8 - ) -endif() - -if(MW_BUILD_D3D9) - target_compile_definitions( - Mw - PUBLIC - MW_DIRECTX9 + MW_DIRECT3D9 ) endif() diff --git a/NTMakefile b/NTMakefile index f42873ba..a5490157 100644 --- a/NTMakefile +++ b/NTMakefile @@ -14,7 +14,7 @@ LD = link /nologo DX9_FLAGS = !endif -MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) +MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX9_FLAGS) MW_LDFLAGS = /DLL EXE_CFLAGS = /Iinclude EXE_LDFLAGS = diff --git a/WatMakefile b/WatMakefile index 02205a74..99334e55 100644 --- a/WatMakefile +++ b/WatMakefile @@ -14,7 +14,7 @@ LD = wlink option quiet DX9_FLAGS = !endif -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX9_FLAGS) MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt diff --git a/configure b/configure index 5463444f..025b2656 100755 --- a/configure +++ b/configure @@ -70,8 +70,7 @@ my %features = ( "gnustep" => "use gnustep", "dbus" => "use DBus on supported platform", "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus", - "directx8" => "(Windows only) build DXD8 widget", - "directx9" => "(Windows only) build DXD9 widget" + "direct3d9" => "(Windows only) build Direct3D9 widget" ); my @features_keys = ( "1classic-theme", "1stb-image", @@ -80,15 +79,14 @@ my @features_keys = ( "1vulkan", "2vulkan-string-helper", "1shared", "1static", "1wayland", "1gnustep", - "1dbus", "1direct8", "1directx9" + "1dbus", "1direct3d9" ); sub def_platform { if($target eq "Windows") { param_set("freetype2", 0); param_set("stb-truetype", 0); - param_set("d3d8", 1); - param_set("d3d9", 1); + param_set("direct3d9", 1); } elsif($target ne "Darwin" and $target ne "ClassicMacOS" and $target ne "Haiku") { param_set("freetype2", 1); param_set("stb-truetype", 0); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 87225f1a..821516f8 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -7,7 +7,7 @@ if(${MW_TRY_VULKAN}) endif() if(WIN32) - if(${MW_TRY_D3D8} OR ${MW_BUILD_D3D8}) + if(${MW_TRY_DIRECT3D9}) add_subdirectory(dxdemos) endif() endif() diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c deleted file mode 100644 index c5d65d90..00000000 --- a/examples/dxdemos/d3d8.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Adapted from: - * https://web.archive.org/web/20211126225651/https://www.codeguru.com/multimedia/using-direct3d8-the-basics/ - */ -#include -#include - -#ifdef MW_DIRECTX8 - -MwWidget window, d3d8; -LPDIRECT3D8 d3d; -LPDIRECT3DDEVICE8 d3ddev; -LPDIRECT3DVERTEXBUFFER8 v_buffer; - -struct CUSTOMVERTEX { - FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag - DWORD color; // from the D3DFVF_DIFFUSE flag -}; -#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) - -static void MWAPI draw(MwWidget handle, void* user, void* client) { - // clear the window to a deep blue - d3ddev->lpVtbl->Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); - - d3ddev->lpVtbl->BeginScene(d3ddev); // begins the 3D scene - - // select which vertex format we are using - d3ddev->lpVtbl->SetVertexShader(d3ddev, CUSTOMFVF); - - // select the vertex buffer to display - d3ddev->lpVtbl->SetStreamSource(d3ddev, 0, v_buffer, sizeof(struct CUSTOMVERTEX)); - - // // copy the vertex buffer to the back buffer - d3ddev->lpVtbl->DrawPrimitive(d3ddev, D3DPT_TRIANGLELIST, 0, 1); - - d3ddev->lpVtbl->EndScene(d3ddev); // ends the 3D scene - - d3ddev->lpVtbl->Present(d3ddev, NULL, NULL, NULL, NULL); // displays the created frame -} - -int main() { - BYTE* pVoid; - - MwLibraryInit(); - - window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); - - d3d8 = MwCreateWidget(MwD3D8Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - - d3d = MwD3D8GetD3D(d3d8); - d3ddev = MwD3D8GetD3Dev(d3d8); - - // create three vertices using the CUSTOMVERTEX struct built earlier - struct CUSTOMVERTEX vertices[] = - { - { - 400.0f, - 0.0f, - 0.5f, - 1.0f, - D3DCOLOR_XRGB(0, 0, 255), - }, - { - 800.0f, - 600.0f, - 0.5f, - 1.0f, - D3DCOLOR_XRGB(0, 255, 0), - }, - { - 0.0f, - 600.0f, - 0.5f, - 1.0f, - D3DCOLOR_XRGB(255, 0, 0), - }, - }; - - d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, - 3 * sizeof(struct CUSTOMVERTEX), - 0, - CUSTOMFVF, - D3DPOOL_MANAGED, - &v_buffer); - - v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (BYTE**)&pVoid, 0); // lock the vertex buffer - memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer - v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer - - MwAddUserHandler(window, MwNtickHandler, draw, NULL); - - MwLoop(window); -} - -#endif diff --git a/examples/dxdemos/d3d9.c b/examples/dxdemos/direct3d9.c similarity index 90% rename from examples/dxdemos/d3d9.c rename to examples/dxdemos/direct3d9.c index 86186ae8..47a26092 100644 --- a/examples/dxdemos/d3d9.c +++ b/examples/dxdemos/direct3d9.c @@ -4,11 +4,9 @@ * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-4 */ #include -#include +#include -#ifdef MW_DIRECTX9 - -MwWidget window, d3d8; +MwWidget window, d3d9; LPDIRECT3D9 d3d; LPDIRECT3DDEVICE9 d3ddev; LPDIRECT3DVERTEXBUFFER9 v_buffer; @@ -41,16 +39,6 @@ static void MWAPI draw(MwWidget handle, void* user, void* client) { int main() { VOID* pVoid; - - MwLibraryInit(); - - window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); - - d3d8 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - - d3d = MwD3D9GetD3D(d3d8); - d3ddev = MwD3D9GetD3Dev(d3d8); - // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = { @@ -77,6 +65,15 @@ int main() { }, }; + MwLibraryInit(); + + window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); + + d3d9 = MwCreateWidget(MwDirect3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + + d3d = MwDirect3D9GetD3D(d3d9); + d3ddev = MwDirect3D9GetD3DDevice(d3d9); + d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, 3 * sizeof(struct CUSTOMVERTEX), 0, @@ -93,5 +90,3 @@ int main() { MwLoop(window); } - -#endif diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h deleted file mode 100644 index 9b0ae6eb..00000000 --- a/include/Mw/Widget/D3D8.h +++ /dev/null @@ -1,67 +0,0 @@ -/*! - * @file Mw/Widget/D3D8.h - * @brief D3D8 widget. - * @warning Only avaliable on Windows. - */ -#ifndef __MW_WIDGET_D3D8_H__ -#define __MW_WIDGET_D3D8_H__ - -#include -#include -#include - -#if !defined(MW_D3D8_NO_INCLUDE) - -/* https://github.com/microsoft/Windows-classic-samples/issues/317 */ -#if defined(__MINGW32__) || defined(__MINGW64__) -#define NTDDI_VERSION 0x07000000 -#define _WIN32_WINNT 0x0A00 - -#endif -#endif - -#ifndef _WIN32 -#error D3D8 widget only avaliable for Win32 backends -#undef MW_DIRECTX8 -#else -#ifdef MW_DIRECTX8 -#include -#endif -#endif - -/*! - * @brief D3D8 widget class - */ -MWDECL MwClass MwD3D8Class; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef MW_DIRECTX8 -MwInline LPDIRECT3D8 MwD3D8GetD3D(MwWidget handle) { - LPDIRECT3D8 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); - return out; -}; -MwInline LPDIRECT3DDEVICE8 MwD3D8GetD3Dev(MwWidget handle) { - LPDIRECT3DDEVICE8 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); - return out; -}; -#else -MwInline void* MwD3D8GetD3D(MwWidget handle) { - (void)handle; - return NULL; -}; -MwInline void* MwD3D8GetD3Dev(MwWidget handle) { - (void)handle; - return NULL; -}; -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/Mw/Widget/D3D9.h b/include/Mw/Widget/Direct3D9.h similarity index 53% rename from include/Mw/Widget/D3D9.h rename to include/Mw/Widget/Direct3D9.h index 3831301d..f31e2474 100644 --- a/include/Mw/Widget/D3D9.h +++ b/include/Mw/Widget/Direct3D9.h @@ -3,61 +3,51 @@ * @brief DirectX widget. * @warning Only avaliable on Windows. */ -#ifndef __MW_WIDGET_D3D9_H__ -#define __MW_WIDGET_D3D9_H__ +#ifndef __MW_WIDGET_DIRECT3D9_H__ +#define __MW_WIDGET_DIRECT3D9_H__ #include #include #include -#if !defined(MW_D3D9_NO_INCLUDE) +#if !defined(MW_DIRECT3D9_NO_INCLUDE) /* https://github.com/microsoft/Windows-classic-samples/issues/317 */ #if defined(__MINGW32__) || defined(__MINGW64__) +#undef NTDDI_VERSION +#undef _WIN32_WINNT + #define NTDDI_VERSION 0x07000000 #define _WIN32_WINNT 0x0A00 #endif #ifndef _WIN32 #error D3D9 widget only avaliable for Win32 backends -#undef MW_DIRECTX9 +#undef MW_DIRECT3D9 #else -#ifdef MW_DIRECTX9 #include #endif #endif -#endif /*! * @brief D3D9 widget class */ -MWDECL MwClass MwD3D9Class; +MWDECL MwClass MwDirect3D9Class; #ifdef __cplusplus extern "C" { #endif -#ifdef MW_DIRECTX9 -MwInline LPDIRECT3D9 MwD3D9GetD3D(MwWidget handle) { +MwInline LPDIRECT3D9 MwDirect3D9GetD3D(MwWidget handle) { LPDIRECT3D9 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); + MwVaWidgetExecute(handle, "mwDirect3D9GetD3D9", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE9 MwD3D9GetD3Dev(MwWidget handle) { +MwInline LPDIRECT3DDEVICE9 MwDirect3D9GetD3DDevice(MwWidget handle) { LPDIRECT3DDEVICE9 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); + MwVaWidgetExecute(handle, "mwDirect3D9GetD3DDevice9", &out); return out; }; -#else -MwInline void* MwD3D9GetD3D(MwWidget handle) { - (void)handle; - return NULL; -}; -MwInline void* MwD3D9GetD3Dev(MwWidget handle) { - (void)handle; - return NULL; -}; -#endif #ifdef __cplusplus } diff --git a/milsko.xml b/milsko.xml index 2ff60c7c..77ace6b5 100644 --- a/milsko.xml +++ b/milsko.xml @@ -1073,28 +1073,14 @@ - + - - - - - - - - - - - - - - - + diff --git a/pl/rules.pl b/pl/rules.pl index 8e4a611e..276eb887 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -66,7 +66,7 @@ if (grep(/^wayland$/, @backends)) { scan_wayland_protocol("unstable", "primary-selection", "-unstable-v1"); scan_wayland_protocol("unstable", "pointer-constraints", "-unstable-v1"); scan_wayland_protocol("unstable", "relative-pointer", "-unstable-v1"); - scan_wayland_protocol("staging", "fifo", "-v1"); + scan_wayland_protocol("staging", "fifo", "-v1"); scan_wayland_protocol_from_file("wlr-layer-shell", "wlr-layer-shell-unstable-v1.xml"); @@ -178,8 +178,7 @@ new_object("src/widget/window.c"); new_object("src/widget/opengl.c"); new_object("src/widget/vulkan.c"); -new_object("src/widget/d3d8.c"); -new_object("src/widget/d3d9.c"); +new_object("src/widget/direct3d9.c"); if (param_get("opengl")) { add_cflags("-DMW_OPENGL"); @@ -187,11 +186,8 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } -if (param_get("d3d8")) { - add_cflags("-DMW_DIRECTX8"); -} -if (param_get("d3d9")) { - add_cflags("-DMW_DIRECTX9"); +if (param_get("direct3d9")) { + add_cflags("-DMW_DIRECT3D9"); } new_object("src/dialog/*.c"); @@ -238,12 +234,8 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } -if (param_get("d3d8")) { - new_example("examples/dxdemos/d3d8"); -} - -if (param_get("d3d9")) { - new_example("examples/dxdemos/d3d9"); +if (param_get("direct3d9")) { + new_example("examples/dxdemos/direct3d9"); } 1; diff --git a/src/backend/cairo.c b/src/backend/cairo.c index 9dab1c19..3f1e18c8 100644 --- a/src/backend/cairo.c +++ b/src/backend/cairo.c @@ -219,8 +219,8 @@ static void MwLLFreeColorImpl(MwLLColor color) {} static MwBool lmao = MwFALSE; static int MwLLPendingImpl(MwLL handle) { - lmao = !lmao; - return lmao; + lmao = !lmao; + return lmao; } static void MwLLNextEventImpl(MwLL handle) { MwLLDispatch(handle, draw, NULL); @@ -264,10 +264,10 @@ static void MwLLRaiseImpl(MwLL handle) {} static void MwLLClipImpl(MwLL handle, MwRect* rect) {} static void MwLLSetupDragAndDropImpl(MwLL handle) {} static int MwLLCairoCallInitImpl(void) { - if(cairo_load_funcs() != 0) { - return 1; - } - return 0; + if(cairo_load_funcs() != 0) { + return 1; + } + return 0; } #include "call.c" CALL(Cairo); diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c deleted file mode 100644 index d569f530..00000000 --- a/src/widget/d3d8.c +++ /dev/null @@ -1,127 +0,0 @@ -#include - -#ifdef MW_DIRECTX8 -#include -typedef struct gdid3d8 { - void* d3d8dll; - IDirect3D8* (*Direct3DCreate8)(UINT sdk_version); - - LPDIRECT3D8 d3d; // the pointer to our Direct3D interface - LPDIRECT3DDEVICE8 d3ddev; // the pointer to the device class\ - -} gdid3d8_t; - -static int wcreate_d3d8(MwWidget handle) { - void* r = NULL; - MwWidget w = handle; - gdid3d8_t* o = malloc(sizeof(gdid3d8_t)); - D3DPRESENT_PARAMETERS d3dpp; - D3DDISPLAYMODE dispMode; - HRESULT hr; - char errbuf[2048] = {0}; - - o->d3d8dll = LoadLibrary("d3d8.dll"); - if(!o->d3d8dll) { - MwDispatchError(1, "d3d8.dll not found! Is DirectX8 installed?"); - return 1; - } - o->Direct3DCreate8 = (void*)GetProcAddress(o->d3d8dll, "Direct3DCreate8"); - if(!o->Direct3DCreate8) { - MwDispatchError(1, "Direct3DCreate8 not found! Is DirectX8 installed properly?"); - return 1; - } - - o->d3d = o->Direct3DCreate8(D3D_SDK_VERSION); - if(!o->Direct3DCreate8) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "Direct3DCreate8 NULL: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - hr = o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); - if(hr != D3D_OK) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "GetAdapterDisplayMode ERROR: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - ZeroMemory(&d3dpp, sizeof(d3dpp)); - d3dpp.Windowed = TRUE; - d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; - d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; - d3dpp.BackBufferFormat = dispMode.Format; - d3dpp.EnableAutoDepthStencil = TRUE; - d3dpp.AutoDepthStencilFormat = D3DFMT_D16; - - // create a device class using this information and information from the d3dpp stuct - o->d3d->lpVtbl->CreateDevice(o->d3d, - D3DADAPTER_DEFAULT, - D3DDEVTYPE_HAL, - handle->lowlevel->gdi.hWnd, - D3DCREATE_MIXED_VERTEXPROCESSING, - &d3dpp, - &o->d3ddev); - if(hr != D3D_OK) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "CreateDevice ERROR: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - o->d3ddev->lpVtbl->SetRenderState(o->d3ddev, D3DRS_LIGHTING, FALSE); - if(hr != D3D_OK) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "SetRenderState ERROR: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - handle->internal = o; - - return 0; -} - -static void destroy_d3d8(MwWidget handle) { - MwWidget w = handle; - gdid3d8_t* o = handle->internal; - - o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device - o->d3d->lpVtbl->Release(o->d3d); // close and release Direct3D - - free(handle->internal); -} - -static void func_handler_d3d8(MwWidget handle, const char* name, void* out, - va_list va) { - gdid3d8_t* o = handle->internal; - - if(strcmp(name, "mwDirectXGetD3D8") == 0) { - *(LPDIRECT3D8*)out = o->d3d; - } - if(strcmp(name, "mwDirectXGetD3Dev8") == 0) { - *(LPDIRECT3DDEVICE8*)out = o->d3ddev; - } -} - -MwClassRec MwDX8ClassRec = {wcreate_d3d8, /* create */ - destroy_d3d8, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - func_handler_d3d8, /* execute */ - NULL, /* tick */ - NULL, /* resize */ - NULL, /* children_update */ - NULL, /* children_prop_change */ - NULL, /* clipboard */ - NULL, /* props_change */ - NULL, NULL, NULL}; -MwClass MwD3D8Class = &MwDX8ClassRec; -#else -MWDECL MwClass MwDX8Class; - -MwClass MwDX8Class = NULL; -#endif diff --git a/src/widget/d3d9.c b/src/widget/direct3d9.c similarity index 65% rename from src/widget/d3d9.c rename to src/widget/direct3d9.c index 7219e58a..da77041f 100644 --- a/src/widget/d3d9.c +++ b/src/widget/direct3d9.c @@ -1,19 +1,17 @@ #include -#ifdef MW_DIRECTX9 -#include +#ifdef MW_DIRECT3D9 +#include typedef struct gdid3d9 { void* d3d9dll; IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); LPDIRECT3D9 d3d; // the pointer to our Direct3D interface - LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class\ + LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class } gdid3d9_t; static int wcreate_d3d9(MwWidget handle) { - void* r = NULL; - MwWidget w = handle; gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); HRESULT hr; char errbuf[2048]; @@ -27,7 +25,7 @@ static int wcreate_d3d9(MwWidget handle) { o->Direct3DCreate9 = (void*)GetProcAddress(o->d3d9dll, "Direct3DCreate9"); o->d3d = o->Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface - if(hr != D3D_OK) { + if(o->d3d == NULL) { MwDispatchError(1, "Direct3DCreate9 NULL"); return 1; } @@ -57,7 +55,6 @@ static int wcreate_d3d9(MwWidget handle) { } static void destroy_d3d9(MwWidget handle) { - MwWidget w = handle; gdid3d9_t* o = handle->internal; o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device @@ -70,35 +67,35 @@ static void func_handler_d3d9(MwWidget handle, const char* name, void* out, va_list va) { gdid3d9_t* o = handle->internal; - if(strcmp(name, "mwDirectXGetD3D9") == 0) { + (void)va; + + if(strcmp(name, "mwDirect3D9GetD3D9") == 0) { *(LPDIRECT3D9*)out = o->d3d; } - if(strcmp(name, "mwDirectXGetD3Dev9") == 0) { + if(strcmp(name, "mwDirect3D9GetD3DDevice9") == 0) { *(LPDIRECT3DDEVICE9*)out = o->d3ddev; } } -MwClassRec MwDX9ClassRec = {wcreate_d3d9, /* create */ - destroy_d3d9, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - func_handler_d3d9, /* execute */ - NULL, /* tick */ - NULL, /* resize */ - NULL, /* children_update */ - NULL, /* children_prop_change */ - NULL, /* clipboard */ - NULL, /* props_change */ - NULL, NULL, NULL}; -MwClass MwD3D9Class = &MwDX9ClassRec; +MwClassRec MwDirect3D9ClassRec = {wcreate_d3d9, /* create */ + destroy_d3d9, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler_d3d9, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ + NULL, NULL, NULL}; +MwClass MwDirect3D9Class = &MwDirect3D9ClassRec; #else -MWDECL MwClass MwDX9Class; - -MwClass MwDX9Class = NULL; +MwClass MwDirect3D9Class = NULL; #endif diff --git a/tools/genmk.pl b/tools/genmk.pl index 9f45add9..369ed581 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,24 +42,6 @@ sub cobjs { return $r; } - -sub dx8_detect_block { - return <<'EOF'; -!if [where d3d8.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d8.h 2^>nul') do @echo DX8_FLAGS = /DMW_DIRECTX8 /I"%~dpP">dx8flags.mk] -!endif -!else -!if [echo DX8_FLAGS =>dx9flags.mk] -!endif -!endif -!if exist("dx8flags.mk") -!include "dx8flags.mk" -!else -DX8_FLAGS = -!endif -EOF -} - sub dx9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] @@ -100,10 +82,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; - my $dx8_flags = ""; - my $dx8_block = ""; - my $dx9_flags = ""; - my $dx9_block = ""; + my $dx9_flags = ""; + my $dx9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -128,8 +108,6 @@ sub generate { $inc = "/I"; $dll = "/DLL"; - $dx8_flags = "\$(DX8_FLAGS)"; - $dx8_block = dx8_detect_block(); $dx9_flags = "\$(DX9_FLAGS)"; $dx9_block = dx9_detect_block(); } @@ -154,8 +132,6 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx8_flags = "\$(DX8_FLAGS)"; - $dx8_block = dx8_detect_block(); $dx9_flags = "\$(DX9_FLAGS)"; $dx9_block = dx9_detect_block(); } @@ -169,7 +145,7 @@ sub generate { print(OUT "\n"); } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx8_flags} ${dx9_flags}\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); From 985e33c78561ad61ce2d03f6e917dc425912b2c9 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:43:56 +0900 Subject: [PATCH 16/62] ok --- NTMakefile | 9 ++++----- WatMakefile | 15 ++++++--------- tools/genmk.pl | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/NTMakefile b/NTMakefile index a5490157..9f8ffe79 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,7 +2,7 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -99,8 +99,7 @@ clean: del /f /q src\widget\checkbox.obj del /f /q src\widget\clock.obj del /f /q src\widget\combobox.obj - del /f /q src\widget\d3d8.obj - del /f /q src\widget\d3d9.obj + del /f /q src\widget\direct3d9.obj del /f /q src\widget\document.obj del /f /q src\widget\entry.obj del /f /q src\widget\frame.obj @@ -358,8 +357,8 @@ examples\gldemos\tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) /Fo$@ examples/gldemos/tripaint.c -src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj - $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib +src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\direct3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj + $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\direct3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib .c.obj: diff --git a/WatMakefile b/WatMakefile index 99334e55..f8cc4306 100644 --- a/WatMakefile +++ b/WatMakefile @@ -2,7 +2,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -98,8 +98,7 @@ clean: .SYMBOLIC %erase src/widget/checkbox.obj %erase src/widget/clock.obj %erase src/widget/combobox.obj - %erase src/widget/d3d8.obj - %erase src/widget/d3d9.obj + %erase src/widget/direct3d9.obj %erase src/widget/document.obj %erase src/widget/entry.obj %erase src/widget/frame.obj @@ -357,8 +356,8 @@ examples/gldemos/tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/gldemos/tripaint.c -src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/d3d8.obj src/widget/d3d9.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj - $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/d3d8.obj file src/widget/d3d9.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib +src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/direct3d9.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj + $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/direct3d9.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib @@ -514,10 +513,8 @@ src/widget/clock.obj: src/widget/clock.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/clock.c src/widget/combobox.obj: src/widget/combobox.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/combobox.c -src/widget/d3d8.obj: src/widget/d3d8.c - $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d8.c -src/widget/d3d9.obj: src/widget/d3d9.c - $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d9.c +src/widget/direct3d9.obj: src/widget/direct3d9.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/direct3d9.c src/widget/document.obj: src/widget/document.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/document.c src/widget/entry.obj: src/widget/entry.c diff --git a/tools/genmk.pl b/tools/genmk.pl index 369ed581..95297708 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -45,7 +45,7 @@ sub cobjs { sub dx9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] From b355a2ed93566a28200b074cc1ed036a3a0bb391 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:47:13 +0900 Subject: [PATCH 17/62] rename --- examples/dxdemos/direct3d9.c | 4 ++-- include/Mw/Widget/Direct3D9.h | 8 ++++---- milsko.xml | 4 ++-- src/widget/direct3d9.c | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/dxdemos/direct3d9.c b/examples/dxdemos/direct3d9.c index 47a26092..368d6186 100644 --- a/examples/dxdemos/direct3d9.c +++ b/examples/dxdemos/direct3d9.c @@ -71,8 +71,8 @@ int main() { d3d9 = MwCreateWidget(MwDirect3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirect3D9GetD3D(d3d9); - d3ddev = MwDirect3D9GetD3DDevice(d3d9); + d3d = MwDirect3D9GetDirect3D9(d3d9); + d3ddev = MwDirect3D9GetDirect3DDevice9(d3d9); d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, 3 * sizeof(struct CUSTOMVERTEX), diff --git a/include/Mw/Widget/Direct3D9.h b/include/Mw/Widget/Direct3D9.h index f31e2474..b6904d4d 100644 --- a/include/Mw/Widget/Direct3D9.h +++ b/include/Mw/Widget/Direct3D9.h @@ -38,14 +38,14 @@ MWDECL MwClass MwDirect3D9Class; extern "C" { #endif -MwInline LPDIRECT3D9 MwDirect3D9GetD3D(MwWidget handle) { +MwInline LPDIRECT3D9 MwDirect3D9GetDirect3D9(MwWidget handle) { LPDIRECT3D9 out = NULL; - MwVaWidgetExecute(handle, "mwDirect3D9GetD3D9", &out, NULL); + MwVaWidgetExecute(handle, "mwDirect3D9GetDirect3D9", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE9 MwDirect3D9GetD3DDevice(MwWidget handle) { +MwInline LPDIRECT3DDEVICE9 MwDirect3D9GetDirect3DDevice9(MwWidget handle) { LPDIRECT3DDEVICE9 out = NULL; - MwVaWidgetExecute(handle, "mwDirect3D9GetD3DDevice9", &out); + MwVaWidgetExecute(handle, "mwDirect3D9GetDirect3DDevice9", &out); return out; }; diff --git a/milsko.xml b/milsko.xml index 77ace6b5..4b8a1ed4 100644 --- a/milsko.xml +++ b/milsko.xml @@ -1075,12 +1075,12 @@ - + - + diff --git a/src/widget/direct3d9.c b/src/widget/direct3d9.c index da77041f..41347861 100644 --- a/src/widget/direct3d9.c +++ b/src/widget/direct3d9.c @@ -69,10 +69,10 @@ static void func_handler_d3d9(MwWidget handle, const char* name, void* out, (void)va; - if(strcmp(name, "mwDirect3D9GetD3D9") == 0) { + if(strcmp(name, "mwDirect3D9GetDirect3D9") == 0) { *(LPDIRECT3D9*)out = o->d3d; } - if(strcmp(name, "mwDirect3D9GetD3DDevice9") == 0) { + if(strcmp(name, "mwDirect3D9GetDirect3DDevice9") == 0) { *(LPDIRECT3DDEVICE9*)out = o->d3ddev; } } From 9de7b9c9874647b1b5930caaa9120031a344e100 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:49:06 +0900 Subject: [PATCH 18/62] correct names --- NTMakefile | 10 +++++----- WatMakefile | 10 +++++----- tools/genmk.pl | 32 ++++++++++++++++---------------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/NTMakefile b/NTMakefile index 9f8ffe79..03839743 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,14 +2,14 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else -!if [echo DX9_FLAGS =>dx9flags.mk] +!if [echo DX9_FLAGS =>d3d9flags.mk] !endif !endif -!if exist("dx9flags.mk") -!include "dx9flags.mk" +!if exist("d3d9flags.mk") +!include "d3d9flags.mk" !else DX9_FLAGS = !endif @@ -122,7 +122,7 @@ clean: del /f /q src\widget\window.obj del /f /q src\Mw.dll del /f /q src\Mw.lib - del /f /q dx9flags.mk + del /f /q d3d9flags.mk del /f /q examples\basic\box.obj del /f /q examples\basic\calculator.obj del /f /q examples\basic\checkbox.obj diff --git a/WatMakefile b/WatMakefile index f8cc4306..07029477 100644 --- a/WatMakefile +++ b/WatMakefile @@ -2,14 +2,14 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else -!if [echo DX9_FLAGS =>dx9flags.mk] +!if [echo DX9_FLAGS =>d3d9flags.mk] !endif !endif -!if exist("dx9flags.mk") -!include "dx9flags.mk" +!if exist("d3d9flags.mk") +!include "d3d9flags.mk" !else DX9_FLAGS = !endif @@ -121,7 +121,7 @@ clean: .SYMBOLIC %erase src/widget/window.obj %erase src/Mw.dll %erase src/Mw.lib - %erase dx9flags.mk + %erase d3d9flags.mk %erase examples/basic/box.obj %erase examples/basic/calculator.obj %erase examples/basic/checkbox.obj diff --git a/tools/genmk.pl b/tools/genmk.pl index 95297708..e8c76959 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,17 +42,17 @@ sub cobjs { return $r; } -sub dx9_detect_block { +sub d3d9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else -!if [echo DX9_FLAGS =>dx9flags.mk] +!if [echo DX9_FLAGS =>d3d9flags.mk] !endif !endif -!if exist("dx9flags.mk") -!include "dx9flags.mk" +!if exist("d3d9flags.mk") +!include "d3d9flags.mk" !else DX9_FLAGS = !endif @@ -82,8 +82,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; - my $dx9_flags = ""; - my $dx9_block = ""; + my $d3d9_flags = ""; + my $d3d9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -108,8 +108,8 @@ sub generate { $inc = "/I"; $dll = "/DLL"; - $dx9_flags = "\$(DX9_FLAGS)"; - $dx9_block = dx9_detect_block(); + $d3d9_flags = "\$(DX9_FLAGS)"; + $d3d9_block = d3d9_detect_block(); } elsif ($type eq "Watcom") { $cc = "wcc386 -bt=nt -q"; @@ -132,20 +132,20 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx9_flags = "\$(DX9_FLAGS)"; - $dx9_block = dx9_detect_block(); + $d3d9_flags = "\$(DX9_FLAGS)"; + $d3d9_block = d3d9_detect_block(); } open(OUT, ">", $output); print(OUT "CC = $cc\n"); print(OUT "LD = $link\n"); print(OUT "\n"); - if ($dx9_block ne "") { - print(OUT $dx9_block); + if ($d3d9_block ne "") { + print(OUT $d3d9_block); print(OUT "\n"); } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${d3d9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); @@ -181,8 +181,8 @@ sub generate { } print(OUT " $del src${dir}Mw.dll\n"); print(OUT " $del src${dir}Mw.lib\n"); - if ($dx9_block ne "") { - print(OUT " $del dx9flags.mk\n"); + if ($d3d9_block ne "") { + print(OUT " $del d3d9flags.mk\n"); } foreach my $f (@examples) { my $b = $f; From ffa58c38a30bb89adb3aae2094361d415251b1cb Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Sat, 19 Sep 2026 01:58:40 +0900 Subject: [PATCH 19/62] experiment with cmake not trying to find directx --- CMakeLists.txt | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 462643e9..62cda1eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,15 +98,8 @@ if(MW_TRY_VULKAN) endif() if(MW_TRY_DIRECT3D9) - include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) - if(DIRECTX_FOUND) - if(MW_TRY_DIRECT3D9) - set(MW_BUILD_DIRECT3D9 ON) - message(STATUS "Direct3D9 widget has been enabled") - endif() - else() - message(STATUS "DirectX widgets have been disabled (DirectX not found)") - endif() + set(MW_BUILD_DIRECT3D9 ON) + message(STATUS "Direct3D9 widget has been enabled") endif() if(MW_BUILD_STATIC) From e98b4ca0c1f4572a416a05b2af6cb424a5f2c3e1 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Sat, 19 Sep 2026 02:00:27 +0900 Subject: [PATCH 20/62] Update examples/dxdemos/CMakeLists.txt --- examples/dxdemos/CMakeLists.txt | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/examples/dxdemos/CMakeLists.txt b/examples/dxdemos/CMakeLists.txt index aa09d638..15316514 100644 --- a/examples/dxdemos/CMakeLists.txt +++ b/examples/dxdemos/CMakeLists.txt @@ -3,21 +3,13 @@ file( EXAMPLES_DIRECTX_SOURCES *.c ) -include(${CMAKE_CURRENT_SOURCE_DIR}/../../resource/FindDirectX.cmake) -if(${DIRECTX_FOUND}) - foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) - get_filename_component(TARGET ${PATH} NAME_WE) - add_executable(${TARGET} ${PATH}) - target_include_directories( - ${TARGET} - PRIVATE - ${DIRECTX_INCLUDE_DIRS} - ) - target_link_libraries( -${TARGET} -PRIVATE -Mw -) - endforeach() -endif() +foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) + get_filename_component(TARGET ${PATH} NAME_WE) + add_executable(${TARGET} ${PATH}) + target_link_libraries( + ${TARGET} + PRIVATE + Mw + ) +endforeach() From 39dd112f2bd9fc4ef1aa60a4e995dca51402b403 Mon Sep 17 00:00:00 2001 From: Nishi Date: Mon, 21 Sep 2026 11:47:44 +0900 Subject: [PATCH 21/62] improve callback --- examples/basic/document.c | 7 ++++--- milsko.xml | 28 ++++++++++++++++++---------- pl/rules.pl | 2 +- src/backend/cairo.c | 12 ++++++------ src/widget/document.c | 6 ++++-- 5 files changed, 33 insertions(+), 22 deletions(-) diff --git a/examples/basic/document.c b/examples/basic/document.c index f9529fe0..cea01704 100644 --- a/examples/basic/document.c +++ b/examples/basic/document.c @@ -22,11 +22,12 @@ static void MWAPI resize_window(MwWidget handle, void* user, void* call) { } static void MWAPI layout_document(MwWidget handle, void* user, void* call) { - int height = *(int*)call; + MwRect size = *(MwRect*)call; - MwViewportSetSize(viewport, MwGetInteger(document, MwNwidth), height); + MwViewportSetSize(viewport, size.width, size.height); MwVaApply(document, - MwNheight, height, + MwNwidth, size.width, + MwNheight, size.height, NULL); } diff --git a/milsko.xml b/milsko.xml index 7a7410a9..81d6e136 100644 --- a/milsko.xml +++ b/milsko.xml @@ -105,15 +105,13 @@ - - - + + + - - @@ -206,7 +204,7 @@ - + @@ -1072,10 +1070,20 @@ - - - - + + + + + + + + + + + + + + diff --git a/pl/rules.pl b/pl/rules.pl index f12c0922..7a58a971 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -66,7 +66,7 @@ if (grep(/^wayland$/, @backends)) { scan_wayland_protocol("unstable", "primary-selection", "-unstable-v1"); scan_wayland_protocol("unstable", "pointer-constraints", "-unstable-v1"); scan_wayland_protocol("unstable", "relative-pointer", "-unstable-v1"); - scan_wayland_protocol("staging", "fifo", "-v1"); + scan_wayland_protocol("staging", "fifo", "-v1"); scan_wayland_protocol_from_file("wlr-layer-shell", "wlr-layer-shell-unstable-v1.xml"); diff --git a/src/backend/cairo.c b/src/backend/cairo.c index 9dab1c19..3f1e18c8 100644 --- a/src/backend/cairo.c +++ b/src/backend/cairo.c @@ -219,8 +219,8 @@ static void MwLLFreeColorImpl(MwLLColor color) {} static MwBool lmao = MwFALSE; static int MwLLPendingImpl(MwLL handle) { - lmao = !lmao; - return lmao; + lmao = !lmao; + return lmao; } static void MwLLNextEventImpl(MwLL handle) { MwLLDispatch(handle, draw, NULL); @@ -264,10 +264,10 @@ static void MwLLRaiseImpl(MwLL handle) {} static void MwLLClipImpl(MwLL handle, MwRect* rect) {} static void MwLLSetupDragAndDropImpl(MwLL handle) {} static int MwLLCairoCallInitImpl(void) { - if(cairo_load_funcs() != 0) { - return 1; - } - return 0; + if(cairo_load_funcs() != 0) { + return 1; + } + return 0; } #include "call.c" CALL(Cairo); diff --git a/src/widget/document.c b/src/widget/document.c index 1f48cec6..d6aec38a 100644 --- a/src/widget/document.c +++ b/src/widget/document.c @@ -498,6 +498,7 @@ static void layout(MwWidget handle) { MwFLFont* fontstack = NULL; MwRect clickable; char* c_title = NULL; + MwRect size; arrput(fontstack, NULL); @@ -612,8 +613,9 @@ static void layout(MwWidget handle) { l->font = TOPFONT; } - y += MwTextHeight(handle, TOPFONT, "M"); - MwDispatchUserHandler(handle, MwNlayoutHandler, &y); + size.width = w; + size.height = y + MwTextHeight(handle, TOPFONT, "M"); + MwDispatchUserHandler(handle, MwNlayoutHandler, &size); arrfree(fontstack); From 2858679cc4ef80c6c0bf679aa02e6e9326043488 Mon Sep 17 00:00:00 2001 From: Nishi Date: Mon, 21 Sep 2026 11:57:37 +0900 Subject: [PATCH 22/62] optimize --- src/widget/document.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/widget/document.c b/src/widget/document.c index d6aec38a..f71e1bca 100644 --- a/src/widget/document.c +++ b/src/widget/document.c @@ -59,6 +59,17 @@ static void draw(MwWidget handle) { MwFLFont font = NULL; MwPoint u_p, s_p, c_p; int u = 0, s = 0, c = 0; + int s_y = 0; + int s_h = MwGetInteger(handle, MwNheight); + MwWidget p = handle->parent; + + s_y = MwGetInteger(handle, MwNy); + while(p != NULL && p->widget_class != MwWindowClass) { + s_y += MwGetInteger(p, MwNy); + + p = p->parent; + } + s_y *= -1; u_p.x = s_p.x = c_p.x = 0; u_p.y = s_p.y = c_p.y = 0; @@ -80,6 +91,8 @@ static void draw(MwWidget handle) { p.x = l->x; p.y = l->y + MwTextHeight(handle, font, l->text) / 2; + if(p.y <= s_y || p.y >= s_y + s_h) break; + if(u || s || c) { MwPoint line[2]; int j; From f8c678ac53bee5be4005afb19317d2b192525c62 Mon Sep 17 00:00:00 2001 From: Nishi Date: Mon, 21 Sep 2026 12:41:56 +0900 Subject: [PATCH 23/62] ok --- include/Mw/Core.h | 7 +++++++ include/Mw/Draw.h | 7 +++++++ src/core.c | 27 +++++++++++++++++++++++++++ src/draw.c | 32 ++++++++++++++++++++++++++++++++ src/widget/document.c | 17 +++++------------ 5 files changed, 78 insertions(+), 12 deletions(-) diff --git a/include/Mw/Core.h b/include/Mw/Core.h index 61cb0855..318a8cab 100644 --- a/include/Mw/Core.h +++ b/include/Mw/Core.h @@ -390,6 +390,13 @@ MWDECL void MWAPI MwFreeWidget(MwWidget handle); */ MWDECL void MWAPI MwGetFrame(MwWidget handle, MwRect* rect); +/*! + * @brief Gets the clipping frame of the widget + * @param handle Widget + * @param rect Frame + */ +MWDECL void MWAPI MwGetClipFrame(MwWidget handle, MwRect* rect); + #ifdef _MILSKO MWDECL void MwForceRender_Internal(MwWidget handle); MWDECL void MwForceRender2_Internal(MwWidget handle, void* ptr); diff --git a/include/Mw/Draw.h b/include/Mw/Draw.h index ad13c603..12d3d453 100644 --- a/include/Mw/Draw.h +++ b/include/Mw/Draw.h @@ -220,6 +220,13 @@ MWDECL void MWAPI MwDrawDiamond(MwWidget handle, MwRect* rect, MwLLColor color, */ MWDECL void MWAPI MwDrawCircle(MwWidget handle, MwRect* rect, MwLLColor color, MwLLColor background, int filled); +/*! + * @brief Calculate intersect of 2 rectangles + * @param a 1st rectangle + * @param a 2nd rectangle + */ +MWDECL void MwIntersectRect(MwRect* a, const MwRect* b); + /* text.c */ /*! diff --git a/src/core.c b/src/core.c index 1403310f..7bc70651 100644 --- a/src/core.c +++ b/src/core.c @@ -1241,4 +1241,31 @@ void MwGetFrame(MwWidget handle, MwRect* rect) { rect->height = MwGetInteger(handle, MwNheight); } +void MwGetClipFrame(MwWidget handle, MwRect* rect) { + MwWidget child = handle; + MwWidget p = handle->parent; + int o_x = 0, o_y = 0; + + rect->x = 0; + rect->y = 0; + rect->width = MwGetInteger(handle, MwNwidth); + rect->height = MwGetInteger(handle, MwNheight); + while(p != NULL && p->widget_class != MwWindowClass) { + MwRect pclip; + + o_x += MwGetInteger(child, MwNx); + o_y += MwGetInteger(child, MwNy); + + pclip.x = -o_x; + pclip.y = -o_y; + pclip.width = MwGetInteger(p, MwNwidth); + pclip.height = MwGetInteger(p, MwNheight); + MwIntersectRect(rect, &pclip); + if(rect->width == 0 || rect->height == 0) break; + + child = p; + p = p->parent; + } +} + const char* MwVersionString = MwVERSION; diff --git a/src/draw.c b/src/draw.c index ab4c9cb2..b2ab8b14 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1125,3 +1125,35 @@ MwLLPixmap MwLoadXPM(MwWidget handle, char** data) { return px; } + +static int _min(int a, int b) { + return a < b ? a : b; +} + +static int _max(int a, int b) { + return a > b ? a : b; +} + +void MwIntersectRect(MwRect* a, const MwRect* b) { + int x; + int y; + int right; + int bottom; + + x = _max(a->x, b->x); + y = _max(a->y, b->y); + right = _min(a->x + a->width, b->x + b->width); + bottom = _min(a->y + a->height, b->y + b->height); + + a->x = x; + a->y = y; + + if(right <= x || bottom <= x) { + a->width = 0; + a->height = 0; + return; + } + + a->width = right - x; + a->height = bottom - y; +} diff --git a/src/widget/document.c b/src/widget/document.c index f71e1bca..eb5233d4 100644 --- a/src/widget/document.c +++ b/src/widget/document.c @@ -59,17 +59,9 @@ static void draw(MwWidget handle) { MwFLFont font = NULL; MwPoint u_p, s_p, c_p; int u = 0, s = 0, c = 0; - int s_y = 0; - int s_h = MwGetInteger(handle, MwNheight); - MwWidget p = handle->parent; + MwRect clip; - s_y = MwGetInteger(handle, MwNy); - while(p != NULL && p->widget_class != MwWindowClass) { - s_y += MwGetInteger(p, MwNy); - - p = p->parent; - } - s_y *= -1; + MwGetClipFrame(handle, &clip); u_p.x = s_p.x = c_p.x = 0; u_p.y = s_p.y = c_p.y = 0; @@ -87,11 +79,12 @@ static void draw(MwWidget handle) { case MwDOCUMENT_TEXT: { MwPoint p; + int th2; p.x = l->x; - p.y = l->y + MwTextHeight(handle, font, l->text) / 2; + p.y = l->y + (th2 = MwTextHeight(handle, font, l->text) / 2); - if(p.y <= s_y || p.y >= s_y + s_h) break; + if((p.y + th2) <= clip.y || (p.y - th2) >= clip.y + clip.height) break; if(u || s || c) { MwPoint line[2]; From b1a2d4d549229149a8f4af37c657ae84a52d429b Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 11:36:08 -0700 Subject: [PATCH 24/62] wayland fixes --- src/backend/wayland/interfaces.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/backend/wayland/interfaces.c b/src/backend/wayland/interfaces.c index 50a58e46..2d664931 100644 --- a/src/backend/wayland/interfaces.c +++ b/src/backend/wayland/interfaces.c @@ -17,9 +17,9 @@ static void setup_clipboard(MwLL self, struct wl_seat* wl_seat); static void setup_zwp_clipboard(MwLL self, struct wl_seat* wl_seat); -static void destroy_clipboard(MwLL self, struct wl_seat* wl_seat); -static void destroy_zwp_clipboard(MwLL self, struct wl_seat* wl_seat); -static bool hit_detect(MwLL child, MwLL* _topmost_parent, MwPoint* _point, MwPoint* _relative_mouse_pos, MwPoint* _absolute_pos); +static void destroy_clipboard(MwLL self, struct wl_seat* wl_seat); +static void destroy_zwp_clipboard(MwLL self, struct wl_seat* wl_seat); +static MwBool hit_detect(MwLL child, MwLL* _topmost_parent, MwPoint* _point, MwPoint* _relative_mouse_pos, MwPoint* _absolute_pos); /* Recursively dispatch a key event to a widget and its children */ static void recursive_dispatch_key(MwLL handle, int* k) { @@ -398,7 +398,6 @@ static void wl_data_source_listener_target(void* data, (void)data; (void)wl_data_source; (void)mime_type; - printf("test\n"); }; static void wl_data_source_listener_send(void* data, struct wl_data_source* wl_data_source, @@ -591,6 +590,10 @@ static void pointer_enter(void* data, struct wl_pointer* wl_pointer, MwU32 seria if(self->wayland.backbuffer.surface == surface) { curSurface = surface; } + + self->wayland.cur_mouse_pos.x = wl_fixed_to_int(surface_x); + self->wayland.cur_mouse_pos.y = wl_fixed_to_int(surface_y); + WAYLAND_EVENT_OP_END(self); }; @@ -780,7 +783,7 @@ static void recursive_dispatch_mouse_up(MwLL handle, MwMouse* p) { } }; -static bool hit_detect(MwLL child, MwLL* _topmost_parent, MwPoint* _point, MwPoint* _relative_mouse_pos, MwPoint* _absolute_pos) { +static MwBool hit_detect(MwLL child, MwLL* _topmost_parent, MwPoint* _point, MwPoint* _relative_mouse_pos, MwPoint* _absolute_pos) { MwLL topmost_parent = child; MwPoint point; MwPoint relative_mouse_pos; @@ -791,8 +794,15 @@ static bool hit_detect(MwLL child, MwLL* _topmost_parent, MwPoint* _point, MwPoi while(topmost_parent->wayland.parent) { topmost_parent = topmost_parent->wayland.parent; if(topmost_parent) { - absolute_pos.x += topmost_parent->wayland.x; - absolute_pos.y += topmost_parent->wayland.y; + /* if the topmost parent is a popup then its x/y is irrelevant to us. + * it's gonna be the position of the popup itself, and we want our + * position to be relative to the popup itself. */ + if(topmost_parent->wayland.type != MwLL_WAYLAND_POPUP) { + if(topmost_parent->wayland.x > 0) + absolute_pos.x += topmost_parent->wayland.x; + if(topmost_parent->wayland.y > 0) + absolute_pos.y += topmost_parent->wayland.y; + } } } From 4cb88fdc05e74ddb3f1a4032dca53fcf64634bb7 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 11:40:51 -0700 Subject: [PATCH 25/62] wayland: remove our widget from parent's currently held widgets on destroy --- src/backend/wayland/wayland.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index c8544531..d5345180 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -986,6 +986,9 @@ static void MwLLDestroyImpl(MwLL handle) { int i; struct timeval tv; int select_ret; + MwLL topmost_parent = handle; + + while(topmost_parent->wayland.parent) topmost_parent = topmost_parent->wayland.parent; event_loop(handle); // wl_display_cancel_read(handle->wayland.display); @@ -1025,6 +1028,12 @@ static void MwLLDestroyImpl(MwLL handle) { printf("widget invalid\n"); } + for(i = 0; i < arrlen(topmost_parent->wayland.currentlyHeldWidgets); i++) { + if(topmost_parent->wayland.currentlyHeldWidgets[i] == handle) { + arrdel(topmost_parent->wayland.currentlyHeldWidgets, i); + } + } + // pthread_mutex_destroy(&handle->wayland.eventsMutex); free(handle); From e8d692f05a296064f2f37f6dc369a7219505b173 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 11:54:07 -0700 Subject: [PATCH 26/62] remove the unneeded 'wayland event start/end' macros --- include/Mw/LowLevel/Wayland.h | 6 --- src/backend/wayland/interfaces.c | 85 +++++--------------------------- src/backend/wayland/wayland.c | 3 +- 3 files changed, 14 insertions(+), 80 deletions(-) diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h index 0d5a24f6..83cd2999 100644 --- a/include/Mw/LowLevel/Wayland.h +++ b/include/Mw/LowLevel/Wayland.h @@ -488,12 +488,6 @@ void MwLLWaylandFlush(MwLL handle); /* recursively dispatch the key event to focused widgets. */ void MwLLRecursiveKeyDispatch(MwLL self, int* k, MwBool down); -/* Standard procedure before event callbacks in Wayland */ -#define WAYLAND_EVENT_OP_START(self) - -/* Footer for WAYLAND_EVENT_OP_START */ -#define WAYLAND_EVENT_OP_END(self) - /* the two decoration manager constructs */ typedef struct zxdg_decoration_manager_v1_context { struct zxdg_decoration_manager_v1* manager; diff --git a/src/backend/wayland/interfaces.c b/src/backend/wayland/interfaces.c index 2d664931..82146f60 100644 --- a/src/backend/wayland/interfaces.c +++ b/src/backend/wayland/interfaces.c @@ -72,8 +72,6 @@ static void new_protocol(void* data, struct wl_registry* registry, (void)version; (void)registry; - WAYLAND_EVENT_OP_START(self); - wayland_protocol_callback_table_t* cb = shget(self->wayland.wl_protocol_setup_map, interface); if(cb != NULL) { shput(self->wayland.wl_protocol_map, interface, cb->setup(name, data, version)); @@ -83,8 +81,6 @@ static void new_protocol(void* data, struct wl_registry* registry, } else { // printf("unknown interface %s\n", interface); } - - WAYLAND_EVENT_OP_END(self); }; /* `wl_registry.global_remove` callback */ @@ -154,11 +150,7 @@ static void wl_data_device_enter(void* data, (void)y; (void)id; - WAYLAND_EVENT_OP_START(self); - self->ll->wayland.clipboard_serial = serial; - - WAYLAND_EVENT_OP_END(self); }; static void wl_data_device_leave(void* data, struct wl_data_device* wl_data_device) { @@ -407,12 +399,10 @@ static void wl_data_source_listener_send(void* data, (void)wl_data_source; (void)mime_type; - WAYLAND_EVENT_OP_START(self); if(self->wayland.clipboard_buffer != NULL) { write(fd, self->wayland.clipboard_buffer, strlen(self->wayland.clipboard_buffer)); close(fd); } - WAYLAND_EVENT_OP_END(self); }; static void wl_data_source_listener_cancelled(void* data, struct wl_data_source* wl_data_source); @@ -427,8 +417,6 @@ static void wl_data_source_listener_cancelled(void* data, struct wl_data_source* wl_data_source) { MwLL self = data; - WAYLAND_EVENT_OP_START(self); - if(wl_data_source) wl_data_source_destroy(wl_data_source); @@ -442,8 +430,6 @@ static void wl_data_source_listener_cancelled(void* data, wl_data_source_offer(self->wayland.clipboard_source.wl, "text/uri-list"); wl_data_source_add_listener(self->wayland.clipboard_source.wl, &wl_data_source_listener, self); - - WAYLAND_EVENT_OP_END(self); }; static void zwp_primary_selection_source_v1_send(void* data, @@ -454,22 +440,16 @@ static void zwp_primary_selection_source_v1_send(void* data, (void)wl_data_source; (void)mime_type; - WAYLAND_EVENT_OP_START(self); - if(self->wayland.clipboard_buffer != NULL) { write(fd, self->wayland.clipboard_buffer, strlen(self->wayland.clipboard_buffer)); close(fd); } - - WAYLAND_EVENT_OP_END(self); }; static void zwp_primary_selection_source_v1_cancelled(void* data, struct zwp_primary_selection_source_v1* wl_data_source) { MwLL self = data; (void)wl_data_source; - WAYLAND_EVENT_OP_START(self); - zwp_primary_selection_source_v1_destroy(self->wayland.clipboard_source.zwp); self->wayland.clipboard_source.zwp = zwp_primary_selection_device_manager_v1_create_source(self->wayland.clipboard_manager.zwp); @@ -479,8 +459,6 @@ static void zwp_primary_selection_source_v1_cancelled(void* data, zwp_primary_selection_source_v1_offer(self->wayland.clipboard_source.zwp, "TEXT"); zwp_primary_selection_source_v1_offer(self->wayland.clipboard_source.zwp, "STRING"); zwp_primary_selection_source_v1_offer(self->wayland.clipboard_source.zwp, "UTF8_STRING"); - - WAYLAND_EVENT_OP_END(self); }; struct zwp_primary_selection_source_v1_listener zwp_primary_selection_source_v1_listener = { @@ -577,7 +555,6 @@ static void pointer_enter(void* data, struct wl_pointer* wl_pointer, MwU32 seria (void)surface_y; (void)wl_pointer; - WAYLAND_EVENT_OP_START(self); while(topmost_parent->wayland.parent) topmost_parent = topmost_parent->wayland.parent; if(self->wayland.framebuffer.surface == surface) { @@ -593,20 +570,15 @@ static void pointer_enter(void* data, struct wl_pointer* wl_pointer, MwU32 seria self->wayland.cur_mouse_pos.x = wl_fixed_to_int(surface_x); self->wayland.cur_mouse_pos.y = wl_fixed_to_int(surface_y); - - WAYLAND_EVENT_OP_END(self); }; /* `wl_pointer.leave` callback */ static void pointer_leave(void* data, struct wl_pointer* wl_pointer, MwU32 serial, struct wl_surface* surface) { - MwLL self = data; + (void)data; (void)wl_pointer; (void)serial; (void)surface; - WAYLAND_EVENT_OP_START(self); - curSurface = NULL; - WAYLAND_EVENT_OP_END(self); }; static void xdg_borderless_step_mdown(MwLL self, MwMouse p, MwU32 serial) { @@ -676,15 +648,11 @@ static void relative_pointer_motion(void* data, (void)dx; (void)dy; - WAYLAND_EVENT_OP_START(self); - p.point.x = wl_fixed_to_int(dxUnaccel); p.point.y = wl_fixed_to_int(dyUnaccel); recursive_dispatch_move(self, &p); if(self->wayland.locked_pointer) zwp_locked_pointer_v1_set_cursor_position_hint(self->wayland.locked_pointer, 0, CSD_BORDER_FRAME_TOP); - - WAYLAND_EVENT_OP_END(self); } struct zwp_relative_pointer_v1_listener MwLLWaylandRelativePointerListener = @@ -716,7 +684,6 @@ static void pointer_motion(void* data, struct wl_pointer* wl_pointer, MwU32 time (void)time; (void)wl_pointer; - WAYLAND_EVENT_OP_START(self); while(topmost_parent->wayland.parent) topmost_parent = topmost_parent->wayland.parent; currentlyHeldWidgets = topmost_parent->wayland.currentlyHeldWidgets; @@ -752,8 +719,6 @@ static void pointer_motion(void* data, struct wl_pointer* wl_pointer, MwU32 time if(self->wayland.backbuffer.surface) { wl_pointer_set_cursor(self->wayland.pointer, self->wayland.pointer_serial, self->wayland.cursor.surface, 0, 0); } - - WAYLAND_EVENT_OP_END(self); }; static void recursive_dispatch_mouse_down(MwLL handle, MwMouse* p) { @@ -794,10 +759,8 @@ static MwBool hit_detect(MwLL child, MwLL* _topmost_parent, MwPoint* _point, MwP while(topmost_parent->wayland.parent) { topmost_parent = topmost_parent->wayland.parent; if(topmost_parent) { - /* if the topmost parent is a popup then its x/y is irrelevant to us. - * it's gonna be the position of the popup itself, and we want our - * position to be relative to the popup itself. */ - if(topmost_parent->wayland.type != MwLL_WAYLAND_POPUP) { + /* if the topmost parent is a popup/subwindow then its x/y is irrelevant to us. */ + if(topmost_parent->wayland.type != MwLL_WAYLAND_POPUP && topmost_parent->wayland.type != MwLL_WAYLAND_TOPLEVEL) { if(topmost_parent->wayland.x > 0) absolute_pos.x += topmost_parent->wayland.x; if(topmost_parent->wayland.y > 0) @@ -881,8 +844,6 @@ static void pointer_button(void* data, struct wl_pointer* wl_pointer, MwU32 seri (void)serial; (void)time; - WAYLAND_EVENT_OP_START(self); - if(self->wayland.type != MwLL_WAYLAND_POPUP) { while(topmost_parent->wayland.parent) topmost_parent = topmost_parent->wayland.parent; } @@ -909,19 +870,18 @@ static void pointer_button(void* data, struct wl_pointer* wl_pointer, MwU32 seri arrsetlen(self->wayland.currentlyHeldWidgets, 0); mouse_dispatch(self, p, state); - } - if(self->wayland.backbuffer.surface) { - if(!self->wayland.has_decorations && self->wayland.do_csd) { - if(state != WL_POINTER_BUTTON_STATE_RELEASED) - xdg_borderless_step_mdown(self, p, serial); - else - xdg_borderless_step_mup(self, p, serial); + + if(self->wayland.backbuffer.surface) { + if(!self->wayland.has_decorations && self->wayland.do_csd) { + if(state != WL_POINTER_BUTTON_STATE_RELEASED) + xdg_borderless_step_mdown(self, p, serial); + else + xdg_borderless_step_mup(self, p, serial); + } } } MwLLForceRender(self); - - WAYLAND_EVENT_OP_END(self); }; /* `wl_pointer.axis` callback */ @@ -984,13 +944,9 @@ static void keyboard_enter(void* data, (void)surface; (void)keys; - WAYLAND_EVENT_OP_START(self); - self->wayland.keyboard_serial = serial; MwLLDispatch(self, focus_in, NULL); - - WAYLAND_EVENT_OP_END(self); }; /* `wl_keyboard.leave` callback */ @@ -1003,11 +959,7 @@ static void keyboard_leave(void* data, (void)serial; (void)surface; - WAYLAND_EVENT_OP_START(self); - MwLLDispatch(self, focus_out, NULL); - - WAYLAND_EVENT_OP_END(self); }; void MwLLRecursiveKeyDispatch(MwLL self, int* k, MwBool down) { @@ -1053,8 +1005,6 @@ static void keyboard_key(void* data, while(topmost_parent->wayland.parent) topmost_parent = topmost_parent->wayland.parent; - WAYLAND_EVENT_OP_START(self); - if(self->wayland.framebuffer.surface) { inArea |= self->wayland.framebuffer.surface == curSurface; } @@ -1072,7 +1022,7 @@ static void keyboard_key(void* data, int i; if(!self->wayland.xkb_keymap) { - WAYLAND_EVENT_OP_END(self); + return; } @@ -1087,7 +1037,7 @@ static void keyboard_key(void* data, } syms_num = xkb_keymap_key_get_syms_by_level(self->wayland.xkb_keymap, keycode, layout, level, &syms_out); if(syms_out == NULL) { - WAYLAND_EVENT_OP_END(self); + return; } @@ -1161,8 +1111,6 @@ static void keyboard_key(void* data, if(!MwWaylandVulkan) { MwLLDispatch(self, draw, NULL); } - - WAYLAND_EVENT_OP_END(self); }; /* `wl_keyboard.modifiers` callback */ @@ -1179,13 +1127,9 @@ static void keyboard_modifiers(void* data, (void)group; (void)mods_latched; - WAYLAND_EVENT_OP_START(self); - self->wayland.mod_state = 0; self->wayland.mod_state |= mods_depressed; self->wayland.mod_state |= mods_locked; - - WAYLAND_EVENT_OP_END(self); }; static void setup_zwp_clipboard(MwLL self, struct wl_seat* wl_seat) { @@ -1256,8 +1200,6 @@ static void wl_seat_capabilities(void* data, struct wl_seat* wl_seat, MwU32 capabilities) { MwLL self = data; - WAYLAND_EVENT_OP_START(self); - /* Always remember the seat itself, regardless of which capabilities it has - this is * both what setup_clipboard()/setup_zwp_clipboard() below use, and what lets * wl_seat_interface_destroy() release it later even on a keyboard-only seat. */ @@ -1271,7 +1213,6 @@ static void wl_seat_capabilities(void* data, struct wl_seat* wl_seat, self->wayland.pointer = wl_seat_get_pointer(wl_seat); wl_pointer_add_listener(self->wayland.pointer, &pointer_listener, data); } - WAYLAND_EVENT_OP_END(self); /* Only hooked up if this seat actually has a pointer: wl_data_device.get_data_device() * requires a non-null seat, and pointer_seat is only ever null before the first diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index d5345180..a0645e79 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -196,9 +196,8 @@ static void xdg_toplevel_close( void* data, struct xdg_toplevel* xdg_toplevel) { MwLL self = data; (void)xdg_toplevel; - WAYLAND_EVENT_OP_START(self); + MwLLDispatch(self, close, NULL); - WAYLAND_EVENT_OP_END(self); }; /* `xdg_surface.configure` callback */ From 9420878b93ea98cdd62ee416d968de2c60920a54 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 12:01:23 -0700 Subject: [PATCH 27/62] oops! fix csd not working --- src/backend/wayland/interfaces.c | 46 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/backend/wayland/interfaces.c b/src/backend/wayland/interfaces.c index 82146f60..31a8219d 100644 --- a/src/backend/wayland/interfaces.c +++ b/src/backend/wayland/interfaces.c @@ -692,9 +692,9 @@ static void pointer_motion(void* data, struct wl_pointer* wl_pointer, MwU32 time inArea |= self->wayland.framebuffer.surface == curSurface; } - // if(self->wayland.backbuffer.surface) { - // inArea |= self->wayland.backbuffer.surface == curSurface; - // } + if(self->wayland.backbuffer.surface) { + inArea |= self->wayland.backbuffer.surface == curSurface; + } self->wayland.cur_mouse_pos.x = wl_fixed_to_int(surface_x); self->wayland.cur_mouse_pos.y = wl_fixed_to_int(surface_y); @@ -854,30 +854,30 @@ static void pointer_button(void* data, struct wl_pointer* wl_pointer, MwU32 seri inArea |= self->wayland.framebuffer.surface == curSurface; } - if(inArea) { - switch(button) { - case BTN_LEFT: - p.button = MwMOUSE_LEFT; - break; - case BTN_MIDDLE: - p.button = MwMOUSE_MIDDLE; - break; - case BTN_RIGHT: - p.button = MwMOUSE_RIGHT; - break; - } - self->wayland.held_down = state == WL_POINTER_BUTTON_STATE_PRESSED; + switch(button) { + case BTN_LEFT: + p.button = MwMOUSE_LEFT; + break; + case BTN_MIDDLE: + p.button = MwMOUSE_MIDDLE; + break; + case BTN_RIGHT: + p.button = MwMOUSE_RIGHT; + break; + } + if(inArea) { + self->wayland.held_down = state == WL_POINTER_BUTTON_STATE_PRESSED; arrsetlen(self->wayland.currentlyHeldWidgets, 0); mouse_dispatch(self, p, state); + } - if(self->wayland.backbuffer.surface) { - if(!self->wayland.has_decorations && self->wayland.do_csd) { - if(state != WL_POINTER_BUTTON_STATE_RELEASED) - xdg_borderless_step_mdown(self, p, serial); - else - xdg_borderless_step_mup(self, p, serial); - } + if(self->wayland.backbuffer.surface) { + if(!self->wayland.has_decorations && self->wayland.do_csd) { + if(state != WL_POINTER_BUTTON_STATE_RELEASED) + xdg_borderless_step_mdown(self, p, serial); + else + xdg_borderless_step_mup(self, p, serial); } } From 954a4a8e1562dea886070b733b40f218d1cafc42 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 14:27:03 -0700 Subject: [PATCH 28/62] disable dnd on X11 for now --- examples/basic/dnd.c | 2 +- src/backend/x11.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/basic/dnd.c b/examples/basic/dnd.c index 8d0f47d0..56e1c8e3 100644 --- a/examples/basic/dnd.c +++ b/examples/basic/dnd.c @@ -48,7 +48,7 @@ int main() { NULL); MwAddUserHandler(window, MwNresizeHandler, resize, NULL); - MwAddUserHandler(instructions, MwNdragAndDropHandler, dnd, NULL); + MwAddUserHandler(window, MwNdragAndDropHandler, dnd, NULL); resize(window, NULL, NULL); diff --git a/src/backend/x11.c b/src/backend/x11.c index eaa64e0f..b713821e 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -978,6 +978,7 @@ static void MwLLNextEventImpl(MwLL handle) { }; case SelectionNotify: { +#if 0 handle->x11.clipboard_pending = 0; if(ev.xselection.property == handle->x11.xdnd_selection) { @@ -1066,6 +1067,7 @@ static void MwLLNextEventImpl(MwLL handle) { } XDeleteProperty(handle->x11.display, handle->x11.window, handle->x11.selection); } +#endif } break; } if(render) { From cb5efd9224d7e2a2648629276499b7e740f11a7c Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 15:49:01 -0700 Subject: [PATCH 29/62] wayland: got resizing looking good enough --- include/Mw/LowLevel/Wayland.h | 7 ++++ src/backend/wayland/buffer.c | 65 +++++++++++++++++++++++++++++++---- src/backend/wayland/wayland.c | 10 ++---- 3 files changed, 67 insertions(+), 15 deletions(-) diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h index 83cd2999..91234588 100644 --- a/include/Mw/LowLevel/Wayland.h +++ b/include/Mw/LowLevel/Wayland.h @@ -271,6 +271,7 @@ struct _MwLLWaylandShmBuffer { MwU8* buf; MwU8* buf_back; MwU64 buf_size; + MwU64 buf_capacity; int fd; int fd_back; MwBool setup; @@ -466,6 +467,12 @@ void MwLLWaylandBackbufferDestroy(struct _MwLLWayland* handle); void MwLLWaylandBufferSetup(struct _MwLLWaylandShmBuffer* buffer, MwU32 width, MwU32 height); void MwLLWaylandBufferUpdate(MwLL self, struct _MwLLWaylandShmBuffer* buffer); void MwLLWaylandBufferDestroy(struct _MwLLWaylandShmBuffer* buffer); +/* Resize an already set-up shm buffer pair in place, growing the backing pool with + * wl_shm_pool_resize instead of tearing it down and recreating it from scratch. */ +void MwLLWaylandBufferResize(struct _MwLLWaylandShmBuffer* buffer, MwU32 width, MwU32 height); + +void MwLLWaylandFramebufferResize(struct _MwLLWayland* wayland); +void MwLLWaylandBackbufferResize(struct _MwLLWayland* wayland); void MwLLWaylandRegionSetup(MwLL handle); void MwLLWaylandRegionInvalidate(MwLL handle); diff --git a/src/backend/wayland/buffer.c b/src/backend/wayland/buffer.c index 79ce72ca..3b617165 100644 --- a/src/backend/wayland/buffer.c +++ b/src/backend/wayland/buffer.c @@ -7,7 +7,7 @@ void MwLLWaylandFramebufferSetup(struct _MwLLWayland* wayland) { MwLLCairoFrontSetup(&wayland->cairo, wayland->framebuffer.buf_back, wayland->ww, wayland->wh); - memset(wayland->framebuffer.buf_back, 0, wayland->framebuffer.buf_size); + memset(wayland->framebuffer.buf_back, 255, wayland->framebuffer.buf_size); if(wayland->configured) wl_surface_attach(wayland->framebuffer.surface, wayland->framebuffer.shm_buffer, 0, 0); if(wayland->framebuffer.fifo) @@ -38,7 +38,7 @@ void MwLLWaylandBackbufferSetup(struct _MwLLWayland* wayland) { MwLLCairoBackSetup(&wayland->cairo, wayland->backbuffer.buf_back, w, h); - memset(wayland->backbuffer.buf_back, 255, wayland->backbuffer.buf_size); + memset(wayland->backbuffer.buf_back, 0, wayland->backbuffer.buf_size); if(wayland->configured) wl_surface_attach(wayland->backbuffer.surface, wayland->backbuffer.shm_buffer, 0, 0); // if(wayland->framebuffer.fifo) @@ -90,6 +90,8 @@ void MwLLWaylandBufferSetup(struct _MwLLWaylandShmBuffer* buffer, MwU32 width, M buffer->buf = mmap(NULL, buffer->buf_size, PROT_WRITE, MAP_SHARED, buffer->fd, 0); buffer->buf_back = mmap(NULL, buffer->buf_size, PROT_WRITE, MAP_SHARED, buffer->fd_back, 0); + buffer->buf_capacity = buffer->buf_size; + fsync(buffer->fd); fsync(buffer->fd_back); @@ -108,8 +110,8 @@ void MwLLWaylandBufferDestroy(struct _MwLLWaylandShmBuffer* buffer) { if(!buffer->setup) { return; } - if(buffer->buf) munmap(buffer->buf, buffer->buf_size); - if(buffer->buf_back) munmap(buffer->buf_back, buffer->buf_size); + if(buffer->buf) munmap(buffer->buf, buffer->buf_capacity); + if(buffer->buf_back) munmap(buffer->buf_back, buffer->buf_capacity); if(buffer->shm_buffer) wl_buffer_destroy(buffer->shm_buffer); if(buffer->shm_buffer_back) wl_buffer_destroy(buffer->shm_buffer_back); if(buffer->shm_pool) wl_shm_pool_destroy(buffer->shm_pool); @@ -119,14 +121,63 @@ void MwLLWaylandBufferDestroy(struct _MwLLWaylandShmBuffer* buffer) { buffer->setup = MwFALSE; } +void MwLLWaylandBufferResize(struct _MwLLWaylandShmBuffer* buffer, MwU32 width, MwU32 height) { + MwLLWaylandBufferDestroy(buffer); + MwLLWaylandBufferSetup(buffer, width, height); + memset(buffer->buf_back, 0, buffer->buf_size); + memset(buffer->buf, 0, buffer->buf_size); +} + +void MwLLWaylandFramebufferResize(struct _MwLLWayland* wayland) { + MwLLWaylandBufferResize(&wayland->framebuffer, wayland->ww, wayland->wh); + + MwLLCairoFrontDestroy(&wayland->cairo); + MwLLCairoFrontSetup(&wayland->cairo, wayland->framebuffer.buf_back, wayland->ww, wayland->wh); + + if(wayland->configured) + wl_surface_attach(wayland->framebuffer.surface, wayland->framebuffer.shm_buffer, 0, 0); + if(wayland->framebuffer.fifo) + wp_fifo_v1_set_barrier(wayland->framebuffer.fifo); + + wl_surface_commit(wayland->framebuffer.surface); + + MwLLWaylandHangUntilConfigured((MwLL)wayland); + MwLLWaylandBufferUpdate((MwLL)wayland, &wayland->framebuffer); +} + +void MwLLWaylandBackbufferResize(struct _MwLLWayland* wayland) { + MwU32 w = wayland->ww; + MwU32 h = wayland->wh; + + if(wayland->type != MwLL_WAYLAND_TOPLEVEL) { + return; + } + + if(!wayland->has_decorations && wayland->do_csd) { + w += (CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT); + h += (CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM); + } + + MwLLWaylandBufferResize(&wayland->backbuffer, w, h); + + MwLLCairoBackDestroy(&wayland->cairo); + MwLLCairoBackSetup(&wayland->cairo, wayland->backbuffer.buf_back, w, h); + + if(wayland->configured) + wl_surface_attach(wayland->backbuffer.surface, wayland->backbuffer.shm_buffer, 0, 0); + wl_surface_commit(wayland->backbuffer.surface); + MwLLWaylandHangUntilConfigured((MwLL)wayland); + MwLLWaylandBufferUpdate((MwLL)wayland, &wayland->backbuffer); +} + void MwLLWaylandBufferUpdate(MwLL self, struct _MwLLWaylandShmBuffer* buffer) { if(self->wayland.configured) { memcpy(buffer->buf, buffer->buf_back, buffer->buf_size); if(buffer->surface) { // Yes this is needed every time, it's how we fix weston. - if(self->wayland.configured) { - wl_surface_attach(buffer->surface, buffer->shm_buffer, 0, 0); - } + // if(self->wayland.configured) { + // wl_surface_attach(buffer->surface, buffer->shm_buffer, 0, 0); + // } if(buffer->fifo) wp_fifo_v1_wait_barrier(buffer->fifo); wl_surface_commit(buffer->surface); diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index a0645e79..650e949d 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -173,10 +173,7 @@ static void xdg_toplevel_configure(void* data, if(self->wayland.resizing == 0) { xdg_surface_set_window_geometry(self->wayland.toplevel->xdg_surface, 0, 0, self->wayland.ww, self->wayland.wh); - MwLLWaylandBackbufferDestroy(&self->wayland); - MwLLWaylandBackbufferSetup(&self->wayland); - MwLLWaylandFramebufferDestroy(&self->wayland); - MwLLWaylandFramebufferSetup(&self->wayland); + MwLLWaylandFramebufferResize(&self->wayland); MwLLWaylandRegionSetup(self); MwLLDispatch(self, resize, NULL); @@ -1112,10 +1109,7 @@ static void actually_set_wh(MwLL handle) { MwLLWaylandRegionSetup(handle); if(handle->wayland.type == MwLL_WAYLAND_SUBLEVEL) recursive_render(handle); - MwLLWaylandFramebufferDestroy(&handle->wayland); - MwLLWaylandFramebufferSetup(&handle->wayland); - MwLLWaylandBackbufferDestroy(&handle->wayland); - MwLLWaylandBackbufferSetup(&handle->wayland); + MwLLWaylandFramebufferResize(&handle->wayland); MwLLDispatch(handle, draw, NULL); } From 58027c095f51bd4f68e45b0bc21a7ed3edb8c747 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 16:51:46 -0700 Subject: [PATCH 30/62] snapshot previous buffer so that we don't have ghosting anymore on rotate (this also makes resizing A Bit better) --- include/Mw/LowLevel/Wayland.h | 2 ++ src/backend/wayland/wayland.c | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h index 91234588..c176ee29 100644 --- a/include/Mw/LowLevel/Wayland.h +++ b/include/Mw/LowLevel/Wayland.h @@ -428,6 +428,8 @@ struct _MwLLWayland { MwBool do_cascading_draw; int cascading_child_num; + cairo_surface_t* snapshot; + MwBool dispatching_resize; struct _MwLLWaylandShmBuffer framebuffer; diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index 650e949d..24c6a1b3 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -939,6 +939,13 @@ static void draw_children(MwLL handle) { cairo_reset_clip(handle->wayland.cairo.front_cairo_back); + if(handle->wayland.snapshot) { + cairo_set_operator(handle->wayland.cairo.front_cairo_back, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface(handle->wayland.cairo.front_cairo_back, handle->wayland.snapshot, 0, 0); + cairo_paint(handle->wayland.cairo.front_cairo_back); + cairo_set_operator(handle->wayland.cairo.front_cairo_back, CAIRO_OPERATOR_OVER); + } + MwLLWaylandChildrenIterate(handle, draw_child); if(handle->wayland.configured) MwLLWaylandBufferUpdate(handle, &handle->wayland.framebuffer); @@ -1299,6 +1306,21 @@ static void MwLLEndDrawImpl(MwLL handle) { } root->wayland.do_cascading_draw = MwTRUE; + if(handle->wayland.snapshot) { + cairo_surface_destroy(handle->wayland.snapshot); + handle->wayland.snapshot = NULL; + } + if(handle->wayland.ww > 0 && handle->wayland.wh > 0) { + cairo_t* snap_cr; + + handle->wayland.snapshot = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, handle->wayland.ww, handle->wayland.wh); + snap_cr = cairo_create(handle->wayland.snapshot); + cairo_set_operator(snap_cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface(snap_cr, handle->wayland.cairo.front_cs_back, 0, 0); + cairo_paint(snap_cr); + cairo_destroy(snap_cr); + } + if(handle->wayland.configured) { if(handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) { MwLLWaylandBufferUpdate(handle, &handle->wayland.backbuffer); From e43a5291f5d3ddb154e5e583b84e42c78ac97f49 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 16:55:27 -0700 Subject: [PATCH 31/62] combobox fix --- src/backend/wayland/buffer.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backend/wayland/buffer.c b/src/backend/wayland/buffer.c index 3b617165..dec8564f 100644 --- a/src/backend/wayland/buffer.c +++ b/src/backend/wayland/buffer.c @@ -175,9 +175,10 @@ void MwLLWaylandBufferUpdate(MwLL self, struct _MwLLWaylandShmBuffer* buffer) { memcpy(buffer->buf, buffer->buf_back, buffer->buf_size); if(buffer->surface) { // Yes this is needed every time, it's how we fix weston. - // if(self->wayland.configured) { - // wl_surface_attach(buffer->surface, buffer->shm_buffer, 0, 0); - // } + // it's also how we fix comboboxes. + if(self->wayland.configured) { + wl_surface_attach(buffer->surface, buffer->shm_buffer, 0, 0); + } if(buffer->fifo) wp_fifo_v1_wait_barrier(buffer->fifo); wl_surface_commit(buffer->surface); From c2f8fb3f82ab64d24eba5f8772dd20b425153218 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Mon, 21 Sep 2026 17:22:15 -0700 Subject: [PATCH 32/62] wayland: actual subsurface type for the one widget that needs it (vulkan) --- CMakeLists.txt | 2 +- examples/vkdemos/vulkan.c | 4 +- include/Mw/LowLevel/Wayland.h | 11 +++++ src/backend/wayland/interfaces.c | 15 +++---- src/backend/wayland/wayland.c | 69 ++++++++++++++++++++++++++++++++ src/widget/vulkan.c | 12 +++++- 6 files changed, 100 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f5bb7805..21746498 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -467,7 +467,7 @@ if(MW_BUILD_VULKAN) ) endif() - check_include_files(vulkan/VULKAN.h HAS_VK_HEADER) + check_include_files(vulkan/vulkan.h HAS_VK_HEADER) if(HAS_VK_HEADER) target_compile_definitions( Mw diff --git a/examples/vkdemos/vulkan.c b/examples/vkdemos/vulkan.c index 9060a970..60154152 100644 --- a/examples/vkdemos/vulkan.c +++ b/examples/vkdemos/vulkan.c @@ -257,8 +257,8 @@ void vulkan_setup(MwWidget handle) { swapchainCreateInfo.imageExtent = (VkExtent2D){.width = ow, .height = oh}, swapchainCreateInfo.imageArrayLayers = 1, swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | - VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_SAMPLED_BIT; + VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_SAMPLED_BIT; // th is how we specify no transformation. swapchainCreateInfo.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h index c176ee29..607ff2ca 100644 --- a/include/Mw/LowLevel/Wayland.h +++ b/include/Mw/LowLevel/Wayland.h @@ -257,6 +257,14 @@ struct _MwLLWaylandLayerSurface { struct zwlr_layer_surface_v1* surface; }; +struct _MwLLWaylandSubsurface { + MwLL parent; + + struct xdg_surface* xdg_surface; + struct wl_subsurface* subsurface; + struct wl_subcompositor* subcompositor; +}; + /* Shared set of anything needed for a shm buffer. */ struct _MwLLWaylandShmBuffer { struct wl_shm* shm; @@ -283,6 +291,7 @@ enum _MwLLWaylandType { MwLL_WAYLAND_SUBLEVEL, MwLL_WAYLAND_POPUP, MwLL_WAYLAND_LAYER_SURFACE, + MwLL_WAYLAND_SUBSURFACE, }; typedef struct wl_clipboard_device_context { @@ -315,6 +324,8 @@ struct _MwLLWayland { struct _MwLLWaylandPopup* popup; /* Pointer for data that's only loaded if the widget is a layer surface */ struct _MwLLWaylandLayerSurface* layer_surface; + /* Pointer for data that's only loaded if the widget is a subsurface */ + struct _MwLLWaylandSubsurface* subsurface; }; enum _MwLLWaylandType type; diff --git a/src/backend/wayland/interfaces.c b/src/backend/wayland/interfaces.c index 31a8219d..4aebb619 100644 --- a/src/backend/wayland/interfaces.c +++ b/src/backend/wayland/interfaces.c @@ -1350,6 +1350,8 @@ static wayland_protocol_t* wl_subcompositor_setup(MwU32 name, struct _MwLLWaylan (void)version; if(wayland->type == MwLL_WAYLAND_TOPLEVEL) { wayland->toplevel->scompositor = wl_registry_bind(wayland->registry, name, &wl_subcompositor_interface, 1); + } else if(wayland->type == MwLL_WAYLAND_SUBSURFACE) { + wayland->subsurface->subcompositor = wl_registry_bind(wayland->registry, name, &wl_subcompositor_interface, 1); } return NULL; @@ -1360,6 +1362,9 @@ static void wl_subcompositor_interface_destroy(struct _MwLLWayland* wayland, way if(wayland->type == MwLL_WAYLAND_TOPLEVEL) { wl_subcompositor_destroy(wayland->toplevel->scompositor); } + if(wayland->type == MwLL_WAYLAND_SUBSURFACE) { + wl_subcompositor_destroy(wayland->subsurface->subcompositor); + } } /* xdg_wm_base setup function */ @@ -1500,19 +1505,11 @@ void MwLLWaylandSetupCallbacks(struct _MwLLWayland* wayland) { WL_INTERFACE(zwp_relative_pointer_manager_v1); WL_INTERFACE(xdg_wm_base); WL_INTERFACE(zwlr_layer_shell_v1); /* Only used for layer surface, but we use it always if it's turned into a tool window */ + WL_INTERFACE(wl_subcompositor); if(wayland->type == MwLL_WAYLAND_TOPLEVEL) { WL_INTERFACE(zxdg_decoration_manager_v1); WL_INTERFACE(xdg_toplevel_icon_manager_v1); - WL_INTERFACE(wl_subcompositor); - WL_INTERFACE(wl_seat); WL_INTERFACE(wp_fifo_manager_v1); - } else if(wayland->type == MwLL_WAYLAND_POPUP) { - WL_INTERFACE(wl_seat); - } else if(wayland->type == MwLL_WAYLAND_LAYER_SURFACE) { - WL_INTERFACE(wl_subcompositor); - WL_INTERFACE(wl_seat); - } else { - WL_INTERFACE(wl_subcompositor); } #undef WL_INTERFACE } diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index 24c6a1b3..67429f20 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -366,6 +366,8 @@ static void setup_sublevel(MwLL parent, MwLL r, int x, int y) { r->wayland.sublevel->xdg_surface = parent->wayland.toplevel->xdg_surface; } else if(parent->wayland.type == MwLL_WAYLAND_SUBLEVEL) { r->wayland.sublevel->xdg_surface = parent->wayland.sublevel->xdg_surface; + } else if(parent->wayland.type == MwLL_WAYLAND_SUBSURFACE) { + r->wayland.sublevel->xdg_surface = parent->wayland.subsurface->xdg_surface; } else if(parent->wayland.type == MwLL_WAYLAND_POPUP) { r->wayland.sublevel->xdg_surface = parent->wayland.popup->xdg_surface; } @@ -396,6 +398,66 @@ static void destroy_sublevel(MwLL r) { r->wayland.configured = MwFALSE; } +/* Subsurface setup function */ +static void setup_subsurface(MwLL parent, MwLL r, int x, int y) { + struct wl_compositor* compositor = parent->wayland.compositor; + struct wl_surface* parent_surface = parent->wayland.framebuffer.surface; + + r->wayland.subsurface = malloc(sizeof(struct _MwLLWaylandSubsurface)); + r->wayland.subsurface->parent = parent; + + r->wayland.type = MwLL_WAYLAND_SUBSURFACE; + + r->wayland.display = parent->wayland.display; + + MwLLWaylandSetupCallbacks(&r->wayland); + + r->wayland.registry = wl_display_get_registry(parent->wayland.display); + r->wayland.display = parent->wayland.display; + + if(parent->wayland.type == MwLL_WAYLAND_TOPLEVEL) { + r->wayland.subsurface->xdg_surface = parent->wayland.toplevel->xdg_surface; + } else { + r->wayland.subsurface->xdg_surface = parent->wayland.subsurface->xdg_surface; + } + + wl_registry_add_listener(r->wayland.registry, &r->wayland.registry_listener, r); + if(wl_display_roundtrip(r->wayland.display) == -1) { + printf("roundtrip failed: %d\n", wl_display_get_error(r->wayland.display)); + raise(SIGTRAP); + return; + } + + r->wayland.framebuffer.surface = wl_compositor_create_surface(compositor); + + r->wayland.subsurface->subsurface = wl_subcompositor_get_subsurface(r->wayland.subsurface->subcompositor, r->wayland.framebuffer.surface, parent_surface); + + wl_subsurface_set_desync(r->wayland.subsurface->subsurface); + wl_subsurface_set_position(r->wayland.subsurface->subsurface, x, y); + + if(parent) { + wl_subsurface_place_above(r->wayland.subsurface->subsurface, parent->wayland.framebuffer.surface); + } + + r->wayland.xkb_keymap = parent->wayland.xkb_keymap; + r->wayland.xkb_state = parent->wayland.xkb_state; + + r->wayland.configured = MwTRUE; + + MwLLWaylandFramebufferSetup(&r->wayland); + MwLLWaylandBackbufferSetup(&r->wayland); +} + +/* Subsurface setup function */ +static void destroy_subsurface(MwLL r) { + MwLLWaylandBackbufferDestroy(&r->wayland); + MwLLWaylandFramebufferDestroy(&r->wayland); + + free(r->wayland.sublevel); + + r->wayland.configured = MwFALSE; +} + static void popup_configure(void* data, struct xdg_popup* xdg_popup, int32_t x, @@ -830,6 +892,7 @@ static void widget_setup(MwLL r, MwLL parent, int x, int y, int width, int heigh r->wayland.parent = parent; r->wayland.valid = MwTRUE; + printf("type %d\n", ty); if(ty == MwLL_WAYLAND_UNKNOWN) { if(parent == NULL) { setup_toplevel(r, x, y); @@ -862,6 +925,9 @@ static void widget_setup(MwLL r, MwLL parent, int x, int y, int width, int heigh case MwLL_WAYLAND_LAYER_SURFACE: setup_layer_surface(r, x, y, width, height); break; + case MwLL_WAYLAND_SUBSURFACE: + setup_subsurface(parent, r, x, y); + break; } } @@ -1086,6 +1152,9 @@ static void MwLLSetXYImpl(MwLL handle, int x, int y) { break; case MwLL_WAYLAND_UNKNOWN: break; + case MwLL_WAYLAND_SUBSURFACE: + wl_subsurface_set_position(handle->wayland.subsurface->subsurface, x, y); + break; } MwLLWaylandRegionSetup(handle); diff --git a/src/widget/vulkan.c b/src/widget/vulkan.c index acffda3a..0bc0703d 100644 --- a/src/widget/vulkan.c +++ b/src/widget/vulkan.c @@ -351,13 +351,22 @@ static int vulkan_surface_setup(MwWidget handle, vulkan_t* o) { if(handle->lowlevel->common.type == MwLLBackendWayland) { LOAD_VK_FUNCTION(vkCreateWaylandSurfaceKHR); - VkWaylandSurfaceCreateInfoKHR createInfo = { + VkWaylandSurfaceCreateInfoKHR createInfo; + + /* transition to a subsurface */ + MwLLBeginStateChange(handle->lowlevel); + handle->lowlevel->wayland.changing = MwTRUE; + handle->lowlevel->wayland.type_to_be = MwLL_WAYLAND_SUBSURFACE; + MwLLEndStateChange(handle->lowlevel); + + createInfo = (VkWaylandSurfaceCreateInfoKHR){ .sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, .pNext = NULL, .flags = 0, .display = handle->lowlevel->wayland.display, .surface = handle->lowlevel->wayland.framebuffer.surface, }; + VK_CMD(_vkCreateWaylandSurfaceKHR(o->vkInstance, &createInfo, NULL, &o->vkSurface)); } #endif @@ -609,6 +618,7 @@ void MwVulkanConfigure(MwVulkanConfig* cfg) { } int MwVulkanSupported(void) { + printf("[vulkan support not copmiled]\n"); return 0; } #endif From 960db8d3e35ceefe6365266e17541f8a4c8ae884 Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 10:13:08 +0900 Subject: [PATCH 33/62] some fix --- examples/basic/clipboard.c | 1 - examples/basic/dnd.c | 3 +-- examples/vkdemos/vulkan.c | 4 ++-- src/core.c | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/basic/clipboard.c b/examples/basic/clipboard.c index 9d060c31..6c4a46e4 100644 --- a/examples/basic/clipboard.c +++ b/examples/basic/clipboard.c @@ -45,7 +45,6 @@ static void MWAPI tick(MwWidget handle, void* user_data, void* call_data) { MwGetClipboard(handle, MwCLIPBOARD_MAIN); cur_text = text2; MwGetClipboard(handle, MwCLIPBOARD_PRIMARY); - MwForceRender(window); } int main() { diff --git a/examples/basic/dnd.c b/examples/basic/dnd.c index 56e1c8e3..0ce9aeff 100644 --- a/examples/basic/dnd.c +++ b/examples/basic/dnd.c @@ -44,11 +44,10 @@ int main() { NULL); text_listbox = MwVaCreateWidget(MwListBoxClass, "label", box, 25, 150, 750, 700, MwNtext, "", - MwNacceptsDnD, 1, NULL); MwAddUserHandler(window, MwNresizeHandler, resize, NULL); - MwAddUserHandler(window, MwNdragAndDropHandler, dnd, NULL); + MwAddUserHandler(instructions, MwNdragAndDropHandler, dnd, NULL); resize(window, NULL, NULL); diff --git a/examples/vkdemos/vulkan.c b/examples/vkdemos/vulkan.c index 60154152..9060a970 100644 --- a/examples/vkdemos/vulkan.c +++ b/examples/vkdemos/vulkan.c @@ -257,8 +257,8 @@ void vulkan_setup(MwWidget handle) { swapchainCreateInfo.imageExtent = (VkExtent2D){.width = ow, .height = oh}, swapchainCreateInfo.imageArrayLayers = 1, swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | - VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_SAMPLED_BIT; + VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_SAMPLED_BIT; // th is how we specify no transformation. swapchainCreateInfo.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; diff --git a/src/core.c b/src/core.c index 7bc70651..0a5fd8bb 100644 --- a/src/core.c +++ b/src/core.c @@ -679,7 +679,7 @@ void MwSetInteger(MwWidget handle, const char* key, int n) { if(h->lowlevel != NULL) MwLLSetDarkTheme(h->lowlevel, n); } - if(strcmp(key, MwNacceptsDnD) == 0) { + if(strcmp(key, MwNacceptsDnD) == 0 && n) { if(handle->lowlevel != NULL) MwLLSetupDragAndDrop(handle->lowlevel); } } From ee3bf43399aab8acdbc71854f1d873c5cd545512 Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 10:27:37 +0900 Subject: [PATCH 34/62] fix --- NTMakefile | 4 ++-- WatMakefile | 16 +--------------- tools/genmk.pl | 7 ++----- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/NTMakefile b/NTMakefile index 03839743..6712a8b2 100644 --- a/NTMakefile +++ b/NTMakefile @@ -1,8 +1,8 @@ CC = cl /TC /c /nologo LD = link /nologo -!if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] diff --git a/WatMakefile b/WatMakefile index 07029477..04a48b8e 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,20 +1,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -!if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] -!endif -!else -!if [echo DX9_FLAGS =>d3d9flags.mk] -!endif -!endif -!if exist("d3d9flags.mk") -!include "d3d9flags.mk" -!else -DX9_FLAGS = -!endif - -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX9_FLAGS) +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt @@ -121,7 +108,6 @@ clean: .SYMBOLIC %erase src/widget/window.obj %erase src/Mw.dll %erase src/Mw.lib - %erase d3d9flags.mk %erase examples/basic/box.obj %erase examples/basic/calculator.obj %erase examples/basic/checkbox.obj diff --git a/tools/genmk.pl b/tools/genmk.pl index e8c76959..ee4822ab 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -44,8 +44,8 @@ sub cobjs { sub d3d9_detect_block { return <<'EOF'; -!if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] @@ -131,9 +131,6 @@ sub generate { $prefobj = "file "; $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - - $d3d9_flags = "\$(DX9_FLAGS)"; - $d3d9_block = d3d9_detect_block(); } open(OUT, ">", $output); From 096177f75f727f5820b67977ef8ac5252b5ff34e Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 10:57:31 +0900 Subject: [PATCH 35/62] fix watcom --- WatMakefile | 16 +++++++++++---- include/Mw/Widget/Direct3D9.h | 3 +++ src/widget/direct3d9.c | 6 +++++- tools/genmk.pl | 38 ++++++++++++++++++++++++++++++++--- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/WatMakefile b/WatMakefile index 04a48b8e..8873675a 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,13 +1,13 @@ -CC = wcc386 -bt=nt -q +CC = wcc386 -bt=nt -q -fr LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECT3D9 MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt -all: src/Mw.dll examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe +all: src/Mw.dll examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/dxdemos/direct3d9.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe lib: src/Mw.dll -examples: examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe +examples: examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/dxdemos/direct3d9.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe clean: .SYMBOLIC %erase external/libz/src/adler32.obj %erase external/libz/src/compress.obj @@ -131,6 +131,7 @@ clean: .SYMBOLIC %erase examples/basic/tab.obj %erase examples/basic/treeview.obj %erase examples/basic/viewport.obj + %erase examples/dxdemos/direct3d9.obj %erase examples/gldemos/boing.obj %erase examples/gldemos/clock.obj %erase examples/gldemos/cube.obj @@ -160,6 +161,7 @@ clean: .SYMBOLIC %erase examples/basic/tab.exe %erase examples/basic/treeview.exe %erase examples/basic/viewport.exe + %erase examples/dxdemos/direct3d9.exe %erase examples/gldemos/boing.exe %erase examples/gldemos/clock.exe %erase examples/gldemos/cube.exe @@ -305,6 +307,12 @@ examples/basic/viewport.exe: examples/basic/viewport.obj src/Mw.dll examples/basic/viewport.obj: examples/basic/viewport.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/basic/viewport.c +examples/dxdemos/direct3d9.exe: examples/dxdemos/direct3d9.obj src/Mw.dll + $(LD) $(EXE_LDFLAGS) name $@ file examples/dxdemos/direct3d9.obj library clib3r.lib library src/Mw.lib + +examples/dxdemos/direct3d9.obj: examples/dxdemos/direct3d9.c + $(CC) $(EXE_CFLAGS) -fo=$@ examples/dxdemos/direct3d9.c + examples/gldemos/boing.exe: examples/gldemos/boing.obj src/Mw.dll $(LD) $(EXE_LDFLAGS) name $@ file examples/gldemos/boing.obj library clib3r.lib library src/Mw.lib library opengl32.lib library glu32.lib diff --git a/include/Mw/Widget/Direct3D9.h b/include/Mw/Widget/Direct3D9.h index b6904d4d..5715c1b0 100644 --- a/include/Mw/Widget/Direct3D9.h +++ b/include/Mw/Widget/Direct3D9.h @@ -25,6 +25,9 @@ #error D3D9 widget only avaliable for Win32 backends #undef MW_DIRECT3D9 #else +#ifdef __WATCOMC__ +#include +#endif #include #endif #endif diff --git a/src/widget/direct3d9.c b/src/widget/direct3d9.c index 41347861..9c151e7f 100644 --- a/src/widget/direct3d9.c +++ b/src/widget/direct3d9.c @@ -4,13 +4,17 @@ #include typedef struct gdid3d9 { void* d3d9dll; - IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); + IDirect3D9*(D3DAPI* Direct3DCreate9)(UINT sdk_version); LPDIRECT3D9 d3d; // the pointer to our Direct3D interface LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class } gdid3d9_t; +#ifndef D3D_SDK_VERSION +#define D3D_SDK_VERSION 32 +#endif + static int wcreate_d3d9(MwWidget handle) { gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); HRESULT hr; diff --git a/tools/genmk.pl b/tools/genmk.pl index ee4822ab..ba5d40d7 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -59,6 +59,17 @@ DX9_FLAGS = EOF } +sub skip_d3d9 { + my $f = $_[0]; + my $type = $_[1]; + + if (($f =~ /\/dxdemos\//) and not($type eq "Watcom")) { + return 1; + } + + return 0; +} + sub generate { my ($output, $type) = @_; @@ -82,8 +93,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; - my $d3d9_flags = ""; - my $d3d9_block = ""; + my $d3d9_flags = ""; + my $d3d9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -112,7 +123,7 @@ sub generate { $d3d9_block = d3d9_detect_block(); } elsif ($type eq "Watcom") { - $cc = "wcc386 -bt=nt -q"; + $cc = "wcc386 -bt=nt -q -fr"; $link = "wlink option quiet"; $out = "-fo="; $dllout = "name "; @@ -131,6 +142,8 @@ sub generate { $prefobj = "file "; $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; + + $d3d9_flags = "${def}MW_DIRECT3D9"; } open(OUT, ">", $output); @@ -154,6 +167,9 @@ sub generate { } print(OUT "all: src${dir}Mw.dll"); foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -163,6 +179,9 @@ sub generate { print(OUT "lib: src${dir}Mw.dll\n"); print(OUT "examples:"); foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -171,6 +190,9 @@ sub generate { print(OUT "\n"); print(OUT "clean: $symbolic\n"); foreach my $f (@cfiles) { + if (skip_d3d9($f, $type)) { + next; + } my $b = $f; $b =~ s/\.c$/.obj/; $b =~ s/\//$dir/g; @@ -182,12 +204,18 @@ sub generate { print(OUT " $del d3d9flags.mk\n"); } foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } my $b = $f; $b =~ s/\.c$/.obj/; $b =~ s/\//$dir/g; print(OUT " $del $b\n"); } foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -195,6 +223,9 @@ sub generate { } print(OUT "\n"); foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } my $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -256,6 +287,7 @@ push(@cfiles, "src/backend/gdi.c"); scan_examples("examples/basic"); scan_examples("examples/gldemos"); +scan_examples("examples/dxdemos"); @examples = sort(@examples); From c06fcdc968ebcf966dffa90b9f55efeeca70afdc Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 11:00:33 +0900 Subject: [PATCH 36/62] o --- Jenkinsfile | 4 ++-- src/widget/direct3d9.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c506028d..593d08fc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -42,7 +42,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=i686-w64-mingw32") + sh("./configure --enable-opengl --cross --target=Windows --host=i686-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw32.dll") sh("mv src/libMw.dll.a libMw32.dll.a") @@ -55,7 +55,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=x86_64-w64-mingw32") + sh("./configure --enable-opengl --cross --target=Windows --host=x86_64-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw64.dll") sh("mv src/libMw.dll.a libMw64.dll.a") diff --git a/src/widget/direct3d9.c b/src/widget/direct3d9.c index 9c151e7f..5d8a9349 100644 --- a/src/widget/direct3d9.c +++ b/src/widget/direct3d9.c @@ -4,7 +4,7 @@ #include typedef struct gdid3d9 { void* d3d9dll; - IDirect3D9*(D3DAPI* Direct3DCreate9)(UINT sdk_version); + IDirect3D9*(WINAPI* Direct3DCreate9)(UINT sdk_version); LPDIRECT3D9 d3d; // the pointer to our Direct3D interface LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class From 371de5ab32702bfc1d9225fe6bfc13c06a5e9579 Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 11:06:13 +0900 Subject: [PATCH 37/62] ok --- NTMakefile | 2 +- configure | 2 +- tools/genmk.pl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NTMakefile b/NTMakefile index 6712a8b2..a0bc3d79 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,7 +2,7 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] diff --git a/configure b/configure index 025b2656..f84b1ea5 100755 --- a/configure +++ b/configure @@ -246,7 +246,7 @@ print(OUT " clang-format --verbose -i `find tools src include examples \"(\" -name \"*.c\" -or -name \"*.cc\" -or -name \"*.h\" -or -name \"*.m\" \")\" -and -not -name \"*ttf.c\"`\n" ); print(OUT -" perltidy -b -bext=\"/\" --paren-tightness=2 `find tools pl configure -name \"*.pl\"`\n" +" perltidy -b -bext=\"/\" --paren-tightness=2 `find tools pl -name \"*.pl\"` configure\n" ); print(OUT "\n"); print(OUT "lib:"); diff --git a/tools/genmk.pl b/tools/genmk.pl index ba5d40d7..b7993e39 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -45,7 +45,7 @@ sub cobjs { sub d3d9_detect_block { return <<'EOF'; !if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] From 630d8d68656d59efcb764f50566f0dce8535f8be Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 11:09:11 +0900 Subject: [PATCH 38/62] ok --- NTMakefile | 2 +- tools/genmk.pl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NTMakefile b/NTMakefile index a0bc3d79..18fbbda7 100644 --- a/NTMakefile +++ b/NTMakefile @@ -1,7 +1,7 @@ CC = cl /TC /c /nologo LD = link /nologo -!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [where /R "%DXSDK_DIR%\\Include" /Q d3d9.h] == 0 !if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else diff --git a/tools/genmk.pl b/tools/genmk.pl index b7993e39..bc97e84c 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -44,7 +44,7 @@ sub cobjs { sub d3d9_detect_block { return <<'EOF'; -!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [where /R "%DXSDK_DIR%\\Include" /Q d3d9.h] == 0 !if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else From bc326491b5d105cef5165a580013648c4565d78a Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 20:58:41 -0700 Subject: [PATCH 39/62] dx9 --- CMakeLists.txt | 23 +++ Jenkinsfile | 8 +- NTMakefile | 21 ++- WatMakefile | 9 +- configure | 8 +- examples/CMakeLists.txt | 9 +- examples/dxdemos/CMakeLists.txt | 24 +++ examples/dxdemos/directx9.c | 93 +++++++++ include/Mw/Widget/DirectX.h | 53 ++++++ pl/rules.pl | 8 + resource/FindDirectX.cmake | 325 ++++++++++++++++++++++++++++++++ src/widget/directx.c | 96 ++++++++++ tools/genmk.pl | 36 +++- 13 files changed, 698 insertions(+), 15 deletions(-) create mode 100644 examples/dxdemos/CMakeLists.txt create mode 100644 examples/dxdemos/directx9.c create mode 100644 include/Mw/Widget/DirectX.h create mode 100644 resource/FindDirectX.cmake create mode 100644 src/widget/directx.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 21746498..046f08c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,10 @@ else() option(MW_TRY_OPENGL "Try to compile OpenGL widget or not" ON) option(MW_TRY_VULKAN "Try to compile Vulkan widget or not" ON) endif() +if(${CMAKE_SYSTEM_NAME} MATCHES Windows) + option(MW_TRY_DIRECTX "Try to compile DirectX widget or not" ON) +endif() + option(MW_INSTALL_HEADERS "Install headers" ON) @@ -90,6 +94,16 @@ if(MW_TRY_VULKAN) endif() endif() +if(MW_TRY_DIRECTX) + include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) + if(DIRECTX_FOUND) + set(MW_BUILD_DIRECTX ON) + message(STATUS "DirectX widget has been enabled") + else() + message(STATUS "DirectX widget has been disabled") + endif() +endif() + if(MW_BUILD_STATIC) message(STATUS "Building Milsko as a static library") add_library( @@ -477,6 +491,15 @@ if(MW_BUILD_VULKAN) endif() endif() +if(MW_BUILD_DIRECTX) + list(APPEND LIBRARIES ${DIRECTX_D3DX9_LIBRARIES}) + target_compile_definitions( + Mw + PRIVATE + MW_DIRECTX + ) +endif() + target_compile_definitions( Mw PRIVATE diff --git a/Jenkinsfile b/Jenkinsfile index 9b7d6397..6d93874c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-vulkan --without-vulkan-string-helper") + sh("./configure --enable-opengl --enable-directx --enable-vulkan --without-vulkan-string-helper") sh("make -j4") sh("mv src/libMw.so libMw64.so") archiveArtifacts("libMw64.so") @@ -42,7 +42,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --cross --target=Windows --host=i686-w64-mingw32") + sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=i686-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw32.dll") sh("mv src/libMw.dll.a libMw32.dll.a") @@ -55,7 +55,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --cross --target=Windows --host=x86_64-w64-mingw32") + sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=x86_64-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw64.dll") sh("mv src/libMw.dll.a libMw64.dll.a") @@ -80,7 +80,7 @@ pipeline { } environment { WATCOM = "/usr/watcom" - INCLUDE = "/usr/watcom/h:/usr/watcom/h/nt" + INCLUDE = "/usr/watcom/h:/usr/watcom/h/nt:/usr/watcom/h/nt/directx" PATH = "/usr/watcom/binl64:${env.PATH}" } steps { diff --git a/NTMakefile b/NTMakefile index b07f798a..37b4a950 100644 --- a/NTMakefile +++ b/NTMakefile @@ -1,7 +1,20 @@ CC = cl /TC /c /nologo LD = link /nologo -MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL +!if [where d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!endif +!else +!if [echo DX9_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx9flags.mk") +!include "dx9flags.mk" +!else +DX9_FLAGS = +!endif + +MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX9_FLAGS) MW_LDFLAGS = /DLL EXE_CFLAGS = /Iinclude EXE_LDFLAGS = @@ -86,6 +99,7 @@ clean: del /f /q src\widget\checkbox.obj del /f /q src\widget\clock.obj del /f /q src\widget\combobox.obj + del /f /q src\widget\directx.obj del /f /q src\widget\document.obj del /f /q src\widget\entry.obj del /f /q src\widget\frame.obj @@ -108,6 +122,7 @@ clean: del /f /q src\widget\window.obj del /f /q src\Mw.dll del /f /q src\Mw.lib + del /f /q dx9flags.mk del /f /q examples\basic\box.obj del /f /q examples\basic\calculator.obj del /f /q examples\basic\checkbox.obj @@ -342,8 +357,8 @@ examples\gldemos\tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) /Fo$@ examples/gldemos/tripaint.c -src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj - $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib +src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj + $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib .c.obj: diff --git a/WatMakefile b/WatMakefile index fd980790..09a942d0 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,7 +1,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt @@ -85,6 +85,7 @@ clean: .SYMBOLIC %erase src/widget/checkbox.obj %erase src/widget/clock.obj %erase src/widget/combobox.obj + %erase src/widget/directx.obj %erase src/widget/document.obj %erase src/widget/entry.obj %erase src/widget/frame.obj @@ -341,8 +342,8 @@ examples/gldemos/tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/gldemos/tripaint.c -src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj - $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib +src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/directx.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj + $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/directx.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib @@ -498,6 +499,8 @@ src/widget/clock.obj: src/widget/clock.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/clock.c src/widget/combobox.obj: src/widget/combobox.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/combobox.c +src/widget/directx.obj: src/widget/directx.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/directx.c src/widget/document.obj: src/widget/document.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/document.c src/widget/entry.obj: src/widget/entry.c diff --git a/configure b/configure index 44db66d8..f6ff13bc 100755 --- a/configure +++ b/configure @@ -54,6 +54,9 @@ param_set("examples", 1); # (option that only makes sense on x11) param_set("allow-sloppy-focus", 0); +# (option that only makes sense on Windows) +param_set("directx", 0); + my %features = ( "classic-theme" => "use classic theme", "stb-image" => "use stb_image, instead use libjpeg/libpng", @@ -69,7 +72,8 @@ my %features = ( "wayland" => "enable wayland backend", "gnustep" => "use gnustep", "dbus" => "use DBus on supported platform", - "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus" + "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus", + "directx" => "(Windows only) build DirectX widget" ); my @features_keys = ( "1classic-theme", "1stb-image", @@ -78,7 +82,7 @@ my @features_keys = ( "1vulkan", "2vulkan-string-helper", "1shared", "1static", "1wayland", "1gnustep", - "1dbus" + "1dbus", "1directx" ); sub def_platform { diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5baed4a8..4ac6962b 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,12 @@ add_subdirectory(basic) if(${MW_TRY_OPENGL}) -add_subdirectory(gldemos) + add_subdirectory(gldemos) endif() if(${MW_TRY_VULKAN}) -add_subdirectory(vkdemos) + add_subdirectory(vkdemos) +endif() +if(WIN32) + if(${MW_TRY_DIRECTX}) + add_subdirectory(dxdemos) + endif() endif() diff --git a/examples/dxdemos/CMakeLists.txt b/examples/dxdemos/CMakeLists.txt new file mode 100644 index 00000000..38265e1c --- /dev/null +++ b/examples/dxdemos/CMakeLists.txt @@ -0,0 +1,24 @@ +file( + GLOB + EXAMPLES_DIRECTX_SOURCES + *.c +) +include(${CMAKE_CURRENT_SOURCE_DIR}/../../resource/FindDirectX.cmake) + +if(${DIRECTX_FOUND}) + foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) + get_filename_component(TARGET ${PATH} NAME_WE) + add_executable(${TARGET} MACOSX_BUNDLE ${PATH}) + target_include_directories( + ${TARGET} + PRIVATE + ${DIRECTX_INCLUDE_DIRS} + ) + target_link_libraries( + ${TARGET} + PRIVATE + Mw + ${DIRECTX_D3DX9_LIBRARIES} + ) + endforeach() +endif() diff --git a/examples/dxdemos/directx9.c b/examples/dxdemos/directx9.c new file mode 100644 index 00000000..6b28ac02 --- /dev/null +++ b/examples/dxdemos/directx9.c @@ -0,0 +1,93 @@ +/* + * Adapted from: + * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-1 + * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-4 + */ +#include +#include + +MwWidget window, d3d9; +LPDIRECT3D9 d3d; +LPDIRECT3DDEVICE9 d3ddev; +LPDIRECT3DVERTEXBUFFER9 v_buffer; + +struct CUSTOMVERTEX { + FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag + DWORD color; // from the D3DFVF_DIFFUSE flag +}; +#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) + +static void MWAPI draw(MwWidget handle, void* user, void* client) { + // clear the window to a deep blue + d3ddev->lpVtbl->Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); + + d3ddev->lpVtbl->BeginScene(d3ddev); // begins the 3D scene + + // select which vertex format we are using + d3ddev->lpVtbl->SetFVF(d3ddev, CUSTOMFVF); + + // select the vertex buffer to display + d3ddev->lpVtbl->SetStreamSource(d3ddev, 0, v_buffer, 0, sizeof(struct CUSTOMVERTEX)); + + // copy the vertex buffer to the back buffer + d3ddev->lpVtbl->DrawPrimitive(d3ddev, D3DPT_TRIANGLELIST, 0, 1); + + d3ddev->lpVtbl->EndScene(d3ddev); // ends the 3D scene + + d3ddev->lpVtbl->Present(d3ddev, NULL, NULL, NULL, NULL); // displays the created frame +} + +int main() { + MwLibraryInit(); + + window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); + + d3d9 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + + d3d = MwDirectXGetD3D9(d3d9); + d3ddev = MwDirectXGetD3Dev9(d3d9); + + // create three vertices using the CUSTOMVERTEX struct built earlier + struct CUSTOMVERTEX vertices[] = + { + { + 400.0f, + 0.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 0, 255), + }, + { + 800.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 255, 0), + }, + { + 0.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(255, 0, 0), + }, + }; + + d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, + 3 * sizeof(struct CUSTOMVERTEX), + 0, + CUSTOMFVF, + D3DPOOL_MANAGED, + &v_buffer, + NULL); + + VOID* pVoid; // the void pointer + + v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (void**)&pVoid, 0); // lock the vertex buffer + memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer + v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer + + MwAddUserHandler(window, MwNtickHandler, draw, NULL); + + MwLoop(window); +} diff --git a/include/Mw/Widget/DirectX.h b/include/Mw/Widget/DirectX.h new file mode 100644 index 00000000..a81b4aee --- /dev/null +++ b/include/Mw/Widget/DirectX.h @@ -0,0 +1,53 @@ +/*! + * @file Mw/Widget/DirectX.h + * @brief DirectX widget. + * @warning Only avaliable on Windows. + */ +#ifndef __MW_WIDGET_DIRECTX_H__ +#define __MW_WIDGET_DIRECTX_H__ + +#include +#include +#include + +#if !defined(MW_DIRECTX_NO_INCLUDE) + +/* https://github.com/microsoft/Windows-classic-samples/issues/317 */ +#if defined(__MINGW32__) || defined(__MINGW64__) +#define NTDDI_VERSION 0x07000000 +#define _WIN32_WINNT 0x0A00 + +#endif + +#include +#endif + +#ifndef _WIN32 +#error DirectX widget only avaliable for Win32 backends +#endif + +/*! + * @brief D3D9 widget class + */ +MWDECL MwClass MwD3D9Class; + +#ifdef __cplusplus +extern "C" { +#endif + +MwInline LPDIRECT3D9 MwDirectXGetD3D9(MwWidget handle) { + LPDIRECT3D9 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); + return out; +}; +MwInline LPDIRECT3DDEVICE9 MwDirectXGetD3Dev9(MwWidget handle) { + LPDIRECT3DDEVICE9 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); + return out; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/pl/rules.pl b/pl/rules.pl index 7a58a971..3f539eee 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -178,6 +178,7 @@ new_object("src/widget/window.c"); new_object("src/widget/opengl.c"); new_object("src/widget/vulkan.c"); +new_object("src/widget/directx.c"); if (param_get("opengl")) { add_cflags("-DMW_OPENGL"); @@ -185,6 +186,9 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } +if (param_get("directx")) { + add_cflags("-DMW_DIRECTX"); +} new_object("src/dialog/*.c"); @@ -230,4 +234,8 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } +if (param_get("directx")) { + new_example("examples/dxdemos/directx9"); +} + 1; diff --git a/resource/FindDirectX.cmake b/resource/FindDirectX.cmake new file mode 100644 index 00000000..89b96ec0 --- /dev/null +++ b/resource/FindDirectX.cmake @@ -0,0 +1,325 @@ +# - try to find part of DirectX SDK +# +# Cache Variables: (probably not for direct use in your scripts) +# DIRECTX_INCLUDE_DIR +# +# Variables you should use in your CMakeLists.txt: +# DIRECTX_DXGUID_LIBRARY - deprecated, see below +# DIRECTX_DXERR_LIBRARY - deprecated, see http://blogs.msdn.com/b/chuckw/archive/2012/04/24/where-s-dxerr-lib.aspx +# DIRECTX_DINPUT_LIBRARY +# DIRECTX_DINPUT_INCLUDE_DIR +# DIRECTX_D3D9_LIBRARY +# DIRECTX_D3DXOF_LIBRARY +# DIRECTX_D3DX9_LIBRARIES +# DIRECTX_INCLUDE_DIRS +# DIRECTX_FOUND - if this is not true, do not attempt to use this library +# +# Defines these macros: +# find_directx_include - wrapper for find_path that provides PATHS, HINTS, and PATH_SUFFIXES. +# find_directx_library - wrapper for find_library that provides PATHS, HINTS, and PATH_SUFFIXES. +# Requires these CMake modules: +# FindPackageHandleStandardArgs (known included with CMake >=2.6.2) +# SelectLibraryConfigurations +# +# Original Author: +# 2012 Rylie Pavlik +# https://ryliepavlik.com/ +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright 2012, Iowa State University +# +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) +# +# SPDX-License-Identifier: BSL-1.0 + + +set(DIRECTX_ROOT_DIR + "${DIRECTX_ROOT_DIR}" + CACHE + PATH + "Root directory to search for DirectX") + +if(MSVC) + file(TO_CMAKE_PATH "$ENV{ProgramFiles}" _PROG_FILES) + set(_PF86 "ProgramFiles(x86)") + file(TO_CMAKE_PATH "$ENV{${_PF86}}" _PROG_FILES_X86) + if(_PROG_FILES_X86) + set(_PROG_FILES "${_PROG_FILES_X86}") + endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_dx_lib_suffixes lib/x64 lib) + else() + set(_dx_lib_suffixes lib/x86 lib) + endif() + set(DXSDK_DIRS) + + set(_dx_quiet) + if(DirectX_FIND_QUIETLY) + set(_dx_quiet QUIET) + endif() + find_package(WindowsSDK ${_dx_quiet}) + if(WINDOWSSDK_FOUND) + foreach(_dir ${WINDOWSSDK_DIRS}) + get_windowssdk_include_dirs(${_dir} _include_dirs) + if(_include_dirs) + list(APPEND DXSDK_DIRS ${_include_dirs}) + endif() + endforeach() + endif() + + macro(_append_dxsdk_in_inclusive_range _low _high) + if((NOT MSVC_VERSION LESS ${_low}) AND (NOT MSVC_VERSION GREATER ${_high})) + list(APPEND DXSDK_DIRS ${ARGN}) + endif() + endmacro() + _append_dxsdk_in_inclusive_range(1500 1600 "${_PROG_FILES}/Microsoft DirectX SDK (June 2010)") + _append_dxsdk_in_inclusive_range(1400 1600 + "${_PROG_FILES}/Microsoft DirectX SDK (February 2010)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2009)" + "${_PROG_FILES}/Microsoft DirectX SDK (March 2009)" + "${_PROG_FILES}/Microsoft DirectX SDK (November 2008)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2008)" + "${_PROG_FILES}/Microsoft DirectX SDK (June 2008)" + "${_PROG_FILES}/Microsoft DirectX SDK (March 2008)") + _append_dxsdk_in_inclusive_range(1310 1500 + "${_PROG_FILES}/Microsoft DirectX SDK (November 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (June 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (April 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (February 2007)" + "${_PROG_FILES}/Microsoft DirectX SDK (December 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (October 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (August 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (June 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (April 2006)" + "${_PROG_FILES}/Microsoft DirectX SDK (February 2006)") + + file(TO_CMAKE_PATH "$ENV{DXSDK_DIR}" ENV_DXSDK_DIR) + if(ENV_DXSDK_DIR) + list(APPEND DXSDK_DIRS ${ENV_DXSDK_DIR}) + endif() +else() + set(_dx_lib_suffixes lib) + set(DXSDK_DIRS /mingw) +endif() + +find_path(DIRECTX_INCLUDE_DIR + NAMES + dxdiag.h + dinput.h + dxerr8.h + PATHS + ${DXSDK_DIRS} + HINTS + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + include) +find_path(DIRECTX_DINPUT_INCLUDE_DIR + NAMES + dinput.h + PATHS + ${DXSDK_DIRS} + HINTS + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + include) + +set(DXLIB_HINTS) +if(WINDOWSSDK_FOUND AND DIRECTX_INCLUDE_DIR) + get_windowssdk_from_component("${DIRECTX_INCLUDE_DIR}" _winsdk) + if(_winsdk) + get_windowssdk_library_dirs("${_winsdk}" _libdirs) + if(_libdirs) + list(APPEND DXLIB_HINTS ${_libdirs}) + endif() + endif() +endif() + +if(WINDOWSSDK_FOUND AND DIRECTX_DINPUT_INCLUDE_DIR) + get_windowssdk_from_component("${DIRECTX_DINPUT_INCLUDE_DIR}" _winsdk) + if(_winsdk) + get_windowssdk_library_dirs("${_winsdk}" _includes) + if(_includes) + list(APPEND DXLIB_HINTS ${_includes}) + endif() + endif() +endif() + +find_library(DIRECTX_DXGUID_LIBRARY + NAMES + dxguid + PATHS + ${DXLIB_HINTS} + ${DXSDK_DIRS} + HINTS + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +if(DIRECTX_DXGUID_LIBRARY) + get_filename_component(_dxsdk_lib_dir ${DIRECTX_DXGUID_LIBRARY} PATH) + list(APPEND DXLIB_HINTS "${_dxsdk_lib_dir}") +endif() + +find_library(DIRECTX_DINPUT_LIBRARY + NAMES + dinput8 + dinput + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_DXERR_LIBRARY + NAMES + dxerr + dxerr9 + dxerr8 + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3D9_LIBRARY + NAMES + d3d9 + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3DXOF_LIBRARY + NAMES + d3dxof + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3DX9_LIBRARY_RELEASE + NAMES + d3dx9 + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_D3DX9_LIBRARY_DEBUG + NAMES + d3dx9d + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +find_library(DIRECTX_XINPUT_LIBRARY + NAMES + Xinput9_1_0 + Xinput + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) + +include(SelectLibraryConfigurations) +select_library_configurations(DIRECTX_D3DX9) + +set(DIRECTX_EXTRA_CHECK) +if(DIRECTX_INCLUDE_DIR) + if(MSVC80) + set(DXSDK_DEPRECATION_BUILD 1962) + endif() + + if(DXSDK_DEPRECATION_BUILD) + include(CheckCSourceCompiles) + set(_dinput_old_includes ${CMAKE_REQUIRED_INCLUDES}) + set(CMAKE_REQUIRED_INCLUDES "${DIRECTX_INCLUDE_DIR}") + check_c_source_compiles(" + #include + #if _DXSDK_BUILD_MAJOR >= ${DXSDK_DEPRECATION_BUILD} + #error + #else + int main(int argc, char * argv[]) { + return 0; + } + #endif + " + DIRECTX_SDK_SUPPORTS_COMPILER) + set(DIRECTX_EXTRA_CHECK DIRECTX_SDK_SUPPORTS_COMPILER) + set(CMAKE_REQUIRED_INCLUDES "${_dinput_old_includes}") + else() + # Until proven otherwise. + set(DIRECTX_SDK_SUPPORTS_COMPILER TRUE) + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(DirectX + DEFAULT_MSG + DIRECTX_DXGUID_LIBRARY + DIRECTX_DINPUT_LIBRARY + DIRECTX_INCLUDE_DIR + ${DIRECTX_EXTRA_CHECK}) + +if(DIRECTX_FOUND) + set(DIRECTX_LIBRARIES + "${DIRECTX_DXGUID_LIBRARY}" + "${DIRECTX_DINPUT_LIBRARY}") + + set(DIRECTX_INCLUDE_DIRS "${DIRECTX_INCLUDE_DIR}") + + mark_as_advanced(DIRECTX_ROOT_DIR) +endif() + +macro(find_directx_library) + find_library(${ARGN} + PATHS + ${DXSDK_DIRS} + HINTS + ${DXLIB_HINTS} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + ${_dx_lib_suffixes}) +endmacro() +macro(find_directx_include) + find_path(${ARGN} + PATHS + ${DXSDK_DIRS} + HINTS + ${DIRECTX_INCLUDE_DIR} + "${DIRECTX_ROOT_DIR}" + PATH_SUFFIXES + include) +endmacro() + +mark_as_advanced(DIRECTX_DINPUT_LIBRARY + DIRECTX_DXGUID_LIBRARY + DIRECTX_DXERR_LIBRARY + DIRECTX_D3D9_LIBRARY + DIRECTX_D3DXOF_LIBRARY + DIRECTX_D3DX9_LIBRARY_RELEASE + DIRECTX_D3DX9_LIBRARY_DEBUG + DIRECTX_INCLUDE_DIR) diff --git a/src/widget/directx.c b/src/widget/directx.c new file mode 100644 index 00000000..7465d69d --- /dev/null +++ b/src/widget/directx.c @@ -0,0 +1,96 @@ +#include + +#ifndef MW_DIRECTX +#define MW_DIRECTX_NO_INCLUDE +MWDECL MwClass MwDX9Class; + +MwClass MwDX9Class = NULL; +#else +#include + +typedef struct gdid3d9 { + void* d3d9dll; + IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); + + LPDIRECT3D9 d3d; // the pointer to our Direct3D interface + LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class\ + +} gdid3d9_t; + +static int wcreate(MwWidget handle) { + void* r = NULL; + MwWidget w = handle; + gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); + + o->d3d9dll = LoadLibrary("d3d9.dll"); + if(!o->d3d9dll) { + MessageBox(NULL, "d3d9.dll not found! Is DirectX9 installed?", "Error", MB_OK); + ExitProcess(-1); + } + o->Direct3DCreate9 = (void*)GetProcAddress(o->d3d9dll, "Direct3DCreate9"); + + o->d3d = o->Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface + + D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information + + ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use + d3dpp.Windowed = TRUE; // program windowed, not fullscreen + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames + d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; // set the window to be used by Direct3D + + // create a device class using this information and information from the d3dpp stuct + o->d3d->lpVtbl->CreateDevice(o->d3d, + D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + handle->lowlevel->gdi.hWnd, + D3DCREATE_MIXED_VERTEXPROCESSING, + &d3dpp, + &o->d3ddev); + + handle->internal = o; + + return 0; +} + +static void destroy(MwWidget handle) { + MwWidget w = handle; + gdid3d9_t* o = handle->internal; + + o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device + o->d3d->lpVtbl->Release(o->d3d); // close and release Direct3D + + free(handle->internal); +} + +static void func_handler(MwWidget handle, const char* name, void* out, + va_list va) { + gdid3d9_t* o = handle->internal; + + if(strcmp(name, "mwDirectXGetD3D9") == 0) { + *(LPDIRECT3D9*)out = o->d3d; + } + if(strcmp(name, "mwDirectXGetD3Dev9") == 0) { + *(LPDIRECT3DDEVICE9*)out = o->d3ddev; + } +} + +MwClassRec MwDX9ClassRec = {wcreate, /* create */ + destroy, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ + NULL, NULL, NULL}; +MwClass MwD3D9Class = &MwDX9ClassRec; +#endif diff --git a/tools/genmk.pl b/tools/genmk.pl index 26a7ebbb..ad1495f4 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,6 +42,23 @@ sub cobjs { return $r; } +sub dx9_detect_block { + return <<'EOF'; +!if [where d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!endif +!else +!if [echo DX9_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx9flags.mk") +!include "dx9flags.mk" +!else +DX9_FLAGS = +!endif +EOF +} + sub generate { my ($output, $type) = @_; @@ -65,6 +82,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; + my $dx9_flags = ""; + my $dx9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -88,6 +107,12 @@ sub generate { $def = "/D"; $inc = "/I"; $dll = "/DLL"; + + # DX9 headers aren't part of every MSVC/Windows SDK install, so probe + # PATH for a d3d9.h at build time (on the machine actually running + # nmake) rather than baking in a yes/no here. + $dx9_flags = "\$(DX9_FLAGS)"; + $dx9_block = dx9_detect_block(); } elsif ($type eq "Watcom") { $cc = "wcc386 -bt=nt -q"; @@ -109,14 +134,20 @@ sub generate { $prefobj = "file "; $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; + + $dx9_flags = "${def}MW_DIRECTX"; } open(OUT, ">", $output); print(OUT "CC = $cc\n"); print(OUT "LD = $link\n"); print(OUT "\n"); + if ($dx9_block ne "") { + print(OUT $dx9_block); + print(OUT "\n"); + } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); @@ -152,6 +183,9 @@ sub generate { } print(OUT " $del src${dir}Mw.dll\n"); print(OUT " $del src${dir}Mw.lib\n"); + if ($dx9_block ne "") { + print(OUT " $del dx9flags.mk\n"); + } foreach my $f (@examples) { my $b = $f; $b =~ s/\.c$/.obj/; From 47c9f8df4e55741595ab61c3219ff6e6b3c6fb2d Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 21:44:55 -0700 Subject: [PATCH 40/62] d3d8 too --- CMakeLists.txt | 37 +++++--- NTMakefile | 4 +- WatMakefile | 2 +- examples/CMakeLists.txt | 3 +- examples/dxdemos/CMakeLists.txt | 11 ++- examples/dxdemos/d3d8.c | 91 ++++++++++++++++++++ examples/dxdemos/{directx9.c => d3d9.c} | 14 ++-- include/Mw/Widget/D3D8.h | 55 ++++++++++++ include/Mw/Widget/{DirectX.h => D3D9.h} | 17 ++-- src/widget/d3d8.c | 107 ++++++++++++++++++++++++ src/widget/{directx.c => d3d9.c} | 48 +++++------ tools/genmk.pl | 32 +++++-- 12 files changed, 355 insertions(+), 66 deletions(-) create mode 100644 examples/dxdemos/d3d8.c rename examples/dxdemos/{directx9.c => d3d9.c} (90%) create mode 100644 include/Mw/Widget/D3D8.h rename include/Mw/Widget/{DirectX.h => D3D9.h} (83%) create mode 100644 src/widget/d3d8.c rename src/widget/{directx.c => d3d9.c} (68%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 046f08c1..fa1644dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,8 +32,10 @@ else() option(MW_TRY_OPENGL "Try to compile OpenGL widget or not" ON) option(MW_TRY_VULKAN "Try to compile Vulkan widget or not" ON) endif() + if(${CMAKE_SYSTEM_NAME} MATCHES Windows) - option(MW_TRY_DIRECTX "Try to compile DirectX widget or not" ON) + option(MW_TRY_D3D8 "Try to compile D3D8 widget or not" ON) + option(MW_TRY_D3D9 "Try to compile D3D9 widget or not" ON) endif() @@ -94,13 +96,19 @@ if(MW_TRY_VULKAN) endif() endif() -if(MW_TRY_DIRECTX) +if(MW_TRY_D3D8 OR MW_TRY_D3D9) include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) if(DIRECTX_FOUND) - set(MW_BUILD_DIRECTX ON) - message(STATUS "DirectX widget has been enabled") + if(MW_TRY_D3D8) + set(MW_BUILD_D3D8 ON) + message(STATUS "D3D8 widget has been enabled") + endif() + if(MW_TRY_D3D9) + set(MW_BUILD_D3D9 ON) + message(STATUS "D3D9 widget has been enabled") + endif() else() - message(STATUS "DirectX widget has been disabled") + message(STATUS "DirectX widgets have been disabled (DirectX not found)") endif() endif() @@ -491,13 +499,20 @@ if(MW_BUILD_VULKAN) endif() endif() -if(MW_BUILD_DIRECTX) - list(APPEND LIBRARIES ${DIRECTX_D3DX9_LIBRARIES}) +if(MW_BUILD_D3D8) target_compile_definitions( - Mw - PRIVATE - MW_DIRECTX - ) + Mw + PUBLIC + MW_DIRECTX8 + ) +endif() + +if(MW_BUILD_D3D9) + target_compile_definitions( + Mw + PUBLIC + MW_DIRECTX9 + ) endif() target_compile_definitions( diff --git a/NTMakefile b/NTMakefile index 37b4a950..12b6446a 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,7 +2,7 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -14,7 +14,7 @@ LD = link /nologo DX9_FLAGS = !endif -MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX9_FLAGS) +MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) MW_LDFLAGS = /DLL EXE_CFLAGS = /Iinclude EXE_LDFLAGS = diff --git a/WatMakefile b/WatMakefile index 09a942d0..9c7f0892 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,7 +1,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX8 -dMW_DIRECTX9 MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 4ac6962b..87225f1a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -5,8 +5,9 @@ endif() if(${MW_TRY_VULKAN}) add_subdirectory(vkdemos) endif() + if(WIN32) - if(${MW_TRY_DIRECTX}) + if(${MW_TRY_D3D8} OR ${MW_BUILD_D3D8}) add_subdirectory(dxdemos) endif() endif() diff --git a/examples/dxdemos/CMakeLists.txt b/examples/dxdemos/CMakeLists.txt index 38265e1c..aa09d638 100644 --- a/examples/dxdemos/CMakeLists.txt +++ b/examples/dxdemos/CMakeLists.txt @@ -8,17 +8,16 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/../../resource/FindDirectX.cmake) if(${DIRECTX_FOUND}) foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) get_filename_component(TARGET ${PATH} NAME_WE) - add_executable(${TARGET} MACOSX_BUNDLE ${PATH}) + add_executable(${TARGET} ${PATH}) target_include_directories( ${TARGET} PRIVATE ${DIRECTX_INCLUDE_DIRS} ) target_link_libraries( - ${TARGET} - PRIVATE - Mw - ${DIRECTX_D3DX9_LIBRARIES} - ) +${TARGET} +PRIVATE +Mw +) endforeach() endif() diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c new file mode 100644 index 00000000..400adc6c --- /dev/null +++ b/examples/dxdemos/d3d8.c @@ -0,0 +1,91 @@ +/* + * Adapted from: + * https://web.archive.org/web/20211126225651/https://www.codeguru.com/multimedia/using-direct3d8-the-basics/ + */ +#include +#include + +MwWidget window, d3d8; +LPDIRECT3D8 d3d; +LPDIRECT3DDEVICE8 d3ddev; +LPDIRECT3DVERTEXBUFFER8 v_buffer; + +struct CUSTOMVERTEX { + FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag + DWORD color; // from the D3DFVF_DIFFUSE flag +}; +#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) + +static void MWAPI draw(MwWidget handle, void* user, void* client) { + // clear the window to a deep blue + d3ddev->lpVtbl->Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); + + d3ddev->lpVtbl->BeginScene(d3ddev); // begins the 3D scene + + // select which vertex format we are using + d3ddev->lpVtbl->SetVertexShader(d3ddev, CUSTOMFVF); + + // select the vertex buffer to display + d3ddev->lpVtbl->SetStreamSource(d3ddev, 0, v_buffer, sizeof(struct CUSTOMVERTEX)); + + // // copy the vertex buffer to the back buffer + d3ddev->lpVtbl->DrawPrimitive(d3ddev, D3DPT_TRIANGLELIST, 0, 1); + + d3ddev->lpVtbl->EndScene(d3ddev); // ends the 3D scene + + d3ddev->lpVtbl->Present(d3ddev, NULL, NULL, NULL, NULL); // displays the created frame +} + +int main() { + BYTE* pVoid; + + MwLibraryInit(); + + window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); + + d3d8 = MwCreateWidget(MwD3D8Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + + d3d = MwDirectXGetD3D8(d3d8); + d3ddev = MwDirectXGetD3Dev8(d3d8); + + // create three vertices using the CUSTOMVERTEX struct built earlier + struct CUSTOMVERTEX vertices[] = + { + { + 400.0f, + 0.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 0, 255), + }, + { + 800.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(0, 255, 0), + }, + { + 0.0f, + 600.0f, + 0.5f, + 1.0f, + D3DCOLOR_XRGB(255, 0, 0), + }, + }; + + d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, + 3 * sizeof(struct CUSTOMVERTEX), + 0, + CUSTOMFVF, + D3DPOOL_MANAGED, + &v_buffer); + + v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (BYTE**)&pVoid, 0); // lock the vertex buffer + memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer + v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer + + MwAddUserHandler(window, MwNtickHandler, draw, NULL); + + MwLoop(window); +} diff --git a/examples/dxdemos/directx9.c b/examples/dxdemos/d3d9.c similarity index 90% rename from examples/dxdemos/directx9.c rename to examples/dxdemos/d3d9.c index 6b28ac02..5975739d 100644 --- a/examples/dxdemos/directx9.c +++ b/examples/dxdemos/d3d9.c @@ -4,9 +4,9 @@ * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-4 */ #include -#include +#include -MwWidget window, d3d9; +MwWidget window, d3d8; LPDIRECT3D9 d3d; LPDIRECT3DDEVICE9 d3ddev; LPDIRECT3DVERTEXBUFFER9 v_buffer; @@ -38,14 +38,16 @@ static void MWAPI draw(MwWidget handle, void* user, void* client) { } int main() { + VOID* pVoid; + MwLibraryInit(); window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); - d3d9 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + d3d8 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirectXGetD3D9(d3d9); - d3ddev = MwDirectXGetD3Dev9(d3d9); + d3d = MwDirectXGetD3D9(d3d8); + d3ddev = MwDirectXGetD3Dev9(d3d8); // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = @@ -81,8 +83,6 @@ int main() { &v_buffer, NULL); - VOID* pVoid; // the void pointer - v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (void**)&pVoid, 0); // lock the vertex buffer memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h new file mode 100644 index 00000000..022e7bc9 --- /dev/null +++ b/include/Mw/Widget/D3D8.h @@ -0,0 +1,55 @@ +/*! + * @file Mw/Widget/D3D8.h + * @brief D3D8 widget. + * @warning Only avaliable on Windows. + */ +#ifndef __MW_WIDGET_D3D8_H__ +#define __MW_WIDGET_D3D8_H__ + +#include +#include +#include + +#if !defined(MW_D3D8_NO_INCLUDE) + +/* https://github.com/microsoft/Windows-classic-samples/issues/317 */ +#if defined(__MINGW32__) || defined(__MINGW64__) +#define NTDDI_VERSION 0x07000000 +#define _WIN32_WINNT 0x0A00 + +#endif +#endif + +#ifndef _WIN32 +#error D3D8 widget only avaliable for Win32 backends +#else +#ifdef MW_DIRECTX8 +#include +#endif +#endif + +/*! + * @brief D3D8 widget class + */ +MWDECL MwClass MwD3D8Class; + +#ifdef __cplusplus +extern "C" { +#endif + +MwInline LPDIRECT3D8 MwDirectXGetD3D8(MwWidget handle) { + LPDIRECT3D8 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); + return out; +}; +MwInline LPDIRECT3DDEVICE8 MwDirectXGetD3Dev8(MwWidget handle) { + LPDIRECT3DDEVICE8 out = NULL; + MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); + return out; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/Mw/Widget/DirectX.h b/include/Mw/Widget/D3D9.h similarity index 83% rename from include/Mw/Widget/DirectX.h rename to include/Mw/Widget/D3D9.h index a81b4aee..2639e175 100644 --- a/include/Mw/Widget/DirectX.h +++ b/include/Mw/Widget/D3D9.h @@ -3,27 +3,28 @@ * @brief DirectX widget. * @warning Only avaliable on Windows. */ -#ifndef __MW_WIDGET_DIRECTX_H__ -#define __MW_WIDGET_DIRECTX_H__ +#ifndef __MW_WIDGET_D3D9_H__ +#define __MW_WIDGET_D3D9_H__ #include #include #include -#if !defined(MW_DIRECTX_NO_INCLUDE) +#if !defined(MW_D3D9_NO_INCLUDE) /* https://github.com/microsoft/Windows-classic-samples/issues/317 */ #if defined(__MINGW32__) || defined(__MINGW64__) #define NTDDI_VERSION 0x07000000 #define _WIN32_WINNT 0x0A00 - -#endif - -#include #endif #ifndef _WIN32 -#error DirectX widget only avaliable for Win32 backends +#error D3D9 widget only avaliable for Win32 backends +#else +#ifdef MW_DIRECTX9 +#include +#endif +#endif #endif /*! diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c new file mode 100644 index 00000000..13e656d4 --- /dev/null +++ b/src/widget/d3d8.c @@ -0,0 +1,107 @@ +#include + +#ifndef MW_DIRECTX8 +#define MW_DIRECTX8_NO_INCLUDE +MWDECL MwClass MwDX8Class; + +MwClass MwDX8Class = NULL; +#else +#include + +typedef struct gdid3d8 { + void* d3d8dll; + IDirect3D8* (*Direct3DCreate8)(UINT sdk_version); + + LPDIRECT3D8 d3d; // the pointer to our Direct3D interface + LPDIRECT3DDEVICE8 d3ddev; // the pointer to the device class\ + +} gdid3d8_t; + +static int wcreate_d3d8(MwWidget handle) { + void* r = NULL; + MwWidget w = handle; + gdid3d8_t* o = malloc(sizeof(gdid3d8_t)); + D3DPRESENT_PARAMETERS d3dpp; + D3DDISPLAYMODE dispMode; + + o->d3d8dll = LoadLibrary("d3d8.dll"); + if(!o->d3d8dll) { + MessageBox(NULL, "d3d8.dll not found! Is DirectX8 installed?", "Error", MB_OK); + ExitProcess(-1); + } + o->Direct3DCreate8 = (void*)GetProcAddress(o->d3d8dll, "Direct3DCreate8"); + if(!o->Direct3DCreate8) { + MessageBox(NULL, "Direct3DCreate8 not found! Is DirectX8 installed properly?", "Error", MB_OK); + ExitProcess(-1); + } + + o->d3d = o->Direct3DCreate8(D3D_SDK_VERSION); + + o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); + + ZeroMemory(&d3dpp, sizeof(d3dpp)); + d3dpp.Windowed = TRUE; + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; + d3dpp.BackBufferFormat = dispMode.Format; + d3dpp.EnableAutoDepthStencil = TRUE; + d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + + // create a device class using this information and information from the d3dpp stuct + o->d3d->lpVtbl->CreateDevice(o->d3d, + D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + handle->lowlevel->gdi.hWnd, + D3DCREATE_MIXED_VERTEXPROCESSING, + &d3dpp, + &o->d3ddev); + + o->d3ddev->lpVtbl->SetRenderState(o->d3ddev, D3DRS_LIGHTING, FALSE); + + handle->internal = o; + + return 0; +} + +static void destroy_d3d8(MwWidget handle) { + MwWidget w = handle; + gdid3d8_t* o = handle->internal; + + o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device + o->d3d->lpVtbl->Release(o->d3d); // close and release Direct3D + + free(handle->internal); +} + +static void func_handler_d3d8(MwWidget handle, const char* name, void* out, + va_list va) { + gdid3d8_t* o = handle->internal; + + if(strcmp(name, "mwDirectXGetD3D8") == 0) { + *(LPDIRECT3D8*)out = o->d3d; + } + if(strcmp(name, "mwDirectXGetD3Dev8") == 0) { + *(LPDIRECT3DDEVICE8*)out = o->d3ddev; + } +} + +MwClassRec MwDX8ClassRec = {wcreate_d3d8, /* create */ + destroy_d3d8, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler_d3d8, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ + NULL, NULL, NULL}; +MwClass MwD3D8Class = &MwDX8ClassRec; +#endif diff --git a/src/widget/directx.c b/src/widget/d3d9.c similarity index 68% rename from src/widget/directx.c rename to src/widget/d3d9.c index 7465d69d..f6fc5d96 100644 --- a/src/widget/directx.c +++ b/src/widget/d3d9.c @@ -1,12 +1,12 @@ #include -#ifndef MW_DIRECTX -#define MW_DIRECTX_NO_INCLUDE +#ifndef MW_DIRECTX9 +#define MW_DIRECTX9_NO_INCLUDE MWDECL MwClass MwDX9Class; MwClass MwDX9Class = NULL; #else -#include +#include typedef struct gdid3d9 { void* d3d9dll; @@ -17,7 +17,7 @@ typedef struct gdid3d9 { } gdid3d9_t; -static int wcreate(MwWidget handle) { +static int wcreate_d3d9(MwWidget handle) { void* r = NULL; MwWidget w = handle; gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); @@ -52,7 +52,7 @@ static int wcreate(MwWidget handle) { return 0; } -static void destroy(MwWidget handle) { +static void destroy_d3d9(MwWidget handle) { MwWidget w = handle; gdid3d9_t* o = handle->internal; @@ -62,8 +62,8 @@ static void destroy(MwWidget handle) { free(handle->internal); } -static void func_handler(MwWidget handle, const char* name, void* out, - va_list va) { +static void func_handler_d3d9(MwWidget handle, const char* name, void* out, + va_list va) { gdid3d9_t* o = handle->internal; if(strcmp(name, "mwDirectXGetD3D9") == 0) { @@ -74,23 +74,23 @@ static void func_handler(MwWidget handle, const char* name, void* out, } } -MwClassRec MwDX9ClassRec = {wcreate, /* create */ - destroy, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - func_handler, /* execute */ - NULL, /* tick */ - NULL, /* resize */ - NULL, /* children_update */ - NULL, /* children_prop_change */ - NULL, /* clipboard */ - NULL, /* props_change */ +MwClassRec MwDX9ClassRec = {wcreate_d3d9, /* create */ + destroy_d3d9, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler_d3d9, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ NULL, NULL, NULL}; MwClass MwD3D9Class = &MwDX9ClassRec; #endif diff --git a/tools/genmk.pl b/tools/genmk.pl index ad1495f4..a249e24c 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,10 +42,28 @@ sub cobjs { return $r; } + +sub dx8_detect_block { + return <<'EOF'; +!if [where d3d8.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d8.h 2^>nul') do @echo DX8_FLAGS = /DMW_DIRECTX8 /I"%~dpP">dx8flags.mk] +!endif +!else +!if [echo DX8_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx8flags.mk") +!include "dx8flags.mk" +!else +DX8_FLAGS = +!endif +EOF +} + sub dx9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -82,6 +100,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; + my $dx8_flags = ""; + my $dx8_block = ""; my $dx9_flags = ""; my $dx9_block = ""; @@ -108,9 +128,8 @@ sub generate { $inc = "/I"; $dll = "/DLL"; - # DX9 headers aren't part of every MSVC/Windows SDK install, so probe - # PATH for a d3d9.h at build time (on the machine actually running - # nmake) rather than baking in a yes/no here. + $dx8_flags = "\$(DX8_FLAGS)"; + $dx8_block = dx8_detect_block(); $dx9_flags = "\$(DX9_FLAGS)"; $dx9_block = dx9_detect_block(); } @@ -135,7 +154,8 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx9_flags = "${def}MW_DIRECTX"; + $dx8_flags = "${def}MW_DIRECTX8"; + $dx9_flags = "${def}MW_DIRECTX9"; } open(OUT, ">", $output); @@ -147,7 +167,7 @@ sub generate { print(OUT "\n"); } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx8_flags} ${dx9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); From 87cbb582f76c8aa9cecad228852b9aa86c37c7cf Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:02:27 -0700 Subject: [PATCH 41/62] perl --- configure | 8 +++++--- examples/dxdemos/d3d8.c | 4 ++++ examples/dxdemos/d3d9.c | 4 ++++ include/Mw/Widget/D3D8.h | 12 ++++++++++++ include/Mw/Widget/D3D9.h | 12 ++++++++++++ pl/rules.pl | 18 +++++++++++++----- src/widget/d3d8.c | 12 +++++------- src/widget/d3d9.c | 12 +++++------- tools/gendcl.pl | 2 ++ 9 files changed, 62 insertions(+), 22 deletions(-) diff --git a/configure b/configure index f6ff13bc..a2d0ba61 100755 --- a/configure +++ b/configure @@ -55,7 +55,8 @@ param_set("examples", 1); param_set("allow-sloppy-focus", 0); # (option that only makes sense on Windows) -param_set("directx", 0); +param_set("dxd8", 0); +param_set("dxd9", 0); my %features = ( "classic-theme" => "use classic theme", @@ -73,7 +74,8 @@ my %features = ( "gnustep" => "use gnustep", "dbus" => "use DBus on supported platform", "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus", - "directx" => "(Windows only) build DirectX widget" + "directx8" => "(Windows only) build DXD8 widget", + "directx9" => "(Windows only) build DXD9 widget" ); my @features_keys = ( "1classic-theme", "1stb-image", @@ -82,7 +84,7 @@ my @features_keys = ( "1vulkan", "2vulkan-string-helper", "1shared", "1static", "1wayland", "1gnustep", - "1dbus", "1directx" + "1dbus", "1direct8", "1directx9" ); sub def_platform { diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c index 400adc6c..2ef08a38 100644 --- a/examples/dxdemos/d3d8.c +++ b/examples/dxdemos/d3d8.c @@ -5,6 +5,8 @@ #include #include +#ifdef MW_DIRECTX8 + MwWidget window, d3d8; LPDIRECT3D8 d3d; LPDIRECT3DDEVICE8 d3ddev; @@ -89,3 +91,5 @@ int main() { MwLoop(window); } + +#endif diff --git a/examples/dxdemos/d3d9.c b/examples/dxdemos/d3d9.c index 5975739d..9fe685c3 100644 --- a/examples/dxdemos/d3d9.c +++ b/examples/dxdemos/d3d9.c @@ -6,6 +6,8 @@ #include #include +#ifdef MW_DIRECTX9 + MwWidget window, d3d8; LPDIRECT3D9 d3d; LPDIRECT3DDEVICE9 d3ddev; @@ -91,3 +93,5 @@ int main() { MwLoop(window); } + +#endif diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h index 022e7bc9..ee1bf052 100644 --- a/include/Mw/Widget/D3D8.h +++ b/include/Mw/Widget/D3D8.h @@ -22,6 +22,7 @@ #ifndef _WIN32 #error D3D8 widget only avaliable for Win32 backends +#undef MW_DIRECTX8 #else #ifdef MW_DIRECTX8 #include @@ -37,6 +38,7 @@ MWDECL MwClass MwD3D8Class; extern "C" { #endif +#ifdef MW_DIRECTX8 MwInline LPDIRECT3D8 MwDirectXGetD3D8(MwWidget handle) { LPDIRECT3D8 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); @@ -47,6 +49,16 @@ MwInline LPDIRECT3DDEVICE8 MwDirectXGetD3Dev8(MwWidget handle) { MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); return out; }; +#else +MwInline void* MwDirectXGetD3D8(MwWidget handle) { + (void)handle; + return NULL; +}; +MwInline void* MwDirectXGetD3Dev8(MwWidget handle) { + (void)handle; + return NULL; +}; +#endif #ifdef __cplusplus } diff --git a/include/Mw/Widget/D3D9.h b/include/Mw/Widget/D3D9.h index 2639e175..e7a7149b 100644 --- a/include/Mw/Widget/D3D9.h +++ b/include/Mw/Widget/D3D9.h @@ -20,6 +20,7 @@ #ifndef _WIN32 #error D3D9 widget only avaliable for Win32 backends +#undef MW_DIRECTX9 #else #ifdef MW_DIRECTX9 #include @@ -36,6 +37,7 @@ MWDECL MwClass MwD3D9Class; extern "C" { #endif +#ifdef MW_DIRECTX9 MwInline LPDIRECT3D9 MwDirectXGetD3D9(MwWidget handle) { LPDIRECT3D9 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); @@ -46,6 +48,16 @@ MwInline LPDIRECT3DDEVICE9 MwDirectXGetD3Dev9(MwWidget handle) { MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); return out; }; +#else +MwInline void* MwDirectXGetD3D9(MwWidget handle) { + (void)handle; + return NULL; +}; +MwInline void* MwDirectXGetD3Dev9(MwWidget handle) { + (void)handle; + return NULL; +}; +#endif #ifdef __cplusplus } diff --git a/pl/rules.pl b/pl/rules.pl index 3f539eee..76ab9b4c 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -178,7 +178,8 @@ new_object("src/widget/window.c"); new_object("src/widget/opengl.c"); new_object("src/widget/vulkan.c"); -new_object("src/widget/directx.c"); +new_object("src/widget/d3d8.c"); +new_object("src/widget/d3d9.c"); if (param_get("opengl")) { add_cflags("-DMW_OPENGL"); @@ -186,8 +187,11 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } -if (param_get("directx")) { - add_cflags("-DMW_DIRECTX"); +if (param_get("directx8")) { + add_cflags("-DMW_DIRECTX8"); +} +if (param_get("directx9")) { + add_cflags("-DMW_DIRECTX9"); } new_object("src/dialog/*.c"); @@ -234,8 +238,12 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } -if (param_get("directx")) { - new_example("examples/dxdemos/directx9"); +if (param_get("directx8")) { + new_example("examples/dxdemos/d3d8"); +} + +if (param_get("directx9")) { + new_example("examples/dxdemos/d3d9"); } 1; diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c index 13e656d4..06633210 100644 --- a/src/widget/d3d8.c +++ b/src/widget/d3d8.c @@ -1,13 +1,7 @@ #include -#ifndef MW_DIRECTX8 -#define MW_DIRECTX8_NO_INCLUDE -MWDECL MwClass MwDX8Class; - -MwClass MwDX8Class = NULL; -#else +#ifdef MW_DIRECTX8 #include - typedef struct gdid3d8 { void* d3d8dll; IDirect3D8* (*Direct3DCreate8)(UINT sdk_version); @@ -104,4 +98,8 @@ MwClassRec MwDX8ClassRec = {wcreate_d3d8, /* create */ NULL, /* props_change */ NULL, NULL, NULL}; MwClass MwD3D8Class = &MwDX8ClassRec; +#else +MWDECL MwClass MwDX8Class; + +MwClass MwDX8Class = NULL; #endif diff --git a/src/widget/d3d9.c b/src/widget/d3d9.c index f6fc5d96..3246cafb 100644 --- a/src/widget/d3d9.c +++ b/src/widget/d3d9.c @@ -1,13 +1,7 @@ #include -#ifndef MW_DIRECTX9 -#define MW_DIRECTX9_NO_INCLUDE -MWDECL MwClass MwDX9Class; - -MwClass MwDX9Class = NULL; -#else +#ifdef MW_DIRECTX9 #include - typedef struct gdid3d9 { void* d3d9dll; IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); @@ -93,4 +87,8 @@ MwClassRec MwDX9ClassRec = {wcreate_d3d9, /* create */ NULL, /* props_change */ NULL, NULL, NULL}; MwClass MwD3D9Class = &MwDX9ClassRec; +#else +MWDECL MwClass MwDX9Class; + +MwClass MwDX9Class = NULL; #endif diff --git a/tools/gendcl.pl b/tools/gendcl.pl index f2e3399c..ccc29dc8 100755 --- a/tools/gendcl.pl +++ b/tools/gendcl.pl @@ -59,6 +59,8 @@ sub scan { while (my $file = readdir($dh)) { if ( !(($dir . "/" . $file) eq "src/widget/opengl.c") && !(($dir . "/" . $file) eq "src/widget/vulkan.c") + && !(($dir . "/" . $file) eq "src/widget/d3d8.c") + && !(($dir . "/" . $file) eq "src/widget/d3d9.c") && !(($dir . "/" . $file) eq "external/stb_truetype.c") && !(($dir . "/" . $file) eq "external/stb_image.c") && ($file =~ /\.c$/)) From 2a19c5e5cf6bb61cab59b4f8c9e7a0695ee6c03e Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:05:40 -0700 Subject: [PATCH 42/62] genmk --- NTMakefile | 7 ++++--- WatMakefile | 13 ++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/NTMakefile b/NTMakefile index 12b6446a..f42873ba 100644 --- a/NTMakefile +++ b/NTMakefile @@ -99,7 +99,8 @@ clean: del /f /q src\widget\checkbox.obj del /f /q src\widget\clock.obj del /f /q src\widget\combobox.obj - del /f /q src\widget\directx.obj + del /f /q src\widget\d3d8.obj + del /f /q src\widget\d3d9.obj del /f /q src\widget\document.obj del /f /q src\widget\entry.obj del /f /q src\widget\frame.obj @@ -357,8 +358,8 @@ examples\gldemos\tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) /Fo$@ examples/gldemos/tripaint.c -src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj - $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\directx.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib +src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj + $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib .c.obj: diff --git a/WatMakefile b/WatMakefile index 9c7f0892..55bc6b8e 100644 --- a/WatMakefile +++ b/WatMakefile @@ -85,7 +85,8 @@ clean: .SYMBOLIC %erase src/widget/checkbox.obj %erase src/widget/clock.obj %erase src/widget/combobox.obj - %erase src/widget/directx.obj + %erase src/widget/d3d8.obj + %erase src/widget/d3d9.obj %erase src/widget/document.obj %erase src/widget/entry.obj %erase src/widget/frame.obj @@ -342,8 +343,8 @@ examples/gldemos/tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/gldemos/tripaint.c -src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/directx.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj - $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/directx.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib +src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/d3d8.obj src/widget/d3d9.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj + $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/d3d8.obj file src/widget/d3d9.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib @@ -499,8 +500,10 @@ src/widget/clock.obj: src/widget/clock.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/clock.c src/widget/combobox.obj: src/widget/combobox.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/combobox.c -src/widget/directx.obj: src/widget/directx.c - $(CC) $(MW_CFLAGS) -fo=$@ src/widget/directx.c +src/widget/d3d8.obj: src/widget/d3d8.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d8.c +src/widget/d3d9.obj: src/widget/d3d9.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d9.c src/widget/document.obj: src/widget/document.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/document.c src/widget/entry.obj: src/widget/entry.c From 5872c43539471fb1bcc9b630c24d871392adbd46 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:11:17 -0700 Subject: [PATCH 43/62] have watcom check for d3d8.h/d3d9.h --- WatMakefile | 16 +++++++++++++++- tools/genmk.pl | 6 ++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/WatMakefile b/WatMakefile index 55bc6b8e..02205a74 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,7 +1,20 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECTX8 -dMW_DIRECTX9 +!if [where d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!endif +!else +!if [echo DX9_FLAGS =>dx9flags.mk] +!endif +!endif +!if exist("dx9flags.mk") +!include "dx9flags.mk" +!else +DX9_FLAGS = +!endif + +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt @@ -109,6 +122,7 @@ clean: .SYMBOLIC %erase src/widget/window.obj %erase src/Mw.dll %erase src/Mw.lib + %erase dx9flags.mk %erase examples/basic/box.obj %erase examples/basic/calculator.obj %erase examples/basic/checkbox.obj diff --git a/tools/genmk.pl b/tools/genmk.pl index a249e24c..9f45add9 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -154,8 +154,10 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx8_flags = "${def}MW_DIRECTX8"; - $dx9_flags = "${def}MW_DIRECTX9"; + $dx8_flags = "\$(DX8_FLAGS)"; + $dx8_block = dx8_detect_block(); + $dx9_flags = "\$(DX9_FLAGS)"; + $dx9_block = dx9_detect_block(); } open(OUT, ">", $output); From 2f3b8f2417cb5375611460792c5ac392643a8447 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:16:16 -0700 Subject: [PATCH 44/62] error handling for d3d8 and d3d9 --- src/widget/d3d8.c | 32 +++++++++++++++++++++++++++----- src/widget/d3d9.c | 34 ++++++++++++++++++++++------------ 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c index 06633210..d569f530 100644 --- a/src/widget/d3d8.c +++ b/src/widget/d3d8.c @@ -17,21 +17,33 @@ static int wcreate_d3d8(MwWidget handle) { gdid3d8_t* o = malloc(sizeof(gdid3d8_t)); D3DPRESENT_PARAMETERS d3dpp; D3DDISPLAYMODE dispMode; + HRESULT hr; + char errbuf[2048] = {0}; o->d3d8dll = LoadLibrary("d3d8.dll"); if(!o->d3d8dll) { - MessageBox(NULL, "d3d8.dll not found! Is DirectX8 installed?", "Error", MB_OK); - ExitProcess(-1); + MwDispatchError(1, "d3d8.dll not found! Is DirectX8 installed?"); + return 1; } o->Direct3DCreate8 = (void*)GetProcAddress(o->d3d8dll, "Direct3DCreate8"); if(!o->Direct3DCreate8) { - MessageBox(NULL, "Direct3DCreate8 not found! Is DirectX8 installed properly?", "Error", MB_OK); - ExitProcess(-1); + MwDispatchError(1, "Direct3DCreate8 not found! Is DirectX8 installed properly?"); + return 1; } o->d3d = o->Direct3DCreate8(D3D_SDK_VERSION); + if(!o->Direct3DCreate8) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "Direct3DCreate8 NULL: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } - o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); + hr = o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "GetAdapterDisplayMode ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; @@ -49,8 +61,18 @@ static int wcreate_d3d8(MwWidget handle) { D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &o->d3ddev); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "CreateDevice ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } o->d3ddev->lpVtbl->SetRenderState(o->d3ddev, D3DRS_LIGHTING, FALSE); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "SetRenderState ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } handle->internal = o; diff --git a/src/widget/d3d9.c b/src/widget/d3d9.c index 3246cafb..7219e58a 100644 --- a/src/widget/d3d9.c +++ b/src/widget/d3d9.c @@ -12,9 +12,12 @@ typedef struct gdid3d9 { } gdid3d9_t; static int wcreate_d3d9(MwWidget handle) { - void* r = NULL; - MwWidget w = handle; - gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); + void* r = NULL; + MwWidget w = handle; + gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); + HRESULT hr; + char errbuf[2048]; + D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information o->d3d9dll = LoadLibrary("d3d9.dll"); if(!o->d3d9dll) { @@ -24,8 +27,10 @@ static int wcreate_d3d9(MwWidget handle) { o->Direct3DCreate9 = (void*)GetProcAddress(o->d3d9dll, "Direct3DCreate9"); o->d3d = o->Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface - - D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information + if(hr != D3D_OK) { + MwDispatchError(1, "Direct3DCreate9 NULL"); + return 1; + } ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use d3dpp.Windowed = TRUE; // program windowed, not fullscreen @@ -33,13 +38,18 @@ static int wcreate_d3d9(MwWidget handle) { d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; // set the window to be used by Direct3D // create a device class using this information and information from the d3dpp stuct - o->d3d->lpVtbl->CreateDevice(o->d3d, - D3DADAPTER_DEFAULT, - D3DDEVTYPE_HAL, - handle->lowlevel->gdi.hWnd, - D3DCREATE_MIXED_VERTEXPROCESSING, - &d3dpp, - &o->d3ddev); + hr = o->d3d->lpVtbl->CreateDevice(o->d3d, + D3DADAPTER_DEFAULT, + D3DDEVTYPE_HAL, + handle->lowlevel->gdi.hWnd, + D3DCREATE_MIXED_VERTEXPROCESSING, + &d3dpp, + &o->d3ddev); + if(hr != D3D_OK) { + MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "CreateDevice ERROR: %s", hr); + MwDispatchError(1, errbuf); + return 1; + } handle->internal = o; From f89eaf690139bcbf2aef9d4cd410b1cc829d662f Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:16:43 -0700 Subject: [PATCH 45/62] put nul in gitignore for watcom cross compile --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3faccd35..ce6459a0 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ compile_flags.txt flamegraph.svg perf.* + +nul From a18ca58f1814dc29113c9bb6a2e5942fa09d75f3 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:21:25 -0700 Subject: [PATCH 46/62] xml --- examples/dxdemos/d3d8.c | 4 ++-- examples/dxdemos/d3d9.c | 4 ++-- include/Mw/Widget/D3D8.h | 8 ++++---- include/Mw/Widget/D3D9.h | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c index 2ef08a38..c5d65d90 100644 --- a/examples/dxdemos/d3d8.c +++ b/examples/dxdemos/d3d8.c @@ -47,8 +47,8 @@ int main() { d3d8 = MwCreateWidget(MwD3D8Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirectXGetD3D8(d3d8); - d3ddev = MwDirectXGetD3Dev8(d3d8); + d3d = MwD3D8GetD3D(d3d8); + d3ddev = MwD3D8GetD3Dev(d3d8); // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = diff --git a/examples/dxdemos/d3d9.c b/examples/dxdemos/d3d9.c index 9fe685c3..86186ae8 100644 --- a/examples/dxdemos/d3d9.c +++ b/examples/dxdemos/d3d9.c @@ -48,8 +48,8 @@ int main() { d3d8 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirectXGetD3D9(d3d8); - d3ddev = MwDirectXGetD3Dev9(d3d8); + d3d = MwD3D9GetD3D(d3d8); + d3ddev = MwD3D9GetD3Dev(d3d8); // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h index ee1bf052..9b0ae6eb 100644 --- a/include/Mw/Widget/D3D8.h +++ b/include/Mw/Widget/D3D8.h @@ -39,22 +39,22 @@ extern "C" { #endif #ifdef MW_DIRECTX8 -MwInline LPDIRECT3D8 MwDirectXGetD3D8(MwWidget handle) { +MwInline LPDIRECT3D8 MwD3D8GetD3D(MwWidget handle) { LPDIRECT3D8 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE8 MwDirectXGetD3Dev8(MwWidget handle) { +MwInline LPDIRECT3DDEVICE8 MwD3D8GetD3Dev(MwWidget handle) { LPDIRECT3DDEVICE8 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); return out; }; #else -MwInline void* MwDirectXGetD3D8(MwWidget handle) { +MwInline void* MwD3D8GetD3D(MwWidget handle) { (void)handle; return NULL; }; -MwInline void* MwDirectXGetD3Dev8(MwWidget handle) { +MwInline void* MwD3D8GetD3Dev(MwWidget handle) { (void)handle; return NULL; }; diff --git a/include/Mw/Widget/D3D9.h b/include/Mw/Widget/D3D9.h index e7a7149b..3831301d 100644 --- a/include/Mw/Widget/D3D9.h +++ b/include/Mw/Widget/D3D9.h @@ -38,22 +38,22 @@ extern "C" { #endif #ifdef MW_DIRECTX9 -MwInline LPDIRECT3D9 MwDirectXGetD3D9(MwWidget handle) { +MwInline LPDIRECT3D9 MwD3D9GetD3D(MwWidget handle) { LPDIRECT3D9 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE9 MwDirectXGetD3Dev9(MwWidget handle) { +MwInline LPDIRECT3DDEVICE9 MwD3D9GetD3Dev(MwWidget handle) { LPDIRECT3DDEVICE9 out = NULL; MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); return out; }; #else -MwInline void* MwDirectXGetD3D9(MwWidget handle) { +MwInline void* MwD3D9GetD3D(MwWidget handle) { (void)handle; return NULL; }; -MwInline void* MwDirectXGetD3Dev9(MwWidget handle) { +MwInline void* MwD3D9GetD3Dev(MwWidget handle) { (void)handle; return NULL; }; From fb9919de2a90b87a01a279a999a854d1ab4beef4 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Thu, 17 Sep 2026 22:24:48 -0700 Subject: [PATCH 47/62] oh wait the jenkinsfile can at least use enable-d3d --- Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6d93874c..c688af01 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-directx --enable-vulkan --without-vulkan-string-helper") + sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --enable-vulkan --without-vulkan-string-helper") sh("make -j4") sh("mv src/libMw.so libMw64.so") archiveArtifacts("libMw64.so") @@ -42,7 +42,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=i686-w64-mingw32") + sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=i686-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw32.dll") sh("mv src/libMw.dll.a libMw32.dll.a") @@ -55,7 +55,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-directx --cross --target=Windows --host=x86_64-w64-mingw32") + sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=x86_64-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw64.dll") sh("mv src/libMw.dll.a libMw64.dll.a") From a0da41210a37ef1894715191bf3a95ab20a933f9 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:42:10 +0900 Subject: [PATCH 48/62] Update configure --- configure | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/configure b/configure index a2d0ba61..c4fc7e9b 100755 --- a/configure +++ b/configure @@ -54,10 +54,6 @@ param_set("examples", 1); # (option that only makes sense on x11) param_set("allow-sloppy-focus", 0); -# (option that only makes sense on Windows) -param_set("dxd8", 0); -param_set("dxd9", 0); - my %features = ( "classic-theme" => "use classic theme", "stb-image" => "use stb_image, instead use libjpeg/libpng", @@ -91,6 +87,8 @@ sub def_platform { if($target eq "Windows") { param_set("freetype2", 0); param_set("stb-truetype", 0); + param_set("dxd8", 1); + param_set("dxd9", 1); } elsif($target ne "Darwin" and $target ne "ClassicMacOS" and $target ne "Haiku") { param_set("freetype2", 1); param_set("stb-truetype", 0); From aef5fe03a972e8ef7725d391f4cc273d2c5200ee Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:45:38 +0900 Subject: [PATCH 49/62] Update configure --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index c4fc7e9b..5463444f 100755 --- a/configure +++ b/configure @@ -87,8 +87,8 @@ sub def_platform { if($target eq "Windows") { param_set("freetype2", 0); param_set("stb-truetype", 0); - param_set("dxd8", 1); - param_set("dxd9", 1); + param_set("d3d8", 1); + param_set("d3d9", 1); } elsif($target ne "Darwin" and $target ne "ClassicMacOS" and $target ne "Haiku") { param_set("freetype2", 1); param_set("stb-truetype", 0); From e967523063f21726693ec780ddc94def22412090 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:46:57 +0900 Subject: [PATCH 50/62] Update pl/rules.pl --- pl/rules.pl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pl/rules.pl b/pl/rules.pl index 76ab9b4c..2c1cd247 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -187,10 +187,10 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } -if (param_get("directx8")) { +if (param_get("d3d8")) { add_cflags("-DMW_DIRECTX8"); } -if (param_get("directx9")) { +if (param_get("d3d9")) { add_cflags("-DMW_DIRECTX9"); } @@ -238,11 +238,11 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } -if (param_get("directx8")) { +if (param_get("d3d8")) { new_example("examples/dxdemos/d3d8"); } -if (param_get("directx9")) { +if (param_get("d3d9")) { new_example("examples/dxdemos/d3d9"); } From 12b89aab9b596cd340ca2822893c04795710f537 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Fri, 18 Sep 2026 15:49:44 +0900 Subject: [PATCH 51/62] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c688af01..c506028d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --enable-vulkan --without-vulkan-string-helper") + sh("./configure --enable-opengl --enable-vulkan --without-vulkan-string-helper") sh("make -j4") sh("mv src/libMw.so libMw64.so") archiveArtifacts("libMw64.so") From c5330cc18419f2650050c325bf312522f4fd5228 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:43:15 +0900 Subject: [PATCH 52/62] direct3d9 --- CMakeLists.txt | 29 ++--- NTMakefile | 2 +- WatMakefile | 2 +- configure | 8 +- examples/CMakeLists.txt | 2 +- examples/dxdemos/d3d8.c | 95 ---------------- examples/dxdemos/{d3d9.c => direct3d9.c} | 27 ++--- include/Mw/Widget/D3D8.h | 67 ------------ include/Mw/Widget/{D3D9.h => Direct3D9.h} | 34 ++---- pl/rules.pl | 18 +-- src/widget/d3d8.c | 127 ---------------------- src/widget/{d3d9.c => direct3d9.c} | 59 +++++----- tools/genmk.pl | 30 +---- 13 files changed, 74 insertions(+), 426 deletions(-) delete mode 100644 examples/dxdemos/d3d8.c rename examples/dxdemos/{d3d9.c => direct3d9.c} (90%) delete mode 100644 include/Mw/Widget/D3D8.h rename include/Mw/Widget/{D3D9.h => Direct3D9.h} (53%) delete mode 100644 src/widget/d3d8.c rename src/widget/{d3d9.c => direct3d9.c} (65%) diff --git a/CMakeLists.txt b/CMakeLists.txt index fa1644dc..15cbb11c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,8 +34,9 @@ else() endif() if(${CMAKE_SYSTEM_NAME} MATCHES Windows) - option(MW_TRY_D3D8 "Try to compile D3D8 widget or not" ON) - option(MW_TRY_D3D9 "Try to compile D3D9 widget or not" ON) + option(MW_TRY_DIRECT3D9 "Try to compile Direct3D9 widget or not" ON) +else() + option(MW_TRY_DIRECT3D9 "Try to compile Direct3D9 widget or not" OFF) endif() @@ -96,16 +97,12 @@ if(MW_TRY_VULKAN) endif() endif() -if(MW_TRY_D3D8 OR MW_TRY_D3D9) +if(MW_TRY_DIRECT3D9) include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) if(DIRECTX_FOUND) - if(MW_TRY_D3D8) - set(MW_BUILD_D3D8 ON) - message(STATUS "D3D8 widget has been enabled") - endif() - if(MW_TRY_D3D9) - set(MW_BUILD_D3D9 ON) - message(STATUS "D3D9 widget has been enabled") + if(MW_TRY_DIRECT3D9) + set(MW_BUILD_DIRECT3D9 ON) + message(STATUS "Direct3D9 widget has been enabled") endif() else() message(STATUS "DirectX widgets have been disabled (DirectX not found)") @@ -499,19 +496,11 @@ if(MW_BUILD_VULKAN) endif() endif() -if(MW_BUILD_D3D8) +if(MW_BUILD_DIRECT3D9) target_compile_definitions( Mw PUBLIC - MW_DIRECTX8 - ) -endif() - -if(MW_BUILD_D3D9) - target_compile_definitions( - Mw - PUBLIC - MW_DIRECTX9 + MW_DIRECT3D9 ) endif() diff --git a/NTMakefile b/NTMakefile index f42873ba..a5490157 100644 --- a/NTMakefile +++ b/NTMakefile @@ -14,7 +14,7 @@ LD = link /nologo DX9_FLAGS = !endif -MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) +MW_CFLAGS = /Iinclude /Iexternal\libz\include /D_MILSKO /D_MILSKO_BUILD /DUSE_GDI /DUSE_STB_IMAGE /DSTBI_NO_SIMD /DUSE_GDI_TEXT /DMW_OPENGL $(DX9_FLAGS) MW_LDFLAGS = /DLL EXE_CFLAGS = /Iinclude EXE_LDFLAGS = diff --git a/WatMakefile b/WatMakefile index 02205a74..99334e55 100644 --- a/WatMakefile +++ b/WatMakefile @@ -14,7 +14,7 @@ LD = wlink option quiet DX9_FLAGS = !endif -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX8_FLAGS) $(DX9_FLAGS) +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX9_FLAGS) MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt diff --git a/configure b/configure index 5463444f..025b2656 100755 --- a/configure +++ b/configure @@ -70,8 +70,7 @@ my %features = ( "gnustep" => "use gnustep", "dbus" => "use DBus on supported platform", "allow-sloppy-focus" => "prevent the x11 backend from using XSetInputFocus to enforce click-to-focus", - "directx8" => "(Windows only) build DXD8 widget", - "directx9" => "(Windows only) build DXD9 widget" + "direct3d9" => "(Windows only) build Direct3D9 widget" ); my @features_keys = ( "1classic-theme", "1stb-image", @@ -80,15 +79,14 @@ my @features_keys = ( "1vulkan", "2vulkan-string-helper", "1shared", "1static", "1wayland", "1gnustep", - "1dbus", "1direct8", "1directx9" + "1dbus", "1direct3d9" ); sub def_platform { if($target eq "Windows") { param_set("freetype2", 0); param_set("stb-truetype", 0); - param_set("d3d8", 1); - param_set("d3d9", 1); + param_set("direct3d9", 1); } elsif($target ne "Darwin" and $target ne "ClassicMacOS" and $target ne "Haiku") { param_set("freetype2", 1); param_set("stb-truetype", 0); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 87225f1a..821516f8 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -7,7 +7,7 @@ if(${MW_TRY_VULKAN}) endif() if(WIN32) - if(${MW_TRY_D3D8} OR ${MW_BUILD_D3D8}) + if(${MW_TRY_DIRECT3D9}) add_subdirectory(dxdemos) endif() endif() diff --git a/examples/dxdemos/d3d8.c b/examples/dxdemos/d3d8.c deleted file mode 100644 index c5d65d90..00000000 --- a/examples/dxdemos/d3d8.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Adapted from: - * https://web.archive.org/web/20211126225651/https://www.codeguru.com/multimedia/using-direct3d8-the-basics/ - */ -#include -#include - -#ifdef MW_DIRECTX8 - -MwWidget window, d3d8; -LPDIRECT3D8 d3d; -LPDIRECT3DDEVICE8 d3ddev; -LPDIRECT3DVERTEXBUFFER8 v_buffer; - -struct CUSTOMVERTEX { - FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag - DWORD color; // from the D3DFVF_DIFFUSE flag -}; -#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) - -static void MWAPI draw(MwWidget handle, void* user, void* client) { - // clear the window to a deep blue - d3ddev->lpVtbl->Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); - - d3ddev->lpVtbl->BeginScene(d3ddev); // begins the 3D scene - - // select which vertex format we are using - d3ddev->lpVtbl->SetVertexShader(d3ddev, CUSTOMFVF); - - // select the vertex buffer to display - d3ddev->lpVtbl->SetStreamSource(d3ddev, 0, v_buffer, sizeof(struct CUSTOMVERTEX)); - - // // copy the vertex buffer to the back buffer - d3ddev->lpVtbl->DrawPrimitive(d3ddev, D3DPT_TRIANGLELIST, 0, 1); - - d3ddev->lpVtbl->EndScene(d3ddev); // ends the 3D scene - - d3ddev->lpVtbl->Present(d3ddev, NULL, NULL, NULL, NULL); // displays the created frame -} - -int main() { - BYTE* pVoid; - - MwLibraryInit(); - - window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); - - d3d8 = MwCreateWidget(MwD3D8Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - - d3d = MwD3D8GetD3D(d3d8); - d3ddev = MwD3D8GetD3Dev(d3d8); - - // create three vertices using the CUSTOMVERTEX struct built earlier - struct CUSTOMVERTEX vertices[] = - { - { - 400.0f, - 0.0f, - 0.5f, - 1.0f, - D3DCOLOR_XRGB(0, 0, 255), - }, - { - 800.0f, - 600.0f, - 0.5f, - 1.0f, - D3DCOLOR_XRGB(0, 255, 0), - }, - { - 0.0f, - 600.0f, - 0.5f, - 1.0f, - D3DCOLOR_XRGB(255, 0, 0), - }, - }; - - d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, - 3 * sizeof(struct CUSTOMVERTEX), - 0, - CUSTOMFVF, - D3DPOOL_MANAGED, - &v_buffer); - - v_buffer->lpVtbl->Lock(v_buffer, 0, 0, (BYTE**)&pVoid, 0); // lock the vertex buffer - memcpy(pVoid, vertices, sizeof(vertices)); // copy the vertices to the locked buffer - v_buffer->lpVtbl->Unlock(v_buffer); // unlock the vertex buffer - - MwAddUserHandler(window, MwNtickHandler, draw, NULL); - - MwLoop(window); -} - -#endif diff --git a/examples/dxdemos/d3d9.c b/examples/dxdemos/direct3d9.c similarity index 90% rename from examples/dxdemos/d3d9.c rename to examples/dxdemos/direct3d9.c index 86186ae8..47a26092 100644 --- a/examples/dxdemos/d3d9.c +++ b/examples/dxdemos/direct3d9.c @@ -4,11 +4,9 @@ * http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-4 */ #include -#include +#include -#ifdef MW_DIRECTX9 - -MwWidget window, d3d8; +MwWidget window, d3d9; LPDIRECT3D9 d3d; LPDIRECT3DDEVICE9 d3ddev; LPDIRECT3DVERTEXBUFFER9 v_buffer; @@ -41,16 +39,6 @@ static void MWAPI draw(MwWidget handle, void* user, void* client) { int main() { VOID* pVoid; - - MwLibraryInit(); - - window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); - - d3d8 = MwCreateWidget(MwD3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - - d3d = MwD3D9GetD3D(d3d8); - d3ddev = MwD3D9GetD3Dev(d3d8); - // create three vertices using the CUSTOMVERTEX struct built earlier struct CUSTOMVERTEX vertices[] = { @@ -77,6 +65,15 @@ int main() { }, }; + MwLibraryInit(); + + window = MwCreateWidget(MwWindowClass, NULL, NULL, MwDEFAULT, MwDEFAULT, 1024, 768); + + d3d9 = MwCreateWidget(MwDirect3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); + + d3d = MwDirect3D9GetD3D(d3d9); + d3ddev = MwDirect3D9GetD3DDevice(d3d9); + d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, 3 * sizeof(struct CUSTOMVERTEX), 0, @@ -93,5 +90,3 @@ int main() { MwLoop(window); } - -#endif diff --git a/include/Mw/Widget/D3D8.h b/include/Mw/Widget/D3D8.h deleted file mode 100644 index 9b0ae6eb..00000000 --- a/include/Mw/Widget/D3D8.h +++ /dev/null @@ -1,67 +0,0 @@ -/*! - * @file Mw/Widget/D3D8.h - * @brief D3D8 widget. - * @warning Only avaliable on Windows. - */ -#ifndef __MW_WIDGET_D3D8_H__ -#define __MW_WIDGET_D3D8_H__ - -#include -#include -#include - -#if !defined(MW_D3D8_NO_INCLUDE) - -/* https://github.com/microsoft/Windows-classic-samples/issues/317 */ -#if defined(__MINGW32__) || defined(__MINGW64__) -#define NTDDI_VERSION 0x07000000 -#define _WIN32_WINNT 0x0A00 - -#endif -#endif - -#ifndef _WIN32 -#error D3D8 widget only avaliable for Win32 backends -#undef MW_DIRECTX8 -#else -#ifdef MW_DIRECTX8 -#include -#endif -#endif - -/*! - * @brief D3D8 widget class - */ -MWDECL MwClass MwD3D8Class; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef MW_DIRECTX8 -MwInline LPDIRECT3D8 MwD3D8GetD3D(MwWidget handle) { - LPDIRECT3D8 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3D8", &out, NULL); - return out; -}; -MwInline LPDIRECT3DDEVICE8 MwD3D8GetD3Dev(MwWidget handle) { - LPDIRECT3DDEVICE8 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3Dev8", &out); - return out; -}; -#else -MwInline void* MwD3D8GetD3D(MwWidget handle) { - (void)handle; - return NULL; -}; -MwInline void* MwD3D8GetD3Dev(MwWidget handle) { - (void)handle; - return NULL; -}; -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/Mw/Widget/D3D9.h b/include/Mw/Widget/Direct3D9.h similarity index 53% rename from include/Mw/Widget/D3D9.h rename to include/Mw/Widget/Direct3D9.h index 3831301d..f31e2474 100644 --- a/include/Mw/Widget/D3D9.h +++ b/include/Mw/Widget/Direct3D9.h @@ -3,61 +3,51 @@ * @brief DirectX widget. * @warning Only avaliable on Windows. */ -#ifndef __MW_WIDGET_D3D9_H__ -#define __MW_WIDGET_D3D9_H__ +#ifndef __MW_WIDGET_DIRECT3D9_H__ +#define __MW_WIDGET_DIRECT3D9_H__ #include #include #include -#if !defined(MW_D3D9_NO_INCLUDE) +#if !defined(MW_DIRECT3D9_NO_INCLUDE) /* https://github.com/microsoft/Windows-classic-samples/issues/317 */ #if defined(__MINGW32__) || defined(__MINGW64__) +#undef NTDDI_VERSION +#undef _WIN32_WINNT + #define NTDDI_VERSION 0x07000000 #define _WIN32_WINNT 0x0A00 #endif #ifndef _WIN32 #error D3D9 widget only avaliable for Win32 backends -#undef MW_DIRECTX9 +#undef MW_DIRECT3D9 #else -#ifdef MW_DIRECTX9 #include #endif #endif -#endif /*! * @brief D3D9 widget class */ -MWDECL MwClass MwD3D9Class; +MWDECL MwClass MwDirect3D9Class; #ifdef __cplusplus extern "C" { #endif -#ifdef MW_DIRECTX9 -MwInline LPDIRECT3D9 MwD3D9GetD3D(MwWidget handle) { +MwInline LPDIRECT3D9 MwDirect3D9GetD3D(MwWidget handle) { LPDIRECT3D9 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3D9", &out, NULL); + MwVaWidgetExecute(handle, "mwDirect3D9GetD3D9", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE9 MwD3D9GetD3Dev(MwWidget handle) { +MwInline LPDIRECT3DDEVICE9 MwDirect3D9GetD3DDevice(MwWidget handle) { LPDIRECT3DDEVICE9 out = NULL; - MwVaWidgetExecute(handle, "mwDirectXGetD3Dev9", &out); + MwVaWidgetExecute(handle, "mwDirect3D9GetD3DDevice9", &out); return out; }; -#else -MwInline void* MwD3D9GetD3D(MwWidget handle) { - (void)handle; - return NULL; -}; -MwInline void* MwD3D9GetD3Dev(MwWidget handle) { - (void)handle; - return NULL; -}; -#endif #ifdef __cplusplus } diff --git a/pl/rules.pl b/pl/rules.pl index 2c1cd247..276eb887 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -178,8 +178,7 @@ new_object("src/widget/window.c"); new_object("src/widget/opengl.c"); new_object("src/widget/vulkan.c"); -new_object("src/widget/d3d8.c"); -new_object("src/widget/d3d9.c"); +new_object("src/widget/direct3d9.c"); if (param_get("opengl")) { add_cflags("-DMW_OPENGL"); @@ -187,11 +186,8 @@ if (param_get("opengl")) { if (param_get("vulkan")) { add_cflags("-DMW_VULKAN"); } -if (param_get("d3d8")) { - add_cflags("-DMW_DIRECTX8"); -} -if (param_get("d3d9")) { - add_cflags("-DMW_DIRECTX9"); +if (param_get("direct3d9")) { + add_cflags("-DMW_DIRECT3D9"); } new_object("src/dialog/*.c"); @@ -238,12 +234,8 @@ if (param_get("vulkan")) { new_example("examples/vkdemos/vulkan"); } -if (param_get("d3d8")) { - new_example("examples/dxdemos/d3d8"); -} - -if (param_get("d3d9")) { - new_example("examples/dxdemos/d3d9"); +if (param_get("direct3d9")) { + new_example("examples/dxdemos/direct3d9"); } 1; diff --git a/src/widget/d3d8.c b/src/widget/d3d8.c deleted file mode 100644 index d569f530..00000000 --- a/src/widget/d3d8.c +++ /dev/null @@ -1,127 +0,0 @@ -#include - -#ifdef MW_DIRECTX8 -#include -typedef struct gdid3d8 { - void* d3d8dll; - IDirect3D8* (*Direct3DCreate8)(UINT sdk_version); - - LPDIRECT3D8 d3d; // the pointer to our Direct3D interface - LPDIRECT3DDEVICE8 d3ddev; // the pointer to the device class\ - -} gdid3d8_t; - -static int wcreate_d3d8(MwWidget handle) { - void* r = NULL; - MwWidget w = handle; - gdid3d8_t* o = malloc(sizeof(gdid3d8_t)); - D3DPRESENT_PARAMETERS d3dpp; - D3DDISPLAYMODE dispMode; - HRESULT hr; - char errbuf[2048] = {0}; - - o->d3d8dll = LoadLibrary("d3d8.dll"); - if(!o->d3d8dll) { - MwDispatchError(1, "d3d8.dll not found! Is DirectX8 installed?"); - return 1; - } - o->Direct3DCreate8 = (void*)GetProcAddress(o->d3d8dll, "Direct3DCreate8"); - if(!o->Direct3DCreate8) { - MwDispatchError(1, "Direct3DCreate8 not found! Is DirectX8 installed properly?"); - return 1; - } - - o->d3d = o->Direct3DCreate8(D3D_SDK_VERSION); - if(!o->Direct3DCreate8) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "Direct3DCreate8 NULL: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - hr = o->d3d->lpVtbl->GetAdapterDisplayMode(o->d3d, D3DADAPTER_DEFAULT, &dispMode); - if(hr != D3D_OK) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "GetAdapterDisplayMode ERROR: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - ZeroMemory(&d3dpp, sizeof(d3dpp)); - d3dpp.Windowed = TRUE; - d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; - d3dpp.hDeviceWindow = handle->lowlevel->gdi.hWnd; - d3dpp.BackBufferFormat = dispMode.Format; - d3dpp.EnableAutoDepthStencil = TRUE; - d3dpp.AutoDepthStencilFormat = D3DFMT_D16; - - // create a device class using this information and information from the d3dpp stuct - o->d3d->lpVtbl->CreateDevice(o->d3d, - D3DADAPTER_DEFAULT, - D3DDEVTYPE_HAL, - handle->lowlevel->gdi.hWnd, - D3DCREATE_MIXED_VERTEXPROCESSING, - &d3dpp, - &o->d3ddev); - if(hr != D3D_OK) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "CreateDevice ERROR: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - o->d3ddev->lpVtbl->SetRenderState(o->d3ddev, D3DRS_LIGHTING, FALSE); - if(hr != D3D_OK) { - MwStringPrintIntoBuffer(errbuf, sizeof(errbuf) - 1, "SetRenderState ERROR: %s", hr); - MwDispatchError(1, errbuf); - return 1; - } - - handle->internal = o; - - return 0; -} - -static void destroy_d3d8(MwWidget handle) { - MwWidget w = handle; - gdid3d8_t* o = handle->internal; - - o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device - o->d3d->lpVtbl->Release(o->d3d); // close and release Direct3D - - free(handle->internal); -} - -static void func_handler_d3d8(MwWidget handle, const char* name, void* out, - va_list va) { - gdid3d8_t* o = handle->internal; - - if(strcmp(name, "mwDirectXGetD3D8") == 0) { - *(LPDIRECT3D8*)out = o->d3d; - } - if(strcmp(name, "mwDirectXGetD3Dev8") == 0) { - *(LPDIRECT3DDEVICE8*)out = o->d3ddev; - } -} - -MwClassRec MwDX8ClassRec = {wcreate_d3d8, /* create */ - destroy_d3d8, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - func_handler_d3d8, /* execute */ - NULL, /* tick */ - NULL, /* resize */ - NULL, /* children_update */ - NULL, /* children_prop_change */ - NULL, /* clipboard */ - NULL, /* props_change */ - NULL, NULL, NULL}; -MwClass MwD3D8Class = &MwDX8ClassRec; -#else -MWDECL MwClass MwDX8Class; - -MwClass MwDX8Class = NULL; -#endif diff --git a/src/widget/d3d9.c b/src/widget/direct3d9.c similarity index 65% rename from src/widget/d3d9.c rename to src/widget/direct3d9.c index 7219e58a..da77041f 100644 --- a/src/widget/d3d9.c +++ b/src/widget/direct3d9.c @@ -1,19 +1,17 @@ #include -#ifdef MW_DIRECTX9 -#include +#ifdef MW_DIRECT3D9 +#include typedef struct gdid3d9 { void* d3d9dll; IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); LPDIRECT3D9 d3d; // the pointer to our Direct3D interface - LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class\ + LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class } gdid3d9_t; static int wcreate_d3d9(MwWidget handle) { - void* r = NULL; - MwWidget w = handle; gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); HRESULT hr; char errbuf[2048]; @@ -27,7 +25,7 @@ static int wcreate_d3d9(MwWidget handle) { o->Direct3DCreate9 = (void*)GetProcAddress(o->d3d9dll, "Direct3DCreate9"); o->d3d = o->Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface - if(hr != D3D_OK) { + if(o->d3d == NULL) { MwDispatchError(1, "Direct3DCreate9 NULL"); return 1; } @@ -57,7 +55,6 @@ static int wcreate_d3d9(MwWidget handle) { } static void destroy_d3d9(MwWidget handle) { - MwWidget w = handle; gdid3d9_t* o = handle->internal; o->d3ddev->lpVtbl->Release(o->d3ddev); // close and release the 3D device @@ -70,35 +67,35 @@ static void func_handler_d3d9(MwWidget handle, const char* name, void* out, va_list va) { gdid3d9_t* o = handle->internal; - if(strcmp(name, "mwDirectXGetD3D9") == 0) { + (void)va; + + if(strcmp(name, "mwDirect3D9GetD3D9") == 0) { *(LPDIRECT3D9*)out = o->d3d; } - if(strcmp(name, "mwDirectXGetD3Dev9") == 0) { + if(strcmp(name, "mwDirect3D9GetD3DDevice9") == 0) { *(LPDIRECT3DDEVICE9*)out = o->d3ddev; } } -MwClassRec MwDX9ClassRec = {wcreate_d3d9, /* create */ - destroy_d3d9, /* destroy */ - NULL, /* draw */ - NULL, /* click */ - NULL, /* parent_resize */ - NULL, /* prop_change */ - NULL, /* mouse_move */ - NULL, /* mouse_up */ - NULL, /* mouse_down */ - NULL, /* key */ - func_handler_d3d9, /* execute */ - NULL, /* tick */ - NULL, /* resize */ - NULL, /* children_update */ - NULL, /* children_prop_change */ - NULL, /* clipboard */ - NULL, /* props_change */ - NULL, NULL, NULL}; -MwClass MwD3D9Class = &MwDX9ClassRec; +MwClassRec MwDirect3D9ClassRec = {wcreate_d3d9, /* create */ + destroy_d3d9, /* destroy */ + NULL, /* draw */ + NULL, /* click */ + NULL, /* parent_resize */ + NULL, /* prop_change */ + NULL, /* mouse_move */ + NULL, /* mouse_up */ + NULL, /* mouse_down */ + NULL, /* key */ + func_handler_d3d9, /* execute */ + NULL, /* tick */ + NULL, /* resize */ + NULL, /* children_update */ + NULL, /* children_prop_change */ + NULL, /* clipboard */ + NULL, /* props_change */ + NULL, NULL, NULL}; +MwClass MwDirect3D9Class = &MwDirect3D9ClassRec; #else -MWDECL MwClass MwDX9Class; - -MwClass MwDX9Class = NULL; +MwClass MwDirect3D9Class = NULL; #endif diff --git a/tools/genmk.pl b/tools/genmk.pl index 9f45add9..369ed581 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,24 +42,6 @@ sub cobjs { return $r; } - -sub dx8_detect_block { - return <<'EOF'; -!if [where d3d8.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d8.h 2^>nul') do @echo DX8_FLAGS = /DMW_DIRECTX8 /I"%~dpP">dx8flags.mk] -!endif -!else -!if [echo DX8_FLAGS =>dx9flags.mk] -!endif -!endif -!if exist("dx8flags.mk") -!include "dx8flags.mk" -!else -DX8_FLAGS = -!endif -EOF -} - sub dx9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] @@ -100,10 +82,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; - my $dx8_flags = ""; - my $dx8_block = ""; - my $dx9_flags = ""; - my $dx9_block = ""; + my $dx9_flags = ""; + my $dx9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -128,8 +108,6 @@ sub generate { $inc = "/I"; $dll = "/DLL"; - $dx8_flags = "\$(DX8_FLAGS)"; - $dx8_block = dx8_detect_block(); $dx9_flags = "\$(DX9_FLAGS)"; $dx9_block = dx9_detect_block(); } @@ -154,8 +132,6 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx8_flags = "\$(DX8_FLAGS)"; - $dx8_block = dx8_detect_block(); $dx9_flags = "\$(DX9_FLAGS)"; $dx9_block = dx9_detect_block(); } @@ -169,7 +145,7 @@ sub generate { print(OUT "\n"); } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx8_flags} ${dx9_flags}\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); From 83eb8c8dc4291c5529e8654e857c230e53a5c0cf Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:43:56 +0900 Subject: [PATCH 53/62] ok --- NTMakefile | 9 ++++----- WatMakefile | 15 ++++++--------- tools/genmk.pl | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/NTMakefile b/NTMakefile index a5490157..9f8ffe79 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,7 +2,7 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -99,8 +99,7 @@ clean: del /f /q src\widget\checkbox.obj del /f /q src\widget\clock.obj del /f /q src\widget\combobox.obj - del /f /q src\widget\d3d8.obj - del /f /q src\widget\d3d9.obj + del /f /q src\widget\direct3d9.obj del /f /q src\widget\document.obj del /f /q src\widget\entry.obj del /f /q src\widget\frame.obj @@ -358,8 +357,8 @@ examples\gldemos\tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) /Fo$@ examples/gldemos/tripaint.c -src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj - $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\d3d8.obj src\widget\d3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib +src\Mw.dll: external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\direct3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj + $(LD) $(MW_LDFLAGS) /OUT:$@ external\libz\src\adler32.obj external\libz\src\compress.obj external\libz\src\crc32.obj external\libz\src\deflate.obj external\libz\src\gzclose.obj external\libz\src\gzlib.obj external\libz\src\gzread.obj external\libz\src\gzwrite.obj external\libz\src\infback.obj external\libz\src\inffast.obj external\libz\src\inflate.obj external\libz\src\inftrees.obj external\libz\src\trees.obj external\libz\src\uncompr.obj external\libz\src\zutil.obj external\md4c.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\abstract\charset.obj src\abstract\directory.obj src\abstract\dynamic.obj src\abstract\time.obj src\backend\gdi.obj src\color.obj src\core.obj src\cursor\arrow.obj src\cursor\center.obj src\cursor\cross.obj src\cursor\default.obj src\cursor\hand.obj src\cursor\hidden.obj src\cursor\text.obj src\default.obj src\dialog\colorpicker.obj src\dialog\directorychooser.obj src\dialog\filechooser.obj src\dialog\messagebox.obj src\draw.obj src\icon\back.obj src\icon\clock.obj src\icon\computer.obj src\icon\directory.obj src\icon\down.obj src\icon\error.obj src\icon\file.obj src\icon\forward.obj src\icon\info.obj src\icon\left.obj src\icon\news.obj src\icon\note.obj src\icon\right.obj src\icon\search.obj src\icon\up.obj src\icon\warning.obj src\lowlevel.obj src\string.obj src\text\font\boldfont.obj src\text\font\boldmonottf.obj src\text\font\boldttf.obj src\text\font\font.obj src\text\font\monottf.obj src\text\font\ttf.obj src\text\ft2.obj src\text\gdi.obj src\text\stbtt.obj src\text\text.obj src\truetype.obj src\unicode.obj src\widget\box.obj src\widget\button.obj src\widget\calendar.obj src\widget\chart.obj src\widget\checkbox.obj src\widget\clock.obj src\widget\combobox.obj src\widget\direct3d9.obj src\widget\document.obj src\widget\entry.obj src\widget\frame.obj src\widget\image.obj src\widget\label.obj src\widget\listbox.obj src\widget\menu.obj src\widget\numberentry.obj src\widget\opengl.obj src\widget\progressbar.obj src\widget\radiobox.obj src\widget\scrollbar.obj src\widget\separator.obj src\widget\submenu.obj src\widget\subwindow.obj src\widget\tab.obj src\widget\table.obj src\widget\treeview.obj src\widget\viewport.obj src\widget\window.obj opengl32.lib gdi32.lib ole32.lib uuid.lib user32.lib advapi32.lib .c.obj: diff --git a/WatMakefile b/WatMakefile index 99334e55..f8cc4306 100644 --- a/WatMakefile +++ b/WatMakefile @@ -2,7 +2,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] @@ -98,8 +98,7 @@ clean: .SYMBOLIC %erase src/widget/checkbox.obj %erase src/widget/clock.obj %erase src/widget/combobox.obj - %erase src/widget/d3d8.obj - %erase src/widget/d3d9.obj + %erase src/widget/direct3d9.obj %erase src/widget/document.obj %erase src/widget/entry.obj %erase src/widget/frame.obj @@ -357,8 +356,8 @@ examples/gldemos/tripaint.obj: examples/gldemos/tripaint.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/gldemos/tripaint.c -src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/d3d8.obj src/widget/d3d9.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj - $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/d3d8.obj file src/widget/d3d9.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib +src/Mw.dll: external/libz/src/adler32.obj external/libz/src/compress.obj external/libz/src/crc32.obj external/libz/src/deflate.obj external/libz/src/gzclose.obj external/libz/src/gzlib.obj external/libz/src/gzread.obj external/libz/src/gzwrite.obj external/libz/src/infback.obj external/libz/src/inffast.obj external/libz/src/inflate.obj external/libz/src/inftrees.obj external/libz/src/trees.obj external/libz/src/uncompr.obj external/libz/src/zutil.obj external/md4c.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/abstract/charset.obj src/abstract/directory.obj src/abstract/dynamic.obj src/abstract/time.obj src/backend/gdi.obj src/color.obj src/core.obj src/cursor/arrow.obj src/cursor/center.obj src/cursor/cross.obj src/cursor/default.obj src/cursor/hand.obj src/cursor/hidden.obj src/cursor/text.obj src/default.obj src/dialog/colorpicker.obj src/dialog/directorychooser.obj src/dialog/filechooser.obj src/dialog/messagebox.obj src/draw.obj src/icon/back.obj src/icon/clock.obj src/icon/computer.obj src/icon/directory.obj src/icon/down.obj src/icon/error.obj src/icon/file.obj src/icon/forward.obj src/icon/info.obj src/icon/left.obj src/icon/news.obj src/icon/note.obj src/icon/right.obj src/icon/search.obj src/icon/up.obj src/icon/warning.obj src/lowlevel.obj src/string.obj src/text/font/boldfont.obj src/text/font/boldmonottf.obj src/text/font/boldttf.obj src/text/font/font.obj src/text/font/monottf.obj src/text/font/ttf.obj src/text/ft2.obj src/text/gdi.obj src/text/stbtt.obj src/text/text.obj src/truetype.obj src/unicode.obj src/widget/box.obj src/widget/button.obj src/widget/calendar.obj src/widget/chart.obj src/widget/checkbox.obj src/widget/clock.obj src/widget/combobox.obj src/widget/direct3d9.obj src/widget/document.obj src/widget/entry.obj src/widget/frame.obj src/widget/image.obj src/widget/label.obj src/widget/listbox.obj src/widget/menu.obj src/widget/numberentry.obj src/widget/opengl.obj src/widget/progressbar.obj src/widget/radiobox.obj src/widget/scrollbar.obj src/widget/separator.obj src/widget/submenu.obj src/widget/subwindow.obj src/widget/tab.obj src/widget/table.obj src/widget/treeview.obj src/widget/viewport.obj src/widget/window.obj + $(LD) $(MW_LDFLAGS) option implib=src/Mw.lib name $@ file external/libz/src/adler32.obj file external/libz/src/compress.obj file external/libz/src/crc32.obj file external/libz/src/deflate.obj file external/libz/src/gzclose.obj file external/libz/src/gzlib.obj file external/libz/src/gzread.obj file external/libz/src/gzwrite.obj file external/libz/src/infback.obj file external/libz/src/inffast.obj file external/libz/src/inflate.obj file external/libz/src/inftrees.obj file external/libz/src/trees.obj file external/libz/src/uncompr.obj file external/libz/src/zutil.obj file external/md4c.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/abstract/charset.obj file src/abstract/directory.obj file src/abstract/dynamic.obj file src/abstract/time.obj file src/backend/gdi.obj file src/color.obj file src/core.obj file src/cursor/arrow.obj file src/cursor/center.obj file src/cursor/cross.obj file src/cursor/default.obj file src/cursor/hand.obj file src/cursor/hidden.obj file src/cursor/text.obj file src/default.obj file src/dialog/colorpicker.obj file src/dialog/directorychooser.obj file src/dialog/filechooser.obj file src/dialog/messagebox.obj file src/draw.obj file src/icon/back.obj file src/icon/clock.obj file src/icon/computer.obj file src/icon/directory.obj file src/icon/down.obj file src/icon/error.obj file src/icon/file.obj file src/icon/forward.obj file src/icon/info.obj file src/icon/left.obj file src/icon/news.obj file src/icon/note.obj file src/icon/right.obj file src/icon/search.obj file src/icon/up.obj file src/icon/warning.obj file src/lowlevel.obj file src/string.obj file src/text/font/boldfont.obj file src/text/font/boldmonottf.obj file src/text/font/boldttf.obj file src/text/font/font.obj file src/text/font/monottf.obj file src/text/font/ttf.obj file src/text/ft2.obj file src/text/gdi.obj file src/text/stbtt.obj file src/text/text.obj file src/truetype.obj file src/unicode.obj file src/widget/box.obj file src/widget/button.obj file src/widget/calendar.obj file src/widget/chart.obj file src/widget/checkbox.obj file src/widget/clock.obj file src/widget/combobox.obj file src/widget/direct3d9.obj file src/widget/document.obj file src/widget/entry.obj file src/widget/frame.obj file src/widget/image.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/menu.obj file src/widget/numberentry.obj file src/widget/opengl.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/widget/scrollbar.obj file src/widget/separator.obj file src/widget/submenu.obj file src/widget/subwindow.obj file src/widget/tab.obj file src/widget/table.obj file src/widget/treeview.obj file src/widget/viewport.obj file src/widget/window.obj library clib3r.lib library opengl32.lib library gdi32.lib library ole32.lib library uuid.lib library user32.lib library advapi32.lib @@ -514,10 +513,8 @@ src/widget/clock.obj: src/widget/clock.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/clock.c src/widget/combobox.obj: src/widget/combobox.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/combobox.c -src/widget/d3d8.obj: src/widget/d3d8.c - $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d8.c -src/widget/d3d9.obj: src/widget/d3d9.c - $(CC) $(MW_CFLAGS) -fo=$@ src/widget/d3d9.c +src/widget/direct3d9.obj: src/widget/direct3d9.c + $(CC) $(MW_CFLAGS) -fo=$@ src/widget/direct3d9.c src/widget/document.obj: src/widget/document.c $(CC) $(MW_CFLAGS) -fo=$@ src/widget/document.c src/widget/entry.obj: src/widget/entry.c diff --git a/tools/genmk.pl b/tools/genmk.pl index 369ed581..95297708 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -45,7 +45,7 @@ sub cobjs { sub dx9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECTX9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] !endif !else !if [echo DX9_FLAGS =>dx9flags.mk] From ec45c8828d8d6a7b6d42ce4e039149436cac5158 Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:47:13 +0900 Subject: [PATCH 54/62] rename --- examples/dxdemos/direct3d9.c | 4 ++-- include/Mw/Widget/Direct3D9.h | 8 ++++---- src/widget/direct3d9.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/dxdemos/direct3d9.c b/examples/dxdemos/direct3d9.c index 47a26092..368d6186 100644 --- a/examples/dxdemos/direct3d9.c +++ b/examples/dxdemos/direct3d9.c @@ -71,8 +71,8 @@ int main() { d3d9 = MwCreateWidget(MwDirect3D9Class, NULL, window, (1024 - 800) / 2, (768 - 600) / 2, 800, 600); - d3d = MwDirect3D9GetD3D(d3d9); - d3ddev = MwDirect3D9GetD3DDevice(d3d9); + d3d = MwDirect3D9GetDirect3D9(d3d9); + d3ddev = MwDirect3D9GetDirect3DDevice9(d3d9); d3ddev->lpVtbl->CreateVertexBuffer(d3ddev, 3 * sizeof(struct CUSTOMVERTEX), diff --git a/include/Mw/Widget/Direct3D9.h b/include/Mw/Widget/Direct3D9.h index f31e2474..b6904d4d 100644 --- a/include/Mw/Widget/Direct3D9.h +++ b/include/Mw/Widget/Direct3D9.h @@ -38,14 +38,14 @@ MWDECL MwClass MwDirect3D9Class; extern "C" { #endif -MwInline LPDIRECT3D9 MwDirect3D9GetD3D(MwWidget handle) { +MwInline LPDIRECT3D9 MwDirect3D9GetDirect3D9(MwWidget handle) { LPDIRECT3D9 out = NULL; - MwVaWidgetExecute(handle, "mwDirect3D9GetD3D9", &out, NULL); + MwVaWidgetExecute(handle, "mwDirect3D9GetDirect3D9", &out, NULL); return out; }; -MwInline LPDIRECT3DDEVICE9 MwDirect3D9GetD3DDevice(MwWidget handle) { +MwInline LPDIRECT3DDEVICE9 MwDirect3D9GetDirect3DDevice9(MwWidget handle) { LPDIRECT3DDEVICE9 out = NULL; - MwVaWidgetExecute(handle, "mwDirect3D9GetD3DDevice9", &out); + MwVaWidgetExecute(handle, "mwDirect3D9GetDirect3DDevice9", &out); return out; }; diff --git a/src/widget/direct3d9.c b/src/widget/direct3d9.c index da77041f..41347861 100644 --- a/src/widget/direct3d9.c +++ b/src/widget/direct3d9.c @@ -69,10 +69,10 @@ static void func_handler_d3d9(MwWidget handle, const char* name, void* out, (void)va; - if(strcmp(name, "mwDirect3D9GetD3D9") == 0) { + if(strcmp(name, "mwDirect3D9GetDirect3D9") == 0) { *(LPDIRECT3D9*)out = o->d3d; } - if(strcmp(name, "mwDirect3D9GetD3DDevice9") == 0) { + if(strcmp(name, "mwDirect3D9GetDirect3DDevice9") == 0) { *(LPDIRECT3DDEVICE9*)out = o->d3ddev; } } From 7f361b9d15919e07c4186d7e231b315977543b7f Mon Sep 17 00:00:00 2001 From: Nishi Date: Fri, 18 Sep 2026 16:49:06 +0900 Subject: [PATCH 55/62] correct names --- NTMakefile | 10 +++++----- WatMakefile | 10 +++++----- tools/genmk.pl | 32 ++++++++++++++++---------------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/NTMakefile b/NTMakefile index 9f8ffe79..03839743 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,14 +2,14 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else -!if [echo DX9_FLAGS =>dx9flags.mk] +!if [echo DX9_FLAGS =>d3d9flags.mk] !endif !endif -!if exist("dx9flags.mk") -!include "dx9flags.mk" +!if exist("d3d9flags.mk") +!include "d3d9flags.mk" !else DX9_FLAGS = !endif @@ -122,7 +122,7 @@ clean: del /f /q src\widget\window.obj del /f /q src\Mw.dll del /f /q src\Mw.lib - del /f /q dx9flags.mk + del /f /q d3d9flags.mk del /f /q examples\basic\box.obj del /f /q examples\basic\calculator.obj del /f /q examples\basic\checkbox.obj diff --git a/WatMakefile b/WatMakefile index f8cc4306..07029477 100644 --- a/WatMakefile +++ b/WatMakefile @@ -2,14 +2,14 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else -!if [echo DX9_FLAGS =>dx9flags.mk] +!if [echo DX9_FLAGS =>d3d9flags.mk] !endif !endif -!if exist("dx9flags.mk") -!include "dx9flags.mk" +!if exist("d3d9flags.mk") +!include "d3d9flags.mk" !else DX9_FLAGS = !endif @@ -121,7 +121,7 @@ clean: .SYMBOLIC %erase src/widget/window.obj %erase src/Mw.dll %erase src/Mw.lib - %erase dx9flags.mk + %erase d3d9flags.mk %erase examples/basic/box.obj %erase examples/basic/calculator.obj %erase examples/basic/checkbox.obj diff --git a/tools/genmk.pl b/tools/genmk.pl index 95297708..e8c76959 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -42,17 +42,17 @@ sub cobjs { return $r; } -sub dx9_detect_block { +sub d3d9_detect_block { return <<'EOF'; !if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">dx9flags.mk] +!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else -!if [echo DX9_FLAGS =>dx9flags.mk] +!if [echo DX9_FLAGS =>d3d9flags.mk] !endif !endif -!if exist("dx9flags.mk") -!include "dx9flags.mk" +!if exist("d3d9flags.mk") +!include "d3d9flags.mk" !else DX9_FLAGS = !endif @@ -82,8 +82,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; - my $dx9_flags = ""; - my $dx9_block = ""; + my $d3d9_flags = ""; + my $d3d9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -108,8 +108,8 @@ sub generate { $inc = "/I"; $dll = "/DLL"; - $dx9_flags = "\$(DX9_FLAGS)"; - $dx9_block = dx9_detect_block(); + $d3d9_flags = "\$(DX9_FLAGS)"; + $d3d9_block = d3d9_detect_block(); } elsif ($type eq "Watcom") { $cc = "wcc386 -bt=nt -q"; @@ -132,20 +132,20 @@ sub generate { $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - $dx9_flags = "\$(DX9_FLAGS)"; - $dx9_block = dx9_detect_block(); + $d3d9_flags = "\$(DX9_FLAGS)"; + $d3d9_block = d3d9_detect_block(); } open(OUT, ">", $output); print(OUT "CC = $cc\n"); print(OUT "LD = $link\n"); print(OUT "\n"); - if ($dx9_block ne "") { - print(OUT $dx9_block); + if ($d3d9_block ne "") { + print(OUT $d3d9_block); print(OUT "\n"); } print(OUT -"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${dx9_flags}\n" +"MW_CFLAGS = ${cdll} ${inc}include ${inc}external${dir}libz${dir}include ${def}_MILSKO ${def}_MILSKO_BUILD ${def}USE_GDI ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD ${def}USE_GDI_TEXT ${def}MW_OPENGL ${d3d9_flags}\n" ); print(OUT "MW_LDFLAGS = $dll\n"); print(OUT "EXE_CFLAGS = ${inc}include\n"); @@ -181,8 +181,8 @@ sub generate { } print(OUT " $del src${dir}Mw.dll\n"); print(OUT " $del src${dir}Mw.lib\n"); - if ($dx9_block ne "") { - print(OUT " $del dx9flags.mk\n"); + if ($d3d9_block ne "") { + print(OUT " $del d3d9flags.mk\n"); } foreach my $f (@examples) { my $b = $f; From e7dc38175f2243848906b418ed42eea95d488f14 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Sat, 19 Sep 2026 01:58:40 +0900 Subject: [PATCH 56/62] experiment with cmake not trying to find directx --- CMakeLists.txt | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15cbb11c..82d8a0e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,15 +98,8 @@ if(MW_TRY_VULKAN) endif() if(MW_TRY_DIRECT3D9) - include(${CMAKE_CURRENT_SOURCE_DIR}/resource/FindDirectX.cmake) - if(DIRECTX_FOUND) - if(MW_TRY_DIRECT3D9) - set(MW_BUILD_DIRECT3D9 ON) - message(STATUS "Direct3D9 widget has been enabled") - endif() - else() - message(STATUS "DirectX widgets have been disabled (DirectX not found)") - endif() + set(MW_BUILD_DIRECT3D9 ON) + message(STATUS "Direct3D9 widget has been enabled") endif() if(MW_BUILD_STATIC) From 21911dd899e5450b71475b8dde64125ceccbb361 Mon Sep 17 00:00:00 2001 From: IoI_xD Date: Sat, 19 Sep 2026 02:00:27 +0900 Subject: [PATCH 57/62] Update examples/dxdemos/CMakeLists.txt --- examples/dxdemos/CMakeLists.txt | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/examples/dxdemos/CMakeLists.txt b/examples/dxdemos/CMakeLists.txt index aa09d638..15316514 100644 --- a/examples/dxdemos/CMakeLists.txt +++ b/examples/dxdemos/CMakeLists.txt @@ -3,21 +3,13 @@ file( EXAMPLES_DIRECTX_SOURCES *.c ) -include(${CMAKE_CURRENT_SOURCE_DIR}/../../resource/FindDirectX.cmake) -if(${DIRECTX_FOUND}) - foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) - get_filename_component(TARGET ${PATH} NAME_WE) - add_executable(${TARGET} ${PATH}) - target_include_directories( - ${TARGET} - PRIVATE - ${DIRECTX_INCLUDE_DIRS} - ) - target_link_libraries( -${TARGET} -PRIVATE -Mw -) - endforeach() -endif() +foreach(PATH IN LISTS EXAMPLES_DIRECTX_SOURCES) + get_filename_component(TARGET ${PATH} NAME_WE) + add_executable(${TARGET} ${PATH}) + target_link_libraries( + ${TARGET} + PRIVATE + Mw + ) +endforeach() From dfa8c22f1a4453e76e9ff966a49fcf0c10a16f65 Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 10:27:37 +0900 Subject: [PATCH 58/62] fix --- NTMakefile | 4 ++-- WatMakefile | 16 +--------------- tools/genmk.pl | 7 ++----- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/NTMakefile b/NTMakefile index 03839743..6712a8b2 100644 --- a/NTMakefile +++ b/NTMakefile @@ -1,8 +1,8 @@ CC = cl /TC /c /nologo LD = link /nologo -!if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] diff --git a/WatMakefile b/WatMakefile index 07029477..04a48b8e 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,20 +1,7 @@ CC = wcc386 -bt=nt -q LD = wlink option quiet -!if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] -!endif -!else -!if [echo DX9_FLAGS =>d3d9flags.mk] -!endif -!endif -!if exist("d3d9flags.mk") -!include "d3d9flags.mk" -!else -DX9_FLAGS = -!endif - -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL $(DX9_FLAGS) +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt @@ -121,7 +108,6 @@ clean: .SYMBOLIC %erase src/widget/window.obj %erase src/Mw.dll %erase src/Mw.lib - %erase d3d9flags.mk %erase examples/basic/box.obj %erase examples/basic/calculator.obj %erase examples/basic/checkbox.obj diff --git a/tools/genmk.pl b/tools/genmk.pl index e8c76959..ee4822ab 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -44,8 +44,8 @@ sub cobjs { sub d3d9_detect_block { return <<'EOF'; -!if [where d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] @@ -131,9 +131,6 @@ sub generate { $prefobj = "file "; $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; - - $d3d9_flags = "\$(DX9_FLAGS)"; - $d3d9_block = d3d9_detect_block(); } open(OUT, ">", $output); From 9bdd80b42188ab22017ee077f50142a39329f082 Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 10:57:31 +0900 Subject: [PATCH 59/62] fix watcom --- WatMakefile | 16 +++++++++++---- include/Mw/Widget/Direct3D9.h | 3 +++ src/widget/direct3d9.c | 6 +++++- tools/genmk.pl | 38 ++++++++++++++++++++++++++++++++--- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/WatMakefile b/WatMakefile index 04a48b8e..8873675a 100644 --- a/WatMakefile +++ b/WatMakefile @@ -1,13 +1,13 @@ -CC = wcc386 -bt=nt -q +CC = wcc386 -bt=nt -q -fr LD = wlink option quiet -MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL +MW_CFLAGS = -bd -i=include -i=external/libz/include -d_MILSKO -d_MILSKO_BUILD -dUSE_GDI -dUSE_STB_IMAGE -dSTBI_NO_SIMD -dUSE_GDI_TEXT -dMW_OPENGL -dMW_DIRECT3D9 MW_LDFLAGS = system nt_dll EXE_CFLAGS = -i=include EXE_LDFLAGS = system nt -all: src/Mw.dll examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe +all: src/Mw.dll examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/dxdemos/direct3d9.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe lib: src/Mw.dll -examples: examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe +examples: examples/basic/box.exe examples/basic/calculator.exe examples/basic/checkbox.exe examples/basic/clipboard.exe examples/basic/colorpicker.exe examples/basic/combobox.exe examples/basic/dnd.exe examples/basic/document.exe examples/basic/example.exe examples/basic/filechooser.exe examples/basic/image.exe examples/basic/listbox.exe examples/basic/messagebox.exe examples/basic/periodic.exe examples/basic/progressbar.exe examples/basic/radiobox.exe examples/basic/rotate.exe examples/basic/scrollbar.exe examples/basic/sevensegment.exe examples/basic/subwindow.exe examples/basic/tab.exe examples/basic/treeview.exe examples/basic/viewport.exe examples/dxdemos/direct3d9.exe examples/gldemos/boing.exe examples/gldemos/clock.exe examples/gldemos/cube.exe examples/gldemos/gears.exe examples/gldemos/triangle.exe examples/gldemos/tripaint.exe clean: .SYMBOLIC %erase external/libz/src/adler32.obj %erase external/libz/src/compress.obj @@ -131,6 +131,7 @@ clean: .SYMBOLIC %erase examples/basic/tab.obj %erase examples/basic/treeview.obj %erase examples/basic/viewport.obj + %erase examples/dxdemos/direct3d9.obj %erase examples/gldemos/boing.obj %erase examples/gldemos/clock.obj %erase examples/gldemos/cube.obj @@ -160,6 +161,7 @@ clean: .SYMBOLIC %erase examples/basic/tab.exe %erase examples/basic/treeview.exe %erase examples/basic/viewport.exe + %erase examples/dxdemos/direct3d9.exe %erase examples/gldemos/boing.exe %erase examples/gldemos/clock.exe %erase examples/gldemos/cube.exe @@ -305,6 +307,12 @@ examples/basic/viewport.exe: examples/basic/viewport.obj src/Mw.dll examples/basic/viewport.obj: examples/basic/viewport.c $(CC) $(EXE_CFLAGS) -fo=$@ examples/basic/viewport.c +examples/dxdemos/direct3d9.exe: examples/dxdemos/direct3d9.obj src/Mw.dll + $(LD) $(EXE_LDFLAGS) name $@ file examples/dxdemos/direct3d9.obj library clib3r.lib library src/Mw.lib + +examples/dxdemos/direct3d9.obj: examples/dxdemos/direct3d9.c + $(CC) $(EXE_CFLAGS) -fo=$@ examples/dxdemos/direct3d9.c + examples/gldemos/boing.exe: examples/gldemos/boing.obj src/Mw.dll $(LD) $(EXE_LDFLAGS) name $@ file examples/gldemos/boing.obj library clib3r.lib library src/Mw.lib library opengl32.lib library glu32.lib diff --git a/include/Mw/Widget/Direct3D9.h b/include/Mw/Widget/Direct3D9.h index b6904d4d..5715c1b0 100644 --- a/include/Mw/Widget/Direct3D9.h +++ b/include/Mw/Widget/Direct3D9.h @@ -25,6 +25,9 @@ #error D3D9 widget only avaliable for Win32 backends #undef MW_DIRECT3D9 #else +#ifdef __WATCOMC__ +#include +#endif #include #endif #endif diff --git a/src/widget/direct3d9.c b/src/widget/direct3d9.c index 41347861..9c151e7f 100644 --- a/src/widget/direct3d9.c +++ b/src/widget/direct3d9.c @@ -4,13 +4,17 @@ #include typedef struct gdid3d9 { void* d3d9dll; - IDirect3D9* (*Direct3DCreate9)(UINT sdk_version); + IDirect3D9*(D3DAPI* Direct3DCreate9)(UINT sdk_version); LPDIRECT3D9 d3d; // the pointer to our Direct3D interface LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class } gdid3d9_t; +#ifndef D3D_SDK_VERSION +#define D3D_SDK_VERSION 32 +#endif + static int wcreate_d3d9(MwWidget handle) { gdid3d9_t* o = malloc(sizeof(gdid3d9_t)); HRESULT hr; diff --git a/tools/genmk.pl b/tools/genmk.pl index ee4822ab..ba5d40d7 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -59,6 +59,17 @@ DX9_FLAGS = EOF } +sub skip_d3d9 { + my $f = $_[0]; + my $type = $_[1]; + + if (($f =~ /\/dxdemos\//) and not($type eq "Watcom")) { + return 1; + } + + return 0; +} + sub generate { my ($output, $type) = @_; @@ -82,8 +93,8 @@ sub generate { my $lib = ""; my $c_dllout = ""; my $c_dllafter = ""; - my $d3d9_flags = ""; - my $d3d9_block = ""; + my $d3d9_flags = ""; + my $d3d9_block = ""; if ($type eq "Borland") { $cc = "bcc32 -c"; @@ -112,7 +123,7 @@ sub generate { $d3d9_block = d3d9_detect_block(); } elsif ($type eq "Watcom") { - $cc = "wcc386 -bt=nt -q"; + $cc = "wcc386 -bt=nt -q -fr"; $link = "wlink option quiet"; $out = "-fo="; $dllout = "name "; @@ -131,6 +142,8 @@ sub generate { $prefobj = "file "; $needlibs = "${lib}clib3r.lib"; $c_dllout = "option implib=src${dir}Mw.lib"; + + $d3d9_flags = "${def}MW_DIRECT3D9"; } open(OUT, ">", $output); @@ -154,6 +167,9 @@ sub generate { } print(OUT "all: src${dir}Mw.dll"); foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -163,6 +179,9 @@ sub generate { print(OUT "lib: src${dir}Mw.dll\n"); print(OUT "examples:"); foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -171,6 +190,9 @@ sub generate { print(OUT "\n"); print(OUT "clean: $symbolic\n"); foreach my $f (@cfiles) { + if (skip_d3d9($f, $type)) { + next; + } my $b = $f; $b =~ s/\.c$/.obj/; $b =~ s/\//$dir/g; @@ -182,12 +204,18 @@ sub generate { print(OUT " $del d3d9flags.mk\n"); } foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } my $b = $f; $b =~ s/\.c$/.obj/; $b =~ s/\//$dir/g; print(OUT " $del $b\n"); } foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -195,6 +223,9 @@ sub generate { } print(OUT "\n"); foreach my $f (@examples) { + if (skip_d3d9($f, $type)) { + next; + } my $b = $f; $b =~ s/\.c$/.exe/; $b =~ s/\//$dir/g; @@ -256,6 +287,7 @@ push(@cfiles, "src/backend/gdi.c"); scan_examples("examples/basic"); scan_examples("examples/gldemos"); +scan_examples("examples/dxdemos"); @examples = sort(@examples); From 7d2b5a17a4e608f41fc05a6bc93f4ed95785ec3e Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 11:00:33 +0900 Subject: [PATCH 60/62] o --- Jenkinsfile | 4 ++-- src/widget/direct3d9.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c506028d..593d08fc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -42,7 +42,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=i686-w64-mingw32") + sh("./configure --enable-opengl --cross --target=Windows --host=i686-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw32.dll") sh("mv src/libMw.dll.a libMw32.dll.a") @@ -55,7 +55,7 @@ pipeline { } steps { sh("git clean -dfx") - sh("./configure --enable-opengl --enable-d3d9 --enable-d3d8 --cross --target=Windows --host=x86_64-w64-mingw32") + sh("./configure --enable-opengl --cross --target=Windows --host=x86_64-w64-mingw32") sh("make -j4") sh("mv src/Mw.dll Mw64.dll") sh("mv src/libMw.dll.a libMw64.dll.a") diff --git a/src/widget/direct3d9.c b/src/widget/direct3d9.c index 9c151e7f..5d8a9349 100644 --- a/src/widget/direct3d9.c +++ b/src/widget/direct3d9.c @@ -4,7 +4,7 @@ #include typedef struct gdid3d9 { void* d3d9dll; - IDirect3D9*(D3DAPI* Direct3DCreate9)(UINT sdk_version); + IDirect3D9*(WINAPI* Direct3DCreate9)(UINT sdk_version); LPDIRECT3D9 d3d; // the pointer to our Direct3D interface LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class From cdf7657b197f445e02e29c0c345f770585280b4b Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 11:06:13 +0900 Subject: [PATCH 61/62] ok --- NTMakefile | 2 +- configure | 2 +- tools/genmk.pl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NTMakefile b/NTMakefile index 6712a8b2..a0bc3d79 100644 --- a/NTMakefile +++ b/NTMakefile @@ -2,7 +2,7 @@ CC = cl /TC /c /nologo LD = link /nologo !if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] diff --git a/configure b/configure index 025b2656..f84b1ea5 100755 --- a/configure +++ b/configure @@ -246,7 +246,7 @@ print(OUT " clang-format --verbose -i `find tools src include examples \"(\" -name \"*.c\" -or -name \"*.cc\" -or -name \"*.h\" -or -name \"*.m\" \")\" -and -not -name \"*ttf.c\"`\n" ); print(OUT -" perltidy -b -bext=\"/\" --paren-tightness=2 `find tools pl configure -name \"*.pl\"`\n" +" perltidy -b -bext=\"/\" --paren-tightness=2 `find tools pl -name \"*.pl\"` configure\n" ); print(OUT "\n"); print(OUT "lib:"); diff --git a/tools/genmk.pl b/tools/genmk.pl index ba5d40d7..b7993e39 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -45,7 +45,7 @@ sub cobjs { sub d3d9_detect_block { return <<'EOF'; !if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] -!if [for /f "delims=" %P in ('where /R "%DXSDK_DIR%\\Include" d3d9.h 2^>nul') do @echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%~dpP">d3d9flags.mk] +!if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else !if [echo DX9_FLAGS =>d3d9flags.mk] From 4e2c2709082a7f3791dbcd313d65f0c3f2f9eb3d Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 22 Sep 2026 11:09:11 +0900 Subject: [PATCH 62/62] ok --- NTMakefile | 2 +- tools/genmk.pl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NTMakefile b/NTMakefile index a0bc3d79..18fbbda7 100644 --- a/NTMakefile +++ b/NTMakefile @@ -1,7 +1,7 @@ CC = cl /TC /c /nologo LD = link /nologo -!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [where /R "%DXSDK_DIR%\\Include" /Q d3d9.h] == 0 !if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else diff --git a/tools/genmk.pl b/tools/genmk.pl index b7993e39..bc97e84c 100755 --- a/tools/genmk.pl +++ b/tools/genmk.pl @@ -44,7 +44,7 @@ sub cobjs { sub d3d9_detect_block { return <<'EOF'; -!if [where /R "%DXSDK_DIR%\\Include" d3d9.h >nul 2>nul] +!if [where /R "%DXSDK_DIR%\\Include" /Q d3d9.h] == 0 !if [echo DX9_FLAGS = /DMW_DIRECT3D9 /I"%DXSDK_DIR%\\Include">d3d9flags.mk] !endif !else