mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
Refactor autocompleters
This commit is contained in:
parent
f72e7d89b8
commit
af95c82fe7
@ -45,8 +45,6 @@
|
|||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
#include "xmpp/xmpp.h"
|
#include "xmpp/xmpp.h"
|
||||||
|
|
||||||
typedef char*(*autocomplete_func)(char *);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command structure
|
* Command structure
|
||||||
*
|
*
|
||||||
@ -73,19 +71,16 @@ static gboolean _cmd_set_boolean_preference(gchar *arg, struct cmd_help_t help,
|
|||||||
const char * const display, preference_t pref);
|
const char * const display, preference_t pref);
|
||||||
|
|
||||||
static void _cmd_complete_parameters(char *input, int *size);
|
static void _cmd_complete_parameters(char *input, int *size);
|
||||||
static void _sub_autocomplete(char *input, int *size);
|
|
||||||
static void _notify_autocomplete(char *input, int *size);
|
static char * _sub_autocomplete(char *input, int *size);
|
||||||
static void _titlebar_autocomplete(char *input, int *size);
|
static char * _notify_autocomplete(char *input, int *size);
|
||||||
static void _theme_autocomplete(char *input, int *size);
|
static char * _titlebar_autocomplete(char *input, int *size);
|
||||||
static void _autoaway_autocomplete(char *input, int *size);
|
static char * _theme_autocomplete(char *input, int *size);
|
||||||
static void _account_autocomplete(char *input, int *size);
|
static char * _autoaway_autocomplete(char *input, int *size);
|
||||||
static void _who_autocomplete(char *input, int *size);
|
static char * _account_autocomplete(char *input, int *size);
|
||||||
static void _roster_autocomplete(char *input, int *size);
|
static char * _who_autocomplete(char *input, int *size);
|
||||||
static void _group_autocomplete(char *input, int *size);
|
static char * _roster_autocomplete(char *input, int *size);
|
||||||
static void _parameter_autocomplete(char *input, int *size, char *command,
|
static char * _group_autocomplete(char *input, int *size);
|
||||||
autocomplete_func func);
|
|
||||||
static void _parameter_autocomplete_with_ac(char *input, int *size, char *command,
|
|
||||||
Autocomplete ac);
|
|
||||||
|
|
||||||
static int _strtoi(char *str, int *saveptr, int min, int max);
|
static int _strtoi(char *str, int *saveptr, int min, int max);
|
||||||
|
|
||||||
@ -1217,76 +1212,159 @@ cmd_execute_default(const char * const inp)
|
|||||||
static void
|
static void
|
||||||
_cmd_complete_parameters(char *input, int *size)
|
_cmd_complete_parameters(char *input, int *size)
|
||||||
{
|
{
|
||||||
_parameter_autocomplete(input, size, "/beep",
|
int i;
|
||||||
prefs_autocomplete_boolean_choice);
|
char *result = NULL;
|
||||||
_parameter_autocomplete(input, size, "/intype",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/states",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/outtype",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/flash",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/splash",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/chlog",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/grlog",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/mouse",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/history",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/vercheck",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
_parameter_autocomplete(input, size, "/statuses",
|
|
||||||
prefs_autocomplete_boolean_choice);
|
|
||||||
|
|
||||||
|
// autocomplete boolean settings
|
||||||
|
gchar *boolean_choices[] = { "/beep", "/intype", "/states", "/outtype",
|
||||||
|
"/flash", "/splash", "/chlog", "/grlog", "/mouse", "/history",
|
||||||
|
"/vercheck", "/statuses" };
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(boolean_choices); i++) {
|
||||||
|
result = autocomplete_param_with_func(input, size, boolean_choices[i],
|
||||||
|
prefs_autocomplete_boolean_choice);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// autocomplete nickname in chat rooms
|
||||||
if (ui_current_win_type() == WIN_MUC) {
|
if (ui_current_win_type() == WIN_MUC) {
|
||||||
Autocomplete nick_ac = muc_get_roster_ac(ui_current_recipient());
|
Autocomplete nick_ac = muc_get_roster_ac(ui_current_recipient());
|
||||||
if (nick_ac != NULL) {
|
if (nick_ac != NULL) {
|
||||||
_parameter_autocomplete_with_ac(input, size, "/msg", nick_ac);
|
gchar *nick_choices[] = { "/msg", "/info", "/caps", "/status", "/software" } ;
|
||||||
_parameter_autocomplete_with_ac(input, size, "/info", nick_ac);
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/caps", nick_ac);
|
for (i = 0; i < ARRAY_SIZE(nick_choices); i++) {
|
||||||
_parameter_autocomplete_with_ac(input, size, "/status", nick_ac);
|
result = autocomplete_param_with_ac(input, size, nick_choices[i],
|
||||||
_parameter_autocomplete_with_ac(input, size, "/software", nick_ac);
|
nick_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise autocomple using roster
|
||||||
} else {
|
} else {
|
||||||
_parameter_autocomplete(input, size, "/msg",
|
gchar *contact_choices[] = { "/msg", "/info", "/status" };
|
||||||
|
for (i = 0; i < ARRAY_SIZE(contact_choices); i++) {
|
||||||
|
result = autocomplete_param_with_func(input, size, contact_choices[i],
|
||||||
roster_find_contact);
|
roster_find_contact);
|
||||||
_parameter_autocomplete(input, size, "/info",
|
if (result != NULL) {
|
||||||
roster_find_contact);
|
inp_replace_input(input, result, size);
|
||||||
_parameter_autocomplete(input, size, "/caps",
|
g_free(result);
|
||||||
roster_find_resource);
|
return;
|
||||||
_parameter_autocomplete(input, size, "/status",
|
}
|
||||||
roster_find_contact);
|
|
||||||
_parameter_autocomplete(input, size, "/software",
|
|
||||||
roster_find_resource);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_parameter_autocomplete(input, size, "/invite", roster_find_contact);
|
gchar *resource_choices[] = { "/caps", "/software" };
|
||||||
_parameter_autocomplete(input, size, "/decline", muc_find_invite);
|
for (i = 0; i < ARRAY_SIZE(resource_choices); i++) {
|
||||||
_parameter_autocomplete(input, size, "/join", muc_find_invite);
|
result = autocomplete_param_with_func(input, size, resource_choices[i],
|
||||||
|
roster_find_resource);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = autocomplete_param_with_func(input, size, "/invite", roster_find_contact);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_parameter_autocomplete(input, size, "/connect",
|
gchar *invite_choices[] = { "/decline", "/join" };
|
||||||
accounts_find_enabled);
|
for (i = 0; i < ARRAY_SIZE(invite_choices); i++) {
|
||||||
_parameter_autocomplete_with_ac(input, size, "/help", help_ac);
|
result = autocomplete_param_with_func(input, size, invite_choices[i],
|
||||||
_parameter_autocomplete_with_ac(input, size, "/prefs", prefs_ac);
|
muc_find_invite);
|
||||||
_parameter_autocomplete_with_ac(input, size, "/log", log_ac);
|
if (result != NULL) {
|
||||||
_parameter_autocomplete_with_ac(input, size, "/disco", disco_ac);
|
inp_replace_input(input, result, size);
|
||||||
_parameter_autocomplete_with_ac(input, size, "/close", close_ac);
|
g_free(result);
|
||||||
_parameter_autocomplete_with_ac(input, size, "/wins", wins_ac);
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_who_autocomplete(input, size);
|
result = autocomplete_param_with_func(input, size, "/connect", accounts_find_enabled);
|
||||||
_sub_autocomplete(input, size);
|
if (result != NULL) {
|
||||||
_notify_autocomplete(input, size);
|
inp_replace_input(input, result, size);
|
||||||
_autoaway_autocomplete(input, size);
|
g_free(result);
|
||||||
_titlebar_autocomplete(input, size);
|
return;
|
||||||
_theme_autocomplete(input, size);
|
}
|
||||||
_account_autocomplete(input, size);
|
|
||||||
_roster_autocomplete(input, size);
|
gchar *commands[] = { "/help", "/prefs", "/log", "/disco", "/close", "/wins" };
|
||||||
_group_autocomplete(input, size);
|
Autocomplete completers[] = { help_ac, prefs_ac, log_ac, disco_ac, close_ac, wins_ac };
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(commands); i++) {
|
||||||
|
result = autocomplete_param_with_ac(input, size, commands[i], completers[i]);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = _who_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _sub_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _notify_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _autoaway_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _titlebar_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _theme_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _account_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _roster_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result = _group_autocomplete(input, size);
|
||||||
|
if (result != NULL) {
|
||||||
|
inp_replace_input(input, result, size);
|
||||||
|
g_free(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The command functions
|
// The command functions
|
||||||
@ -3411,285 +3489,161 @@ _cmd_get_command(const char * const command)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_parameter_autocomplete(char *input, int *size, char *command,
|
|
||||||
autocomplete_func func)
|
|
||||||
{
|
|
||||||
char *found = NULL;
|
|
||||||
char *auto_msg = NULL;
|
|
||||||
char inp_cpy[*size];
|
|
||||||
int i;
|
|
||||||
char *command_cpy = malloc(strlen(command) + 2);
|
|
||||||
sprintf(command_cpy, "%s ", command);
|
|
||||||
int len = strlen(command_cpy);
|
|
||||||
if ((strncmp(input, command_cpy, len) == 0) && (*size > len)) {
|
|
||||||
for(i = len; i < *size; i++) {
|
|
||||||
inp_cpy[i-len] = input[i];
|
|
||||||
}
|
|
||||||
inp_cpy[(*size) - len] = '\0';
|
|
||||||
found = func(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((len + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, command_cpy);
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(command_cpy);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_parameter_autocomplete_with_ac(char *input, int *size, char *command,
|
|
||||||
Autocomplete ac)
|
|
||||||
{
|
|
||||||
char *found = NULL;
|
|
||||||
char *auto_msg = NULL;
|
|
||||||
char inp_cpy[*size];
|
|
||||||
int i;
|
|
||||||
char *command_cpy = malloc(strlen(command) + 2);
|
|
||||||
sprintf(command_cpy, "%s ", command);
|
|
||||||
int len = strlen(command_cpy);
|
|
||||||
if ((strncmp(input, command_cpy, len) == 0) && (*size > len)) {
|
|
||||||
for(i = len; i < *size; i++) {
|
|
||||||
inp_cpy[i-len] = input[i];
|
|
||||||
}
|
|
||||||
inp_cpy[(*size) - len] = '\0';
|
|
||||||
found = autocomplete_complete(ac, inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((len + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, command_cpy);
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(command_cpy);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_sub_autocomplete(char *input, int *size)
|
_sub_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
char *found = NULL;
|
char *result = NULL;
|
||||||
char *auto_msg = NULL;
|
result = autocomplete_param_with_func(input, size, "/sub allow", presence_sub_request_find);
|
||||||
char inp_cpy[*size];
|
if (result != NULL) {
|
||||||
int i;
|
return result;
|
||||||
|
}
|
||||||
|
result = autocomplete_param_with_func(input, size, "/sub deny", presence_sub_request_find);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/sub", sub_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
if ((strncmp(input, "/sub allow ", 11) == 0) && (*size > 11)) {
|
return NULL;
|
||||||
for (i = 11; i < *size; i++) {
|
|
||||||
inp_cpy[i-11] = input[i];
|
|
||||||
}
|
|
||||||
inp_cpy[(*size) - 11] = '\0';
|
|
||||||
found = presence_sub_request_find(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((11 + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, "/sub allow ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
} else if ((strncmp(input, "/sub deny ", 10) == 0) && (*size > 10)) {
|
|
||||||
for (i = 10; i < *size; i++) {
|
|
||||||
inp_cpy[i-10] = input[i];
|
|
||||||
}
|
|
||||||
inp_cpy[(*size) - 10] = '\0';
|
|
||||||
found = presence_sub_request_find(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((10 + (strlen(found) + 0)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, "/sub deny ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
} else if ((strncmp(input, "/sub ", 5) == 0) && (*size > 5)) {
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/sub", sub_ac);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_who_autocomplete(char *input, int *size)
|
_who_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
if ((strncmp(input, "/who any ", 9) == 0) && (*size > 9)) {
|
int i = 0;
|
||||||
_parameter_autocomplete(input, size, "/who any", roster_find_group);
|
char *result = NULL;
|
||||||
} else if ((strncmp(input, "/who online ", 12) == 0) && (*size > 12)) {
|
gchar *group_commands[] = { "/who any", "/who online", "/who offline",
|
||||||
_parameter_autocomplete(input, size, "/who online", roster_find_group);
|
"/who chat", "/who away", "/who xa", "/who dnd", "/who available",
|
||||||
} else if ((strncmp(input, "/who offline ", 13) == 0) && (*size > 13)) {
|
"/who unavailable" };
|
||||||
_parameter_autocomplete(input, size, "/who offline", roster_find_group);
|
|
||||||
} else if ((strncmp(input, "/who chat ", 10) == 0) && (*size > 10)) {
|
for (i = 0; i < ARRAY_SIZE(group_commands); i++) {
|
||||||
_parameter_autocomplete(input, size, "/who chat", roster_find_group);
|
result = autocomplete_param_with_func(input, size, group_commands[i], roster_find_group);
|
||||||
} else if ((strncmp(input, "/who away ", 10) == 0) && (*size > 10)) {
|
if (result != NULL) {
|
||||||
_parameter_autocomplete(input, size, "/who away", roster_find_group);
|
return result;
|
||||||
} else if ((strncmp(input, "/who xa ", 8) == 0) && (*size > 8)) {
|
|
||||||
_parameter_autocomplete(input, size, "/who xa", roster_find_group);
|
|
||||||
} else if ((strncmp(input, "/who dnd ", 9) == 0) && (*size > 9)) {
|
|
||||||
_parameter_autocomplete(input, size, "/who dnd", roster_find_group);
|
|
||||||
} else if ((strncmp(input, "/who available ", 15) == 0) && (*size > 15)) {
|
|
||||||
_parameter_autocomplete(input, size, "/who available", roster_find_group);
|
|
||||||
} else if ((strncmp(input, "/who unavailable ", 14) == 0) && (*size > 14)) {
|
|
||||||
_parameter_autocomplete(input, size, "/who unavailable", roster_find_group);
|
|
||||||
} else if ((strncmp(input, "/who ", 5) == 0) && (*size > 5)) {
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/who", who_ac);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/who", who_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_roster_autocomplete(char *input, int *size)
|
_roster_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
if ((strncmp(input, "/roster nick ", 13) == 0) && (*size > 13)) {
|
char *result = NULL;
|
||||||
_parameter_autocomplete(input, size, "/roster nick", roster_find_jid);
|
result = autocomplete_param_with_func(input, size, "/roster nick", roster_find_jid);
|
||||||
} else if ((strncmp(input, "/roster remove ", 15) == 0) && (*size > 15)) {
|
if (result != NULL) {
|
||||||
_parameter_autocomplete(input, size, "/roster remove", roster_find_jid);
|
return result;
|
||||||
} else if ((strncmp(input, "/roster ", 8) == 0) && (*size > 8)) {
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/roster", roster_ac);
|
|
||||||
}
|
}
|
||||||
|
result = autocomplete_param_with_func(input, size, "/roster remove", roster_find_jid);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/roster", roster_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_group_autocomplete(char *input, int *size)
|
_group_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
if ((strncmp(input, "/group show ", 12) == 0) && (*size > 12)) {
|
char *result = NULL;
|
||||||
_parameter_autocomplete(input, size, "/group show", roster_find_group);
|
result = autocomplete_param_with_func(input, size, "/group show", roster_find_group);
|
||||||
} else if ((strncmp(input, "/group add ", 11) == 0) && (*size > 11)) {
|
if (result != NULL) {
|
||||||
_parameter_autocomplete(input, size, "/group add", roster_find_group);
|
return result;
|
||||||
} else if ((strncmp(input, "/group remove ", 14) == 0) && (*size > 14)) {
|
|
||||||
_parameter_autocomplete(input, size, "/group remove", roster_find_group);
|
|
||||||
} else if ((strncmp(input, "/group ", 7) == 0) && (*size > 7)) {
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/group", group_ac);
|
|
||||||
}
|
}
|
||||||
|
result = autocomplete_param_with_func(input, size, "/group add", roster_find_group);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = autocomplete_param_with_func(input, size, "/group remove", roster_find_group);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/group", group_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_notify_autocomplete(char *input, int *size)
|
_notify_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
char *found = NULL;
|
int i = 0;
|
||||||
char *auto_msg = NULL;
|
char *result = NULL;
|
||||||
char inp_cpy[*size];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if ((strncmp(input, "/notify message ", 16) == 0) && (*size > 16)) {
|
gchar *boolean_choices[] = { "/notify message", "/notify typing",
|
||||||
for(i = 16; i < *size; i++) {
|
"/notify invite", "/notify sub" };
|
||||||
inp_cpy[i-16] = input[i];
|
for (i = 0; i < ARRAY_SIZE(boolean_choices); i++) {
|
||||||
|
result = autocomplete_param_with_func(input, size, boolean_choices[i],
|
||||||
|
prefs_autocomplete_boolean_choice);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
inp_cpy[(*size) - 16] = '\0';
|
|
||||||
found = prefs_autocomplete_boolean_choice(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((16 + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, "/notify message ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
}
|
||||||
} else if ((strncmp(input, "/notify typing ", 15) == 0) && (*size > 15)) {
|
|
||||||
for(i = 15; i < *size; i++) {
|
result = autocomplete_param_with_ac(input, size, "/notify", notify_ac);
|
||||||
inp_cpy[i-15] = input[i];
|
if (result != NULL) {
|
||||||
}
|
return result;
|
||||||
inp_cpy[(*size) - 15] = '\0';
|
|
||||||
found = prefs_autocomplete_boolean_choice(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((15 + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, "/notify typing ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
} else if ((strncmp(input, "/notify invite ", 15) == 0) && (*size > 15)) {
|
|
||||||
for(i = 15; i < *size; i++) {
|
|
||||||
inp_cpy[i-15] = input[i];
|
|
||||||
}
|
|
||||||
inp_cpy[(*size) - 15] = '\0';
|
|
||||||
found = prefs_autocomplete_boolean_choice(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((15 + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, "/notify invite ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
} else if ((strncmp(input, "/notify sub ", 12) == 0) && (*size > 12)) {
|
|
||||||
for(i = 12; i < *size; i++) {
|
|
||||||
inp_cpy[i-12] = input[i];
|
|
||||||
}
|
|
||||||
inp_cpy[(*size) - 12] = '\0';
|
|
||||||
found = prefs_autocomplete_boolean_choice(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((12 + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, "/notify sub ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
} else if ((strncmp(input, "/notify ", 8) == 0) && (*size > 8)) {
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/notify", notify_ac);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_titlebar_autocomplete(char *input, int *size)
|
_titlebar_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
char *found = NULL;
|
char *result = NULL;
|
||||||
char *auto_msg = NULL;
|
result = autocomplete_param_with_func(input, size, "/titlebar version",
|
||||||
char inp_cpy[*size];
|
prefs_autocomplete_boolean_choice);
|
||||||
int i;
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/titlebar", titlebar_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
if ((strncmp(input, "/titlebar version ", 18) == 0) && (*size > 18)) {
|
return NULL;
|
||||||
for(i = 18; i < *size; i++) {
|
|
||||||
inp_cpy[i-18] = input[i];
|
|
||||||
}
|
|
||||||
inp_cpy[(*size) - 18] = '\0';
|
|
||||||
found = prefs_autocomplete_boolean_choice(inp_cpy);
|
|
||||||
if (found != NULL) {
|
|
||||||
auto_msg = (char *) malloc((18 + (strlen(found) + 1)) * sizeof(char));
|
|
||||||
strcpy(auto_msg, "/titlebar version ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
|
||||||
} else if ((strncmp(input, "/titlebar ", 10) == 0) && (*size > 10)) {
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/titlebar", titlebar_ac);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_autoaway_autocomplete(char *input, int *size)
|
_autoaway_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
char *found = NULL;
|
char *result = NULL;
|
||||||
char *auto_msg = NULL;
|
|
||||||
char inp_cpy[*size];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if ((strncmp(input, "/autoaway mode ", 15) == 0) && (*size > 15)) {
|
result = autocomplete_param_with_ac(input, size, "/autoaway mode", autoaway_mode_ac);
|
||||||
_parameter_autocomplete_with_ac(input, size, "/autoaway mode", autoaway_mode_ac);
|
if (result != NULL) {
|
||||||
} else if ((strncmp(input, "/autoaway check ", 16) == 0) && (*size > 16)) {
|
return result;
|
||||||
for(i = 16; i < *size; i++) {
|
|
||||||
inp_cpy[i-16] = input[i];
|
|
||||||
}
|
}
|
||||||
inp_cpy[(*size) - 16] = '\0';
|
result = autocomplete_param_with_func(input, size, "/autoaway check",
|
||||||
found = prefs_autocomplete_boolean_choice(inp_cpy);
|
prefs_autocomplete_boolean_choice);
|
||||||
if (found != NULL) {
|
if (result != NULL) {
|
||||||
auto_msg = (char *) malloc((16 + (strlen(found) + 1)) * sizeof(char));
|
return result;
|
||||||
strcpy(auto_msg, "/autoaway check ");
|
|
||||||
strcat(auto_msg, found);
|
|
||||||
inp_replace_input(input, auto_msg, size);
|
|
||||||
free(auto_msg);
|
|
||||||
free(found);
|
|
||||||
}
|
}
|
||||||
} else if ((strncmp(input, "/autoaway ", 10) == 0) && (*size > 10)) {
|
result = autocomplete_param_with_ac(input, size, "/autoaway", autoaway_ac);
|
||||||
_parameter_autocomplete_with_ac(input, size, "/autoaway", autoaway_ac);
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_theme_autocomplete(char *input, int *size)
|
_theme_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
|
char *result = NULL;
|
||||||
if ((strncmp(input, "/theme set ", 11) == 0) && (*size > 11)) {
|
if ((strncmp(input, "/theme set ", 11) == 0) && (*size > 11)) {
|
||||||
if (theme_load_ac == NULL) {
|
if (theme_load_ac == NULL) {
|
||||||
theme_load_ac = autocomplete_new();
|
theme_load_ac = autocomplete_new();
|
||||||
@ -3701,28 +3655,41 @@ _theme_autocomplete(char *input, int *size)
|
|||||||
g_slist_free(themes);
|
g_slist_free(themes);
|
||||||
autocomplete_add(theme_load_ac, "default");
|
autocomplete_add(theme_load_ac, "default");
|
||||||
}
|
}
|
||||||
_parameter_autocomplete_with_ac(input, size, "/theme set", theme_load_ac);
|
result = autocomplete_param_with_ac(input, size, "/theme set", theme_load_ac);
|
||||||
} else if ((strncmp(input, "/theme ", 7) == 0) && (*size > 7)) {
|
if (result != NULL) {
|
||||||
_parameter_autocomplete_with_ac(input, size, "/theme", theme_ac);
|
return result;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/theme", theme_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static char *
|
||||||
_account_autocomplete(char *input, int *size)
|
_account_autocomplete(char *input, int *size)
|
||||||
{
|
{
|
||||||
if ((strncmp(input, "/account set ", 13) == 0) && (*size > 13)) {
|
char *result = NULL;
|
||||||
_parameter_autocomplete(input, size, "/account set", accounts_find_all);
|
int i = 0;
|
||||||
} else if ((strncmp(input, "/account show ", 14) == 0) && (*size > 14)) {
|
gchar *account_choice[] = { "/account set", "/account show", "/account enable",
|
||||||
_parameter_autocomplete(input, size, "/account show", accounts_find_all);
|
"/account disable", "/account rename" };
|
||||||
} else if ((strncmp(input, "/account enable ", 16) == 0) && (*size > 16)) {
|
|
||||||
_parameter_autocomplete(input, size, "/account enable", accounts_find_all);
|
for (i = 0; i < ARRAY_SIZE(account_choice); i++) {
|
||||||
} else if ((strncmp(input, "/account disable ", 17) == 0) && (*size > 17)) {
|
result = autocomplete_param_with_func(input, size, account_choice[i],
|
||||||
_parameter_autocomplete(input, size, "/account disable", accounts_find_all);
|
accounts_find_all);
|
||||||
} else if ((strncmp(input, "/account rename ", 16) == 0) && (*size > 16)) {
|
if (result != NULL) {
|
||||||
_parameter_autocomplete(input, size, "/account rename", accounts_find_all);
|
return result;
|
||||||
} else if ((strncmp(input, "/account ", 9) == 0) && (*size > 9)) {
|
|
||||||
_parameter_autocomplete_with_ac(input, size, "/account", account_ac);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/account", account_ac);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -201,6 +202,65 @@ autocomplete_complete(Autocomplete ac, gchar *search_str)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
autocomplete_param_with_func(char *input, int *size, char *command,
|
||||||
|
autocomplete_func func)
|
||||||
|
{
|
||||||
|
char *found = NULL;
|
||||||
|
char *auto_msg = NULL;
|
||||||
|
char inp_cpy[*size];
|
||||||
|
int i;
|
||||||
|
char *command_cpy = malloc(strlen(command) + 2);
|
||||||
|
sprintf(command_cpy, "%s ", command);
|
||||||
|
int len = strlen(command_cpy);
|
||||||
|
if ((strncmp(input, command_cpy, len) == 0) && (*size > len)) {
|
||||||
|
for(i = len; i < *size; i++) {
|
||||||
|
inp_cpy[i-len] = input[i];
|
||||||
|
}
|
||||||
|
inp_cpy[(*size) - len] = '\0';
|
||||||
|
found = func(inp_cpy);
|
||||||
|
if (found != NULL) {
|
||||||
|
auto_msg = (char *) malloc((len + (strlen(found) + 1)) * sizeof(char));
|
||||||
|
strcpy(auto_msg, command_cpy);
|
||||||
|
strcat(auto_msg, found);
|
||||||
|
free(found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(command_cpy);
|
||||||
|
|
||||||
|
return auto_msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
autocomplete_param_with_ac(char *input, int *size, char *command,
|
||||||
|
Autocomplete ac)
|
||||||
|
{
|
||||||
|
char *found = NULL;
|
||||||
|
char *auto_msg = NULL;
|
||||||
|
char inp_cpy[*size];
|
||||||
|
int i;
|
||||||
|
char *command_cpy = malloc(strlen(command) + 2);
|
||||||
|
sprintf(command_cpy, "%s ", command);
|
||||||
|
int len = strlen(command_cpy);
|
||||||
|
if ((strncmp(input, command_cpy, len) == 0) && (*size > len)) {
|
||||||
|
for(i = len; i < *size; i++) {
|
||||||
|
inp_cpy[i-len] = input[i];
|
||||||
|
}
|
||||||
|
inp_cpy[(*size) - len] = '\0';
|
||||||
|
found = autocomplete_complete(ac, inp_cpy);
|
||||||
|
if (found != NULL) {
|
||||||
|
auto_msg = (char *) malloc((len + (strlen(found) + 1)) * sizeof(char));
|
||||||
|
strcpy(auto_msg, command_cpy);
|
||||||
|
strcat(auto_msg, found);
|
||||||
|
free(found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(command_cpy);
|
||||||
|
|
||||||
|
return auto_msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
_search_from(Autocomplete ac, GSList *curr)
|
_search_from(Autocomplete ac, GSList *curr)
|
||||||
{
|
{
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
|
typedef char*(*autocomplete_func)(char *);
|
||||||
typedef struct autocomplete_t *Autocomplete;
|
typedef struct autocomplete_t *Autocomplete;
|
||||||
typedef const char * (*PStrFunc)(const void *obj);
|
typedef const char * (*PStrFunc)(const void *obj);
|
||||||
typedef void * (*PCopyFunc)(const void *obj);
|
typedef void * (*PCopyFunc)(const void *obj);
|
||||||
@ -42,5 +43,9 @@ gboolean autocomplete_remove(Autocomplete ac, const char * const item);
|
|||||||
GSList * autocomplete_get_list(Autocomplete ac);
|
GSList * autocomplete_get_list(Autocomplete ac);
|
||||||
gchar * autocomplete_complete(Autocomplete ac, gchar *search_str);
|
gchar * autocomplete_complete(Autocomplete ac, gchar *search_str);
|
||||||
gint autocomplete_length(Autocomplete ac);
|
gint autocomplete_length(Autocomplete ac);
|
||||||
|
char * autocomplete_param_with_func(char *input, int *size, char *command,
|
||||||
|
autocomplete_func func);
|
||||||
|
char * autocomplete_param_with_ac(char *input, int *size, char *command,
|
||||||
|
Autocomplete ac);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user