Skip to content

Commit

Permalink
WIP WindowInfo* , bump SDL version
Browse files Browse the repository at this point in the history
  • Loading branch information
misl6 committed May 12, 2024
1 parent 2b91599 commit 219b472
Show file tree
Hide file tree
Showing 9 changed files with 267 additions and 83 deletions.
1 change: 1 addition & 0 deletions examples/demo/touchtracer/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ def normalize_pressure(self, pressure):

def on_touch_down(self, touch):
win = self.get_parent_window()
print(win._win.get_window_info().window)
ud = touch.ud
ud['group'] = g = str(touch.uid)
pointsize = 5
Expand Down
96 changes: 87 additions & 9 deletions kivy/core/window/_window_sdl2.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,13 @@ from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
if not environ.get('KIVY_DOC_INCLUDE'):
is_desktop = Config.get('kivy', 'desktop') == '1'

IF USE_WAYLAND:
from .window_info cimport WindowInfoWayland

IF USE_X11:
from .window_info cimport WindowInfoX11

IF UNAME_SYSNAME == 'Windows':
from .window_info cimport WindowInfoWindows
from .window_info cimport (
WindowInfoiOS,
WindowInfomacOS,
WindowInfoX11,
WindowInfoWayland,
WindowInfoWindows
)

cdef int _event_filter(void *userdata, SDL_Event *event) with gil:
return (<_WindowSDL2Storage>userdata).cb_event_filter(event)
Expand Down Expand Up @@ -484,7 +483,86 @@ cdef class _WindowSDL2Storage:
Logger.error(f'WindowSDL: Getting opacity failed - {message}')
return 1.0
else:
return opacity
return opacity

def _get_current_video_driver(self):
cdef char *driver = SDL_GetCurrentVideoDriver()
return <str>driver

def _get_window_info_macos(self):
cdef WindowInfomacOS window_info
window_info = WindowInfomacOS()

window_info.set_window(
SDL_GetProperty(
SDL_GetWindowProperties(self.win),
"SDL.window.cocoa.window",
NULL,
)
)

return window_info

def _get_window_info_ios(self):
cdef WindowInfoiOS window_info
window_info = WindowInfoiOS()

window_info.set_window(
SDL_GetProperty(
SDL_GetWindowProperties(self.win),
"SDL.window.uikit.window",
NULL,
)
)

return window_info

def _get_window_info_wayland(self):
cdef WindowInfoWayland window_info
window_info = WindowInfoWayland()

return window_info

def _get_window_info_x11(self):
cdef WindowInfoX11 window_info
window_info = WindowInfoX11()

return window_info

def _get_window_info_windows(self):
cdef WindowInfoWindows window_info
window_info = WindowInfoWindows()

window_info.set_hwnd(
SDL_GetProperty(
SDL_GetWindowProperties(self.win),
"SDL.window.win32.hwnd",
NULL,
)
)
window_info.set_hdc(
SDL_GetProperty(
SDL_GetWindowProperties(self.win),
"SDL.window.win32.hdc",
NULL,
)
)

return window_info

def get_window_info(self):
if platform == "macosx":
return self._get_window_info_macos()
elif platform == "ios":
return self._get_window_info_ios()
elif platform == "win":
return self._get_window_info_windows()
elif platform == "linux":
_video_driver = self._get_current_video_driver()
if _video_driver == "wayland":
return self._get_window_info_wayland()
elif _video_driver == "x11":
return self._get_window_info_x11()

def get_native_handle(self):
# TODO: When we have support on all platforms, or at least on Linux
Expand Down
110 changes: 89 additions & 21 deletions kivy/core/window/window_attrs.pxi
Original file line number Diff line number Diff line change
@@ -1,30 +1,98 @@
include "../../include/config.pxi"

IF USE_WAYLAND:
cdef extern from "wayland-client-protocol.h":
cdef struct wl_display:
pass
cdef extern from *:
"""
#if __USE_WAYLAND
#include <wayland-client-protocol.h>
#else
typedef struct {
} wl_display;
typedef struct {
} wl_surface;
typedef struct {
} wl_shell_surface;
#endif
cdef struct wl_surface:
pass
#if __USE_X11
#include <X11/Xlib.h>
#else
typedef struct {
} _XDisplay;
typedef _XDisplay Display;
typedef int XID;
typedef XID Window;
#endif
cdef struct wl_shell_surface:
pass
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
#include <windows.h>
#else
typedef void *HANDLE;
typedef HANDLE HWND;
typedef HANDLE HDC;
typedef HANDLE HINSTANCE;
#endif
IF USE_X11:
cdef extern from "X11/Xlib.h":
cdef struct _XDisplay:
pass
#if defined(__APPLE__)
#include <TargetConditionals.h>
ctypedef _XDisplay Display
#if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR
// iOS, tvOS, watchOS and iOS Simulator (UIKit)
#include <UIKit/UIWindow.h>
#else
typedef void *UIWindow;
#endif
ctypedef int XID
ctypedef XID Window
#if TARGET_OS_MAC
#include <AppKit/NSWindow.h>
#else
typedef void *NSWindow;
#endif
IF UNAME_SYSNAME == 'Windows':
cdef extern from "windows.h":
ctypedef void *HANDLE
#else
typedef void *UIWindow;
typedef void *NSWindow;
#endif
ctypedef HANDLE HWND
ctypedef HANDLE HDC
ctypedef HANDLE HINSTANCE
#if defined(__ANDROID__)
// Android
#endif
UIWindow *_BridgedUIWindow(void* window){
return (__bridge UIWindow *)window;
}
NSWindow *_BridgedNSWindow(void* window){
return (__bridge NSWindow *)window;
}
"""

# Wayland
ctypedef struct wl_display:
pass
ctypedef struct wl_surface:
pass
ctypedef struct wl_shell_surface:
pass

# X11
ctypedef struct _XDisplay:
pass
ctypedef _XDisplay Display
ctypedef int XID
ctypedef XID Window

# Windows
ctypedef void *HANDLE
ctypedef HANDLE HWND
ctypedef HANDLE HDC
ctypedef HANDLE HINSTANCE

# Apple iOS, tvOS, watchOS and iOS Simulator (UIKit)
ctypedef void *UIWindow

# Apple macOS
ctypedef void *NSWindow
cdef NSWindow* _BridgedNSWindow(void* window)
cdef UIWindow* _BridgedUIWindow(void* window)
33 changes: 20 additions & 13 deletions kivy/core/window/window_info.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,25 @@ include "window_attrs.pxi"

from libc.stdint cimport uintptr_t

IF USE_WAYLAND:
cdef class WindowInfoWayland:
cdef wl_display *display
cdef wl_surface *surface
cdef wl_shell_surface *shell_surface
cdef class WindowInfoWayland:
cdef wl_display *display
cdef wl_surface *surface
cdef wl_shell_surface *shell_surface

IF USE_X11:
cdef class WindowInfoX11:
cdef Display *display
cdef Window window
cdef class WindowInfoX11:
cdef Display *display
cdef Window window

IF UNAME_SYSNAME == 'Windows':
cdef class WindowInfoWindows:
cdef HWND window
cdef HDC hdc
cdef class WindowInfoWindows:
cdef HWND window
cdef HDC hdc
cdef void set_hwnd(self, void* hwnd)
cdef void set_hdc(self, void* hdc)

cdef class WindowInfomacOS:
cdef NSWindow *window
cdef void set_window(self, void* window)

cdef class WindowInfoiOS:
cdef UIWindow *window
cdef void set_window(self, void* window)
89 changes: 55 additions & 34 deletions kivy/core/window/window_info.pyx
Original file line number Diff line number Diff line change
@@ -1,36 +1,57 @@
include "../../include/config.pxi"

IF USE_WAYLAND:
cdef class WindowInfoWayland:
@property
def display(self):
return <uintptr_t>self.display

@property
def surface(self):
return <uintptr_t>self.surface

@property
def shell_surface(self):
return <uintptr_t>self.shell_surface


IF USE_X11:
cdef class WindowInfoX11:
@property
def display(self):
return <uintptr_t>self.display

@property
def window(self):
return <uintptr_t>self.window

IF UNAME_SYSNAME == 'Windows':
cdef class WindowInfoWindows:
@property
def window(self):
return <uintptr_t>self.window

@property
def hdc(self):
return <uintptr_t>self.hdc
cdef class WindowInfoWayland:
@property
def display(self):
return <uintptr_t>self.display

@property
def surface(self):
return <uintptr_t>self.surface

@property
def shell_surface(self):
return <uintptr_t>self.shell_surface


cdef class WindowInfoX11:
@property
def display(self):
return <uintptr_t>self.display

@property
def window(self):
return <uintptr_t>self.window


cdef class WindowInfoWindows:
@property
def window(self):
return <uintptr_t>self.window

@property
def hdc(self):
return <uintptr_t>self.hdc

cdef void set_hwnd(self, void* hwnd):
self.window = hwnd

cdef void set_hdc(self, void* hdc):
self.hdc = hdc


cdef class WindowInfomacOS:
@property
def window(self):
return <uintptr_t>self.window

cdef void set_window(self, void* window):
self.window = _BridgedNSWindow(window)

cdef class WindowInfoiOS:
@property
def window(self):
return <uintptr_t>self.window

cdef void set_window(self, void* window):
self.window = _BridgedUIWindow(window)
4 changes: 1 addition & 3 deletions kivy/lib/sdl2.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -666,7 +666,7 @@ cdef extern from "SDL.h":
cdef int SDL_SetWindowHitTest(SDL_Window *window, SDL_HitTest callback, void *callback_data)
cdef SDL_MetalView SDL_Metal_CreateView(SDL_Window * window)
cdef void* SDL_Metal_GetLayer(SDL_MetalView view)
cdef void SDL_GetProperty(SDL_PropertiesID props, const char *name, void *default_value)
cdef void* SDL_GetProperty(SDL_PropertiesID props, const char *name, void *default_value)
cdef SDL_PropertiesID SDL_GetWindowProperties(SDL_Window *window)
cdef void SDL_free(void *mem)

Expand Down Expand Up @@ -984,5 +984,3 @@ cdef extern from "SDL_mixer.h":
cdef Mix_Chunk * Mix_GetChunk(int channel)
cdef void Mix_CloseAudio()
cdef char * Mix_GetError()

include '../core/window/window_attrs.pxi'
Loading

0 comments on commit 219b472

Please sign in to comment.