From dbc5984dc1360944f4dd15f9d846829fab99f04d Mon Sep 17 00:00:00 2001 From: Leo Prikler Date: Fri, 15 Jan 2021 21:05:43 +0100 Subject: Add support for hints. * sdl2/bindings.scm (SDL_HINT_DEFAULT, SDL_HINT_NORMAL, SDL_HINT_OVERRIDE) (sdl-set-hint-with-priority, sdl-get-hint): New variables. * sdl2/hints.scm: New file. * doc/api.texi: Add Hints. --- Makefile.am | 1 + doc/api.texi | 24 +++++++++ sdl2/bindings.scm | 14 ++++++ sdl2/hints.scm | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+) create mode 100644 sdl2/hints.scm diff --git a/Makefile.am b/Makefile.am index 287a19c..15007a6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -46,6 +46,7 @@ SOURCES = \ sdl2/bindings.scm \ sdl2/blend-mode.scm \ sdl2/clipboard.scm \ + sdl2/hints.scm \ sdl2/rect.scm \ sdl2/surface.scm \ sdl2/render.scm \ diff --git a/doc/api.texi b/doc/api.texi index 3c4e645..288d0a6 100644 --- a/doc/api.texi +++ b/doc/api.texi @@ -10,6 +10,7 @@ * Images:: Loading and saving images. * Sound:: Sound effects and music. * Fonts:: Truetype and bitmap font rendering. +* Hints:: Getting and setting configuration hints. @end menu @node Basics @@ -1648,3 +1649,26 @@ Render @var{text}, a UTF-8 encoded string, using @var{font} and @var{color}, the foreground color, and return a high-quality alpha-blended surface containing the results. @end deffn + +@node Hints +@section Hints + +@example +(use-modules (sdl2 hints)) +@end example + +@deffn {Procedure} get-hint hint +Get the string value of @var{hint} or @code{#f} if if @var{hint} is unset. +@end deffn + +@deffn {Procedure} set-hint! hint value [priority] +Set @var{hint} to @var{value} at priority level @var{priority}. +@var{priority} can be one of the symbols @code{default}, @code{normal} or +@code{override} and defaults to @code{normal}. +@var{value} will automatically be converted to a string if it is a boolean +or a number. +@end deffn + +Inside SDL2, the macro @code{SDL_HINT_SOME_HINT} corresponds to the +environment variable @env{SDL_SOME_HINT}. In Guile-SDL2, this hint would be +represented by the symbol @code{some-symbol.} diff --git a/sdl2/bindings.scm b/sdl2/bindings.scm index a9fa17c..c46af8b 100644 --- a/sdl2/bindings.scm +++ b/sdl2/bindings.scm @@ -1301,3 +1301,17 @@ RETURN-TYPE and accept arguments of ARG-TYPES." (define-foreign sdl-has-clipboard-text int "SDL_HasClipboardText" '()) + +;;; +;;; Hints +;;; + +(define-public SDL_HINT_DEFAULT 0) +(define-public SDL_HINT_NORMAL 1) +(define-public SDL_HINT_OVERRIDE 2) + +(define-foreign sdl-set-hint-with-priority + sdl-bool "SDL_SetHintWithPriority" (list '* '* int)) + +(define-foreign sdl-get-hint + '* "SDL_GetHint" (list '*)) diff --git a/sdl2/hints.scm b/sdl2/hints.scm new file mode 100644 index 0000000..9533e23 --- /dev/null +++ b/sdl2/hints.scm @@ -0,0 +1,142 @@ +;;; guile-sdl2 --- FFI bindings for SDL2 +;;; Copyright © 2021 Leo Prikler +;;; +;;; This file is part of guile-sdl2. +;;; +;;; Guile-sdl2 is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU Lesser General Public License as +;;; published by the Free Software Foundation; either version 3 of the +;;; License, or (at your option) any later version. +;;; +;;; Guile-sdl2 is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU Lesser General Public +;;; License along with guile-sdl2. If not, see +;;; . + +(define-module (sdl2 hints) + #:use-module (ice-9 match) + #:use-module (ice-9 optargs) + #:use-module (srfi srfi-9) + #:use-module (sdl2) + #:use-module ((sdl2 bindings) #:prefix ffi:) + #:use-module (system foreign) + #:export (get-hint set-hint!)) + +(define (symbol->priority sym) + (match sym + ('default ffi:SDL_HINT_DEFAULT) + ('normal ffi:SDL_HINT_NORMAL) + ('override ffi:SDL_HINT_OVERRIDE))) + +(define (symbol->hint sym) + (match sym + ('accelerometer-as-joystick "SDL_ACCELEROMETER_AS_JOYSTICK") + ('allow-topmost "SDL_ALLOW_TOPMOST") + ('android-apk-expansion-main-file-version + "SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION") + ('android-apk-expansion-patch-file-version + "SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION") + ('android-separate-mouse-and-touch + "SDL_ANDROID_SEPARATE_MOUSE_AND_TOUCH") + ('apple-tv-ui-events "SDL_APPLE_TV_UI_EVENTS") + ('apple-tv-remote-allow-rotation + "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION") + ('bmp-save-legacy-format "SDL_BMP_SAVE_LEGACY_FORMAT") + ('display-usable-bounds "SDL_DISPLAY_USABLE_BOUNDS") + ('emscripten-keyboard-element "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT") + ('event-logging "SDL_EVENT_LOGGING") + ('framebuffer-acceleration "SDL_FRAMEBUFFER_ACCELERATION") + ('gamecontroller-ignore-devices "SDL_GAMECONTROLLER_IGNORE_DEVICES") + ('gamecontroller-ignore-devices-except + "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT") + ('gamecontroller-use-button-labels "SDL_GAMECONTROLLER_USE_BUTTON_LABELS") + ('gamecontrollerconfig "SDL_GAMECONTROLLERCONFIG") + ('gamecontrollerconfig-file "SDL_GAMECONTROLLERCONFIG_FILE") + ('gamecontrollertype "SDL_GAMECONTROLLERTYPE") + ('grab-keyboard "SDL_GRAB_KEYBOARD") + ('idle-timer-disabled "SDL_IDLE_TIMER_DISABLED") + ('joystick-allow-background-events "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS") + ('joystick-hidapi "SDL_JOYSTICK_HIDAPI") + ('joystick-hidapi-gamecube "SDL_JOYSTICK_HIDAPI_GAMECUBE") + ('joystick-hidapi-ps4 "SDL_JOYSTICK_HIDAPI_PS4") + ('joystick-hidapi-ps4-rumble "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE") + ('joystick-hidapi-steam "SDL_JOYSTICK_HIDAPI_STEAM") + ('joystick-hidapi-steam-controllers + "SDL_JOYSTICK_HIDAPI_STEAM_CONTROLLERS") + ('joystick-hidapi-switch "SDL_JOYSTICK_HIDAPI_SWITCH") + ('joystick-hidapi-xbox "SDL_JOYSTICK_HIDAPI_XBOX") + ('mac-background-app "SDL_MAC_BACKGROUND_APP") + ('mac-ctrl-click-emulate-right-click + "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK") + ('mouse-double-click-radius "SDL_MOUSE_DOUBLE_CLICK_RADIUS") + ('mouse-focus-clickthrough "SDL_MOUSE_FOCUS_CLICKTHROUGH") + ('mouse-normal-speed-scale "SDL_MOUSE_NORMAL_SPEED_SCALE") + ('mouse-relative-mode-warp "SDL_MOUSE_RELATIVE_MODE_WARP") + ('mouse-relative-speed-scale "SDL_MOUSE_RELATIVE_SPEED_SCALE") + ('mouse-touch-events "SDL_MOUSE_TOUCH_EVENTS") + ('no-signal-handlers "SDL_NO_SIGNAL_HANDLERS") + ('orientations "SDL_ORIENTATIONS") + ('render-batching "SDL_RENDER_BATCHING") + ('render-direct3d11-debug "SDL_RENDER_DIRECT3D11_DEBUG") + ('render-direct3d-threadsafe "SDL_RENDER_DIRECT3D_THREADSAFE") + ('render-driver "SDL_RENDER_DRIVER") + ('render-logical-size-mode "SDL_RENDER_LOGICAL_SIZE_MODE") + ('render-opengl-shaders "SDL_RENDER_OPENGL_SHADERS") + ('render-scale-quality "SDL_RENDER_SCALE_QUALITY") + ('render-vsync "SDL_RENDER_VSYNC") + ('return-key-hides-ime "SDL_RETURN_KEY_HIDES_IME") + ('rpi-video-layer "SDL_RPI_VIDEO_LAYER") + ('qtwayland-content-orientation "SDL_QTWAYLAND_CONTENT_ORIENTATION") + ('qtwayland-window-flags "SDL_QTWAYLAND_WINDOW_FLAGS") + ('thread-stack-size "SDL_THREAD_STACK_SIZE") + ('timer-resolution "SDL_TIMER_RESOLUTION") + ('touch-mouse-events "SDL_TOUCH_MOUSE_EVENTS") + ('video-allow-screensaver "SDL_VIDEO_ALLOW_SCREENSAVER") + ('video-external-context "SDL_VIDEO_EXTERNAL_CONTEXT") + ('video-highdpi-disabled "SDL_VIDEO_HIGHDPI_DISABLED") + ('video-mac-fullscreen-spaces "SDL_VIDEO_MAC_FULLSCREEN_SPACES") + ('video-minimize-on-focus-loss "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS") + ('video-window-share-pixel-format "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT") + ('video-win-d3dcompiler "SDL_VIDEO_WIN_D3DCOMPILER") + ('video-x11-force-egl "SDL_VIDEO_X11_FORCE_EGL") + ('video-x11-net-wm-ping "SDL_VIDEO_X11_NET_WM_PING") + ('video-x11-window-visualid "SDL_VIDEO_X11_WINDOW_VISUALID") + ('video-x11-xinerama "SDL_VIDEO_X11_XINERAMA") + ('video-x11-xrandr "SDL_VIDEO_X11_XRANDR") + ('video-x11-xvidmode "SDL_VIDEO_X11_XVIDMODE") + ('wave-fact-chunk "SDL_WAVE_FACT_CHUNK") + ('wave-riff-chunk-size "SDL_WAVE_RIFF_CHUNK_SIZE") + ('wave-truncation "SDL_WAVE_TRUNCATION") + ('windows-disable-thread-naming "SDL_WINDOWS_DISABLE_THREAD_NAMING") + ('windows-enable-message-loop "SDL_WINDOWS_ENABLE_MESSAGE_LOOP") + ('windows-intresource-icon "SDL_WINDOWS_INTRESOURCE_ICON") + ('windows-intresource-icon-small "SDL_WINDOWS_INTRESOURCE_ICON_SMALL") + ('windows-no-close-on-alt-f4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4") + ('window-frame-usable-while-cursor-hidden + "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN") + ('winrt-handle-back-button "SDL_WINRT_HANDLE_BACK_BUTTON") + ('winrt-privacy-policy-label "SDL_WINRT_PRIVACY_POLICY_LABEL") + ('winrt-privacy-policy-url "SDL_WINRT_PRIVACY_POLICY_URL") + ('xinput-enabled "SDL_XINPUT_ENABLED") + ('xinput-use-old-joystick-mapping "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING"))) + +(define* (get-hint hint) + (let* ((hint* (string->pointer (symbol->hint hint))) + (value* (ffi:sdl-get-hint hint*))) + (and (not (null-pointer? value*)) + (pointer->string value*)))) + +(define* (set-hint! hint value #:optional (priority 'normal)) + (let ((hint* (string->pointer (symbol->hint hint))) + (value* (string->pointer + (match value + (#t "1") + (#f "0") + ((? number? n) (number->string value)) + ((? string? s) s)))) + (priority (symbol->priority priority))) + (= (ffi:sdl-set-hint-with-priority hint* value* priority) 1))) -- cgit v1.2.3