mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Merge branch 'master' into clear
This commit is contained in:
commit
5ed04ac505
@ -1,9 +1,11 @@
|
|||||||
|
dist: trusty
|
||||||
|
sudo: required
|
||||||
language: c
|
language: c
|
||||||
install:
|
install:
|
||||||
- lsb_release -a
|
- lsb_release -a
|
||||||
- uname -a
|
- uname -a
|
||||||
- sudo apt-get update
|
- sudo apt-get update
|
||||||
- sudo apt-get -y install libssl-dev libexpat1-dev libncursesw5-dev libglib2.0-dev libnotify-dev libcurl3-dev libxss-dev libotr2-dev libgpgme11-dev autoconf-archive expect-dev tcl-dev libtool python-dev
|
- sudo apt-get -y install libssl-dev libexpat1-dev libncursesw5-dev libglib2.0-dev libnotify-dev libcurl3-dev libxss-dev libotr5-dev libgpgme11-dev autoconf-archive expect-dev tcl-dev libtool python-dev libgtk2.0-dev
|
||||||
- git clone git://github.com/boothj5/libmesode.git
|
- git clone git://github.com/boothj5/libmesode.git
|
||||||
- cd libmesode
|
- cd libmesode
|
||||||
- mkdir m4
|
- mkdir m4
|
||||||
|
@ -159,8 +159,8 @@ AS_IF([test "x$ncurses_cv_wget_wch" != xyes],
|
|||||||
[AC_MSG_ERROR([ncurses does not support wide characters])])
|
[AC_MSG_ERROR([ncurses does not support wide characters])])
|
||||||
|
|
||||||
### Check for other profanity dependencies
|
### Check for other profanity dependencies
|
||||||
PKG_CHECK_MODULES([glib], [glib-2.0 >= 2.26], [],
|
PKG_CHECK_MODULES([glib], [glib-2.0 >= 2.40], [],
|
||||||
[AC_MSG_ERROR([glib 2.26 or higher is required for profanity])])
|
[AC_MSG_ERROR([glib 2.40 or higher is required for profanity])])
|
||||||
PKG_CHECK_MODULES([curl], [libcurl], [],
|
PKG_CHECK_MODULES([curl], [libcurl], [],
|
||||||
[AC_CHECK_LIB([curl], [main], [],
|
[AC_CHECK_LIB([curl], [main], [],
|
||||||
[AC_MSG_ERROR([libcurl is required for profanity])])])
|
[AC_MSG_ERROR([libcurl is required for profanity])])])
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
void cmd_ac_init(void);
|
void cmd_ac_init(void);
|
||||||
void cmd_ac_uninit(void);
|
void cmd_ac_uninit(void);
|
||||||
char* cmd_ac_complete(ProfWin *window, const char *const input);
|
char* cmd_ac_complete(ProfWin *window, const char *const input, gboolean previous);
|
||||||
void cmd_ac_reset(ProfWin *window);
|
void cmd_ac_reset(ProfWin *window);
|
||||||
gboolean cmd_ac_exists(char *cmd);
|
gboolean cmd_ac_exists(char *cmd);
|
||||||
|
|
||||||
@ -57,6 +57,6 @@ void cmd_ac_remove_alias_value(char *value);
|
|||||||
void cmd_ac_add_form_fields(DataForm *form);
|
void cmd_ac_add_form_fields(DataForm *form);
|
||||||
void cmd_ac_remove_form_fields(DataForm *form);
|
void cmd_ac_remove_form_fields(DataForm *form);
|
||||||
|
|
||||||
char* cmd_ac_complete_filepath(const char *const input, char *const startstr);
|
char* cmd_ac_complete_filepath(const char *const input, char *const startstr, gboolean previous);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -113,12 +113,12 @@ static gboolean _cmd_has_tag(Command *pcmd, const char *const tag);
|
|||||||
static struct cmd_t command_defs[] =
|
static struct cmd_t command_defs[] =
|
||||||
{
|
{
|
||||||
{ "/help",
|
{ "/help",
|
||||||
parse_args, 0, 2, NULL,
|
parse_args_with_freetext, 0, 2, NULL,
|
||||||
CMD_NOSUBFUNCS
|
CMD_NOSUBFUNCS
|
||||||
CMD_MAINFUNC(cmd_help)
|
CMD_MAINFUNC(cmd_help)
|
||||||
CMD_NOTAGS
|
CMD_NOTAGS
|
||||||
CMD_SYN(
|
CMD_SYN(
|
||||||
"/help [<area>|<command>]")
|
"/help [<area>|<command>|search_all|search_any] [<search_terms>]")
|
||||||
CMD_DESC(
|
CMD_DESC(
|
||||||
"Help on using Profanity. Passing no arguments list help areas. "
|
"Help on using Profanity. Passing no arguments list help areas. "
|
||||||
"For command help, optional arguments are shown using square brackets, "
|
"For command help, optional arguments are shown using square brackets, "
|
||||||
@ -126,9 +126,12 @@ static struct cmd_t command_defs[] =
|
|||||||
"Arguments that may be one of a number of values are separated by a pipe "
|
"Arguments that may be one of a number of values are separated by a pipe "
|
||||||
"e.g. val1|val2|val3.")
|
"e.g. val1|val2|val3.")
|
||||||
CMD_ARGS(
|
CMD_ARGS(
|
||||||
{ "<area>", "Summary help for commands in a certain area of functionality." },
|
{ "<area>", "Summary help for commands in a certain area of functionality." },
|
||||||
{ "<command>", "Full help for a specific command, for example '/help connect'." })
|
{ "<command>", "Full help for a specific command, for example '/help connect'." },
|
||||||
|
{ "search_all <search_terms>", "Search commands for returning matches that contain all of the search terms." },
|
||||||
|
{ "search_any <search_terms>", "Search commands for returning matches that contain any of the search terms." })
|
||||||
CMD_EXAMPLES(
|
CMD_EXAMPLES(
|
||||||
|
"/help search_all presence online",
|
||||||
"/help commands",
|
"/help commands",
|
||||||
"/help presence",
|
"/help presence",
|
||||||
"/help who")
|
"/help who")
|
||||||
@ -576,7 +579,7 @@ static struct cmd_t command_defs[] =
|
|||||||
CMD_SYN(
|
CMD_SYN(
|
||||||
"/leave")
|
"/leave")
|
||||||
CMD_DESC(
|
CMD_DESC(
|
||||||
"Leave the current chat room.")
|
"Leave the current chat or room.")
|
||||||
CMD_NOARGS
|
CMD_NOARGS
|
||||||
CMD_NOEXAMPLES
|
CMD_NOEXAMPLES
|
||||||
},
|
},
|
||||||
@ -2264,9 +2267,112 @@ static struct cmd_t command_defs[] =
|
|||||||
CMD_EXAMPLES(
|
CMD_EXAMPLES(
|
||||||
"/export /path/to/output.csv",
|
"/export /path/to/output.csv",
|
||||||
"/export ~/contacts.csv")
|
"/export ~/contacts.csv")
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static GHashTable *search_index;
|
||||||
|
|
||||||
|
char*
|
||||||
|
_cmd_index(Command *cmd) {
|
||||||
|
GString *index_source = g_string_new("");
|
||||||
|
index_source = g_string_append(index_source, cmd->cmd);
|
||||||
|
index_source = g_string_append(index_source, " ");
|
||||||
|
index_source = g_string_append(index_source, cmd->help.desc);
|
||||||
|
index_source = g_string_append(index_source, " ");
|
||||||
|
|
||||||
|
int len = g_strv_length(cmd->help.tags);
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
index_source = g_string_append(index_source, cmd->help.tags[i]);
|
||||||
|
index_source = g_string_append(index_source, " ");
|
||||||
|
}
|
||||||
|
len = g_strv_length(cmd->help.synopsis);
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
index_source = g_string_append(index_source, cmd->help.synopsis[i]);
|
||||||
|
index_source = g_string_append(index_source, " ");
|
||||||
|
}
|
||||||
|
for (i = 0; cmd->help.args[i][0] != NULL; i++) {
|
||||||
|
index_source = g_string_append(index_source, cmd->help.args[i][0]);
|
||||||
|
index_source = g_string_append(index_source, " ");
|
||||||
|
index_source = g_string_append(index_source, cmd->help.args[i][1]);
|
||||||
|
index_source = g_string_append(index_source, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
gchar **tokens = g_str_tokenize_and_fold(index_source->str, NULL, NULL);
|
||||||
|
g_string_free(index_source, TRUE);
|
||||||
|
|
||||||
|
GString *index = g_string_new("");
|
||||||
|
i = 0;
|
||||||
|
for (i = 0; i < g_strv_length(tokens); i++) {
|
||||||
|
index = g_string_append(index, tokens[i]);
|
||||||
|
index = g_string_append(index, " ");
|
||||||
|
}
|
||||||
|
g_strfreev(tokens);
|
||||||
|
|
||||||
|
char *res = index->str;
|
||||||
|
g_string_free(index, FALSE);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
GList*
|
||||||
|
cmd_search_index_any(char *term)
|
||||||
|
{
|
||||||
|
GList *results = NULL;
|
||||||
|
|
||||||
|
gchar **processed_terms = g_str_tokenize_and_fold(term, NULL, NULL);
|
||||||
|
int terms_len = g_strv_length(processed_terms);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < terms_len; i++) {
|
||||||
|
GList *index_keys = g_hash_table_get_keys(search_index);
|
||||||
|
GList *curr = index_keys;
|
||||||
|
while (curr) {
|
||||||
|
char *index_entry = g_hash_table_lookup(search_index, curr->data);
|
||||||
|
if (g_str_match_string(processed_terms[i], index_entry, FALSE)) {
|
||||||
|
results = g_list_append(results, curr->data);
|
||||||
|
}
|
||||||
|
curr = g_list_next(curr);
|
||||||
|
}
|
||||||
|
g_list_free(index_keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev(processed_terms);
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
GList*
|
||||||
|
cmd_search_index_all(char *term)
|
||||||
|
{
|
||||||
|
GList *results = NULL;
|
||||||
|
|
||||||
|
gchar **terms = g_str_tokenize_and_fold(term, NULL, NULL);
|
||||||
|
int terms_len = g_strv_length(terms);
|
||||||
|
|
||||||
|
GList *commands = g_hash_table_get_keys(search_index);
|
||||||
|
GList *curr = commands;
|
||||||
|
while (curr) {
|
||||||
|
char *command = curr->data;
|
||||||
|
int matches = 0;
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < terms_len; i++) {
|
||||||
|
char *command_index = g_hash_table_lookup(search_index, command);
|
||||||
|
if (g_str_match_string(terms[i], command_index, FALSE)) {
|
||||||
|
matches++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matches == terms_len) {
|
||||||
|
results = g_list_append(results, command);
|
||||||
|
}
|
||||||
|
curr = g_list_next(curr);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_list_free(commands);
|
||||||
|
g_strfreev(terms);
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise command autocompleter and history
|
* Initialise command autocompleter and history
|
||||||
@ -2278,6 +2384,8 @@ cmd_init(void)
|
|||||||
|
|
||||||
cmd_ac_init();
|
cmd_ac_init();
|
||||||
|
|
||||||
|
search_index = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
|
||||||
|
|
||||||
// load command defs into hash table
|
// load command defs into hash table
|
||||||
commands = g_hash_table_new(g_str_hash, g_str_equal);
|
commands = g_hash_table_new(g_str_hash, g_str_equal);
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -2287,6 +2395,9 @@ cmd_init(void)
|
|||||||
// add to hash
|
// add to hash
|
||||||
g_hash_table_insert(commands, pcmd->cmd, pcmd);
|
g_hash_table_insert(commands, pcmd->cmd, pcmd);
|
||||||
|
|
||||||
|
// add to search index
|
||||||
|
g_hash_table_insert(search_index, strdup(pcmd->cmd), strdup(_cmd_index(pcmd)));
|
||||||
|
|
||||||
// add to commands and help autocompleters
|
// add to commands and help autocompleters
|
||||||
cmd_ac_add_cmd(pcmd);
|
cmd_ac_add_cmd(pcmd);
|
||||||
}
|
}
|
||||||
@ -2306,6 +2417,7 @@ void
|
|||||||
cmd_uninit(void)
|
cmd_uninit(void)
|
||||||
{
|
{
|
||||||
cmd_ac_uninit();
|
cmd_ac_uninit();
|
||||||
|
g_hash_table_destroy(search_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -49,4 +49,7 @@ gboolean cmd_valid_tag(const char *const str);
|
|||||||
|
|
||||||
void command_docgen(void);
|
void command_docgen(void);
|
||||||
|
|
||||||
|
GList* cmd_search_index_all(char *term);
|
||||||
|
GList* cmd_search_index_any(char *term);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1484,6 +1484,41 @@ cmd_win(ProfWin *window, const char *const command, gchar **args)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cmd_list_commands(GList *commands) {
|
||||||
|
int maxlen = 0;
|
||||||
|
GList *curr = commands;
|
||||||
|
while (curr) {
|
||||||
|
gchar *cmd = curr->data;
|
||||||
|
int len = strlen(cmd);
|
||||||
|
if (len > maxlen) maxlen = len;
|
||||||
|
curr = g_list_next(curr);
|
||||||
|
}
|
||||||
|
|
||||||
|
GString *cmds = g_string_new("");
|
||||||
|
curr = commands;
|
||||||
|
int count = 0;
|
||||||
|
while (curr) {
|
||||||
|
gchar *cmd = curr->data;
|
||||||
|
if (count == 5) {
|
||||||
|
cons_show(cmds->str);
|
||||||
|
g_string_free(cmds, TRUE);
|
||||||
|
cmds = g_string_new("");
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
g_string_append_printf(cmds, "%-*s", maxlen + 1, cmd);
|
||||||
|
curr = g_list_next(curr);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
cons_show(cmds->str);
|
||||||
|
g_string_free(cmds, TRUE);
|
||||||
|
g_list_free(curr);
|
||||||
|
|
||||||
|
cons_show("");
|
||||||
|
cons_show("Use /help [command] without the leading slash, for help on a specific command");
|
||||||
|
cons_show("");
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_cmd_help_cmd_list(const char *const tag)
|
_cmd_help_cmd_list(const char *const tag)
|
||||||
{
|
{
|
||||||
@ -1520,38 +1555,8 @@ _cmd_help_cmd_list(const char *const tag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int maxlen = 0;
|
_cmd_list_commands(ordered_commands);
|
||||||
GList *curr = ordered_commands;
|
|
||||||
while (curr) {
|
|
||||||
gchar *cmd = curr->data;
|
|
||||||
int len = strlen(cmd);
|
|
||||||
if (len > maxlen) maxlen = len;
|
|
||||||
curr = g_list_next(curr);
|
|
||||||
}
|
|
||||||
|
|
||||||
GString *cmds = g_string_new("");
|
|
||||||
curr = ordered_commands;
|
|
||||||
int count = 0;
|
|
||||||
while (curr) {
|
|
||||||
gchar *cmd = curr->data;
|
|
||||||
if (count == 5) {
|
|
||||||
cons_show(cmds->str);
|
|
||||||
g_string_free(cmds, TRUE);
|
|
||||||
cmds = g_string_new("");
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
g_string_append_printf(cmds, "%-*s", maxlen + 1, cmd);
|
|
||||||
curr = g_list_next(curr);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
cons_show(cmds->str);
|
|
||||||
g_string_free(cmds, TRUE);
|
|
||||||
g_list_free(ordered_commands);
|
g_list_free(ordered_commands);
|
||||||
g_list_free(curr);
|
|
||||||
|
|
||||||
cons_show("");
|
|
||||||
cons_show("Use /help [command] without the leading slash, for help on a specific command");
|
|
||||||
cons_show("");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -1560,6 +1565,46 @@ cmd_help(ProfWin *window, const char *const command, gchar **args)
|
|||||||
int num_args = g_strv_length(args);
|
int num_args = g_strv_length(args);
|
||||||
if (num_args == 0) {
|
if (num_args == 0) {
|
||||||
cons_help();
|
cons_help();
|
||||||
|
} else if (strcmp(args[0], "search_all") == 0) {
|
||||||
|
if (args[1] == NULL) {
|
||||||
|
cons_bad_cmd_usage(command);
|
||||||
|
} else {
|
||||||
|
GList *cmds = cmd_search_index_all(args[1]);
|
||||||
|
if (cmds == NULL) {
|
||||||
|
cons_show("No commands found.");
|
||||||
|
} else {
|
||||||
|
GList *curr = cmds;
|
||||||
|
GList *results = NULL;
|
||||||
|
while (curr) {
|
||||||
|
results = g_list_insert_sorted(results, curr->data, (GCompareFunc)g_strcmp0);
|
||||||
|
curr = g_list_next(curr);
|
||||||
|
}
|
||||||
|
cons_show("Search results:");
|
||||||
|
_cmd_list_commands(results);
|
||||||
|
g_list_free(results);
|
||||||
|
}
|
||||||
|
g_list_free(cmds);
|
||||||
|
}
|
||||||
|
} else if (strcmp(args[0], "search_any") == 0) {
|
||||||
|
if (args[1] == NULL) {
|
||||||
|
cons_bad_cmd_usage(command);
|
||||||
|
} else {
|
||||||
|
GList *cmds = cmd_search_index_any(args[1]);
|
||||||
|
if (cmds == NULL) {
|
||||||
|
cons_show("No commands found.");
|
||||||
|
} else {
|
||||||
|
GList *curr = cmds;
|
||||||
|
GList *results = NULL;
|
||||||
|
while (curr) {
|
||||||
|
results = g_list_insert_sorted(results, curr->data, (GCompareFunc)g_strcmp0);
|
||||||
|
curr = g_list_next(curr);
|
||||||
|
}
|
||||||
|
cons_show("Search results:");
|
||||||
|
_cmd_list_commands(results);
|
||||||
|
g_list_free(results);
|
||||||
|
}
|
||||||
|
g_list_free(cmds);
|
||||||
|
}
|
||||||
} else if (strcmp(args[0], "commands") == 0) {
|
} else if (strcmp(args[0], "commands") == 0) {
|
||||||
if (args[1]) {
|
if (args[1]) {
|
||||||
if (!cmd_valid_tag(args[1])) {
|
if (!cmd_valid_tag(args[1])) {
|
||||||
@ -2133,16 +2178,16 @@ cmd_group(ProfWin *window, const char *const command, gchar **args)
|
|||||||
|
|
||||||
// list all groups
|
// list all groups
|
||||||
if (args[0] == NULL) {
|
if (args[0] == NULL) {
|
||||||
GSList *groups = roster_get_groups();
|
GList *groups = roster_get_groups();
|
||||||
GSList *curr = groups;
|
GList *curr = groups;
|
||||||
if (curr) {
|
if (curr) {
|
||||||
cons_show("Groups:");
|
cons_show("Groups:");
|
||||||
while (curr) {
|
while (curr) {
|
||||||
cons_show(" %s", curr->data);
|
cons_show(" %s", curr->data);
|
||||||
curr = g_slist_next(curr);
|
curr = g_list_next(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_slist_free_full(groups, g_free);
|
g_list_free_full(groups, g_free);
|
||||||
} else {
|
} else {
|
||||||
cons_show("No groups.");
|
cons_show("No groups.");
|
||||||
}
|
}
|
||||||
@ -3562,9 +3607,9 @@ cmd_invite(ProfWin *window, const char *const command, gchar **args)
|
|||||||
gboolean
|
gboolean
|
||||||
cmd_invites(ProfWin *window, const char *const command, gchar **args)
|
cmd_invites(ProfWin *window, const char *const command, gchar **args)
|
||||||
{
|
{
|
||||||
GSList *invites = muc_invites();
|
GList *invites = muc_invites();
|
||||||
cons_show_room_invites(invites);
|
cons_show_room_invites(invites);
|
||||||
g_slist_free_full(invites, g_free);
|
g_list_free_full(invites, g_free);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4756,24 +4801,14 @@ cmd_clear(ProfWin *window, const char *const command, gchar **args)
|
|||||||
gboolean
|
gboolean
|
||||||
cmd_leave(ProfWin *window, const char *const command, gchar **args)
|
cmd_leave(ProfWin *window, const char *const command, gchar **args)
|
||||||
{
|
{
|
||||||
jabber_conn_status_t conn_status = connection_get_status();
|
if (window->type != WIN_MUC && window->type != WIN_CHAT && window->type != WIN_PRIVATE) {
|
||||||
int index = wins_get_current_num();
|
cons_show("The /leave command is only valid in chat, or chat room windows.");
|
||||||
|
|
||||||
if (window->type != WIN_MUC) {
|
|
||||||
cons_show("You can only use the /leave command in a chat room.");
|
|
||||||
cons_alert();
|
cons_alert();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle leaving rooms, or chat
|
// use /close behaviour
|
||||||
if (conn_status == JABBER_CONNECTED) {
|
return cmd_close(window, "/leave", args);
|
||||||
ui_close_connected_win(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// close the window
|
|
||||||
ui_close_win(index);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
63
src/common.c
63
src/common.c
@ -67,54 +67,6 @@ static unsigned long unique_id = 0;
|
|||||||
|
|
||||||
static size_t _data_callback(void *ptr, size_t size, size_t nmemb, void *data);
|
static size_t _data_callback(void *ptr, size_t size, size_t nmemb, void *data);
|
||||||
|
|
||||||
// taken from glib 2.30.3
|
|
||||||
gchar*
|
|
||||||
p_utf8_substring(const gchar *str, glong start_pos, glong end_pos)
|
|
||||||
{
|
|
||||||
gchar *start, *end, *out;
|
|
||||||
|
|
||||||
start = g_utf8_offset_to_pointer (str, start_pos);
|
|
||||||
end = g_utf8_offset_to_pointer (start, end_pos - start_pos);
|
|
||||||
|
|
||||||
out = g_malloc (end - start + 1);
|
|
||||||
memcpy (out, start, end - start);
|
|
||||||
out[end - start] = 0;
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
p_slist_free_full(GSList *items, GDestroyNotify free_func)
|
|
||||||
{
|
|
||||||
g_slist_foreach (items, (GFunc) free_func, NULL);
|
|
||||||
g_slist_free (items);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
p_list_free_full(GList *items, GDestroyNotify free_func)
|
|
||||||
{
|
|
||||||
g_list_foreach (items, (GFunc) free_func, NULL);
|
|
||||||
g_list_free (items);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
p_hash_table_add(GHashTable *hash_table, gpointer key)
|
|
||||||
{
|
|
||||||
// doesn't handle when key exists, but value == NULL
|
|
||||||
gpointer found = g_hash_table_lookup(hash_table, key);
|
|
||||||
g_hash_table_replace(hash_table, key, key);
|
|
||||||
|
|
||||||
return (found == NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
p_hash_table_contains(GHashTable *hash_table, gconstpointer key)
|
|
||||||
{
|
|
||||||
// doesn't handle when key exists, but value == NULL
|
|
||||||
gpointer found = g_hash_table_lookup(hash_table, key);
|
|
||||||
return (found != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
create_dir(char *name)
|
create_dir(char *name)
|
||||||
{
|
{
|
||||||
@ -515,11 +467,18 @@ prof_occurrences(const char *const needle, const char *const haystack, int offse
|
|||||||
gchar *needle_last_ch = g_utf8_offset_to_pointer(needle, g_utf8_strlen(needle, -1)- 1);
|
gchar *needle_last_ch = g_utf8_offset_to_pointer(needle, g_utf8_strlen(needle, -1)- 1);
|
||||||
int needle_last_ch_len = mblen(needle_last_ch, MB_CUR_MAX);
|
int needle_last_ch_len = mblen(needle_last_ch, MB_CUR_MAX);
|
||||||
|
|
||||||
gchar *haystack_before_ch = g_utf8_prev_char(haystack_curr);
|
gunichar before = 0;
|
||||||
gchar *haystack_after_ch = g_utf8_next_char(haystack_curr + strlen(needle) - needle_last_ch_len);
|
gchar *haystack_before_ch = g_utf8_find_prev_char(haystack, haystack_curr);
|
||||||
|
if (haystack_before_ch) {
|
||||||
|
before = g_utf8_get_char(haystack_before_ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
gunichar after = 0;
|
||||||
|
gchar *haystack_after_ch = g_utf8_find_next_char(haystack_curr + strlen(needle) - needle_last_ch_len, NULL);
|
||||||
|
if (haystack_after_ch) {
|
||||||
|
after = g_utf8_get_char(haystack_after_ch);
|
||||||
|
}
|
||||||
|
|
||||||
gunichar before = g_utf8_get_char(haystack_before_ch);
|
|
||||||
gunichar after = g_utf8_get_char(haystack_after_ch);
|
|
||||||
if (!g_unichar_isalnum(before) && !g_unichar_isalnum(after)) {
|
if (!g_unichar_isalnum(before) && !g_unichar_isalnum(after)) {
|
||||||
*result = g_slist_append(*result, GINT_TO_POINTER(offset));
|
*result = g_slist_append(*result, GINT_TO_POINTER(offset));
|
||||||
}
|
}
|
||||||
|
20
src/common.h
20
src/common.h
@ -40,20 +40,6 @@
|
|||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#if !GLIB_CHECK_VERSION(2,28,0)
|
|
||||||
#define g_slist_free_full(items, free_func) p_slist_free_full(items, free_func)
|
|
||||||
#define g_list_free_full(items, free_func) p_list_free_full(items, free_func)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GLIB_CHECK_VERSION(2,30,0)
|
|
||||||
#define g_utf8_substring(str, start_pos, end_pos) p_utf8_substring(str, start_pos, end_pos)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !GLIB_CHECK_VERSION(2,32,0)
|
|
||||||
#define g_hash_table_add(hash_table, key) p_hash_table_add(hash_table, key)
|
|
||||||
#define g_hash_table_contains(hash_table, key) p_hash_table_contains(hash_table, key)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NOTIFY_CHECK_VERSION
|
#ifndef NOTIFY_CHECK_VERSION
|
||||||
#define notify_notification_new(summary, body, icon) notify_notification_new(summary, body, icon, NULL)
|
#define notify_notification_new(summary, body, icon) notify_notification_new(summary, body, icon, NULL)
|
||||||
#endif
|
#endif
|
||||||
@ -94,12 +80,6 @@ typedef enum {
|
|||||||
RESOURCE_XA
|
RESOURCE_XA
|
||||||
} resource_presence_t;
|
} resource_presence_t;
|
||||||
|
|
||||||
gchar* p_utf8_substring(const gchar *str, glong start_pos, glong end_pos);
|
|
||||||
void p_slist_free_full(GSList *items, GDestroyNotify free_func);
|
|
||||||
void p_list_free_full(GList *items, GDestroyNotify free_func);
|
|
||||||
gboolean p_hash_table_add(GHashTable *hash_table, gpointer key);
|
|
||||||
gboolean p_hash_table_contains(GHashTable *hash_table, gconstpointer key);
|
|
||||||
|
|
||||||
gboolean create_dir(char *name);
|
gboolean create_dir(char *name);
|
||||||
gboolean mkdir_recursive(const char *dir);
|
gboolean mkdir_recursive(const char *dir);
|
||||||
gboolean copy_file(const char *const src, const char *const target);
|
gboolean copy_file(const char *const src, const char *const target);
|
||||||
|
@ -96,15 +96,15 @@ accounts_close(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
accounts_find_enabled(const char *const prefix)
|
accounts_find_enabled(const char *const prefix, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(enabled_ac, prefix, TRUE);
|
return autocomplete_complete(enabled_ac, prefix, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
accounts_find_all(const char *const prefix)
|
accounts_find_all(const char *const prefix, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(all_ac, prefix, TRUE);
|
return autocomplete_complete(all_ac, prefix, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -43,8 +43,8 @@
|
|||||||
void accounts_load(void);
|
void accounts_load(void);
|
||||||
void accounts_close(void);
|
void accounts_close(void);
|
||||||
|
|
||||||
char* accounts_find_all(const char *const prefix);
|
char* accounts_find_all(const char *const prefix, gboolean previous);
|
||||||
char* accounts_find_enabled(const char *const prefix);
|
char* accounts_find_enabled(const char *const prefix, gboolean previous);
|
||||||
void accounts_reset_all_search(void);
|
void accounts_reset_all_search(void);
|
||||||
void accounts_reset_enabled_search(void);
|
void accounts_reset_enabled_search(void);
|
||||||
void accounts_add(const char *jid, const char *altdomain, const int port, const char *const tls_policy);
|
void accounts_add(const char *jid, const char *altdomain, const int port, const char *const tls_policy);
|
||||||
|
@ -183,9 +183,9 @@ prefs_close(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
prefs_autocomplete_boolean_choice(const char *const prefix)
|
prefs_autocomplete_boolean_choice(const char *const prefix, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(boolean_choice_ac, prefix, TRUE);
|
return autocomplete_complete(boolean_choice_ac, prefix, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -195,9 +195,9 @@ prefs_reset_boolean_choice(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
prefs_autocomplete_room_trigger(const char *const prefix)
|
prefs_autocomplete_room_trigger(const char *const prefix, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(room_trigger_ac, prefix, TRUE);
|
return autocomplete_complete(room_trigger_ac, prefix, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -162,10 +162,10 @@ void prefs_close(void);
|
|||||||
char* prefs_find_login(char *prefix);
|
char* prefs_find_login(char *prefix);
|
||||||
void prefs_reset_login_search(void);
|
void prefs_reset_login_search(void);
|
||||||
|
|
||||||
char* prefs_autocomplete_boolean_choice(const char *const prefix);
|
char* prefs_autocomplete_boolean_choice(const char *const prefix, gboolean previous);
|
||||||
void prefs_reset_boolean_choice(void);
|
void prefs_reset_boolean_choice(void);
|
||||||
|
|
||||||
char* prefs_autocomplete_room_trigger(const char *const prefix);
|
char* prefs_autocomplete_room_trigger(const char *const prefix, gboolean previous);
|
||||||
void prefs_reset_room_trigger_ac(void);
|
void prefs_reset_room_trigger_ac(void);
|
||||||
|
|
||||||
gint prefs_get_gone(void);
|
gint prefs_get_gone(void);
|
||||||
|
@ -104,6 +104,7 @@ theme_init(const char *const theme_name)
|
|||||||
g_hash_table_insert(defaults, strdup("statusbar.brackets"), strdup("cyan"));
|
g_hash_table_insert(defaults, strdup("statusbar.brackets"), strdup("cyan"));
|
||||||
g_hash_table_insert(defaults, strdup("statusbar.active"), strdup("cyan"));
|
g_hash_table_insert(defaults, strdup("statusbar.active"), strdup("cyan"));
|
||||||
g_hash_table_insert(defaults, strdup("statusbar.new"), strdup("white"));
|
g_hash_table_insert(defaults, strdup("statusbar.new"), strdup("white"));
|
||||||
|
g_hash_table_insert(defaults, strdup("statusbar.time"), strdup("white"));
|
||||||
g_hash_table_insert(defaults, strdup("me"), strdup("yellow"));
|
g_hash_table_insert(defaults, strdup("me"), strdup("yellow"));
|
||||||
g_hash_table_insert(defaults, strdup("them"), strdup("green"));
|
g_hash_table_insert(defaults, strdup("them"), strdup("green"));
|
||||||
g_hash_table_insert(defaults, strdup("receipt.sent"), strdup("red"));
|
g_hash_table_insert(defaults, strdup("receipt.sent"), strdup("red"));
|
||||||
@ -755,6 +756,7 @@ theme_attrs(theme_item_t attrs)
|
|||||||
case THEME_STATUS_BRACKET: _theme_prep_fgnd("statusbar.brackets", lookup_str, &bold); break;
|
case THEME_STATUS_BRACKET: _theme_prep_fgnd("statusbar.brackets", lookup_str, &bold); break;
|
||||||
case THEME_STATUS_ACTIVE: _theme_prep_fgnd("statusbar.active", lookup_str, &bold); break;
|
case THEME_STATUS_ACTIVE: _theme_prep_fgnd("statusbar.active", lookup_str, &bold); break;
|
||||||
case THEME_STATUS_NEW: _theme_prep_fgnd("statusbar.new", lookup_str, &bold); break;
|
case THEME_STATUS_NEW: _theme_prep_fgnd("statusbar.new", lookup_str, &bold); break;
|
||||||
|
case THEME_STATUS_TIME: _theme_prep_fgnd("statusbar.time", lookup_str, &bold); break;
|
||||||
case THEME_ME: _theme_prep_fgnd("me", lookup_str, &bold); break;
|
case THEME_ME: _theme_prep_fgnd("me", lookup_str, &bold); break;
|
||||||
case THEME_THEM: _theme_prep_fgnd("them", lookup_str, &bold); break;
|
case THEME_THEM: _theme_prep_fgnd("them", lookup_str, &bold); break;
|
||||||
case THEME_RECEIPT_SENT: _theme_prep_fgnd("receipt.sent", lookup_str, &bold); break;
|
case THEME_RECEIPT_SENT: _theme_prep_fgnd("receipt.sent", lookup_str, &bold); break;
|
||||||
@ -843,6 +845,7 @@ theme_attrs(theme_item_t attrs)
|
|||||||
case THEME_STATUS_BRACKET:
|
case THEME_STATUS_BRACKET:
|
||||||
case THEME_STATUS_ACTIVE:
|
case THEME_STATUS_ACTIVE:
|
||||||
case THEME_STATUS_NEW:
|
case THEME_STATUS_NEW:
|
||||||
|
case THEME_STATUS_TIME:
|
||||||
_theme_prep_bgnd("statusbar", "blue", lookup_str);
|
_theme_prep_bgnd("statusbar", "blue", lookup_str);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -69,6 +69,7 @@ typedef enum {
|
|||||||
THEME_STATUS_BRACKET,
|
THEME_STATUS_BRACKET,
|
||||||
THEME_STATUS_ACTIVE,
|
THEME_STATUS_ACTIVE,
|
||||||
THEME_STATUS_NEW,
|
THEME_STATUS_NEW,
|
||||||
|
THEME_STATUS_TIME,
|
||||||
THEME_ME,
|
THEME_ME,
|
||||||
THEME_THEM,
|
THEME_THEM,
|
||||||
THEME_ROOMINFO,
|
THEME_ROOMINFO,
|
||||||
|
@ -368,9 +368,9 @@ tlscerts_get_trusted(const char * const fingerprint)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
tlscerts_complete(const char *const prefix)
|
tlscerts_complete(const char *const prefix, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(certs_ac, prefix, TRUE);
|
return autocomplete_complete(certs_ac, prefix, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -89,7 +89,7 @@ void tlscerts_free(TLSCertificate *cert);
|
|||||||
|
|
||||||
GList* tlscerts_list(void);
|
GList* tlscerts_list(void);
|
||||||
|
|
||||||
char* tlscerts_complete(const char *const prefix);
|
char* tlscerts_complete(const char *const prefix, gboolean previous);
|
||||||
|
|
||||||
void tlscerts_reset_ac(void);
|
void tlscerts_reset_ac(void);
|
||||||
|
|
||||||
|
@ -749,9 +749,9 @@ p_gpg_free_decrypted(char *decrypted)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
p_gpg_autocomplete_key(const char *const search_str)
|
p_gpg_autocomplete_key(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(key_ac, search_str, TRUE);
|
return autocomplete_complete(key_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -67,7 +67,7 @@ void p_gpg_verify(const char *const barejid, const char *const sign);
|
|||||||
char* p_gpg_encrypt(const char *const barejid, const char *const message, const char *const fp);
|
char* p_gpg_encrypt(const char *const barejid, const char *const message, const char *const fp);
|
||||||
char* p_gpg_decrypt(const char *const cipher);
|
char* p_gpg_decrypt(const char *const cipher);
|
||||||
void p_gpg_free_decrypted(char *decrypted);
|
void p_gpg_free_decrypted(char *decrypted);
|
||||||
char* p_gpg_autocomplete_key(const char *const search_str);
|
char* p_gpg_autocomplete_key(const char *const search_str, gboolean previous);
|
||||||
void p_gpg_autocomplete_key_reset(void);
|
void p_gpg_autocomplete_key_reset(void);
|
||||||
char* p_gpg_format_fp_str(char *fp);
|
char* p_gpg_format_fp_str(char *fp);
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ autocompleters_filepath_add(const char *const plugin_name, const char *prefix)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
autocompleters_complete(const char * const input)
|
autocompleters_complete(const char * const input, gboolean previous)
|
||||||
{
|
{
|
||||||
char *result = NULL;
|
char *result = NULL;
|
||||||
|
|
||||||
@ -141,7 +141,7 @@ autocompleters_complete(const char * const input)
|
|||||||
GList *keys = g_hash_table_get_keys(key_to_ac);
|
GList *keys = g_hash_table_get_keys(key_to_ac);
|
||||||
GList *curr = keys;
|
GList *curr = keys;
|
||||||
while (curr) {
|
while (curr) {
|
||||||
result = autocomplete_param_with_ac(input, curr->data, g_hash_table_lookup(key_to_ac, curr->data), TRUE);
|
result = autocomplete_param_with_ac(input, curr->data, g_hash_table_lookup(key_to_ac, curr->data), TRUE, previous);
|
||||||
if (result) {
|
if (result) {
|
||||||
g_list_free(ac_hashes);
|
g_list_free(ac_hashes);
|
||||||
g_list_free(keys);
|
g_list_free(keys);
|
||||||
@ -164,7 +164,7 @@ autocompleters_complete(const char * const input)
|
|||||||
while (curr_prefix) {
|
while (curr_prefix) {
|
||||||
char *prefix = curr_prefix->data;
|
char *prefix = curr_prefix->data;
|
||||||
if (g_str_has_prefix(input, prefix)) {
|
if (g_str_has_prefix(input, prefix)) {
|
||||||
result = cmd_ac_complete_filepath(input, prefix);
|
result = cmd_ac_complete_filepath(input, prefix, previous);
|
||||||
if (result) {
|
if (result) {
|
||||||
g_list_free(filepath_hashes);
|
g_list_free(filepath_hashes);
|
||||||
g_list_free(prefixes);
|
g_list_free(prefixes);
|
||||||
|
@ -42,7 +42,7 @@ void autocompleters_add(const char *const plugin_name, const char *key, char **i
|
|||||||
void autocompleters_remove(const char *const plugin_name, const char *key, char **items);
|
void autocompleters_remove(const char *const plugin_name, const char *key, char **items);
|
||||||
void autocompleters_clear(const char *const plugin_name, const char *key);
|
void autocompleters_clear(const char *const plugin_name, const char *key);
|
||||||
void autocompleters_filepath_add(const char *const plugin_name, const char *prefix);
|
void autocompleters_filepath_add(const char *const plugin_name, const char *prefix);
|
||||||
char* autocompleters_complete(const char * const input);
|
char* autocompleters_complete(const char * const input, gboolean previous);
|
||||||
void autocompleters_reset(void);
|
void autocompleters_reset(void);
|
||||||
void autocompleters_destroy(void);
|
void autocompleters_destroy(void);
|
||||||
|
|
||||||
|
@ -369,9 +369,9 @@ plugins_loaded_list(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
plugins_autocomplete(const char * const input)
|
plugins_autocomplete(const char * const input, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocompleters_complete(input);
|
return autocompleters_complete(input, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -108,7 +108,7 @@ typedef struct prof_plugin_t {
|
|||||||
void plugins_init(void);
|
void plugins_init(void);
|
||||||
GSList *plugins_unloaded_list(void);
|
GSList *plugins_unloaded_list(void);
|
||||||
GList *plugins_loaded_list(void);
|
GList *plugins_loaded_list(void);
|
||||||
char* plugins_autocomplete(const char *const input);
|
char* plugins_autocomplete(const char *const input, gboolean previous);
|
||||||
void plugins_reset_autocomplete(void);
|
void plugins_reset_autocomplete(void);
|
||||||
void plugins_shutdown(void);
|
void plugins_shutdown(void);
|
||||||
|
|
||||||
|
@ -35,18 +35,21 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "tools/autocomplete.h"
|
#include "tools/autocomplete.h"
|
||||||
#include "tools/parser.h"
|
#include "tools/parser.h"
|
||||||
|
#include "ui/ui.h"
|
||||||
|
|
||||||
struct autocomplete_t {
|
struct autocomplete_t {
|
||||||
GSList *items;
|
GList *items;
|
||||||
GSList *last_found;
|
GList *last_found;
|
||||||
gchar *search_str;
|
gchar *search_str;
|
||||||
};
|
};
|
||||||
|
|
||||||
static gchar* _search_from(Autocomplete ac, GSList *curr, gboolean quote);
|
static gchar* _search_next(Autocomplete ac, GList *curr, gboolean quote);
|
||||||
|
static gchar* _search_prev(Autocomplete ac, GList *curr, gboolean quote);
|
||||||
|
|
||||||
Autocomplete
|
Autocomplete
|
||||||
autocomplete_new(void)
|
autocomplete_new(void)
|
||||||
@ -63,7 +66,7 @@ void
|
|||||||
autocomplete_clear(Autocomplete ac)
|
autocomplete_clear(Autocomplete ac)
|
||||||
{
|
{
|
||||||
if (ac) {
|
if (ac) {
|
||||||
g_slist_free_full(ac->items, free);
|
g_list_free_full(ac->items, free);
|
||||||
ac->items = NULL;
|
ac->items = NULL;
|
||||||
|
|
||||||
autocomplete_reset(ac);
|
autocomplete_reset(ac);
|
||||||
@ -94,7 +97,7 @@ autocomplete_length(Autocomplete ac)
|
|||||||
} else if (!ac->items) {
|
} else if (!ac->items) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return g_slist_length(ac->items);
|
return g_list_length(ac->items);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +106,7 @@ autocomplete_add(Autocomplete ac, const char *item)
|
|||||||
{
|
{
|
||||||
if (ac) {
|
if (ac) {
|
||||||
char *item_cpy;
|
char *item_cpy;
|
||||||
GSList *curr = g_slist_find_custom(ac->items, item, (GCompareFunc)strcmp);
|
GList *curr = g_list_find_custom(ac->items, item, (GCompareFunc)strcmp);
|
||||||
|
|
||||||
// if item already exists
|
// if item already exists
|
||||||
if (curr) {
|
if (curr) {
|
||||||
@ -111,7 +114,7 @@ autocomplete_add(Autocomplete ac, const char *item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
item_cpy = strdup(item);
|
item_cpy = strdup(item);
|
||||||
ac->items = g_slist_insert_sorted(ac->items, item_cpy, (GCompareFunc)strcmp);
|
ac->items = g_list_insert_sorted(ac->items, item_cpy, (GCompareFunc)strcmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -130,7 +133,7 @@ void
|
|||||||
autocomplete_remove(Autocomplete ac, const char *const item)
|
autocomplete_remove(Autocomplete ac, const char *const item)
|
||||||
{
|
{
|
||||||
if (ac) {
|
if (ac) {
|
||||||
GSList *curr = g_slist_find_custom(ac->items, item, (GCompareFunc)strcmp);
|
GList *curr = g_list_find_custom(ac->items, item, (GCompareFunc)strcmp);
|
||||||
|
|
||||||
if (!curr) {
|
if (!curr) {
|
||||||
return;
|
return;
|
||||||
@ -142,7 +145,7 @@ autocomplete_remove(Autocomplete ac, const char *const item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
free(curr->data);
|
free(curr->data);
|
||||||
ac->items = g_slist_delete_link(ac->items, curr);
|
ac->items = g_list_delete_link(ac->items, curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -157,15 +160,15 @@ autocomplete_remove_all(Autocomplete ac, char **items)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList*
|
GList*
|
||||||
autocomplete_create_list(Autocomplete ac)
|
autocomplete_create_list(Autocomplete ac)
|
||||||
{
|
{
|
||||||
GSList *copy = NULL;
|
GList *copy = NULL;
|
||||||
GSList *curr = ac->items;
|
GList *curr = ac->items;
|
||||||
|
|
||||||
while(curr) {
|
while(curr) {
|
||||||
copy = g_slist_append(copy, strdup(curr->data));
|
copy = g_list_append(copy, strdup(curr->data));
|
||||||
curr = g_slist_next(curr);
|
curr = g_list_next(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return copy;
|
return copy;
|
||||||
@ -174,20 +177,20 @@ autocomplete_create_list(Autocomplete ac)
|
|||||||
gboolean
|
gboolean
|
||||||
autocomplete_contains(Autocomplete ac, const char *value)
|
autocomplete_contains(Autocomplete ac, const char *value)
|
||||||
{
|
{
|
||||||
GSList *curr = ac->items;
|
GList *curr = ac->items;
|
||||||
|
|
||||||
while(curr) {
|
while(curr) {
|
||||||
if (strcmp(curr->data, value) == 0) {
|
if (strcmp(curr->data, value) == 0) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
curr = g_slist_next(curr);
|
curr = g_list_next(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gchar*
|
gchar*
|
||||||
autocomplete_complete(Autocomplete ac, const gchar *search_str, gboolean quote)
|
autocomplete_complete(Autocomplete ac, const gchar *search_str, gboolean quote, gboolean previous)
|
||||||
{
|
{
|
||||||
gchar *found = NULL;
|
gchar *found = NULL;
|
||||||
|
|
||||||
@ -208,22 +211,38 @@ autocomplete_complete(Autocomplete ac, const gchar *search_str, gboolean quote)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ac->search_str = strdup(search_str);
|
ac->search_str = strdup(search_str);
|
||||||
found = _search_from(ac, ac->items, quote);
|
found = _search_next(ac, ac->items, quote);
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
|
|
||||||
// subsequent search attempt
|
// subsequent search attempt
|
||||||
} else {
|
} else {
|
||||||
// search from here+1 to end
|
if (previous) {
|
||||||
found = _search_from(ac, g_slist_next(ac->last_found), quote);
|
// search from here-1 to beginning
|
||||||
if (found) {
|
found = _search_prev(ac, g_list_previous(ac->last_found), quote);
|
||||||
return found;
|
if (found) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// search from here+1 to end
|
||||||
|
found = _search_next(ac, g_list_next(ac->last_found), quote);
|
||||||
|
if (found) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// search from beginning
|
if (previous) {
|
||||||
found = _search_from(ac, ac->items, quote);
|
// search from end
|
||||||
if (found) {
|
found = _search_prev(ac, g_list_last(ac->items), quote);
|
||||||
return found;
|
if (found) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// search from beginning
|
||||||
|
found = _search_next(ac, ac->items, quote);
|
||||||
|
if (found) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we found nothing, reset search
|
// we found nothing, reset search
|
||||||
@ -234,7 +253,7 @@ autocomplete_complete(Autocomplete ac, const gchar *search_str, gboolean quote)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
autocomplete_param_with_func(const char *const input, char *command, autocomplete_func func)
|
autocomplete_param_with_func(const char *const input, char *command, autocomplete_func func, gboolean previous)
|
||||||
{
|
{
|
||||||
GString *auto_msg = NULL;
|
GString *auto_msg = NULL;
|
||||||
char *result = NULL;
|
char *result = NULL;
|
||||||
@ -251,7 +270,7 @@ autocomplete_param_with_func(const char *const input, char *command, autocomplet
|
|||||||
}
|
}
|
||||||
prefix[inp_len - len] = '\0';
|
prefix[inp_len - len] = '\0';
|
||||||
|
|
||||||
char *found = func(prefix);
|
char *found = func(prefix, previous);
|
||||||
if (found) {
|
if (found) {
|
||||||
auto_msg = g_string_new(command_cpy);
|
auto_msg = g_string_new(command_cpy);
|
||||||
g_string_append(auto_msg, found);
|
g_string_append(auto_msg, found);
|
||||||
@ -265,7 +284,7 @@ autocomplete_param_with_func(const char *const input, char *command, autocomplet
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
autocomplete_param_with_ac(const char *const input, char *command, Autocomplete ac, gboolean quote)
|
autocomplete_param_with_ac(const char *const input, char *command, Autocomplete ac, gboolean quote, gboolean previous)
|
||||||
{
|
{
|
||||||
GString *auto_msg = NULL;
|
GString *auto_msg = NULL;
|
||||||
char *result = NULL;
|
char *result = NULL;
|
||||||
@ -281,7 +300,7 @@ autocomplete_param_with_ac(const char *const input, char *command, Autocomplete
|
|||||||
}
|
}
|
||||||
prefix[inp_len - len] = '\0';
|
prefix[inp_len - len] = '\0';
|
||||||
|
|
||||||
char *found = autocomplete_complete(ac, prefix, quote);
|
char *found = autocomplete_complete(ac, prefix, quote, previous);
|
||||||
if (found) {
|
if (found) {
|
||||||
auto_msg = g_string_new(command_cpy);
|
auto_msg = g_string_new(command_cpy);
|
||||||
g_string_append(auto_msg, found);
|
g_string_append(auto_msg, found);
|
||||||
@ -296,7 +315,7 @@ autocomplete_param_with_ac(const char *const input, char *command, Autocomplete
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
autocomplete_param_no_with_func(const char *const input, char *command, int arg_number, autocomplete_func func)
|
autocomplete_param_no_with_func(const char *const input, char *command, int arg_number, autocomplete_func func, gboolean previous)
|
||||||
{
|
{
|
||||||
if (strncmp(input, command, strlen(command)) == 0) {
|
if (strncmp(input, command, strlen(command)) == 0) {
|
||||||
GString *result_str = NULL;
|
GString *result_str = NULL;
|
||||||
@ -311,7 +330,7 @@ autocomplete_param_no_with_func(const char *const input, char *command, int arg_
|
|||||||
|
|
||||||
// autocomplete param
|
// autocomplete param
|
||||||
if (comp_str) {
|
if (comp_str) {
|
||||||
char *found = func(comp_str);
|
char *found = func(comp_str, previous);
|
||||||
if (found) {
|
if (found) {
|
||||||
result_str = g_string_new("");
|
result_str = g_string_new("");
|
||||||
g_string_append(result_str, start_str);
|
g_string_append(result_str, start_str);
|
||||||
@ -328,12 +347,19 @@ autocomplete_param_no_with_func(const char *const input, char *command, int arg_
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gchar*
|
static gchar*
|
||||||
_search_from(Autocomplete ac, GSList *curr, gboolean quote)
|
_search_next(Autocomplete ac, GList *curr, gboolean quote)
|
||||||
{
|
{
|
||||||
|
gchar *search_str_ascii = g_str_to_ascii(ac->search_str, NULL);
|
||||||
|
gchar *search_str_lower = g_ascii_strdown(search_str_ascii, -1);
|
||||||
|
g_free(search_str_ascii);
|
||||||
|
|
||||||
while(curr) {
|
while(curr) {
|
||||||
|
gchar *curr_ascii = g_str_to_ascii(curr->data, NULL);
|
||||||
|
gchar *curr_lower = g_ascii_strdown(curr_ascii, -1);
|
||||||
|
g_free(curr_ascii);
|
||||||
|
|
||||||
// match found
|
// match found
|
||||||
if (strncmp(curr->data, ac->search_str, strlen(ac->search_str)) == 0) {
|
if (strncmp(curr_lower, search_str_lower, strlen(search_str_lower)) == 0) {
|
||||||
|
|
||||||
// set pointer to last found
|
// set pointer to last found
|
||||||
ac->last_found = curr;
|
ac->last_found = curr;
|
||||||
@ -347,16 +373,69 @@ _search_from(Autocomplete ac, GSList *curr, gboolean quote)
|
|||||||
gchar *result = quoted->str;
|
gchar *result = quoted->str;
|
||||||
g_string_free(quoted, FALSE);
|
g_string_free(quoted, FALSE);
|
||||||
|
|
||||||
|
g_free(search_str_lower);
|
||||||
|
g_free(curr_lower);
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
// otherwise just return the string
|
// otherwise just return the string
|
||||||
} else {
|
} else {
|
||||||
|
g_free(search_str_lower);
|
||||||
|
g_free(curr_lower);
|
||||||
return strdup(curr->data);
|
return strdup(curr->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
curr = g_slist_next(curr);
|
g_free(curr_lower);
|
||||||
|
curr = g_list_next(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_free(search_str_lower);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gchar*
|
||||||
|
_search_prev(Autocomplete ac, GList *curr, gboolean quote)
|
||||||
|
{
|
||||||
|
gchar *search_str_ascii = g_str_to_ascii(ac->search_str, NULL);
|
||||||
|
gchar *search_str_lower = g_ascii_strdown(search_str_ascii, -1);
|
||||||
|
g_free(search_str_ascii);
|
||||||
|
|
||||||
|
while(curr) {
|
||||||
|
gchar *curr_ascii = g_str_to_ascii(curr->data, NULL);
|
||||||
|
gchar *curr_lower = g_ascii_strdown(curr_ascii, -1);
|
||||||
|
g_free(curr_ascii);
|
||||||
|
|
||||||
|
// match found
|
||||||
|
if (strncmp(curr_lower, search_str_lower, strlen(search_str_lower)) == 0) {
|
||||||
|
|
||||||
|
// set pointer to last found
|
||||||
|
ac->last_found = curr;
|
||||||
|
|
||||||
|
// if contains space, quote before returning
|
||||||
|
if (quote && g_strrstr(curr->data, " ")) {
|
||||||
|
GString *quoted = g_string_new("\"");
|
||||||
|
g_string_append(quoted, curr->data);
|
||||||
|
g_string_append(quoted, "\"");
|
||||||
|
|
||||||
|
gchar *result = quoted->str;
|
||||||
|
g_string_free(quoted, FALSE);
|
||||||
|
|
||||||
|
g_free(search_str_lower);
|
||||||
|
g_free(curr_lower);
|
||||||
|
return result;
|
||||||
|
|
||||||
|
// otherwise just return the string
|
||||||
|
} else {
|
||||||
|
g_free(search_str_lower);
|
||||||
|
g_free(curr_lower);
|
||||||
|
return strdup(curr->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(curr_lower);
|
||||||
|
curr = g_list_previous(curr);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(search_str_lower);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
typedef char* (*autocomplete_func)(const char *const);
|
typedef char* (*autocomplete_func)(const char *const, gboolean);
|
||||||
typedef struct autocomplete_t *Autocomplete;
|
typedef struct autocomplete_t *Autocomplete;
|
||||||
|
|
||||||
// allocate new autocompleter with no items
|
// allocate new autocompleter with no items
|
||||||
@ -55,19 +55,19 @@ void autocomplete_remove(Autocomplete ac, const char *const item);
|
|||||||
void autocomplete_remove_all(Autocomplete ac, char **items);
|
void autocomplete_remove_all(Autocomplete ac, char **items);
|
||||||
|
|
||||||
// find the next item prefixed with search string
|
// find the next item prefixed with search string
|
||||||
gchar* autocomplete_complete(Autocomplete ac, const gchar *search_str, gboolean quote);
|
gchar* autocomplete_complete(Autocomplete ac, const gchar *search_str, gboolean quote, gboolean previous);
|
||||||
|
|
||||||
GSList* autocomplete_create_list(Autocomplete ac);
|
GList* autocomplete_create_list(Autocomplete ac);
|
||||||
gint autocomplete_length(Autocomplete ac);
|
gint autocomplete_length(Autocomplete ac);
|
||||||
|
|
||||||
char* autocomplete_param_with_func(const char *const input, char *command,
|
char* autocomplete_param_with_func(const char *const input, char *command,
|
||||||
autocomplete_func func);
|
autocomplete_func func, gboolean previous);
|
||||||
|
|
||||||
char* autocomplete_param_with_ac(const char *const input, char *command,
|
char* autocomplete_param_with_ac(const char *const input, char *command,
|
||||||
Autocomplete ac, gboolean quote);
|
Autocomplete ac, gboolean quote, gboolean previous);
|
||||||
|
|
||||||
char* autocomplete_param_no_with_func(const char *const input, char *command,
|
char* autocomplete_param_no_with_func(const char *const input, char *command,
|
||||||
int arg_number, autocomplete_func func);
|
int arg_number, autocomplete_func func, gboolean previous);
|
||||||
|
|
||||||
void autocomplete_reset(Autocomplete ac);
|
void autocomplete_reset(Autocomplete ac);
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ cons_show_help(const char *const cmd, CommandHelp *help)
|
|||||||
|
|
||||||
if (g_strv_length((gchar**)help->examples) > 0) {
|
if (g_strv_length((gchar**)help->examples) > 0) {
|
||||||
cons_show("");
|
cons_show("");
|
||||||
win_println(console, THEME_HELP_HEADER, '-', "Arguments");
|
win_println(console, THEME_HELP_HEADER, '-', "Examples");
|
||||||
ui_show_lines(console, help->examples);
|
ui_show_lines(console, help->examples);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -505,7 +505,7 @@ cons_show_wins(gboolean unread)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cons_show_room_invites(GSList *invites)
|
cons_show_room_invites(GList *invites)
|
||||||
{
|
{
|
||||||
cons_show("");
|
cons_show("");
|
||||||
if (invites == NULL) {
|
if (invites == NULL) {
|
||||||
@ -514,7 +514,7 @@ cons_show_room_invites(GSList *invites)
|
|||||||
cons_show("Chat room invites, use /join or /decline commands:");
|
cons_show("Chat room invites, use /join or /decline commands:");
|
||||||
while (invites) {
|
while (invites) {
|
||||||
cons_show(" %s", invites->data);
|
cons_show(" %s", invites->data);
|
||||||
invites = g_slist_next(invites);
|
invites = g_list_next(invites);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,17 +608,17 @@ cons_show_caps(const char *const fulljid, resource_presence_t presence)
|
|||||||
void
|
void
|
||||||
cons_show_received_subs(void)
|
cons_show_received_subs(void)
|
||||||
{
|
{
|
||||||
GSList *received = presence_get_subscription_requests();
|
GList *received = presence_get_subscription_requests();
|
||||||
if (received == NULL) {
|
if (received == NULL) {
|
||||||
cons_show("No outstanding subscription requests.");
|
cons_show("No outstanding subscription requests.");
|
||||||
} else {
|
} else {
|
||||||
cons_show("Outstanding subscription requests from:",
|
cons_show("Outstanding subscription requests from:",
|
||||||
g_slist_length(received));
|
g_list_length(received));
|
||||||
while (received) {
|
while (received) {
|
||||||
cons_show(" %s", received->data);
|
cons_show(" %s", received->data);
|
||||||
received = g_slist_next(received);
|
received = g_list_next(received);
|
||||||
}
|
}
|
||||||
g_slist_free_full(received, g_free);
|
g_list_free_full(received, g_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
cons_alert();
|
cons_alert();
|
||||||
@ -2224,6 +2224,7 @@ cons_theme_properties(void)
|
|||||||
_cons_theme_bar_prop(THEME_STATUS_BRACKET, "statusbar.brackets");
|
_cons_theme_bar_prop(THEME_STATUS_BRACKET, "statusbar.brackets");
|
||||||
_cons_theme_bar_prop(THEME_STATUS_ACTIVE, "statusbar.active");
|
_cons_theme_bar_prop(THEME_STATUS_ACTIVE, "statusbar.active");
|
||||||
_cons_theme_bar_prop(THEME_STATUS_NEW, "statusbar.new");
|
_cons_theme_bar_prop(THEME_STATUS_NEW, "statusbar.new");
|
||||||
|
_cons_theme_bar_prop(THEME_STATUS_TIME, "statusbar.time");
|
||||||
|
|
||||||
_cons_theme_prop(THEME_TIME, "main.time");
|
_cons_theme_prop(THEME_TIME, "main.time");
|
||||||
_cons_theme_prop(THEME_TEXT, "main.text");
|
_cons_theme_prop(THEME_TEXT, "main.text");
|
||||||
|
@ -96,6 +96,7 @@ static void _inp_rl_addfuncs(void);
|
|||||||
static int _inp_rl_getc(FILE *stream);
|
static int _inp_rl_getc(FILE *stream);
|
||||||
static void _inp_rl_linehandler(char *line);
|
static void _inp_rl_linehandler(char *line);
|
||||||
static int _inp_rl_tab_handler(int count, int key);
|
static int _inp_rl_tab_handler(int count, int key);
|
||||||
|
static int _inp_rl_shift_tab_handler(int count, int key);
|
||||||
static int _inp_rl_win_clear_handler(int count, int key);
|
static int _inp_rl_win_clear_handler(int count, int key);
|
||||||
static int _inp_rl_win_1_handler(int count, int key);
|
static int _inp_rl_win_1_handler(int count, int key);
|
||||||
static int _inp_rl_win_2_handler(int count, int key);
|
static int _inp_rl_win_2_handler(int count, int key);
|
||||||
@ -429,6 +430,7 @@ _inp_rl_startup_hook(void)
|
|||||||
rl_bind_keyseq("\\el", _inp_rl_win_linedown_handler);
|
rl_bind_keyseq("\\el", _inp_rl_win_linedown_handler);
|
||||||
|
|
||||||
rl_bind_key('\t', _inp_rl_tab_handler);
|
rl_bind_key('\t', _inp_rl_tab_handler);
|
||||||
|
rl_bind_keyseq("\\e[Z", _inp_rl_shift_tab_handler);
|
||||||
|
|
||||||
// unbind unwanted mappings
|
// unbind unwanted mappings
|
||||||
rl_bind_keyseq("\\e=", NULL);
|
rl_bind_keyseq("\\e=", NULL);
|
||||||
@ -457,10 +459,27 @@ _inp_rl_linehandler(char *line)
|
|||||||
inp_line = line;
|
inp_line = line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean shift_tab = FALSE;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_inp_rl_getc(FILE *stream)
|
_inp_rl_getc(FILE *stream)
|
||||||
{
|
{
|
||||||
int ch = rl_getc(stream);
|
int ch = rl_getc(stream);
|
||||||
|
|
||||||
|
// 27, 91, 90 = Shift tab
|
||||||
|
if (ch == 27) {
|
||||||
|
shift_tab = TRUE;
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
if (shift_tab && ch == 91) {
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
if (shift_tab && ch == 90) {
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
shift_tab = FALSE;
|
||||||
|
|
||||||
if (_inp_printable(ch)) {
|
if (_inp_printable(ch)) {
|
||||||
ProfWin *window = wins_get_current();
|
ProfWin *window = wins_get_current();
|
||||||
cmd_ac_reset(window);
|
cmd_ac_reset(window);
|
||||||
@ -485,7 +504,7 @@ _inp_rl_tab_handler(int count, int key)
|
|||||||
|
|
||||||
ProfWin *current = wins_get_current();
|
ProfWin *current = wins_get_current();
|
||||||
if ((strncmp(rl_line_buffer, "/", 1) != 0) && (current->type == WIN_MUC)) {
|
if ((strncmp(rl_line_buffer, "/", 1) != 0) && (current->type == WIN_MUC)) {
|
||||||
char *result = muc_autocomplete(current, rl_line_buffer);
|
char *result = muc_autocomplete(current, rl_line_buffer, FALSE);
|
||||||
if (result) {
|
if (result) {
|
||||||
rl_replace_line(result, 1);
|
rl_replace_line(result, 1);
|
||||||
rl_point = rl_end;
|
rl_point = rl_end;
|
||||||
@ -493,7 +512,35 @@ _inp_rl_tab_handler(int count, int key)
|
|||||||
}
|
}
|
||||||
} else if (strncmp(rl_line_buffer, "/", 1) == 0) {
|
} else if (strncmp(rl_line_buffer, "/", 1) == 0) {
|
||||||
ProfWin *window = wins_get_current();
|
ProfWin *window = wins_get_current();
|
||||||
char *result = cmd_ac_complete(window, rl_line_buffer);
|
char *result = cmd_ac_complete(window, rl_line_buffer, FALSE);
|
||||||
|
if (result) {
|
||||||
|
rl_replace_line(result, 1);
|
||||||
|
rl_point = rl_end;
|
||||||
|
free(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_inp_rl_shift_tab_handler(int count, int key)
|
||||||
|
{
|
||||||
|
if (rl_point != rl_end || !rl_line_buffer) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProfWin *current = wins_get_current();
|
||||||
|
if ((strncmp(rl_line_buffer, "/", 1) != 0) && (current->type == WIN_MUC)) {
|
||||||
|
char *result = muc_autocomplete(current, rl_line_buffer, TRUE);
|
||||||
|
if (result) {
|
||||||
|
rl_replace_line(result, 1);
|
||||||
|
rl_point = rl_end;
|
||||||
|
free(result);
|
||||||
|
}
|
||||||
|
} else if (strncmp(rl_line_buffer, "/", 1) == 0) {
|
||||||
|
ProfWin *window = wins_get_current();
|
||||||
|
char *result = cmd_ac_complete(window, rl_line_buffer, TRUE);
|
||||||
if (result) {
|
if (result) {
|
||||||
rl_replace_line(result, 1);
|
rl_replace_line(result, 1);
|
||||||
rl_point = rl_end;
|
rl_point = rl_end;
|
||||||
|
@ -138,13 +138,13 @@ rosterwin_roster(void)
|
|||||||
_rosterwin_contacts_by_presence(layout, "dnd", "Do not disturb");
|
_rosterwin_contacts_by_presence(layout, "dnd", "Do not disturb");
|
||||||
_rosterwin_contacts_by_presence(layout, "offline", "Offline");
|
_rosterwin_contacts_by_presence(layout, "offline", "Offline");
|
||||||
} else if (g_strcmp0(by, "group") == 0) {
|
} else if (g_strcmp0(by, "group") == 0) {
|
||||||
GSList *groups = roster_get_groups();
|
GList *groups = roster_get_groups();
|
||||||
GSList *curr_group = groups;
|
GList *curr_group = groups;
|
||||||
while (curr_group) {
|
while (curr_group) {
|
||||||
_rosterwin_contacts_by_group(layout, curr_group->data);
|
_rosterwin_contacts_by_group(layout, curr_group->data);
|
||||||
curr_group = g_slist_next(curr_group);
|
curr_group = g_list_next(curr_group);
|
||||||
}
|
}
|
||||||
g_slist_free_full(groups, free);
|
g_list_free_full(groups, free);
|
||||||
_rosterwin_contacts_by_group(layout, NULL);
|
_rosterwin_contacts_by_group(layout, NULL);
|
||||||
} else {
|
} else {
|
||||||
_rosterwin_contacts_all(layout);
|
_rosterwin_contacts_all(layout);
|
||||||
|
@ -459,6 +459,7 @@ _status_bar_draw(void)
|
|||||||
last_time = g_date_time_new_now(tz);
|
last_time = g_date_time_new_now(tz);
|
||||||
|
|
||||||
int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
|
int bracket_attrs = theme_attrs(THEME_STATUS_BRACKET);
|
||||||
|
int time_attrs = theme_attrs(THEME_STATUS_TIME);
|
||||||
|
|
||||||
char *time_pref = prefs_get_string(PREF_TIME_STATUSBAR);
|
char *time_pref = prefs_get_string(PREF_TIME_STATUSBAR);
|
||||||
if (g_strcmp0(time_pref, "off") != 0) {
|
if (g_strcmp0(time_pref, "off") != 0) {
|
||||||
@ -468,7 +469,9 @@ _status_bar_draw(void)
|
|||||||
wattron(status_bar, bracket_attrs);
|
wattron(status_bar, bracket_attrs);
|
||||||
mvwaddch(status_bar, 0, 1, '[');
|
mvwaddch(status_bar, 0, 1, '[');
|
||||||
wattroff(status_bar, bracket_attrs);
|
wattroff(status_bar, bracket_attrs);
|
||||||
|
wattron(status_bar, time_attrs);
|
||||||
mvwprintw(status_bar, 0, 2, date_fmt);
|
mvwprintw(status_bar, 0, 2, date_fmt);
|
||||||
|
wattroff(status_bar, time_attrs);
|
||||||
wattron(status_bar, bracket_attrs);
|
wattron(status_bar, bracket_attrs);
|
||||||
mvwaddch(status_bar, 0, 2 + len, ']');
|
mvwaddch(status_bar, 0, 2 + len, ']');
|
||||||
wattroff(status_bar, bracket_attrs);
|
wattroff(status_bar, bracket_attrs);
|
||||||
|
@ -278,7 +278,7 @@ void cons_show_incoming_room_message(const char *const nick, const char *const r
|
|||||||
gboolean mention, GList *triggers, int unread);
|
gboolean mention, GList *triggers, int unread);
|
||||||
void cons_show_incoming_message(const char *const short_from, const int win_index, int unread);
|
void cons_show_incoming_message(const char *const short_from, const int win_index, int unread);
|
||||||
void cons_show_incoming_private_message(const char *const nick, const char *const room, const int win_index, int unread);
|
void cons_show_incoming_private_message(const char *const nick, const char *const room, const int win_index, int unread);
|
||||||
void cons_show_room_invites(GSList *invites);
|
void cons_show_room_invites(GList *invites);
|
||||||
void cons_show_received_subs(void);
|
void cons_show_received_subs(void);
|
||||||
void cons_show_sent_subs(void);
|
void cons_show_sent_subs(void);
|
||||||
void cons_alert(void);
|
void cons_alert(void);
|
||||||
|
@ -1073,15 +1073,15 @@ wins_create_summary(gboolean unread)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
win_autocomplete(const char *const search_str)
|
win_autocomplete(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(wins_ac, search_str, TRUE);
|
return autocomplete_complete(wins_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
win_close_autocomplete(const char *const search_str)
|
win_close_autocomplete(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(wins_close_ac, search_str, TRUE);
|
return autocomplete_complete(wins_close_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -91,9 +91,9 @@ gboolean wins_swap(int source_win, int target_win);
|
|||||||
void wins_hide_subwin(ProfWin *window);
|
void wins_hide_subwin(ProfWin *window);
|
||||||
void wins_show_subwin(ProfWin *window);
|
void wins_show_subwin(ProfWin *window);
|
||||||
|
|
||||||
char* win_autocomplete(const char *const search_str);
|
char* win_autocomplete(const char *const search_str, gboolean previous);
|
||||||
void win_reset_search_attempts(void);
|
void win_reset_search_attempts(void);
|
||||||
char* win_close_autocomplete(const char *const search_str);
|
char* win_close_autocomplete(const char *const search_str, gboolean previous);
|
||||||
void win_close_reset_search_attempts(void);
|
void win_close_reset_search_attempts(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -92,9 +92,9 @@ blocked_list(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
blocked_ac_find(const char *const search_str)
|
blocked_ac_find(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(blocked_ac, search_str, TRUE);
|
return autocomplete_complete(blocked_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -212,9 +212,9 @@ bookmark_get_list(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
bookmark_find(const char *const search_str)
|
bookmark_find(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(bookmark_ac, search_str, TRUE);
|
return autocomplete_complete(bookmark_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -120,7 +120,7 @@ muc_invites_count(void)
|
|||||||
return autocomplete_length(invite_ac);
|
return autocomplete_length(invite_ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList*
|
GList*
|
||||||
muc_invites(void)
|
muc_invites(void)
|
||||||
{
|
{
|
||||||
return autocomplete_create_list(invite_ac);
|
return autocomplete_create_list(invite_ac);
|
||||||
@ -135,17 +135,17 @@ muc_invite_password(const char *const room)
|
|||||||
gboolean
|
gboolean
|
||||||
muc_invites_contain(const char *const room)
|
muc_invites_contain(const char *const room)
|
||||||
{
|
{
|
||||||
GSList *invites = autocomplete_create_list(invite_ac);
|
GList *invites = autocomplete_create_list(invite_ac);
|
||||||
GSList *curr = invites;
|
GList *curr = invites;
|
||||||
while (curr) {
|
while (curr) {
|
||||||
if (strcmp(curr->data, room) == 0) {
|
if (strcmp(curr->data, room) == 0) {
|
||||||
g_slist_free_full(invites, g_free);
|
g_list_free_full(invites, g_free);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
} else {
|
} else {
|
||||||
curr = g_slist_next(curr);
|
curr = g_list_next(curr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_slist_free_full(invites, g_free);
|
g_list_free_full(invites, g_free);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -157,9 +157,9 @@ muc_invites_reset_ac(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
muc_invites_find(const char *const search_str)
|
muc_invites_find(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(invite_ac, search_str, TRUE);
|
return autocomplete_complete(invite_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -663,7 +663,7 @@ muc_roster_nick_change_complete(const char *const room, const char *const nick)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
muc_autocomplete(ProfWin *window, const char *const input)
|
muc_autocomplete(ProfWin *window, const char *const input, gboolean previous)
|
||||||
{
|
{
|
||||||
if (window->type == WIN_MUC) {
|
if (window->type == WIN_MUC) {
|
||||||
ProfMucWin *mucwin = (ProfMucWin*)window;
|
ProfMucWin *mucwin = (ProfMucWin*)window;
|
||||||
@ -686,7 +686,7 @@ muc_autocomplete(ProfWin *window, const char *const input)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *result = autocomplete_complete(chat_room->nick_ac, search_str, FALSE);
|
char *result = autocomplete_complete(chat_room->nick_ac, search_str, FALSE, previous);
|
||||||
if (result) {
|
if (result) {
|
||||||
GString *replace_with = g_string_new(chat_room->autocomplete_prefix);
|
GString *replace_with = g_string_new(chat_room->autocomplete_prefix);
|
||||||
g_string_append(replace_with, result);
|
g_string_append(replace_with, result);
|
||||||
|
@ -120,10 +120,10 @@ char* muc_roster_nick_change_complete(const char *const room, const char *const
|
|||||||
void muc_invites_add(const char *const room, const char *const password);
|
void muc_invites_add(const char *const room, const char *const password);
|
||||||
void muc_invites_remove(const char *const room);
|
void muc_invites_remove(const char *const room);
|
||||||
gint muc_invites_count(void);
|
gint muc_invites_count(void);
|
||||||
GSList* muc_invites(void);
|
GList* muc_invites(void);
|
||||||
gboolean muc_invites_contain(const char *const room);
|
gboolean muc_invites_contain(const char *const room);
|
||||||
void muc_invites_reset_ac(void);
|
void muc_invites_reset_ac(void);
|
||||||
char* muc_invites_find(const char *const search_str);
|
char* muc_invites_find(const char *const search_str, gboolean previous);
|
||||||
void muc_invites_clear(void);
|
void muc_invites_clear(void);
|
||||||
char* muc_invite_password(const char *const room);
|
char* muc_invite_password(const char *const room);
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ char* muc_subject(const char *const room);
|
|||||||
void muc_pending_broadcasts_add(const char *const room, const char *const message);
|
void muc_pending_broadcasts_add(const char *const room, const char *const message);
|
||||||
GList* muc_pending_broadcasts(const char *const room);
|
GList* muc_pending_broadcasts(const char *const room);
|
||||||
|
|
||||||
char* muc_autocomplete(ProfWin *window, const char *const input);
|
char* muc_autocomplete(ProfWin *window, const char *const input, gboolean previous);
|
||||||
void muc_autocomplete_reset(const char *const room);
|
void muc_autocomplete_reset(const char *const room);
|
||||||
|
|
||||||
gboolean muc_requires_config(const char *const room);
|
gboolean muc_requires_config(const char *const room);
|
||||||
|
@ -141,7 +141,7 @@ presence_subscription(const char *const jid, const jabber_subscr_t action)
|
|||||||
xmpp_stanza_release(presence);
|
xmpp_stanza_release(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList*
|
GList*
|
||||||
presence_get_subscription_requests(void)
|
presence_get_subscription_requests(void)
|
||||||
{
|
{
|
||||||
return autocomplete_create_list(sub_requests_ac);
|
return autocomplete_create_list(sub_requests_ac);
|
||||||
@ -160,9 +160,9 @@ presence_clear_sub_requests(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
presence_sub_request_find(const char *const search_str)
|
presence_sub_request_find(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return autocomplete_complete(sub_requests_ac, search_str, TRUE);
|
return autocomplete_complete(sub_requests_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -170,16 +170,16 @@ presence_sub_request_exists(const char *const bare_jid)
|
|||||||
{
|
{
|
||||||
gboolean result = FALSE;
|
gboolean result = FALSE;
|
||||||
|
|
||||||
GSList *requests = autocomplete_create_list(sub_requests_ac);
|
GList *requests = autocomplete_create_list(sub_requests_ac);
|
||||||
GSList *curr = requests;
|
GList *curr = requests;
|
||||||
while (curr) {
|
while (curr) {
|
||||||
if (strcmp(curr->data, bare_jid) == 0) {
|
if (strcmp(curr->data, bare_jid) == 0) {
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
curr = g_slist_next(curr);
|
curr = g_list_next(curr);
|
||||||
}
|
}
|
||||||
g_slist_free_full(requests, free);
|
g_list_free_full(requests, free);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -472,19 +472,19 @@ roster_has_pending_subscriptions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
roster_contact_autocomplete(const char *const search_str)
|
roster_contact_autocomplete(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
assert(roster != NULL);
|
assert(roster != NULL);
|
||||||
|
|
||||||
return autocomplete_complete(roster->name_ac, search_str, TRUE);
|
return autocomplete_complete(roster->name_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
roster_fulljid_autocomplete(const char *const search_str)
|
roster_fulljid_autocomplete(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
assert(roster != NULL);
|
assert(roster != NULL);
|
||||||
|
|
||||||
return autocomplete_complete(roster->fulljid_ac, search_str, TRUE);
|
return autocomplete_complete(roster->fulljid_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList*
|
GSList*
|
||||||
@ -526,7 +526,7 @@ roster_get_group(const char *const group, roster_ord_t order)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList*
|
GList*
|
||||||
roster_get_groups(void)
|
roster_get_groups(void)
|
||||||
{
|
{
|
||||||
assert(roster != NULL);
|
assert(roster != NULL);
|
||||||
@ -535,19 +535,19 @@ roster_get_groups(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
roster_group_autocomplete(const char *const search_str)
|
roster_group_autocomplete(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
assert(roster != NULL);
|
assert(roster != NULL);
|
||||||
|
|
||||||
return autocomplete_complete(roster->groups_ac, search_str, TRUE);
|
return autocomplete_complete(roster->groups_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
roster_barejid_autocomplete(const char *const search_str)
|
roster_barejid_autocomplete(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
assert(roster != NULL);
|
assert(roster != NULL);
|
||||||
|
|
||||||
return autocomplete_complete(roster->barejid_ac, search_str, TRUE);
|
return autocomplete_complete(roster->barejid_ac, search_str, TRUE, previous);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -62,12 +62,12 @@ char* roster_barejid_from_name(const char *const name);
|
|||||||
GSList* roster_get_contacts(roster_ord_t order);
|
GSList* roster_get_contacts(roster_ord_t order);
|
||||||
GSList* roster_get_contacts_online(void);
|
GSList* roster_get_contacts_online(void);
|
||||||
gboolean roster_has_pending_subscriptions(void);
|
gboolean roster_has_pending_subscriptions(void);
|
||||||
char* roster_contact_autocomplete(const char *const search_str);
|
char* roster_contact_autocomplete(const char *const search_str, gboolean previous);
|
||||||
char* roster_fulljid_autocomplete(const char *const search_str);
|
char* roster_fulljid_autocomplete(const char *const search_str, gboolean previous);
|
||||||
GSList* roster_get_group(const char *const group, roster_ord_t order);
|
GSList* roster_get_group(const char *const group, roster_ord_t order);
|
||||||
GSList* roster_get_groups(void);
|
GList* roster_get_groups(void);
|
||||||
char* roster_group_autocomplete(const char *const search_str);
|
char* roster_group_autocomplete(const char *const search_str, gboolean previous);
|
||||||
char* roster_barejid_autocomplete(const char *const search_str);
|
char* roster_barejid_autocomplete(const char *const search_str, gboolean previous);
|
||||||
GSList* roster_get_contacts_by_presence(const char *const presence);
|
GSList* roster_get_contacts_by_presence(const char *const presence);
|
||||||
char* roster_get_msg_display_name(const char *const barejid, const char *const resource);
|
char* roster_get_msg_display_name(const char *const barejid, const char *const resource);
|
||||||
|
|
||||||
|
@ -147,10 +147,10 @@ void message_send_gone(const char *const jid);
|
|||||||
void message_send_invite(const char *const room, const char *const contact, const char *const reason);
|
void message_send_invite(const char *const room, const char *const contact, const char *const reason);
|
||||||
|
|
||||||
void presence_subscription(const char *const jid, const jabber_subscr_t action);
|
void presence_subscription(const char *const jid, const jabber_subscr_t action);
|
||||||
GSList* presence_get_subscription_requests(void);
|
GList* presence_get_subscription_requests(void);
|
||||||
gint presence_sub_request_count(void);
|
gint presence_sub_request_count(void);
|
||||||
void presence_reset_sub_request_search(void);
|
void presence_reset_sub_request_search(void);
|
||||||
char* presence_sub_request_find(const char *const search_str);
|
char* presence_sub_request_find(const char *const search_str, gboolean previous);
|
||||||
void presence_join_room(const char *const room, const char *const nick, const char *const passwd);
|
void presence_join_room(const char *const room, const char *const nick, const char *const passwd);
|
||||||
void presence_change_room_nick(const char *const room, const char *const nick);
|
void presence_change_room_nick(const char *const room, const char *const nick);
|
||||||
void presence_leave_chat_room(const char *const room_jid);
|
void presence_leave_chat_room(const char *const room_jid);
|
||||||
@ -194,7 +194,7 @@ gboolean bookmark_update(const char *jid, const char *nick, const char *password
|
|||||||
gboolean bookmark_remove(const char *jid);
|
gboolean bookmark_remove(const char *jid);
|
||||||
gboolean bookmark_join(const char *jid);
|
gboolean bookmark_join(const char *jid);
|
||||||
GList* bookmark_get_list(void);
|
GList* bookmark_get_list(void);
|
||||||
char* bookmark_find(const char *const search_str);
|
char* bookmark_find(const char *const search_str, gboolean previous);
|
||||||
void bookmark_autocomplete_reset(void);
|
void bookmark_autocomplete_reset(void);
|
||||||
gboolean bookmark_exists(const char *const room);
|
gboolean bookmark_exists(const char *const room);
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ void roster_send_remove(const char *const barejid);
|
|||||||
GList* blocked_list(void);
|
GList* blocked_list(void);
|
||||||
gboolean blocked_add(char *jid);
|
gboolean blocked_add(char *jid);
|
||||||
gboolean blocked_remove(char *jid);
|
gboolean blocked_remove(char *jid);
|
||||||
char* blocked_ac_find(const char *const search_str);
|
char* blocked_ac_find(const char *const search_str, gboolean previous);
|
||||||
void blocked_ac_reset(void);
|
void blocked_ac_reset(void);
|
||||||
|
|
||||||
void form_destroy(DataForm *form);
|
void form_destroy(DataForm *form);
|
||||||
|
@ -56,7 +56,7 @@ void p_gpg_free_keys(GHashTable *keys) {}
|
|||||||
|
|
||||||
void p_gpg_autocomplete_key_reset(void) {}
|
void p_gpg_autocomplete_key_reset(void) {}
|
||||||
|
|
||||||
char * p_gpg_autocomplete_key(const char * const search_str)
|
char * p_gpg_autocomplete_key(const char * const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ void reset_after_create(void **state)
|
|||||||
void find_after_create(void **state)
|
void find_after_create(void **state)
|
||||||
{
|
{
|
||||||
Autocomplete ac = autocomplete_new();
|
Autocomplete ac = autocomplete_new();
|
||||||
autocomplete_complete(ac, "hello", TRUE);
|
autocomplete_complete(ac, "hello", TRUE, FALSE);
|
||||||
autocomplete_clear(ac);
|
autocomplete_clear(ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ void add_one_and_complete(void **state)
|
|||||||
{
|
{
|
||||||
Autocomplete ac = autocomplete_new();
|
Autocomplete ac = autocomplete_new();
|
||||||
autocomplete_add(ac, "Hello");
|
autocomplete_add(ac, "Hello");
|
||||||
char *result = autocomplete_complete(ac, "Hel", TRUE);
|
char *result = autocomplete_complete(ac, "Hel", TRUE, FALSE);
|
||||||
|
|
||||||
assert_string_equal("Hello", result);
|
assert_string_equal("Hello", result);
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ void add_two_and_complete_returns_first(void **state)
|
|||||||
Autocomplete ac = autocomplete_new();
|
Autocomplete ac = autocomplete_new();
|
||||||
autocomplete_add(ac, "Hello");
|
autocomplete_add(ac, "Hello");
|
||||||
autocomplete_add(ac, "Help");
|
autocomplete_add(ac, "Help");
|
||||||
char *result = autocomplete_complete(ac, "Hel", TRUE);
|
char *result = autocomplete_complete(ac, "Hel", TRUE, FALSE);
|
||||||
|
|
||||||
assert_string_equal("Hello", result);
|
assert_string_equal("Hello", result);
|
||||||
|
|
||||||
@ -67,8 +67,8 @@ void add_two_and_complete_returns_second(void **state)
|
|||||||
Autocomplete ac = autocomplete_new();
|
Autocomplete ac = autocomplete_new();
|
||||||
autocomplete_add(ac, "Hello");
|
autocomplete_add(ac, "Hello");
|
||||||
autocomplete_add(ac, "Help");
|
autocomplete_add(ac, "Help");
|
||||||
char *result1 = autocomplete_complete(ac, "Hel", TRUE);
|
char *result1 = autocomplete_complete(ac, "Hel", TRUE, FALSE);
|
||||||
char *result2 = autocomplete_complete(ac, result1, TRUE);
|
char *result2 = autocomplete_complete(ac, result1, TRUE, FALSE);
|
||||||
|
|
||||||
assert_string_equal("Help", result2);
|
assert_string_equal("Help", result2);
|
||||||
|
|
||||||
@ -117,3 +117,84 @@ void add_two_same_updates(void **state)
|
|||||||
autocomplete_clear(ac);
|
autocomplete_clear(ac);
|
||||||
g_slist_free_full(result, g_free);
|
g_slist_free_full(result, g_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void complete_accented_with_accented(void **state)
|
||||||
|
{
|
||||||
|
Autocomplete ac = autocomplete_new();
|
||||||
|
autocomplete_add(ac, "èâîô");
|
||||||
|
|
||||||
|
char *result = autocomplete_complete(ac, "èâ", TRUE, FALSE);
|
||||||
|
|
||||||
|
assert_string_equal("èâîô", result);
|
||||||
|
|
||||||
|
autocomplete_clear(ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
void complete_accented_with_base(void **state)
|
||||||
|
{
|
||||||
|
Autocomplete ac = autocomplete_new();
|
||||||
|
autocomplete_add(ac, "èâîô");
|
||||||
|
|
||||||
|
char *result = autocomplete_complete(ac, "ea", TRUE, FALSE);
|
||||||
|
|
||||||
|
assert_string_equal("èâîô", result);
|
||||||
|
|
||||||
|
autocomplete_clear(ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
void complete_both_with_accented(void **state)
|
||||||
|
{
|
||||||
|
Autocomplete ac = autocomplete_new();
|
||||||
|
autocomplete_add(ac, "eaooooo");
|
||||||
|
autocomplete_add(ac, "èâîô");
|
||||||
|
|
||||||
|
char *result1 = autocomplete_complete(ac, "èâ", TRUE, FALSE);
|
||||||
|
char *result2 = autocomplete_complete(ac, result1, TRUE, FALSE);
|
||||||
|
|
||||||
|
assert_string_equal("èâîô", result2);
|
||||||
|
|
||||||
|
autocomplete_clear(ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
void complete_both_with_base(void **state)
|
||||||
|
{
|
||||||
|
Autocomplete ac = autocomplete_new();
|
||||||
|
autocomplete_add(ac, "eaooooo");
|
||||||
|
autocomplete_add(ac, "èâîô");
|
||||||
|
|
||||||
|
char *result1 = autocomplete_complete(ac, "ea", TRUE, FALSE);
|
||||||
|
char *result2 = autocomplete_complete(ac, result1, TRUE, FALSE);
|
||||||
|
|
||||||
|
assert_string_equal("èâîô", result2);
|
||||||
|
|
||||||
|
autocomplete_clear(ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
void complete_ignores_case(void **state)
|
||||||
|
{
|
||||||
|
Autocomplete ac = autocomplete_new();
|
||||||
|
autocomplete_add(ac, "MyBuddy");
|
||||||
|
|
||||||
|
char *result = autocomplete_complete(ac, "myb", TRUE, FALSE);
|
||||||
|
|
||||||
|
assert_string_equal("MyBuddy", result);
|
||||||
|
|
||||||
|
autocomplete_clear(ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
void complete_previous(void **state)
|
||||||
|
{
|
||||||
|
Autocomplete ac = autocomplete_new();
|
||||||
|
autocomplete_add(ac, "MyBuddy1");
|
||||||
|
autocomplete_add(ac, "MyBuddy2");
|
||||||
|
autocomplete_add(ac, "MyBuddy3");
|
||||||
|
|
||||||
|
char *result1 = autocomplete_complete(ac, "myb", TRUE, FALSE);
|
||||||
|
char *result2 = autocomplete_complete(ac, result1, TRUE, FALSE);
|
||||||
|
char *result3 = autocomplete_complete(ac, result2, TRUE, FALSE);
|
||||||
|
char *result4 = autocomplete_complete(ac, result3, TRUE, TRUE);
|
||||||
|
|
||||||
|
assert_string_equal("MyBuddy2", result4);
|
||||||
|
|
||||||
|
autocomplete_clear(ac);
|
||||||
|
}
|
||||||
|
@ -8,3 +8,9 @@ void add_two_and_complete_returns_second(void **state);
|
|||||||
void add_two_adds_two(void **state);
|
void add_two_adds_two(void **state);
|
||||||
void add_two_same_adds_one(void **state);
|
void add_two_same_adds_one(void **state);
|
||||||
void add_two_same_updates(void **state);
|
void add_two_same_updates(void **state);
|
||||||
|
void complete_accented_with_accented(void **state);
|
||||||
|
void complete_accented_with_base(void **state);
|
||||||
|
void complete_both_with_accented(void **state);
|
||||||
|
void complete_both_with_base(void **state);
|
||||||
|
void complete_ignores_case(void **state);
|
||||||
|
void complete_previous(void **state);
|
||||||
|
@ -158,7 +158,7 @@ void find_first_exists(void **state)
|
|||||||
|
|
||||||
char *search = strdup("B");
|
char *search = strdup("B");
|
||||||
|
|
||||||
char *result = roster_contact_autocomplete(search);
|
char *result = roster_contact_autocomplete(search, FALSE);
|
||||||
assert_string_equal("Bob", result);
|
assert_string_equal("Bob", result);
|
||||||
free(result);
|
free(result);
|
||||||
free(search);
|
free(search);
|
||||||
@ -172,7 +172,7 @@ void find_second_exists(void **state)
|
|||||||
roster_add("Dave", NULL, NULL, NULL, FALSE);
|
roster_add("Dave", NULL, NULL, NULL, FALSE);
|
||||||
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
||||||
|
|
||||||
char *result = roster_contact_autocomplete("Dav");
|
char *result = roster_contact_autocomplete("Dav", FALSE);
|
||||||
assert_string_equal("Dave", result);
|
assert_string_equal("Dave", result);
|
||||||
free(result);
|
free(result);
|
||||||
roster_destroy();
|
roster_destroy();
|
||||||
@ -185,7 +185,7 @@ void find_third_exists(void **state)
|
|||||||
roster_add("Dave", NULL, NULL, NULL, FALSE);
|
roster_add("Dave", NULL, NULL, NULL, FALSE);
|
||||||
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
||||||
|
|
||||||
char *result = roster_contact_autocomplete("Ja");
|
char *result = roster_contact_autocomplete("Ja", FALSE);
|
||||||
assert_string_equal("James", result);
|
assert_string_equal("James", result);
|
||||||
free(result);
|
free(result);
|
||||||
roster_destroy();
|
roster_destroy();
|
||||||
@ -198,7 +198,7 @@ void find_returns_null(void **state)
|
|||||||
roster_add("Dave", NULL, NULL, NULL, FALSE);
|
roster_add("Dave", NULL, NULL, NULL, FALSE);
|
||||||
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
||||||
|
|
||||||
char *result = roster_contact_autocomplete("Mike");
|
char *result = roster_contact_autocomplete("Mike", FALSE);
|
||||||
assert_null(result);
|
assert_null(result);
|
||||||
roster_destroy();
|
roster_destroy();
|
||||||
}
|
}
|
||||||
@ -206,7 +206,7 @@ void find_returns_null(void **state)
|
|||||||
void find_on_empty_returns_null(void **state)
|
void find_on_empty_returns_null(void **state)
|
||||||
{
|
{
|
||||||
roster_create();
|
roster_create();
|
||||||
char *result = roster_contact_autocomplete("James");
|
char *result = roster_contact_autocomplete("James", FALSE);
|
||||||
assert_null(result);
|
assert_null(result);
|
||||||
roster_destroy();
|
roster_destroy();
|
||||||
}
|
}
|
||||||
@ -218,8 +218,8 @@ void find_twice_returns_second_when_two_match(void **state)
|
|||||||
roster_add("Jamie", NULL, NULL, NULL, FALSE);
|
roster_add("Jamie", NULL, NULL, NULL, FALSE);
|
||||||
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
||||||
|
|
||||||
char *result1 = roster_contact_autocomplete("Jam");
|
char *result1 = roster_contact_autocomplete("Jam", FALSE);
|
||||||
char *result2 = roster_contact_autocomplete(result1);
|
char *result2 = roster_contact_autocomplete(result1, FALSE);
|
||||||
assert_string_equal("Jamie", result2);
|
assert_string_equal("Jamie", result2);
|
||||||
free(result1);
|
free(result1);
|
||||||
free(result2);
|
free(result2);
|
||||||
@ -240,11 +240,11 @@ void find_five_times_finds_fifth(void **state)
|
|||||||
roster_add("Jamy", NULL, NULL, NULL, FALSE);
|
roster_add("Jamy", NULL, NULL, NULL, FALSE);
|
||||||
roster_add("Jamz", NULL, NULL, NULL, FALSE);
|
roster_add("Jamz", NULL, NULL, NULL, FALSE);
|
||||||
|
|
||||||
char *result1 = roster_contact_autocomplete("Jam");
|
char *result1 = roster_contact_autocomplete("Jam", FALSE);
|
||||||
char *result2 = roster_contact_autocomplete(result1);
|
char *result2 = roster_contact_autocomplete(result1, FALSE);
|
||||||
char *result3 = roster_contact_autocomplete(result2);
|
char *result3 = roster_contact_autocomplete(result2, FALSE);
|
||||||
char *result4 = roster_contact_autocomplete(result3);
|
char *result4 = roster_contact_autocomplete(result3, FALSE);
|
||||||
char *result5 = roster_contact_autocomplete(result4);
|
char *result5 = roster_contact_autocomplete(result4, FALSE);
|
||||||
assert_string_equal("Jamo", result5);
|
assert_string_equal("Jamo", result5);
|
||||||
free(result1);
|
free(result1);
|
||||||
free(result2);
|
free(result2);
|
||||||
@ -261,9 +261,9 @@ void find_twice_returns_first_when_two_match_and_reset(void **state)
|
|||||||
roster_add("Jamie", NULL, NULL, NULL, FALSE);
|
roster_add("Jamie", NULL, NULL, NULL, FALSE);
|
||||||
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
roster_add("Bob", NULL, NULL, NULL, FALSE);
|
||||||
|
|
||||||
char *result1 = roster_contact_autocomplete("Jam");
|
char *result1 = roster_contact_autocomplete("Jam", FALSE);
|
||||||
roster_reset_search_attempts();
|
roster_reset_search_attempts();
|
||||||
char *result2 = roster_contact_autocomplete(result1);
|
char *result2 = roster_contact_autocomplete(result1, FALSE);
|
||||||
assert_string_equal("James", result2);
|
assert_string_equal("James", result2);
|
||||||
free(result1);
|
free(result1);
|
||||||
free(result2);
|
free(result2);
|
||||||
|
@ -408,7 +408,7 @@ void cons_check_version(gboolean not_available_msg) {}
|
|||||||
void cons_show_typing(const char * const barejid) {}
|
void cons_show_typing(const char * const barejid) {}
|
||||||
void cons_show_incoming_room_message(const char *const nick, const char *const room, const int win_index, gboolean mention, GList *triggers, int unread) {}
|
void cons_show_incoming_room_message(const char *const nick, const char *const room, const int win_index, gboolean mention, GList *triggers, int unread) {}
|
||||||
void cons_show_incoming_message(const char * const short_from, const int win_index, int unread) {}
|
void cons_show_incoming_message(const char * const short_from, const int win_index, int unread) {}
|
||||||
void cons_show_room_invites(GSList *invites) {}
|
void cons_show_room_invites(GList *invites) {}
|
||||||
void cons_show_received_subs(void) {}
|
void cons_show_received_subs(void) {}
|
||||||
void cons_show_sent_subs(void) {}
|
void cons_show_sent_subs(void) {}
|
||||||
void cons_alert(void) {}
|
void cons_alert(void) {}
|
||||||
|
@ -6,7 +6,9 @@
|
|||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
#include <cmocka.h>
|
#include <cmocka.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <langinfo.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "xmpp/chat_session.h"
|
#include "xmpp/chat_session.h"
|
||||||
@ -38,7 +40,21 @@
|
|||||||
#include "test_plugins_disco.h"
|
#include "test_plugins_disco.h"
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "en_GB.UTF-8");
|
||||||
|
char *codeset = nl_langinfo(CODESET);
|
||||||
|
char *lang = getenv("LANG");
|
||||||
|
|
||||||
|
printf("Charset information:\n");
|
||||||
|
|
||||||
|
if (lang) {
|
||||||
|
printf(" LANG: %s\n", lang);
|
||||||
|
}
|
||||||
|
if (codeset) {
|
||||||
|
printf(" CODESET: %s\n", codeset);
|
||||||
|
}
|
||||||
|
printf(" MB_CUR_MAX: %d\n", MB_CUR_MAX);
|
||||||
|
printf(" MB_LEN_MAX: %d\n", MB_LEN_MAX);
|
||||||
|
|
||||||
const UnitTest all_tests[] = {
|
const UnitTest all_tests[] = {
|
||||||
|
|
||||||
unit_test(replace_one_substr),
|
unit_test(replace_one_substr),
|
||||||
@ -90,6 +106,12 @@ int main(int argc, char* argv[]) {
|
|||||||
unit_test(add_two_adds_two),
|
unit_test(add_two_adds_two),
|
||||||
unit_test(add_two_same_adds_one),
|
unit_test(add_two_same_adds_one),
|
||||||
unit_test(add_two_same_updates),
|
unit_test(add_two_same_updates),
|
||||||
|
unit_test(complete_accented_with_accented),
|
||||||
|
unit_test(complete_accented_with_base),
|
||||||
|
unit_test(complete_both_with_accented),
|
||||||
|
unit_test(complete_both_with_base),
|
||||||
|
unit_test(complete_ignores_case),
|
||||||
|
unit_test(complete_previous),
|
||||||
|
|
||||||
unit_test(create_jid_from_null_returns_null),
|
unit_test(create_jid_from_null_returns_null),
|
||||||
unit_test(create_jid_from_empty_string_returns_null),
|
unit_test(create_jid_from_empty_string_returns_null),
|
||||||
|
@ -128,7 +128,7 @@ void message_send_invite(const char * const room, const char * const contact,
|
|||||||
// presence functions
|
// presence functions
|
||||||
void presence_subscription(const char * const jid, const jabber_subscr_t action) {}
|
void presence_subscription(const char * const jid, const jabber_subscr_t action) {}
|
||||||
|
|
||||||
GSList* presence_get_subscription_requests(void)
|
GList* presence_get_subscription_requests(void)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -140,7 +140,7 @@ gint presence_sub_request_count(void)
|
|||||||
|
|
||||||
void presence_reset_sub_request_search(void) {}
|
void presence_reset_sub_request_search(void) {}
|
||||||
|
|
||||||
char * presence_sub_request_find(const char * const search_str)
|
char * presence_sub_request_find(const char * const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -250,7 +250,7 @@ GList * bookmark_get_list(void)
|
|||||||
return (GList *)mock();
|
return (GList *)mock();
|
||||||
}
|
}
|
||||||
|
|
||||||
char * bookmark_find(const char * const search_str)
|
char * bookmark_find(const char * const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -298,7 +298,7 @@ gboolean blocked_remove(char *jid)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* blocked_ac_find(const char *const search_str)
|
char* blocked_ac_find(const char *const search_str, gboolean previous)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user