mirror of
https://github.com/lbonn/rofi
synced 2024-11-26 22:00:20 +00:00
display: Introduce display.h
The API is meant to be neutral to fit any display backend. Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
parent
55485418a4
commit
48a80e3f82
8 changed files with 94 additions and 55 deletions
|
@ -73,6 +73,7 @@ SOURCES=\
|
|||
source/dialogs/window.c\
|
||||
source/dialogs/script.c\
|
||||
source/dialogs/help-keys.c\
|
||||
include/display.h\
|
||||
include/xcb.h\
|
||||
include/xcb-internal.h\
|
||||
include/rofi.h\
|
||||
|
|
66
include/display.h
Normal file
66
include/display.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* rofi
|
||||
*
|
||||
* MIT/X11 License
|
||||
* Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ROFI_DISPLAY_H
|
||||
#define ROFI_DISPLAY_H
|
||||
|
||||
#include <glib.h>
|
||||
#include "nkutils-bindings.h"
|
||||
|
||||
/**
|
||||
* @param main_loop The GMainLoop
|
||||
* @param bindings The bindings object
|
||||
*
|
||||
* Setup the display backend
|
||||
*
|
||||
* @returns Whether the setup succeeded or not
|
||||
*/
|
||||
gboolean display_setup(GMainLoop *main_loop, NkBindings *bindings);
|
||||
|
||||
/**
|
||||
* Do some late setup of the display backend
|
||||
*
|
||||
* @returns Whether the setup succeeded or not
|
||||
*/
|
||||
gboolean display_late_setup(void);
|
||||
|
||||
/**
|
||||
* Do some early cleanup, like unmapping the surface
|
||||
*/
|
||||
void display_early_cleanup(void);
|
||||
|
||||
/**
|
||||
* Cleanup any remaining display related stuff
|
||||
*/
|
||||
void display_cleanup(void);
|
||||
|
||||
/**
|
||||
* Dumps the display layout for -help output
|
||||
*/
|
||||
void display_dump_monitor_layout ( void );
|
||||
|
||||
#endif
|
|
@ -58,7 +58,6 @@ struct _xcb_stuff
|
|||
/** Keyboard device id */
|
||||
int32_t device_id;
|
||||
} xkb;
|
||||
NkBindings *bindings;
|
||||
NkBindingsSeat *bindings_seat;
|
||||
gboolean mouse_seen;
|
||||
};
|
||||
|
|
|
@ -49,12 +49,6 @@ extern xcb_stuff *xcb;
|
|||
* @returns the root window.
|
||||
*/
|
||||
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 ( void );
|
||||
|
||||
/**
|
||||
* @param w The xcb_window_t to read property from.
|
||||
|
@ -134,18 +128,6 @@ typedef struct _workarea
|
|||
*/
|
||||
int monitor_active ( workarea *mon );
|
||||
|
||||
/**
|
||||
* @param main_loop The GMainLoop
|
||||
*
|
||||
* Setup several items required.
|
||||
* * Error handling,
|
||||
* * Numlock detection
|
||||
* * Cache
|
||||
*
|
||||
* @returns Whether the setup succeeded or not
|
||||
*/
|
||||
gboolean x11_setup ( GMainLoop *main_loop );
|
||||
|
||||
/**
|
||||
* Depth of visual
|
||||
*/
|
||||
|
@ -159,10 +141,6 @@ extern xcb_visualtype_t *visual;
|
|||
*/
|
||||
extern xcb_colormap_t map;
|
||||
|
||||
gboolean x11_late_setup ( void );
|
||||
|
||||
void x11_early_cleanup ( void );
|
||||
|
||||
/**
|
||||
* Gets a surface containing the background image of the desktop.
|
||||
*
|
||||
|
@ -178,17 +156,6 @@ cairo_surface_t * x11_helper_get_bg_surface ( void );
|
|||
*/
|
||||
cairo_surface_t *x11_helper_get_screenshot_surface ( void );
|
||||
|
||||
/**
|
||||
* Creates an internal represenation of the available monitors.
|
||||
* Used for positioning rofi.
|
||||
*/
|
||||
void x11_build_monitor_layout ( void );
|
||||
|
||||
/**
|
||||
* Dump the monitor layout to stdout.
|
||||
*/
|
||||
void x11_dump_monitor_layout ( void );
|
||||
|
||||
/**
|
||||
* @param window The X11 window to modify
|
||||
*
|
||||
|
|
|
@ -164,6 +164,7 @@ rofi_sources = files(
|
|||
'source/dialogs/window.c',
|
||||
'source/dialogs/script.c',
|
||||
'source/dialogs/help-keys.c',
|
||||
'include/display.h',
|
||||
'include/xcb.h',
|
||||
'include/xcb-internal.h',
|
||||
'include/rofi.h',
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
|
||||
#include <libgwater-xcb.h>
|
||||
|
||||
#include "xcb-internal.h"
|
||||
#include "display.h"
|
||||
|
||||
#include "settings.h"
|
||||
#include "mode.h"
|
||||
|
@ -95,6 +95,8 @@ unsigned int num_modi = 0;
|
|||
/** Current selected mode */
|
||||
unsigned int curr_switcher = 0;
|
||||
|
||||
NkBindings *bindings = NULL;
|
||||
|
||||
/** Glib main loop. */
|
||||
GMainLoop *main_loop = NULL;
|
||||
|
||||
|
@ -146,7 +148,7 @@ static void teardown ( int pfd )
|
|||
// Cleanup font setup.
|
||||
textbox_cleanup ( );
|
||||
|
||||
x11_early_cleanup ();
|
||||
display_early_cleanup ();
|
||||
|
||||
// Cleanup view
|
||||
rofi_view_cleanup ();
|
||||
|
@ -277,7 +279,7 @@ static void help ( G_GNUC_UNUSED int argc, char **argv )
|
|||
printf ( "Global options:\n" );
|
||||
print_options ();
|
||||
printf ( "\n" );
|
||||
x11_dump_monitor_layout ();
|
||||
display_dump_monitor_layout ();
|
||||
printf ( "\n" );
|
||||
printf ( "Detected modi:\n" );
|
||||
print_list_of_modi ( is_term );
|
||||
|
@ -399,7 +401,9 @@ static void cleanup ()
|
|||
main_loop = NULL;
|
||||
}
|
||||
// Cleanup
|
||||
xcb_stuff_wipe ();
|
||||
display_cleanup ();
|
||||
|
||||
nk_bindings_free ( bindings );
|
||||
|
||||
// Cleaning up memory allocated by the Xresources file.
|
||||
config_xresource_free ();
|
||||
|
@ -785,7 +789,13 @@ int main ( int argc, char *argv[] )
|
|||
|
||||
TICK_N ( "Setup mainloop" );
|
||||
|
||||
if ( !x11_setup ( main_loop ) ) {
|
||||
bindings = nk_bindings_new ();
|
||||
if ( !parse_keys_abe ( bindings ) ) {
|
||||
cleanup ();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if ( !display_setup ( main_loop, bindings ) ) {
|
||||
g_warning ( "Connection has error" );
|
||||
cleanup ();
|
||||
return EXIT_FAILURE;
|
||||
|
@ -890,7 +900,7 @@ int main ( int argc, char *argv[] )
|
|||
}
|
||||
textbox_setup ();
|
||||
|
||||
if ( !x11_late_setup () ) {
|
||||
if ( !display_late_setup () ) {
|
||||
g_warning ( "Failed to properly finish display setup" );
|
||||
cleanup ();
|
||||
return EXIT_FAILURE;
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
|
||||
#include "rofi.h"
|
||||
#include "mode.h"
|
||||
#include "display.h"
|
||||
#include "xcb-internal.h"
|
||||
#include "helper.h"
|
||||
#include "helper-theme.h"
|
||||
|
@ -1649,7 +1650,7 @@ void rofi_view_hide ( void )
|
|||
{
|
||||
if ( CacheState.main_window != XCB_WINDOW_NONE ) {
|
||||
xcb_unmap_window ( xcb->connection, CacheState.main_window );
|
||||
x11_early_cleanup ();
|
||||
display_early_cleanup ();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
22
source/xcb.c
22
source/xcb.c
|
@ -49,6 +49,7 @@
|
|||
#include <xcb/xkb.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#include <xkbcommon/xkbcommon-x11.h>
|
||||
#include "display.h"
|
||||
#include "xcb-internal.h"
|
||||
#include "xcb.h"
|
||||
#include "settings.h"
|
||||
|
@ -277,7 +278,7 @@ static void x11_build_monitor_layout_xinerama ()
|
|||
free ( screens_reply );
|
||||
}
|
||||
|
||||
void x11_build_monitor_layout ()
|
||||
static void x11_build_monitor_layout ()
|
||||
{
|
||||
if ( xcb->monitors ) {
|
||||
return;
|
||||
|
@ -331,7 +332,7 @@ void x11_build_monitor_layout ()
|
|||
free ( res_reply );
|
||||
}
|
||||
|
||||
void x11_dump_monitor_layout ( void )
|
||||
void display_dump_monitor_layout ( void )
|
||||
{
|
||||
int is_term = isatty ( fileno ( stdout ) );
|
||||
printf ( "Monitor layout:\n" );
|
||||
|
@ -798,7 +799,7 @@ static void x11_create_frequently_used_atoms ( void )
|
|||
}
|
||||
}
|
||||
|
||||
gboolean x11_setup ( GMainLoop *main_loop )
|
||||
gboolean display_setup ( GMainLoop *main_loop, NkBindings *bindings )
|
||||
{
|
||||
// Get DISPLAY, first env, then argument.
|
||||
// We never modify display_str content.
|
||||
|
@ -879,8 +880,7 @@ gboolean x11_setup ( GMainLoop *main_loop )
|
|||
required_map_parts, /* map */
|
||||
&details );
|
||||
|
||||
xcb->bindings = nk_bindings_new ();
|
||||
xcb->bindings_seat = nk_bindings_seat_new ( xcb->bindings, XKB_CONTEXT_NO_FLAGS );
|
||||
xcb->bindings_seat = nk_bindings_seat_new ( bindings, XKB_CONTEXT_NO_FLAGS );
|
||||
struct xkb_keymap *keymap = xkb_x11_keymap_new_from_device ( nk_bindings_seat_get_context ( xcb->bindings_seat ), xcb->connection, xcb->xkb.device_id, XKB_KEYMAP_COMPILE_NO_FLAGS );
|
||||
if ( keymap == NULL ) {
|
||||
g_warning ( "Failed to get Keymap for current keyboard device." );
|
||||
|
@ -894,11 +894,6 @@ gboolean x11_setup ( GMainLoop *main_loop )
|
|||
|
||||
nk_bindings_seat_update_keymap ( xcb->bindings_seat, keymap, state );
|
||||
|
||||
if ( !parse_keys_abe ( xcb->bindings ) ) {
|
||||
// Error dialog
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// determine numlock mask so we can bind on keys with and without it
|
||||
x11_create_frequently_used_atoms ( );
|
||||
|
||||
|
@ -997,7 +992,7 @@ static gboolean lazy_grab_keyboard ( G_GNUC_UNUSED gpointer data )
|
|||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
gboolean x11_late_setup ( void )
|
||||
gboolean display_late_setup ( void )
|
||||
{
|
||||
x11_create_visual_and_colormap ();
|
||||
|
||||
|
@ -1035,14 +1030,14 @@ xcb_window_t xcb_stuff_get_root_window ( void )
|
|||
return xcb->screen->root;
|
||||
}
|
||||
|
||||
void x11_early_cleanup ( void )
|
||||
void display_early_cleanup ( void )
|
||||
{
|
||||
release_keyboard ( );
|
||||
release_pointer ( );
|
||||
xcb_flush ( xcb->connection );
|
||||
}
|
||||
|
||||
void xcb_stuff_wipe ( void )
|
||||
void display_cleanup ( void )
|
||||
{
|
||||
if ( xcb->connection == NULL ) {
|
||||
return;
|
||||
|
@ -1051,7 +1046,6 @@ void xcb_stuff_wipe ( void )
|
|||
g_debug ( "Cleaning up XCB and XKB" );
|
||||
|
||||
nk_bindings_seat_free ( xcb->bindings_seat );
|
||||
nk_bindings_free ( xcb->bindings );
|
||||
if ( xcb->sncontext != NULL ) {
|
||||
sn_launchee_context_unref ( xcb->sncontext );
|
||||
xcb->sncontext = NULL;
|
||||
|
|
Loading…
Reference in a new issue