Removed link to Xlib. Replaced more Xlib calls by XCB calls.
Change-Id: I05d8b24508e88b604f7cc76622cc8af695204990
This commit is contained in:
parent
132ae26ce1
commit
f464e2502a
@ -218,7 +218,7 @@ endif()
|
|||||||
if(SFML_OS_WINDOWS)
|
if(SFML_OS_WINDOWS)
|
||||||
list(APPEND WINDOW_EXT_LIBS winmm gdi32)
|
list(APPEND WINDOW_EXT_LIBS winmm gdi32)
|
||||||
elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD)
|
elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD)
|
||||||
list(APPEND WINDOW_EXT_LIBS ${X11_X11_LIB} ${X11_Xrandr_LIB} ${LIBXCB_LIBRARIES} ${UDEV_LIBRARIES})
|
list(APPEND WINDOW_EXT_LIBS ${LIBXCB_LIBRARIES} ${UDEV_LIBRARIES})
|
||||||
if(SFML_OS_FREEBSD)
|
if(SFML_OS_FREEBSD)
|
||||||
list(APPEND WINDOW_EXT_LIBS usbhid)
|
list(APPEND WINDOW_EXT_LIBS usbhid)
|
||||||
endif()
|
endif()
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#include <SFML/Window/VideoModeImpl.hpp>
|
#include <SFML/Window/VideoModeImpl.hpp>
|
||||||
#include <SFML/Window/Unix/Display.hpp>
|
#include <SFML/Window/Unix/Display.hpp>
|
||||||
#include <SFML/System/Err.hpp>
|
#include <SFML/System/Err.hpp>
|
||||||
#include <X11/Xlib-xcb.h>
|
|
||||||
#include <xcb/randr.h>
|
#include <xcb/randr.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
@ -30,9 +30,6 @@
|
|||||||
#include <SFML/Window/Unix/Display.hpp>
|
#include <SFML/Window/Unix/Display.hpp>
|
||||||
#include <SFML/System/Utf.hpp>
|
#include <SFML/System/Utf.hpp>
|
||||||
#include <SFML/System/Err.hpp>
|
#include <SFML/System/Err.hpp>
|
||||||
#include <X11/keysym.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
#include <X11/Xatom.h>
|
|
||||||
#include <xcb/xcb_atom.h>
|
#include <xcb/xcb_atom.h>
|
||||||
#include <xcb/xcb_icccm.h>
|
#include <xcb/xcb_icccm.h>
|
||||||
#include <xcb/xcb_image.h>
|
#include <xcb/xcb_image.h>
|
||||||
@ -112,7 +109,10 @@ m_useSizeHints(false)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_screen = DefaultScreen(m_display);
|
// Get connection info.
|
||||||
|
const xcb_setup_t* setup = xcb_get_setup(m_connection);
|
||||||
|
xcb_screen_iterator_t screenIter = xcb_setup_roots_iterator(setup);
|
||||||
|
m_screen = screenIter.data;
|
||||||
|
|
||||||
// Save the window handle
|
// Save the window handle
|
||||||
m_window = handle;
|
m_window = handle;
|
||||||
@ -150,20 +150,24 @@ m_useSizeHints(false)
|
|||||||
m_display = OpenDisplay();
|
m_display = OpenDisplay();
|
||||||
XSetEventQueueOwner(m_display, XCBOwnsEventQueue);
|
XSetEventQueueOwner(m_display, XCBOwnsEventQueue);
|
||||||
m_connection = XGetXCBConnection(m_display);
|
m_connection = XGetXCBConnection(m_display);
|
||||||
if (! m_connection)
|
if (!m_connection)
|
||||||
{
|
{
|
||||||
err() << "Failed cast Display object to an XCB connection object" << std::endl;
|
err() << "Failed cast Display object to an XCB connection object" << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_screen = DefaultScreen(m_display);
|
|
||||||
|
// Get connection info.
|
||||||
|
const xcb_setup_t* setup = xcb_get_setup(m_connection);
|
||||||
|
xcb_screen_iterator_t screenIter = xcb_setup_roots_iterator(setup);
|
||||||
|
m_screen = screenIter.data;
|
||||||
|
|
||||||
// Compute position and size
|
// Compute position and size
|
||||||
int left, top;
|
int left, top;
|
||||||
bool fullscreen = (style & Style::Fullscreen) != 0;
|
bool fullscreen = (style & Style::Fullscreen) != 0;
|
||||||
if (!fullscreen)
|
if (!fullscreen)
|
||||||
{
|
{
|
||||||
left = (DisplayWidth(m_display, m_screen) - mode.width) / 2;
|
left = (m_screen->width_in_pixels - mode.width) / 2;
|
||||||
top = (DisplayHeight(m_display, m_screen) - mode.height) / 2;
|
top = (m_screen->height_in_pixels - mode.height) / 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -187,7 +191,7 @@ m_useSizeHints(false)
|
|||||||
m_connection,
|
m_connection,
|
||||||
XCB_COPY_FROM_PARENT,
|
XCB_COPY_FROM_PARENT,
|
||||||
m_window,
|
m_window,
|
||||||
RootWindow(m_display, m_screen),
|
m_screen->root,
|
||||||
left, top,
|
left, top,
|
||||||
width, height,
|
width, height,
|
||||||
0,
|
0,
|
||||||
@ -277,7 +281,7 @@ m_useSizeHints(false)
|
|||||||
|
|
||||||
const unsigned char* ptr = reinterpret_cast<const unsigned char*>(&hints);
|
const unsigned char* ptr = reinterpret_cast<const unsigned char*>(&hints);
|
||||||
xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, m_window,
|
xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, m_window,
|
||||||
hintsAtomReply->atom, XA_WM_HINTS, 32, 5, ptr);
|
hintsAtomReply->atom, XCB_ATOM_WM_HINTS, 32, 5, ptr);
|
||||||
|
|
||||||
free(hintsAtomReply);
|
free(hintsAtomReply);
|
||||||
}
|
}
|
||||||
@ -297,11 +301,7 @@ m_useSizeHints(false)
|
|||||||
// Set the window's WM class (this can be used by window managers)
|
// Set the window's WM class (this can be used by window managers)
|
||||||
char windowClass[512];
|
char windowClass[512];
|
||||||
findExecutableName(windowClass, sizeof(windowClass));
|
findExecutableName(windowClass, sizeof(windowClass));
|
||||||
XClassHint* classHint = XAllocClassHint();
|
xcb_icccm_set_wm_class_checked(m_connection, m_window, std::strlen(windowClass), windowClass);
|
||||||
classHint->res_name = windowClass;
|
|
||||||
classHint->res_class = windowClass;
|
|
||||||
XSetClassHint(m_display, m_window, classHint);
|
|
||||||
XFree(classHint);
|
|
||||||
|
|
||||||
// Do some common initializations
|
// Do some common initializations
|
||||||
initialize();
|
initialize();
|
||||||
@ -420,14 +420,13 @@ void WindowImplX11::processEvents()
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Vector2i WindowImplX11::getPosition() const
|
Vector2i WindowImplX11::getPosition() const
|
||||||
{
|
{
|
||||||
::Window rootWindow = RootWindow(m_display, m_screen);
|
|
||||||
::Window topLevelWindow = m_window;
|
::Window topLevelWindow = m_window;
|
||||||
::Window nextWindow = topLevelWindow;
|
::Window nextWindow = topLevelWindow;
|
||||||
xcb_query_tree_cookie_t treeCookie;
|
xcb_query_tree_cookie_t treeCookie;
|
||||||
xcb_query_tree_reply_t* treeReply = NULL;
|
xcb_query_tree_reply_t* treeReply = NULL;
|
||||||
|
|
||||||
// Get "top level" window, i.e. the window with the root window as its parent.
|
// Get "top level" window, i.e. the window with the root window as its parent.
|
||||||
while (nextWindow != rootWindow)
|
while (nextWindow != m_screen->root)
|
||||||
{
|
{
|
||||||
topLevelWindow = nextWindow;
|
topLevelWindow = nextWindow;
|
||||||
|
|
||||||
@ -499,7 +498,7 @@ void WindowImplX11::setTitle(const String& title)
|
|||||||
);
|
);
|
||||||
|
|
||||||
xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, m_window,
|
xcb_change_property(m_connection, XCB_PROP_MODE_REPLACE, m_window,
|
||||||
XA_WM_NAME, XA_STRING,
|
XCB_ATOM_WM_NAME, XCB_ATOM_STRING,
|
||||||
8, utf8String.length(), utf8String.c_str());
|
8, utf8String.length(), utf8String.c_str());
|
||||||
xcb_flush(m_connection);
|
xcb_flush(m_connection);
|
||||||
}
|
}
|
||||||
@ -519,17 +518,15 @@ void WindowImplX11::setIcon(unsigned int width, unsigned int height, const Uint8
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the icon pixmap
|
// Create the icon pixmap
|
||||||
uint8_t defDepth = DefaultDepth(m_display, m_screen);
|
|
||||||
|
|
||||||
xcb_pixmap_t iconPixmap = xcb_generate_id(m_connection);
|
xcb_pixmap_t iconPixmap = xcb_generate_id(m_connection);
|
||||||
xcb_create_pixmap(m_connection, defDepth, iconPixmap, RootWindow(m_display, m_screen),
|
xcb_create_pixmap(m_connection, m_screen->root_depth, iconPixmap, m_screen->root,
|
||||||
width, height);
|
width, height);
|
||||||
|
|
||||||
xcb_gcontext_t iconGC = xcb_generate_id(m_connection);
|
xcb_gcontext_t iconGC = xcb_generate_id(m_connection);
|
||||||
xcb_create_gc(m_connection, iconGC, iconPixmap, 0, NULL);
|
xcb_create_gc(m_connection, iconGC, iconPixmap, 0, NULL);
|
||||||
xcb_void_cookie_t cookie = xcb_put_image_checked(
|
xcb_void_cookie_t cookie = xcb_put_image_checked(
|
||||||
m_connection, XCB_IMAGE_FORMAT_Z_PIXMAP, iconPixmap, iconGC,
|
m_connection, XCB_IMAGE_FORMAT_Z_PIXMAP, iconPixmap, iconGC,
|
||||||
width, height, 0, 0, 0, defDepth, sizeof(iconPixels), iconPixels);
|
width, height, 0, 0, 0, m_screen->root_depth, sizeof(iconPixels), iconPixels);
|
||||||
xcb_free_gc(m_connection, iconGC);
|
xcb_free_gc(m_connection, iconGC);
|
||||||
|
|
||||||
xcb_generic_error_t* errptr = xcb_request_check(m_connection, cookie);
|
xcb_generic_error_t* errptr = xcb_request_check(m_connection, cookie);
|
||||||
@ -675,12 +672,11 @@ void WindowImplX11::switchToFullscreen(const VideoMode& mode)
|
|||||||
xcb_query_extension_reply(m_connection, xcb_query_extension(m_connection, 5, "RANDR"), NULL);
|
xcb_query_extension_reply(m_connection, xcb_query_extension(m_connection, 5, "RANDR"), NULL);
|
||||||
if (randr_ext->present)
|
if (randr_ext->present)
|
||||||
{
|
{
|
||||||
xcb_screen_t* screen = XCBScreenOfDisplay(m_connection, m_screen);
|
|
||||||
// Get the current configuration
|
// Get the current configuration
|
||||||
xcb_generic_error_t* errors;
|
xcb_generic_error_t* errors;
|
||||||
xcb_randr_get_screen_info_reply_t* config =
|
xcb_randr_get_screen_info_reply_t* config =
|
||||||
xcb_randr_get_screen_info_reply(m_connection,
|
xcb_randr_get_screen_info_reply(m_connection,
|
||||||
xcb_randr_get_screen_info(m_connection, screen->root),
|
xcb_randr_get_screen_info(m_connection, m_screen->root),
|
||||||
&errors);
|
&errors);
|
||||||
if (! errors)
|
if (! errors)
|
||||||
{
|
{
|
||||||
@ -698,7 +694,7 @@ void WindowImplX11::switchToFullscreen(const VideoMode& mode)
|
|||||||
{
|
{
|
||||||
// Switch to fullscreen mode
|
// Switch to fullscreen mode
|
||||||
xcb_randr_set_screen_config(m_connection,
|
xcb_randr_set_screen_config(m_connection,
|
||||||
screen->root,
|
m_screen->root,
|
||||||
config->timestamp,
|
config->timestamp,
|
||||||
config->config_timestamp,
|
config->config_timestamp,
|
||||||
i, config->rotation, config->rate);
|
i, config->rotation, config->rate);
|
||||||
@ -837,18 +833,15 @@ void WindowImplX11::cleanup()
|
|||||||
// Restore the previous video mode (in case we were running in fullscreen)
|
// Restore the previous video mode (in case we were running in fullscreen)
|
||||||
if (fullscreenWindow == this)
|
if (fullscreenWindow == this)
|
||||||
{
|
{
|
||||||
// Retrieve the default screen
|
|
||||||
xcb_screen_t* screen = XCBScreenOfDisplay(m_connection, m_screen);
|
|
||||||
|
|
||||||
// Get current screen info
|
// Get current screen info
|
||||||
xcb_generic_error_t* errors;
|
xcb_generic_error_t* errors;
|
||||||
xcb_randr_get_screen_info_reply_t* config = xcb_randr_get_screen_info_reply(
|
xcb_randr_get_screen_info_reply_t* config = xcb_randr_get_screen_info_reply(
|
||||||
m_connection, xcb_randr_get_screen_info(m_connection, screen->root), &errors);
|
m_connection, xcb_randr_get_screen_info(m_connection, m_screen->root), &errors);
|
||||||
if (!errors)
|
if (!errors)
|
||||||
{
|
{
|
||||||
// Reset the video mode
|
// Reset the video mode
|
||||||
xcb_randr_set_screen_config(m_connection,
|
xcb_randr_set_screen_config(m_connection,
|
||||||
screen->root,
|
m_screen->root,
|
||||||
CurrentTime,
|
CurrentTime,
|
||||||
config->config_timestamp,
|
config->config_timestamp,
|
||||||
m_oldVideoMode,
|
m_oldVideoMode,
|
||||||
@ -1148,9 +1141,9 @@ bool WindowImplX11::processEvent(xcb_generic_event_t* windowEvent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parent window changed
|
// Parent window changed
|
||||||
case ReparentNotify:
|
case XCB_REPARENT_NOTIFY:
|
||||||
{
|
{
|
||||||
XSync(m_display, True); // Discard remaining events
|
xcb_flush(m_connection); // Discard remaining events
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -231,7 +231,7 @@ private:
|
|||||||
::Window m_window; ///< X11 structure defining our window
|
::Window m_window; ///< X11 structure defining our window
|
||||||
::Display* m_display; ///< Pointer to the display
|
::Display* m_display; ///< Pointer to the display
|
||||||
xcb_connection_t* m_connection; ///< Pointer to the xcb connection
|
xcb_connection_t* m_connection; ///< Pointer to the xcb connection
|
||||||
int m_screen; ///< Screen identifier
|
xcb_screen_t* m_screen; ///< Screen identifier
|
||||||
XIM m_inputMethod; ///< Input method linked to the X display
|
XIM m_inputMethod; ///< Input method linked to the X display
|
||||||
XIC m_inputContext; ///< Input context used to get unicode input in our window
|
XIC m_inputContext; ///< Input context used to get unicode input in our window
|
||||||
bool m_isExternal; ///< Tell whether the window has been created externally or by SFML
|
bool m_isExternal; ///< Tell whether the window has been created externally or by SFML
|
||||||
|
Loading…
Reference in New Issue
Block a user