summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuentin Glidic <sardemff7+git@sardemff7.net>2017-06-01 14:55:17 +0200
committerQuentin Glidic <sardemff7+git@sardemff7.net>2017-06-01 15:06:57 +0200
commit48a80e3f82dc69e291060d1b1b338d60c6e4f3a6 (patch)
treec9dc0c885306ab64ff6390858b392f698a4b0eab
parent55485418a4ab62cfbf8f7aec85676c1ab458aaeb (diff)
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>
-rw-r--r--Makefile.am1
-rw-r--r--include/display.h66
-rw-r--r--include/xcb-internal.h1
-rw-r--r--include/xcb.h33
-rw-r--r--meson.build1
-rw-r--r--source/rofi.c22
-rw-r--r--source/view.c3
-rw-r--r--source/xcb.c22
8 files changed, 94 insertions, 55 deletions
diff --git a/Makefile.am b/Makefile.am
index cf770f11..980c0d3e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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\
diff --git a/include/display.h b/include/display.h
new file mode 100644
index 00000000..b0feb8c7
--- /dev/null
+++ b/include/display.h
@@ -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
diff --git a/include/xcb-internal.h b/include/xcb-internal.h
index 4189dc63..d01f110a 100644
--- a/include/xcb-internal.h
+++ b/include/xcb-internal.h
@@ -58,7 +58,6 @@ struct _xcb_stuff
/** Keyboard device id */
int32_t device_id;
} xkb;
- NkBindings *bindings;
NkBindingsSeat *bindings_seat;
gboolean mouse_seen;
};
diff --git a/include/xcb.h b/include/xcb.h
index c8ea4bcf..87f144e3 100644
--- a/include/xcb.h
+++ b/include/xcb.h
@@ -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.
@@ -135,18 +129,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
*/
extern xcb_depth_t *depth;
@@ -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.
*
@@ -179,17 +157,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
*
* Set the right hints to disable the window decoration.
diff --git a/meson.build b/meson.build
index d852d148..32847530 100644
--- a/meson.build
+++ b/meson.build
@@ -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',
diff --git a/source/rofi.c b/source/rofi.c
index 9c52437c..9ef3acf4 100644
--- a/source/rofi.c
+++ b/source/rofi.c
@@ -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;
diff --git a/source/view.c b/source/view.c
index 5776d845..7f568fc8 100644
--- a/source/view.c
+++ b/source/view.c
@@ -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 ();
}
}
diff --git a/source/xcb.c b/source/xcb.c
index 60e8bd6e..f2f41e3c 100644
--- a/source/xcb.c
+++ b/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;