xcb: Move GWater source in xcb.c

Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
Quentin Glidic 2017-06-01 11:44:21 +02:00
parent da3d78ba13
commit a8aac87bb0
No known key found for this signature in database
GPG Key ID: AC203F96E2C34BB7
5 changed files with 60 additions and 54 deletions

View File

@ -33,6 +33,7 @@
#include <xcb/xcb.h>
#include <xcb/xcb_ewmh.h>
#include "libgwater-xcb.h"
#include "nkutils-bindings.h"
@ -41,6 +42,8 @@
*/
struct _xcb_stuff
{
GMainLoop *main_loop;
GWaterXcbSource *source;
xcb_connection_t *connection;
xcb_ewmh_connection_t ewmh;
xcb_screen_t *screen;

View File

@ -49,13 +49,13 @@ gboolean main_loop_x11_event_handler ( xcb_generic_event_t *ev, G_GNUC_UNUSED gp
*
* @returns the root window.
*/
xcb_window_t xcb_stuff_get_root_window ( xcb_stuff *xcb );
xcb_window_t xcb_stuff_get_root_window ( void );
/**
* @param xcb The xcb data structure.
*
* Disconnect and free all xcb connections and references.
*/
void xcb_stuff_wipe ( xcb_stuff *xcb );
void xcb_stuff_wipe ( void );
/**
* @param w The xcb_window_t to read property from.
@ -188,12 +188,16 @@ int take_keyboard ( xcb_window_t w, int iters );
int take_pointer ( xcb_window_t w, int iters );
/**
* @param main_loop The GMainLoop
*
* Setup several items required.
* * Error handling,
* * Numlock detection
* * Cache
*
* @returns Whether the setup succeeded or not
*/
gboolean x11_setup ( void );
gboolean x11_setup ( GMainLoop *main_loop );
/**
* Depth of visual

View File

@ -97,8 +97,6 @@ unsigned int curr_switcher = 0;
/** Glib main loop. */
GMainLoop *main_loop = NULL;
/** GWater xcb source, signalling events from the X server */
GWaterXcbSource *main_loop_source = NULL;
/** Flag indicating we are in dmenu mode. */
static int dmenu_mode = FALSE;
@ -414,14 +412,11 @@ static void cleanup ()
}
rofi_view_workers_finalize ();
if ( main_loop != NULL ) {
if ( main_loop_source ) {
g_water_xcb_source_free ( main_loop_source );
}
g_main_loop_unref ( main_loop );
main_loop = NULL;
}
// Cleanup
xcb_stuff_wipe ( xcb );
xcb_stuff_wipe ();
// Cleaning up memory allocated by the Xresources file.
config_xresource_free ();
@ -631,7 +626,7 @@ static gboolean lazy_grab_pointer ( G_GNUC_UNUSED gpointer data )
g_warning ( "Failed to grab pointer after %u times. Giving up.", lazy_grab_retry_count_pt );
return G_SOURCE_REMOVE;
}
if ( take_pointer ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
if ( take_pointer ( xcb_stuff_get_root_window (), 0 ) ) {
return G_SOURCE_REMOVE;
}
lazy_grab_retry_count_pt++;
@ -645,7 +640,7 @@ static gboolean lazy_grab_keyboard ( G_GNUC_UNUSED gpointer data )
g_main_loop_quit ( main_loop );
return G_SOURCE_REMOVE;
}
if ( take_keyboard ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
if ( take_keyboard ( xcb_stuff_get_root_window (), 0 ) ) {
return G_SOURCE_REMOVE;
}
lazy_grab_retry_count_kb++;
@ -672,20 +667,20 @@ static gboolean startup ( G_GNUC_UNUSED gpointer data )
// this seems to result in the smallest delay for most people.
if ( ( window_flags & MENU_NORMAL_WINDOW ) == 0 ) {
if ( find_arg ( "-no-lazy-grab" ) >= 0 ) {
if ( !take_keyboard ( xcb_stuff_get_root_window ( xcb ), 500 ) ) {
if ( !take_keyboard ( xcb_stuff_get_root_window (), 500 ) ) {
g_warning ( "Failed to grab keyboard, even after %d uS.", 500 * 1000 );
g_main_loop_quit ( main_loop );
return G_SOURCE_REMOVE;
}
if ( !take_pointer ( xcb_stuff_get_root_window ( xcb ), 100 ) ) {
if ( !take_pointer ( xcb_stuff_get_root_window (), 100 ) ) {
g_warning ( "Failed to grab mouse pointer, even after %d uS.", 100 * 1000 );
}
}
else {
if ( !take_keyboard ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
if ( !take_keyboard ( xcb_stuff_get_root_window (), 0 ) ) {
g_timeout_add ( 1, lazy_grab_keyboard, NULL );
}
if ( !take_pointer ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
if ( !take_pointer ( xcb_stuff_get_root_window (), 0 ) ) {
g_timeout_add ( 1, lazy_grab_pointer, NULL );
}
}
@ -857,17 +852,17 @@ int main ( int argc, char *argv[] )
rofi_collect_modi_setup ();
TICK_N ( "Collect MODI" );
if ( !x11_setup () ) {
main_loop = g_main_loop_new ( NULL, FALSE );
TICK_N ( "Setup mainloop" );
if ( !x11_setup ( main_loop ) ) {
g_warning ( "Connection has error" );
cleanup ();
return EXIT_FAILURE;
}
TICK_N ( "Setup X11" );
main_loop = g_main_loop_new ( NULL, FALSE );
TICK_N ( "Setup mainloop" );
TICK_N ( "Startup Notification" );
// Setup keybinding
setup_abe ();
@ -956,7 +951,6 @@ int main ( int argc, char *argv[] )
if ( find_arg_uint ( "-record-screenshots", &interval ) ) {
g_timeout_add ( 1000 / (double) interval, record, NULL );
}
main_loop_source = g_water_xcb_source_new_for_connection ( NULL, xcb->connection, main_loop_x11_event_handler, main_loop, NULL );
TICK_N ( "X11 Setup " );

View File

@ -651,7 +651,7 @@ void __create_window ( MenuFlags menu_flags )
};
xcb_window_t box = xcb_generate_id ( xcb->connection );
xcb_void_cookie_t cc = xcb_create_window_checked ( xcb->connection, depth->depth, box, xcb_stuff_get_root_window ( xcb ),
xcb_void_cookie_t cc = xcb_create_window_checked ( xcb->connection, depth->depth, box, xcb_stuff_get_root_window (),
0, 0, 200, 100, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
visual->visual_id, selmask, selval );
xcb_generic_error_t *error;

View File

@ -93,7 +93,7 @@ const char *netatom_names[] = { EWMH_ATOMS ( ATOM_CHAR ) };
cairo_surface_t *x11_helper_get_screenshot_surface ( void )
{
return cairo_xcb_surface_create ( xcb->connection,
xcb_stuff_get_root_window ( xcb ), root_visual,
xcb_stuff_get_root_window (), root_visual,
xcb->screen->width_in_pixels, xcb->screen->height_in_pixels );
}
@ -651,18 +651,20 @@ static void x11_create_frequently_used_atoms ( void )
}
}
gboolean x11_setup ( void )
gboolean x11_setup ( GMainLoop *main_loop )
{
// Get DISPLAY, first env, then argument.
// We never modify display_str content.
char *display_str = ( char *) g_getenv ( "DISPLAY" );
find_arg_str ( "-display", &display_str );
xcb->connection = xcb_connect ( display_str, &xcb->screen_nbr );
if ( xcb_connection_has_error ( xcb->connection ) ) {
xcb->main_loop = main_loop;
xcb->source = g_water_xcb_source_new ( g_main_loop_get_context ( xcb->main_loop ), display_str, &xcb->screen_nbr, main_loop_x11_event_handler, NULL, NULL );
if ( xcb->source == NULL ) {
g_warning ( "Failed to open display: %s", display_str );
return FALSE;
}
xcb->connection = g_water_xcb_source_get_connection ( xcb->source );
TICK_N ( "Open Display" );
@ -819,7 +821,7 @@ void x11_create_visual_and_colormap ( void )
/**
* Process X11 events in the main-loop (gui-thread) of the application.
*/
static void main_loop_x11_event_handler_view ( xcb_generic_event_t *ev, GMainLoop *main_loop )
static void main_loop_x11_event_handler_view ( xcb_generic_event_t *ev )
{
RofiViewState *state = rofi_view_get_active ();
if ( state != NULL ) {
@ -829,19 +831,19 @@ static void main_loop_x11_event_handler_view ( xcb_generic_event_t *ev, GMainLoo
rofi_view_finalize ( state );
// cleanup
if ( rofi_view_get_active () == NULL ) {
g_main_loop_quit ( main_loop );
g_main_loop_quit ( xcb->main_loop );
}
}
}
}
gboolean main_loop_x11_event_handler ( xcb_generic_event_t *ev, gpointer user_data )
gboolean main_loop_x11_event_handler ( xcb_generic_event_t *ev, G_GNUC_UNUSED gpointer user_data )
{
if ( ev == NULL ) {
int status = xcb_connection_has_error ( xcb->connection );
if ( status > 0 ) {
g_warning ( "The XCB connection to X server had a fatal error: %d", status );
g_main_loop_quit ( user_data );
g_main_loop_quit ( xcb->main_loop );
return G_SOURCE_REMOVE;
}
else {
@ -874,7 +876,7 @@ gboolean main_loop_x11_event_handler ( xcb_generic_event_t *ev, gpointer user_da
ksne->lockedGroup );
xcb_generic_event_t dev;
dev.response_type = 0;
main_loop_x11_event_handler_view ( &dev, user_data );
main_loop_x11_event_handler_view ( &dev );
break;
}
}
@ -883,39 +885,42 @@ gboolean main_loop_x11_event_handler ( xcb_generic_event_t *ev, gpointer user_da
if ( xcb->sndisplay != NULL ) {
sn_xcb_display_process_event ( xcb->sndisplay, ev );
}
main_loop_x11_event_handler_view ( ev, user_data );
main_loop_x11_event_handler_view ( ev );
return G_SOURCE_CONTINUE;
}
xcb_window_t xcb_stuff_get_root_window ( xcb_stuff *xcb )
xcb_window_t xcb_stuff_get_root_window ( void )
{
return xcb->screen->root;
}
void xcb_stuff_wipe ( xcb_stuff *xcb )
void xcb_stuff_wipe ( void )
{
if ( xcb->connection == NULL ) {
return;
}
g_debug ( "Cleaning up XCB and XKB" );
nk_bindings_seat_free ( xcb->bindings_seat );
nk_bindings_free ( xcb->bindings );
if ( xcb->connection != NULL ) {
g_debug ( "Cleaning up XCB and XKB" );
if ( xcb->sncontext != NULL ) {
sn_launchee_context_unref ( xcb->sncontext );
xcb->sncontext = NULL;
}
if ( xcb->sndisplay != NULL ) {
sn_display_unref ( xcb->sndisplay );
xcb->sndisplay = NULL;
}
x11_monitors_free ();
xcb_ewmh_connection_wipe ( &( xcb->ewmh ) );
xcb_flush ( xcb->connection );
xcb_aux_sync ( xcb->connection );
xcb_disconnect ( xcb->connection );
xcb->connection = NULL;
xcb->screen = NULL;
xcb->screen_nbr = 0;
if ( xcb->sncontext != NULL ) {
sn_launchee_context_unref ( xcb->sncontext );
xcb->sncontext = NULL;
}
if ( xcb->sndisplay != NULL ) {
sn_display_unref ( xcb->sndisplay );
xcb->sndisplay = NULL;
}
x11_monitors_free ();
xcb_ewmh_connection_wipe ( &( xcb->ewmh ) );
xcb_flush ( xcb->connection );
xcb_aux_sync ( xcb->connection );
g_water_xcb_source_free ( xcb->source );
xcb->source = NULL;
xcb->connection = NULL;
xcb->screen = NULL;
xcb->screen_nbr = 0;
}
void x11_disable_decoration ( xcb_window_t window )
@ -947,7 +952,7 @@ void x11_helper_discover_window_manager ( void )
{
xcb_window_t wm_win = 0;
xcb_get_property_cookie_t cc = xcb_ewmh_get_supporting_wm_check_unchecked ( &xcb->ewmh,
xcb_stuff_get_root_window ( xcb ) );
xcb_stuff_get_root_window () );
if ( xcb_ewmh_get_supporting_wm_check_reply ( &xcb->ewmh, cc, &wm_win, NULL ) ) {
xcb_ewmh_get_utf8_strings_reply_t wtitle;