1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2024-11-25 13:55:34 -05:00

Merge branch 'seletskiy-xinerama'

* Tweak some minor things.
This commit is contained in:
Dave Davenport 2016-08-31 09:44:43 +02:00
commit 4a95285212
2 changed files with 64 additions and 1 deletions

View file

@ -94,7 +94,7 @@ dnl ---------------------------------------------------------------------
dnl PKG_CONFIG based dependencies
dnl ---------------------------------------------------------------------
PKG_CHECK_MODULES([glib], [glib-2.0 >= 2.40])
GW_CHECK_XCB([xcb-aux xcb-xkb xkbcommon >= 0.5.0 xkbcommon-x11 xcb-ewmh xcb-icccm xcb-xrm xcb-randr])
GW_CHECK_XCB([xcb-aux xcb-xkb xkbcommon >= 0.5.0 xkbcommon-x11 xcb-ewmh xcb-icccm xcb-xrm xcb-randr xcb-xinerama])
PKG_CHECK_MODULES([pango], [pango pangocairo])
PKG_CHECK_MODULES([cairo], [cairo cairo-xcb])
PKG_CHECK_MODULES([libsn], [libstartup-notification-1.0])

View file

@ -37,7 +37,9 @@
#include <xcb/xcb.h>
#include <xcb/randr.h>
#include <xcb/xinerama.h>
#include <xcb/xcb_ewmh.h>
#include <xcb/xproto.h>
#include "xcb-internal.h"
#include "xcb.h"
#include "settings.h"
@ -54,6 +56,8 @@
#include "x11-helper.h"
#include "xkb-internal.h"
#define LOG_DOMAIN "X11Helper"
struct _xcb_stuff xcb_int = {
.connection = NULL,
.screen = NULL,
@ -213,11 +217,70 @@ static workarea * x11_get_monitor_from_output ( xcb_randr_output_t out )
return retv;
}
static int x11_is_extension_present (const char *extension) {
xcb_query_extension_cookie_t randr_cookie = xcb_query_extension ( xcb->connection, strlen(extension), extension);
xcb_query_extension_reply_t *randr_reply = xcb_query_extension_reply ( xcb->connection, randr_cookie, NULL);
int present = randr_reply->present;
free ( randr_reply );
return present;
}
static void x11_build_monitor_layout_xinerama () {
xcb_xinerama_query_screens_cookie_t screens_cookie = xcb_xinerama_query_screens_unchecked (
xcb->connection
);
xcb_xinerama_query_screens_reply_t *screens_reply = xcb_xinerama_query_screens_reply (
xcb->connection,
screens_cookie,
NULL
);
xcb_xinerama_screen_info_iterator_t screens_iterator = xcb_xinerama_query_screens_screen_info_iterator (
screens_reply
);
for ( ; screens_iterator.rem > 0; xcb_xinerama_screen_info_next (&screens_iterator) ) {
workarea *w = g_malloc0 ( sizeof ( workarea ) );
w->x = screens_iterator.data->x_org;
w->y = screens_iterator.data->y_org;
w->w = screens_iterator.data->width;
w->h = screens_iterator.data->height;
if ( w ) {
w->next = xcb->monitors;
xcb->monitors = w;
}
}
int index = 0;
for ( workarea *iter = xcb->monitors; iter; iter = iter->next ) {
iter->monitor_id = index++;
}
free ( screens_reply );
}
void x11_build_monitor_layout ()
{
if ( xcb->monitors ) {
return;
}
// If RANDR is not available, try Xinerama
if ( !x11_is_extension_present ( "RANDR" ) ) {
// Check if xinerama is available.
if ( x11_is_extension_present ( "XINERAMA" ) ) {
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Using XINERAMA instead of XRANDR\n" );
x11_build_monitor_layout_xinerama ();
}
return;
}
xcb_randr_get_screen_resources_current_reply_t *res_reply;
xcb_randr_get_screen_resources_current_cookie_t src;
src = xcb_randr_get_screen_resources_current ( xcb->connection, xcb->screen->root );