Indent magic, rework makefile so lexer and yacc file are not passed.

This commit is contained in:
Dave Davenport 2017-01-08 21:36:06 +01:00
parent 8c0c43952d
commit baab2047ad
25 changed files with 834 additions and 809 deletions

View File

@ -27,7 +27,7 @@ dist_bin_SCRIPTS=\
nodist_rofi_SOURCES=\
$(top_builddir)/gitconfig.h
rofi_SOURCES=\
SOURCES=\
source/rofi.c\
source/view.c\
source/mode.c\
@ -53,8 +53,6 @@ rofi_SOURCES=\
source/dialogs/window.c\
source/dialogs/script.c\
source/dialogs/help-keys.c\
lexer/theme-parser.y\
lexer/theme-lexer.l\
include/xcb.h\
include/xcb-internal.h\
include/rofi.h\
@ -89,6 +87,11 @@ rofi_SOURCES=\
include/xkb.h\
include/xkb-internal.h
rofi_SOURCES=\
lexer/theme-parser.y\
lexer/theme-lexer.l\
$(SOURCES)
rofi_CFLAGS=\
$(AM_CFLAGS)\
$(glib_CFLAGS)\
@ -253,7 +256,7 @@ helper_pidfile_SOURCES=\
source/x11-helper.c\
include/x11-helper.h\
test/helper-pidfile.c
helper_tokenize_CFLAGS=$(textbox_test_CFLAGS)
helper_tokenize_LDADD=$(textbox_test_LDADD)
helper_tokenize_SOURCES=\
@ -399,7 +402,7 @@ TESTS=\
scrollbar_test
.PHONY: test-x
test-x: $(bin_PROGRAMS)
test-x: $(bin_PROGRAMS)
echo "Test 2"
$(top_srcdir)/test/run_test.sh 200 $(top_srcdir)/test/run_errormsg_test.sh $(top_builddir)
echo "Test 3"
@ -448,7 +451,7 @@ test-x1: $(bin_PROGRAMS)
.PHONY: indent
indent: $(rofi_SOURCES) $(helper_test_SOURCES) $(textbox_test_SOURCES) $(history_test_SOURCES) $(helper_expand_SOURCES)
indent: $(SOURCES)
uncrustify -c $(top_srcdir)/data/uncrustify.cfg --replace $^
.PHONY: cppcheck

View File

@ -6,7 +6,8 @@
#include <settings.h>
/** Style of line */
typedef enum {
typedef enum
{
/** Solid line */
SOLID,
/** Dashed line */
@ -16,7 +17,8 @@ typedef enum {
/**
* Distance unit type.
*/
typedef enum {
typedef enum
{
/** PixelWidth in pixels. */
PW_PX,
/** PixelWidth in EM. */
@ -28,7 +30,8 @@ typedef enum {
/**
* Structure representing a distance.
*/
typedef struct {
typedef struct
{
/** Distance */
double distance;
/** Unit type of the distance */
@ -40,14 +43,16 @@ typedef struct {
/**
* Type of orientation.
*/
typedef enum {
typedef enum
{
ORIENTATION_VERTICAL,
ORIENTATION_HORIZONTAL
} Orientation;
/**
* Type of property
*/
typedef enum {
typedef enum
{
/** Integer */
P_INTEGER,
/** Double */
@ -85,7 +90,7 @@ typedef struct
* Padding
*/
typedef struct
{
{
Distance top;
Distance right;
Distance bottom;
@ -95,29 +100,32 @@ typedef struct
/**
* Property structure.
*/
typedef struct Property {
typedef struct Property
{
/** Name of property */
char *name;
char *name;
/** Type of property. */
PropertyType type;
/** Value */
union {
union
{
/** integer */
int i;
int i;
/** Double */
double f;
double f;
/** String */
char *s;
char *s;
/** boolean */
gboolean b;
gboolean b;
/** Color */
ThemeColor color;
/** Padding */
Padding padding;
/** Reference */
struct {
struct
{
/** Name */
char *name;
char *name;
/** Cached looked up ref */
struct Property *ref;
} link;
@ -126,19 +134,19 @@ typedef struct Property {
/**
* ThemeWidget.
*/
typedef struct ThemeWidget {
int set;
char *name;
typedef struct ThemeWidget
{
int set;
char *name;
unsigned int num_widgets;
unsigned int num_widgets;
struct ThemeWidget **widgets;
GHashTable *properties;
GHashTable *properties;
struct ThemeWidget *parent;
} ThemeWidget;
/**
* Global pointer to the current active theme.
*/
@ -234,7 +242,7 @@ Distance rofi_theme_get_distance ( const widget *widget, const char *property, i
*
* @returns The integer value of this property for this widget.
*/
int rofi_theme_get_integer ( const widget *widget, const char *property, int def );
int rofi_theme_get_integer ( const widget *widget, const char *property, int def );
/**
* @param widget The widget to query
@ -267,7 +275,7 @@ int rofi_theme_get_integer_exact ( const widget *widget, const char *property, i
*
* @returns The boolean value of this property for this widget.
*/
int rofi_theme_get_boolean ( const widget *widget, const char *property, int def );
int rofi_theme_get_boolean ( const widget *widget, const char *property, int def );
/**
* @param widget The widget to query
@ -278,7 +286,7 @@ int rofi_theme_get_boolean ( const widget *widget, const char *property, int
*
* @returns The string value of this property for this widget.
*/
char *rofi_theme_get_string ( const widget *widget, const char *property, char *def );
char *rofi_theme_get_string ( const widget *widget, const char *property, char *def );
/**
* @param widget The widget to query
@ -289,7 +297,7 @@ char *rofi_theme_get_string ( const widget *widget, const char *property, cha
*
* @returns The double value of this property for this widget.
*/
double rofi_theme_get_double ( const widget *widget, const char *property, double def );
double rofi_theme_get_double ( const widget *widget, const char *property, double def );
/**
* @param widget The widget to query
@ -299,7 +307,7 @@ double rofi_theme_get_double ( const widget *widget, const char *property, dou
* Obtain the color of the widget and applies this to the drawable d.
*
*/
void rofi_theme_get_color ( const widget *widget, const char *property, cairo_t *d);
void rofi_theme_get_color ( const widget *widget, const char *property, cairo_t *d );
/**
* @param widget The widget to query

View File

@ -24,7 +24,7 @@ struct RofiViewState
/** Flag indicating if view needs to be refiltered. */
int refilter;
/** Widget representing the main container. */
container *main_window;
container *main_window;
/** Main #box widget holding different elements. */
box *main_box;
/** #box widget packing the input bar widgets. */

View File

@ -111,7 +111,6 @@ unsigned int rofi_view_get_selected_line ( const RofiViewState *state );
*/
void rofi_view_restart ( RofiViewState *state );
/**
* @param state The handle to the view
* @param action The keyboard action

View File

@ -40,7 +40,7 @@ typedef struct
int blink;
guint blink_timeout;
//
const char *theme_name ;
const char *theme_name;
} textbox;
/**
@ -48,16 +48,16 @@ typedef struct
*/
typedef enum
{
TB_AUTOHEIGHT = 1 << 0,
TB_AUTOWIDTH = 1 << 1,
TB_LEFT = 1 << 16,
TB_RIGHT = 1 << 17,
TB_CENTER = 1 << 18,
TB_EDITABLE = 1 << 19,
TB_MARKUP = 1 << 20,
TB_WRAP = 1 << 21,
TB_PASSWORD = 1 << 22,
TB_INDICATOR = 1 << 23,
TB_AUTOHEIGHT = 1 << 0,
TB_AUTOWIDTH = 1 << 1,
TB_LEFT = 1 << 16,
TB_RIGHT = 1 << 17,
TB_CENTER = 1 << 18,
TB_EDITABLE = 1 << 19,
TB_MARKUP = 1 << 20,
TB_WRAP = 1 << 21,
TB_PASSWORD = 1 << 22,
TB_INDICATOR = 1 << 23,
} TextboxFlags;
/**
* Flags indicating current state of the textbox.

View File

@ -57,8 +57,8 @@ struct _widget
void ( *free )( struct _widget *widget );
/** Name of widget (used for theming) */
char *name;
const char *state;
char *name;
const char *state;
};
/**
@ -68,7 +68,7 @@ struct _widget
* Initializes the widget structure.
*
*/
void widget_init ( widget *widget , const char *name );
void widget_init ( widget *widget, const char *name );
/**
* @param widget The widget handle.
@ -117,17 +117,17 @@ int widget_padding_get_bottom ( const widget *wid );
/**
* @param wid The widget handle.
*
* Get width of the content of the widget
* Get width of the content of the widget
*
* @returns the widget width, excluding padding.
* @returns the widget width, excluding padding.
*/
int widget_padding_get_remaining_width ( const widget *wid );
/**
* @param wid The widget handle.
*
* Get height of the content of the widget
* Get height of the content of the widget
*
* @returns the widget height, excluding padding.
* @returns the widget height, excluding padding.
*/
int widget_padding_get_remaining_height ( const widget *wid );
/**

View File

@ -174,7 +174,6 @@ void widget_set_clicked_handler ( widget *wid, widget_clicked_cb cb, void *udata
*/
gboolean widget_motion_notify ( widget *wid, xcb_motion_notify_event_t *xme );
/**
* @param wid The widget handle
* @param name The name of the widget.

View File

@ -137,21 +137,23 @@ static void async_read_callback ( GObject *source_object, GAsyncResult *res, gpo
g_data_input_stream_read_upto_async ( pd->data_input_stream, &( pd->separator ), 1, G_PRIORITY_LOW, pd->cancel,
async_read_callback, pd );
return;
} else {
}
else {
GError *error = NULL;
// Absorb separator, already in buffer so should not block.
// If error == NULL end of stream..
g_data_input_stream_read_byte ( stream, NULL, &error);
g_data_input_stream_read_byte ( stream, NULL, &error );
if ( error == NULL ) {
// Add empty line.
read_add ( pd, "", 0);
read_add ( pd, "", 0 );
rofi_view_reload ();
g_data_input_stream_read_upto_async ( pd->data_input_stream, &( pd->separator ), 1, G_PRIORITY_LOW, pd->cancel,
async_read_callback, pd );
async_read_callback, pd );
return;
} else {
g_error_free (error);
}
else {
g_error_free ( error );
}
}
if ( !g_cancellable_is_cancelled ( pd->cancel ) ) {

View File

@ -192,7 +192,7 @@ static void exec_cmd_entry ( DRunModeEntry *e )
fprintf ( stderr, "Nothing to execute after processing: %s.\n", e->exec );;
return;
}
gchar *fp = rofi_expand_path ( g_strstrip ( str ) );
gchar *fp = rofi_expand_path ( g_strstrip ( str ) );
gchar *exec_path = g_key_file_get_string ( e->key_file, "Desktop Entry", "Path", NULL );
if ( execsh ( exec_path, fp, e->terminal ) ) {
char *path = g_build_filename ( cache_dir, DRUN_CACHE_FILE, NULL );
@ -539,12 +539,12 @@ static int drun_token_match ( const Mode *data, GRegex **tokens, unsigned int in
test = 1;
}
// Match against category.
if ( !test ){
gchar **list = g_key_file_get_locale_string_list ( rmpd->entry_list[index].key_file, "Desktop Entry", "Categories" , NULL, NULL,NULL );
for ( int iter = 0; !test && list && list[iter]; iter++){
test = token_match ( ftokens, list[iter]);
if ( !test ) {
gchar **list = g_key_file_get_locale_string_list ( rmpd->entry_list[index].key_file, "Desktop Entry", "Categories", NULL, NULL, NULL );
for ( int iter = 0; !test && list && list[iter]; iter++ ) {
test = token_match ( ftokens, list[iter] );
}
g_strfreev(list);
g_strfreev ( list );
}
if ( test == 0 ) {
match = 0;

View File

@ -146,7 +146,7 @@ static ModeMode script_mode_result ( Mode *sw, int mretv, char **input, unsigned
rmpd->cmd_list = new_list;
rmpd->cmd_list_length = new_length;
retv = RESET_DIALOG;
retv = RESET_DIALOG;
}
return retv;
}

View File

@ -198,7 +198,7 @@ static char **read_hosts_file ( char ** retv, unsigned int *length )
// Reading one line per time.
while ( getline ( &buffer, &buffer_length, fd ) > 0 ) {
// Evaluate one line.
unsigned int index = 0, ti = 0;
unsigned int index = 0, ti = 0;
char *token = buffer;
// Tokenize it.

View File

@ -399,13 +399,12 @@ static void _window_mode_load_data ( Mode *sw, unsigned int cd )
// Check if we are in I3 mode. I3 has to be special and allow markup in it window name......
char *i3_socket_path = window_get_text_prop ( xcb_stuff_get_root_window ( xcb ), netatoms[I3_SOCKET_PATH] );
if ( i3_socket_path != NULL ){
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Detected I3 Window manager running.");
if ( i3_socket_path != NULL ) {
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Detected I3 Window manager running." );
pd->i3_mode = TRUE;
g_free ( i3_socket_path );
}
// Create cache
x11_cache_create ();
@ -488,15 +487,15 @@ static void _window_mode_load_data ( Mode *sw, unsigned int cd )
if ( has_names ) {
if ( pd->i3_mode ) {
char *output = NULL;
if (pango_parse_markup ( _window_name_list_entry ( names.strings, names.strings_len,
c->wmdesktop ),-1, 0, NULL, &output, NULL, NULL)){
if ( pango_parse_markup ( _window_name_list_entry ( names.strings, names.strings_len,
c->wmdesktop ), -1, 0, NULL, &output, NULL, NULL ) ) {
c->wmdesktopstr = output;
}
else {
c->wmdesktopstr = g_strdup ( "Invalid name");
c->wmdesktopstr = g_strdup ( "Invalid name" );
}
} else {
}
else {
c->wmdesktopstr = g_strdup ( _window_name_list_entry ( names.strings, names.strings_len, c->wmdesktop ) );
}
}
@ -634,7 +633,7 @@ static ModeMode window_mode_result ( Mode *sw, int mretv, G_GNUC_UNUSED char **i
}
}
else if ( ( mretv & ( MENU_ENTRY_DELETE ) ) == MENU_ENTRY_DELETE ) {
xcb_ewmh_request_close_window ( &(xcb->ewmh), xcb->screen_nbr, rmpd->ids->array[selected_line], XCB_CURRENT_TIME, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER);
xcb_ewmh_request_close_window ( &( xcb->ewmh ), xcb->screen_nbr, rmpd->ids->array[selected_line], XCB_CURRENT_TIME, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER );
xcb_flush ( xcb->connection );
}
return retv;

View File

@ -181,11 +181,13 @@ static gchar *fuzzy_to_regex ( const char * input )
else {
g_string_append ( str, ".*(" );
}
if ( *iter == '\\' ){
g_string_append_c ( str, '\\');
if ( *iter == '\\' ) {
g_string_append_c ( str, '\\' );
iter = g_utf8_next_char ( iter );
// If EOL, break out of for loop.
if ( (*iter) == '\0' ) break;
if ( ( *iter ) == '\0' ) {
break;
}
}
g_string_append_unichar ( str, g_utf8_get_char ( iter ) );
g_string_append ( str, ")" );
@ -246,7 +248,7 @@ GRegex **tokenize ( const char *input, int case_sensitive )
}
char *saveptr = NULL, *token;
GRegex **retv = NULL;
GRegex **retv = NULL;
if ( !config.tokenize ) {
retv = g_malloc0 ( sizeof ( GRegex* ) * 2 );
retv[0] = (GRegex *) create_regex ( input, case_sensitive );
@ -297,19 +299,19 @@ int find_arg_str ( const char * const key, char** val )
const char ** find_arg_strv ( const char *const key )
{
const char **retv =NULL;
int length = 0;
const char **retv = NULL;
int length = 0;
for ( int i = 0; i < stored_argc; i++ ) {
if ( strcasecmp ( stored_argv[i], key ) == 0 && i < (stored_argc -1 ) ){
if ( strcasecmp ( stored_argv[i], key ) == 0 && i < ( stored_argc - 1 ) ) {
length++;
}
}
if ( length > 0 ) {
retv = g_malloc0((length+1)*sizeof(char*));
retv = g_malloc0 ( ( length + 1 ) * sizeof ( char* ) );
int index = 0;
for ( int i = 0; i < stored_argc; i++ ) {
if ( strcasecmp ( stored_argv[i], key ) == 0 && i < (stored_argc -1 ) ){
retv[index++] = stored_argv[i+1];
if ( strcasecmp ( stored_argv[i], key ) == 0 && i < ( stored_argc - 1 ) ) {
retv[index++] = stored_argv[i + 1];
}
}
}

View File

@ -193,7 +193,7 @@ KeyBindingAction abe_find_action ( unsigned int mask, xkb_keysym_t key )
void abe_trigger_release ( void )
{
RofiViewState *state;
RofiViewState *state;
state = rofi_view_get_active ( );
if ( state ) {

View File

@ -270,46 +270,47 @@ static void help ( G_GNUC_UNUSED int argc, char **argv )
printf ( "\n" );
x11_dump_monitor_layout ();
printf ( "\n" );
printf ( "Compile time options:\n");
printf ( "Compile time options:\n" );
#ifdef WINDOW_MODE
printf ( "\t* window %senabled%s\n", is_term?color_green:"", is_term?color_reset:"");
printf ( "\t* window %senabled%s\n", is_term ? color_green : "", is_term ? color_reset : "" );
#else
printf ( "\t* window %sdisabled%s\n", is_term?color_red:"", is_term?color_reset:"");
printf ( "\t* window %sdisabled%s\n", is_term ? color_red : "", is_term ? color_reset : "" );
#endif
#ifdef ENABLE_DRUN
printf ( "\t* drun %senabled%s\n", is_term?color_green:"", is_term?color_reset:"");
printf ( "\t* drun %senabled%s\n", is_term ? color_green : "", is_term ? color_reset : "" );
#else
printf ( "\t* drun %sdisabled%s\n", is_term?color_red:"", is_term?color_reset:"");
printf ( "\t* drun %sdisabled%s\n", is_term ? color_red : "", is_term ? color_reset : "" );
#endif
#ifdef TIMINGS
printf ( "\t* timings %senabled%s\n", is_term?color_green:"", is_term?color_reset:"");
printf ( "\t* timings %senabled%s\n", is_term ? color_green : "", is_term ? color_reset : "" );
#else
printf ( "\t* timings %sdisabled%s\n", is_term?color_red:"", is_term?color_reset:"");
printf ( "\t* timings %sdisabled%s\n", is_term ? color_red : "", is_term ? color_reset : "" );
#endif
#ifdef ENABLE_GCOV
printf ( "\t* gcov %senabled%s\n", is_term?color_green:"", is_term?color_reset:"");
printf ( "\t* gcov %senabled%s\n", is_term ? color_green : "", is_term ? color_reset : "" );
#else
printf ( "\t* gcov %sdisabled%s\n", is_term?color_red:"", is_term?color_reset:"");
printf ( "\t* gcov %sdisabled%s\n", is_term ? color_red : "", is_term ? color_reset : "" );
#endif
#ifdef ENABLE_ASAN
printf ( "\t* asan %senabled%s\n", is_term?color_green:"", is_term?color_reset:"");
printf ( "\t* asan %senabled%s\n", is_term ? color_green : "", is_term ? color_reset : "" );
#else
printf ( "\t* asan %sdisabled%s\n", is_term?color_red:"", is_term?color_reset:"");
printf ( "\t* asan %sdisabled%s\n", is_term ? color_red : "", is_term ? color_reset : "" );
#endif
printf ( "\n" );
printf ( "For more information see: %sman rofi%s\n", is_term?color_bold:"",is_term?color_reset:"" );
printf ( "For more information see: %sman rofi%s\n", is_term ? color_bold : "", is_term ? color_reset : "" );
#ifdef GIT_VERSION
printf ( " Version: %s"GIT_VERSION "%s\n", is_term?color_bold:"",is_term?color_reset:"" );
printf ( " Version: %s"GIT_VERSION "%s\n", is_term ? color_bold : "", is_term ? color_reset : "" );
#else
printf ( " Version: %s"VERSION "%s\n", is_term?color_bold:"",is_term?color_reset:"" );
printf ( " Version: %s"VERSION "%s\n", is_term ? color_bold : "", is_term ? color_reset : "" );
#endif
printf ( " Bugreports: %s"PACKAGE_BUGREPORT "%s\n", is_term?color_bold:"",is_term?color_reset:"" );
printf ( " Support: %s"PACKAGE_URL "%s\n", is_term?color_bold:"",is_term?color_reset:"" );
printf ( " %s#rofi @ freenode.net%s\n", is_term?color_bold:"",is_term?color_reset:"" );
printf ( " Bugreports: %s"PACKAGE_BUGREPORT "%s\n", is_term ? color_bold : "", is_term ? color_reset : "" );
printf ( " Support: %s"PACKAGE_URL "%s\n", is_term ? color_bold : "", is_term ? color_reset : "" );
printf ( " %s#rofi @ freenode.net%s\n", is_term ? color_bold : "", is_term ? color_reset : "" );
if ( find_arg ( "-no-config" ) < 0 ) {
printf ( " Configuration file: %s%s%s\n", is_term?color_bold:"", config_path, is_term?color_reset:"" );
} else {
printf ( " Configuration file: %sDisabled%s\n", is_term?color_bold:"", is_term?color_reset:"" );
printf ( " Configuration file: %s%s%s\n", is_term ? color_bold : "", config_path, is_term ? color_reset : "" );
}
else {
printf ( " Configuration file: %sDisabled%s\n", is_term ? color_bold : "", is_term ? color_reset : "" );
}
}
@ -396,7 +397,7 @@ static int add_mode ( const char * token )
}
else
#endif // WINDOW_MODE
// SSh dialog
// SSh dialog
if ( strcasecmp ( token, "ssh" ) == 0 ) {
modi[num_modi] = &ssh_mode;
num_modi++;
@ -489,7 +490,8 @@ static inline void load_configuration_dynamic ( )
/**
* 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){
static void main_loop_x11_event_handler_view ( xcb_generic_event_t *ev )
{
RofiViewState *state = rofi_view_get_active ();
if ( state != NULL ) {
rofi_view_itterrate ( state, ev, &xkb );
@ -585,12 +587,12 @@ unsigned int lazy_grab_retry_count_pt = 0;
static gboolean lazy_grab_pointer ( G_GNUC_UNUSED gpointer data )
{
// After 5 sec.
if ( lazy_grab_retry_count_kb > (5*1000)) {
fprintf(stderr, "Failed to grab keyboard after %u times. Giving up.\n", lazy_grab_retry_count_kb);
if ( lazy_grab_retry_count_kb > ( 5 * 1000 ) ) {
fprintf ( stderr, "Failed to grab keyboard after %u times. Giving up.\n", lazy_grab_retry_count_kb );
g_main_loop_quit ( main_loop );
return G_SOURCE_REMOVE;
}
if ( take_pointer ( xcb_stuff_get_root_window ( xcb ), 0 ) ){
if ( take_pointer ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
return G_SOURCE_REMOVE;
}
lazy_grab_retry_count_kb++;
@ -599,11 +601,11 @@ static gboolean lazy_grab_pointer ( G_GNUC_UNUSED gpointer data )
static gboolean lazy_grab_keyboard ( G_GNUC_UNUSED gpointer data )
{
// After 5 sec.
if ( lazy_grab_retry_count_pt > (5*1000)) {
fprintf(stderr, "Failed to grab pointer after %u times. Giving up.\n", lazy_grab_retry_count_pt);
if ( lazy_grab_retry_count_pt > ( 5 * 1000 ) ) {
fprintf ( stderr, "Failed to grab pointer after %u times. Giving up.\n", lazy_grab_retry_count_pt );
return G_SOURCE_REMOVE;
}
if ( take_keyboard ( xcb_stuff_get_root_window ( xcb), 0 ) ){
if ( take_keyboard ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
return G_SOURCE_REMOVE;
}
lazy_grab_retry_count_pt++;
@ -629,23 +631,23 @@ static gboolean startup ( G_GNUC_UNUSED gpointer data )
// We grab this using the rootwindow (as dmenu does it).
// this seems to result in the smallest delay for most people.
if ( ( window_flags & MENU_NORMAL_WINDOW ) == 0 ) {
if ( find_arg ( "-lazy-grab") >= 0 ){
if ( !take_keyboard ( xcb_stuff_get_root_window ( xcb), 0) ){
g_timeout_add ( 1,lazy_grab_keyboard, NULL);
if ( find_arg ( "-lazy-grab" ) >= 0 ) {
if ( !take_keyboard ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
g_timeout_add ( 1, lazy_grab_keyboard, NULL );
}
if ( !take_pointer ( xcb_stuff_get_root_window ( xcb ), 0 )) {
g_timeout_add ( 1,lazy_grab_pointer, NULL);
if ( !take_pointer ( xcb_stuff_get_root_window ( xcb ), 0 ) ) {
g_timeout_add ( 1, lazy_grab_pointer, NULL );
}
} else {
if ( !take_keyboard ( xcb_stuff_get_root_window ( xcb), 500) ){
}
else {
if ( !take_keyboard ( xcb_stuff_get_root_window ( xcb ), 500 ) ) {
fprintf ( stderr, "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 ) ) {
fprintf ( stderr, "Failed to grab mouse pointer, even after %d uS.", 100*1000);
if ( !take_pointer ( xcb_stuff_get_root_window ( xcb ), 100 ) ) {
fprintf ( stderr, "Failed to grab mouse pointer, even after %d uS.", 100 * 1000 );
}
}
}
TICK_N ( "Grab keyboard" );
@ -949,26 +951,25 @@ int main ( int argc, char *argv[] )
TICK_N ( "Parse theme" );
rofi_theme_parse_file ( config.theme );
TICK_N ( "Parsed theme" );
} else {
}
else {
rofi_theme_convert_old_theme ( );
}
const char ** theme_str = find_arg_strv ( "-theme-str" );
if ( theme_str ) {
for ( int index = 0; theme_str && theme_str[index]; index++ ){
if ( ! rofi_theme_parse_string ( theme_str[index] ) ){
fprintf(stderr, "Failed to parse: %s\n", theme_str[index]);
for ( int index = 0; theme_str && theme_str[index]; index++ ) {
if ( !rofi_theme_parse_string ( theme_str[index] ) ) {
fprintf ( stderr, "Failed to parse: %s\n", theme_str[index] );
exit ( EXIT_FAILURE );
}
}
g_free ( theme_str );
}
if ( find_arg ( "-dump-theme" ) >= 0 ){
if ( find_arg ( "-dump-theme" ) >= 0 ) {
rofi_theme_print ( rofi_theme );
exit (EXIT_SUCCESS);
exit ( EXIT_SUCCESS );
}
// Dump.
// catch help request

View File

@ -10,27 +10,27 @@
#include "view.h"
/** Logging domain for theme */
#define LOG_DOMAIN "Theme"
#define LOG_DOMAIN "Theme"
void yyerror ( YYLTYPE *ylloc, const char *);
void yyerror ( YYLTYPE *ylloc, const char * );
static gboolean distance_compare ( Distance d, Distance e )
{
return ( d.type == e.type && d.distance == e.distance && d.style == e.style );
return d.type == e.type && d.distance == e.distance && d.style == e.style;
}
ThemeWidget *rofi_theme_find_or_create_name ( ThemeWidget *base, const char *name )
{
for ( unsigned int i = 0; i < base->num_widgets;i++){
if ( g_strcmp0(base->widgets[i]->name, name) == 0 ){
for ( unsigned int i = 0; i < base->num_widgets; i++ ) {
if ( g_strcmp0 ( base->widgets[i]->name, name ) == 0 ) {
return base->widgets[i];
}
}
base->widgets = g_realloc ( base->widgets, sizeof(ThemeWidget*)*(base->num_widgets+1));
base->widgets[base->num_widgets] = g_malloc0(sizeof(ThemeWidget));
base->widgets = g_realloc ( base->widgets, sizeof ( ThemeWidget* ) * ( base->num_widgets + 1 ) );
base->widgets[base->num_widgets] = g_malloc0 ( sizeof ( ThemeWidget ) );
ThemeWidget *retv = base->widgets[base->num_widgets];
retv->parent = base;
retv->name = g_strdup(name);
retv->name = g_strdup ( name );
base->num_widgets++;
return retv;
}
@ -39,7 +39,7 @@ ThemeWidget *rofi_theme_find_or_create_name ( ThemeWidget *base, const char *nam
*/
Property *rofi_theme_property_create ( PropertyType type )
{
Property *retv = g_malloc0 ( sizeof(Property) );
Property *retv = g_malloc0 ( sizeof ( Property ) );
retv->type = type;
return retv;
}
@ -51,21 +51,22 @@ void rofi_theme_property_free ( Property *p )
g_free ( p->name );
if ( p->type == P_STRING ) {
g_free ( p->value.s );
} else if ( p->type == P_LINK ) {
}
else if ( p->type == P_LINK ) {
g_free ( p->value.link.name );
}
g_free(p);
g_free ( p );
}
void rofi_theme_free ( ThemeWidget *widget )
{
if ( widget == NULL ){
if ( widget == NULL ) {
return;
}
if ( widget->properties ) {
g_hash_table_destroy ( widget->properties );
}
for ( unsigned int i = 0; i < widget->num_widgets; i++ ){
for ( unsigned int i = 0; i < widget->num_widgets; i++ ) {
rofi_theme_free ( widget->widgets[i] );
}
g_free ( widget->widgets );
@ -79,14 +80,16 @@ void rofi_theme_free ( ThemeWidget *widget )
static void rofi_theme_print_distance ( Distance d )
{
if ( d.type == PW_PX ) {
printf("%upx ", (int)d.distance );
} else if ( d.type == PW_PERCENT ) {
printf("%f%% ", d.distance );
} else {
printf("%fem ", d.distance );
printf ( "%upx ", (int) d.distance );
}
else if ( d.type == PW_PERCENT ) {
printf ( "%f%% ", d.distance );
}
else {
printf ( "%fem ", d.distance );
}
if ( d.style == DASH ) {
printf("dash ");
printf ( "dash " );
}
}
/** Textual representation of Window Location */
@ -105,56 +108,59 @@ const char const * WindowLocationStr[9] = {
static void rofi_theme_print_property_index ( size_t pnl, int depth, Property *p )
{
int pl = strlen ( p->name );
printf("%*s%s:%*s ", depth, "", p->name, (int)pnl-pl,"" );
printf ( "%*s%s:%*s ", depth, "", p->name, (int) pnl - pl, "" );
switch ( p->type )
{
case P_POSITION:
printf("%s;", WindowLocationStr[p->value.i]);
break;
case P_STRING:
printf("\"%s\";", p->value.s);
break;
case P_INTEGER:
printf("%d;", p->value.i);
break;
case P_DOUBLE:
printf("%.2f;", p->value.f);
break;
case P_BOOLEAN:
printf("%s;", p->value.b?"true":"false");
break;
case P_COLOR:
printf("#%02X%02X%02X%02X;",
(unsigned char)(p->value.color.alpha*255.0),
(unsigned char)(p->value.color.red*255.0),
(unsigned char)(p->value.color.green*255.0),
(unsigned char)(p->value.color.blue*255.0));
break;
case P_PADDING:
if ( distance_compare ( p->value.padding.top, p->value.padding.bottom) &&
distance_compare ( p->value.padding.left, p->value.padding.right) &&
distance_compare ( p->value.padding.left, p->value.padding.top) ) {
rofi_theme_print_distance ( p->value.padding.left );
} else if ( distance_compare ( p->value.padding.top, p->value.padding.bottom) &&
distance_compare ( p->value.padding.left, p->value.padding.right)){
rofi_theme_print_distance ( p->value.padding.top );
rofi_theme_print_distance ( p->value.padding.left );
} else if ( !distance_compare ( p->value.padding.top, p->value.padding.bottom) &&
distance_compare ( p->value.padding.left, p->value.padding.right)){
rofi_theme_print_distance ( p->value.padding.top );
rofi_theme_print_distance ( p->value.padding.left );
rofi_theme_print_distance ( p->value.padding.bottom);
} else {
rofi_theme_print_distance ( p->value.padding.top );
rofi_theme_print_distance ( p->value.padding.right );
rofi_theme_print_distance ( p->value.padding.bottom);
rofi_theme_print_distance ( p->value.padding.left );
}
printf(";");
break;
case P_LINK:
printf("%s;", p->value.link.name);
break;
case P_POSITION:
printf ( "%s;", WindowLocationStr[p->value.i] );
break;
case P_STRING:
printf ( "\"%s\";", p->value.s );
break;
case P_INTEGER:
printf ( "%d;", p->value.i );
break;
case P_DOUBLE:
printf ( "%.2f;", p->value.f );
break;
case P_BOOLEAN:
printf ( "%s;", p->value.b ? "true" : "false" );
break;
case P_COLOR:
printf ( "#%02X%02X%02X%02X;",
(unsigned char) ( p->value.color.alpha * 255.0 ),
(unsigned char) ( p->value.color.red * 255.0 ),
(unsigned char) ( p->value.color.green * 255.0 ),
(unsigned char) ( p->value.color.blue * 255.0 ) );
break;
case P_PADDING:
if ( distance_compare ( p->value.padding.top, p->value.padding.bottom ) &&
distance_compare ( p->value.padding.left, p->value.padding.right ) &&
distance_compare ( p->value.padding.left, p->value.padding.top ) ) {
rofi_theme_print_distance ( p->value.padding.left );
}
else if ( distance_compare ( p->value.padding.top, p->value.padding.bottom ) &&
distance_compare ( p->value.padding.left, p->value.padding.right ) ) {
rofi_theme_print_distance ( p->value.padding.top );
rofi_theme_print_distance ( p->value.padding.left );
}
else if ( !distance_compare ( p->value.padding.top, p->value.padding.bottom ) &&
distance_compare ( p->value.padding.left, p->value.padding.right ) ) {
rofi_theme_print_distance ( p->value.padding.top );
rofi_theme_print_distance ( p->value.padding.left );
rofi_theme_print_distance ( p->value.padding.bottom );
}
else {
rofi_theme_print_distance ( p->value.padding.top );
rofi_theme_print_distance ( p->value.padding.right );
rofi_theme_print_distance ( p->value.padding.bottom );
rofi_theme_print_distance ( p->value.padding.left );
}
printf ( ";" );
break;
case P_LINK:
printf ( "%s;", p->value.link.name );
break;
}
putchar ( '\n' );
}
@ -162,52 +168,51 @@ static void rofi_theme_print_property_index ( size_t pnl, int depth, Property *p
static void rofi_theme_print_index ( ThemeWidget *widget )
{
GHashTableIter iter;
gpointer key, value;
if ( widget->properties ){
int index = 0;
GList *list = NULL;
ThemeWidget *w = widget;
while ( w){
if ( g_strcmp0(w->name,"Root") == 0 ) {
gpointer key, value;
if ( widget->properties ) {
int index = 0;
GList *list = NULL;
ThemeWidget *w = widget;
while ( w ) {
if ( g_strcmp0 ( w->name, "Root" ) == 0 ) {
break;
}
list = g_list_prepend ( list, w->name );
w = w->parent;
w = w->parent;
}
if ( g_list_length ( list ) > 0 ) {
index = 4;
for ( GList *iter = g_list_first ( list ); iter != NULL; iter = g_list_next ( iter ) ) {
char *name = (char *)iter->data;
if ( iter->prev == NULL ){
char *name = (char *) iter->data;
if ( iter->prev == NULL ) {
putchar ( '#' );
}
fputs(name, stdout);
fputs ( name, stdout );
if ( iter->next ) {
putchar('.');
putchar ( '.' );
}
}
printf(" {\n");
} else {
printf ( " {\n" );
}
else {
index = 4;
printf("* {\n");
printf ( "* {\n" );
}
size_t property_name_length = 0;
g_hash_table_iter_init (&iter, widget->properties);
while (g_hash_table_iter_next (&iter, &key, &value))
{
Property *p = (Property*)value;
property_name_length = MAX ( strlen (p->name), property_name_length );
g_hash_table_iter_init ( &iter, widget->properties );
while ( g_hash_table_iter_next ( &iter, &key, &value ) ) {
Property *p = (Property *) value;
property_name_length = MAX ( strlen ( p->name ), property_name_length );
}
g_hash_table_iter_init (&iter, widget->properties);
while (g_hash_table_iter_next (&iter, &key, &value))
{
Property *p = (Property*)value;
g_hash_table_iter_init ( &iter, widget->properties );
while ( g_hash_table_iter_next ( &iter, &key, &value ) ) {
Property *p = (Property *) value;
rofi_theme_print_property_index ( property_name_length, index, p );
}
printf("}\n");
printf ( "}\n" );
g_list_free ( list );
}
for ( unsigned int i = 0; i < widget->num_widgets;i++){
for ( unsigned int i = 0; i < widget->num_widgets; i++ ) {
rofi_theme_print_index ( widget->widgets[i] );
}
}
@ -219,12 +224,12 @@ void rofi_theme_print ( ThemeWidget *widget )
/**
* Main lex parser.
*/
int yyparse();
int yyparse ();
/**
* Destroy the internal of lex parser.
*/
void yylex_destroy( void );
void yylex_destroy ( void );
/**
* Global handle input file to flex parser.
@ -237,16 +242,17 @@ extern FILE* yyin;
*
* Error handler for the lex parser.
*/
void yyerror(YYLTYPE *yylloc, const char* s) {
fprintf(stderr, "Parse error: %s\n", s);
fprintf(stderr, "From line %d column %d to line %d column %d\n", yylloc->first_line, yylloc->first_column, yylloc->last_line, yylloc->last_column);
exit(EXIT_FAILURE);
void yyerror ( YYLTYPE *yylloc, const char* s )
{
fprintf ( stderr, "Parse error: %s\n", s );
fprintf ( stderr, "From line %d column %d to line %d column %d\n", yylloc->first_line, yylloc->first_column, yylloc->last_line, yylloc->last_column );
exit ( EXIT_FAILURE );
}
static gboolean rofi_theme_steal_property_int ( gpointer key, gpointer value, gpointer user_data)
static gboolean rofi_theme_steal_property_int ( gpointer key, gpointer value, gpointer user_data )
{
GHashTable *table = (GHashTable*)user_data;
g_hash_table_replace ( table, key, value);
GHashTable *table = (GHashTable *) user_data;
g_hash_table_replace ( table, key, value );
return TRUE;
}
void rofi_theme_widget_add_properties ( ThemeWidget *widget, GHashTable *table )
@ -254,7 +260,7 @@ void rofi_theme_widget_add_properties ( ThemeWidget *widget, GHashTable *table )
if ( table == NULL ) {
return;
}
if ( widget->properties == NULL ){
if ( widget->properties == NULL ) {
widget->properties = table;
return;
}
@ -262,40 +268,40 @@ void rofi_theme_widget_add_properties ( ThemeWidget *widget, GHashTable *table )
g_hash_table_destroy ( table );
}
/**
* Public API
*/
static ThemeWidget *rofi_theme_find_single ( ThemeWidget *widget, const char *name)
static ThemeWidget *rofi_theme_find_single ( ThemeWidget *widget, const char *name )
{
for ( unsigned int j = 0; j < widget->num_widgets;j++){
if ( g_strcmp0(widget->widgets[j]->name, name ) == 0 ){
for ( unsigned int j = 0; j < widget->num_widgets; j++ ) {
if ( g_strcmp0 ( widget->widgets[j]->name, name ) == 0 ) {
return widget->widgets[j];
}
}
return widget;
}
static ThemeWidget *rofi_theme_find ( ThemeWidget *widget , const char *name, const gboolean exact )
static ThemeWidget *rofi_theme_find ( ThemeWidget *widget, const char *name, const gboolean exact )
{
if ( widget == NULL || name == NULL ) {
if ( widget == NULL || name == NULL ) {
return widget;
}
char **names = g_strsplit ( name, "." , 0 );
int found = TRUE;
for ( unsigned int i = 0; found && names && names[i]; i++ ){
char **names = g_strsplit ( name, ".", 0 );
int found = TRUE;
for ( unsigned int i = 0; found && names && names[i]; i++ ) {
found = FALSE;
ThemeWidget *f = rofi_theme_find_single ( widget, names[i]);
if ( f != widget ){
ThemeWidget *f = rofi_theme_find_single ( widget, names[i] );
if ( f != widget ) {
widget = f;
found = TRUE;
found = TRUE;
}
}
g_strfreev(names);
if ( !exact || found ){
g_strfreev ( names );
if ( !exact || found ) {
return widget;
} else {
}
else {
return NULL;
}
}
@ -303,24 +309,25 @@ static ThemeWidget *rofi_theme_find ( ThemeWidget *widget , const char *name, co
static void rofi_theme_resolve_link_property ( Property *p, int depth )
{
// Set name, remove '@' prefix.
const char *name = p->value.link.name +1;
if ( depth > 20 ){
g_log ( LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Found more then 20 redirects for property. Stopping.");
const char *name = p->value.link.name + 1;
if ( depth > 20 ) {
g_log ( LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Found more then 20 redirects for property. Stopping." );
p->value.link.ref = p;
return;
}
if( g_hash_table_contains ( rofi_theme->properties, name ) ) {
if ( g_hash_table_contains ( rofi_theme->properties, name ) ) {
Property *pr = g_hash_table_lookup ( rofi_theme->properties, name );
if ( pr->type == P_LINK ) {
if ( pr->value.link.ref == NULL ) {
rofi_theme_resolve_link_property ( pr, depth+1);
rofi_theme_resolve_link_property ( pr, depth + 1 );
}
if ( pr->value.link.ref != pr ){
if ( pr->value.link.ref != pr ) {
p->value.link.ref = pr->value.link.ref;
return;
}
} else {
}
else {
p->value.link.ref = pr;
return;
}
@ -333,22 +340,22 @@ static void rofi_theme_resolve_link_property ( Property *p, int depth )
static Property *rofi_theme_find_property ( ThemeWidget *widget, PropertyType type, const char *property, gboolean exact )
{
while ( widget ) {
if ( widget->properties && g_hash_table_contains ( widget->properties, property) ) {
Property *p = g_hash_table_lookup ( widget->properties, property);
if ( widget->properties && g_hash_table_contains ( widget->properties, property ) ) {
Property *p = g_hash_table_lookup ( widget->properties, property );
if ( p->type == P_LINK ) {
if ( p->value.link.ref == NULL ) {
// Resolve link.
rofi_theme_resolve_link_property ( p, 0 );
}
if ( p->value.link.ref->type == type ){
if ( p->value.link.ref->type == type ) {
return p->value.link.ref;
}
}
if ( p->type == type ){
if ( p->type == type ) {
return p;
}
// Padding and integer can be converted.
if ( p->type == P_INTEGER && type == P_PADDING ){
if ( p->type == P_INTEGER && type == P_PADDING ) {
return p;
}
}
@ -371,125 +378,129 @@ static ThemeWidget *rofi_theme_find_widget ( const char *name, const char *state
int rofi_theme_get_position ( const widget *widget, const char *property, int def )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_POSITION, property, FALSE );
if ( p ){
Property *p = rofi_theme_find_property ( wid, P_POSITION, property, FALSE );
if ( p ) {
return p->value.i;
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return def;
}
int rofi_theme_get_integer ( const widget *widget, const char *property, int def )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_INTEGER, property, FALSE );
if ( p ){
Property *p = rofi_theme_find_property ( wid, P_INTEGER, property, FALSE );
if ( p ) {
return p->value.i;
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return def;
}
int rofi_theme_get_integer_exact ( const widget *widget, const char *property, int def )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, TRUE );
Property *p = rofi_theme_find_property ( wid, P_INTEGER, property, TRUE );
if ( p ){
Property *p = rofi_theme_find_property ( wid, P_INTEGER, property, TRUE );
if ( p ) {
return p->value.i;
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return def;
}
Distance rofi_theme_get_distance ( const widget *widget, const char *property, int def )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_PADDING, property, FALSE );
if ( p ){
if ( p->type == P_INTEGER ){
return (Distance){p->value.i,PW_PX, SOLID};
} else {
Property *p = rofi_theme_find_property ( wid, P_PADDING, property, FALSE );
if ( p ) {
if ( p->type == P_INTEGER ) {
return (Distance){ p->value.i, PW_PX, SOLID };
}
else {
return p->value.padding.left;
}
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
return (Distance){def, PW_PX, SOLID};
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return (Distance){ def, PW_PX, SOLID };
}
int rofi_theme_get_boolean ( const widget *widget, const char *property, int def )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_BOOLEAN, property, FALSE );
if ( p ){
Property *p = rofi_theme_find_property ( wid, P_BOOLEAN, property, FALSE );
if ( p ) {
return p->value.b;
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return def;
}
char *rofi_theme_get_string ( const widget *widget, const char *property, char *def )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_STRING, property, FALSE );
if ( p ){
Property *p = rofi_theme_find_property ( wid, P_STRING, property, FALSE );
if ( p ) {
return p->value.s;
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return def;
}
double rofi_theme_get_double ( const widget *widget, const char *property, double def )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_DOUBLE, property, FALSE );
if ( p ){
Property *p = rofi_theme_find_property ( wid, P_DOUBLE, property, FALSE );
if ( p ) {
return p->value.b;
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return def;
}
void rofi_theme_get_color ( const widget *widget, const char *property, cairo_t *d)
void rofi_theme_get_color ( const widget *widget, const char *property, cairo_t *d )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_COLOR, property, FALSE );
if ( p ){
Property *p = rofi_theme_find_property ( wid, P_COLOR, property, FALSE );
if ( p ) {
cairo_set_source_rgba ( d,
p->value.color.red,
p->value.color.green,
p->value.color.blue,
p->value.color.alpha
);
} else {
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
p->value.color.red,
p->value.color.green,
p->value.color.blue,
p->value.color.alpha
);
}
else {
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
}
}
Padding rofi_theme_get_padding ( const widget *widget, const char *property, Padding pad )
{
ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE );
Property *p = rofi_theme_find_property ( wid, P_PADDING, property, FALSE );
if ( p ){
if ( p->type == P_PADDING ){
Property *p = rofi_theme_find_property ( wid, P_PADDING, property, FALSE );
if ( p ) {
if ( p->type == P_PADDING ) {
pad = p->value.padding;
} else {
Distance d = (Distance){p->value.i, PW_PX, SOLID};
return (Padding){d,d,d,d};
}
else {
Distance d = (Distance){ p->value.i, PW_PX, SOLID };
return (Padding){ d, d, d, d };
}
}
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state?widget->state:"", property );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
return pad;
}
int distance_get_pixel ( Distance d, Orientation ori )
{
if ( d.type == PW_EM ){
return d.distance*textbox_get_estimated_char_height();
} else if ( d.type == PW_PERCENT ) {
if ( ori == ORIENTATION_VERTICAL ){
if ( d.type == PW_EM ) {
return d.distance * textbox_get_estimated_char_height ();
}
else if ( d.type == PW_PERCENT ) {
if ( ori == ORIENTATION_VERTICAL ) {
int height = 0;
rofi_view_get_current_monitor ( NULL, &height );
return (d.distance*height)/(100.0);
} else {
return ( d.distance * height ) / ( 100.0 );
}
else {
int width = 0;
rofi_view_get_current_monitor ( &width, NULL );
return (d.distance*width)/(100.0);
return ( d.distance * width ) / ( 100.0 );
}
}
return d.distance;
@ -497,11 +508,12 @@ int distance_get_pixel ( Distance d, Orientation ori )
void distance_get_linestyle ( Distance d, cairo_t *draw )
{
if ( d.style == DASH ){
if ( d.style == DASH ) {
const double dashes[1] = { 4 };
cairo_set_dash ( draw, dashes, 1, 0.0 );
} else {
cairo_set_dash ( draw, NULL, 0, 0.0);
}
else {
cairo_set_dash ( draw, NULL, 0, 0.0 );
}
}
@ -509,9 +521,9 @@ void distance_get_linestyle ( Distance d, cairo_t *draw )
static Property* rofi_theme_convert_get_color ( const char *color, const char *name )
{
Color c = color_get ( color );
Color c = color_get ( color );
Property *p = rofi_theme_property_create ( P_COLOR );
p->name = g_strdup(name);
p->name = g_strdup ( name );
p->value.color.alpha = c.alpha;
p->value.color.red = c.red;
p->value.color.green = c.green;
@ -522,130 +534,131 @@ static Property* rofi_theme_convert_get_color ( const char *color, const char *n
static void rofi_theme_convert_create_property_ht ( ThemeWidget *widget )
{
if ( widget->properties == NULL ) {
widget->properties = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, (GDestroyNotify)rofi_theme_property_free );
widget->properties = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, (GDestroyNotify) rofi_theme_property_free );
}
}
void rofi_theme_convert_old_theme ( void )
{
if ( rofi_theme != NULL ){
if ( rofi_theme != NULL ) {
return;
}
rofi_theme = (ThemeWidget*)g_malloc0 ( sizeof ( ThemeWidget ) );
rofi_theme = (ThemeWidget *) g_malloc0 ( sizeof ( ThemeWidget ) );
rofi_theme->name = g_strdup ( "Root" );
rofi_theme_convert_create_property_ht ( rofi_theme );
ThemeWidget *window_widget = rofi_theme_find_or_create_name ( rofi_theme , "window" );
ThemeWidget *window_widget = rofi_theme_find_or_create_name ( rofi_theme, "window" );
rofi_theme_convert_create_property_ht ( window_widget );
ThemeWidget *mainbox_widget = rofi_theme_find_or_create_name ( window_widget, "mainbox" );
rofi_theme_convert_create_property_ht ( mainbox_widget );
ThemeWidget *message = rofi_theme_find_or_create_name ( mainbox_widget, "message" );
ThemeWidget *message = rofi_theme_find_or_create_name ( mainbox_widget, "message" );
ThemeWidget *message_box = rofi_theme_find_or_create_name ( message, "box" );
rofi_theme_convert_create_property_ht ( message_box );
ThemeWidget *listview_widget = rofi_theme_find_or_create_name ( mainbox_widget, "listview" );
rofi_theme_convert_create_property_ht ( listview_widget );
ThemeWidget *sidebar_widget = rofi_theme_find_or_create_name ( mainbox_widget, "sidebar" );
ThemeWidget *sidebar_widget = rofi_theme_find_or_create_name ( mainbox_widget, "sidebar" );
ThemeWidget *sidebarbox_widget = rofi_theme_find_or_create_name ( sidebar_widget, "box" );
rofi_theme_convert_create_property_ht ( sidebarbox_widget );
{
Property *p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ("border");
p->name = g_strdup ( "border" );
p->value.i = 0;
g_hash_table_replace ( mainbox_widget->properties, p->name, p);
g_hash_table_replace ( mainbox_widget->properties, p->name, p );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ("padding");
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "padding" );
p->value.i = config.padding;
g_hash_table_replace ( window_widget->properties, p->name, p);
g_hash_table_replace ( window_widget->properties, p->name, p );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ("padding");
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "padding" );
p->value.i = 0;
g_hash_table_replace ( mainbox_widget->properties, p->name, p);
g_hash_table_replace ( mainbox_widget->properties, p->name, p );
// Spacing
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup("spacing");
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "spacing" );
p->value.i = config.line_margin;
g_hash_table_replace ( rofi_theme->properties, p->name, p );
}
{
// Background
Property *p = rofi_theme_property_create ( P_COLOR );
p->name = g_strdup("background");
p->name = g_strdup ( "background" );
p->value.color.alpha = 0;
p->value.color.red = 0;
p->value.color.green= 0;
p->value.color.blue= 0;
p->value.color.red = 0;
p->value.color.green = 0;
p->value.color.blue = 0;
g_hash_table_replace ( rofi_theme->properties, p->name, p );
ThemeWidget *inputbar_widget = rofi_theme_find_or_create_name ( mainbox_widget, "inputbar" );
rofi_theme_convert_create_property_ht ( inputbar_widget );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup("spacing");
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "spacing" );
p->value.i = 0;
g_hash_table_replace ( inputbar_widget->properties, p->name, p );
LineStyle style = (g_strcmp0(config.separator_style,"dash") == 0)?DASH:SOLID;
int place_end = ( config.location == WL_SOUTH_EAST || config.location == WL_SOUTH || config.location == WL_SOUTH_WEST );
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup("border");
Distance d = (Distance){config.menu_bw, PW_PX, style};
if ( place_end ){
p->value.padding.bottom= d;
} else {
p->value.padding.top= d;
LineStyle style = ( g_strcmp0 ( config.separator_style, "dash" ) == 0 ) ? DASH : SOLID;
int place_end = ( config.location == WL_SOUTH_EAST || config.location == WL_SOUTH || config.location == WL_SOUTH_WEST );
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup ( "border" );
Distance d = (Distance){ config.menu_bw, PW_PX, style };
if ( place_end ) {
p->value.padding.bottom = d;
}
else {
p->value.padding.top = d;
}
g_hash_table_replace ( listview_widget->properties, p->name, p );
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup("border");
d = (Distance){config.menu_bw, PW_PX, style};
if ( place_end ){
p->value.padding.bottom= d;
} else {
p->value.padding.top= d;
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup ( "border" );
d = (Distance){ config.menu_bw, PW_PX, style };
if ( place_end ) {
p->value.padding.bottom = d;
}
else {
p->value.padding.top = d;
}
g_hash_table_replace ( message_box->properties, p->name, p );
/**
* Sidebar top
*/
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup("border");
d = (Distance){config.menu_bw, PW_PX, style};
p->value.padding.top= d;
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup ( "border" );
d = (Distance){ config.menu_bw, PW_PX, style };
p->value.padding.top = d;
g_hash_table_replace ( sidebarbox_widget->properties, p->name, p );
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup("padding");
d = (Distance){config.line_margin, PW_PX, SOLID};
if ( place_end ){
p->value.padding.bottom= d;
} else {
p->value.padding.top= d;
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup ( "padding" );
d = (Distance){ config.line_margin, PW_PX, SOLID };
if ( place_end ) {
p->value.padding.bottom = d;
}
else {
p->value.padding.top = d;
}
g_hash_table_replace ( listview_widget->properties, p->name, p );
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup("padding");
d = (Distance){config.line_margin, PW_PX, SOLID};
if ( place_end ){
p->value.padding.bottom= d;
} else {
p->value.padding.top= d;
p = rofi_theme_property_create ( P_PADDING );
p->name = g_strdup ( "padding" );
d = (Distance){ config.line_margin, PW_PX, SOLID };
if ( place_end ) {
p->value.padding.bottom = d;
}
else {
p->value.padding.top = d;
}
g_hash_table_replace ( message_box->properties, p->name, p );
}
{
Property *p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup("columns");
p->name = g_strdup ( "columns" );
p->value.i = config.menu_columns;
g_hash_table_replace ( listview_widget->properties, p->name, p );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup("fixed-height");
p->value.i = !(config.fixed_num_lines);
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "fixed-height" );
p->value.i = !( config.fixed_num_lines );
g_hash_table_replace ( listview_widget->properties, p->name, p );
}
{
@ -653,18 +666,18 @@ void rofi_theme_convert_old_theme ( void )
rofi_theme_convert_create_property_ht ( window_widget );
// Padding
Property *p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup("padding");
p->name = g_strdup ( "padding" );
p->value.i = config.padding;
g_hash_table_replace ( window_widget->properties, p->name, p );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup("border");
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "border" );
p->value.i = config.menu_bw;
g_hash_table_replace ( window_widget->properties, p->name, p );
}
{
gchar **vals = g_strsplit ( config.color_window, ",", 3 );
if ( vals != NULL ){
if ( vals != NULL ) {
if ( vals[0] != NULL ) {
Property *p = rofi_theme_convert_get_color ( vals[0], "background" );
g_hash_table_replace ( window_widget->properties, p->name, p );
@ -674,49 +687,47 @@ void rofi_theme_convert_old_theme ( void )
g_hash_table_replace ( window_widget->properties, p->name, p );
ThemeWidget *inputbar = rofi_theme_find_or_create_name ( mainbox_widget, "inputbar" );
ThemeWidget *widget = rofi_theme_find_or_create_name ( inputbar, "box" );
ThemeWidget *widget = rofi_theme_find_or_create_name ( inputbar, "box" );
rofi_theme_convert_create_property_ht ( widget );
if ( vals[2] != NULL ) {
p = rofi_theme_convert_get_color ( vals[2], "foreground" );
g_hash_table_replace ( window_widget->properties, p->name, p );
} else {
p = rofi_theme_convert_get_color ( vals[1], "foreground" );
g_hash_table_replace ( window_widget->properties, p->name, p );
}
if ( vals[2] != NULL ) {
p = rofi_theme_convert_get_color ( vals[2], "foreground" );
g_hash_table_replace ( window_widget->properties, p->name, p );
}
else {
p = rofi_theme_convert_get_color ( vals[1], "foreground" );
g_hash_table_replace ( window_widget->properties, p->name, p );
}
}
}
}
g_strfreev ( vals );
{
Property *p = NULL;
ThemeWidget *widget = rofi_theme_find_or_create_name ( listview_widget, "element" );
Property *p = NULL;
ThemeWidget *widget = rofi_theme_find_or_create_name ( listview_widget, "element" );
ThemeWidget *scrollbar = rofi_theme_find_or_create_name ( listview_widget, "scrollbar" );
ThemeWidget *wnormal = rofi_theme_find_or_create_name ( widget, "normal" );
ThemeWidget *wselected = rofi_theme_find_or_create_name ( widget, "selected" );
ThemeWidget *wnormal = rofi_theme_find_or_create_name ( widget, "normal" );
ThemeWidget *wselected = rofi_theme_find_or_create_name ( widget, "selected" );
ThemeWidget *walternate = rofi_theme_find_or_create_name ( widget, "alternate" );
rofi_theme_convert_create_property_ht ( widget );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ("border");
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "border" );
p->value.i = 0;
g_hash_table_replace ( widget->properties, p->name, p);
g_hash_table_replace ( widget->properties, p->name, p );
rofi_theme_convert_create_property_ht ( scrollbar );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ("border");
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "border" );
p->value.i = 0;
g_hash_table_replace ( scrollbar->properties, p->name, p);
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ("padding");
g_hash_table_replace ( scrollbar->properties, p->name, p );
p = rofi_theme_property_create ( P_INTEGER );
p->name = g_strdup ( "padding" );
p->value.i = 0;
g_hash_table_replace ( scrollbar->properties, p->name, p);
g_hash_table_replace ( scrollbar->properties, p->name, p );
gchar **vals = g_strsplit ( config.color_normal, ",", 5 );
if ( g_strv_length (vals) == 5 ) {
if ( g_strv_length ( vals ) == 5 ) {
ThemeWidget *wnn = rofi_theme_find_or_create_name ( wnormal, "normal" );
rofi_theme_convert_create_property_ht ( wnn );
p = rofi_theme_convert_get_color ( vals[0], "background" );
@ -756,7 +767,7 @@ void rofi_theme_convert_old_theme ( void )
g_strfreev ( vals );
vals = g_strsplit ( config.color_urgent, ",", 5 );
if ( g_strv_length (vals) == 5 ) {
if ( g_strv_length ( vals ) == 5 ) {
ThemeWidget *wnn = rofi_theme_find_or_create_name ( wnormal, "urgent" );
rofi_theme_convert_create_property_ht ( wnn );
p = rofi_theme_convert_get_color ( vals[0], "background" );
@ -781,7 +792,7 @@ void rofi_theme_convert_old_theme ( void )
g_strfreev ( vals );
vals = g_strsplit ( config.color_active, ",", 5 );
if ( g_strv_length (vals) == 5 ) {
if ( g_strv_length ( vals ) == 5 ) {
ThemeWidget *wnn = rofi_theme_find_or_create_name ( wnormal, "active" );
rofi_theme_convert_create_property_ht ( wnn );
p = rofi_theme_convert_get_color ( vals[0], "background" );
@ -810,31 +821,35 @@ void rofi_theme_convert_old_theme ( void )
gboolean rofi_theme_parse_file ( const char *file )
{
char *filename = rofi_expand_path ( file );
yyin = fopen ( filename, "rb");
if ( yyin == NULL ){
fprintf(stderr, "Failed to open file: %s: '%s'\n", filename, strerror ( errno ) );
g_free(filename);
yyin = fopen ( filename, "rb" );
if ( yyin == NULL ) {
fprintf ( stderr, "Failed to open file: %s: '%s'\n", filename, strerror ( errno ) );
g_free ( filename );
return TRUE;
}
extern int str_len;
extern int str_len;
extern const char*input_str;
str_len = 0;
input_str = NULL;
while ( yyparse() );
yylex_destroy();
g_free(filename);
while ( yyparse () ) {
;
}
yylex_destroy ();
g_free ( filename );
yyin = NULL;
return FALSE;
}
gboolean rofi_theme_parse_string ( const char *string )
{
extern int str_len;
extern int str_len;
extern const char*input_str;
yyin = NULL;
yyin = NULL;
input_str = string;
str_len = strlen ( string );
while ( yyparse () );
yylex_destroy();
str_len = strlen ( string );
while ( yyparse () ) {
;
}
yylex_destroy ();
return TRUE;
}
#endif

View File

@ -86,33 +86,33 @@ RofiViewState *current_active_menu = NULL;
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 */
unsigned long long count;
/** redraw idle time. */
guint repaint_source;
guint repaint_source;
/** Window fullscreen */
gboolean fullscreen;
gboolean fullscreen;
} CacheState = {
.main_window = XCB_WINDOW_NONE,
.fake_bg = NULL,
@ -124,15 +124,15 @@ struct
.idle_timeout = 0,
.count = 0L,
.repaint_source = 0,
.fullscreen = FALSE,
.fullscreen = FALSE,
};
void rofi_view_get_current_monitor ( int *width, int *height)
void rofi_view_get_current_monitor ( int *width, int *height )
{
if (width ){
if ( width ) {
*width = CacheState.mon.w;
}
if (height){
if ( height ) {
*height = CacheState.mon.h;
}
}
@ -224,7 +224,7 @@ static gboolean rofi_view_repaint ( G_GNUC_UNUSED void * data )
// Repaint the view (if needed).
// After a resize the edit_pixmap surface might not contain anything anymore.
// If we already re-painted, this does nothing.
rofi_view_update (current_active_menu, FALSE);
rofi_view_update ( current_active_menu, FALSE );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "expose event" );
TICK_N ( "Expose" );
xcb_copy_area ( xcb->connection, CacheState.edit_pixmap, CacheState.main_window, CacheState.gc,
@ -257,14 +257,16 @@ static void rofi_view_update_prompt ( RofiViewState *state )
static void rofi_view_calculate_window_position ( RofiViewState *state )
{
int location = rofi_theme_get_position ( WIDGET ( state->main_window ), "location", config.location );
int anchor = location;
int anchor = location;
if ( !listview_get_fixed_num_lines ( state->list_view ) ) {
anchor = location;
if ( location == WL_CENTER ) {
anchor = WL_NORTH;
} else if ( location == WL_EAST ) {
}
else if ( location == WL_EAST ) {
anchor = WL_NORTH_EAST;
} else if (location == WL_WEST ) {
}
else if ( location == WL_WEST ) {
anchor = WL_NORTH_WEST;
}
}
@ -306,38 +308,38 @@ static void rofi_view_calculate_window_position ( RofiViewState *state )
}
switch ( anchor )
{
case WL_SOUTH_WEST:
state->y -= state->height;
break;
case WL_SOUTH:
state->x -= state->width/2;
state->y -= state->height;
break;
case WL_SOUTH_EAST:
state->x -= state->width;
state->y -= state->height;
break;
case WL_NORTH_EAST:
state->x -= state->width;
break;
case WL_NORTH_WEST:
break;
case WL_NORTH:
state->x -= state->width/2;
break;
case WL_EAST:
state->x -= state->width;
state->y -= state->height/2;
break;
case WL_WEST:
state->y -= state->height/2;
break;
case WL_CENTER:
state->y -= state->height/2;
state->x -= state->width/2;
break;
default:
break;
case WL_SOUTH_WEST:
state->y -= state->height;
break;
case WL_SOUTH:
state->x -= state->width / 2;
state->y -= state->height;
break;
case WL_SOUTH_EAST:
state->x -= state->width;
state->y -= state->height;
break;
case WL_NORTH_EAST:
state->x -= state->width;
break;
case WL_NORTH_WEST:
break;
case WL_NORTH:
state->x -= state->width / 2;
break;
case WL_EAST:
state->x -= state->width;
state->y -= state->height / 2;
break;
case WL_WEST:
state->y -= state->height / 2;
break;
case WL_CENTER:
state->y -= state->height / 2;
state->x -= state->width / 2;
break;
default:
break;
}
// Apply offset.
state->x += config.x_offset;
@ -568,7 +570,7 @@ static void rofi_view_setup_fake_transparency ( const char const *fake_backgroun
* Current options: 'real', 'screenshot','background'
*/
TICK_N ( "Fake start" );
if ( g_strcmp0 ( fake_background, "real" ) == 0 ){
if ( g_strcmp0 ( fake_background, "real" ) == 0 ) {
return;
}
else if ( g_strcmp0 ( fake_background, "screenshot" ) == 0 ) {
@ -611,9 +613,9 @@ static void rofi_view_setup_fake_transparency ( const char const *fake_backgroun
}
void __create_window ( MenuFlags menu_flags )
{
uint32_t selmask = XCB_CW_BACK_PIXMAP| XCB_CW_BORDER_PIXEL |XCB_CW_BIT_GRAVITY| XCB_CW_BACKING_STORE | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP;
uint32_t selval[] = {
XCB_BACK_PIXMAP_NONE,0,
uint32_t selmask = XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY | XCB_CW_BACKING_STORE | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP;
uint32_t selval[] = {
XCB_BACK_PIXMAP_NONE, 0,
XCB_GRAVITY_STATIC,
XCB_BACKING_STORE_NOT_USEFUL,
XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE |
@ -622,14 +624,14 @@ void __create_window ( MenuFlags menu_flags )
map
};
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 ),
0, 0, 200, 100, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
visual->visual_id, selmask, selval );
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 ),
0, 0, 200, 100, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
visual->visual_id, selmask, selval );
xcb_generic_error_t *error;
error = xcb_request_check(xcb->connection, cc);
if (error) {
printf( "xcb_create_window() failed error=0x%x\n", error->error_code);
error = xcb_request_check ( xcb->connection, cc );
if ( error ) {
printf ( "xcb_create_window() failed error=0x%x\n", error->error_code );
exit ( EXIT_FAILURE );
}
CacheState.gc = xcb_generate_id ( xcb->connection );
@ -658,8 +660,8 @@ void __create_window ( MenuFlags menu_flags )
}
// Setup font.
// Dummy widget.
container *win = container_create ( "window" );
char *font = rofi_theme_get_string ( WIDGET ( win ), "font" , config.menu_font );
container *win = container_create ( "window" );
char *font = rofi_theme_get_string ( WIDGET ( win ), "font", config.menu_font );
if ( font ) {
PangoFontDescription *pfd = pango_font_description_from_string ( font );
pango_context_set_font_description ( p, pfd );
@ -682,7 +684,7 @@ void __create_window ( MenuFlags menu_flags )
x11_disable_decoration ( box );
}
CacheState.fullscreen = rofi_theme_get_boolean ( WIDGET (win ), "fullscreen", config.fullscreen );
CacheState.fullscreen = rofi_theme_get_boolean ( WIDGET ( win ), "fullscreen", config.fullscreen );
if ( CacheState.fullscreen ) {
xcb_atom_t atoms[] = {
xcb->ewmh._NET_WM_STATE_FULLSCREEN,
@ -699,8 +701,8 @@ void __create_window ( MenuFlags menu_flags )
CacheState.flags = menu_flags;
monitor_active ( &( CacheState.mon ) );
char *transparency = rofi_theme_get_string ( WIDGET ( win ), "transparency", NULL);
if ( transparency == NULL && config.fake_transparency ){
char *transparency = rofi_theme_get_string ( WIDGET ( win ), "transparency", NULL );
if ( transparency == NULL && config.fake_transparency ) {
transparency = config.fake_background;
}
if ( transparency ) {
@ -869,7 +871,7 @@ void rofi_view_update ( RofiViewState *state, gboolean qr )
}
else {
// Paint the background transparent.
cairo_set_source_rgba ( d, 0,0,0,0.0);
cairo_set_source_rgba ( d, 0, 0, 0, 0.0 );
cairo_paint ( d );
}
TICK_N ( "Background" );
@ -904,8 +906,8 @@ static void rofi_view_paste ( RofiViewState *state, xcb_selection_notify_event_t
if ( text != NULL && text[0] != '\0' ) {
unsigned int dl = strlen ( text );
// Strip new line
for ( unsigned int i = 0; i < dl; i++){
if ( text[i] == '\n' ){
for ( unsigned int i = 0; i < dl; i++ ) {
if ( text[i] == '\n' ) {
dl = i;
}
}
@ -1040,7 +1042,7 @@ static void rofi_view_refilter ( RofiViewState *state )
}
// Make sure we enable fixed num lines when in normal window mode.
if ( (CacheState.flags&MENU_NORMAL_WINDOW) == 0 ){
if ( ( CacheState.flags & MENU_NORMAL_WINDOW ) == 0 ) {
int height = rofi_view_calculate_height ( state );
if ( height != state->height ) {
state->height = height;
@ -1338,7 +1340,7 @@ void rofi_view_itterrate ( RofiViewState *state, xcb_generic_event_t *ev, xkb_st
CacheState.edit_surf = cairo_xcb_surface_create ( xcb->connection, CacheState.edit_pixmap, visual, state->width, state->height );
CacheState.edit_draw = cairo_create ( CacheState.edit_surf );
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Re-size window based external request: %d %d\n", state->width, state->height);
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Re-size window based external request: %d %d\n", state->width, state->height );
widget_resize ( WIDGET ( state->main_window ), state->width, state->height );
}
}
@ -1346,7 +1348,7 @@ void rofi_view_itterrate ( RofiViewState *state, xcb_generic_event_t *ev, xkb_st
}
case XCB_FOCUS_IN:
if ( ( CacheState.flags & MENU_NORMAL_WINDOW ) == 0 ) {
take_keyboard ( CacheState.main_window, 1);
take_keyboard ( CacheState.main_window, 1 );
}
break;
case XCB_FOCUS_OUT:
@ -1495,10 +1497,9 @@ RofiViewState *rofi_view_create ( Mode *sw,
TICK_N ( "Get active monitor" );
state->main_window = container_create ( "window" );
state->main_box = box_create ( "window.mainbox.box", BOX_VERTICAL );
state->main_box = box_create ( "window.mainbox.box", BOX_VERTICAL );
container_add ( state->main_window, WIDGET ( state->main_box ) );
state->input_bar = box_create ( "window.mainbox.inputbar.box", BOX_HORIZONTAL );
// Only enable widget when sidebar is enabled.
@ -1509,7 +1510,7 @@ RofiViewState *rofi_view_create ( Mode *sw,
state->modi = g_malloc0 ( state->num_modi * sizeof ( textbox * ) );
for ( unsigned int j = 0; j < state->num_modi; j++ ) {
const Mode * mode = rofi_get_mode ( j );
state->modi[j] = textbox_create ( "window.mainbox.sidebar.button", TB_CENTER|TB_AUTOHEIGHT, ( mode == state->sw ) ? HIGHLIGHT : NORMAL,
state->modi[j] = textbox_create ( "window.mainbox.sidebar.button", TB_CENTER | TB_AUTOHEIGHT, ( mode == state->sw ) ? HIGHLIGHT : NORMAL,
mode_get_display_name ( mode ) );
box_add ( state->sidebar_bar, WIDGET ( state->modi[j] ), TRUE, j );
widget_set_clicked_handler ( WIDGET ( state->modi[j] ), rofi_view_modi_clicked_cb, state );
@ -1517,34 +1518,34 @@ RofiViewState *rofi_view_create ( Mode *sw,
}
int location = rofi_theme_get_position ( WIDGET ( state->main_window ), "location", config.location );
int end = ( location == WL_SOUTH_EAST || location == WL_SOUTH || location == WL_SOUTH_WEST );
box_add ( state->main_box, WIDGET ( state->input_bar ), FALSE, end?9:0 );
int end = ( location == WL_SOUTH_EAST || location == WL_SOUTH || location == WL_SOUTH_WEST );
box_add ( state->main_box, WIDGET ( state->input_bar ), FALSE, end ? 9 : 0 );
state->case_indicator = textbox_create ( "window.mainbox.inputbar.case-indicator", TB_AUTOWIDTH|TB_AUTOHEIGHT, NORMAL, "*" );
state->case_indicator = textbox_create ( "window.mainbox.inputbar.case-indicator", TB_AUTOWIDTH | TB_AUTOHEIGHT, NORMAL, "*" );
// Add small separator between case indicator and text box.
box_add ( state->input_bar, WIDGET ( state->case_indicator ), FALSE, 3 );
// Prompt box.
state->prompt = textbox_create ( "window.mainbox.inputbar.prompt",TB_AUTOWIDTH|TB_AUTOHEIGHT, NORMAL, "" );
state->prompt = textbox_create ( "window.mainbox.inputbar.prompt", TB_AUTOWIDTH | TB_AUTOHEIGHT, NORMAL, "" );
rofi_view_update_prompt ( state );
box_add ( state->input_bar, WIDGET ( state->prompt ), FALSE, 1 );
// Entry box
TextboxFlags tfl = TB_EDITABLE;
tfl |= ( ( menu_flags & MENU_PASSWORD ) == MENU_PASSWORD ) ? TB_PASSWORD : 0;
state->text = textbox_create ( "window.mainbox.inputbar.entry", tfl|TB_AUTOHEIGHT, NORMAL, input );
state->text = textbox_create ( "window.mainbox.inputbar.entry", tfl | TB_AUTOHEIGHT, NORMAL, input );
box_add ( state->input_bar, WIDGET ( state->text ), TRUE, 2 );
textbox_text ( state->case_indicator, get_matching_state () );
if ( message ) {
container *box = container_create ( "window.mainbox.message.box" );
textbox *message_tb = textbox_create ( "window.mainbox.message.textbox", TB_AUTOHEIGHT | TB_MARKUP | TB_WRAP, NORMAL, message );
container_add ( box, WIDGET (message_tb) );
box_add ( state->main_box, WIDGET ( box ), FALSE, end?8:2);
container *box = container_create ( "window.mainbox.message.box" );
textbox *message_tb = textbox_create ( "window.mainbox.message.textbox", TB_AUTOHEIGHT | TB_MARKUP | TB_WRAP, NORMAL, message );
container_add ( box, WIDGET ( message_tb ) );
box_add ( state->main_box, WIDGET ( box ), FALSE, end ? 8 : 2 );
}
state->overlay = textbox_create ( "window.overlay", TB_AUTOWIDTH|TB_AUTOHEIGHT, URGENT, "blaat" );
state->overlay = textbox_create ( "window.overlay", TB_AUTOWIDTH | TB_AUTOHEIGHT, URGENT, "blaat" );
widget_disable ( WIDGET ( state->overlay ) );
state->list_view = listview_create ( "window.mainbox.listview", update_callback, state, config.element_height, end );
@ -1553,11 +1554,11 @@ RofiViewState *rofi_view_create ( Mode *sw,
listview_set_scroll_type ( state->list_view, config.scroll_method );
listview_set_mouse_activated_cb ( state->list_view, rofi_view_listview_mouse_activated_cb, state );
int lines = rofi_theme_get_integer ( WIDGET (state->list_view ), "lines", config.menu_lines );
int lines = rofi_theme_get_integer ( WIDGET ( state->list_view ), "lines", config.menu_lines );
listview_set_num_lines ( state->list_view, lines );
listview_set_max_lines ( state->list_view, state->num_lines );
box_add ( state->main_box, WIDGET ( state->list_view ), TRUE, 3);
box_add ( state->main_box, WIDGET ( state->list_view ), TRUE, 3 );
// filtered list
state->line_map = g_malloc0_n ( state->num_lines, sizeof ( unsigned int ) );
@ -1565,9 +1566,9 @@ RofiViewState *rofi_view_create ( Mode *sw,
rofi_view_calculate_window_width ( state );
// Need to resize otherwise calculated desired height is wrong.
widget_resize ( WIDGET ( state->main_window ), state->width, 100);
widget_resize ( WIDGET ( state->main_window ), state->width, 100 );
// Only needed when window is fixed size.
if (( CacheState.flags & MENU_NORMAL_WINDOW ) == MENU_NORMAL_WINDOW ) {
if ( ( CacheState.flags & MENU_NORMAL_WINDOW ) == MENU_NORMAL_WINDOW ) {
listview_set_fixed_num_lines ( state->list_view );
rofi_view_window_update_size ( state );
}
@ -1594,23 +1595,22 @@ int rofi_view_error_dialog ( const char *msg, int markup )
state->finalize = process_result;
state->main_window = container_create ( "window" );
state->main_box = box_create ( "window.mainbox.message.box", BOX_VERTICAL);
state->main_box = box_create ( "window.mainbox.message.box", BOX_VERTICAL );
container_add ( state->main_window, WIDGET ( state->main_box ) );
state->text = textbox_create ( "window.mainbox.message.textbox", ( TB_AUTOHEIGHT | TB_WRAP ) + ( ( markup ) ? TB_MARKUP : 0 ),
NORMAL, ( msg != NULL ) ? msg : "" );
NORMAL, ( msg != NULL ) ? msg : "" );
box_add ( state->main_box, WIDGET ( state->text ), TRUE, 1 );
// Make sure we enable fixed num lines when in normal window mode.
if ( (CacheState.flags&MENU_NORMAL_WINDOW) == MENU_NORMAL_WINDOW){
if ( ( CacheState.flags & MENU_NORMAL_WINDOW ) == MENU_NORMAL_WINDOW ) {
listview_set_fixed_num_lines ( state->list_view );
}
rofi_view_calculate_window_width ( state );
// Need to resize otherwise calculated desired height is wrong.
widget_resize ( WIDGET ( state->main_window ), state->width, 100);
widget_resize ( WIDGET ( state->main_window ), state->width, 100 );
unsigned int line_height = textbox_get_height ( state->text );
// resize window vertically to suit
state->height = line_height + widget_padding_get_padding_height ( WIDGET(state->main_window) );
state->height = line_height + widget_padding_get_padding_height ( WIDGET ( state->main_window ) );
// Calculte window position.
rofi_view_calculate_window_position ( state );
@ -1727,16 +1727,16 @@ void rofi_view_set_overlay ( RofiViewState *state, const char *text )
}
widget_enable ( WIDGET ( state->overlay ) );
textbox_text ( state->overlay, text );
int x_offset = widget_get_width ( WIDGET(state->main_window) );
int x_offset = widget_get_width ( WIDGET ( state->main_window ) );
// Within padding of window.
x_offset -= widget_padding_get_right ( WIDGET (state->main_window) );
x_offset -= widget_padding_get_right ( WIDGET ( state->main_window ) );
// Within the border of widget.
x_offset -= widget_padding_get_right ( WIDGET (state->main_box ) );
x_offset -= widget_padding_get_right ( WIDGET (state->input_bar ) );
x_offset -= widget_padding_get_right ( WIDGET ( state->main_box ) );
x_offset -= widget_padding_get_right ( WIDGET ( state->input_bar ) );
x_offset -= widget_get_width ( WIDGET ( state->case_indicator ) );
x_offset -= widget_get_width ( WIDGET ( state->overlay ) );
int top_offset = widget_padding_get_top ( WIDGET (state->main_window) );
top_offset += widget_padding_get_top ( WIDGET (state->main_box ) );
int top_offset = widget_padding_get_top ( WIDGET ( state->main_window ) );
top_offset += widget_padding_get_top ( WIDGET ( state->main_box ) );
widget_move ( WIDGET ( state->overlay ), x_offset, top_offset );
// We want to queue a repaint.
rofi_view_queue_redraw ( );
@ -1744,8 +1744,8 @@ void rofi_view_set_overlay ( RofiViewState *state, const char *text )
void rofi_view_clear_input ( RofiViewState *state )
{
if ( state->text ){
textbox_text ( state->text, "");
if ( state->text ) {
textbox_text ( state->text, "" );
rofi_view_set_selected_line ( state, 0 );
}
}

View File

@ -31,31 +31,31 @@
#include "widgets/box.h"
#include "theme.h"
#define LOG_DOMAIN "Widgets.Box"
#define LOG_DOMAIN "Widgets.Box"
/** Default spacing used in the box*/
#define DEFAULT_SPACING 2
#define DEFAULT_SPACING 2
struct _box
{
widget widget;
boxType type;
int max_size;
widget widget;
boxType type;
int max_size;
// Padding between elements
Distance spacing;
GList *children;
GList *children;
};
static void box_update ( widget *wid );
static int box_get_desired_height ( widget *wid )
{
box *b = (box *)wid;
int spacing = distance_get_pixel ( b->spacing, b->type == BOX_VERTICAL? ORIENTATION_VERTICAL:ORIENTATION_HORIZONTAL );
box *b = (box *) wid;
int spacing = distance_get_pixel ( b->spacing, b->type == BOX_VERTICAL ? ORIENTATION_VERTICAL : ORIENTATION_HORIZONTAL );
int active_widgets = 0;
int height = 0;
if ( b->type == BOX_VERTICAL ){
int height = 0;
if ( b->type == BOX_VERTICAL ) {
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
widget * child = (widget *) iter->data;
if ( !child->enabled ) {
@ -68,10 +68,11 @@ static int box_get_desired_height ( widget *wid )
}
height += widget_get_desired_height ( child );
}
if ( active_widgets > 0 ){
height += (active_widgets - 1)*spacing;
if ( active_widgets > 0 ) {
height += ( active_widgets - 1 ) * spacing;
}
} else {
}
else {
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
widget * child = (widget *) iter->data;
if ( !child->enabled ) {
@ -84,18 +85,17 @@ static int box_get_desired_height ( widget *wid )
return height;
}
static void vert_calculate_size ( box *b )
{
int spacing = distance_get_pixel ( b->spacing, ORIENTATION_VERTICAL );
int spacing = distance_get_pixel ( b->spacing, ORIENTATION_VERTICAL );
int expanding_widgets = 0;
int active_widgets = 0;
int rem_width = widget_padding_get_remaining_width ( WIDGET (b) );
int rem_height = widget_padding_get_remaining_height ( WIDGET (b) );
int rem_width = widget_padding_get_remaining_width ( WIDGET ( b ) );
int rem_height = widget_padding_get_remaining_height ( WIDGET ( b ) );
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
widget * child = (widget *) iter->data;
if ( child->enabled && child->expand == FALSE ){
widget_resize ( child, rem_width, widget_get_desired_height (child) );
if ( child->enabled && child->expand == FALSE ) {
widget_resize ( child, rem_width, widget_get_desired_height ( child ) );
}
}
b->max_size = 0;
@ -109,11 +109,11 @@ static void vert_calculate_size ( box *b )
expanding_widgets++;
continue;
}
if ( child->h > 0 ){
if ( child->h > 0 ) {
b->max_size += child->h;
}
}
if ( active_widgets > 0 ){
if ( active_widgets > 0 ) {
b->max_size += ( active_widgets - 1 ) * spacing;
}
if ( b->max_size > rem_height ) {
@ -122,9 +122,9 @@ static void vert_calculate_size ( box *b )
return;
}
if ( active_widgets > 0 ) {
int top = widget_padding_get_top ( WIDGET ( b ) );
double rem = rem_height - b->max_size;
int index = 0;
int top = widget_padding_get_top ( WIDGET ( b ) );
double rem = rem_height - b->max_size;
int index = 0;
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
widget * child = (widget *) iter->data;
if ( child->enabled == FALSE ) {
@ -147,18 +147,18 @@ static void vert_calculate_size ( box *b )
}
}
}
b->max_size += widget_padding_get_padding_height ( WIDGET (b) );
b->max_size += widget_padding_get_padding_height ( WIDGET ( b ) );
}
static void hori_calculate_size ( box *b )
{
int spacing = distance_get_pixel ( b->spacing, ORIENTATION_HORIZONTAL );
int spacing = distance_get_pixel ( b->spacing, ORIENTATION_HORIZONTAL );
int expanding_widgets = 0;
int active_widgets = 0;
int rem_width = widget_padding_get_remaining_width ( WIDGET (b) );
int rem_height = widget_padding_get_remaining_height ( WIDGET (b) );
int rem_width = widget_padding_get_remaining_width ( WIDGET ( b ) );
int rem_height = widget_padding_get_remaining_height ( WIDGET ( b ) );
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
widget * child = (widget *) iter->data;
if ( child->enabled && child->expand == FALSE ){
if ( child->enabled && child->expand == FALSE ) {
widget_resize ( child, child->w, rem_height );
}
}
@ -174,18 +174,18 @@ static void hori_calculate_size ( box *b )
continue;
}
// Size used by fixed width widgets.
if ( child->h > 0 ){
b->max_size += child->w;
if ( child->h > 0 ) {
b->max_size += child->w;
}
}
b->max_size += MAX ( 0, ( ( active_widgets - 1 ) * spacing ) );
if ( b->max_size > (rem_width)) {
if ( b->max_size > ( rem_width ) ) {
b->max_size = rem_width;
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Widgets to large (width) for box: %d %d", b->max_size, b->widget.w );
return;
}
if ( active_widgets > 0 ) {
int left = widget_padding_get_left ( WIDGET (b) );
int left = widget_padding_get_left ( WIDGET ( b ) );
double rem = rem_width - b->max_size;
int index = 0;
for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) {
@ -200,7 +200,7 @@ static void hori_calculate_size ( box *b )
left += expanding_widgets_size;
widget_resize ( child, expanding_widgets_size, rem_height );
left += spacing;
rem -= expanding_widgets_size;
rem -= expanding_widgets_size;
index++;
}
else {
@ -236,8 +236,8 @@ static void box_free ( widget *wid )
static int box_sort_children ( gconstpointer a, gconstpointer b )
{
widget *child_a = (widget*)a;
widget *child_b = (widget*)b;
widget *child_a = (widget *) a;
widget *child_b = (widget *) b;
return child_a->index - child_b->index;
}
@ -248,17 +248,18 @@ void box_add ( box *box, widget *child, gboolean expand, int index )
return;
}
// Make sure box is width/heigh enough.
if ( box->type == BOX_VERTICAL){
int width=box->widget.w;
width = MAX ( width, child->w+widget_padding_get_padding_width ( WIDGET ( box ) ));
if ( box->type == BOX_VERTICAL ) {
int width = box->widget.w;
width = MAX ( width, child->w + widget_padding_get_padding_width ( WIDGET ( box ) ) );
box->widget.w = width;
} else {
}
else {
int height = box->widget.h;
height = MAX (height, child->h+widget_padding_get_padding_height ( WIDGET ( box )));
height = MAX ( height, child->h + widget_padding_get_padding_height ( WIDGET ( box ) ) );
box->widget.h = height;
}
child->expand = rofi_theme_get_boolean ( child, "expand", expand);
child->index = rofi_theme_get_integer_exact ( child, "index" , index );
child->expand = rofi_theme_get_boolean ( child, "expand", expand );
child->index = rofi_theme_get_integer_exact ( child, "index", index );
child->parent = WIDGET ( box );
box->children = g_list_append ( box->children, (void *) child );
box->children = g_list_sort ( box->children, box_sort_children );
@ -314,7 +315,7 @@ box * box_create ( const char *name, boxType type )
{
box *b = g_malloc0 ( sizeof ( box ) );
// Initialize widget.
widget_init ( WIDGET(b), name );
widget_init ( WIDGET ( b ), name );
b->type = type;
b->widget.draw = box_draw;
b->widget.free = box_free;
@ -323,9 +324,9 @@ box * box_create ( const char *name, boxType type )
b->widget.clicked = box_clicked;
b->widget.motion_notify = box_motion_notify;
b->widget.get_desired_height = box_get_desired_height;
b->widget.enabled = TRUE;
b->widget.enabled = TRUE;
b->spacing = rofi_theme_get_distance ( WIDGET(b), "spacing", DEFAULT_SPACING );
b->spacing = rofi_theme_get_distance ( WIDGET ( b ), "spacing", DEFAULT_SPACING );
return b;
}

View File

@ -31,24 +31,23 @@
#include "widgets/container.h"
#include "theme.h"
#define LOG_DOMAIN "Widgets.Window"
#define LOG_DOMAIN "Widgets.Window"
/** The default border width of the container */
#define DEFAULT_BORDER_WIDTH 2
#define DEFAULT_BORDER_WIDTH 2
struct _window
{
widget widget;
widget widget;
widget *child;
};
static void container_update ( widget *wid );
static int container_get_desired_height ( widget *widget )
{
container *b = (container *) widget;
int height = 0;
container *b = (container *) widget;
int height = 0;
if ( b->child ) {
height += widget_get_desired_height ( b->child );
}
@ -56,7 +55,6 @@ static int container_get_desired_height ( widget *widget )
return height;
}
static void container_draw ( widget *wid, cairo_t *draw )
{
container *b = (container *) wid;
@ -78,7 +76,7 @@ void container_add ( container *container, widget *child )
return;
}
container->child = child;
child->parent = WIDGET ( container );
child->parent = WIDGET ( container );
widget_update ( WIDGET ( container ) );
}
@ -119,7 +117,7 @@ container * container_create ( const char *name )
{
container *b = g_malloc0 ( sizeof ( container ) );
// Initialize widget.
widget_init ( WIDGET(b), name );
widget_init ( WIDGET ( b ), name );
b->widget.draw = container_draw;
b->widget.free = container_free;
b->widget.resize = container_resize;
@ -134,15 +132,14 @@ container * container_create ( const char *name )
static void container_update ( widget *wid )
{
container *b = (container *) wid;
if ( b->child && b->child->enabled ){
if ( b->child && b->child->enabled ) {
widget_resize ( WIDGET ( b->child ),
widget_padding_get_remaining_width (WIDGET(b)),
widget_padding_get_remaining_height (WIDGET(b))
);
widget_padding_get_remaining_width ( WIDGET ( b ) ),
widget_padding_get_remaining_height ( WIDGET ( b ) )
);
widget_move ( WIDGET ( b->child ),
widget_padding_get_left (WIDGET(b)),
widget_padding_get_top (WIDGET(b))
);
widget_padding_get_left ( WIDGET ( b ) ),
widget_padding_get_top ( WIDGET ( b ) )
);
}
}

View File

@ -32,7 +32,7 @@
#include "settings.h"
#include "theme.h"
#define DEFAULT_SPACING 2
#define DEFAULT_SPACING 2
struct _listview
{
@ -81,8 +81,7 @@ struct _listview
listview_mouse_activated_cb mouse_activated;
void *mouse_activated_data;
char *listview_name;
char *listview_name;
};
static int listview_get_desired_height ( widget *wid );
@ -95,7 +94,7 @@ static void listview_free ( widget *wid )
}
g_free ( lv->boxes );
g_free( lv->listview_name );
g_free ( lv->listview_name );
widget_free ( WIDGET ( lv->scrollbar ) );
g_free ( lv );
}
@ -168,8 +167,9 @@ static void listview_draw ( widget *wid, cairo_t *draw )
scrollbar_set_max_value ( lv->scrollbar, lv->req_elements );
scrollbar_set_handle_length ( lv->scrollbar, lv->cur_columns * lv->max_rows );
if ( lv->reverse ) {
scrollbar_set_handle ( lv->scrollbar, lv->req_elements - lv->selected -1 );
} else {
scrollbar_set_handle ( lv->scrollbar, lv->req_elements - lv->selected - 1 );
}
else {
scrollbar_set_handle ( lv->scrollbar, lv->selected );
}
lv->last_offset = offset;
@ -195,9 +195,10 @@ static void listview_draw ( widget *wid, cairo_t *draw )
for ( unsigned int i = 0; i < max; i++ ) {
unsigned int ex = left_offset + ( ( i ) / lv->max_rows ) * ( element_width + spacing_hori );
if ( lv->reverse ) {
unsigned int ey = wid->h-(widget_padding_get_bottom ( wid ) + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert ))-lv->element_height;
unsigned int ey = wid->h - ( widget_padding_get_bottom ( wid ) + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert ) ) - lv->element_height;
textbox_moveresize ( lv->boxes[i], ex, ey, element_width, lv->element_height );
} else {
}
else {
unsigned int ey = top_offset + ( ( i ) % lv->max_rows ) * ( lv->element_height + spacing_vert );
textbox_moveresize ( lv->boxes[i], ex, ey, element_width, lv->element_height );
}
@ -238,12 +239,12 @@ static void listview_recompute_elements ( listview *lv )
if ( newne > 0 ) {
for ( unsigned int i = lv->cur_elements; i < newne; i++ ) {
TextboxFlags flags = ( lv->multi_select ) ? TB_INDICATOR : 0;
char *name = g_strjoin (".", lv->listview_name,"element", NULL);
char *name = g_strjoin ( ".", lv->listview_name, "element", NULL );
lv->boxes[i] = textbox_create ( name, flags, NORMAL, "" );
g_free ( name );
}
}
lv->rchanged = TRUE;
lv->rchanged = TRUE;
lv->cur_elements = newne;
}
@ -274,21 +275,22 @@ void listview_set_selected ( listview *lv, unsigned int selected )
static void listview_resize ( widget *wid, short w, short h )
{
listview *lv = (listview *) wid;
lv->widget.w = MAX ( 0, w );
lv->widget.h = MAX ( 0, h );
int height = lv->widget.h - widget_padding_get_padding_height ( WIDGET (lv) );
int spacing_vert = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL );
lv->widget.w = MAX ( 0, w );
lv->widget.h = MAX ( 0, h );
int height = lv->widget.h - widget_padding_get_padding_height ( WIDGET ( lv ) );
int spacing_vert = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL );
lv->max_rows = ( spacing_vert + height ) / ( lv->element_height + spacing_vert );
lv->max_elements = lv->max_rows * lv->menu_columns;
if ( lv->scrollbar->widget.index == 0 ){
if ( lv->scrollbar->widget.index == 0 ) {
widget_move ( WIDGET ( lv->scrollbar ),
widget_padding_get_left ( WIDGET ( lv ) ),
widget_padding_get_top ( WIDGET ( lv ) ) );
} else {
widget_padding_get_left ( WIDGET ( lv ) ),
widget_padding_get_top ( WIDGET ( lv ) ) );
}
else {
widget_move ( WIDGET ( lv->scrollbar ),
lv->widget.w - widget_padding_get_right ( WIDGET ( lv ) ) - widget_get_width ( WIDGET ( lv->scrollbar ) ),
widget_padding_get_top ( WIDGET (lv ) ));
lv->widget.w - widget_padding_get_right ( WIDGET ( lv ) ) - widget_get_width ( WIDGET ( lv->scrollbar ) ),
widget_padding_get_top ( WIDGET ( lv ) ) );
}
widget_resize ( WIDGET ( lv->scrollbar ), widget_get_width ( WIDGET ( lv->scrollbar ) ), height );
@ -354,10 +356,10 @@ static gboolean listview_motion_notify ( widget *wid, xcb_motion_notify_event_t
}
listview *listview_create ( const char *name, listview_update_callback cb, void *udata, unsigned int eh, gboolean reverse )
{
listview *lv = g_malloc0 ( sizeof ( listview ) );
gchar *box = g_strjoin (".", name, "box", NULL );
listview *lv = g_malloc0 ( sizeof ( listview ) );
gchar *box = g_strjoin ( ".", name, "box", NULL );
widget_init ( WIDGET ( lv ), box );
g_free(box);
g_free ( box );
lv->listview_name = g_strdup ( name );
lv->widget.free = listview_free;
lv->widget.resize = listview_resize;
@ -366,21 +368,21 @@ listview *listview_create ( const char *name, listview_update_callback cb, void
lv->widget.motion_notify = listview_motion_notify;
lv->widget.get_desired_height = listview_get_desired_height;
lv->widget.enabled = TRUE;
lv->eh = eh;
lv->eh = eh;
char *n = g_strjoin(".", lv->listview_name,"scrollbar", NULL);
char *n = g_strjoin ( ".", lv->listview_name, "scrollbar", NULL );
lv->scrollbar = scrollbar_create ( n );
// Default position on right.
lv->scrollbar->widget.index = rofi_theme_get_integer_exact ( WIDGET (lv->scrollbar), "index", 1);
g_free(n);
lv->scrollbar->widget.index = rofi_theme_get_integer_exact ( WIDGET ( lv->scrollbar ), "index", 1 );
g_free ( n );
widget_set_clicked_handler ( WIDGET ( lv->scrollbar ), listview_scrollbar_clicked, lv );
lv->scrollbar->widget.parent = WIDGET ( lv );
// Calculate height of an element.
//
char *tb_name = g_strjoin (".", lv->listview_name,"element", NULL);
textbox *tb = textbox_create ( tb_name, 0, NORMAL, "" );
lv->element_height = textbox_get_estimated_height (tb, lv->eh);
g_free(tb_name);
char *tb_name = g_strjoin ( ".", lv->listview_name, "element", NULL );
textbox *tb = textbox_create ( tb_name, 0, NORMAL, "" );
lv->element_height = textbox_get_estimated_height ( tb, lv->eh );
g_free ( tb_name );
lv->callback = cb;
lv->udata = udata;
@ -389,12 +391,11 @@ listview *listview_create ( const char *name, listview_update_callback cb, void
lv->spacing = rofi_theme_get_distance ( WIDGET ( lv ), "spacing", DEFAULT_SPACING );
lv->menu_columns = rofi_theme_get_integer ( WIDGET ( lv ), "columns", config.menu_columns );
lv->fixed_num_lines = rofi_theme_get_boolean ( WIDGET ( lv ), "fixed-height", config.fixed_num_lines );
lv->dynamic = rofi_theme_get_boolean ( WIDGET ( lv ), "dynamic", TRUE );
lv->reverse = rofi_theme_get_boolean ( WIDGET ( lv ), "reverse", reverse );
listview_set_show_scrollbar ( lv, rofi_theme_get_boolean ( WIDGET ( lv ), "scrollbar", !config.hide_scrollbar ));
lv->dynamic = rofi_theme_get_boolean ( WIDGET ( lv ), "dynamic", TRUE );
lv->reverse = rofi_theme_get_boolean ( WIDGET ( lv ), "reverse", reverse );
listview_set_show_scrollbar ( lv, rofi_theme_get_boolean ( WIDGET ( lv ), "scrollbar", !config.hide_scrollbar ) );
lv->cycle = rofi_theme_get_boolean ( WIDGET ( lv ), "cycle", config.cycle );
return lv;
}
@ -433,7 +434,8 @@ void listview_nav_up ( listview *lv )
{
if ( lv->reverse ) {
listview_nav_down_int ( lv );
} else {
}
else {
listview_nav_up_int ( lv );
}
}
@ -441,7 +443,8 @@ void listview_nav_down ( listview *lv )
{
if ( lv->reverse ) {
listview_nav_up_int ( lv );
} else {
}
else {
listview_nav_down_int ( lv );
}
}
@ -510,45 +513,48 @@ static void listview_nav_page_next_int ( listview *lv )
void listview_nav_page_prev ( listview *lv )
{
if ( lv->reverse ){
if ( lv->reverse ) {
listview_nav_page_next_int ( lv );
} else {
}
else {
listview_nav_page_prev_int ( lv );
}
}
void listview_nav_page_next ( listview *lv )
{
if ( lv->reverse ){
if ( lv->reverse ) {
listview_nav_page_prev_int ( lv );
} else {
}
else {
listview_nav_page_next_int ( lv );
}
}
static int listview_get_desired_height ( widget *wid )
{
listview *lv = (listview *)wid;
int spacing = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL );
if ( lv == NULL || lv->widget.enabled == FALSE ) {
listview *lv = (listview *) wid;
int spacing = distance_get_pixel ( lv->spacing, ORIENTATION_VERTICAL );
if ( lv == NULL || lv->widget.enabled == FALSE ) {
return 0;
}
int h = lv->menu_lines;
if ( !( lv->fixed_num_lines ) ) {
if ( lv->dynamic ) {
h = MIN ( lv->menu_lines, lv->req_elements );
} else {
}
else {
h = MIN ( lv->menu_lines, lv->max_displayed_lines );
}
}
if ( h == 0 ) {
if ( lv->dynamic && !lv->fixed_num_lines ){
if ( lv->dynamic && !lv->fixed_num_lines ) {
// Hide widget fully.
return 0;
}
return widget_padding_get_padding_height ( WIDGET (lv) );
return widget_padding_get_padding_height ( WIDGET ( lv ) );
}
int height = widget_padding_get_padding_height ( WIDGET (lv) );
height += h*(lv->element_height+spacing) - spacing;
int height = widget_padding_get_padding_height ( WIDGET ( lv ) );
height += h * ( lv->element_height + spacing ) - spacing;
return height;
}

View File

@ -30,13 +30,12 @@
#include "theme.h"
#define DEFAULT_SCROLLBAR_WIDTH 8
#define DEFAULT_SCROLLBAR_WIDTH 8
static void scrollbar_draw ( widget *, cairo_t * );
static void scrollbar_free ( widget * );
static gboolean scrollbar_motion_notify ( widget *wid, xcb_motion_notify_event_t *xme );
static int scrollbar_get_desired_height ( widget *wid )
{
// Want height we are.
@ -46,17 +45,17 @@ static int scrollbar_get_desired_height ( widget *wid )
scrollbar *scrollbar_create ( const char *name )
{
scrollbar *sb = g_malloc0 ( sizeof ( scrollbar ) );
widget_init ( WIDGET (sb), name );
widget_init ( WIDGET ( sb ), name );
sb->widget.x = 0;
sb->widget.y = 0;
sb->width = rofi_theme_get_distance ( WIDGET (sb), "handle-width", DEFAULT_SCROLLBAR_WIDTH );
int width = distance_get_pixel (sb->width, ORIENTATION_HORIZONTAL);
sb->widget.w = widget_padding_get_padding_width ( WIDGET (sb)) + width;
sb->width = rofi_theme_get_distance ( WIDGET ( sb ), "handle-width", DEFAULT_SCROLLBAR_WIDTH );
int width = distance_get_pixel ( sb->width, ORIENTATION_HORIZONTAL );
sb->widget.w = widget_padding_get_padding_width ( WIDGET ( sb ) ) + width;
sb->widget.h = widget_padding_get_padding_height ( WIDGET ( sb ) );
sb->widget.draw = scrollbar_draw;
sb->widget.free = scrollbar_free;
sb->widget.motion_notify = scrollbar_motion_notify;
sb->widget.draw = scrollbar_draw;
sb->widget.free = scrollbar_free;
sb->widget.motion_notify = scrollbar_motion_notify;
sb->widget.get_desired_height = scrollbar_get_desired_height;
sb->length = 10;
@ -110,7 +109,7 @@ void scrollbar_set_handle_length ( scrollbar *sb, unsigned int pos_length )
static void scrollbar_draw ( widget *wid, cairo_t *draw )
{
scrollbar *sb = (scrollbar *) wid;
unsigned int wh = widget_padding_get_remaining_height ( wid );
unsigned int wh = widget_padding_get_remaining_height ( wid );
// Calculate position and size.
unsigned int r = ( sb->length * wh ) / ( (double) ( sb->length + sb->pos_length ) );
unsigned int handle = wid->h - r;
@ -122,14 +121,14 @@ static void scrollbar_draw ( widget *wid, cairo_t *draw )
// Never go out of bar.
height = MAX ( 2, height );
// Cap length;
rofi_theme_get_color ( WIDGET (sb ), "foreground", draw );
rofi_theme_get_color ( WIDGET (sb ), "handle-color", draw );
rofi_theme_get_color ( WIDGET ( sb ), "foreground", draw );
rofi_theme_get_color ( WIDGET ( sb ), "handle-color", draw );
cairo_rectangle ( draw,
widget_padding_get_left ( wid ),
widget_padding_get_top ( wid ) + y,
widget_padding_get_remaining_width ( wid ),
height );
widget_padding_get_left ( wid ),
widget_padding_get_top ( wid ) + y,
widget_padding_get_remaining_width ( wid ),
height );
cairo_fill ( draw );
}
static gboolean scrollbar_motion_notify ( widget *wid, xcb_motion_notify_event_t *xme )
@ -146,10 +145,10 @@ unsigned int scrollbar_clicked ( const scrollbar *sb, int y )
{
if ( sb != NULL ) {
if ( y >= sb->widget.y && y <= ( sb->widget.y + sb->widget.h ) ) {
short r = ( sb->length * sb->widget.h ) / ( (double) ( sb->length + sb->pos_length ) );
short handle = sb->widget.h - r;
double sec = ( ( r ) / (double) ( sb->length - 1 ) );
short half_handle = handle / 2;
short r = ( sb->length * sb->widget.h ) / ( (double) ( sb->length + sb->pos_length ) );
short handle = sb->widget.h - r;
double sec = ( ( r ) / (double) ( sb->length - 1 ) );
short half_handle = handle / 2;
y -= sb->widget.y + half_handle;
y = MIN ( MAX ( 0, y ), sb->widget.h - 2 * half_handle );
@ -159,4 +158,3 @@ unsigned int scrollbar_clicked ( const scrollbar *sb, int y )
}
return 0;
}

View File

@ -79,15 +79,14 @@ static void textbox_resize ( widget *wid, short w, short h )
}
static int textbox_get_desired_height ( widget *wid )
{
textbox *tb = (textbox *)wid;
if ( (tb->flags & TB_AUTOHEIGHT) == 0 )
{
textbox *tb = (textbox *) wid;
if ( ( tb->flags & TB_AUTOHEIGHT ) == 0 ) {
return tb->widget.h;
}
if ( tb->changed ) {
__textbox_update_pango_text ( tb );
}
int height = textbox_get_height (tb);
int height = textbox_get_height ( tb );
return height;
}
@ -95,15 +94,15 @@ textbox* textbox_create ( const char *name, TextboxFlags flags, TextBoxFontType
{
textbox *tb = g_slice_new0 ( textbox );
widget_init ( WIDGET (tb), name );
widget_init ( WIDGET ( tb ), name );
tb->widget.draw = textbox_draw;
tb->widget.free = textbox_free;
tb->widget.resize = textbox_resize;
tb->widget.get_width = textbox_get_width;
tb->widget.get_height = _textbox_get_height;
tb->widget.draw = textbox_draw;
tb->widget.free = textbox_free;
tb->widget.resize = textbox_resize;
tb->widget.get_width = textbox_get_width;
tb->widget.get_height = _textbox_get_height;
tb->widget.get_desired_height = textbox_get_desired_height;
tb->flags = flags;
tb->flags = flags;
tb->changed = FALSE;
@ -137,11 +136,11 @@ textbox* textbox_create ( const char *name, TextboxFlags flags, TextBoxFontType
*/
const char const *const theme_prop_names[][3] = {
/** Normal row */
{"normal.normal", "selected.normal", "alternate.normal"},
{ "normal.normal", "selected.normal", "alternate.normal" },
/** Urgent row */
{"normal.urgent", "selected.urgent", "alternate.urgent"},
{ "normal.urgent", "selected.urgent", "alternate.urgent" },
/** Active row */
{"normal.active", "selected.active", "alternate.active"},
{ "normal.active", "selected.active", "alternate.active" },
};
void textbox_font ( textbox *tb, TextBoxFontType tbft )
@ -157,13 +156,13 @@ void textbox_font ( textbox *tb, TextBoxFontType tbft )
switch ( ( tbft & FMOD_MASK ) )
{
case HIGHLIGHT:
widget_set_state ( WIDGET (tb), theme_prop_names[t][1]);
widget_set_state ( WIDGET ( tb ), theme_prop_names[t][1] );
break;
case ALT:
widget_set_state ( WIDGET (tb), theme_prop_names[t][2]);
widget_set_state ( WIDGET ( tb ), theme_prop_names[t][2] );
break;
default:
widget_set_state ( WIDGET (tb), theme_prop_names[t][0]);
widget_set_state ( WIDGET ( tb ), theme_prop_names[t][0] );
break;
}
if ( tb->tbft != tbft || tb->widget.state == NULL ) {
@ -232,7 +231,7 @@ void textbox_text ( textbox *tb, const char *text )
__textbox_update_pango_text ( tb );
if ( tb->flags & TB_AUTOWIDTH ) {
textbox_moveresize ( tb, tb->widget.x, tb->widget.y, tb->widget.w, tb->widget.h );
if ( WIDGET(tb)->parent ){
if ( WIDGET ( tb )->parent ) {
widget_update ( WIDGET ( tb )->parent );
}
}
@ -248,7 +247,7 @@ void textbox_moveresize ( textbox *tb, int x, int y, int w, int h )
if ( tb->flags & TB_AUTOWIDTH ) {
pango_layout_set_width ( tb->layout, -1 );
unsigned int offset = ( tb->flags & TB_INDICATOR ) ? DOT_OFFSET : 0;
w = textbox_get_font_width ( tb ) + widget_padding_get_padding_width ( WIDGET (tb) ) + offset;
w = textbox_get_font_width ( tb ) + widget_padding_get_padding_width ( WIDGET ( tb ) ) + offset;
}
else {
// set ellipsize
@ -263,9 +262,9 @@ void textbox_moveresize ( textbox *tb, int x, int y, int w, int h )
if ( tb->flags & TB_AUTOHEIGHT ) {
// Width determines height!
int tw = MAX ( 1, w );
pango_layout_set_width ( tb->layout, PANGO_SCALE * ( tw - widget_padding_get_padding_width ( WIDGET (tb) ) - offset ) );
pango_layout_set_width ( tb->layout, PANGO_SCALE * ( tw - widget_padding_get_padding_width ( WIDGET ( tb ) ) - offset ) );
int hd = textbox_get_height ( tb );
h = MAX (hd, h);
h = MAX ( hd, h );
}
if ( x != tb->widget.x || y != tb->widget.y || w != tb->widget.w || h != tb->widget.h ) {
@ -276,7 +275,7 @@ void textbox_moveresize ( textbox *tb, int x, int y, int w, int h )
}
// We always want to update this
pango_layout_set_width ( tb->layout, PANGO_SCALE * ( tb->widget.w - widget_padding_get_padding_width ( WIDGET (tb) ) - offset ) );
pango_layout_set_width ( tb->layout, PANGO_SCALE * ( tb->widget.w - widget_padding_get_padding_width ( WIDGET ( tb ) ) - offset ) );
tb->update = TRUE;
widget_queue_redraw ( WIDGET ( tb ) );
}
@ -323,9 +322,9 @@ static void texbox_update ( textbox *tb )
pango_cairo_update_layout ( tb->main_draw, tb->layout );
int font_height = textbox_get_font_height ( tb );
int cursor_x = 0;
int cursor_y = 0;
int cursor_width = 2;//MAX ( 2, font_height / 10 );
int cursor_x = 0;
int cursor_y = 0;
int cursor_width = 2;//MAX ( 2, font_height / 10 );
int cursor_height = font_height;
if ( tb->changed ) {
@ -341,33 +340,33 @@ static void texbox_update ( textbox *tb )
// convert to byte location.
char *offset = g_utf8_offset_to_pointer ( text, cursor_offset );
pango_layout_get_cursor_pos ( tb->layout, offset - text, &pos, NULL );
cursor_x = pos.x / PANGO_SCALE;
cursor_y = pos.y / PANGO_SCALE;
cursor_height = pos.height/PANGO_SCALE;
cursor_x = pos.x / PANGO_SCALE;
cursor_y = pos.y / PANGO_SCALE;
cursor_height = pos.height / PANGO_SCALE;
}
// Skip the side MARGIN on the X axis.
int x = widget_padding_get_left ( WIDGET (tb) ) + offset;
int x = widget_padding_get_left ( WIDGET ( tb ) ) + offset;
int y = 0;
if ( tb->flags & TB_RIGHT ) {
int line_width = 0;
// Get actual width.
pango_layout_get_pixel_size ( tb->layout, &line_width, NULL );
x = ( tb->widget.w - line_width - widget_padding_get_right ( WIDGET (tb) ) - offset );
x = ( tb->widget.w - line_width - widget_padding_get_right ( WIDGET ( tb ) ) - offset );
}
else if ( tb->flags & TB_CENTER ) {
int tw = textbox_get_font_width ( tb );
x = ( ( tb->widget.w - tw - widget_padding_get_padding_width( WIDGET (tb) ) - offset ) ) / 2;
x = ( ( tb->widget.w - tw - widget_padding_get_padding_width ( WIDGET ( tb ) ) - offset ) ) / 2;
}
y = widget_padding_get_top ( WIDGET (tb) ) + ( pango_font_metrics_get_ascent ( p_metrics ) - pango_layout_get_baseline ( tb->layout ) ) / PANGO_SCALE;
y = widget_padding_get_top ( WIDGET ( tb ) ) + ( pango_font_metrics_get_ascent ( p_metrics ) - pango_layout_get_baseline ( tb->layout ) ) / PANGO_SCALE;
rofi_theme_get_color ( WIDGET ( tb ), "foreground", tb->main_draw);
rofi_theme_get_color ( WIDGET ( tb ), "foreground", tb->main_draw );
// Text
rofi_theme_get_color ( WIDGET ( tb ), "text", tb->main_draw);
rofi_theme_get_color ( WIDGET ( tb ), "text", tb->main_draw );
// draw the cursor
if ( tb->flags & TB_EDITABLE && tb->blink ) {
cairo_rectangle ( tb->main_draw, x + cursor_x, y+cursor_y, cursor_width, cursor_height);
cairo_rectangle ( tb->main_draw, x + cursor_x, y + cursor_y, cursor_width, cursor_height );
cairo_fill ( tb->main_draw );
}
@ -378,7 +377,6 @@ static void texbox_update ( textbox *tb )
pango_cairo_show_layout ( tb->main_draw, tb->layout );
if ( ( tb->flags & TB_INDICATOR ) == TB_INDICATOR && ( tb->tbft & ( SELECTED ) ) ) {
cairo_arc ( tb->main_draw, DOT_OFFSET / 2.0, tb->widget.h / 2.0, 2.0, 0, 2.0 * M_PI );
cairo_fill ( tb->main_draw );
}
@ -392,8 +390,8 @@ static void textbox_draw ( widget *wid, cairo_t *draw )
texbox_update ( tb );
/* Write buffer */
cairo_set_source_surface ( draw, tb->main_surface, 0,0 );
cairo_rectangle ( draw, 0,0, tb->widget.w, tb->widget.h );
cairo_set_source_surface ( draw, tb->main_surface, 0, 0 );
cairo_rectangle ( draw, 0, 0, tb->widget.w, tb->widget.h );
cairo_fill ( draw );
}
@ -747,7 +745,7 @@ int _textbox_get_height ( widget *wid )
}
int textbox_get_height ( const textbox *tb )
{
return textbox_get_font_height ( tb ) + widget_padding_get_padding_height ( WIDGET (tb) );
return textbox_get_font_height ( tb ) + widget_padding_get_padding_height ( WIDGET ( tb ) );
}
int textbox_get_font_height ( const textbox *tb )
@ -768,7 +766,7 @@ int textbox_get_font_width ( const textbox *tb )
static double char_height = -1;
double textbox_get_estimated_char_height ( void )
{
if ( char_height < 0 ){
if ( char_height < 0 ) {
int height = pango_font_metrics_get_ascent ( p_metrics ) + pango_font_metrics_get_descent ( p_metrics );
char_height = ( height ) / (double) PANGO_SCALE;
}
@ -779,7 +777,7 @@ double textbox_get_estimated_char_height ( void )
static double char_width = -1;
double textbox_get_estimated_char_width ( void )
{
if ( char_width < 0 ){
if ( char_width < 0 ) {
int width = pango_font_metrics_get_approximate_char_width ( p_metrics );
char_width = ( width ) / (double) PANGO_SCALE;
}
@ -789,5 +787,5 @@ double textbox_get_estimated_char_width ( void )
int textbox_get_estimated_height ( const textbox *tb, int eh )
{
int height = pango_font_metrics_get_ascent ( p_metrics ) + pango_font_metrics_get_descent ( p_metrics );
return ( eh*height ) / PANGO_SCALE + widget_padding_get_padding_height ( WIDGET ( tb ) );
return ( eh * height ) / PANGO_SCALE + widget_padding_get_padding_height ( WIDGET ( tb ) );
}

View File

@ -3,25 +3,24 @@
#include "widgets/widget-internal.h"
#include "theme.h"
void widget_init ( widget *widget , const char *name )
void widget_init ( widget *widget, const char *name )
{
widget->name = g_strdup(name);
widget->padding = (Padding){ {0, PW_PX, SOLID}, {0, PW_PX, SOLID}, {0, PW_PX, SOLID}, {0, PW_PX, SOLID}};
widget->border = (Padding){ {0, PW_PX, SOLID}, {0, PW_PX, SOLID}, {0, PW_PX, SOLID}, {0, PW_PX, SOLID}};
widget->margin = (Padding){ {0, PW_PX, SOLID}, {0, PW_PX, SOLID}, {0, PW_PX, SOLID}, {0, PW_PX, SOLID}};
widget->name = g_strdup ( name );
widget->padding = (Padding){ { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID } };
widget->border = (Padding){ { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID } };
widget->margin = (Padding){ { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID }, { 0, PW_PX, SOLID } };
widget->padding = rofi_theme_get_padding ( widget, "padding", widget->padding);
widget->border = rofi_theme_get_padding ( widget, "border", widget->border);
widget->margin = rofi_theme_get_padding ( widget, "margin", widget->margin);
widget->padding = rofi_theme_get_padding ( widget, "padding", widget->padding );
widget->border = rofi_theme_get_padding ( widget, "border", widget->border );
widget->margin = rofi_theme_get_padding ( widget, "margin", widget->margin );
}
void widget_set_state ( widget *widget, const char *state )
{
if ( g_strcmp0(widget->state, state ) ){
if ( g_strcmp0 ( widget->state, state ) ) {
widget->state = state;
// Update border.
widget->border = rofi_theme_get_padding ( widget, "border", widget->border);
widget->border = rofi_theme_get_padding ( widget, "border", widget->border );
widget_queue_redraw ( widget );
}
@ -94,67 +93,67 @@ void widget_draw ( widget *widget, cairo_t *d )
// Check if enabled and if draw is implemented.
if ( widget && widget->enabled && widget->draw ) {
// Don't draw if there is no space.
if ( widget->h < 1 || widget->w < 1 ){
if ( widget->h < 1 || widget->w < 1 ) {
widget->need_redraw = FALSE;
return;
}
// Store current state.
cairo_save ( d );
int margin_left = distance_get_pixel ( widget->margin.left, ORIENTATION_HORIZONTAL);
int margin_top = distance_get_pixel ( widget->margin.top, ORIENTATION_VERTICAL);
int margin_right = distance_get_pixel ( widget->margin.right, ORIENTATION_HORIZONTAL);
int margin_bottom = distance_get_pixel ( widget->margin.bottom, ORIENTATION_VERTICAL);
int margin_left = distance_get_pixel ( widget->margin.left, ORIENTATION_HORIZONTAL );
int margin_top = distance_get_pixel ( widget->margin.top, ORIENTATION_VERTICAL );
int margin_right = distance_get_pixel ( widget->margin.right, ORIENTATION_HORIZONTAL );
int margin_bottom = distance_get_pixel ( widget->margin.bottom, ORIENTATION_VERTICAL );
// Define a clipmask so we won't draw outside out widget.
cairo_rectangle ( d,
widget->x+margin_left,
widget->y+margin_top,
widget->w-margin_right-margin_left,
widget->h-margin_top-margin_bottom
);
widget->x + margin_left,
widget->y + margin_top,
widget->w - margin_right - margin_left,
widget->h - margin_top - margin_bottom
);
cairo_clip ( d );
rofi_theme_get_color ( widget, "background", d );
cairo_paint( d ) ;
cairo_paint ( d );
// Set new x/y possition.
cairo_translate ( d, widget->x, widget->y);
cairo_translate ( d, widget->x, widget->y );
int left = distance_get_pixel ( widget->border.left, ORIENTATION_HORIZONTAL );
int right = distance_get_pixel ( widget->border.right, ORIENTATION_HORIZONTAL);
int top = distance_get_pixel ( widget->border.top, ORIENTATION_VERTICAL);
int bottom = distance_get_pixel ( widget->border.bottom, ORIENTATION_VERTICAL );
int left = distance_get_pixel ( widget->border.left, ORIENTATION_HORIZONTAL );
int right = distance_get_pixel ( widget->border.right, ORIENTATION_HORIZONTAL );
int top = distance_get_pixel ( widget->border.top, ORIENTATION_VERTICAL );
int bottom = distance_get_pixel ( widget->border.bottom, ORIENTATION_VERTICAL );
if ( left || top || right || bottom ) {
cairo_save ( d );
rofi_theme_get_color ( widget, "foreground", d );
if ( left > 0 ) {
cairo_set_line_width ( d, left );
distance_get_linestyle ( widget->border.left, d);
cairo_move_to ( d, margin_left + left/2.0, margin_top );
cairo_line_to ( d, margin_left + left/2.0, widget->h-margin_bottom);
distance_get_linestyle ( widget->border.left, d );
cairo_move_to ( d, margin_left + left / 2.0, margin_top );
cairo_line_to ( d, margin_left + left / 2.0, widget->h - margin_bottom );
cairo_stroke ( d );
}
if ( right > 0 ) {
cairo_set_line_width ( d, right );
distance_get_linestyle ( widget->border.right, d);
cairo_move_to ( d, widget->w - margin_right - right/2.0, 0 );
cairo_line_to ( d, widget->w - margin_right - right/2.0, widget->h-margin_bottom );
distance_get_linestyle ( widget->border.right, d );
cairo_move_to ( d, widget->w - margin_right - right / 2.0, 0 );
cairo_line_to ( d, widget->w - margin_right - right / 2.0, widget->h - margin_bottom );
cairo_stroke ( d );
}
if ( top > 0 ) {
cairo_set_line_width ( d, top );
distance_get_linestyle ( widget->border.top, d);
cairo_move_to ( d, margin_left,margin_top+ top/2.0 );
cairo_line_to ( d, widget->w-margin_right, margin_top+top/2.0 );
distance_get_linestyle ( widget->border.top, d );
cairo_move_to ( d, margin_left, margin_top + top / 2.0 );
cairo_line_to ( d, widget->w - margin_right, margin_top + top / 2.0 );
cairo_stroke ( d );
}
if ( bottom > 0 ) {
cairo_set_line_width ( d, bottom );
distance_get_linestyle ( widget->border.bottom, d);
cairo_move_to ( d, margin_left, widget->h-bottom/2.0-margin_bottom);
cairo_line_to ( d, widget->w-margin_right, widget->h-bottom/2.0-margin_bottom);
distance_get_linestyle ( widget->border.bottom, d );
cairo_move_to ( d, margin_left, widget->h - bottom / 2.0 - margin_bottom );
cairo_line_to ( d, widget->w - margin_right, widget->h - bottom / 2.0 - margin_bottom );
cairo_stroke ( d );
}
cairo_restore (d);
cairo_restore ( d );
}
widget->draw ( widget, d );
widget->need_redraw = FALSE;
@ -266,7 +265,7 @@ gboolean widget_motion_notify ( widget *wid, xcb_motion_notify_event_t *xme )
void widget_set_name ( widget *wid, const char *name )
{
if ( wid->name ) {
g_free(wid);
g_free ( wid );
}
wid->name = g_strdup ( name );
}
@ -329,11 +328,9 @@ int widget_padding_get_padding_width ( const widget *wid )
return width;
}
int widget_get_desired_height ( widget *wid )
{
if ( wid && wid->get_desired_height )
{
if ( wid && wid->get_desired_height ) {
return wid->get_desired_height ( wid );
}
return 0;

View File

@ -533,7 +533,7 @@ int take_pointer ( xcb_window_t w, int iters )
}
free ( r );
}
if ( (++i) > iters ){
if ( ( ++i ) > iters ) {
break;
}
usleep ( 1000 );
@ -559,7 +559,7 @@ int take_keyboard ( xcb_window_t w, int iters )
}
free ( r );
}
if ( (++i) > iters ){
if ( ( ++i ) > iters ) {
break;
}
usleep ( 1000 );
@ -646,14 +646,14 @@ gboolean x11_parse_key ( const char *combo, unsigned int *mod, xkb_keysym_t *key
char *mod_key = input_key;
char *error_msg = NULL;
unsigned int modmask = 0;
xkb_keysym_t sym = XKB_KEY_NoSymbol;
xkb_keysym_t sym = XKB_KEY_NoSymbol;
// Test if this works on release.
if ( g_str_has_prefix ( mod_key, "!" ) ) {
++mod_key;
*release = TRUE;
}
char **entries = g_strsplit_set ( mod_key, "+-", -1);
char **entries = g_strsplit_set ( mod_key, "+-", -1 );
for ( int i = 0; entries && entries[i]; i++ ) {
char *entry = entries[i];
// Remove trailing and leading spaces.
@ -704,7 +704,7 @@ gboolean x11_parse_key ( const char *combo, unsigned int *mod, xkb_keysym_t *key
}
g_free ( entry_lowered );
}
g_strfreev(entries);
g_strfreev ( entries );
g_free ( input_key );

View File

@ -81,120 +81,120 @@ typedef struct
* Currently supports string, boolean and number (signed and unsigned).
*/
static XrmOption xrmOptions[] = {
{ xrm_String, "switchers", { .str = &config.modi }, NULL,
{ xrm_String, "switchers", { .str = &config.modi }, NULL,
"", CONFIG_DEFAULT },
{ xrm_String, "modi", { .str = &config.modi }, NULL,
{ xrm_String, "modi", { .str = &config.modi }, NULL,
"Enabled modi", CONFIG_DEFAULT },
{ xrm_SNumber, "width", { .snum = &config.menu_width }, NULL,
{ xrm_SNumber, "width", { .snum = &config.menu_width }, NULL,
"Window width", CONFIG_DEFAULT },
{ xrm_Number, "lines", { .num = &config.menu_lines }, NULL,
{ xrm_Number, "lines", { .num = &config.menu_lines }, NULL,
"Number of lines", CONFIG_DEFAULT },
{ xrm_Number, "columns", { .num = &config.menu_columns }, NULL,
{ xrm_Number, "columns", { .num = &config.menu_columns }, NULL,
"Number of columns", CONFIG_DEFAULT },
{ xrm_String, "font", { .str = &config.menu_font }, NULL,
{ xrm_String, "font", { .str = &config.menu_font }, NULL,
"Font to use", CONFIG_DEFAULT },
{ xrm_String, "color-normal", { .str = &config.color_normal }, NULL,
{ xrm_String, "color-normal", { .str = &config.color_normal }, NULL,
"Color scheme for normal row", CONFIG_DEFAULT },
{ xrm_String, "color-urgent", { .str = &config.color_urgent }, NULL,
{ xrm_String, "color-urgent", { .str = &config.color_urgent }, NULL,
"Color scheme for urgent row", CONFIG_DEFAULT },
{ xrm_String, "color-active", { .str = &config.color_active }, NULL,
{ xrm_String, "color-active", { .str = &config.color_active }, NULL,
"Color scheme for active row", CONFIG_DEFAULT },
{ xrm_String, "color-window", { .str = &config.color_window }, NULL,
{ xrm_String, "color-window", { .str = &config.color_window }, NULL,
"Color scheme window", CONFIG_DEFAULT },
{ xrm_Number, "borderwidth", { .num = &config.menu_bw }, NULL,
{ xrm_Number, "borderwidth", { .num = &config.menu_bw }, NULL,
"", CONFIG_DEFAULT },
{ xrm_Number, "bw", { .num = &config.menu_bw }, NULL,
{ xrm_Number, "bw", { .num = &config.menu_bw }, NULL,
"Border width", CONFIG_DEFAULT },
{ xrm_Number, "location", { .num = &config.location }, NULL,
{ xrm_Number, "location", { .num = &config.location }, NULL,
"Location on screen", CONFIG_DEFAULT },
{ xrm_Number, "padding", { .num = &config.padding }, NULL,
{ xrm_Number, "padding", { .num = &config.padding }, NULL,
"Padding", CONFIG_DEFAULT },
{ xrm_SNumber, "yoffset", { .snum = &config.y_offset }, NULL,
{ xrm_SNumber, "yoffset", { .snum = &config.y_offset }, NULL,
"Y-offset relative to location", CONFIG_DEFAULT },
{ xrm_SNumber, "xoffset", { .snum = &config.x_offset }, NULL,
{ xrm_SNumber, "xoffset", { .snum = &config.x_offset }, NULL,
"X-offset relative to location", CONFIG_DEFAULT },
{ xrm_Boolean, "fixed-num-lines", { .num = &config.fixed_num_lines }, NULL,
{ xrm_Boolean, "fixed-num-lines", { .num = &config.fixed_num_lines }, NULL,
"Always show number of lines", CONFIG_DEFAULT },
{ xrm_String, "terminal", { .str = &config.terminal_emulator }, NULL,
{ xrm_String, "terminal", { .str = &config.terminal_emulator }, NULL,
"Terminal to use", CONFIG_DEFAULT },
{ xrm_String, "ssh-client", { .str = &config.ssh_client }, NULL,
{ xrm_String, "ssh-client", { .str = &config.ssh_client }, NULL,
"Ssh client to use", CONFIG_DEFAULT },
{ xrm_String, "ssh-command", { .str = &config.ssh_command }, NULL,
{ xrm_String, "ssh-command", { .str = &config.ssh_command }, NULL,
"Ssh command to execute", CONFIG_DEFAULT },
{ xrm_String, "run-command", { .str = &config.run_command }, NULL,
{ xrm_String, "run-command", { .str = &config.run_command }, NULL,
"Run command to execute", CONFIG_DEFAULT },
{ xrm_String, "run-list-command", { .str = &config.run_list_command }, NULL,
{ xrm_String, "run-list-command", { .str = &config.run_list_command }, NULL,
"Command to get extra run targets", CONFIG_DEFAULT },
{ xrm_String, "run-shell-command", { .str = &config.run_shell_command }, NULL,
{ xrm_String, "run-shell-command", { .str = &config.run_shell_command }, NULL,
"Run command to execute that runs in shell", CONFIG_DEFAULT },
{ xrm_String, "window-command", { .str = &config.window_command }, NULL,
{ xrm_String, "window-command", { .str = &config.window_command }, NULL,
"Command executed on accep-entry-custom for window modus", CONFIG_DEFAULT },
{ xrm_Boolean, "disable-history", { .num = &config.disable_history }, NULL,
{ xrm_Boolean, "disable-history", { .num = &config.disable_history }, NULL,
"Disable history in run/ssh", CONFIG_DEFAULT },
{ xrm_Boolean, "levenshtein-sort", { .num = &config.levenshtein_sort }, NULL,
{ xrm_Boolean, "levenshtein-sort", { .num = &config.levenshtein_sort }, NULL,
"Use levenshtein sorting", CONFIG_DEFAULT },
{ xrm_Boolean, "case-sensitive", { .num = &config.case_sensitive }, NULL,
{ xrm_Boolean, "case-sensitive", { .num = &config.case_sensitive }, NULL,
"Set case-sensitivity", CONFIG_DEFAULT },
{ xrm_Boolean, "cycle", { .num = &config.cycle }, NULL,
{ xrm_Boolean, "cycle", { .num = &config.cycle }, NULL,
"Cycle through the results list", CONFIG_DEFAULT },
{ xrm_Boolean, "sidebar-mode", { .num = &config.sidebar_mode }, NULL,
{ xrm_Boolean, "sidebar-mode", { .num = &config.sidebar_mode }, NULL,
"Enable sidebar-mode", CONFIG_DEFAULT },
{ xrm_SNumber, "eh", { .snum = &config.element_height }, NULL,
{ xrm_SNumber, "eh", { .snum = &config.element_height }, NULL,
"Row height (in chars)", CONFIG_DEFAULT },
{ xrm_Boolean, "auto-select", { .num = &config.auto_select }, NULL,
{ xrm_Boolean, "auto-select", { .num = &config.auto_select }, NULL,
"Enable auto select mode", CONFIG_DEFAULT },
{ xrm_Boolean, "parse-hosts", { .num = &config.parse_hosts }, NULL,
{ xrm_Boolean, "parse-hosts", { .num = &config.parse_hosts }, NULL,
"Parse hosts file for ssh mode", CONFIG_DEFAULT },
{ xrm_Boolean, "parse-known-hosts", { .num = &config.parse_known_hosts }, NULL,
{ xrm_Boolean, "parse-known-hosts", { .num = &config.parse_known_hosts }, NULL,
"Parse known_hosts file for ssh mode", CONFIG_DEFAULT },
{ xrm_String, "combi-modi", { .str = &config.combi_modi }, NULL,
{ xrm_String, "combi-modi", { .str = &config.combi_modi }, NULL,
"Set the modi to combine in combi mode", CONFIG_DEFAULT },
{ xrm_String, "matching", { .str = &config.matching }, NULL,
{ xrm_String, "matching", { .str = &config.matching }, NULL,
"Set the matching algorithm. (normal, regex, glob, fuzzy)", CONFIG_DEFAULT },
{ xrm_Boolean, "tokenize", { .num = &config.tokenize }, NULL,
{ xrm_Boolean, "tokenize", { .num = &config.tokenize }, NULL,
"Tokenize input string", CONFIG_DEFAULT },
{ xrm_String, "monitor", { .str = &config.monitor }, NULL,
{ xrm_String, "monitor", { .str = &config.monitor }, NULL,
"", CONFIG_DEFAULT },
/* Alias for dmenu compatibility. */
{ xrm_String, "m", { .str = &config.monitor }, NULL,
{ xrm_String, "m", { .str = &config.monitor }, NULL,
"Monitor id to show on", CONFIG_DEFAULT },
{ xrm_Number, "line-margin", { .num = &config.line_margin }, NULL,
{ xrm_Number, "line-margin", { .num = &config.line_margin }, NULL,
"Margin between rows", CONFIG_DEFAULT },
{ xrm_Number, "line-padding", { .num = &config.line_padding }, NULL,
{ xrm_Number, "line-padding", { .num = &config.line_padding }, NULL,
"Padding within rows", CONFIG_DEFAULT },
{ xrm_String, "filter", { .str = &config.filter }, NULL,
{ xrm_String, "filter", { .str = &config.filter }, NULL,
"Pre-set filter", CONFIG_DEFAULT },
{ xrm_String, "separator-style", { .str = &config.separator_style }, NULL,
{ xrm_String, "separator-style", { .str = &config.separator_style }, NULL,
"Separator style (none, dash, solid)", CONFIG_DEFAULT },
{ xrm_Boolean, "hide-scrollbar", { .num = &config.hide_scrollbar }, NULL,
{ xrm_Boolean, "hide-scrollbar", { .num = &config.hide_scrollbar }, NULL,
"Hide scroll-bar", CONFIG_DEFAULT },
{ xrm_Boolean, "fullscreen", { .num = &config.fullscreen }, NULL,
{ xrm_Boolean, "fullscreen", { .num = &config.fullscreen }, NULL,
"Fullscreen", CONFIG_DEFAULT },
{ xrm_Boolean, "fake-transparency", { .num = &config.fake_transparency }, NULL,
{ xrm_Boolean, "fake-transparency", { .num = &config.fake_transparency }, NULL,
"Fake transparency", CONFIG_DEFAULT },
{ xrm_SNumber, "dpi", { .snum = &config.dpi }, NULL,
{ xrm_SNumber, "dpi", { .snum = &config.dpi }, NULL,
"DPI", CONFIG_DEFAULT },
{ xrm_Number, "threads", { .num = &config.threads }, NULL,
{ xrm_Number, "threads", { .num = &config.threads }, NULL,
"Threads to use for string matching", CONFIG_DEFAULT },
{ xrm_Number, "scrollbar-width", { .num = &config.scrollbar_width }, NULL,
{ xrm_Number, "scrollbar-width", { .num = &config.scrollbar_width }, NULL,
"Scrollbar width", CONFIG_DEFAULT },
{ xrm_Number, "scroll-method", { .num = &config.scroll_method }, NULL,
{ xrm_Number, "scroll-method", { .num = &config.scroll_method }, NULL,
"Scrolling method. (0: Page, 1: Centered)", CONFIG_DEFAULT },
{ xrm_String, "fake-background", { .str = &config.fake_background }, NULL,
{ xrm_String, "fake-background", { .str = &config.fake_background }, NULL,
"Background to use for fake transparency. (background or screenshot)", CONFIG_DEFAULT },
{ xrm_String, "window-format", { .str = &config.window_format }, NULL,
{ xrm_String, "window-format", { .str = &config.window_format }, NULL,
"Window Format. w (desktop name), t (title), n (name), r (role), c (class)", CONFIG_DEFAULT },
{ xrm_Boolean, "click-to-exit", { .snum = &config.click_to_exit }, NULL,
{ xrm_Boolean, "click-to-exit", { .snum = &config.click_to_exit }, NULL,
"Click outside the window to exit", CONFIG_DEFAULT },
{ xrm_Boolean, "show-match", { .snum = &config.show_match }, NULL,
{ xrm_Boolean, "show-match", { .snum = &config.show_match }, NULL,
"Indicate how it match by underlining it.", CONFIG_DEFAULT },
{ xrm_String, "theme", { .str = &config.theme }, NULL,
{ xrm_String, "theme", { .str = &config.theme }, NULL,
"New style theme file", CONFIG_DEFAULT },
};