Hi,

attached patch adds gamecontroller support for multimedia/sfml.

My first attempt was to just enable the FreeBSD driver, with that, it detected
my gamepads, however, no buttons, axis, hat, etc. worked.

Then I looked at how the SDLs do it, adapted their logic, and finally, all the 
buttons,
axis, hats now seem to do what they're supposed to.

Tested with witchblast (buttons and hat), and extremetuxracer (analog joystick).
Both games tested with Logitec F310 game controllers. Other ports depending on
sfml don't seem to make use of its joystick/gamecontroller support.

However, witchblast needs a patch (find it attached), otherwise in joystick 
configuration
menu, it would take a button release as a valid input. No idea how it's 
supposed to work
with other OSs joystick implementations from sfml without that patch.

test reports, OKs, critics, anything welcome ;)

cheers,
Sebastian
? XXX
? output
? witchblast-joystick.diff
Index: Makefile
===================================================================
RCS file: /cvs/ports/games/witchblast/Makefile,v
retrieving revision 1.4
diff -u -r1.4 Makefile
--- Makefile	14 Jul 2019 00:39:37 -0000	1.4
+++ Makefile	9 Mar 2020 22:37:35 -0000
@@ -5,7 +5,7 @@
 GH_ACCOUNT =	Cirrus-Minor
 GH_PROJECT =	witchblast
 GH_TAGNAME =	v0.7.5
-REVISION =	1
+REVISION =	2
 
 CATEGORIES =	games x11
 
Index: patches/patch-src_WitchBlastGame_cpp
===================================================================
RCS file: /cvs/ports/games/witchblast/patches/patch-src_WitchBlastGame_cpp,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 patch-src_WitchBlastGame_cpp
--- patches/patch-src_WitchBlastGame_cpp	26 Dec 2017 20:14:34 -0000	1.1.1.1
+++ patches/patch-src_WitchBlastGame_cpp	9 Mar 2020 22:37:35 -0000
@@ -14,3 +14,15 @@
    time_t t = time(0);   // get time now
    struct tm * now = localtime( & t );
  
+@@ -3107,6 +3107,11 @@ void WitchBlastGame::updateMenu()
+         menuState = MenuStateConfig;
+         saveConfigurationToFile();
+         return;
++      }
++
++      // Ignore buttons that get released
++      if (event.type == sf::Event::JoystickButtonReleased) {
++	return;
+       }
+ 
+       // button pressed ?
? diff
? out
? sfml
? sfml-joystick-support.diff
Index: Makefile
===================================================================
RCS file: /cvs/ports/multimedia/sfml/Makefile,v
retrieving revision 1.10
diff -u -r1.10 Makefile
--- Makefile	12 Jul 2019 20:47:58 -0000	1.10
+++ Makefile	9 Mar 2020 22:09:10 -0000
@@ -6,7 +6,7 @@
 DISTNAME =		SFML-${V}-sources
 PKGNAME =		sfml-${V}
 EXTRACT_SUFX =		.zip
-REVISION =		1
+REVISION =		2
 
 SHARED_LIBS +=  sfml-audio                1.0 # 2.1
 SHARED_LIBS +=  sfml-graphics             1.0 # 2.1
@@ -24,7 +24,7 @@
 PERMIT_PACKAGE =	Yes
 
 WANTLIB += FLAC GL X11-xcb freetype jpeg m ogg openal vorbis vorbisenc
-WANTLIB += vorbisfile xcb xcb-image xcb-randr ${COMPILER_LIBCXX}
+WANTLIB += vorbisfile xcb xcb-image xcb-randr usbhid ${COMPILER_LIBCXX}
 
 MASTER_SITES =		https://www.sfml-dev.org/files/
 
@@ -51,6 +51,8 @@
 
 post-extract:
 	find ${WRKSRC} -type f -exec perl -pi -e 's/\015//g' {} \;
+	mkdir ${WRKSRC}/src/SFML/Window/OpenBSD
+	cp ${FILESDIR}/JoystickImpl.* ${WRKSRC}/src/SFML/Window/OpenBSD
 
 post-install:
 	find ${PREFIX}/include -name '*.orig' -exec rm {} \;
Index: files/JoystickImpl.cpp
===================================================================
RCS file: files/JoystickImpl.cpp
diff -N files/JoystickImpl.cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/JoystickImpl.cpp	9 Mar 2020 22:09:10 -0000
@@ -0,0 +1,443 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2016 Laurent Gomila (laur...@sfml-dev.org)
+//               2013-2013 David Demelier (demelier.da...@gmail.com)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+//    you must not claim that you wrote the original software.
+//    If you use this software in a product, an acknowledgment
+//    in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+//    and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window/JoystickImpl.hpp>
+#include <SFML/System/Err.hpp>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <cstring>
+#include <map>
+#include <string>
+#include <utility>
+
+////////////////////////////////////////////////////////////
+/// \brief This file implements OpenBSD driver joystick
+///
+/// It has been tested on a Logitech F310 in gamepad and
+/// joystick mode.
+///
+////////////////////////////////////////////////////////////
+
+#define HUG_DPAD_UP         0x90
+#define HUG_DPAD_DOWN       0x91
+#define HUG_DPAD_RIGHT      0x92
+#define HUG_DPAD_LEFT       0x93
+
+#define HAT_CENTERED        0x00
+#define HAT_UP              0x01
+#define HAT_RIGHT           0x02
+#define HAT_DOWN            0x04
+#define HAT_LEFT            0x08
+#define HAT_RIGHTUP         (HAT_RIGHT|HAT_UP)
+#define HAT_RIGHTDOWN       (HAT_RIGHT|HAT_DOWN)
+#define HAT_LEFTUP          (HAT_LEFT|HAT_UP)
+#define HAT_LEFTDOWN        (HAT_LEFT|HAT_DOWN)
+
+/* calculate the value from the state of the dpad */
+int
+dpad_to_sfml(int32_t *dpad)
+{
+    if (dpad[2]) {
+        if (dpad[0])
+            return HAT_RIGHTUP;
+        else if (dpad[1])
+            return HAT_RIGHTDOWN;
+        else
+            return  HAT_RIGHT;
+    } else if (dpad[3]) {
+        if (dpad[0])
+            return HAT_LEFTUP;
+        else if (dpad[1])
+            return HAT_LEFTDOWN;
+        else
+            return HAT_LEFT;
+    } else if (dpad[0]) {
+        return HAT_UP;
+    } else if (dpad[1]) {
+        return HAT_DOWN;
+    }
+    return HAT_CENTERED;
+}
+
+
+namespace
+{
+    std::map<unsigned int, std::string> plugged;
+    std::map<int, std::pair<int, int> > hatValueMap;
+
+    bool isJoystick(const char *name)
+    {
+        int file = ::open(name, O_RDONLY | O_NONBLOCK);
+        int id;
+
+        if (file < 0)
+            return false;
+
+        report_desc_t desc = hid_get_report_desc(file);
+
+        if (!desc)
+        {
+            ::close(file);
+            return false;
+        }
+
+        ioctl(file, USB_GET_REPORT_ID, &id);
+        hid_data_t data = hid_start_parse(desc, 1 << hid_input, id);
+
+        if (!data)
+        {
+            hid_dispose_report_desc(desc);
+            ::close(file);
+            return false;
+        }
+
+        hid_item_t item;
+
+        // Assume it isn't
+        bool result = false;
+
+        while (hid_get_item(data, &item) > 0)
+        {
+            if ((item.kind == hid_collection) && (HID_PAGE(item.usage) == HUP_GENERIC_DESKTOP))
+            {
+		
+                if ((HID_USAGE(item.usage) == HUG_JOYSTICK) || (HID_USAGE(item.usage) == HUG_GAME_PAD))
+                {
+
+                    result = true;
+                }
+            }
+        }
+
+        hid_end_parse(data);
+        hid_dispose_report_desc(desc);
+        ::close(file);
+
+        return result;
+    }
+
+    void updatePluggedList()
+    {
+        /*
+         * Devices /dev/uhid<x> are shared between joystick and any other
+         * human interface device. We need to iterate over all found devices
+         * and check if they are joysticks. The index of JoystickImpl::open
+         * does not match the /dev/uhid<index> device!
+         */
+        DIR* directory = opendir("/dev");
+
+        if (directory)
+        {
+            int joystickCount = 0;
+            struct dirent* directoryEntry = readdir(directory);
+
+            while (directoryEntry && joystickCount < sf::Joystick::Count)
+            {
+                if (!std::strncmp(directoryEntry->d_name, "uhid", 4))
+                {
+                    std::string name("/dev/");
+                    name += directoryEntry->d_name;
+
+                    if (isJoystick(name.c_str()))
+                        plugged[joystickCount++] = name;
+                }
+
+                directoryEntry = readdir(directory);
+            }
+
+            closedir(directory);
+        }
+    }
+
+    int usageToAxis(int usage)
+    {
+        switch (usage)
+        {
+            case HUG_X:  return sf::Joystick::X;
+            case HUG_Y:  return sf::Joystick::Y;
+            case HUG_Z:  return sf::Joystick::Z;
+            case HUG_RZ: return sf::Joystick::R;
+            case HUG_RX: return sf::Joystick::U;
+            case HUG_RY: return sf::Joystick::V;
+            default:     return -1;
+        }
+    }
+
+    void hatValueToSfml(int value, sf::priv::JoystickState& state)
+    {
+	int val = 0;
+	switch (value) {
+	case HAT_CENTERED:
+	    val = 0;
+	    break;
+	case HAT_UP:
+	    val = 1;
+	    break;
+	case HAT_RIGHT:
+	    val = 3;
+	    break;
+	case HAT_DOWN:
+	    val = 5;
+	    break;
+	case HAT_LEFT:
+	    val = 7;
+	    break;
+	case HAT_RIGHTUP:
+	    val = 2;
+	    break;
+	case HAT_RIGHTDOWN:
+	    val = 4;
+	    break;
+	case HAT_LEFTUP:
+	    val = 8;
+	    break;
+	case HAT_LEFTDOWN:
+	    val = 6;
+	    break;
+
+	}
+        state.axes[sf::Joystick::PovX] = hatValueMap[val].first;
+        state.axes[sf::Joystick::PovY] = hatValueMap[val].second;
+    }
+}
+
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+void JoystickImpl::initialize()
+{
+    hid_init(NULL);
+
+    // Do an initial scan
+    updatePluggedList();
+
+    // Map of hat values
+    hatValueMap[0] = std::make_pair(   0,    0); // center
+
+    hatValueMap[1] = std::make_pair(   0, -100); // top
+    hatValueMap[3] = std::make_pair( 100,    0); // right
+    hatValueMap[5] = std::make_pair(   0,  100); // bottom
+    hatValueMap[7] = std::make_pair(-100,    0); // left
+
+    hatValueMap[2] = std::make_pair( 100, -100); // top-right
+    hatValueMap[4] = std::make_pair( 100,  100); // bottom-right
+    hatValueMap[6] = std::make_pair(-100,  100); // bottom-left
+    hatValueMap[8] = std::make_pair(-100, -100); // top-left
+}
+
+
+////////////////////////////////////////////////////////////
+void JoystickImpl::cleanup()
+{
+}
+
+
+////////////////////////////////////////////////////////////
+bool JoystickImpl::isConnected(unsigned int index)
+{
+    return plugged.find(index) != plugged.end();
+}
+
+
+////////////////////////////////////////////////////////////
+bool JoystickImpl::open(unsigned int index)
+{
+    if (isConnected(index))
+    {
+        // Open the joystick's file descriptor (read-only and non-blocking)
+        m_file = ::open(plugged[index].c_str(), O_RDONLY | O_NONBLOCK);
+        if (m_file >= 0)
+        {
+            // Reset the joystick state
+            m_state = JoystickState();
+
+            // Get the report descriptor
+            m_desc = hid_get_report_desc(m_file);
+            if (!m_desc)
+            {
+                ::close(m_file);
+                return false;
+            }
+
+            // And the id
+            ioctl(m_file, USB_GET_REPORT_ID, &m_id);
+
+            // Then allocate a buffer for data retrieval
+            m_length = hid_report_size(m_desc, hid_input, m_id);
+            m_buffer.resize(m_length);
+            char buff[100];
+	    snprintf(buff, sizeof(buff), "Game Controller (%i)", index);
+	    m_identification.name = std::string(buff);
+
+            m_state.connected = true;
+            return true;
+        }
+    }
+
+    return false;
+}
+
+
+////////////////////////////////////////////////////////////
+void JoystickImpl::close()
+{
+    ::close(m_file);
+    hid_dispose_report_desc(m_desc);
+}
+
+
+////////////////////////////////////////////////////////////
+JoystickCaps JoystickImpl::getCapabilities() const
+{
+    JoystickCaps caps;
+    hid_item_t item;
+
+    hid_data_t data = hid_start_parse(m_desc, 1 << hid_input, m_id);
+    while (hid_get_item(data, &item) > 0)
+    {
+        if (item.kind == hid_input)
+        {
+	    switch (HID_PAGE(item.usage)) {
+	    case HUP_GENERIC_DESKTOP:
+		{
+		   int usage = HID_USAGE(item.usage);
+                   int axis = usageToAxis(usage);
+		
+                   if (usage == HUG_HAT_SWITCH || usage == HUG_DPAD_UP)
+                     {
+
+                         caps.axes[Joystick::PovX] = true;
+                         caps.axes[Joystick::PovY] = true;
+                     }
+                     else if (axis != -1)
+                     {
+                         caps.axes[axis] = true;
+	             }	
+		     break;
+		}
+	    case HUP_BUTTON:
+                caps.buttonCount++;
+                break;
+	    default:
+		break;
+	    }
+
+        }
+    }
+
+    hid_end_parse(data);
+
+    return caps;
+}
+
+
+////////////////////////////////////////////////////////////
+Joystick::Identification JoystickImpl::getIdentification() const
+{
+    return m_identification;
+}
+
+
+////////////////////////////////////////////////////////////
+JoystickState JoystickImpl::JoystickImpl::update()
+{
+
+    int32_t dpad[4] = {0, 0, 0, 0};
+    while (read(m_file, &m_buffer[0], m_length) == m_length)
+    {
+        hid_data_t data = hid_start_parse(m_desc, 1 << hid_input, m_id);
+
+        // No memory?
+        if (!data)
+            continue;
+
+        int buttonIndex = 0;
+        hid_item_t item;
+
+        while (hid_get_item(data, &item) > 0)
+        {
+            if (item.kind == hid_input)
+            {
+		int page = HID_PAGE(item.usage);
+		int bvalue = 0;
+		switch (page) {
+		case HUP_GENERIC_DESKTOP:
+		    {
+		    	int usage = HID_USAGE(item.usage);
+			int axis = usageToAxis(usage);
+			if (axis >= 0) {
+			    int value = hid_get_data(&m_buffer[0], &item);
+			    int minimum = item.logical_minimum;
+			    int maximum = item.logical_maximum;
+
+			    value = (value - minimum) * 200 / (maximum - minimum) - 100;
+			    m_state.axes[axis] = value;
+			} else if (usage == HUG_HAT_SWITCH) {
+			    hatValueToSfml(usage, m_state);
+			} else if (usage == HUG_DPAD_UP) {
+                            dpad[0] = (int32_t) hid_get_data(&m_buffer[0], &item);
+                            hatValueToSfml(dpad_to_sfml(dpad), m_state);
+                        }
+                        else if (usage == HUG_DPAD_DOWN) {
+                            dpad[1] = (int32_t) hid_get_data(&m_buffer[0], &item);
+                            hatValueToSfml(dpad_to_sfml(dpad), m_state);
+                        }
+                        else if (usage == HUG_DPAD_RIGHT) {
+                            dpad[2] = (int32_t) hid_get_data(&m_buffer[0], &item);
+                            hatValueToSfml(dpad_to_sfml(dpad), m_state);
+                        }
+                        else if (usage == HUG_DPAD_LEFT) {
+                            dpad[3] = (int32_t) hid_get_data(&m_buffer[0], &item);
+                            hatValueToSfml(dpad_to_sfml(dpad), m_state);
+			}
+			break;
+		    }
+		case HUP_BUTTON:
+	            bvalue = hid_get_data(&m_buffer[0], &item);	
+		    m_state.buttons[buttonIndex] = bvalue;
+		    buttonIndex++;
+		    break;
+		default:
+		    continue;
+		}
+	    }
+	}
+
+        hid_end_parse(data);
+    }
+    return m_state;
+}
+
+} // namespace priv
+
+} // namespace sf
Index: files/JoystickImpl.hpp
===================================================================
RCS file: files/JoystickImpl.hpp
diff -N files/JoystickImpl.hpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/JoystickImpl.hpp	9 Mar 2020 22:09:10 -0000
@@ -0,0 +1,131 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2016 Laurent Gomila (laur...@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+//    you must not claim that you wrote the original software.
+//    If you use this software in a product, an acknowledgment
+//    in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+//    and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+#ifndef SFML_JOYSTICKIMPLOPENBSD_HPP
+#define SFML_JOYSTICKIMPLOPENBSD_HPP
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+extern "C" {
+#include <dev/usb/usb.h>
+#include <dev/usb/usbhid.h>
+#include <usbhid.h>
+}
+#include <vector>
+
+namespace sf
+{
+namespace priv
+{
+////////////////////////////////////////////////////////////
+/// \brief OpenBSD implementation of joysticks
+///
+////////////////////////////////////////////////////////////
+class JoystickImpl
+{
+public:
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Perform the global initialization of the joystick module
+    ///
+    ////////////////////////////////////////////////////////////
+    static void initialize();
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Perform the global cleanup of the joystick module
+    ///
+    ////////////////////////////////////////////////////////////
+    static void cleanup();
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Check if a joystick is currently connected
+    ///
+    /// \param index Index of the joystick to check
+    ///
+    /// \return True if the joystick is connected, false otherwise
+    ///
+    ////////////////////////////////////////////////////////////
+    static bool isConnected(unsigned int index);
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Open the joystick
+    ///
+    /// \param index Index assigned to the joystick
+    ///
+    /// \return True on success, false on failure
+    ///
+    ////////////////////////////////////////////////////////////
+    bool open(unsigned int index);
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Close the joystick
+    ///
+    ////////////////////////////////////////////////////////////
+    void close();
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Get the joystick capabilities
+    ///
+    /// \return Joystick capabilities
+    ///
+    ////////////////////////////////////////////////////////////
+    JoystickCaps getCapabilities() const;
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Get the joystick identification
+    ///
+    /// \return Joystick identification
+    ///
+    ////////////////////////////////////////////////////////////
+    Joystick::Identification getIdentification() const;
+
+    ////////////////////////////////////////////////////////////
+    /// \brief Update the joystick and get its new state
+    ///
+    /// \return Joystick state
+    ///
+    ////////////////////////////////////////////////////////////
+    JoystickState update();
+
+private:
+
+    ////////////////////////////////////////////////////////////
+    // Member data
+    ////////////////////////////////////////////////////////////
+    int                      m_file;           ///< File descriptor of the joystick
+    report_desc_t            m_desc;           ///< USB report descriptor
+    int                      m_id;             ///< USB id
+    std::vector<char>        m_buffer;         ///< USB HID buffer
+    int                      m_length;         ///< Buffer length
+    Joystick::Identification m_identification; ///< Joystick identification
+    JoystickState            m_state;          ///< Current state of the joystick
+};
+
+} // namespace priv
+
+} // namespace sf
+
+
+#endif // SFML_JOYSTICKIMPLOPENBSD_HPP
Index: patches/patch-cmake_Modules_FindSFML_cmake
===================================================================
RCS file: patches/patch-cmake_Modules_FindSFML_cmake
diff -N patches/patch-cmake_Modules_FindSFML_cmake
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-cmake_Modules_FindSFML_cmake	9 Mar 2020 22:09:10 -0000
@@ -0,0 +1,41 @@
+$OpenBSD$
+
+Index: cmake/Modules/FindSFML.cmake
+--- cmake/Modules/FindSFML.cmake.orig
++++ cmake/Modules/FindSFML.cmake
+@@ -232,6 +232,8 @@ if(SFML_STATIC_LIBRARIES)
+         set(FIND_SFML_OS_LINUX 1)
+     elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
+         set(FIND_SFML_OS_FREEBSD 1)
++    elseif(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
++        set(FIND_SFML_OS_OPENBSD 1)
+     elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+         set(FIND_SFML_OS_MACOSX 1)
+     endif()
+@@ -255,7 +257,7 @@ if(SFML_STATIC_LIBRARIES)
+     if(NOT ${FIND_SFML_SYSTEM_COMPONENT} EQUAL -1)
+ 
+         # update the list -- these are only system libraries, no need to find them
+-        if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD OR FIND_SFML_OS_MACOSX)
++        if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD OR FIND_SFML_OS_MACOSX OR FIND_SFML_OS_OPENBSD)
+             set(SFML_SYSTEM_DEPENDENCIES "pthread")
+         endif()
+         if(FIND_SFML_OS_LINUX)
+@@ -283,7 +285,7 @@ if(SFML_STATIC_LIBRARIES)
+     if(NOT ${FIND_SFML_WINDOW_COMPONENT} EQUAL -1)
+ 
+         # find libraries
+-        if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD)
++        if(FIND_SFML_OS_LINUX OR FIND_SFML_OS_FREEBSD OR FIND_SFML_OS_OPENBSD)
+             find_sfml_dependency(X11_LIBRARY "X11" X11)
+             find_sfml_dependency(LIBXCB_LIBRARIES "XCB" xcb libxcb)
+             find_sfml_dependency(X11_XCB_LIBRARY "X11-xcb" X11-xcb libX11-xcb)
+@@ -301,6 +303,8 @@ if(SFML_STATIC_LIBRARIES)
+         elseif(FIND_SFML_OS_LINUX)
+             set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${LIBXCB_LIBRARIES} ${X11_XCB_LIBRARY} ${XCB_RANDR_LIBRARY} ${XCB_IMAGE_LIBRARY} ${UDEV_LIBRARIES})
+         elseif(FIND_SFML_OS_FREEBSD)
++            set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${LIBXCB_LIBRARIES} ${X11_XCB_LIBRARY} ${XCB_RANDR_LIBRARY} ${XCB_IMAGE_LIBRARY} "usbhid")
++        elseif(FIND_SFML_OS_OPENBSD)
+             set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "GL" ${X11_LIBRARY} ${LIBXCB_LIBRARIES} ${X11_XCB_LIBRARY} ${XCB_RANDR_LIBRARY} ${XCB_IMAGE_LIBRARY} "usbhid")
+         elseif(FIND_SFML_OS_MACOSX)
+             set(SFML_WINDOW_DEPENDENCIES ${SFML_WINDOW_DEPENDENCIES} "-framework OpenGL -framework Foundation -framework AppKit -framework IOKit -framework Carbon")
Index: patches/patch-src_SFML_Window_CMakeLists_txt
===================================================================
RCS file: /cvs/ports/multimedia/sfml/patches/patch-src_SFML_Window_CMakeLists_txt,v
retrieving revision 1.2
diff -u -r1.2 patch-src_SFML_Window_CMakeLists_txt
--- patches/patch-src_SFML_Window_CMakeLists_txt	1 Sep 2016 16:50:14 -0000	1.2
+++ patches/patch-src_SFML_Window_CMakeLists_txt	9 Mar 2020 22:09:10 -0000
@@ -1,6 +1,10 @@
 $OpenBSD: patch-src_SFML_Window_CMakeLists_txt,v 1.2 2016/09/01 16:50:14 pascal Exp $
---- src/SFML/Window/CMakeLists.txt.orig	Wed Aug 31 17:33:33 2016
-+++ src/SFML/Window/CMakeLists.txt	Wed Aug 31 17:33:36 2016
+
+Add Joystick implementation for OpenBSD
+
+Index: src/SFML/Window/CMakeLists.txt
+--- src/SFML/Window/CMakeLists.txt.orig
++++ src/SFML/Window/CMakeLists.txt
 @@ -69,7 +69,7 @@ if(SFML_OS_WINDOWS)
  
      # make sure that we use the Unicode version of the Win API functions
@@ -17,8 +21,8 @@
 +    elseif(SFML_OS_OPENBSD)
 +        set(PLATFORM_SRC
 +            ${PLATFORM_SRC}
-+            ${SRCROOT}/Android/JoystickImpl.cpp
-+            ${SRCROOT}/Android/JoystickImpl.hpp
++            ${SRCROOT}/OpenBSD/JoystickImpl.cpp
++            ${SRCROOT}/OpenBSD/JoystickImpl.hpp
 +        )
      endif()
      source_group("unix" FILES ${PLATFORM_SRC})
@@ -32,12 +36,14 @@
          find_package(XCB COMPONENTS xlib_xcb image randr REQUIRED)
          if(NOT LIBXCB_FOUND)
              message(FATAL_ERROR "Xcb library not found")
-@@ -234,6 +240,8 @@ elseif(SFML_OS_LINUX)
+@@ -232,7 +238,9 @@ if(SFML_OS_WINDOWS)
+     list(APPEND WINDOW_EXT_LIBS winmm gdi32)
+ elseif(SFML_OS_LINUX)
      list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${LIBXCB_LIBRARIES} ${UDEV_LIBRARIES})
- elseif(SFML_OS_FREEBSD)
-     list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${LIBXCB_LIBRARIES} usbhid)
+-elseif(SFML_OS_FREEBSD)
++elseif(SFML_OS_FREEBSD) 
++    list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${LIBXCB_LIBRARIES} usbhid)
 +elseif(SFML_OS_OPENBSD)
-+    list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${LIBXCB_LIBRARIES})
+     list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${LIBXCB_LIBRARIES} usbhid)
  elseif(SFML_OS_MACOSX)
      list(APPEND WINDOW_EXT_LIBS "-framework Foundation -framework AppKit -framework IOKit -framework Carbon")
- elseif(SFML_OS_IOS)
Index: patches/patch-src_SFML_Window_JoystickImpl_hpp
===================================================================
RCS file: /cvs/ports/multimedia/sfml/patches/patch-src_SFML_Window_JoystickImpl_hpp,v
retrieving revision 1.2
diff -u -r1.2 patch-src_SFML_Window_JoystickImpl_hpp
--- patches/patch-src_SFML_Window_JoystickImpl_hpp	1 Sep 2016 16:50:14 -0000	1.2
+++ patches/patch-src_SFML_Window_JoystickImpl_hpp	9 Mar 2020 22:09:10 -0000
@@ -1,12 +1,18 @@
 $OpenBSD: patch-src_SFML_Window_JoystickImpl_hpp,v 1.2 2016/09/01 16:50:14 pascal Exp $
---- src/SFML/Window/JoystickImpl.hpp.orig	Sat Jan 30 21:26:30 2016
-+++ src/SFML/Window/JoystickImpl.hpp	Mon Feb 29 17:55:13 2016
-@@ -98,7 +98,7 @@ struct JoystickState
+
+Joystick implementation
+
+Index: src/SFML/Window/JoystickImpl.hpp
+--- src/SFML/Window/JoystickImpl.hpp.orig
++++ src/SFML/Window/JoystickImpl.hpp
+@@ -90,6 +90,10 @@ struct JoystickState
  
-     #include <SFML/Window/iOS/JoystickImpl.hpp>
+     #include <SFML/Window/FreeBSD/JoystickImpl.hpp>
  
--#elif defined(SFML_SYSTEM_ANDROID)
-+#elif defined(SFML_SYSTEM_ANDROID) || defined(SFML_SYSTEM_OPENBSD)
- 
-     #include <SFML/Window/Android/JoystickImpl.hpp>
++#elif defined(SFML_SYSTEM_OPENBSD)
++
++    #include <SFML/Window/OpenBSD/JoystickImpl.hpp>
++
+ #elif defined(SFML_SYSTEM_MACOS)
  
+     #include <SFML/Window/OSX/JoystickImpl.hpp>

Reply via email to