mirror of
https://github.com/davatorium/rofi.git
synced 2025-07-31 21:59:25 -04:00
Merge branch 'seletskiy-xinerama'
* Tweak some minor things.
This commit is contained in:
commit
4a95285212
2 changed files with 64 additions and 1 deletions
|
@ -94,7 +94,7 @@ dnl ---------------------------------------------------------------------
|
||||||
dnl PKG_CONFIG based dependencies
|
dnl PKG_CONFIG based dependencies
|
||||||
dnl ---------------------------------------------------------------------
|
dnl ---------------------------------------------------------------------
|
||||||
PKG_CHECK_MODULES([glib], [glib-2.0 >= 2.40])
|
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([pango], [pango pangocairo])
|
||||||
PKG_CHECK_MODULES([cairo], [cairo cairo-xcb])
|
PKG_CHECK_MODULES([cairo], [cairo cairo-xcb])
|
||||||
PKG_CHECK_MODULES([libsn], [libstartup-notification-1.0])
|
PKG_CHECK_MODULES([libsn], [libstartup-notification-1.0])
|
||||||
|
|
|
@ -37,7 +37,9 @@
|
||||||
|
|
||||||
#include <xcb/xcb.h>
|
#include <xcb/xcb.h>
|
||||||
#include <xcb/randr.h>
|
#include <xcb/randr.h>
|
||||||
|
#include <xcb/xinerama.h>
|
||||||
#include <xcb/xcb_ewmh.h>
|
#include <xcb/xcb_ewmh.h>
|
||||||
|
#include <xcb/xproto.h>
|
||||||
#include "xcb-internal.h"
|
#include "xcb-internal.h"
|
||||||
#include "xcb.h"
|
#include "xcb.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
@ -54,6 +56,8 @@
|
||||||
#include "x11-helper.h"
|
#include "x11-helper.h"
|
||||||
#include "xkb-internal.h"
|
#include "xkb-internal.h"
|
||||||
|
|
||||||
|
#define LOG_DOMAIN "X11Helper"
|
||||||
|
|
||||||
struct _xcb_stuff xcb_int = {
|
struct _xcb_stuff xcb_int = {
|
||||||
.connection = NULL,
|
.connection = NULL,
|
||||||
.screen = NULL,
|
.screen = NULL,
|
||||||
|
@ -213,11 +217,70 @@ static workarea * x11_get_monitor_from_output ( xcb_randr_output_t out )
|
||||||
return retv;
|
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 ()
|
void x11_build_monitor_layout ()
|
||||||
{
|
{
|
||||||
if ( xcb->monitors ) {
|
if ( xcb->monitors ) {
|
||||||
return;
|
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_reply_t *res_reply;
|
||||||
xcb_randr_get_screen_resources_current_cookie_t src;
|
xcb_randr_get_screen_resources_current_cookie_t src;
|
||||||
src = xcb_randr_get_screen_resources_current ( xcb->connection, xcb->screen->root );
|
src = xcb_randr_get_screen_resources_current ( xcb->connection, xcb->screen->root );
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue