mirror of https://github.com/davatorium/rofi.git
Small code restructure
This commit is contained in:
parent
0a11dd80ec
commit
c86a28ca70
|
@ -7,6 +7,11 @@
|
||||||
* The 'object' that makes a mode in rofi.
|
* The 'object' that makes a mode in rofi.
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of a mode.
|
||||||
|
* Access should be done via mode_* functions.
|
||||||
|
*/
|
||||||
typedef struct rofi_mode Mode;
|
typedef struct rofi_mode Mode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -152,9 +157,31 @@ void *mode_get_private_data ( const Mode *mode );
|
||||||
*/
|
*/
|
||||||
void mode_set_private_data ( Mode *mode, void *pd );
|
void mode_set_private_data ( Mode *mode, void *pd );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mode The mode to query
|
||||||
|
*
|
||||||
|
* Get the name of the mode as it should be presented to the user.
|
||||||
|
*
|
||||||
|
* @return the user visible name of the mode
|
||||||
|
*/
|
||||||
const char *mode_get_display_name ( const Mode *mode );
|
const char *mode_get_display_name ( const Mode *mode );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mode The mode to query
|
||||||
|
*
|
||||||
|
* Should be called once for each mode. This adds the display-name configuration option for the mode.
|
||||||
|
*/
|
||||||
void mode_set_config ( Mode *mode );
|
void mode_set_config ( Mode *mode );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mode The mode to query
|
||||||
|
* @param intput The input to process
|
||||||
|
*
|
||||||
|
* This processes the input so it can be used for matching and sorting.
|
||||||
|
* This includes removing pango markup.
|
||||||
|
*
|
||||||
|
* @returns a newly allocated string
|
||||||
|
*/
|
||||||
char * mode_preprocess_input ( Mode *mode, const char *input );
|
char * mode_preprocess_input ( Mode *mode, const char *input );
|
||||||
/*@}*/
|
/*@}*/
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -8,26 +8,84 @@
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle to the listview.
|
||||||
|
* No internal fields should be accessed directly.
|
||||||
|
*/
|
||||||
typedef struct _listview listview;
|
typedef struct _listview listview;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The scrolling type used in the list view
|
||||||
|
*/
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
/** Flip through the pages. */
|
||||||
LISTVIEW_SCROLL_PER_PAGE,
|
LISTVIEW_SCROLL_PER_PAGE,
|
||||||
|
/** keep selected item centered */
|
||||||
LISTVIEW_SCROLL_CONTINIOUS
|
LISTVIEW_SCROLL_CONTINIOUS
|
||||||
} ScrollType;
|
} ScrollType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tb The textbox to set
|
||||||
|
* @param entry The position of the textbox
|
||||||
|
* @param udata User data
|
||||||
|
* @param type The textbox font style to apply to this entry (normal, selected, alternative row)
|
||||||
|
* @param full If true Set both text and style.
|
||||||
|
*
|
||||||
|
* Update callback, this is called to set the value of each (visible) element.
|
||||||
|
*/
|
||||||
typedef void ( *listview_update_callback )( textbox *tb, unsigned int entry, void *udata, TextBoxFontType type, gboolean full );
|
typedef void ( *listview_update_callback )( textbox *tb, unsigned int entry, void *udata, TextBoxFontType type, gboolean full );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback when a element is activated.
|
||||||
|
*/
|
||||||
typedef void ( *listview_mouse_activated_cb )( listview *, xcb_button_press_event_t *, void * );
|
typedef void ( *listview_mouse_activated_cb )( listview *, xcb_button_press_event_t *, void * );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param cb The update callback.
|
||||||
|
* @param udata The user data to pass to the callback
|
||||||
|
* @param eh The height of one element
|
||||||
|
*
|
||||||
|
* @returns a new listview
|
||||||
|
*/
|
||||||
listview *listview_create ( listview_update_callback cb, void *udata, unsigned int eh );
|
listview *listview_create ( listview_update_callback cb, void *udata, unsigned int eh );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param lv The listview handle
|
||||||
|
* @param rows Number of elements
|
||||||
|
*
|
||||||
|
* Set the maximum number of elements to display.
|
||||||
|
*/
|
||||||
void listview_set_num_elements ( listview *lv, unsigned int rows );
|
void listview_set_num_elements ( listview *lv, unsigned int rows );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param lv The listview handle
|
||||||
|
* @param selected The row index to select
|
||||||
|
*
|
||||||
|
* Select the row, if selected > the number of rows, it selects the last one.
|
||||||
|
*/
|
||||||
void listview_set_selected ( listview *lv, unsigned int selected );
|
void listview_set_selected ( listview *lv, unsigned int selected );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param lv The listview handle
|
||||||
|
*
|
||||||
|
* Returns the selected row.
|
||||||
|
*
|
||||||
|
* @returns the selected row.
|
||||||
|
*/
|
||||||
unsigned int listview_get_selected ( listview *lv );
|
unsigned int listview_get_selected ( listview *lv );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param lv The listview handle
|
||||||
|
*
|
||||||
|
* Get the desired height of the listview widget.
|
||||||
|
*
|
||||||
|
* @returns the desired height.
|
||||||
|
*/
|
||||||
unsigned int listview_get_desired_height ( listview *lv );
|
unsigned int listview_get_desired_height ( listview *lv );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param state The listview handle
|
* @param lv The listview handle
|
||||||
*
|
*
|
||||||
* Move the selection one row up.
|
* Move the selection one row up.
|
||||||
* - Wrap around.
|
* - Wrap around.
|
||||||
|
|
|
@ -184,10 +184,7 @@ extern xcb_visualtype_t *visual;
|
||||||
* Color map to use for creating window
|
* Color map to use for creating window
|
||||||
*/
|
*/
|
||||||
extern xcb_colormap_t map;
|
extern xcb_colormap_t map;
|
||||||
/**
|
|
||||||
* Depth of root window.
|
|
||||||
*/
|
|
||||||
extern xcb_visualtype_t *root_visual;
|
|
||||||
/**
|
/**
|
||||||
* This function tries to create a 32bit TrueColor colormap.
|
* This function tries to create a 32bit TrueColor colormap.
|
||||||
* If this fails, it falls back to the default for the connected display.
|
* If this fails, it falls back to the default for the connected display.
|
||||||
|
@ -250,6 +247,14 @@ void x11_helper_set_cairo_rgba ( cairo_t *d, Color col );
|
||||||
* @returns a cairo surface with the background image of the desktop.
|
* @returns a cairo surface with the background image of the desktop.
|
||||||
*/
|
*/
|
||||||
cairo_surface_t * x11_helper_get_bg_surface ( void );
|
cairo_surface_t * x11_helper_get_bg_surface ( void );
|
||||||
|
/**
|
||||||
|
* Gets a surface for the root window of the desktop.
|
||||||
|
*
|
||||||
|
* Can be used to take screenshot.
|
||||||
|
*
|
||||||
|
* @returns a cairo surface for the root window of the desktop.
|
||||||
|
*/
|
||||||
|
cairo_surface_t *x11_helper_get_screenshot_surface ( void );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an internal represenation of the available monitors.
|
* Creates an internal represenation of the available monitors.
|
||||||
|
|
|
@ -56,8 +56,6 @@ const char *const monitor_position_entries[] = {
|
||||||
"on monitor with focused window",
|
"on monitor with focused window",
|
||||||
"on monitor that has mouse pointer"
|
"on monitor that has mouse pointer"
|
||||||
};
|
};
|
||||||
extern xcb_connection_t *xcb_connection;
|
|
||||||
extern xcb_screen_t *xcb_screen;
|
|
||||||
static int stored_argc = 0;
|
static int stored_argc = 0;
|
||||||
static char **stored_argv = NULL;
|
static char **stored_argv = NULL;
|
||||||
|
|
||||||
|
@ -192,6 +190,7 @@ static gchar *fuzzy_to_regex ( const char * input )
|
||||||
}
|
}
|
||||||
static GRegex * create_regex ( const char *input, int case_sensitive )
|
static GRegex * create_regex ( const char *input, int case_sensitive )
|
||||||
{
|
{
|
||||||
|
// Macro for quickly generating regex for matching.
|
||||||
#define R( s ) g_regex_new ( s, G_REGEX_OPTIMIZE | ( ( case_sensitive ) ? 0 : G_REGEX_CASELESS ), 0, NULL )
|
#define R( s ) g_regex_new ( s, G_REGEX_OPTIMIZE | ( ( case_sensitive ) ? 0 : G_REGEX_CASELESS ), 0, NULL )
|
||||||
GRegex * retv = NULL;
|
GRegex * retv = NULL;
|
||||||
gchar *r;
|
gchar *r;
|
||||||
|
|
|
@ -65,25 +65,43 @@
|
||||||
|
|
||||||
static int rofi_view_calculate_height ( RofiViewState *state );
|
static int rofi_view_calculate_height ( RofiViewState *state );
|
||||||
|
|
||||||
|
/** Thread pool used for filtering */
|
||||||
GThreadPool *tpool = NULL;
|
GThreadPool *tpool = NULL;
|
||||||
|
|
||||||
|
/** Global pointer to the currently active RofiViewState */
|
||||||
RofiViewState *current_active_menu = NULL;
|
RofiViewState *current_active_menu = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure holding cached state.
|
||||||
|
*/
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
/** main x11 windows */
|
||||||
xcb_window_t main_window;
|
xcb_window_t main_window;
|
||||||
|
/** surface containing the fake background. */
|
||||||
cairo_surface_t *fake_bg;
|
cairo_surface_t *fake_bg;
|
||||||
|
/** Draw context for main window */
|
||||||
xcb_gcontext_t gc;
|
xcb_gcontext_t gc;
|
||||||
|
/** Main X11 side pixmap to draw on. */
|
||||||
xcb_pixmap_t edit_pixmap;
|
xcb_pixmap_t edit_pixmap;
|
||||||
|
/** Cairo Surface for edit_pixmap */
|
||||||
cairo_surface_t *edit_surf;
|
cairo_surface_t *edit_surf;
|
||||||
|
/** Drawable context for edit_surf */
|
||||||
cairo_t *edit_draw;
|
cairo_t *edit_draw;
|
||||||
|
/** Indicate that fake background should be drawn relative to the window */
|
||||||
int fake_bgrel;
|
int fake_bgrel;
|
||||||
|
/** Main flags */
|
||||||
MenuFlags flags;
|
MenuFlags flags;
|
||||||
|
/** List of stacked views */
|
||||||
GQueue views;
|
GQueue views;
|
||||||
|
/** Current work area */
|
||||||
workarea mon;
|
workarea mon;
|
||||||
|
/** timeout for reloading */
|
||||||
guint idle_timeout;
|
guint idle_timeout;
|
||||||
|
/** debug counter for redraws */
|
||||||
uint64_t count;
|
uint64_t count;
|
||||||
guint repaint_timeout;
|
/** redraw idle time. */
|
||||||
|
guint repaint_source;
|
||||||
} CacheState = {
|
} CacheState = {
|
||||||
.main_window = XCB_WINDOW_NONE,
|
.main_window = XCB_WINDOW_NONE,
|
||||||
.fake_bg = NULL,
|
.fake_bg = NULL,
|
||||||
|
@ -94,7 +112,7 @@ struct
|
||||||
.views = G_QUEUE_INIT,
|
.views = G_QUEUE_INIT,
|
||||||
.idle_timeout = 0,
|
.idle_timeout = 0,
|
||||||
.count = 0L,
|
.count = 0L,
|
||||||
.repaint_timeout = 0,
|
.repaint_source = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static char * get_matching_state ( void )
|
static char * get_matching_state ( void )
|
||||||
|
@ -188,7 +206,7 @@ static gboolean rofi_view_repaint ( G_GNUC_UNUSED void * data )
|
||||||
0, 0, 0, 0, current_active_menu->width, current_active_menu->height );
|
0, 0, 0, 0, current_active_menu->width, current_active_menu->height );
|
||||||
xcb_flush ( xcb->connection );
|
xcb_flush ( xcb->connection );
|
||||||
TICK_N ( "flush" );
|
TICK_N ( "flush" );
|
||||||
CacheState.repaint_timeout = 0;
|
CacheState.repaint_source = 0;
|
||||||
}
|
}
|
||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
@ -299,10 +317,10 @@ void rofi_view_reload ( void )
|
||||||
}
|
}
|
||||||
void rofi_view_queue_redraw ( void )
|
void rofi_view_queue_redraw ( void )
|
||||||
{
|
{
|
||||||
if ( current_active_menu && CacheState.repaint_timeout == 0 ) {
|
if ( current_active_menu && CacheState.repaint_source == 0 ) {
|
||||||
CacheState.count++;
|
CacheState.count++;
|
||||||
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "redraw %lu\n", CacheState.count );
|
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "redraw %lu\n", CacheState.count );
|
||||||
CacheState.repaint_timeout = g_idle_add_full ( G_PRIORITY_HIGH_IDLE, rofi_view_repaint, NULL, NULL );
|
CacheState.repaint_source = g_idle_add_full ( G_PRIORITY_HIGH_IDLE, rofi_view_repaint, NULL, NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,11 +497,7 @@ static void rofi_view_setup_fake_transparency ( void )
|
||||||
*/
|
*/
|
||||||
TICK_N ( "Fake start" );
|
TICK_N ( "Fake start" );
|
||||||
if ( g_strcmp0 ( config.fake_background, "screenshot" ) == 0 ) {
|
if ( g_strcmp0 ( config.fake_background, "screenshot" ) == 0 ) {
|
||||||
s = cairo_xcb_surface_create ( xcb->connection,
|
s = x11_helper_get_screenshot_surface ();
|
||||||
xcb_stuff_get_root_window ( xcb ),
|
|
||||||
root_visual,
|
|
||||||
xcb->screen->width_in_pixels,
|
|
||||||
xcb->screen->height_in_pixels );
|
|
||||||
}
|
}
|
||||||
else if ( g_strcmp0 ( config.fake_background, "background" ) == 0 ) {
|
else if ( g_strcmp0 ( config.fake_background, "background" ) == 0 ) {
|
||||||
s = x11_helper_get_bg_surface ();
|
s = x11_helper_get_bg_surface ();
|
||||||
|
@ -1320,8 +1334,8 @@ void rofi_view_itterrate ( RofiViewState *state, xcb_generic_event_t *ev, xkb_st
|
||||||
}
|
}
|
||||||
rofi_view_update ( state );
|
rofi_view_update ( state );
|
||||||
|
|
||||||
if ( ( ev->response_type & ~0x80 ) == XCB_EXPOSE && CacheState.repaint_timeout == 0 ) {
|
if ( ( ev->response_type & ~0x80 ) == XCB_EXPOSE && CacheState.repaint_source == 0 ) {
|
||||||
CacheState.repaint_timeout = g_idle_add_full ( G_PRIORITY_HIGH_IDLE, rofi_view_repaint, NULL, NULL );
|
CacheState.repaint_source = g_idle_add_full ( G_PRIORITY_HIGH_IDLE, rofi_view_repaint, NULL, NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1577,8 +1591,8 @@ void rofi_view_cleanup ()
|
||||||
g_source_remove ( CacheState.idle_timeout );
|
g_source_remove ( CacheState.idle_timeout );
|
||||||
CacheState.idle_timeout = 0;
|
CacheState.idle_timeout = 0;
|
||||||
}
|
}
|
||||||
if ( CacheState.repaint_timeout > 0 ) {
|
if ( CacheState.repaint_source > 0 ) {
|
||||||
g_source_remove ( CacheState.repaint_timeout );
|
g_source_remove ( CacheState.repaint_source );
|
||||||
CacheState.idle_timeout = 0;
|
CacheState.idle_timeout = 0;
|
||||||
}
|
}
|
||||||
if ( CacheState.fake_bg ) {
|
if ( CacheState.fake_bg ) {
|
||||||
|
|
|
@ -51,8 +51,12 @@
|
||||||
#include "x11-helper.h"
|
#include "x11-helper.h"
|
||||||
#include "xkb-internal.h"
|
#include "xkb-internal.h"
|
||||||
|
|
||||||
|
/** Log domain for this module */
|
||||||
#define LOG_DOMAIN "X11Helper"
|
#define LOG_DOMAIN "X11Helper"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure holding xcb objects needed to function.
|
||||||
|
*/
|
||||||
struct _xcb_stuff xcb_int = {
|
struct _xcb_stuff xcb_int = {
|
||||||
.connection = NULL,
|
.connection = NULL,
|
||||||
.screen = NULL,
|
.screen = NULL,
|
||||||
|
@ -63,14 +67,32 @@ struct _xcb_stuff xcb_int = {
|
||||||
};
|
};
|
||||||
xcb_stuff *xcb = &xcb_int;
|
xcb_stuff *xcb = &xcb_int;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Depth of root window.
|
||||||
|
*/
|
||||||
xcb_depth_t *depth = NULL;
|
xcb_depth_t *depth = NULL;
|
||||||
xcb_visualtype_t *visual = NULL;
|
xcb_visualtype_t *visual = NULL;
|
||||||
xcb_colormap_t map = XCB_COLORMAP_NONE;
|
xcb_colormap_t map = XCB_COLORMAP_NONE;
|
||||||
xcb_visualtype_t *root_visual = NULL;
|
/**
|
||||||
|
* Visual of the root window.
|
||||||
|
*/
|
||||||
|
static xcb_visualtype_t *root_visual = NULL;
|
||||||
xcb_atom_t netatoms[NUM_NETATOMS];
|
xcb_atom_t netatoms[NUM_NETATOMS];
|
||||||
const char *netatom_names[] = { EWMH_ATOMS ( ATOM_CHAR ) };
|
const char *netatom_names[] = { EWMH_ATOMS ( ATOM_CHAR ) };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds for each supported modifier the possible modifier mask.
|
||||||
|
* Check x11_mod_masks[MODIFIER]&mask != 0 to see if MODIFIER is activated.
|
||||||
|
*/
|
||||||
static unsigned int x11_mod_masks[NUM_X11MOD];
|
static unsigned int x11_mod_masks[NUM_X11MOD];
|
||||||
|
|
||||||
|
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->screen->width_in_pixels, xcb->screen->height_in_pixels );
|
||||||
|
}
|
||||||
|
|
||||||
static xcb_pixmap_t get_root_pixmap ( xcb_connection_t *c,
|
static xcb_pixmap_t get_root_pixmap ( xcb_connection_t *c,
|
||||||
xcb_screen_t *screen,
|
xcb_screen_t *screen,
|
||||||
xcb_atom_t atom )
|
xcb_atom_t atom )
|
||||||
|
@ -824,10 +846,9 @@ void x11_helper_set_cairo_rgba ( cairo_t *d, Color col )
|
||||||
{
|
{
|
||||||
cairo_set_source_rgba ( d, col.red, col.green, col.blue, col.alpha );
|
cairo_set_source_rgba ( d, col.red, col.green, col.blue, col.alpha );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Color cache.
|
* Type of colors stored
|
||||||
*
|
|
||||||
* This stores the current color until
|
|
||||||
*/
|
*/
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -835,9 +856,16 @@ enum
|
||||||
BORDER,
|
BORDER,
|
||||||
SEPARATOR
|
SEPARATOR
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* Color cache.
|
||||||
|
*
|
||||||
|
* This stores the current color until
|
||||||
|
*/
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
|
/** The color */
|
||||||
Color color;
|
Color color;
|
||||||
|
/** Flag indicating it is set. */
|
||||||
unsigned int set;
|
unsigned int set;
|
||||||
} color_cache[3];
|
} color_cache[3];
|
||||||
|
|
||||||
|
@ -911,8 +939,9 @@ void xcb_stuff_wipe ( xcb_stuff *xcb )
|
||||||
|
|
||||||
void x11_disable_decoration ( xcb_window_t window )
|
void x11_disable_decoration ( xcb_window_t window )
|
||||||
{
|
{
|
||||||
#define MWM_HINTS_FUNCTIONS ( 1 << 0 )
|
// Flag used to indicate we are setting the decoration type.
|
||||||
#define MWM_HINTS_DECORATIONS ( 1 << 1 )
|
const uint32_t MWM_HINTS_DECORATIONS = ( 1 << 1 );
|
||||||
|
// Motif property data structure
|
||||||
struct MotifWMHints
|
struct MotifWMHints
|
||||||
{
|
{
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
@ -923,7 +952,7 @@ void x11_disable_decoration ( xcb_window_t window )
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MotifWMHints hints;
|
struct MotifWMHints hints;
|
||||||
hints.flags = /*MWM_HINTS_FUNCTIONS |*/ MWM_HINTS_DECORATIONS;
|
hints.flags = MWM_HINTS_DECORATIONS;
|
||||||
hints.decorations = 0;
|
hints.decorations = 0;
|
||||||
hints.functions = 0;
|
hints.functions = 0;
|
||||||
hints.inputMode = 0;
|
hints.inputMode = 0;
|
||||||
|
@ -931,6 +960,4 @@ void x11_disable_decoration ( xcb_window_t window )
|
||||||
|
|
||||||
xcb_atom_t ha = netatoms[_MOTIF_WM_HINTS];
|
xcb_atom_t ha = netatoms[_MOTIF_WM_HINTS];
|
||||||
xcb_change_property ( xcb->connection, XCB_PROP_MODE_REPLACE, window, ha, ha, 32, 5, &hints );
|
xcb_change_property ( xcb->connection, XCB_PROP_MODE_REPLACE, window, ha, ha, 32, 5, &hints );
|
||||||
#undef MWM_HINTS_DECORATIONS
|
|
||||||
#undef MWM_HINTS_FUNCTIONS
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue