// retrieve a text property from a window // technically we could use window_get_prop(), but this is better for character set support char* window_get_text_prop ( xcb_window_t w, xcb_atom_t atom ) { xcb_get_property_cookie_t c = xcb_get_property ( xcb->connection, 0, w, atom, XCB_GET_PROPERTY_TYPE_ANY, 0, UINT_MAX ); xcb_get_property_reply_t *r = xcb_get_property_reply ( xcb->connection, c, NULL ); if ( r ) { if ( xcb_get_property_value_length ( r ) > 0 ) { char *str = NULL; if ( r->type == netatoms[UTF8_STRING] ) { str = g_strndup ( xcb_get_property_value ( r ), xcb_get_property_value_length ( r ) ); } else if ( r->type == netatoms[STRING] ) { str = rofi_latin_to_utf8_strdup ( xcb_get_property_value ( r ), xcb_get_property_value_length ( r ) ); } else { str = g_strdup ( "Invalid encoding." ); } free ( r ); return str; } free ( r ); } return NULL; }
int main ( int argc, char ** argv ) { cmd_set_arguments ( argc, argv ); if ( setlocale ( LC_ALL, "" ) == NULL ) { fprintf ( stderr, "Failed to set locale.\n" ); return EXIT_FAILURE; } /** * Char function */ TASSERT ( helper_parse_char ( "\\n" ) == '\n' ); TASSERT ( helper_parse_char ( "\\a" ) == '\a' ); TASSERT ( helper_parse_char ( "\\b" ) == '\b' ); TASSERT ( helper_parse_char ( "\\t" ) == '\t' ); TASSERT ( helper_parse_char ( "\\v" ) == '\v' ); TASSERT ( helper_parse_char ( "\\f" ) == '\f' ); TASSERT ( helper_parse_char ( "\\r" ) == '\r' ); TASSERT ( helper_parse_char ( "\\\\" ) == '\\' ); TASSERT ( helper_parse_char ( "\\0" ) == 0 ); TASSERT ( helper_parse_char ( "\\x77" ) == 'w' ); TASSERT ( helper_parse_char ( "\\x0A" ) == '\n' ); /** * tokenize */ TASSERT ( levenshtein ( "aap", g_utf8_strlen ( "aap", -1), "aap", g_utf8_strlen ( "aap", -1) ) == 0 ); TASSERT ( levenshtein ( "aap", g_utf8_strlen ( "aap", -1), "aap ", g_utf8_strlen ( "aap ", -1) ) == 1 ); TASSERT ( levenshtein ( "aap ", g_utf8_strlen ( "aap ", -1), "aap", g_utf8_strlen ( "aap", -1) ) == 1 ); TASSERTE ( levenshtein ( "aap", g_utf8_strlen ( "aap", -1), "aap noot", g_utf8_strlen ( "aap noot", -1) ), 5 ); TASSERTE ( levenshtein ( "aap", g_utf8_strlen ( "aap", -1), "noot aap", g_utf8_strlen ( "noot aap", -1) ), 5 ); TASSERTE ( levenshtein ( "aap", g_utf8_strlen ( "aap", -1), "noot aap mies", g_utf8_strlen ( "noot aap mies", -1) ), 10 ); TASSERTE ( levenshtein ( "noot aap mies", g_utf8_strlen ( "noot aap mies", -1), "aap", g_utf8_strlen ( "aap", -1) ), 10 ); TASSERTE ( levenshtein ( "otp", g_utf8_strlen ( "otp", -1), "noot aap", g_utf8_strlen ( "noot aap", -1) ), 5 ); /** * Quick converision check. */ { char *str = rofi_latin_to_utf8_strdup ( "\xA1\xB5", 2 ); TASSERT ( g_utf8_collate ( str, "¡µ" ) == 0 ); g_free ( str ); } { char *str = rofi_force_utf8 ( "Valid utf8", 10 ); TASSERT ( g_utf8_collate ( str, "Valid utf8" ) == 0 ); g_free ( str ); char in[] = "Valid utf8 until \xc3\x28 we continue here"; TASSERT ( g_utf8_validate ( in, -1, NULL ) == FALSE ); str = rofi_force_utf8 ( in, strlen ( in ) ); TASSERT ( g_utf8_validate ( str, -1, NULL ) == TRUE ); TASSERT ( g_utf8_collate ( str, "Valid utf8 until �( we continue here" ) == 0 ); g_free ( str ); } // Pid test. // Tests basic functionality of writing it, locking, seeing if I can write same again // And close/reopen it again. { const char *path = "/tmp/rofi-test.pid"; TASSERT ( create_pid_file ( NULL ) == -1 ); int fd = create_pid_file ( path ); TASSERT ( fd >= 0 ); int fd2 = create_pid_file ( path ); TASSERT ( fd2 < 0 ); remove_pid_file ( fd ); fd = create_pid_file ( path ); TASSERT ( fd >= 0 ); remove_pid_file ( fd ); } }