mirror of
https://github.com/holub/mame
synced 2025-04-21 16:01:56 +03:00
osd/modules/input: Fixed a couple of X11 resource leaks.
This commit is contained in:
parent
162a7b9157
commit
fee9a29a57
@ -267,15 +267,30 @@ public:
|
||||
class x11_event_manager : public event_manager_t<x11_event_handler>
|
||||
{
|
||||
private:
|
||||
Display * m_display;
|
||||
struct x_cleanup
|
||||
{
|
||||
void operator()(Display *ptr) const
|
||||
{
|
||||
if (ptr)
|
||||
XCloseDisplay(ptr);
|
||||
}
|
||||
void operator()(XExtensionVersion *ptr) const
|
||||
{
|
||||
if (ptr)
|
||||
XFree(ptr);
|
||||
}
|
||||
};
|
||||
|
||||
x11_event_manager()
|
||||
: event_manager_t(),
|
||||
m_display(nullptr)
|
||||
template <typename T> using x_ptr = std::unique_ptr<T, x_cleanup>;
|
||||
|
||||
x_ptr<Display> m_display;
|
||||
|
||||
x11_event_manager() : event_manager_t()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
Display * display() const { return m_display; }
|
||||
Display * display() const { return m_display.get(); }
|
||||
|
||||
static x11_event_manager& instance()
|
||||
{
|
||||
@ -287,18 +302,18 @@ public:
|
||||
{
|
||||
std::lock_guard<std::mutex> scope_lock(m_lock);
|
||||
|
||||
if (m_display != nullptr)
|
||||
if (m_display)
|
||||
return 0;
|
||||
|
||||
m_display = XOpenDisplay(nullptr);
|
||||
if (m_display == nullptr)
|
||||
m_display.reset(XOpenDisplay(nullptr));
|
||||
if (!m_display)
|
||||
{
|
||||
osd_printf_verbose("Unable to connect to X server\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
|
||||
if (!version || (version == reinterpret_cast<XExtensionVersion*>(NoSuchExtension)))
|
||||
x_ptr<XExtensionVersion> version(XGetExtensionVersion(m_display.get(), INAME));
|
||||
if (!version || (version.get() == reinterpret_cast<XExtensionVersion *>(NoSuchExtension)))
|
||||
{
|
||||
osd_printf_verbose("xinput extension not available!\n");
|
||||
return -1;
|
||||
@ -313,21 +328,21 @@ public:
|
||||
XEvent xevent;
|
||||
|
||||
// If X11 has become invalid for some reason, XPending will crash. Assert instead.
|
||||
assert(m_display != nullptr);
|
||||
assert(m_display);
|
||||
|
||||
//Get XInput events
|
||||
while (XPending(m_display) != 0)
|
||||
while (XPending(m_display.get()) != 0)
|
||||
{
|
||||
XNextEvent(m_display, &xevent);
|
||||
XNextEvent(m_display.get(), &xevent);
|
||||
|
||||
// Find all subscribers for the event type
|
||||
auto subscribers = m_subscription_index.equal_range(xevent.type);
|
||||
auto const subscribers = m_subscription_index.equal_range(xevent.type);
|
||||
|
||||
// Dispatch the events
|
||||
std::for_each(subscribers.first, subscribers.second, [&xevent](auto &pair)
|
||||
{
|
||||
pair.second->handle_event(xevent);
|
||||
});
|
||||
std::for_each(
|
||||
subscribers.first,
|
||||
subscribers.second,
|
||||
[&xevent] (auto &pair) { pair.second->handle_event(xevent); });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -20,8 +20,7 @@ class pm_module : public osd_module, public midi_module
|
||||
{
|
||||
public:
|
||||
|
||||
pm_module()
|
||||
: osd_module(OSD_MIDI_PROVIDER, "pm"), midi_module()
|
||||
pm_module() : osd_module(OSD_MIDI_PROVIDER, "pm"), midi_module()
|
||||
{
|
||||
}
|
||||
virtual ~pm_module() { }
|
||||
|
@ -440,25 +440,25 @@ void sdl_osd_interface::init(running_machine &machine)
|
||||
osd_setenv(SDLENV_VIDEODRIVER, stemp, 1);
|
||||
}
|
||||
|
||||
stemp = options().render_driver();
|
||||
if (stemp != nullptr)
|
||||
stemp = options().render_driver();
|
||||
if (stemp != nullptr)
|
||||
{
|
||||
if (strcmp(stemp, OSDOPTVAL_AUTO) != 0)
|
||||
{
|
||||
if (strcmp(stemp, OSDOPTVAL_AUTO) != 0)
|
||||
{
|
||||
osd_printf_verbose("Setting SDL renderdriver '%s' ...\n", stemp);
|
||||
//osd_setenv(SDLENV_RENDERDRIVER, stemp, 1);
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, stemp);
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(SDLMAME_WIN32)
|
||||
// OpenGL renderer has less issues with mode switching on windows
|
||||
osd_printf_verbose("Setting SDL renderdriver '%s' ...\n", "opengl");
|
||||
//osd_setenv(SDLENV_RENDERDRIVER, stemp, 1);
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
|
||||
#endif
|
||||
}
|
||||
osd_printf_verbose("Setting SDL renderdriver '%s' ...\n", stemp);
|
||||
//osd_setenv(SDLENV_RENDERDRIVER, stemp, 1);
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, stemp);
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(SDLMAME_WIN32)
|
||||
// OpenGL renderer has less issues with mode switching on windows
|
||||
osd_printf_verbose("Setting SDL renderdriver '%s' ...\n", "opengl");
|
||||
//osd_setenv(SDLENV_RENDERDRIVER, stemp, 1);
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the SDL environment variable for drivers wanting to load the
|
||||
* lib at startup.
|
||||
@ -491,7 +491,8 @@ void sdl_osd_interface::init(running_machine &machine)
|
||||
|
||||
/* Initialize SDL */
|
||||
|
||||
if (SDL_InitSubSystem(SDL_INIT_VIDEO)) {
|
||||
if (SDL_InitSubSystem(SDL_INIT_VIDEO))
|
||||
{
|
||||
osd_printf_error("Could not initialize SDL %s\n", SDL_GetError());
|
||||
exit(-1);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user