Merge branch 'master' of github:DaveDavenport/rofi

This commit is contained in:
Dave Davenport 2016-01-04 20:56:54 +01:00
commit fefd992c11
11 changed files with 139 additions and 39 deletions

View file

@ -3,6 +3,10 @@
- Have separate config file.
Bug fixes:
- Fix subpixel rendering. (#303)
- Fix basic tests on OpenBSD (#272)
- Fix wrong use of memcpy (thx to Jasperia).
- Work around for sigwaitinfo on OpenBSD.
0.15.12:
New features:
- Initial `-dump` command for dmenu mode. (#216)

View file

@ -191,7 +191,7 @@ test-x: ${bin_PROGRAMS}
echo "Test daemon"
$(top_srcdir)/test/run_test.sh 211 $(top_srcdir)/test/run_daemon_test.sh $(top_builddir)
echo "Test xr dump"
$(top_srcdir)/test/run_test.sh 212 $(top_srcdir)/test/xr_dump_test.sh $(top_builddir) $(top_srcdir)
$(top_srcdir)/test/run_test.sh 212 $(top_srcdir)/test/xr_dump_test.sh $(top_builddir) $(top_srcdir)
echo "Test drun"
$(top_srcdir)/test/run_test.sh 213 $(top_srcdir)/test/run_drun_test.sh $(top_builddir)
echo "Test combi"
@ -200,10 +200,14 @@ test-x: ${bin_PROGRAMS}
$(top_srcdir)/test/run_test.sh 215 $(top_srcdir)/test/run_regex_test.sh $(top_builddir)
echo "Test dmenu glob"
$(top_srcdir)/test/run_test.sh 216 $(top_srcdir)/test/run_glob_test.sh $(top_builddir)
echo "Test dmenu fuzzy"
$(top_srcdir)/test/run_test.sh 217 $(top_srcdir)/test/run_fuzzy_test.sh $(top_builddir)
echo "Test config dump"
$(top_srcdir)/test/run_test.sh 217 $(top_srcdir)/test/xr_config_test.sh $(top_builddir) $(top_srcdir)
$(top_srcdir)/test/run_test.sh 218 $(top_srcdir)/test/xr_config_test.sh $(top_builddir) $(top_srcdir)
echo "Test dmenu-normal-window"
$(top_srcdir)/test/run_test.sh 219 $(top_srcdir)/test/run_dmenu_normal_window_test.sh $(top_builddir)
echo "Test window"
$(top_srcdir)/test/run_test.sh 217 $(top_srcdir)/test/run_window_test.sh $(top_builddir) $(top_srcdir)
$(top_srcdir)/test/run_test.sh 220 $(top_srcdir)/test/run_window_test.sh $(top_builddir) $(top_srcdir)
echo "End tests"

View file

@ -154,4 +154,5 @@ void cmd_set_arguments ( int argc, char **argv );
* @returns path
*/
char *rofi_expand_path ( const char *input );
unsigned int levenshtein ( const char *needle, const char *haystack );
#endif // ROFI_HELPER_H

View file

@ -32,14 +32,14 @@ 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_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,
} TextboxFlags;
typedef enum

View file

@ -38,6 +38,10 @@ void config_parse_cmd_options_dynamic ( void );
void config_parse_xresource_options_dynamic ( Display *display );
void config_parse_xresource_options_dynamic_file ( const char *filename );
/**
* Initializes the Xresourced system.
*/
void config_parse_xresource_init ( void );
/**
* Free any allocated memory.
*/

View file

@ -624,3 +624,36 @@ char *rofi_expand_path ( const char *input )
g_strfreev ( str );
return retv;
}
#define MIN3( a, b, c ) ( ( a ) < ( b ) ? ( ( a ) < ( c ) ? ( a ) : ( c ) ) : ( ( b ) < ( c ) ? ( b ) : ( c ) ) )
unsigned int levenshtein ( const char *needle, const char *haystack )
{
unsigned int x, y, lastdiag, olddiag;
size_t needlelen = g_utf8_strlen ( needle, -1 );
size_t haystacklen = g_utf8_strlen ( haystack, -1 );
unsigned int column[needlelen + 1];
for ( y = 0; y <= needlelen; y++ ) {
column[y] = y;
}
for ( x = 1; x <= haystacklen; x++ ) {
const char *needles = needle;
column[0] = x;
gunichar haystackc = g_utf8_get_char ( haystack );
if ( !config.case_sensitive ) {
haystackc = g_unichar_tolower ( haystackc );
}
for ( y = 1, lastdiag = x - 1; y <= needlelen; y++ ) {
gunichar needlec = g_utf8_get_char ( needles );
if ( !config.case_sensitive ) {
needlec = g_unichar_tolower ( needlec );
}
olddiag = column[y];
column[y] = MIN3 ( column[y] + 1, column[y - 1] + 1, lastdiag + ( needlec == haystackc ? 0 : 1 ) );
lastdiag = olddiag;
needles = g_utf8_next_char ( needles );
}
haystack = g_utf8_next_char ( haystack );
}
return column[needlelen];
}

View file

@ -173,28 +173,6 @@ static int lev_sort ( const void *p1, const void *p2, void *arg )
return distances[*a] - distances[*b];
}
#define MIN3( a, b, c ) ( ( a ) < ( b ) ? ( ( a ) < ( c ) ? ( a ) : ( c ) ) : ( ( b ) < ( c ) ? ( b ) : ( c ) ) )
static unsigned int levenshtein ( const char *s1, const char *s2 )
{
unsigned int x, y, lastdiag, olddiag;
size_t s1len = strlen ( s1 );
size_t s2len = strlen ( s2 );
unsigned int column[s1len + 1];
for ( y = 0; y <= s1len; y++ ) {
column[y] = y;
}
for ( x = 1; x <= s2len; x++ ) {
column[0] = x;
for ( y = 1, lastdiag = x - 1; y <= s1len; y++ ) {
olddiag = column[y];
column[y] = MIN3 ( column[y] + 1, column[y - 1] + 1, lastdiag + ( s1[y - 1] == s2[x - 1] ? 0 : 1 ) );
lastdiag = olddiag;
}
}
return column[s1len];
}
// State of the menu.
typedef struct MenuState
@ -861,7 +839,13 @@ static void filter_elements ( thread_state *t, G_GNUC_UNUSED gpointer user_data
t->state->line_map[t->start + t->count] = i;
if ( config.levenshtein_sort ) {
// This is inefficient, need to fix it.
char * str = t->state->sw->mgrv ( t->state->sw, i, &st, TRUE );
char * str = NULL;
if ( t->state->sw->get_completion ) {
str = t->state->sw->get_completion ( t->state->sw, i );
}
else{
str = t->state->sw->mgrv ( t->state->sw, i, &st, TRUE );
}
t->state->distance[i] = levenshtein ( t->state->text->text, str );
g_free ( str );
}
@ -2473,6 +2457,10 @@ int main ( int argc, char *argv[] )
sncontext = sn_launchee_context_new_from_environment ( sndisplay, DefaultScreen ( display ) );
}
TICK_N ( "Startup Notification" );
// Initialize Xresources subsystem.
config_parse_xresource_init ();
TICK_N ( "Initialize Xresources system" );
// Setup keybinding
setup_abe ();
TICK_N ( "Setup abe" );

View file

@ -221,7 +221,6 @@ void config_parse_xresource_options ( Display *display )
{
char *xRMS;
// Map Xresource entries to rofi config options.
XrmInitialize ();
xRMS = XResourceManagerString ( display );
if ( xRMS == NULL ) {
@ -237,7 +236,6 @@ void config_parse_xresource_options_file ( const char *filename )
return;
}
// Map Xresource entries to rofi config options.
XrmInitialize ();
XrmDatabase xDB = XrmGetFileDatabase ( filename );
if ( xDB == NULL ) {
return;
@ -331,7 +329,6 @@ void config_parse_xresource_options_dynamic ( Display *display )
{
char *xRMS;
// Map Xresource entries to rofi config options.
XrmInitialize ();
xRMS = XResourceManagerString ( display );
if ( xRMS == NULL ) {
@ -347,7 +344,6 @@ void config_parse_xresource_options_dynamic_file ( const char *filename )
return;
}
// Map Xresource entries to rofi config options.
XrmInitialize ();
XrmDatabase xDB = XrmGetFileDatabase ( filename );
if ( xDB == NULL ) {
return;
@ -568,3 +564,8 @@ void print_xresources_theme ( void )
}
}
}
void config_parse_xresource_init ( void )
{
XrmInitialize ();
}

View file

@ -7,10 +7,18 @@
static int test = 0;
#define TASSERT( a ) { \
#define TASSERT( a ) { \
assert ( a ); \
printf ( "Test %i passed (%s)\n", ++test, # a ); \
}
#define TASSERTE( a, b ) { \
if ( ( a ) == ( b ) ) { \
printf ( "Test %i passed (%s == %s) (%u == %u)\n", ++test, # a, # b, a, b ); \
}else { \
printf ( "Test %i failed (%s == %s) (%u != %u)\n", ++test, # a, # b, a, b ); \
abort ( ); \
} \
}
void error_dialog ( const char *msg, G_GNUC_UNUSED int markup )
{
@ -127,4 +135,13 @@ int main ( int argc, char ** argv )
TASSERT ( retv[2] && strcmp ( retv[2], "bEp" ) == 0 );
TASSERT ( retv[3] && strcmp ( retv[3], "bEE" ) == 0 );
tokenize_free ( retv );
TASSERT ( levenshtein ( "aap", "aap" ) == 0 );
TASSERT ( levenshtein ( "aap", "aap " ) == 1 );
TASSERT ( levenshtein ( "aap ", "aap" ) == 1 );
TASSERTE ( levenshtein ( "aap", "aap noot" ), 5 );
TASSERTE ( levenshtein ( "aap", "noot aap" ), 5 );
TASSERTE ( levenshtein ( "aap", "noot aap mies" ), 10 );
TASSERTE ( levenshtein ( "noot aap mies", "aap" ), 10 );
TASSERTE ( levenshtein ( "otp", "noot aap" ), 5 );
}

View file

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# wait till it is up, run rofi with error message
sleep 1;
echo -e -n "aap\nnoot\nmies" | rofi -dmenu -normal-window > output.txt &
RPID=$!
sleep 4
xdotool getactivewindow windowsize 100% 100%
# send enter.
sleep 1
xdotool key 'Down'
sleep 0.4
xdotool key Shift+Return
xdotool key Return
# Get result, kill xvfb
wait ${RPID}
RETV=$?
OUTPUT=$(cat output.txt | tr '\n' ' ')
if [ "${OUTPUT}" != 'noot mies ' ]
then
echo "Got: '${OUTPUT}' expected 'noot mies '"
exit 1
fi
echo ${RETV}
exit ${RETV}

22
test/run_fuzzy_test.sh Executable file
View file

@ -0,0 +1,22 @@
#!/usr/bin/env bash
echo -en "nooty\naap\nnoot\nmies" | rofi -fuzzy -dmenu > output.txt &
RPID=$!
# send enter.
sleep 5;
xdotool type 'nty'
sleep 0.4
xdotool key Return
# Get result, kill xvfb
wait ${RPID}
RETV=$?
OUTPUT=$(cat output.txt)
if [ "${OUTPUT}" != 'nooty' ]
then
echo "Got: '${OUTPUT}' expected 'nooty'"
exit 1
fi
exit ${RETV}