1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-27 13:26:38 +02:00

- new keyboard management: keys are setup in config file, new command /key was added and some new default keys were added

- added seconds in infobar time (optional with new config flag)
- fixed some curses refreshs
This commit is contained in:
Sebastien Helleu
2005-07-09 15:30:51 +00:00
parent 55125beee4
commit 54d4fc12a6
36 changed files with 6820 additions and 4072 deletions
+5 -1
View File
@@ -1,10 +1,14 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2005-07-06
ChangeLog - 2005-07-09
Versoin 0.1.4 (under dev!):
* new keyboard management: keys are setup in config file, new command
/key was added and some new default keys were added
* added seconds in infobar time (optional thanks to new setting)
* fixed some curses refreshs
* channels auto-prefixed by "#" (if no prefix found) for /join command
Version 0.1.3 (2005-07-02):
+421 -356
View File
File diff suppressed because it is too large Load Diff
+437 -356
View File
File diff suppressed because it is too large Load Diff
+417 -355
View File
File diff suppressed because it is too large Load Diff
+206 -47
View File
@@ -47,11 +47,11 @@ t_weechat_command weechat_commands[] =
{ "buffer", N_("manage buffers"),
N_("[action | number]"),
N_("action: action to do:\n"
" move: move buffer in the list (may be relative, for example -1)\n"
" close: close buffer (for channel: same as /part without part message)\n"
" list: list opened buffers (no parameter implies this list)\n"
" notify: set notify level for buffer (0=never, 1=highlight, 2=1+msg, 3=2+join/part)\n"
"number: jump to buffer by number"),
" move: move buffer in the list (may be relative, for example -1)\n"
" close: close buffer (for channel: same as /part without part message)\n"
" list: list opened buffers (no parameter implies this list)\n"
" notify: set notify level for buffer (0=never, 1=highlight, 2=1+msg, 3=2+join/part)\n"
"number: jump to buffer by number"),
0, MAX_ARGS, weechat_cmd_buffer, NULL },
{ "clear", N_("clear window(s)"),
N_("[-all]"),
@@ -72,33 +72,40 @@ t_weechat_command weechat_commands[] =
{ "help", N_("display help about commands"),
N_("[command]"), N_("command: name of a WeeChat or IRC command"),
0, 1, weechat_cmd_help, NULL },
{ "key", N_("bind/unbind keys"),
N_("[key function/command] [unbind key] [functions] [reset -yes]"),
N_("key: bind this key to an internal function or a command (beginning by \"/\")\n"
"unbind: unbind a key (if \"all\", default bindings are restored)\n"
"functions: list internal functions for key bindings\n"
"reset: restore bindings to the default values and delete ALL personal binding (use carefully!)"),
0, MAX_ARGS, NULL, weechat_cmd_key },
{ "perl", N_("list/load/unload Perl scripts"),
N_("[load filename] | [autoload] | [reload] | [unload]"),
N_("filename: Perl script (file) to load\n"
"Without argument, /perl command lists all loaded Perl scripts."),
"Without argument, /perl command lists all loaded Perl scripts."),
0, 2, weechat_cmd_perl, NULL },
{ "python", N_("list/load/unload Python scripts"),
N_("[load filename] | [autoload] | [reload] | [unload]"),
N_("filename: Python script (file) to load\n"
"Without argument, /python command lists all loaded Python scripts."),
"Without argument, /python command lists all loaded Python scripts."),
0, 2, weechat_cmd_python, NULL },
{ "server", N_("list, add or remove servers"),
N_("[servername] | "
"[servername hostname port [-auto | -noauto] [-ipv6] [-ssl] [-pwd password] [-nicks nick1 "
"[nick2 [nick3]]] [-username username] [-realname realname] "
"[-command command] [-autojoin channel[,channel]] ] | "
"[del servername]"),
"[servername hostname port [-auto | -noauto] [-ipv6] [-ssl] [-pwd password] [-nicks nick1 "
"[nick2 [nick3]]] [-username username] [-realname realname] "
"[-command command] [-autojoin channel[,channel]] ] | "
"[del servername]"),
N_("servername: server name, for internal & display use\n"
"hostname: name or IP address of server\n"
"port: port for server (integer)\n"
"ipv6: use IPv6 protocol\n"
"ssl: use SSL protocol\n"
"password: password for server\n"
"nick1: first nick for server\n"
"nick2: alternate nick for server\n"
"nick3: second alternate nick for server\n"
"username: user name\n"
"realname: real name of user"),
"hostname: name or IP address of server\n"
"port: port for server (integer)\n"
"ipv6: use IPv6 protocol\n"
"ssl: use SSL protocol\n"
"password: password for server\n"
"nick1: first nick for server\n"
"nick2: alternate nick for server\n"
"nick3: second alternate nick for server\n"
"username: user name\n"
"realname: real name of user"),
0, MAX_ARGS, weechat_cmd_server, NULL },
{ "save", N_("save config to disk"),
N_("[file]"), N_("file: filename for writing config"),
@@ -111,11 +118,10 @@ t_weechat_command weechat_commands[] =
1, 1, NULL, weechat_cmd_unalias },
{ "window", N_("manage windows"),
N_("[list | splith | splitv | [merge [down | up | left | right | all]]]"),
N_(
"list: list opened windows (no parameter implies this list)\n"
"splith: split current window horizontally\n"
"splitv: split current window vertically\n"
"merge: merge window with another"),
N_("list: list opened windows (no parameter implies this list)\n"
"splith: split current window horizontally\n"
"splitv: split current window vertically\n"
"merge: merge window with another"),
0, 2, weechat_cmd_window, NULL },
{ NULL, NULL, NULL, NULL, 0, 0, NULL, NULL }
};
@@ -877,6 +883,7 @@ weechat_cmd_buffer (int argc, char **argv)
t_irc_channel *ptr_channel;
long number;
char *error;
int target_buffer;
if ((argc == 0) || ((argc == 1) && (strcasecmp (argv[0], "list") == 0)))
{
@@ -1049,26 +1056,41 @@ weechat_cmd_buffer (int argc, char **argv)
{
/* jump to buffer by number */
error = NULL;
number = strtol (argv[0], &error, 10);
if ((error) && (error[0] == '\0'))
if (argv[0][0] == '-')
{
if (!gui_switch_to_buffer_by_number (gui_current_window, (int) number))
/* relative jump '-' */
error = NULL;
number = strtol (argv[0] + 1, &error, 10);
if ((error) && (error[0] == '\0'))
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s buffer \"%s\" not found for \"%s\" command\n"),
WEECHAT_ERROR, argv[0], "buffer");
return -1;
target_buffer = gui_current_window->buffer->number - (int) number;
if (target_buffer < 1)
target_buffer = (last_gui_buffer) ? last_gui_buffer->number + target_buffer : 1;
gui_switch_to_buffer_by_number (gui_current_window,
target_buffer);
}
}
else if (argv[0][0] == '+')
{
/* relative jump '+' */
error = NULL;
number = strtol (argv[0] + 1, &error, 10);
if ((error) && (error[0] == '\0'))
{
target_buffer = gui_current_window->buffer->number + (int) number;
if (last_gui_buffer && target_buffer > last_gui_buffer->number)
target_buffer -= last_gui_buffer->number;
gui_switch_to_buffer_by_number (gui_current_window,
target_buffer);
}
}
else
{
/* invalid number */
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL, _("%s incorrect buffer number\n"),
WEECHAT_ERROR);
return -1;
/* absolute jump by number */
error = NULL;
number = strtol (argv[0], &error, 10);
if ((error) && (error[0] == '\0'))
gui_switch_to_buffer_by_number (gui_current_window, (int) number);
}
}
@@ -1322,6 +1344,138 @@ weechat_cmd_help (int argc, char **argv)
return 0;
}
/*
* weechat_cmd_key_display: display a key binding
*/
void
weechat_cmd_key_display (t_gui_key *key, int new_key)
{
char *expanded_name;
expanded_name = gui_key_get_expanded_name (key->key);
if (new_key)
{
gui_printf (NULL, _("New key binding:\n"));
gui_printf (NULL, " %s", (expanded_name) ? expanded_name : key->key);
}
else
gui_printf (NULL, " %20s", (expanded_name) ? expanded_name : key->key);
gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, " => ");
gui_printf (NULL, "%s\n",
(key->function) ?
gui_key_function_search_by_ptr (key->function) : key->command);
if (expanded_name)
free (expanded_name);
}
/*
* weechat_cmd_key: bind/unbind keys
*/
int
weechat_cmd_key (char *arguments)
{
char *pos;
int i;
t_gui_key *ptr_key;
if (arguments)
{
while (arguments[0] == ' ')
arguments++;
}
if (!arguments || (arguments[0] == '\0'))
{
gui_printf (NULL, "\n");
gui_printf (NULL, _("Key bindings:\n"));
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
weechat_cmd_key_display (ptr_key, 0);
}
}
else if (strncasecmp (arguments, "unbind ", 7) == 0)
{
arguments += 7;
while (arguments[0] == ' ')
arguments++;
if (gui_key_unbind (arguments))
gui_printf (NULL, _("Key \"%s\" unbinded\n"), arguments);
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s unable to unbind key \"%s\"\n"),
WEECHAT_ERROR, arguments);
return -1;
}
}
else if (strcasecmp (arguments, "functions") == 0)
{
gui_printf (NULL, "\n");
gui_printf (NULL, _("Internal key functions:\n"));
i = 0;
while (gui_key_functions[i].function_name)
{
gui_printf (NULL, " %s\n",
gui_key_functions[i].function_name);
i++;
}
}
else if (strncasecmp (arguments, "reset", 5) == 0)
{
arguments += 5;
while (arguments[0] == ' ')
arguments++;
if (strcmp (arguments, "-yes") == 0)
{
gui_key_free_all ();
gui_key_init ();
gui_printf (NULL, _("Default key bindings restored\n"));
}
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s \"-yes\" argument is required for keys reset (securuty reason)\n"),
WEECHAT_ERROR);
return -1;
}
}
else
{
while (arguments[0] == ' ')
arguments++;
pos = strchr (arguments, ' ');
if (!pos)
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s wrong argument count for \"%s\" command\n"),
WEECHAT_ERROR, "key");
return -1;
}
pos[0] = '\0';
pos++;
while (pos[0] == ' ')
pos++;
ptr_key = gui_key_bind (arguments, pos);
if (ptr_key)
weechat_cmd_key_display (ptr_key, 1);
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s unable to bind key \"%s\"\n"),
WEECHAT_ERROR, arguments);
return -1;
}
}
return 0;
}
/*
* weechat_cmd_perl: list/load/unload Perl scripts
*/
@@ -1892,11 +2046,11 @@ weechat_cmd_server (int argc, char **argv)
}
/*
* weechat_set_cmd_display_option: display config option
* weechat_cmd_set_display_option: display config option
*/
void
weechat_set_cmd_display_option (t_config_option *option, char *prefix, void *value)
weechat_cmd_set_display_option (t_config_option *option, char *prefix, void *value)
{
char *color_name, *pos_nickserv, *pos_pwd, *value2;
@@ -2039,7 +2193,7 @@ weechat_cmd_set (char *arguments)
{
ptr_option_value = config_get_server_option_ptr (ptr_server,
weechat_options[CONFIG_SECTION_SERVER][i].option_name);
weechat_set_cmd_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
weechat_cmd_set_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
ptr_server->name,
ptr_option_value);
}
@@ -2080,7 +2234,7 @@ weechat_cmd_set (char *arguments)
gui_printf_color (NULL, COLOR_WIN_CHAT_CHANNEL,
"%s", config_get_section (ptr_option));
gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, "]\n");
weechat_set_cmd_display_option (ptr_option, NULL, NULL);
weechat_cmd_set_display_option (ptr_option, NULL, NULL);
}
else
{
@@ -2104,7 +2258,8 @@ weechat_cmd_set (char *arguments)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
section_displayed = 0;
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -2122,7 +2277,7 @@ weechat_cmd_set (char *arguments)
gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, "]\n");
section_displayed = 1;
}
weechat_set_cmd_display_option (&weechat_options[i][j], NULL, NULL);
weechat_cmd_set_display_option (&weechat_options[i][j], NULL, NULL);
number_found++;
}
}
@@ -2155,7 +2310,7 @@ weechat_cmd_set (char *arguments)
weechat_options[CONFIG_SECTION_SERVER][i].option_name);
if (ptr_option_value)
{
weechat_set_cmd_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
weechat_cmd_set_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
ptr_server->name,
ptr_option_value);
number_found++;
@@ -2288,6 +2443,10 @@ weechat_cmd_window (int argc, char **argv)
else
gui_window_merge_auto (gui_current_window);
}
else if (strcasecmp (argv[0], "-1") == 0)
gui_switch_to_previous_window ();
else if (strcasecmp (argv[0], "+1") == 0)
gui_switch_to_next_window ();
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
+1
View File
@@ -69,6 +69,7 @@ extern int weechat_cmd_connect (int, char **);
extern int weechat_cmd_debug (int, char **);
extern int weechat_cmd_disconnect (int, char **);
extern int weechat_cmd_help (int, char **);
extern int weechat_cmd_key (char *);
extern int weechat_cmd_perl (int, char **);
extern int weechat_cmd_python (int, char **);
extern int weechat_cmd_save (int, char **);
+19 -1
View File
@@ -201,6 +201,23 @@ completion_build_list (t_completion *completion, void *channel)
}
return;
}
if ((strcasecmp (completion->base_command, "key") == 0)
&& (completion->base_command_arg == 1))
{
weelist_add (&completion->completion_list,
&completion->last_completion,
"bind");
weelist_add (&completion->completion_list,
&completion->last_completion,
"unbind");
weelist_add (&completion->completion_list,
&completion->last_completion,
"functions");
weelist_add (&completion->completion_list,
&completion->last_completion,
"reset");
return;
}
if (((strcasecmp (completion->base_command, "perl") == 0)
|| (strcasecmp (completion->base_command, "python") == 0))
&& (completion->base_command_arg == 1))
@@ -225,7 +242,8 @@ completion_build_list (t_completion *completion, void *channel)
{
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
+56 -2
View File
@@ -313,6 +313,47 @@ void wee_display_commands (int weechat_cmd, int irc_cmd)
}
}
/*
* wee_display_key_functions: display WeeChat key functions
*/
void wee_display_key_functions ()
{
int i;
printf (_("Internal key functions:\n"));
printf ("\n");
i = 0;
while (gui_key_functions[i].function_name)
{
printf (" %s\n",
gui_key_functions[i].function_name);
i++;
}
}
/*
* wee_display_keys: display WeeChat default keys
*/
void wee_display_keys ()
{
t_gui_key *ptr_key;
char *expanded_name;
printf (_("%s default keys:\n"), PACKAGE_NAME);
printf ("\n");
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
expanded_name = gui_key_get_expanded_name (ptr_key->key);
printf (" %20s => %s\n",
(expanded_name) ? expanded_name : ptr_key->key,
(ptr_key->function) ? gui_key_function_search_by_ptr (ptr_key->function) : ptr_key->command);
if (expanded_name)
free (expanded_name);
}
}
/*
* wee_parse_args: parse command line args
*/
@@ -333,6 +374,12 @@ wee_parse_args (int argc, char *argv[])
wee_display_config_options ();
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-f") == 0)
|| (strcmp (argv[i], "--key-functions") == 0))
{
wee_display_key_functions ();
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-h") == 0)
|| (strcmp (argv[i], "--help") == 0))
{
@@ -340,12 +387,18 @@ wee_parse_args (int argc, char *argv[])
printf ("%s", WEE_USAGE2);
wee_shutdown (EXIT_SUCCESS);
}
if ((strcmp (argv[i], "-i") == 0)
else if ((strcmp (argv[i], "-i") == 0)
|| (strcmp (argv[i], "--irc-commands") == 0))
{
wee_display_commands (0, 1);
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-k") == 0)
|| (strcmp (argv[i], "--keys") == 0))
{
wee_display_keys ();
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-l") == 0)
|| (strcmp (argv[i], "--license") == 0))
{
@@ -358,7 +411,7 @@ wee_parse_args (int argc, char *argv[])
printf (PACKAGE_VERSION "\n");
wee_shutdown (EXIT_SUCCESS);
}
if ((strcmp (argv[i], "-w") == 0)
else if ((strcmp (argv[i], "-w") == 0)
|| (strcmp (argv[i], "--weechat-commands") == 0))
{
wee_display_commands (1, 0);
@@ -771,6 +824,7 @@ main (int argc, char *argv[])
signal (SIGSEGV, my_sigsegv); /* crash dump when SIGSEGV is received */
gui_pre_init (&argc, &argv); /* pre-initiliaze interface */
wee_init_vars (); /* initialize some variables */
gui_key_init (); /* init keyboard (default key bindings) */
wee_parse_args (argc, argv); /* parse command line args */
wee_create_home_dirs (); /* create WeeChat directories */
wee_init_log (); /* init log file */
+3 -1
View File
@@ -90,8 +90,10 @@
#define WEE_USAGE2 \
" -c, --config display config file options\n" \
" -h, --help this help screen\n" \
" -f, --key-functions display WeeChat internal functions for keys\n" \
" -h, --help this help\n" \
" -i, --irc-commands display IRC commands\n" \
" -k, --keys display WeeChat default keys\n" \
" -l, --license display WeeChat license\n" \
" -v, --version display WeeChat version\n" \
" -w, --weechat-commands display WeeChat commands\n\n"
+88 -12
View File
@@ -53,6 +53,7 @@ t_config_section config_sections[CONFIG_NUMBER_SECTIONS] =
{ CONFIG_SECTION_IRC, "irc" },
{ CONFIG_SECTION_DCC, "dcc" },
{ CONFIG_SECTION_PROXY, "proxy" },
{ CONFIG_SECTION_KEYS, "keys" },
{ CONFIG_SECTION_ALIAS, "alias" },
{ CONFIG_SECTION_SERVER, "server" }
};
@@ -82,6 +83,7 @@ char *cfg_look_no_nickname;
char *cfg_look_completor;
int cfg_look_infobar;
char *cfg_look_infobar_timestamp;
int cfg_look_infobar_seconds;
int cfg_look_infobar_delay_highlight;
t_config_option weechat_options_look[] =
@@ -170,7 +172,11 @@ t_config_option weechat_options_look[] =
{ "look_infobar_timestamp", N_("timestamp for time in infobar"),
N_("timestamp for time in infobar"),
OPTION_TYPE_STRING, 0, 0, 0,
"%B, %A %d %Y - %H:%M", NULL, NULL, &cfg_look_infobar_timestamp, config_change_buffer_content },
"%B, %A %d %Y", NULL, NULL, &cfg_look_infobar_timestamp, config_change_buffer_content },
{ "look_infobar_seconds", N_("display seconds in infobar time"),
N_("display seconds in infobar time"),
OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
NULL, NULL, &cfg_look_infobar_seconds, NULL, config_change_buffer_content },
{ "look_infobar_delay_highlight", N_("delay (in seconds) for highlight messages in infobar"),
N_("delay (in seconds) for highlight messages in infobar "
"(0 = disable highlight notifications in infobar)"),
@@ -202,6 +208,7 @@ int cfg_col_status_data_other;
int cfg_col_status_more;
int cfg_col_status_bg;
int cfg_col_infobar;
int cfg_col_infobar_delimiters;
int cfg_col_infobar_highlight;
int cfg_col_infobar_bg;
int cfg_col_input;
@@ -320,6 +327,10 @@ t_config_option weechat_options_colors[] =
N_("color for info bar text"),
OPTION_TYPE_COLOR, 0, 0, 0,
"black", NULL, &cfg_col_infobar, NULL, &config_change_color },
{ "col_infobar_delimiters", N_("color for infobar delimiters"),
N_("color for infobar delimiters"),
OPTION_TYPE_COLOR, 0, 0, 0,
"blue", NULL, &cfg_col_infobar_delimiters, NULL, &config_change_color },
{ "col_infobar_highlight", N_("color for info bar highlight notification"),
N_("color for info bar highlight notification"),
OPTION_TYPE_COLOR, 0, 0, 0,
@@ -727,7 +738,7 @@ t_config_option weechat_options_server[] =
t_config_option *weechat_options[CONFIG_NUMBER_SECTIONS] =
{ weechat_options_look, weechat_options_colors, weechat_options_history,
weechat_options_log, weechat_options_irc, weechat_options_dcc,
weechat_options_proxy, NULL, weechat_options_server
weechat_options_proxy, NULL, NULL, weechat_options_server
};
@@ -763,7 +774,8 @@ config_get_section (t_config_option *ptr_option)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -1057,7 +1069,8 @@ config_option_search (char *option_name)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -1220,7 +1233,8 @@ config_default_values ()
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -1375,8 +1389,22 @@ config_read ()
if (pos2 != NULL)
pos2[0] = '\0';
if (section == CONFIG_SECTION_ALIAS)
if (section == CONFIG_SECTION_KEYS)
{
if (pos[0])
{
/* bind key (overwrite any binding with same key) */
gui_key_bind (line, pos);
}
else
{
/* unbin key if no value given */
gui_key_unbind (line);
}
}
else if (section == CONFIG_SECTION_ALIAS)
{
/* create new alias */
if (alias_new (line, pos))
weelist_add (&index_commands, &last_index_command, line);
}
@@ -1493,6 +1521,8 @@ config_create_default ()
time_t current_time;
struct passwd *my_passwd;
char *realname, *pos;
t_gui_key *ptr_key;
char *expanded_name, *function_name;
filename_length = strlen (weechat_home) + 64;
filename =
@@ -1520,7 +1550,8 @@ config_create_default ()
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
fprintf (file, "\n[%s]\n", config_sections[i].section_name);
for (j = 0; weechat_options[i][j].option_name; j++)
@@ -1550,6 +1581,27 @@ config_create_default ()
}
}
/* default key bindings */
fprintf (file, "\n[keys]\n");
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
expanded_name = gui_key_get_expanded_name (ptr_key->key);
if (ptr_key->function)
{
function_name = gui_key_function_search_by_ptr (ptr_key->function);
if (function_name)
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
function_name);
}
else
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
ptr_key->command);
if (expanded_name)
free (expanded_name);
}
/* default aliases */
/* TODO: remove comments when missing commands will be ok */
fprintf (file, "\n[alias]\n");
@@ -1560,20 +1612,20 @@ config_create_default ()
fprintf (file, "C=clear\n");
fprintf (file, "CL=clear\n");
fprintf (file, "CLOSE=buffer close\n");
fprintf (file, "# CHAT=dcc chat\n");
fprintf (file, "CHAT=dcc chat\n");
fprintf (file, "# GET=dcc get\n");
fprintf (file, "# IG=ignore\n");
fprintf (file, "J=join\n");
fprintf (file, "K=kick\n");
fprintf (file, "# KB=kickban\n");
fprintf (file, "KB=kickban\n");
fprintf (file, "# KN=knockout\n");
fprintf (file, "LEAVE=part\n");
fprintf (file, "M=msg\n");
fprintf (file, "# MUB=unban *\n");
fprintf (file, "MUB=unban *\n");
fprintf (file, "N=names\n");
fprintf (file, "Q=query\n");
fprintf (file, "T=topic\n");
fprintf (file, "# UB=unban\n");
fprintf (file, "UB=unban\n");
fprintf (file, "# UNIG=unignore\n");
fprintf (file, "W=who\n");
fprintf (file, "WC=part\n");
@@ -1658,6 +1710,8 @@ config_write (char *config_name)
time_t current_time;
t_irc_server *ptr_server;
t_weechat_alias *ptr_alias;
t_gui_key *ptr_key;
char *expanded_name, *function_name;
if (config_name)
filename = strdup (config_name);
@@ -1690,7 +1744,8 @@ config_write (char *config_name)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
fprintf (file, "\n[%s]\n", config_sections[i].section_name);
for (j = 0; weechat_options[i][j].option_name; j++)
@@ -1737,6 +1792,27 @@ config_write (char *config_name)
}
}
/* keys section */
fprintf (file, "\n[keys]\n");
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
expanded_name = gui_key_get_expanded_name (ptr_key->key);
if (ptr_key->function)
{
function_name = gui_key_function_search_by_ptr (ptr_key->function);
if (function_name)
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
function_name);
}
else
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
ptr_key->command);
if (expanded_name)
free (expanded_name);
}
/* alias section */
fprintf (file, "\n[alias]\n");
for (ptr_alias = weechat_alias; ptr_alias;
+6 -3
View File
@@ -33,9 +33,10 @@
#define CONFIG_SECTION_IRC 4
#define CONFIG_SECTION_DCC 5
#define CONFIG_SECTION_PROXY 6
#define CONFIG_SECTION_ALIAS 7
#define CONFIG_SECTION_SERVER 8
#define CONFIG_NUMBER_SECTIONS 9
#define CONFIG_SECTION_KEYS 7
#define CONFIG_SECTION_ALIAS 8
#define CONFIG_SECTION_SERVER 9
#define CONFIG_NUMBER_SECTIONS 10
#define OPTION_TYPE_BOOLEAN 1 /* values: on/off */
#define OPTION_TYPE_INT 2 /* values: from min to max */
@@ -97,6 +98,7 @@ extern char *cfg_look_no_nickname;
extern char *cfg_look_completor;
extern int cfg_look_infobar;
extern char *cfg_look_infobar_timestamp;
extern int cfg_look_infobar_seconds;
extern int cfg_look_infobar_delay_highlight;
extern int cfg_col_title;
@@ -120,6 +122,7 @@ extern int cfg_col_status_data_other;
extern int cfg_col_status_more;
extern int cfg_col_status_bg;
extern int cfg_col_infobar;
extern int cfg_col_infobar_delimiters;
extern int cfg_col_infobar_highlight;
extern int cfg_col_infobar_bg;
extern int cfg_col_input;
+1
View File
@@ -20,6 +20,7 @@ INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\"
noinst_LIBRARIES = lib_weechat_gui_common.a
lib_weechat_gui_common_a_SOURCES = gui-common.c \
gui-keyboard.c \
gui.h
if GUI_NCURSES
+2 -2
View File
@@ -19,7 +19,7 @@ INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\"
bin_PROGRAMS = weechat-curses
weechat_curses_LDADD = ../lib_weechat_gui_common.a \
weechat_curses_LDADD = ../gui-common.o ../gui-keyboard.o \
../../common/lib_weechat_main.a \
../../irc/lib_weechat_irc.a \
$(NCURSES_LIBS) \
@@ -27,4 +27,4 @@ weechat_curses_LDADD = ../lib_weechat_gui_common.a \
$(GNUTLS_LIBS)
weechat_curses_SOURCES = gui-display.c \
gui-input.c
gui-input.c
+147 -163
View File
@@ -318,7 +318,7 @@ gui_draw_window_separator (t_gui_window *window)
window->win_x - 1);
gui_window_set_color (window->win_separator, COLOR_WIN_TITLE);
wborder (window->win_separator, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (window->win_separator);
wnoutrefresh (window->win_separator);
refresh ();
}
}
@@ -341,15 +341,9 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
if (ptr_win->buffer == buffer)
{
if (erase)
gui_curses_window_clear (ptr_win->win_title);
gui_curses_window_clear (ptr_win->win_title);
if (has_colors ())
{
gui_window_set_color (ptr_win->win_title, COLOR_WIN_TITLE);
wborder (ptr_win->win_title, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_title);
refresh ();
}
gui_window_set_color (ptr_win->win_title, COLOR_WIN_TITLE);
snprintf (format, 32, "%%-%ds", ptr_win->win_width);
if (CHANNEL(buffer))
{
@@ -362,6 +356,8 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
mvwprintw (ptr_win->win_title, 0, 0, format, buf);
free (buf);
}
else
mvwprintw (ptr_win->win_title, 0, 0, format, " ");
}
else
{
@@ -372,8 +368,10 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
PACKAGE_STRING " " WEECHAT_COPYRIGHT_DATE " - "
WEECHAT_WEBSITE);
}
else
mvwprintw (ptr_win->win_title, 0, 0, format, " ");
}
wrefresh (ptr_win->win_title);
wnoutrefresh (ptr_win->win_title);
refresh ();
}
}
@@ -860,7 +858,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
ptr_win->win_chat_cursor_y = ptr_win->win_chat_height - 1;
}
}
wrefresh (ptr_win->win_chat);
wnoutrefresh (ptr_win->win_chat);
refresh ();
}
}
@@ -1058,7 +1056,7 @@ gui_draw_buffer_nick (t_gui_buffer *buffer, int erase)
}
}
}
wrefresh (ptr_win->win_nick);
wnoutrefresh (ptr_win->win_nick);
refresh ();
}
}
@@ -1087,12 +1085,8 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
if (erase)
gui_curses_window_clear (ptr_win->win_status);
if (has_colors ())
{
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wborder (ptr_win->win_status, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_status);
}
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wborder (ptr_win->win_status, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wmove (ptr_win->win_status, 0, 0);
/* display number of buffers */
@@ -1223,18 +1217,21 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
}
if (!SERVER(ptr_win->buffer))
{
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wprintw (ptr_win->win_status, "%d",
ptr_win->buffer->number);
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, ":");
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
if (ptr_win->buffer->dcc)
wprintw (ptr_win->win_status, "%d:<DCC> ",
ptr_win->buffer->number);
wprintw (ptr_win->win_status, "<DCC> ");
else
{
string = weechat_convert_encoding (cfg_look_charset_decode,
(cfg_look_charset_internal && cfg_look_charset_internal[0]) ?
cfg_look_charset_internal : local_charset,
_("%d:[not connected] "));
wprintw (ptr_win->win_status, string,
ptr_win->buffer->number);
_("[not connected]"));
wprintw (ptr_win->win_status, "%s " , string);
free (string);
}
}
@@ -1344,11 +1341,48 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
}
free (string);
wrefresh (ptr_win->win_status);
wnoutrefresh (ptr_win->win_status);
refresh ();
}
}
/*
* gui_draw_buffer_infobar_time: draw time in infobar window
*/
void
gui_draw_buffer_infobar_time (t_gui_buffer *buffer)
{
t_gui_window *ptr_win;
time_t time_seconds;
struct tm *local_time;
/* make gcc happy */
(void) buffer;
if (!gui_ok)
return;
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
{
time_seconds = time (NULL);
local_time = localtime (&time_seconds);
if (local_time)
{
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
mvwprintw (ptr_win->win_infobar,
0, 1,
"%02d:%02d",
local_time->tm_hour, local_time->tm_min);
if (cfg_look_infobar_seconds)
wprintw (ptr_win->win_infobar,
":%02d",
local_time->tm_sec);
}
wnoutrefresh (ptr_win->win_infobar);
}
}
/*
* gui_draw_buffer_infobar: draw infobar window for a buffer
*/
@@ -1376,7 +1410,7 @@ gui_draw_buffer_infobar (t_gui_buffer *buffer, int erase)
{
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
wborder (ptr_win->win_infobar, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_infobar);
wnoutrefresh (ptr_win->win_infobar);
}
wmove (ptr_win->win_infobar, 0, 0);
@@ -1385,16 +1419,31 @@ gui_draw_buffer_infobar (t_gui_buffer *buffer, int erase)
if (local_time)
{
strftime (text_time, 1024, cfg_look_infobar_timestamp, local_time);
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
wprintw (ptr_win->win_infobar, "[");
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
wprintw (ptr_win->win_infobar, "%s", text_time);
wprintw (ptr_win->win_infobar,
"%02d:%02d",
local_time->tm_hour, local_time->tm_min);
if (cfg_look_infobar_seconds)
wprintw (ptr_win->win_infobar,
":%02d",
local_time->tm_sec);
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
wprintw (ptr_win->win_infobar, "]");
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
wprintw (ptr_win->win_infobar,
" %s", text_time);
}
if (gui_infobar)
{
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
wprintw (ptr_win->win_infobar, " | ");
gui_window_set_color (ptr_win->win_infobar, gui_infobar->color);
wprintw (ptr_win->win_infobar, " | %s", gui_infobar->text);
wprintw (ptr_win->win_infobar, "%s", gui_infobar->text);
}
wrefresh (ptr_win->win_infobar);
wnoutrefresh (ptr_win->win_infobar);
refresh ();
}
}
@@ -1445,7 +1494,7 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
{
gui_window_set_color (ptr_win->win_input, COLOR_WIN_INPUT);
wborder (ptr_win->win_input, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_input);
wnoutrefresh (ptr_win->win_input);
}
if (buffer->input_buffer_size == 0)
@@ -1488,11 +1537,12 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
SERVER(buffer)->nick,
"");
wclrtoeol (ptr_win->win_input);
ptr_win->win_input_x = strlen (CHANNEL(buffer)->name) +
strlen (SERVER(buffer)->nick) + 3 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display);
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x + strlen (CHANNEL(buffer)->name) +
strlen (SERVER(buffer)->nick) + 3 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display));
ptr_win->win_x + ptr_win->win_input_x);
}
else
{
@@ -1523,6 +1573,7 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
wprintw (ptr_win->win_input, _(" [P] Purge old DCC"));
wprintw (ptr_win->win_input, _(" [Q] Close DCC view"));
wclrtoeol (ptr_win->win_input);
ptr_win->win_input_x = 0;
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x);
@@ -1543,14 +1594,15 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
ptr_nickname,
"");
wclrtoeol (ptr_win->win_input);
ptr_win->win_input_x = strlen (ptr_nickname) + 2 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display);
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x + strlen (ptr_nickname) + 2 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display));
ptr_win->win_x + ptr_win->win_input_x);
}
}
wrefresh (ptr_win->win_input);
wnoutrefresh (ptr_win->win_input);
refresh ();
}
}
@@ -1728,215 +1780,143 @@ gui_switch_to_dcc_buffer ()
}
/*
* gui_switch_to_previous_buffer: switch to previous buffer
* gui_input_page_up: display previous page on buffer
*/
void
gui_switch_to_previous_buffer (t_gui_window *window)
gui_input_page_up ()
{
if (!gui_ok)
return;
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
if (window->buffer->prev_buffer)
gui_switch_to_buffer (window, window->buffer->prev_buffer);
else
gui_switch_to_buffer (window, last_gui_buffer);
gui_redraw_buffer (window->buffer);
}
/*
* gui_switch_to_next_buffer: switch to next buffer
*/
void
gui_switch_to_next_buffer (t_gui_window *window)
{
if (!gui_ok)
return;
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
if (window->buffer->next_buffer)
gui_switch_to_buffer (window, window->buffer->next_buffer);
else
gui_switch_to_buffer (window, gui_buffers);
gui_redraw_buffer (window->buffer);
}
/*
* gui_switch_to_previous_window: switch to previous window
*/
void
gui_switch_to_previous_window (t_gui_window *window)
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (window->prev_window) ? window->prev_window : last_gui_window;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_next_window: switch to next window
*/
void
gui_switch_to_next_window (t_gui_window *window)
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (window->next_window) ? window->next_window : gui_windows;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_move_page_up: display previous page on buffer
*/
void
gui_move_page_up (t_gui_window *window)
{
if (!gui_ok)
return;
if (!window->first_line_displayed)
if (!gui_current_window->first_line_displayed)
{
window->sub_lines += window->win_chat_height - 1;
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
gui_current_window->sub_lines +=
gui_current_window->win_chat_height - 1;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
}
}
/*
* gui_move_page_down: display next page on buffer
* gui_input_page_down: display next page on buffer
*/
void
gui_move_page_down (t_gui_window *window)
gui_input_page_down ()
{
if (!gui_ok)
return;
if (window->sub_lines > 0)
if (gui_current_window->sub_lines > 0)
{
window->sub_lines -= window->win_chat_height - 1;
if (window->sub_lines < 0)
window->sub_lines = 0;
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
gui_current_window->sub_lines -=
gui_current_window->win_chat_height - 1;
if (gui_current_window->sub_lines < 0)
gui_current_window->sub_lines = 0;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
}
}
/*
* gui_nick_move_beginning: go to beginning of nicklist
* gui_input_nick_beginning: go to beginning of nicklist
*/
void
gui_nick_move_beginning (t_gui_window *window)
gui_input_nick_beginning ()
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
if (window->win_nick_start > 0)
if (gui_current_window->win_nick_start > 0)
{
window->win_nick_start = 0;
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
/*
* gui_nick_move_end: go to the end of nicklist
* gui_input_nick_end: go to the end of nicklist
*/
void
gui_nick_move_end (t_gui_window *window)
gui_input_nick_end ()
{
int new_start;
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
new_start = CHANNEL(window->buffer)->nicks_count - window->win_nick_height;
new_start =
CHANNEL(gui_current_window->buffer)->nicks_count -
gui_current_window->win_nick_height;
if (new_start < 0)
new_start = 0;
else if (new_start >= 1)
new_start++;
if (new_start != window->win_nick_start)
if (new_start != gui_current_window->win_nick_start)
{
window->win_nick_start = new_start;
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start = new_start;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
/*
* gui_nick_move_page_up: scroll one page up in nicklist
* gui_input_nick_page_up: scroll one page up in nicklist
*/
void
gui_nick_move_page_up (t_gui_window *window)
gui_input_nick_page_up ()
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
if (window->win_nick_start > 0)
if (gui_current_window->win_nick_start > 0)
{
window->win_nick_start -= (window->win_nick_height - 1);
if (window->win_nick_start <= 1)
window->win_nick_start = 0;
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start -=
(gui_current_window->win_nick_height - 1);
if (gui_current_window->win_nick_start <= 1)
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
/*
* gui_nick_move_page_down: scroll one page down in nicklist
* gui_input_nick_page_down: scroll one page down in nicklist
*/
void
gui_nick_move_page_down (t_gui_window *window)
gui_input_nick_page_down ()
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
if ((CHANNEL(window->buffer)->nicks_count > window->win_nick_height)
&& (window->win_nick_start + window->win_nick_height - 1 < CHANNEL(window->buffer)->nicks_count))
if ((CHANNEL(gui_current_window->buffer)->nicks_count >
gui_current_window->win_nick_height)
&& (gui_current_window->win_nick_start +
gui_current_window->win_nick_height - 1
< CHANNEL(gui_current_window->buffer)->nicks_count))
{
if (window->win_nick_start == 0)
window->win_nick_start += (window->win_nick_height - 1);
if (gui_current_window->win_nick_start == 0)
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 1);
else
window->win_nick_start += (window->win_nick_height - 2);
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 2);
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
@@ -2306,6 +2286,8 @@ gui_init_colors ()
cfg_col_status_more, cfg_col_status_bg);
init_pair (COLOR_WIN_INFOBAR,
cfg_col_infobar, cfg_col_infobar_bg);
init_pair (COLOR_WIN_INFOBAR_DELIMITERS,
cfg_col_infobar_delimiters, cfg_col_infobar_bg);
init_pair (COLOR_WIN_INFOBAR_HIGHLIGHT,
cfg_col_infobar_highlight, cfg_col_infobar_bg);
init_pair (COLOR_WIN_INPUT,
@@ -2378,6 +2360,7 @@ gui_init_colors ()
color_attr[COLOR_WIN_STATUS_DATA_OTHER - 1] = (cfg_col_status_data_other >= 0) ? cfg_col_status_data_other & A_BOLD : 0;
color_attr[COLOR_WIN_STATUS_MORE - 1] = (cfg_col_status_more >= 0) ? cfg_col_status_more & A_BOLD : 0;
color_attr[COLOR_WIN_INFOBAR - 1] = (cfg_col_infobar >= 0) ? cfg_col_infobar & A_BOLD : 0;
color_attr[COLOR_WIN_INFOBAR_DELIMITERS - 1] = (cfg_col_infobar_delimiters >= 0) ? cfg_col_infobar_delimiters & A_BOLD : 0;
color_attr[COLOR_WIN_INFOBAR_HIGHLIGHT - 1] = (cfg_col_infobar_highlight >= 0) ? cfg_col_infobar_highlight & A_BOLD : 0;
color_attr[COLOR_WIN_INPUT - 1] = (cfg_col_input >= 0) ? cfg_col_input & A_BOLD : 0;
color_attr[COLOR_WIN_INPUT_CHANNEL - 1] = (cfg_col_input_channel >= 0) ? cfg_col_input_channel & A_BOLD : 0;
@@ -2427,15 +2410,16 @@ gui_init ()
initscr ();
curs_set (1);
keypad (stdscr, TRUE);
noecho ();
nodelay (stdscr, TRUE);
gui_init_colors ();
gui_infobar = NULL;
gui_ok = ((COLS > 5) && (LINES > 5));
refresh ();
/* create new window/buffer */
if (gui_window_new (0, 0, COLS, LINES))
+144 -634
View File
@@ -41,649 +41,151 @@
#include "../../common/fifo.h"
#include "../../irc/irc.h"
#define KEY_ESCAPE 27
/*
* gui_read_keyb: read keyboard line
* gui_input_default_key_bindings: create default key bindings
*/
void
gui_read_keyb ()
gui_input_default_key_bindings ()
{
int i;
char key_str[32], command[32];
/* keys binded with internal functions */
gui_key_bind ( /* RC */ "ctrl-M", "return");
gui_key_bind ( /* RC */ "ctrl-J", "return");
gui_key_bind ( /* tab */ "ctrl-I", "tab");
gui_key_bind ( /* basckp */ "ctrl-H", "backspace");
gui_key_bind ( /* basckp */ "ctrl-?", "backspace");
gui_key_bind ( /* del */ "meta2-3~", "delete");
gui_key_bind ( /* ^K */ "ctrl-K", "delete_end_line");
gui_key_bind ( /* ^U */ "ctrl-U", "delete_beginning_line");
gui_key_bind ( /* ^W */ "ctrl-W", "delete_previous_word");
gui_key_bind ( /* home */ "meta2-1~", "home");
gui_key_bind ( /* home */ "meta2-H", "home");
gui_key_bind ( /* home */ "meta2-7~", "home");
gui_key_bind ( /* ^A */ "ctrl-A", "home");
gui_key_bind ( /* end */ "meta2-4~", "end");
gui_key_bind ( /* end */ "meta2-F", "end");
gui_key_bind ( /* end */ "meta2-8~", "end");
gui_key_bind ( /* ^E */ "ctrl-E", "end");
gui_key_bind ( /* left */ "meta2-D", "left");
gui_key_bind ( /* right */ "meta2-C", "right");
gui_key_bind ( /* up */ "meta2-A", "up");
gui_key_bind ( /* down */ "meta2-B", "down");
gui_key_bind ( /* pgup */ "meta2-5~", "page_up");
gui_key_bind ( /* pgdn */ "meta2-6~", "page_down");
gui_key_bind ( /* F10 */ "meta2-21~", "infobar_clear");
gui_key_bind ( /* F11 */ "meta2-23~", "nick_page_up");
gui_key_bind ( /* F12 */ "meta2-24~", "nick_page_down");
gui_key_bind ( /* m-F11 */ "meta-meta2-1~", "nick_beginning");
gui_key_bind ( /* m-F12 */ "meta-meta2-4~", "nick_end");
gui_key_bind ( /* ^L */ "ctrl-L", "refresh");
gui_key_bind ( /* m-a */ "meta-a", "jump_smart");
gui_key_bind ( /* m-b */ "meta-b", "previous_word");
gui_key_bind ( /* ^left */ "meta-Od", "previous_word");
gui_key_bind ( /* m-d */ "meta-d", "delete_next_word");
gui_key_bind ( /* m-f */ "meta-f", "next_word");
gui_key_bind ( /* ^right */ "meta-Oc", "next_word");
gui_key_bind ( /* m-h */ "meta-h", "hotlist_clear");
gui_key_bind ( /* m-j,m-d */ "meta-jmeta-d", "jump_dcc");
gui_key_bind ( /* m-r */ "meta-r", "delete_line");
gui_key_bind ( /* m-s */ "meta-s", "jump_server");
gui_key_bind ( /* m-x */ "meta-x", "jump_next_server");
/* keys binded with commands */
gui_key_bind ( /* m-left */ "meta-meta2-D", "/buffer -1");
gui_key_bind ( /* F5 */ "meta2-15~", "/buffer -1");
gui_key_bind ( /* m-right */ "meta-meta2-C", "/buffer +1");
gui_key_bind ( /* F6 */ "meta2-17~", "/buffer +1");
gui_key_bind ( /* F7 */ "meta2-18~", "/window -1");
gui_key_bind ( /* F8 */ "meta2-19~", "/window +1");
gui_key_bind ( /* m-0 */ "meta-0", "/buffer 10");
gui_key_bind ( /* m-1 */ "meta-1", "/buffer 1");
gui_key_bind ( /* m-2 */ "meta-2", "/buffer 2");
gui_key_bind ( /* m-3 */ "meta-3", "/buffer 3");
gui_key_bind ( /* m-4 */ "meta-4", "/buffer 4");
gui_key_bind ( /* m-5 */ "meta-5", "/buffer 5");
gui_key_bind ( /* m-6 */ "meta-6", "/buffer 6");
gui_key_bind ( /* m-7 */ "meta-7", "/buffer 7");
gui_key_bind ( /* m-8 */ "meta-8", "/buffer 8");
gui_key_bind ( /* m-9 */ "meta-9", "/buffer 9");
/* bind meta-j + {01..99} to switch to buffers # > 10 */
for (i = 1; i < 100; i++)
{
sprintf (key_str, "meta-j%02d", i);
sprintf (command, "/buffer %d", i);
gui_key_bind (key_str, command);
}
}
/*
* gui_input_read: read keyboard chars
*/
void
gui_input_read ()
{
int key, i;
t_gui_buffer *ptr_buffer;
t_irc_server *ptr_server;
t_irc_dcc *ptr_dcc, *ptr_dcc_next;
char new_char[3], *decoded_string;
t_irc_dcc *dcc_selected;
key = getch ();
if (key != ERR)
char key_str[32];
i = 0;
/* do not loop too much here (for example when big paste was made),
to read also socket & co */
while (i < 8)
{
switch (key)
key = getch ();
if (key == ERR)
break;
if (key == KEY_RESIZE)
{
/* resize event */
case KEY_RESIZE:
gui_curses_resize_handler ();
break;
/* inactive function keys */
case KEY_F(1):
case KEY_F(2):
case KEY_F(3):
case KEY_F(4):
case KEY_F(9):
break;
/* previous buffer in window */
case KEY_F(5):
gui_switch_to_previous_buffer (gui_current_window);
break;
/* next buffer in window */
case KEY_F(6):
gui_switch_to_next_buffer (gui_current_window);
break;
/* previous window */
case KEY_F(7):
gui_switch_to_previous_window (gui_current_window);
break;
/* next window */
case KEY_F(8):
gui_switch_to_next_window (gui_current_window);
break;
/* remove last infobar message */
case KEY_F(10):
gui_infobar_remove ();
gui_draw_buffer_infobar (gui_current_window->buffer, 1);
break;
case KEY_F(11):
gui_nick_move_page_up (gui_current_window);
break;
case KEY_F(12):
gui_nick_move_page_down (gui_current_window);
break;
/* cursor up */
case KEY_UP:
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (gui_current_window->dcc_selected
&& ((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc)
{
if (gui_current_window->dcc_selected ==
gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->prev_dcc;
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->next_history;
if (!gui_current_window->buffer->ptr_history)
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
}
else
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* cursor down */
case KEY_DOWN:
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (!gui_current_window->dcc_selected
|| ((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc)
{
if (gui_current_window->dcc_last_displayed
&& (gui_current_window->dcc_selected ==
gui_current_window->dcc_last_displayed))
{
if (gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->next_dcc;
else
gui_current_window->dcc_first =
dcc_list->next_dcc;
}
if (gui_current_window->dcc_selected)
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc;
else
gui_current_window->dcc_selected =
dcc_list->next_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->prev_history;
if (gui_current_window->buffer->ptr_history)
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
else
gui_current_window->buffer->input_buffer_size = 0;
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
if (gui_current_window->buffer->ptr_history)
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* cursor left */
case KEY_LEFT:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos--;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* cursor right */
case KEY_RIGHT:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* home key or Control + A */
case KEY_HOME:
case 0x01:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* end key or Control + E */
case KEY_END:
case 0x05:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* page up */
case KEY_PPAGE:
if (!gui_current_window->buffer->dcc)
gui_move_page_up (gui_current_window);
break;
/* page down */
case KEY_NPAGE:
if (!gui_current_window->buffer->dcc)
gui_move_page_down (gui_current_window);
break;
/* erase before cursor and move cursor to the left */
case 127:
case KEY_BACKSPACE:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = gui_current_window->buffer->input_buffer_pos-1;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer_pos--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
break;
/* Control + Backspace or Control + W */
case 0x08:
case 0x17:
if (!gui_current_window->buffer->dcc)
gui_delete_previous_word (gui_current_window->buffer);
break;
/* Control + L */
case 0x0C:
gui_curses_resize_handler ();
break;
/* erase char under cursor */
case KEY_DC:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
i = gui_current_window->buffer->input_buffer_pos;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
break;
/* Tab : completion */
case '\t':
if (!gui_current_window->buffer->dcc)
{
completion_search (&(gui_current_window->buffer->completion),
CHANNEL(gui_current_window->buffer),
gui_current_window->buffer->input_buffer,
gui_current_window->buffer->input_buffer_size,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.word_found)
{
/* replace word with new completed word into input buffer */
if (gui_current_window->buffer->completion.diff_size > 0)
{
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
for (i = gui_current_window->buffer->input_buffer_size - 1;
i >= gui_current_window->buffer->completion.position_replace +
(int)strlen (gui_current_window->buffer->completion.word_found); i--)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
}
else
{
for (i = gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
i < gui_current_window->buffer->input_buffer_size; i++)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
}
strncpy (gui_current_window->buffer->input_buffer + gui_current_window->buffer->completion.position_replace,
gui_current_window->buffer->completion.word_found,
strlen (gui_current_window->buffer->completion.word_found));
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
/* position is < 0 this means only one word was found to complete,
so reinit to stop completion */
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position =
gui_current_window->buffer->input_buffer_pos;
/* add space or completor to the end of completion, if needed */
if ((gui_current_window->buffer->completion.context == COMPLETION_COMMAND)
|| (gui_current_window->buffer->completion.context == COMPLETION_COMMAND_ARG))
{
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_buffer_insert_string (gui_current_window->buffer,
" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
else
{
/* add nick completor if position 0 and completing nick */
if ((gui_current_window->buffer->completion.base_word_pos == 0)
&& (gui_current_window->buffer->completion.context == COMPLETION_NICK))
{
if (strncmp (gui_current_window->buffer->input_buffer + gui_current_window->buffer->input_buffer_pos,
cfg_look_completor, strlen (cfg_look_completor)) != 0)
gui_buffer_insert_string (gui_current_window->buffer,
cfg_look_completor,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position += strlen (cfg_look_completor);
gui_current_window->buffer->input_buffer_pos += strlen (cfg_look_completor);
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_buffer_insert_string (gui_current_window->buffer,
" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
}
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* escape code (for control-key) */
case KEY_ESCAPE:
if ((key = getch()) != ERR)
{
/*gui_printf (gui_current_window->buffer,
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/
switch (key)
{
/* Alt + left arrow */
case KEY_LEFT:
gui_switch_to_previous_buffer (gui_current_window);
break;
/* Alt + right arrow */
case KEY_RIGHT:
gui_switch_to_next_buffer (gui_current_window);
break;
/* Alt + home */
case KEY_HOME:
gui_nick_move_beginning (gui_current_window);
break;
/* Alt + end */
case KEY_END:
gui_nick_move_end (gui_current_window);
break;
/* Alt + page up */
case KEY_PPAGE:
gui_nick_move_page_up (gui_current_window);
break;
/* Alt + page down */
case KEY_NPAGE:
gui_nick_move_page_down (gui_current_window);
break;
case 79:
/* TODO: replace 79 by constant name! */
if ((key = getch()) != ERR)
{
switch (key)
{
/* Control + Right */
case 99:
if (!gui_current_window->buffer->dcc)
gui_move_next_word (gui_current_window->buffer);
break;
/* Control + Left */
case 100:
if (!gui_current_window->buffer->dcc)
gui_move_previous_word (gui_current_window->buffer);
break;
}
}
break;
/* Alt-number: jump to window by number */
case 48: /* Alt-0 */
case 49: /* Alt-1 */
case 50: /* Alt-2 */
case 51: /* Alt-3 */
case 52: /* Alt-4 */
case 53: /* Alt-5 */
case 54: /* Alt-6 */
case 55: /* Alt-7 */
case 56: /* Alt-8 */
case 57: /* Alt-9 */
gui_switch_to_buffer_by_number (gui_current_window, (key == 48) ? 10 : key - 48);
break;
/* Alt-A: jump to buffer with activity */
case 'a':
case 'A':
if (hotlist)
{
if (!hotlist_initial_buffer)
hotlist_initial_buffer = gui_current_window->buffer;
gui_switch_to_buffer (gui_current_window, hotlist->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
else
{
if (hotlist_initial_buffer)
{
gui_switch_to_buffer (gui_current_window, hotlist_initial_buffer);
gui_redraw_buffer (gui_current_window->buffer);
hotlist_initial_buffer = NULL;
}
}
break;
/* Alt-D: jump to DCC buffer */
case 'd':
case 'D':
if (gui_current_window->buffer->dcc)
{
if (buffer_before_dcc)
{
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
gui_redraw_buffer (gui_current_window->buffer);
}
}
else
{
buffer_before_dcc = gui_current_window->buffer;
gui_switch_to_dcc_buffer ();
}
break;
/* Alt-R: clear hotlist */
case 'r':
case 'R':
if (hotlist)
{
hotlist_free_all ();
gui_redraw_buffer (gui_current_window->buffer);
}
hotlist_initial_buffer = gui_current_window->buffer;
break;
/* Alt-S: jump to server buffer */
case 's':
case 'S':
if (!gui_current_window->buffer->dcc)
{
if (SERVER(gui_current_window->buffer)->buffer !=
gui_current_window->buffer)
{
gui_switch_to_buffer (gui_current_window,
SERVER(gui_current_window->buffer)->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
break;
/* Alt-X: jump to first channel/private of next server */
case 'x':
case 'X':
if (!gui_current_window->buffer->dcc)
{
ptr_server = SERVER(gui_current_window->buffer)->next_server;
if (!ptr_server)
ptr_server = irc_servers;
while (ptr_server != SERVER(gui_current_window->buffer))
{
if (ptr_server->buffer)
break;
ptr_server = (ptr_server->next_server) ?
ptr_server->next_server : irc_servers;
}
if (ptr_server != SERVER(gui_current_window->buffer))
{
ptr_buffer = (ptr_server->channels) ?
ptr_server->channels->buffer : ptr_server->buffer;
gui_switch_to_buffer (gui_current_window, ptr_buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
break;
}
}
break;
/* send command/message */
case '\n':
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_size > 0)
{
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
history_add (gui_current_window->buffer, gui_current_window->buffer->input_buffer);
gui_current_window->buffer->input_buffer_size = 0;
gui_current_window->buffer->input_buffer_pos = 0;
gui_current_window->buffer->input_buffer_1st_display = 0;
gui_current_window->buffer->completion.position = -1;
gui_current_window->buffer->ptr_history = NULL;
ptr_buffer = gui_current_window->buffer;
user_command (SERVER(gui_current_window->buffer),
gui_current_window->buffer,
gui_current_window->buffer->input_buffer);
if (ptr_buffer == gui_current_window->buffer)
{
ptr_buffer->input_buffer[0] = '\0';
gui_draw_buffer_input (ptr_buffer, 0);
}
}
}
break;
/* other key => add to input buffer */
default:
if (gui_current_window->buffer->dcc)
{
dcc_selected = (gui_current_window->dcc_selected) ?
(t_irc_dcc *) gui_current_window->dcc_selected : dcc_list;
switch (key)
{
/* accept DCC */
case 'a':
case 'A':
if (dcc_selected
&& (DCC_IS_RECV(dcc_selected->status))
&& (dcc_selected->status == DCC_WAITING))
{
dcc_accept (dcc_selected);
}
break;
/* cancel DCC */
case 'c':
case 'C':
if (dcc_selected
&& (!DCC_ENDED(dcc_selected->status)))
{
dcc_close (dcc_selected, DCC_ABORTED);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
/* purge old DCC */
case 'p':
case 'P':
gui_current_window->dcc_selected = NULL;
ptr_dcc = dcc_list;
while (ptr_dcc)
{
ptr_dcc_next = ptr_dcc->next_dcc;
if (DCC_ENDED(ptr_dcc->status))
dcc_free (ptr_dcc);
ptr_dcc = ptr_dcc_next;
}
gui_redraw_buffer (gui_current_window->buffer);
break;
/* close DCC window */
case 'q':
case 'Q':
if (buffer_before_dcc)
{
gui_buffer_free (gui_current_window->buffer, 1);
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
}
else
gui_buffer_free (gui_current_window->buffer, 1);
gui_redraw_buffer (gui_current_window->buffer);
break;
/* remove from DCC list */
case 'r':
case 'R':
if (dcc_selected
&& (DCC_ENDED(dcc_selected->status)))
{
if (dcc_selected->next_dcc)
gui_current_window->dcc_selected = dcc_selected->next_dcc;
else
gui_current_window->dcc_selected = NULL;
dcc_free (dcc_selected);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
}
}
else
{
/*gui_printf (gui_current_window->buffer,
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/
new_char[0] = key;
new_char[1] = '\0';
decoded_string = NULL;
/* UTF-8 input */
if (key == 0xC3)
{
if ((key = getch()) != ERR)
{
new_char[1] = key;
new_char[2] = '\0';
decoded_string = weechat_convert_encoding (local_charset, cfg_look_charset_internal, new_char);
}
}
gui_buffer_insert_string (gui_current_window->buffer,
(decoded_string) ? decoded_string : new_char,
gui_current_window->buffer->input_buffer_pos);
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_current_window->buffer->completion.position = -1;
if (decoded_string)
free (decoded_string);
}
break;
gui_curses_resize_handler ();
continue;
}
if (key < 32)
{
key_str[0] = '^';
key_str[1] = (char) key + '@';
key_str[2] = '\0';
}
else if (key == 127)
{
key_str[0] = '^';
key_str[1] = '?';
key_str[2] = '\0';
}
else
{
if (key > 0xff)
{
key_str[0] = (char) (key >> 8);
key_str[1] = (char) (key & 0xff);
key_str[2] = '\0';
}
else
{
key_str[0] = (char) key;
key_str[1] = '\0';
}
}
if (strcmp (key_str, "^") == 0)
{
key_str[1] = '^';
key_str[2] = '\0';
}
/*gui_printf (gui_current_window->buffer, "gui_input_read: key = %s (%d)\n", key_str, key);*/
if (gui_key_pressed (key_str) != 0)
gui_input_insert_char (key);
i++;
}
}
@@ -723,6 +225,14 @@ gui_main_loop ()
{
old_sec = local_time->tm_sec;
if (cfg_look_infobar_seconds)
{
gui_draw_buffer_infobar_time (gui_current_window->buffer);
wmove (gui_current_window->win_input,
0, gui_current_window->win_input_x);
wrefresh (gui_current_window->win_input);
}
/* infobar count down */
if (gui_infobar && gui_infobar->remaining_time > 0)
{
@@ -807,7 +317,7 @@ gui_main_loop ()
{
if (FD_ISSET (STDIN_FILENO, &read_fd))
{
gui_read_keyb ();
gui_input_read ();
}
if ((weechat_fifo != -1) && (FD_ISSET (weechat_fifo, &read_fd)))
{
+826 -61
View File
@@ -34,6 +34,7 @@
#include "../common/weechat.h"
#include "gui.h"
#include "../common/command.h"
#include "../common/weeconfig.h"
#include "../common/hotlist.h"
#include "../common/log.h"
@@ -89,6 +90,8 @@ gui_window_new (int x, int y, int width, int height)
new_window->win_nick_height = 0;
new_window->win_nick_start = 0;
new_window->win_input_x = 0;
new_window->win_title = NULL;
new_window->win_chat = NULL;
new_window->win_nick = NULL;
@@ -552,12 +555,12 @@ gui_new_message (t_gui_buffer *buffer)
}
/*
* gui_optimize_input_buffer_size: optimize input buffer size by adding
* gui_input_optimize_buffer_size: optimize input buffer size by adding
* or deleting data block (predefined size)
*/
void
gui_optimize_input_buffer_size (t_gui_buffer *buffer)
gui_input_optimize_buffer_size (t_gui_buffer *buffer)
{
int optimal_size;
@@ -571,29 +574,343 @@ gui_optimize_input_buffer_size (t_gui_buffer *buffer)
}
/*
* gui_delete_previous_word: delete previous word
* gui_input_insert_string: insert a string into the input buffer
*/
void
gui_delete_previous_word (t_gui_buffer *buffer)
gui_input_insert_string (char *string, int pos)
{
int i, start, end, length;
length = strlen (string);
/* increase buffer size */
gui_current_window->buffer->input_buffer_size += length;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
/* move end of string to the right */
start = pos + length;
end = gui_current_window->buffer->input_buffer_size - 1;
for (i = end; i >= start; i--)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i - length];
/* insert new string */
strncpy (gui_current_window->buffer->input_buffer + pos, string, length);
}
/*
* gui_input_insert_char: insert a char into input buffer
*/
void
gui_input_insert_char (int key)
{
char new_char[3];
t_irc_dcc *dcc_selected, *ptr_dcc, *ptr_dcc_next;
if (key < 32)
return;
if (gui_current_window->buffer->dcc)
{
dcc_selected = (gui_current_window->dcc_selected) ?
(t_irc_dcc *) gui_current_window->dcc_selected : dcc_list;
switch (key)
{
/* accept DCC */
case 'a':
case 'A':
if (dcc_selected
&& (DCC_IS_RECV(dcc_selected->status))
&& (dcc_selected->status == DCC_WAITING))
{
dcc_accept (dcc_selected);
}
break;
/* cancel DCC */
case 'c':
case 'C':
if (dcc_selected
&& (!DCC_ENDED(dcc_selected->status)))
{
dcc_close (dcc_selected, DCC_ABORTED);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
/* purge old DCC */
case 'p':
case 'P':
gui_current_window->dcc_selected = NULL;
ptr_dcc = dcc_list;
while (ptr_dcc)
{
ptr_dcc_next = ptr_dcc->next_dcc;
if (DCC_ENDED(ptr_dcc->status))
dcc_free (ptr_dcc);
ptr_dcc = ptr_dcc_next;
}
gui_redraw_buffer (gui_current_window->buffer);
break;
/* close DCC window */
case 'q':
case 'Q':
if (buffer_before_dcc)
{
gui_buffer_free (gui_current_window->buffer, 1);
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
}
else
gui_buffer_free (gui_current_window->buffer, 1);
gui_redraw_buffer (gui_current_window->buffer);
break;
/* remove from DCC list */
case 'r':
case 'R':
if (dcc_selected
&& (DCC_ENDED(dcc_selected->status)))
{
if (dcc_selected->next_dcc)
gui_current_window->dcc_selected = dcc_selected->next_dcc;
else
gui_current_window->dcc_selected = NULL;
dcc_free (dcc_selected);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
}
}
else
{
/*gui_printf (gui_current_window->buffer,
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/
new_char[0] = key;
new_char[1] = '\0';
gui_input_insert_string (new_char,
gui_current_window->buffer->input_buffer_pos);
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_current_window->buffer->completion.position = -1;
}
}
/*
* gui_input_return: terminate line (return pressed)
*/
void
gui_input_return ()
{
t_gui_buffer *ptr_buffer;
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_size > 0)
{
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
history_add (gui_current_window->buffer, gui_current_window->buffer->input_buffer);
gui_current_window->buffer->input_buffer_size = 0;
gui_current_window->buffer->input_buffer_pos = 0;
gui_current_window->buffer->input_buffer_1st_display = 0;
gui_current_window->buffer->completion.position = -1;
gui_current_window->buffer->ptr_history = NULL;
ptr_buffer = gui_current_window->buffer;
user_command (SERVER(gui_current_window->buffer),
gui_current_window->buffer,
gui_current_window->buffer->input_buffer);
if (ptr_buffer == gui_current_window->buffer)
{
ptr_buffer->input_buffer[0] = '\0';
gui_draw_buffer_input (ptr_buffer, 0);
}
}
}
}
/*
* gui_input_tab: tab key => completion
*/
void
gui_input_tab ()
{
int i;
if (!gui_current_window->buffer->dcc)
{
completion_search (&(gui_current_window->buffer->completion),
CHANNEL(gui_current_window->buffer),
gui_current_window->buffer->input_buffer,
gui_current_window->buffer->input_buffer_size,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.word_found)
{
/* replace word with new completed word into input buffer */
if (gui_current_window->buffer->completion.diff_size > 0)
{
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
for (i = gui_current_window->buffer->input_buffer_size - 1;
i >= gui_current_window->buffer->completion.position_replace +
(int)strlen (gui_current_window->buffer->completion.word_found); i--)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
}
else
{
for (i = gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
i < gui_current_window->buffer->input_buffer_size; i++)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
}
strncpy (gui_current_window->buffer->input_buffer + gui_current_window->buffer->completion.position_replace,
gui_current_window->buffer->completion.word_found,
strlen (gui_current_window->buffer->completion.word_found));
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
/* position is < 0 this means only one word was found to complete,
so reinit to stop completion */
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position =
gui_current_window->buffer->input_buffer_pos;
/* add space or completor to the end of completion, if needed */
if ((gui_current_window->buffer->completion.context == COMPLETION_COMMAND)
|| (gui_current_window->buffer->completion.context == COMPLETION_COMMAND_ARG))
{
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_input_insert_string (" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
else
{
/* add nick completor if position 0 and completing nick */
if ((gui_current_window->buffer->completion.base_word_pos == 0)
&& (gui_current_window->buffer->completion.context == COMPLETION_NICK))
{
if (strncmp (gui_current_window->buffer->input_buffer + gui_current_window->buffer->input_buffer_pos,
cfg_look_completor, strlen (cfg_look_completor)) != 0)
gui_input_insert_string (cfg_look_completor,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position += strlen (cfg_look_completor);
gui_current_window->buffer->input_buffer_pos += strlen (cfg_look_completor);
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_input_insert_string (" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
}
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_backspace: backspace key
*/
void
gui_input_backspace ()
{
int i;
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = gui_current_window->buffer->input_buffer_pos-1;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer_pos--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
}
/*
* gui_input_delete: delete key
*/
void
gui_input_delete ()
{
int i;
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
i = gui_current_window->buffer->input_buffer_pos;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
}
/*
* gui_input_delete_previous_word: delete previous word
*/
void
gui_input_delete_previous_word ()
{
int i, j, num_char_deleted, num_char_end;
if (buffer->input_buffer_pos > 0)
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = buffer->input_buffer_pos - 1;
i = gui_current_window->buffer->input_buffer_pos - 1;
while ((i >= 0) &&
(buffer->input_buffer[i] == ' '))
(gui_current_window->buffer->input_buffer[i] == ' '))
i--;
if (i >= 0)
{
while ((i >= 0) &&
(buffer->input_buffer[i] != ' '))
(gui_current_window->buffer->input_buffer[i] != ' '))
i--;
if (i >= 0)
{
while ((i >= 0) &&
(buffer->input_buffer[i] == ' '))
(gui_current_window->buffer->input_buffer[i] == ' '))
i--;
}
}
@@ -601,110 +918,554 @@ gui_delete_previous_word (t_gui_buffer *buffer)
if (i >= 0)
i++;
i++;
num_char_deleted = buffer->input_buffer_pos - i;
num_char_end = buffer->input_buffer_size -
buffer->input_buffer_pos;
num_char_deleted = gui_current_window->buffer->input_buffer_pos - i;
num_char_end = gui_current_window->buffer->input_buffer_size -
gui_current_window->buffer->input_buffer_pos;
for (j = 0; j < num_char_end; j++)
buffer->input_buffer[i + j] =
buffer->input_buffer[buffer->input_buffer_pos + j];
gui_current_window->buffer->input_buffer[i + j] =
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos + j];
buffer->input_buffer_size -= num_char_deleted;
buffer->input_buffer[buffer->input_buffer_size] = '\0';
buffer->input_buffer_pos = i;
gui_draw_buffer_input (buffer, 0);
gui_optimize_input_buffer_size (buffer);
buffer->completion.position = -1;
gui_current_window->buffer->input_buffer_size -= num_char_deleted;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_current_window->buffer->input_buffer_pos = i;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
/*
* gui_move_previous_word: move to beginning of previous word
* gui_input_delete_next_word: delete next word
*/
void
gui_move_previous_word (t_gui_buffer *buffer)
gui_input_delete_next_word ()
{
int i, j, num_char_deleted;
i = gui_current_window->buffer->input_buffer_pos;
while (i < gui_current_window->buffer->input_buffer_size)
{
if ((gui_current_window->buffer->input_buffer[i] == ' ')
&& i != gui_current_window->buffer->input_buffer_pos)
break;
i++;
}
num_char_deleted = i - gui_current_window->buffer->input_buffer_pos;
for (j = i; j < gui_current_window->buffer->input_buffer_size; j++)
gui_current_window->buffer->input_buffer[j - num_char_deleted] =
gui_current_window->buffer->input_buffer[j];
gui_current_window->buffer->input_buffer_size -= num_char_deleted;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_delete_begin_of_line: delete all from cursor pos to beginning of line
*/
void
gui_input_delete_begin_of_line ()
{
int i;
if (buffer->input_buffer_pos > 0)
for (i = gui_current_window->buffer->input_buffer_pos;
i < gui_current_window->buffer->input_buffer_size; i++)
gui_current_window->buffer->input_buffer[i - gui_current_window->buffer->input_buffer_pos] =
gui_current_window->buffer->input_buffer[i];
gui_current_window->buffer->input_buffer_size -=
gui_current_window->buffer->input_buffer_pos;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_delete_end_of_line: delete all from cursor pos to end of line
*/
void
gui_input_delete_end_of_line ()
{
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] = ' ';
gui_current_window->buffer->input_buffer_size = gui_current_window->buffer->input_buffer_pos ;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_delete_line: delete entire line
*/
void
gui_input_delete_line ()
{
gui_current_window->buffer->input_buffer[0] = '\0';
gui_current_window->buffer->input_buffer_size = 0;
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_home: home key
*/
void
gui_input_home ()
{
if (!gui_current_window->buffer->dcc)
{
i = buffer->input_buffer_pos - 1;
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_end: end key
*/
void
gui_input_end ()
{
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_left: move to previous char
*/
void
gui_input_left ()
{
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos--;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_previous_word: move to beginning of previous word
*/
void
gui_input_previous_word ()
{
int i;
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = gui_current_window->buffer->input_buffer_pos - 1;
while ((i >= 0) &&
(buffer->input_buffer[i] == ' '))
(gui_current_window->buffer->input_buffer[i] == ' '))
i--;
if (i < 0)
buffer->input_buffer_pos = 0;
gui_current_window->buffer->input_buffer_pos = 0;
else
{
while ((i >= 0) &&
(buffer->input_buffer[i] != ' '))
(gui_current_window->buffer->input_buffer[i] != ' '))
i--;
buffer->input_buffer_pos = i + 1;
gui_current_window->buffer->input_buffer_pos = i + 1;
}
gui_draw_buffer_input (buffer, 0);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
/*
* gui_move_next_word: move to the end of next
* gui_input_right: move to previous char
*/
void
gui_move_next_word (t_gui_buffer *buffer)
gui_input_right ()
{
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_next_word: move to the end of next
*/
void
gui_input_next_word ()
{
int i;
if (buffer->input_buffer_pos <
buffer->input_buffer_size + 1)
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size + 1)
{
i = buffer->input_buffer_pos;
while ((i <= buffer->input_buffer_size) &&
(buffer->input_buffer[i] == ' '))
i = gui_current_window->buffer->input_buffer_pos;
while ((i <= gui_current_window->buffer->input_buffer_size) &&
(gui_current_window->buffer->input_buffer[i] == ' '))
i++;
if (i > buffer->input_buffer_size)
buffer->input_buffer_pos = i - 1;
if (i > gui_current_window->buffer->input_buffer_size)
gui_current_window->buffer->input_buffer_pos = i - 1;
else
{
while ((i <= buffer->input_buffer_size) &&
(buffer->input_buffer[i] != ' '))
while ((i <= gui_current_window->buffer->input_buffer_size) &&
(gui_current_window->buffer->input_buffer[i] != ' '))
i++;
if (i > buffer->input_buffer_size)
buffer->input_buffer_pos =
buffer->input_buffer_size;
if (i > gui_current_window->buffer->input_buffer_size)
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
else
buffer->input_buffer_pos = i;
gui_current_window->buffer->input_buffer_pos = i;
}
gui_draw_buffer_input (buffer, 0);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
/*
* gui_buffer_insert_string: insert a string into the input buffer
* gui_input_up: recall last command or move to previous DCC in list
*/
void
gui_buffer_insert_string (t_gui_buffer *buffer, char *string, int pos)
gui_input_up ()
{
int i, start, end, length;
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (gui_current_window->dcc_selected
&& ((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc)
{
if (gui_current_window->dcc_selected ==
gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->prev_dcc;
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->next_history;
if (!gui_current_window->buffer->ptr_history)
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
}
else
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_down: recall next command or move to next DCC in list
*/
void
gui_input_down ()
{
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (!gui_current_window->dcc_selected
|| ((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc)
{
if (gui_current_window->dcc_last_displayed
&& (gui_current_window->dcc_selected ==
gui_current_window->dcc_last_displayed))
{
if (gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->next_dcc;
else
gui_current_window->dcc_first =
dcc_list->next_dcc;
}
if (gui_current_window->dcc_selected)
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc;
else
gui_current_window->dcc_selected =
dcc_list->next_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->prev_history;
if (gui_current_window->buffer->ptr_history)
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
else
gui_current_window->buffer->input_buffer_size = 0;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
if (gui_current_window->buffer->ptr_history)
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_jump_smart: jump to buffer with activity (alt-A by default)
*/
void
gui_input_jump_smart ()
{
if (hotlist)
{
if (!hotlist_initial_buffer)
hotlist_initial_buffer = gui_current_window->buffer;
gui_switch_to_buffer (gui_current_window, hotlist->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
else
{
if (hotlist_initial_buffer)
{
gui_switch_to_buffer (gui_current_window, hotlist_initial_buffer);
gui_redraw_buffer (gui_current_window->buffer);
hotlist_initial_buffer = NULL;
}
}
}
/*
* gui_input_jump_dcc: jump to DCC buffer
*/
void
gui_input_jump_dcc ()
{
if (gui_current_window->buffer->dcc)
{
if (buffer_before_dcc)
{
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
gui_redraw_buffer (gui_current_window->buffer);
}
}
else
{
buffer_before_dcc = gui_current_window->buffer;
gui_switch_to_dcc_buffer ();
}
}
/*
* gui_input_jump_server: jump to server buffer
*/
void
gui_input_jump_server ()
{
if (!gui_current_window->buffer->dcc)
{
if (SERVER(gui_current_window->buffer)->buffer !=
gui_current_window->buffer)
{
gui_switch_to_buffer (gui_current_window,
SERVER(gui_current_window->buffer)->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
}
/*
* gui_input_jump_next_server: jump to next server
*/
void
gui_input_jump_next_server ()
{
t_irc_server *ptr_server;
t_gui_buffer *ptr_buffer;
length = strlen (string);
if (!gui_current_window->buffer->dcc)
{
ptr_server = SERVER(gui_current_window->buffer)->next_server;
if (!ptr_server)
ptr_server = irc_servers;
while (ptr_server != SERVER(gui_current_window->buffer))
{
if (ptr_server->buffer)
break;
ptr_server = (ptr_server->next_server) ?
ptr_server->next_server : irc_servers;
}
if (ptr_server != SERVER(gui_current_window->buffer))
{
ptr_buffer = (ptr_server->channels) ?
ptr_server->channels->buffer : ptr_server->buffer;
gui_switch_to_buffer (gui_current_window, ptr_buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
}
/*
* gui_input_hotlist_clear: clear hotlist
*/
void
gui_input_hotlist_clear ()
{
if (hotlist)
{
hotlist_free_all ();
gui_redraw_buffer (gui_current_window->buffer);
}
hotlist_initial_buffer = gui_current_window->buffer;
}
/*
* gui_input_infobar_clear: clear infobar
*/
void
gui_input_infobar_clear ()
{
gui_infobar_remove ();
gui_draw_buffer_infobar (gui_current_window->buffer, 1);
}
/*
* gui_switch_to_previous_buffer: switch to previous buffer
*/
void
gui_switch_to_previous_buffer ()
{
if (!gui_ok)
return;
/* increase buffer size */
buffer->input_buffer_size += length;
gui_optimize_input_buffer_size (buffer);
buffer->input_buffer[buffer->input_buffer_size] = '\0';
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
/* move end of string to the right */
start = pos + length;
end = buffer->input_buffer_size - 1;
for (i = end; i >= start; i--)
buffer->input_buffer[i] =
buffer->input_buffer[i - length];
if (gui_current_window->buffer->prev_buffer)
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer->prev_buffer);
else
gui_switch_to_buffer (gui_current_window, last_gui_buffer);
/* insert new string */
strncpy (buffer->input_buffer + pos, string, length);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_next_buffer: switch to next buffer
*/
void
gui_switch_to_next_buffer ()
{
if (!gui_ok)
return;
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
if (gui_current_window->buffer->next_buffer)
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer->next_buffer);
else
gui_switch_to_buffer (gui_current_window, gui_buffers);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_previous_window: switch to previous window
*/
void
gui_switch_to_previous_window ()
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (gui_current_window->prev_window) ? gui_current_window->prev_window : last_gui_window;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_next_window: switch to next window
*/
void
gui_switch_to_next_window ()
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (gui_current_window->next_window) ? gui_current_window->next_window : gui_windows;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
@@ -716,6 +1477,10 @@ gui_switch_to_buffer_by_number (t_gui_window *window, int number)
{
t_gui_buffer *ptr_buffer;
/* invalid buffer */
if (number < 0)
return NULL;
/* buffer is currently displayed ? */
if (number == window->buffer->number)
return window->buffer;
+528
View File
@@ -0,0 +1,528 @@
/*
* Copyright (c) 2003-2005 by FlashCode <flashcode@flashtux.org>
* See README for License detail, AUTHORS for developers list.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* gui-keyboard: keyboard functions (GUI independant) */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "../common/weechat.h"
#include "gui.h"
#include "../common/command.h"
t_gui_key *gui_keys = NULL;
t_gui_key *last_gui_key = NULL;
char gui_key_buffer[128];
t_gui_key_function gui_key_functions[] =
{ { "return", gui_input_return,
N_("terminate line") },
{ "tab", gui_input_tab,
N_("complete word") },
{ "backspace", gui_input_backspace,
N_("delete previous char") },
{ "delete", gui_input_delete,
N_("delete next char") },
{ "delete_end_line", gui_input_delete_end_of_line,
N_("delete until end of line") },
{ "delete_beginning_line", gui_input_delete_begin_of_line,
N_("delete until beginning of line") },
{ "delete_line", gui_input_delete_line,
N_("delete entire line") },
{ "delete_previous_word", gui_input_delete_previous_word,
N_("delete previous word") },
{ "delete_next_word", gui_input_delete_next_word,
N_("delete next word") },
{ "home", gui_input_home,
N_("go to beginning of line") },
{ "end", gui_input_end,
N_("go to end of line") },
{ "left", gui_input_left,
N_("move one char left") },
{ "previous_word", gui_input_previous_word,
N_("move to previous word") },
{ "right", gui_input_right,
N_("move one char right") },
{ "next_word", gui_input_next_word,
N_("move to next word") },
{ "up", gui_input_up,
N_("call previous command in history") },
{ "down", gui_input_down,
N_("call next command in history") },
{ "page_up", gui_input_page_up,
N_("scroll one page up") },
{ "page_down", gui_input_page_down,
N_("scroll one page down") },
{ "infobar_clear", gui_input_infobar_clear,
N_("clear infobar") },
{ "nick_page_up", gui_input_nick_page_up,
N_("scroll nicklist one page up") },
{ "nick_page_down", gui_input_nick_page_down,
N_("scroll nicklist one page down") },
{ "nick_beginning", gui_input_nick_beginning,
N_("display beginning of nicklist") },
{ "nick_end", gui_input_nick_end,
N_("display end of nicklist") },
{ "refresh", gui_curses_resize_handler,
N_("refresh screen") },
{ "jump_smart", gui_input_jump_smart,
N_("jump to buffer with activity") },
{ "jump_dcc", gui_input_jump_dcc,
N_("jump to DCC buffer") },
{ "jump_server", gui_input_jump_server,
N_("jump to server buffer") },
{ "jump_next_server", gui_input_jump_next_server,
N_("jump to next server") },
{ "hotlist_clear", gui_input_hotlist_clear,
N_("clear hotlist") },
{ NULL, NULL, NULL }
};
/*
* gui_key_init: init keyboard (create default key bindings)
*/
void
gui_key_init ()
{
gui_key_buffer[0] = '\0';
gui_input_default_key_bindings ();
}
/*
* gui_key_get_internal_code: get internal code from user key name
* for example: return "^R" for "ctrl-R"
*/
char *
gui_key_get_internal_code (char *key)
{
char *result;
if ((result = (char *) malloc (strlen (key) + 1)))
{
result[0] = '\0';
while (key[0])
{
if (strncasecmp (key, "meta2-", 6) == 0)
{
strcat (result, "^[[");
key += 6;
}
if (strncasecmp (key, "meta-", 5) == 0)
{
strcat (result, "^[");
key += 5;
}
else if (strncasecmp (key, "ctrl-", 5) == 0)
{
strcat (result, "^");
key += 5;
}
else
{
strncat (result, key, 1);
key++;
}
}
}
else
return NULL;
return result;
}
/*
* gui_key_get_expanded_name: get expanded name from internal key code
* for example: return "ctrl-R" for "^R"
*/
char *
gui_key_get_expanded_name (char *key)
{
char *result;
if ((result = (char *) malloc ((strlen (key) * 5) + 1)))
{
result[0] = '\0';
while (key[0])
{
if (strncasecmp (key, "^[[", 3) == 0)
{
strcat (result, "meta2-");
key += 3;
}
if (strncasecmp (key, "^[", 2) == 0)
{
strcat (result, "meta-");
key += 2;
}
else if (key[0] == '^')
{
strcat (result, "ctrl-");
key++;
}
else
{
strncat (result, key, 1);
key++;
}
}
}
else
return NULL;
return result;
}
/*
* gui_key_find_pos: find position for a key (for sorting keys list)
*/
t_gui_key *
gui_key_find_pos (t_gui_key *key)
{
t_gui_key *ptr_key;
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
if (strcasecmp (key->key, ptr_key->key) < 0)
return ptr_key;
}
return NULL;
}
/*
* gui_key_insert_sorted: insert key into sorted list
*/
void
gui_key_insert_sorted (t_gui_key *key)
{
t_gui_key *pos_key;
if (gui_keys)
{
pos_key = gui_key_find_pos (key);
if (pos_key)
{
/* insert key into the list (before key found) */
key->prev_key = pos_key->prev_key;
key->next_key = pos_key;
if (pos_key->prev_key)
pos_key->prev_key->next_key = key;
else
gui_keys = key;
pos_key->prev_key = key;
}
else
{
/* add key to the end */
key->prev_key = last_gui_key;
key->next_key = NULL;
last_gui_key->next_key = key;
last_gui_key = key;
}
}
else
{
key->prev_key = NULL;
key->next_key = NULL;
gui_keys = key;
last_gui_key = key;
}
}
/*
* gui_key_new: add a new key in keys list
*/
t_gui_key *
gui_key_new (char *key, char *command, void *function)
{
t_gui_key *new_key;
char *internal_code;
if ((new_key = (t_gui_key *) malloc (sizeof (t_gui_key))))
{
internal_code = gui_key_get_internal_code (key);
new_key->key = (internal_code) ? strdup (internal_code) : strdup (key);
if (internal_code)
free (internal_code);
new_key->command = (command) ? strdup (command) : NULL;
new_key->function = function;
gui_key_insert_sorted (new_key);
}
else
return NULL;
return new_key;
}
/*
* gui_key_search: search a key
*/
t_gui_key *
gui_key_search (char *key)
{
t_gui_key *ptr_key;
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
if (strcasecmp (ptr_key->key, key) == 0)
return ptr_key;
}
/* key not found */
return NULL;
}
/*
* gui_key_cmp: compares 2 keys
*/
int
gui_key_cmp (char *key, char *search)
{
while (search[0])
{
if (toupper(key[0]) != toupper(search[0]))
return search[0] - key[0];
key++;
search++;
}
return 0;
}
/*
* gui_key_search_part: search a key (maybe part of string)
*/
t_gui_key *
gui_key_search_part (char *key)
{
t_gui_key *ptr_key;
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
if (gui_key_cmp (ptr_key->key, key) == 0)
return ptr_key;
}
/* key not found */
return NULL;
}
/*
* gui_key_function_search_by_name: search a function by name
*/
void *
gui_key_function_search_by_name (char *name)
{
int i;
i = 0;
while (gui_key_functions[i].function_name)
{
if (strcasecmp (gui_key_functions[i].function_name, name) == 0)
return gui_key_functions[i].function;
i++;
}
/* function not found */
return NULL;
}
/*
* gui_key_function_search_by_ptr: search a function by pointer
*/
char *
gui_key_function_search_by_ptr (void *function)
{
int i;
i = 0;
while (gui_key_functions[i].function_name)
{
if (gui_key_functions[i].function == function)
return gui_key_functions[i].function_name;
i++;
}
/* function not found */
return NULL;
}
/*
* gui_key_bind: bind a key to a function (command or special function)
*/
t_gui_key *
gui_key_bind (char *key, char *command)
{
t_gui_key_function *ptr_function;
t_gui_key *new_key;
if (!key || !command)
{
wee_log_printf (_("%s unable to bind key \"%s\"\n"),
WEECHAT_ERROR, key);
return NULL;
}
ptr_function = NULL;
if (command[0] != '/')
{
ptr_function = gui_key_function_search_by_name (command);
if (!ptr_function)
{
wee_log_printf (_("%s unable to bind key \"%s\" (invalid function name: \"%s\")\n"),
WEECHAT_ERROR, key, command);
return NULL;
}
}
gui_key_unbind (key);
new_key = gui_key_new (key,
(ptr_function) ? NULL : command,
ptr_function);
if (!new_key)
{
wee_log_printf (_("%s not enough memory for key binding\n"),
WEECHAT_ERROR);
return NULL;
}
return new_key;
}
/*
* gui_key_unbind: remove a key binding
*/
int
gui_key_unbind (char *key)
{
t_gui_key *ptr_key;
char *internal_code;
internal_code = gui_key_get_internal_code (key);
ptr_key = gui_key_search ((internal_code) ? internal_code : key);
if (ptr_key)
gui_key_free (ptr_key);
if (internal_code)
free (internal_code);
return (ptr_key != NULL);
}
/*
* gui_key_pressed: treat new key pressed
* return: 1 if key should be added to input buffer
* 0 otherwise
*/
int
gui_key_pressed (char *key_str)
{
int first_key;
t_gui_key *ptr_key;
first_key = (gui_key_buffer[0] == '\0');
strcat (gui_key_buffer, key_str);
ptr_key = gui_key_search_part (gui_key_buffer);
if (ptr_key)
{
if (strcasecmp (ptr_key->key, gui_key_buffer) == 0)
{
/* exact combo found => execute function or command */
gui_key_buffer[0] = '\0';
if (ptr_key->command)
user_command (SERVER(gui_current_window->buffer),
gui_current_window->buffer,
ptr_key->command);
else
(void)(ptr_key->function)();
}
//else
// gui_printf (gui_current_window->buffer, "partial key found\n");
return 0;
}
gui_key_buffer[0] = '\0';
/* if this is first key and not found (even partial) => return 1
else return 0 (= silently discard sequence of bad keys) */
return first_key;
}
/*
* key_free: delete a key binding
*/
void
gui_key_free (t_gui_key *key)
{
/* free memory */
if (key->key)
free (key->key);
if (key->command)
free (key->command);
/* remove key from keys list */
if (key->prev_key)
key->prev_key->next_key = key->next_key;
if (key->next_key)
key->next_key->prev_key = key->prev_key;
if (gui_keys == key)
gui_keys = key->next_key;
if (last_gui_key == key)
last_gui_key = key->prev_key;
free (key);
}
/*
* gui_key_free_all: delete all key bindings
*/
void
gui_key_free_all ()
{
while (gui_keys)
gui_key_free (gui_keys);
}
+103 -42
View File
@@ -26,7 +26,7 @@
#define INPUT_BUFFER_BLOCK_SIZE 256
#define NUM_COLORS 50
#define NUM_COLORS 51
#define COLOR_WIN_TITLE 1
#define COLOR_WIN_CHAT 2
#define COLOR_WIN_CHAT_TIME 3
@@ -45,31 +45,32 @@
#define COLOR_WIN_STATUS_DATA_OTHER 16
#define COLOR_WIN_STATUS_MORE 17
#define COLOR_WIN_INFOBAR 18
#define COLOR_WIN_INFOBAR_HIGHLIGHT 19
#define COLOR_WIN_INPUT 20
#define COLOR_WIN_INPUT_CHANNEL 21
#define COLOR_WIN_INPUT_NICK 22
#define COLOR_WIN_NICK 23
#define COLOR_WIN_NICK_AWAY 24
#define COLOR_WIN_NICK_CHANOWNER 25
#define COLOR_WIN_NICK_CHANADMIN 26
#define COLOR_WIN_NICK_OP 27
#define COLOR_WIN_NICK_HALFOP 28
#define COLOR_WIN_NICK_VOICE 29
#define COLOR_WIN_NICK_MORE 30
#define COLOR_WIN_NICK_SEP 31
#define COLOR_WIN_NICK_SELF 32
#define COLOR_WIN_NICK_PRIVATE 33
#define COLOR_WIN_NICK_FIRST 34
#define COLOR_WIN_NICK_LAST 43
#define COLOR_WIN_INFOBAR_DELIMITERS 19
#define COLOR_WIN_INFOBAR_HIGHLIGHT 20
#define COLOR_WIN_INPUT 21
#define COLOR_WIN_INPUT_CHANNEL 22
#define COLOR_WIN_INPUT_NICK 23
#define COLOR_WIN_NICK 24
#define COLOR_WIN_NICK_AWAY 25
#define COLOR_WIN_NICK_CHANOWNER 26
#define COLOR_WIN_NICK_CHANADMIN 27
#define COLOR_WIN_NICK_OP 28
#define COLOR_WIN_NICK_HALFOP 29
#define COLOR_WIN_NICK_VOICE 30
#define COLOR_WIN_NICK_MORE 31
#define COLOR_WIN_NICK_SEP 32
#define COLOR_WIN_NICK_SELF 33
#define COLOR_WIN_NICK_PRIVATE 34
#define COLOR_WIN_NICK_FIRST 35
#define COLOR_WIN_NICK_LAST 44
#define COLOR_WIN_NICK_NUMBER (COLOR_WIN_NICK_LAST - COLOR_WIN_NICK_FIRST + 1)
#define COLOR_DCC_SELECTED 44
#define COLOR_DCC_WAITING 45
#define COLOR_DCC_CONNECTING 46
#define COLOR_DCC_ACTIVE 47
#define COLOR_DCC_DONE 48
#define COLOR_DCC_FAILED 49
#define COLOR_DCC_ABORTED 50
#define COLOR_DCC_SELECTED 45
#define COLOR_DCC_WAITING 46
#define COLOR_DCC_CONNECTING 47
#define COLOR_DCC_ACTIVE 48
#define COLOR_DCC_DONE 49
#define COLOR_DCC_FAILED 40
#define COLOR_DCC_ABORTED 51
#define SERVER(buffer) ((t_irc_server *)(buffer->server))
#define CHANNEL(buffer) ((t_irc_channel *)(buffer->channel))
@@ -219,6 +220,9 @@ struct t_gui_window
int win_nick_height; /* height of nick window */
int win_nick_start; /* # of 1st nick for display (scroll) */
/* input window settings */
int win_input_x; /* position of cursor in input window */
/* windows for Curses GUI */
void *win_title; /* title window */
void *win_chat; /* chat window (example: channel) */
@@ -252,6 +256,26 @@ struct t_gui_window
t_gui_window *next_window; /* link to next window */
};
typedef struct t_gui_key t_gui_key;
struct t_gui_key
{
char *key; /* key combo (ex: a, ^W, ^W^C, meta-a) */
char *command; /* associated command (may be NULL) */
void (*function)(); /* associated function (if cmd is NULL) */
t_gui_key *prev_key; /* link to previous key */
t_gui_key *next_key; /* link to next key */
};
typedef struct t_gui_key_function t_gui_key_function;
struct t_gui_key_function
{
char *function_name; /* name of function */
void (*function)(); /* associated function */
char *description; /* description of function */
};
/* variables */
extern int gui_init_ok;
@@ -264,8 +288,11 @@ extern t_gui_buffer *gui_buffers;
extern t_gui_buffer *last_gui_buffer;
extern t_gui_buffer *buffer_before_dcc;
extern t_gui_infobar *gui_infobar;
extern t_gui_key *gui_keys;
extern t_gui_key *last_gui_key;
extern t_gui_key_function gui_key_functions[];
/* GUI independent functions */
/* GUI independent functions: windows & buffers */
extern t_gui_window *gui_window_new (int, int, int, int);
extern t_gui_buffer *gui_buffer_new (t_gui_window *, void *, void *, int, int);
@@ -277,17 +304,53 @@ extern void gui_infobar_remove ();
extern void gui_buffer_free (t_gui_buffer *, int);
extern t_gui_line *gui_new_line (t_gui_buffer *);
extern t_gui_message *gui_new_message (t_gui_buffer *);
extern void gui_optimize_input_buffer_size (t_gui_buffer *);
extern void gui_delete_previous_word (t_gui_buffer *);
extern void gui_move_previous_word (t_gui_buffer *);
extern void gui_move_next_word (t_gui_buffer *);
extern void gui_buffer_insert_string (t_gui_buffer *, char *, int);
extern void gui_input_insert_char ();
extern void gui_input_return ();
extern void gui_input_tab ();
extern void gui_input_backspace ();
extern void gui_input_delete ();
extern void gui_input_delete_previous_word ();
extern void gui_input_delete_next_word ();
extern void gui_input_delete_begin_of_line ();
extern void gui_input_delete_end_of_line ();
extern void gui_input_delete_line ();
extern void gui_input_home ();
extern void gui_input_end ();
extern void gui_input_left ();
extern void gui_input_previous_word ();
extern void gui_input_right ();
extern void gui_input_next_word ();
extern void gui_input_up ();
extern void gui_input_down ();
extern void gui_input_jump_smart ();
extern void gui_input_jump_dcc ();
extern void gui_input_jump_server ();
extern void gui_input_jump_next_server ();
extern void gui_input_hotlist_clear ();
extern void gui_input_infobar_clear ();
extern void gui_switch_to_previous_buffer ();
extern void gui_switch_to_next_buffer ();
extern void gui_switch_to_previous_window ();
extern void gui_switch_to_next_window ();
extern t_gui_buffer *gui_switch_to_buffer_by_number (t_gui_window *, int);
extern void gui_move_buffer_to_number (t_gui_window *, int);
extern void gui_window_print_log (t_gui_window *);
extern void gui_buffer_print_log (t_gui_buffer *);
/* GUI dependant functions */
/* GUI independent functions: keys */
extern void gui_key_init ();
extern char *gui_key_get_internal_code (char *);
extern char *gui_key_get_expanded_name (char *);
extern void *gui_key_function_search_by_name (char *);
extern char *gui_key_function_search_by_ptr (void *);
extern t_gui_key *gui_key_bind (char *, char *);
extern int gui_key_unbind (char *);
extern int gui_key_pressed (char *);
extern void gui_key_free (t_gui_key *);
extern void gui_key_free_all ();
/* GUI dependant functions: display */
extern int gui_assign_color (int *, char *);
extern int gui_get_color_by_name (char *);
@@ -298,22 +361,19 @@ extern void gui_draw_buffer_title (t_gui_buffer *, int);
extern void gui_draw_buffer_chat (t_gui_buffer *, int);
extern void gui_draw_buffer_nick (t_gui_buffer *, int);
extern void gui_draw_buffer_status (t_gui_buffer *, int);
extern void gui_draw_buffer_infobar_time (t_gui_buffer *);
extern void gui_draw_buffer_infobar (t_gui_buffer *, int);
extern void gui_draw_buffer_input (t_gui_buffer *, int);
extern void gui_redraw_buffer (t_gui_buffer *);
extern void gui_switch_to_buffer (t_gui_window *, t_gui_buffer *);
extern t_gui_buffer *gui_get_dcc_buffer ();
extern void gui_switch_to_dcc_buffer ();
extern void gui_switch_to_previous_buffer (t_gui_window *);
extern void gui_switch_to_next_buffer (t_gui_window *);
extern void gui_switch_to_previous_window (t_gui_window *);
extern void gui_switch_to_next_window (t_gui_window *);
extern void gui_move_page_up (t_gui_window *);
extern void gui_move_page_down (t_gui_window *);
extern void gui_nick_move_beginning (t_gui_window *);
extern void gui_nick_move_end (t_gui_window *);
extern void gui_nick_move_page_up (t_gui_window *);
extern void gui_nick_move_page_down (t_gui_window *);
extern void gui_input_page_up ();
extern void gui_input_page_down ();
extern void gui_input_nick_beginning ();
extern void gui_input_nick_end ();
extern void gui_input_nick_page_up ();
extern void gui_input_nick_page_down ();
extern void gui_curses_resize_handler ();
extern void gui_window_init_subwindows (t_gui_window *);
extern void gui_window_split_horiz (t_gui_window *);
@@ -330,6 +390,7 @@ extern void gui_set_window_title ();
extern void gui_init ();
extern void gui_end ();
extern void gui_printf_type_color (/*@null@*/ t_gui_buffer *, int, int, char *, ...);
extern void gui_input_default_key_bindings ();
extern void gui_main_loop ();
#endif /* gui.h */
+5 -1
View File
@@ -1,10 +1,14 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2005-07-06
ChangeLog - 2005-07-09
Versoin 0.1.4 (under dev!):
* new keyboard management: keys are setup in config file, new command
/key was added and some new default keys were added
* added seconds in infobar time (optional thanks to new setting)
* fixed some curses refreshs
* channels auto-prefixed by "#" (if no prefix found) for /join command
Version 0.1.3 (2005-07-02):
+421 -356
View File
File diff suppressed because it is too large Load Diff
+437 -356
View File
File diff suppressed because it is too large Load Diff
+417 -355
View File
File diff suppressed because it is too large Load Diff
+206 -47
View File
@@ -47,11 +47,11 @@ t_weechat_command weechat_commands[] =
{ "buffer", N_("manage buffers"),
N_("[action | number]"),
N_("action: action to do:\n"
" move: move buffer in the list (may be relative, for example -1)\n"
" close: close buffer (for channel: same as /part without part message)\n"
" list: list opened buffers (no parameter implies this list)\n"
" notify: set notify level for buffer (0=never, 1=highlight, 2=1+msg, 3=2+join/part)\n"
"number: jump to buffer by number"),
" move: move buffer in the list (may be relative, for example -1)\n"
" close: close buffer (for channel: same as /part without part message)\n"
" list: list opened buffers (no parameter implies this list)\n"
" notify: set notify level for buffer (0=never, 1=highlight, 2=1+msg, 3=2+join/part)\n"
"number: jump to buffer by number"),
0, MAX_ARGS, weechat_cmd_buffer, NULL },
{ "clear", N_("clear window(s)"),
N_("[-all]"),
@@ -72,33 +72,40 @@ t_weechat_command weechat_commands[] =
{ "help", N_("display help about commands"),
N_("[command]"), N_("command: name of a WeeChat or IRC command"),
0, 1, weechat_cmd_help, NULL },
{ "key", N_("bind/unbind keys"),
N_("[key function/command] [unbind key] [functions] [reset -yes]"),
N_("key: bind this key to an internal function or a command (beginning by \"/\")\n"
"unbind: unbind a key (if \"all\", default bindings are restored)\n"
"functions: list internal functions for key bindings\n"
"reset: restore bindings to the default values and delete ALL personal binding (use carefully!)"),
0, MAX_ARGS, NULL, weechat_cmd_key },
{ "perl", N_("list/load/unload Perl scripts"),
N_("[load filename] | [autoload] | [reload] | [unload]"),
N_("filename: Perl script (file) to load\n"
"Without argument, /perl command lists all loaded Perl scripts."),
"Without argument, /perl command lists all loaded Perl scripts."),
0, 2, weechat_cmd_perl, NULL },
{ "python", N_("list/load/unload Python scripts"),
N_("[load filename] | [autoload] | [reload] | [unload]"),
N_("filename: Python script (file) to load\n"
"Without argument, /python command lists all loaded Python scripts."),
"Without argument, /python command lists all loaded Python scripts."),
0, 2, weechat_cmd_python, NULL },
{ "server", N_("list, add or remove servers"),
N_("[servername] | "
"[servername hostname port [-auto | -noauto] [-ipv6] [-ssl] [-pwd password] [-nicks nick1 "
"[nick2 [nick3]]] [-username username] [-realname realname] "
"[-command command] [-autojoin channel[,channel]] ] | "
"[del servername]"),
"[servername hostname port [-auto | -noauto] [-ipv6] [-ssl] [-pwd password] [-nicks nick1 "
"[nick2 [nick3]]] [-username username] [-realname realname] "
"[-command command] [-autojoin channel[,channel]] ] | "
"[del servername]"),
N_("servername: server name, for internal & display use\n"
"hostname: name or IP address of server\n"
"port: port for server (integer)\n"
"ipv6: use IPv6 protocol\n"
"ssl: use SSL protocol\n"
"password: password for server\n"
"nick1: first nick for server\n"
"nick2: alternate nick for server\n"
"nick3: second alternate nick for server\n"
"username: user name\n"
"realname: real name of user"),
"hostname: name or IP address of server\n"
"port: port for server (integer)\n"
"ipv6: use IPv6 protocol\n"
"ssl: use SSL protocol\n"
"password: password for server\n"
"nick1: first nick for server\n"
"nick2: alternate nick for server\n"
"nick3: second alternate nick for server\n"
"username: user name\n"
"realname: real name of user"),
0, MAX_ARGS, weechat_cmd_server, NULL },
{ "save", N_("save config to disk"),
N_("[file]"), N_("file: filename for writing config"),
@@ -111,11 +118,10 @@ t_weechat_command weechat_commands[] =
1, 1, NULL, weechat_cmd_unalias },
{ "window", N_("manage windows"),
N_("[list | splith | splitv | [merge [down | up | left | right | all]]]"),
N_(
"list: list opened windows (no parameter implies this list)\n"
"splith: split current window horizontally\n"
"splitv: split current window vertically\n"
"merge: merge window with another"),
N_("list: list opened windows (no parameter implies this list)\n"
"splith: split current window horizontally\n"
"splitv: split current window vertically\n"
"merge: merge window with another"),
0, 2, weechat_cmd_window, NULL },
{ NULL, NULL, NULL, NULL, 0, 0, NULL, NULL }
};
@@ -877,6 +883,7 @@ weechat_cmd_buffer (int argc, char **argv)
t_irc_channel *ptr_channel;
long number;
char *error;
int target_buffer;
if ((argc == 0) || ((argc == 1) && (strcasecmp (argv[0], "list") == 0)))
{
@@ -1049,26 +1056,41 @@ weechat_cmd_buffer (int argc, char **argv)
{
/* jump to buffer by number */
error = NULL;
number = strtol (argv[0], &error, 10);
if ((error) && (error[0] == '\0'))
if (argv[0][0] == '-')
{
if (!gui_switch_to_buffer_by_number (gui_current_window, (int) number))
/* relative jump '-' */
error = NULL;
number = strtol (argv[0] + 1, &error, 10);
if ((error) && (error[0] == '\0'))
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s buffer \"%s\" not found for \"%s\" command\n"),
WEECHAT_ERROR, argv[0], "buffer");
return -1;
target_buffer = gui_current_window->buffer->number - (int) number;
if (target_buffer < 1)
target_buffer = (last_gui_buffer) ? last_gui_buffer->number + target_buffer : 1;
gui_switch_to_buffer_by_number (gui_current_window,
target_buffer);
}
}
else if (argv[0][0] == '+')
{
/* relative jump '+' */
error = NULL;
number = strtol (argv[0] + 1, &error, 10);
if ((error) && (error[0] == '\0'))
{
target_buffer = gui_current_window->buffer->number + (int) number;
if (last_gui_buffer && target_buffer > last_gui_buffer->number)
target_buffer -= last_gui_buffer->number;
gui_switch_to_buffer_by_number (gui_current_window,
target_buffer);
}
}
else
{
/* invalid number */
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL, _("%s incorrect buffer number\n"),
WEECHAT_ERROR);
return -1;
/* absolute jump by number */
error = NULL;
number = strtol (argv[0], &error, 10);
if ((error) && (error[0] == '\0'))
gui_switch_to_buffer_by_number (gui_current_window, (int) number);
}
}
@@ -1322,6 +1344,138 @@ weechat_cmd_help (int argc, char **argv)
return 0;
}
/*
* weechat_cmd_key_display: display a key binding
*/
void
weechat_cmd_key_display (t_gui_key *key, int new_key)
{
char *expanded_name;
expanded_name = gui_key_get_expanded_name (key->key);
if (new_key)
{
gui_printf (NULL, _("New key binding:\n"));
gui_printf (NULL, " %s", (expanded_name) ? expanded_name : key->key);
}
else
gui_printf (NULL, " %20s", (expanded_name) ? expanded_name : key->key);
gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, " => ");
gui_printf (NULL, "%s\n",
(key->function) ?
gui_key_function_search_by_ptr (key->function) : key->command);
if (expanded_name)
free (expanded_name);
}
/*
* weechat_cmd_key: bind/unbind keys
*/
int
weechat_cmd_key (char *arguments)
{
char *pos;
int i;
t_gui_key *ptr_key;
if (arguments)
{
while (arguments[0] == ' ')
arguments++;
}
if (!arguments || (arguments[0] == '\0'))
{
gui_printf (NULL, "\n");
gui_printf (NULL, _("Key bindings:\n"));
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
weechat_cmd_key_display (ptr_key, 0);
}
}
else if (strncasecmp (arguments, "unbind ", 7) == 0)
{
arguments += 7;
while (arguments[0] == ' ')
arguments++;
if (gui_key_unbind (arguments))
gui_printf (NULL, _("Key \"%s\" unbinded\n"), arguments);
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s unable to unbind key \"%s\"\n"),
WEECHAT_ERROR, arguments);
return -1;
}
}
else if (strcasecmp (arguments, "functions") == 0)
{
gui_printf (NULL, "\n");
gui_printf (NULL, _("Internal key functions:\n"));
i = 0;
while (gui_key_functions[i].function_name)
{
gui_printf (NULL, " %s\n",
gui_key_functions[i].function_name);
i++;
}
}
else if (strncasecmp (arguments, "reset", 5) == 0)
{
arguments += 5;
while (arguments[0] == ' ')
arguments++;
if (strcmp (arguments, "-yes") == 0)
{
gui_key_free_all ();
gui_key_init ();
gui_printf (NULL, _("Default key bindings restored\n"));
}
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s \"-yes\" argument is required for keys reset (securuty reason)\n"),
WEECHAT_ERROR);
return -1;
}
}
else
{
while (arguments[0] == ' ')
arguments++;
pos = strchr (arguments, ' ');
if (!pos)
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s wrong argument count for \"%s\" command\n"),
WEECHAT_ERROR, "key");
return -1;
}
pos[0] = '\0';
pos++;
while (pos[0] == ' ')
pos++;
ptr_key = gui_key_bind (arguments, pos);
if (ptr_key)
weechat_cmd_key_display (ptr_key, 1);
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
gui_printf (NULL,
_("%s unable to bind key \"%s\"\n"),
WEECHAT_ERROR, arguments);
return -1;
}
}
return 0;
}
/*
* weechat_cmd_perl: list/load/unload Perl scripts
*/
@@ -1892,11 +2046,11 @@ weechat_cmd_server (int argc, char **argv)
}
/*
* weechat_set_cmd_display_option: display config option
* weechat_cmd_set_display_option: display config option
*/
void
weechat_set_cmd_display_option (t_config_option *option, char *prefix, void *value)
weechat_cmd_set_display_option (t_config_option *option, char *prefix, void *value)
{
char *color_name, *pos_nickserv, *pos_pwd, *value2;
@@ -2039,7 +2193,7 @@ weechat_cmd_set (char *arguments)
{
ptr_option_value = config_get_server_option_ptr (ptr_server,
weechat_options[CONFIG_SECTION_SERVER][i].option_name);
weechat_set_cmd_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
weechat_cmd_set_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
ptr_server->name,
ptr_option_value);
}
@@ -2080,7 +2234,7 @@ weechat_cmd_set (char *arguments)
gui_printf_color (NULL, COLOR_WIN_CHAT_CHANNEL,
"%s", config_get_section (ptr_option));
gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, "]\n");
weechat_set_cmd_display_option (ptr_option, NULL, NULL);
weechat_cmd_set_display_option (ptr_option, NULL, NULL);
}
else
{
@@ -2104,7 +2258,8 @@ weechat_cmd_set (char *arguments)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
section_displayed = 0;
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -2122,7 +2277,7 @@ weechat_cmd_set (char *arguments)
gui_printf_color (NULL, COLOR_WIN_CHAT_DARK, "]\n");
section_displayed = 1;
}
weechat_set_cmd_display_option (&weechat_options[i][j], NULL, NULL);
weechat_cmd_set_display_option (&weechat_options[i][j], NULL, NULL);
number_found++;
}
}
@@ -2155,7 +2310,7 @@ weechat_cmd_set (char *arguments)
weechat_options[CONFIG_SECTION_SERVER][i].option_name);
if (ptr_option_value)
{
weechat_set_cmd_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
weechat_cmd_set_display_option (&weechat_options[CONFIG_SECTION_SERVER][i],
ptr_server->name,
ptr_option_value);
number_found++;
@@ -2288,6 +2443,10 @@ weechat_cmd_window (int argc, char **argv)
else
gui_window_merge_auto (gui_current_window);
}
else if (strcasecmp (argv[0], "-1") == 0)
gui_switch_to_previous_window ();
else if (strcasecmp (argv[0], "+1") == 0)
gui_switch_to_next_window ();
else
{
irc_display_prefix (NULL, PREFIX_ERROR);
+1
View File
@@ -69,6 +69,7 @@ extern int weechat_cmd_connect (int, char **);
extern int weechat_cmd_debug (int, char **);
extern int weechat_cmd_disconnect (int, char **);
extern int weechat_cmd_help (int, char **);
extern int weechat_cmd_key (char *);
extern int weechat_cmd_perl (int, char **);
extern int weechat_cmd_python (int, char **);
extern int weechat_cmd_save (int, char **);
+19 -1
View File
@@ -201,6 +201,23 @@ completion_build_list (t_completion *completion, void *channel)
}
return;
}
if ((strcasecmp (completion->base_command, "key") == 0)
&& (completion->base_command_arg == 1))
{
weelist_add (&completion->completion_list,
&completion->last_completion,
"bind");
weelist_add (&completion->completion_list,
&completion->last_completion,
"unbind");
weelist_add (&completion->completion_list,
&completion->last_completion,
"functions");
weelist_add (&completion->completion_list,
&completion->last_completion,
"reset");
return;
}
if (((strcasecmp (completion->base_command, "perl") == 0)
|| (strcasecmp (completion->base_command, "python") == 0))
&& (completion->base_command_arg == 1))
@@ -225,7 +242,8 @@ completion_build_list (t_completion *completion, void *channel)
{
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
+56 -2
View File
@@ -313,6 +313,47 @@ void wee_display_commands (int weechat_cmd, int irc_cmd)
}
}
/*
* wee_display_key_functions: display WeeChat key functions
*/
void wee_display_key_functions ()
{
int i;
printf (_("Internal key functions:\n"));
printf ("\n");
i = 0;
while (gui_key_functions[i].function_name)
{
printf (" %s\n",
gui_key_functions[i].function_name);
i++;
}
}
/*
* wee_display_keys: display WeeChat default keys
*/
void wee_display_keys ()
{
t_gui_key *ptr_key;
char *expanded_name;
printf (_("%s default keys:\n"), PACKAGE_NAME);
printf ("\n");
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
expanded_name = gui_key_get_expanded_name (ptr_key->key);
printf (" %20s => %s\n",
(expanded_name) ? expanded_name : ptr_key->key,
(ptr_key->function) ? gui_key_function_search_by_ptr (ptr_key->function) : ptr_key->command);
if (expanded_name)
free (expanded_name);
}
}
/*
* wee_parse_args: parse command line args
*/
@@ -333,6 +374,12 @@ wee_parse_args (int argc, char *argv[])
wee_display_config_options ();
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-f") == 0)
|| (strcmp (argv[i], "--key-functions") == 0))
{
wee_display_key_functions ();
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-h") == 0)
|| (strcmp (argv[i], "--help") == 0))
{
@@ -340,12 +387,18 @@ wee_parse_args (int argc, char *argv[])
printf ("%s", WEE_USAGE2);
wee_shutdown (EXIT_SUCCESS);
}
if ((strcmp (argv[i], "-i") == 0)
else if ((strcmp (argv[i], "-i") == 0)
|| (strcmp (argv[i], "--irc-commands") == 0))
{
wee_display_commands (0, 1);
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-k") == 0)
|| (strcmp (argv[i], "--keys") == 0))
{
wee_display_keys ();
wee_shutdown (EXIT_SUCCESS);
}
else if ((strcmp (argv[i], "-l") == 0)
|| (strcmp (argv[i], "--license") == 0))
{
@@ -358,7 +411,7 @@ wee_parse_args (int argc, char *argv[])
printf (PACKAGE_VERSION "\n");
wee_shutdown (EXIT_SUCCESS);
}
if ((strcmp (argv[i], "-w") == 0)
else if ((strcmp (argv[i], "-w") == 0)
|| (strcmp (argv[i], "--weechat-commands") == 0))
{
wee_display_commands (1, 0);
@@ -771,6 +824,7 @@ main (int argc, char *argv[])
signal (SIGSEGV, my_sigsegv); /* crash dump when SIGSEGV is received */
gui_pre_init (&argc, &argv); /* pre-initiliaze interface */
wee_init_vars (); /* initialize some variables */
gui_key_init (); /* init keyboard (default key bindings) */
wee_parse_args (argc, argv); /* parse command line args */
wee_create_home_dirs (); /* create WeeChat directories */
wee_init_log (); /* init log file */
+3 -1
View File
@@ -90,8 +90,10 @@
#define WEE_USAGE2 \
" -c, --config display config file options\n" \
" -h, --help this help screen\n" \
" -f, --key-functions display WeeChat internal functions for keys\n" \
" -h, --help this help\n" \
" -i, --irc-commands display IRC commands\n" \
" -k, --keys display WeeChat default keys\n" \
" -l, --license display WeeChat license\n" \
" -v, --version display WeeChat version\n" \
" -w, --weechat-commands display WeeChat commands\n\n"
+88 -12
View File
@@ -53,6 +53,7 @@ t_config_section config_sections[CONFIG_NUMBER_SECTIONS] =
{ CONFIG_SECTION_IRC, "irc" },
{ CONFIG_SECTION_DCC, "dcc" },
{ CONFIG_SECTION_PROXY, "proxy" },
{ CONFIG_SECTION_KEYS, "keys" },
{ CONFIG_SECTION_ALIAS, "alias" },
{ CONFIG_SECTION_SERVER, "server" }
};
@@ -82,6 +83,7 @@ char *cfg_look_no_nickname;
char *cfg_look_completor;
int cfg_look_infobar;
char *cfg_look_infobar_timestamp;
int cfg_look_infobar_seconds;
int cfg_look_infobar_delay_highlight;
t_config_option weechat_options_look[] =
@@ -170,7 +172,11 @@ t_config_option weechat_options_look[] =
{ "look_infobar_timestamp", N_("timestamp for time in infobar"),
N_("timestamp for time in infobar"),
OPTION_TYPE_STRING, 0, 0, 0,
"%B, %A %d %Y - %H:%M", NULL, NULL, &cfg_look_infobar_timestamp, config_change_buffer_content },
"%B, %A %d %Y", NULL, NULL, &cfg_look_infobar_timestamp, config_change_buffer_content },
{ "look_infobar_seconds", N_("display seconds in infobar time"),
N_("display seconds in infobar time"),
OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
NULL, NULL, &cfg_look_infobar_seconds, NULL, config_change_buffer_content },
{ "look_infobar_delay_highlight", N_("delay (in seconds) for highlight messages in infobar"),
N_("delay (in seconds) for highlight messages in infobar "
"(0 = disable highlight notifications in infobar)"),
@@ -202,6 +208,7 @@ int cfg_col_status_data_other;
int cfg_col_status_more;
int cfg_col_status_bg;
int cfg_col_infobar;
int cfg_col_infobar_delimiters;
int cfg_col_infobar_highlight;
int cfg_col_infobar_bg;
int cfg_col_input;
@@ -320,6 +327,10 @@ t_config_option weechat_options_colors[] =
N_("color for info bar text"),
OPTION_TYPE_COLOR, 0, 0, 0,
"black", NULL, &cfg_col_infobar, NULL, &config_change_color },
{ "col_infobar_delimiters", N_("color for infobar delimiters"),
N_("color for infobar delimiters"),
OPTION_TYPE_COLOR, 0, 0, 0,
"blue", NULL, &cfg_col_infobar_delimiters, NULL, &config_change_color },
{ "col_infobar_highlight", N_("color for info bar highlight notification"),
N_("color for info bar highlight notification"),
OPTION_TYPE_COLOR, 0, 0, 0,
@@ -727,7 +738,7 @@ t_config_option weechat_options_server[] =
t_config_option *weechat_options[CONFIG_NUMBER_SECTIONS] =
{ weechat_options_look, weechat_options_colors, weechat_options_history,
weechat_options_log, weechat_options_irc, weechat_options_dcc,
weechat_options_proxy, NULL, weechat_options_server
weechat_options_proxy, NULL, NULL, weechat_options_server
};
@@ -763,7 +774,8 @@ config_get_section (t_config_option *ptr_option)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -1057,7 +1069,8 @@ config_option_search (char *option_name)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -1220,7 +1233,8 @@ config_default_values ()
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
@@ -1375,8 +1389,22 @@ config_read ()
if (pos2 != NULL)
pos2[0] = '\0';
if (section == CONFIG_SECTION_ALIAS)
if (section == CONFIG_SECTION_KEYS)
{
if (pos[0])
{
/* bind key (overwrite any binding with same key) */
gui_key_bind (line, pos);
}
else
{
/* unbin key if no value given */
gui_key_unbind (line);
}
}
else if (section == CONFIG_SECTION_ALIAS)
{
/* create new alias */
if (alias_new (line, pos))
weelist_add (&index_commands, &last_index_command, line);
}
@@ -1493,6 +1521,8 @@ config_create_default ()
time_t current_time;
struct passwd *my_passwd;
char *realname, *pos;
t_gui_key *ptr_key;
char *expanded_name, *function_name;
filename_length = strlen (weechat_home) + 64;
filename =
@@ -1520,7 +1550,8 @@ config_create_default ()
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
fprintf (file, "\n[%s]\n", config_sections[i].section_name);
for (j = 0; weechat_options[i][j].option_name; j++)
@@ -1550,6 +1581,27 @@ config_create_default ()
}
}
/* default key bindings */
fprintf (file, "\n[keys]\n");
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
expanded_name = gui_key_get_expanded_name (ptr_key->key);
if (ptr_key->function)
{
function_name = gui_key_function_search_by_ptr (ptr_key->function);
if (function_name)
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
function_name);
}
else
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
ptr_key->command);
if (expanded_name)
free (expanded_name);
}
/* default aliases */
/* TODO: remove comments when missing commands will be ok */
fprintf (file, "\n[alias]\n");
@@ -1560,20 +1612,20 @@ config_create_default ()
fprintf (file, "C=clear\n");
fprintf (file, "CL=clear\n");
fprintf (file, "CLOSE=buffer close\n");
fprintf (file, "# CHAT=dcc chat\n");
fprintf (file, "CHAT=dcc chat\n");
fprintf (file, "# GET=dcc get\n");
fprintf (file, "# IG=ignore\n");
fprintf (file, "J=join\n");
fprintf (file, "K=kick\n");
fprintf (file, "# KB=kickban\n");
fprintf (file, "KB=kickban\n");
fprintf (file, "# KN=knockout\n");
fprintf (file, "LEAVE=part\n");
fprintf (file, "M=msg\n");
fprintf (file, "# MUB=unban *\n");
fprintf (file, "MUB=unban *\n");
fprintf (file, "N=names\n");
fprintf (file, "Q=query\n");
fprintf (file, "T=topic\n");
fprintf (file, "# UB=unban\n");
fprintf (file, "UB=unban\n");
fprintf (file, "# UNIG=unignore\n");
fprintf (file, "W=who\n");
fprintf (file, "WC=part\n");
@@ -1658,6 +1710,8 @@ config_write (char *config_name)
time_t current_time;
t_irc_server *ptr_server;
t_weechat_alias *ptr_alias;
t_gui_key *ptr_key;
char *expanded_name, *function_name;
if (config_name)
filename = strdup (config_name);
@@ -1690,7 +1744,8 @@ config_write (char *config_name)
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
if ((i != CONFIG_SECTION_KEYS) && (i != CONFIG_SECTION_ALIAS)
&& (i != CONFIG_SECTION_SERVER))
{
fprintf (file, "\n[%s]\n", config_sections[i].section_name);
for (j = 0; weechat_options[i][j].option_name; j++)
@@ -1737,6 +1792,27 @@ config_write (char *config_name)
}
}
/* keys section */
fprintf (file, "\n[keys]\n");
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
expanded_name = gui_key_get_expanded_name (ptr_key->key);
if (ptr_key->function)
{
function_name = gui_key_function_search_by_ptr (ptr_key->function);
if (function_name)
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
function_name);
}
else
fprintf (file, "%s=%s\n",
(expanded_name) ? expanded_name : ptr_key->key,
ptr_key->command);
if (expanded_name)
free (expanded_name);
}
/* alias section */
fprintf (file, "\n[alias]\n");
for (ptr_alias = weechat_alias; ptr_alias;
+6 -3
View File
@@ -33,9 +33,10 @@
#define CONFIG_SECTION_IRC 4
#define CONFIG_SECTION_DCC 5
#define CONFIG_SECTION_PROXY 6
#define CONFIG_SECTION_ALIAS 7
#define CONFIG_SECTION_SERVER 8
#define CONFIG_NUMBER_SECTIONS 9
#define CONFIG_SECTION_KEYS 7
#define CONFIG_SECTION_ALIAS 8
#define CONFIG_SECTION_SERVER 9
#define CONFIG_NUMBER_SECTIONS 10
#define OPTION_TYPE_BOOLEAN 1 /* values: on/off */
#define OPTION_TYPE_INT 2 /* values: from min to max */
@@ -97,6 +98,7 @@ extern char *cfg_look_no_nickname;
extern char *cfg_look_completor;
extern int cfg_look_infobar;
extern char *cfg_look_infobar_timestamp;
extern int cfg_look_infobar_seconds;
extern int cfg_look_infobar_delay_highlight;
extern int cfg_col_title;
@@ -120,6 +122,7 @@ extern int cfg_col_status_data_other;
extern int cfg_col_status_more;
extern int cfg_col_status_bg;
extern int cfg_col_infobar;
extern int cfg_col_infobar_delimiters;
extern int cfg_col_infobar_highlight;
extern int cfg_col_infobar_bg;
extern int cfg_col_input;
+1
View File
@@ -20,6 +20,7 @@ INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\"
noinst_LIBRARIES = lib_weechat_gui_common.a
lib_weechat_gui_common_a_SOURCES = gui-common.c \
gui-keyboard.c \
gui.h
if GUI_NCURSES
+2 -2
View File
@@ -19,7 +19,7 @@ INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\"
bin_PROGRAMS = weechat-curses
weechat_curses_LDADD = ../lib_weechat_gui_common.a \
weechat_curses_LDADD = ../gui-common.o ../gui-keyboard.o \
../../common/lib_weechat_main.a \
../../irc/lib_weechat_irc.a \
$(NCURSES_LIBS) \
@@ -27,4 +27,4 @@ weechat_curses_LDADD = ../lib_weechat_gui_common.a \
$(GNUTLS_LIBS)
weechat_curses_SOURCES = gui-display.c \
gui-input.c
gui-input.c
+147 -163
View File
@@ -318,7 +318,7 @@ gui_draw_window_separator (t_gui_window *window)
window->win_x - 1);
gui_window_set_color (window->win_separator, COLOR_WIN_TITLE);
wborder (window->win_separator, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (window->win_separator);
wnoutrefresh (window->win_separator);
refresh ();
}
}
@@ -341,15 +341,9 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
if (ptr_win->buffer == buffer)
{
if (erase)
gui_curses_window_clear (ptr_win->win_title);
gui_curses_window_clear (ptr_win->win_title);
if (has_colors ())
{
gui_window_set_color (ptr_win->win_title, COLOR_WIN_TITLE);
wborder (ptr_win->win_title, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_title);
refresh ();
}
gui_window_set_color (ptr_win->win_title, COLOR_WIN_TITLE);
snprintf (format, 32, "%%-%ds", ptr_win->win_width);
if (CHANNEL(buffer))
{
@@ -362,6 +356,8 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
mvwprintw (ptr_win->win_title, 0, 0, format, buf);
free (buf);
}
else
mvwprintw (ptr_win->win_title, 0, 0, format, " ");
}
else
{
@@ -372,8 +368,10 @@ gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
PACKAGE_STRING " " WEECHAT_COPYRIGHT_DATE " - "
WEECHAT_WEBSITE);
}
else
mvwprintw (ptr_win->win_title, 0, 0, format, " ");
}
wrefresh (ptr_win->win_title);
wnoutrefresh (ptr_win->win_title);
refresh ();
}
}
@@ -860,7 +858,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
ptr_win->win_chat_cursor_y = ptr_win->win_chat_height - 1;
}
}
wrefresh (ptr_win->win_chat);
wnoutrefresh (ptr_win->win_chat);
refresh ();
}
}
@@ -1058,7 +1056,7 @@ gui_draw_buffer_nick (t_gui_buffer *buffer, int erase)
}
}
}
wrefresh (ptr_win->win_nick);
wnoutrefresh (ptr_win->win_nick);
refresh ();
}
}
@@ -1087,12 +1085,8 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
if (erase)
gui_curses_window_clear (ptr_win->win_status);
if (has_colors ())
{
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wborder (ptr_win->win_status, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_status);
}
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wborder (ptr_win->win_status, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wmove (ptr_win->win_status, 0, 0);
/* display number of buffers */
@@ -1223,18 +1217,21 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
}
if (!SERVER(ptr_win->buffer))
{
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
wprintw (ptr_win->win_status, "%d",
ptr_win->buffer->number);
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS_DELIMITERS);
wprintw (ptr_win->win_status, ":");
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS);
if (ptr_win->buffer->dcc)
wprintw (ptr_win->win_status, "%d:<DCC> ",
ptr_win->buffer->number);
wprintw (ptr_win->win_status, "<DCC> ");
else
{
string = weechat_convert_encoding (cfg_look_charset_decode,
(cfg_look_charset_internal && cfg_look_charset_internal[0]) ?
cfg_look_charset_internal : local_charset,
_("%d:[not connected] "));
wprintw (ptr_win->win_status, string,
ptr_win->buffer->number);
_("[not connected]"));
wprintw (ptr_win->win_status, "%s " , string);
free (string);
}
}
@@ -1344,11 +1341,48 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
}
free (string);
wrefresh (ptr_win->win_status);
wnoutrefresh (ptr_win->win_status);
refresh ();
}
}
/*
* gui_draw_buffer_infobar_time: draw time in infobar window
*/
void
gui_draw_buffer_infobar_time (t_gui_buffer *buffer)
{
t_gui_window *ptr_win;
time_t time_seconds;
struct tm *local_time;
/* make gcc happy */
(void) buffer;
if (!gui_ok)
return;
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
{
time_seconds = time (NULL);
local_time = localtime (&time_seconds);
if (local_time)
{
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
mvwprintw (ptr_win->win_infobar,
0, 1,
"%02d:%02d",
local_time->tm_hour, local_time->tm_min);
if (cfg_look_infobar_seconds)
wprintw (ptr_win->win_infobar,
":%02d",
local_time->tm_sec);
}
wnoutrefresh (ptr_win->win_infobar);
}
}
/*
* gui_draw_buffer_infobar: draw infobar window for a buffer
*/
@@ -1376,7 +1410,7 @@ gui_draw_buffer_infobar (t_gui_buffer *buffer, int erase)
{
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
wborder (ptr_win->win_infobar, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_infobar);
wnoutrefresh (ptr_win->win_infobar);
}
wmove (ptr_win->win_infobar, 0, 0);
@@ -1385,16 +1419,31 @@ gui_draw_buffer_infobar (t_gui_buffer *buffer, int erase)
if (local_time)
{
strftime (text_time, 1024, cfg_look_infobar_timestamp, local_time);
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
wprintw (ptr_win->win_infobar, "[");
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
wprintw (ptr_win->win_infobar, "%s", text_time);
wprintw (ptr_win->win_infobar,
"%02d:%02d",
local_time->tm_hour, local_time->tm_min);
if (cfg_look_infobar_seconds)
wprintw (ptr_win->win_infobar,
":%02d",
local_time->tm_sec);
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
wprintw (ptr_win->win_infobar, "]");
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
wprintw (ptr_win->win_infobar,
" %s", text_time);
}
if (gui_infobar)
{
gui_window_set_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
wprintw (ptr_win->win_infobar, " | ");
gui_window_set_color (ptr_win->win_infobar, gui_infobar->color);
wprintw (ptr_win->win_infobar, " | %s", gui_infobar->text);
wprintw (ptr_win->win_infobar, "%s", gui_infobar->text);
}
wrefresh (ptr_win->win_infobar);
wnoutrefresh (ptr_win->win_infobar);
refresh ();
}
}
@@ -1445,7 +1494,7 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
{
gui_window_set_color (ptr_win->win_input, COLOR_WIN_INPUT);
wborder (ptr_win->win_input, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
wrefresh (ptr_win->win_input);
wnoutrefresh (ptr_win->win_input);
}
if (buffer->input_buffer_size == 0)
@@ -1488,11 +1537,12 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
SERVER(buffer)->nick,
"");
wclrtoeol (ptr_win->win_input);
ptr_win->win_input_x = strlen (CHANNEL(buffer)->name) +
strlen (SERVER(buffer)->nick) + 3 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display);
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x + strlen (CHANNEL(buffer)->name) +
strlen (SERVER(buffer)->nick) + 3 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display));
ptr_win->win_x + ptr_win->win_input_x);
}
else
{
@@ -1523,6 +1573,7 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
wprintw (ptr_win->win_input, _(" [P] Purge old DCC"));
wprintw (ptr_win->win_input, _(" [Q] Close DCC view"));
wclrtoeol (ptr_win->win_input);
ptr_win->win_input_x = 0;
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x);
@@ -1543,14 +1594,15 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
ptr_nickname,
"");
wclrtoeol (ptr_win->win_input);
ptr_win->win_input_x = strlen (ptr_nickname) + 2 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display);
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x + strlen (ptr_nickname) + 2 +
(buffer->input_buffer_pos - buffer->input_buffer_1st_display));
ptr_win->win_x + ptr_win->win_input_x);
}
}
wrefresh (ptr_win->win_input);
wnoutrefresh (ptr_win->win_input);
refresh ();
}
}
@@ -1728,215 +1780,143 @@ gui_switch_to_dcc_buffer ()
}
/*
* gui_switch_to_previous_buffer: switch to previous buffer
* gui_input_page_up: display previous page on buffer
*/
void
gui_switch_to_previous_buffer (t_gui_window *window)
gui_input_page_up ()
{
if (!gui_ok)
return;
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
if (window->buffer->prev_buffer)
gui_switch_to_buffer (window, window->buffer->prev_buffer);
else
gui_switch_to_buffer (window, last_gui_buffer);
gui_redraw_buffer (window->buffer);
}
/*
* gui_switch_to_next_buffer: switch to next buffer
*/
void
gui_switch_to_next_buffer (t_gui_window *window)
{
if (!gui_ok)
return;
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
if (window->buffer->next_buffer)
gui_switch_to_buffer (window, window->buffer->next_buffer);
else
gui_switch_to_buffer (window, gui_buffers);
gui_redraw_buffer (window->buffer);
}
/*
* gui_switch_to_previous_window: switch to previous window
*/
void
gui_switch_to_previous_window (t_gui_window *window)
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (window->prev_window) ? window->prev_window : last_gui_window;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_next_window: switch to next window
*/
void
gui_switch_to_next_window (t_gui_window *window)
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (window->next_window) ? window->next_window : gui_windows;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_move_page_up: display previous page on buffer
*/
void
gui_move_page_up (t_gui_window *window)
{
if (!gui_ok)
return;
if (!window->first_line_displayed)
if (!gui_current_window->first_line_displayed)
{
window->sub_lines += window->win_chat_height - 1;
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
gui_current_window->sub_lines +=
gui_current_window->win_chat_height - 1;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
}
}
/*
* gui_move_page_down: display next page on buffer
* gui_input_page_down: display next page on buffer
*/
void
gui_move_page_down (t_gui_window *window)
gui_input_page_down ()
{
if (!gui_ok)
return;
if (window->sub_lines > 0)
if (gui_current_window->sub_lines > 0)
{
window->sub_lines -= window->win_chat_height - 1;
if (window->sub_lines < 0)
window->sub_lines = 0;
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
gui_current_window->sub_lines -=
gui_current_window->win_chat_height - 1;
if (gui_current_window->sub_lines < 0)
gui_current_window->sub_lines = 0;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
}
}
/*
* gui_nick_move_beginning: go to beginning of nicklist
* gui_input_nick_beginning: go to beginning of nicklist
*/
void
gui_nick_move_beginning (t_gui_window *window)
gui_input_nick_beginning ()
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
if (window->win_nick_start > 0)
if (gui_current_window->win_nick_start > 0)
{
window->win_nick_start = 0;
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
/*
* gui_nick_move_end: go to the end of nicklist
* gui_input_nick_end: go to the end of nicklist
*/
void
gui_nick_move_end (t_gui_window *window)
gui_input_nick_end ()
{
int new_start;
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
new_start = CHANNEL(window->buffer)->nicks_count - window->win_nick_height;
new_start =
CHANNEL(gui_current_window->buffer)->nicks_count -
gui_current_window->win_nick_height;
if (new_start < 0)
new_start = 0;
else if (new_start >= 1)
new_start++;
if (new_start != window->win_nick_start)
if (new_start != gui_current_window->win_nick_start)
{
window->win_nick_start = new_start;
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start = new_start;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
/*
* gui_nick_move_page_up: scroll one page up in nicklist
* gui_input_nick_page_up: scroll one page up in nicklist
*/
void
gui_nick_move_page_up (t_gui_window *window)
gui_input_nick_page_up ()
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
if (window->win_nick_start > 0)
if (gui_current_window->win_nick_start > 0)
{
window->win_nick_start -= (window->win_nick_height - 1);
if (window->win_nick_start <= 1)
window->win_nick_start = 0;
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start -=
(gui_current_window->win_nick_height - 1);
if (gui_current_window->win_nick_start <= 1)
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
/*
* gui_nick_move_page_down: scroll one page down in nicklist
* gui_input_nick_page_down: scroll one page down in nicklist
*/
void
gui_nick_move_page_down (t_gui_window *window)
gui_input_nick_page_down ()
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (window->buffer))
if (gui_buffer_has_nicklist (gui_current_window->buffer))
{
if ((CHANNEL(window->buffer)->nicks_count > window->win_nick_height)
&& (window->win_nick_start + window->win_nick_height - 1 < CHANNEL(window->buffer)->nicks_count))
if ((CHANNEL(gui_current_window->buffer)->nicks_count >
gui_current_window->win_nick_height)
&& (gui_current_window->win_nick_start +
gui_current_window->win_nick_height - 1
< CHANNEL(gui_current_window->buffer)->nicks_count))
{
if (window->win_nick_start == 0)
window->win_nick_start += (window->win_nick_height - 1);
if (gui_current_window->win_nick_start == 0)
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 1);
else
window->win_nick_start += (window->win_nick_height - 2);
gui_draw_buffer_nick (window->buffer, 1);
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 2);
gui_draw_buffer_nick (gui_current_window->buffer, 1);
}
}
}
@@ -2306,6 +2286,8 @@ gui_init_colors ()
cfg_col_status_more, cfg_col_status_bg);
init_pair (COLOR_WIN_INFOBAR,
cfg_col_infobar, cfg_col_infobar_bg);
init_pair (COLOR_WIN_INFOBAR_DELIMITERS,
cfg_col_infobar_delimiters, cfg_col_infobar_bg);
init_pair (COLOR_WIN_INFOBAR_HIGHLIGHT,
cfg_col_infobar_highlight, cfg_col_infobar_bg);
init_pair (COLOR_WIN_INPUT,
@@ -2378,6 +2360,7 @@ gui_init_colors ()
color_attr[COLOR_WIN_STATUS_DATA_OTHER - 1] = (cfg_col_status_data_other >= 0) ? cfg_col_status_data_other & A_BOLD : 0;
color_attr[COLOR_WIN_STATUS_MORE - 1] = (cfg_col_status_more >= 0) ? cfg_col_status_more & A_BOLD : 0;
color_attr[COLOR_WIN_INFOBAR - 1] = (cfg_col_infobar >= 0) ? cfg_col_infobar & A_BOLD : 0;
color_attr[COLOR_WIN_INFOBAR_DELIMITERS - 1] = (cfg_col_infobar_delimiters >= 0) ? cfg_col_infobar_delimiters & A_BOLD : 0;
color_attr[COLOR_WIN_INFOBAR_HIGHLIGHT - 1] = (cfg_col_infobar_highlight >= 0) ? cfg_col_infobar_highlight & A_BOLD : 0;
color_attr[COLOR_WIN_INPUT - 1] = (cfg_col_input >= 0) ? cfg_col_input & A_BOLD : 0;
color_attr[COLOR_WIN_INPUT_CHANNEL - 1] = (cfg_col_input_channel >= 0) ? cfg_col_input_channel & A_BOLD : 0;
@@ -2427,15 +2410,16 @@ gui_init ()
initscr ();
curs_set (1);
keypad (stdscr, TRUE);
noecho ();
nodelay (stdscr, TRUE);
gui_init_colors ();
gui_infobar = NULL;
gui_ok = ((COLS > 5) && (LINES > 5));
refresh ();
/* create new window/buffer */
if (gui_window_new (0, 0, COLS, LINES))
+144 -634
View File
@@ -41,649 +41,151 @@
#include "../../common/fifo.h"
#include "../../irc/irc.h"
#define KEY_ESCAPE 27
/*
* gui_read_keyb: read keyboard line
* gui_input_default_key_bindings: create default key bindings
*/
void
gui_read_keyb ()
gui_input_default_key_bindings ()
{
int i;
char key_str[32], command[32];
/* keys binded with internal functions */
gui_key_bind ( /* RC */ "ctrl-M", "return");
gui_key_bind ( /* RC */ "ctrl-J", "return");
gui_key_bind ( /* tab */ "ctrl-I", "tab");
gui_key_bind ( /* basckp */ "ctrl-H", "backspace");
gui_key_bind ( /* basckp */ "ctrl-?", "backspace");
gui_key_bind ( /* del */ "meta2-3~", "delete");
gui_key_bind ( /* ^K */ "ctrl-K", "delete_end_line");
gui_key_bind ( /* ^U */ "ctrl-U", "delete_beginning_line");
gui_key_bind ( /* ^W */ "ctrl-W", "delete_previous_word");
gui_key_bind ( /* home */ "meta2-1~", "home");
gui_key_bind ( /* home */ "meta2-H", "home");
gui_key_bind ( /* home */ "meta2-7~", "home");
gui_key_bind ( /* ^A */ "ctrl-A", "home");
gui_key_bind ( /* end */ "meta2-4~", "end");
gui_key_bind ( /* end */ "meta2-F", "end");
gui_key_bind ( /* end */ "meta2-8~", "end");
gui_key_bind ( /* ^E */ "ctrl-E", "end");
gui_key_bind ( /* left */ "meta2-D", "left");
gui_key_bind ( /* right */ "meta2-C", "right");
gui_key_bind ( /* up */ "meta2-A", "up");
gui_key_bind ( /* down */ "meta2-B", "down");
gui_key_bind ( /* pgup */ "meta2-5~", "page_up");
gui_key_bind ( /* pgdn */ "meta2-6~", "page_down");
gui_key_bind ( /* F10 */ "meta2-21~", "infobar_clear");
gui_key_bind ( /* F11 */ "meta2-23~", "nick_page_up");
gui_key_bind ( /* F12 */ "meta2-24~", "nick_page_down");
gui_key_bind ( /* m-F11 */ "meta-meta2-1~", "nick_beginning");
gui_key_bind ( /* m-F12 */ "meta-meta2-4~", "nick_end");
gui_key_bind ( /* ^L */ "ctrl-L", "refresh");
gui_key_bind ( /* m-a */ "meta-a", "jump_smart");
gui_key_bind ( /* m-b */ "meta-b", "previous_word");
gui_key_bind ( /* ^left */ "meta-Od", "previous_word");
gui_key_bind ( /* m-d */ "meta-d", "delete_next_word");
gui_key_bind ( /* m-f */ "meta-f", "next_word");
gui_key_bind ( /* ^right */ "meta-Oc", "next_word");
gui_key_bind ( /* m-h */ "meta-h", "hotlist_clear");
gui_key_bind ( /* m-j,m-d */ "meta-jmeta-d", "jump_dcc");
gui_key_bind ( /* m-r */ "meta-r", "delete_line");
gui_key_bind ( /* m-s */ "meta-s", "jump_server");
gui_key_bind ( /* m-x */ "meta-x", "jump_next_server");
/* keys binded with commands */
gui_key_bind ( /* m-left */ "meta-meta2-D", "/buffer -1");
gui_key_bind ( /* F5 */ "meta2-15~", "/buffer -1");
gui_key_bind ( /* m-right */ "meta-meta2-C", "/buffer +1");
gui_key_bind ( /* F6 */ "meta2-17~", "/buffer +1");
gui_key_bind ( /* F7 */ "meta2-18~", "/window -1");
gui_key_bind ( /* F8 */ "meta2-19~", "/window +1");
gui_key_bind ( /* m-0 */ "meta-0", "/buffer 10");
gui_key_bind ( /* m-1 */ "meta-1", "/buffer 1");
gui_key_bind ( /* m-2 */ "meta-2", "/buffer 2");
gui_key_bind ( /* m-3 */ "meta-3", "/buffer 3");
gui_key_bind ( /* m-4 */ "meta-4", "/buffer 4");
gui_key_bind ( /* m-5 */ "meta-5", "/buffer 5");
gui_key_bind ( /* m-6 */ "meta-6", "/buffer 6");
gui_key_bind ( /* m-7 */ "meta-7", "/buffer 7");
gui_key_bind ( /* m-8 */ "meta-8", "/buffer 8");
gui_key_bind ( /* m-9 */ "meta-9", "/buffer 9");
/* bind meta-j + {01..99} to switch to buffers # > 10 */
for (i = 1; i < 100; i++)
{
sprintf (key_str, "meta-j%02d", i);
sprintf (command, "/buffer %d", i);
gui_key_bind (key_str, command);
}
}
/*
* gui_input_read: read keyboard chars
*/
void
gui_input_read ()
{
int key, i;
t_gui_buffer *ptr_buffer;
t_irc_server *ptr_server;
t_irc_dcc *ptr_dcc, *ptr_dcc_next;
char new_char[3], *decoded_string;
t_irc_dcc *dcc_selected;
key = getch ();
if (key != ERR)
char key_str[32];
i = 0;
/* do not loop too much here (for example when big paste was made),
to read also socket & co */
while (i < 8)
{
switch (key)
key = getch ();
if (key == ERR)
break;
if (key == KEY_RESIZE)
{
/* resize event */
case KEY_RESIZE:
gui_curses_resize_handler ();
break;
/* inactive function keys */
case KEY_F(1):
case KEY_F(2):
case KEY_F(3):
case KEY_F(4):
case KEY_F(9):
break;
/* previous buffer in window */
case KEY_F(5):
gui_switch_to_previous_buffer (gui_current_window);
break;
/* next buffer in window */
case KEY_F(6):
gui_switch_to_next_buffer (gui_current_window);
break;
/* previous window */
case KEY_F(7):
gui_switch_to_previous_window (gui_current_window);
break;
/* next window */
case KEY_F(8):
gui_switch_to_next_window (gui_current_window);
break;
/* remove last infobar message */
case KEY_F(10):
gui_infobar_remove ();
gui_draw_buffer_infobar (gui_current_window->buffer, 1);
break;
case KEY_F(11):
gui_nick_move_page_up (gui_current_window);
break;
case KEY_F(12):
gui_nick_move_page_down (gui_current_window);
break;
/* cursor up */
case KEY_UP:
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (gui_current_window->dcc_selected
&& ((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc)
{
if (gui_current_window->dcc_selected ==
gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->prev_dcc;
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->next_history;
if (!gui_current_window->buffer->ptr_history)
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
}
else
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* cursor down */
case KEY_DOWN:
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (!gui_current_window->dcc_selected
|| ((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc)
{
if (gui_current_window->dcc_last_displayed
&& (gui_current_window->dcc_selected ==
gui_current_window->dcc_last_displayed))
{
if (gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->next_dcc;
else
gui_current_window->dcc_first =
dcc_list->next_dcc;
}
if (gui_current_window->dcc_selected)
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc;
else
gui_current_window->dcc_selected =
dcc_list->next_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->prev_history;
if (gui_current_window->buffer->ptr_history)
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
else
gui_current_window->buffer->input_buffer_size = 0;
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
if (gui_current_window->buffer->ptr_history)
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* cursor left */
case KEY_LEFT:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos--;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* cursor right */
case KEY_RIGHT:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* home key or Control + A */
case KEY_HOME:
case 0x01:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* end key or Control + E */
case KEY_END:
case 0x05:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* page up */
case KEY_PPAGE:
if (!gui_current_window->buffer->dcc)
gui_move_page_up (gui_current_window);
break;
/* page down */
case KEY_NPAGE:
if (!gui_current_window->buffer->dcc)
gui_move_page_down (gui_current_window);
break;
/* erase before cursor and move cursor to the left */
case 127:
case KEY_BACKSPACE:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = gui_current_window->buffer->input_buffer_pos-1;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer_pos--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
break;
/* Control + Backspace or Control + W */
case 0x08:
case 0x17:
if (!gui_current_window->buffer->dcc)
gui_delete_previous_word (gui_current_window->buffer);
break;
/* Control + L */
case 0x0C:
gui_curses_resize_handler ();
break;
/* erase char under cursor */
case KEY_DC:
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
i = gui_current_window->buffer->input_buffer_pos;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
break;
/* Tab : completion */
case '\t':
if (!gui_current_window->buffer->dcc)
{
completion_search (&(gui_current_window->buffer->completion),
CHANNEL(gui_current_window->buffer),
gui_current_window->buffer->input_buffer,
gui_current_window->buffer->input_buffer_size,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.word_found)
{
/* replace word with new completed word into input buffer */
if (gui_current_window->buffer->completion.diff_size > 0)
{
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
for (i = gui_current_window->buffer->input_buffer_size - 1;
i >= gui_current_window->buffer->completion.position_replace +
(int)strlen (gui_current_window->buffer->completion.word_found); i--)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
}
else
{
for (i = gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
i < gui_current_window->buffer->input_buffer_size; i++)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_optimize_input_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
}
strncpy (gui_current_window->buffer->input_buffer + gui_current_window->buffer->completion.position_replace,
gui_current_window->buffer->completion.word_found,
strlen (gui_current_window->buffer->completion.word_found));
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
/* position is < 0 this means only one word was found to complete,
so reinit to stop completion */
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position =
gui_current_window->buffer->input_buffer_pos;
/* add space or completor to the end of completion, if needed */
if ((gui_current_window->buffer->completion.context == COMPLETION_COMMAND)
|| (gui_current_window->buffer->completion.context == COMPLETION_COMMAND_ARG))
{
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_buffer_insert_string (gui_current_window->buffer,
" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
else
{
/* add nick completor if position 0 and completing nick */
if ((gui_current_window->buffer->completion.base_word_pos == 0)
&& (gui_current_window->buffer->completion.context == COMPLETION_NICK))
{
if (strncmp (gui_current_window->buffer->input_buffer + gui_current_window->buffer->input_buffer_pos,
cfg_look_completor, strlen (cfg_look_completor)) != 0)
gui_buffer_insert_string (gui_current_window->buffer,
cfg_look_completor,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position += strlen (cfg_look_completor);
gui_current_window->buffer->input_buffer_pos += strlen (cfg_look_completor);
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_buffer_insert_string (gui_current_window->buffer,
" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
}
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
break;
/* escape code (for control-key) */
case KEY_ESCAPE:
if ((key = getch()) != ERR)
{
/*gui_printf (gui_current_window->buffer,
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/
switch (key)
{
/* Alt + left arrow */
case KEY_LEFT:
gui_switch_to_previous_buffer (gui_current_window);
break;
/* Alt + right arrow */
case KEY_RIGHT:
gui_switch_to_next_buffer (gui_current_window);
break;
/* Alt + home */
case KEY_HOME:
gui_nick_move_beginning (gui_current_window);
break;
/* Alt + end */
case KEY_END:
gui_nick_move_end (gui_current_window);
break;
/* Alt + page up */
case KEY_PPAGE:
gui_nick_move_page_up (gui_current_window);
break;
/* Alt + page down */
case KEY_NPAGE:
gui_nick_move_page_down (gui_current_window);
break;
case 79:
/* TODO: replace 79 by constant name! */
if ((key = getch()) != ERR)
{
switch (key)
{
/* Control + Right */
case 99:
if (!gui_current_window->buffer->dcc)
gui_move_next_word (gui_current_window->buffer);
break;
/* Control + Left */
case 100:
if (!gui_current_window->buffer->dcc)
gui_move_previous_word (gui_current_window->buffer);
break;
}
}
break;
/* Alt-number: jump to window by number */
case 48: /* Alt-0 */
case 49: /* Alt-1 */
case 50: /* Alt-2 */
case 51: /* Alt-3 */
case 52: /* Alt-4 */
case 53: /* Alt-5 */
case 54: /* Alt-6 */
case 55: /* Alt-7 */
case 56: /* Alt-8 */
case 57: /* Alt-9 */
gui_switch_to_buffer_by_number (gui_current_window, (key == 48) ? 10 : key - 48);
break;
/* Alt-A: jump to buffer with activity */
case 'a':
case 'A':
if (hotlist)
{
if (!hotlist_initial_buffer)
hotlist_initial_buffer = gui_current_window->buffer;
gui_switch_to_buffer (gui_current_window, hotlist->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
else
{
if (hotlist_initial_buffer)
{
gui_switch_to_buffer (gui_current_window, hotlist_initial_buffer);
gui_redraw_buffer (gui_current_window->buffer);
hotlist_initial_buffer = NULL;
}
}
break;
/* Alt-D: jump to DCC buffer */
case 'd':
case 'D':
if (gui_current_window->buffer->dcc)
{
if (buffer_before_dcc)
{
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
gui_redraw_buffer (gui_current_window->buffer);
}
}
else
{
buffer_before_dcc = gui_current_window->buffer;
gui_switch_to_dcc_buffer ();
}
break;
/* Alt-R: clear hotlist */
case 'r':
case 'R':
if (hotlist)
{
hotlist_free_all ();
gui_redraw_buffer (gui_current_window->buffer);
}
hotlist_initial_buffer = gui_current_window->buffer;
break;
/* Alt-S: jump to server buffer */
case 's':
case 'S':
if (!gui_current_window->buffer->dcc)
{
if (SERVER(gui_current_window->buffer)->buffer !=
gui_current_window->buffer)
{
gui_switch_to_buffer (gui_current_window,
SERVER(gui_current_window->buffer)->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
break;
/* Alt-X: jump to first channel/private of next server */
case 'x':
case 'X':
if (!gui_current_window->buffer->dcc)
{
ptr_server = SERVER(gui_current_window->buffer)->next_server;
if (!ptr_server)
ptr_server = irc_servers;
while (ptr_server != SERVER(gui_current_window->buffer))
{
if (ptr_server->buffer)
break;
ptr_server = (ptr_server->next_server) ?
ptr_server->next_server : irc_servers;
}
if (ptr_server != SERVER(gui_current_window->buffer))
{
ptr_buffer = (ptr_server->channels) ?
ptr_server->channels->buffer : ptr_server->buffer;
gui_switch_to_buffer (gui_current_window, ptr_buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
break;
}
}
break;
/* send command/message */
case '\n':
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_size > 0)
{
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
history_add (gui_current_window->buffer, gui_current_window->buffer->input_buffer);
gui_current_window->buffer->input_buffer_size = 0;
gui_current_window->buffer->input_buffer_pos = 0;
gui_current_window->buffer->input_buffer_1st_display = 0;
gui_current_window->buffer->completion.position = -1;
gui_current_window->buffer->ptr_history = NULL;
ptr_buffer = gui_current_window->buffer;
user_command (SERVER(gui_current_window->buffer),
gui_current_window->buffer,
gui_current_window->buffer->input_buffer);
if (ptr_buffer == gui_current_window->buffer)
{
ptr_buffer->input_buffer[0] = '\0';
gui_draw_buffer_input (ptr_buffer, 0);
}
}
}
break;
/* other key => add to input buffer */
default:
if (gui_current_window->buffer->dcc)
{
dcc_selected = (gui_current_window->dcc_selected) ?
(t_irc_dcc *) gui_current_window->dcc_selected : dcc_list;
switch (key)
{
/* accept DCC */
case 'a':
case 'A':
if (dcc_selected
&& (DCC_IS_RECV(dcc_selected->status))
&& (dcc_selected->status == DCC_WAITING))
{
dcc_accept (dcc_selected);
}
break;
/* cancel DCC */
case 'c':
case 'C':
if (dcc_selected
&& (!DCC_ENDED(dcc_selected->status)))
{
dcc_close (dcc_selected, DCC_ABORTED);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
/* purge old DCC */
case 'p':
case 'P':
gui_current_window->dcc_selected = NULL;
ptr_dcc = dcc_list;
while (ptr_dcc)
{
ptr_dcc_next = ptr_dcc->next_dcc;
if (DCC_ENDED(ptr_dcc->status))
dcc_free (ptr_dcc);
ptr_dcc = ptr_dcc_next;
}
gui_redraw_buffer (gui_current_window->buffer);
break;
/* close DCC window */
case 'q':
case 'Q':
if (buffer_before_dcc)
{
gui_buffer_free (gui_current_window->buffer, 1);
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
}
else
gui_buffer_free (gui_current_window->buffer, 1);
gui_redraw_buffer (gui_current_window->buffer);
break;
/* remove from DCC list */
case 'r':
case 'R':
if (dcc_selected
&& (DCC_ENDED(dcc_selected->status)))
{
if (dcc_selected->next_dcc)
gui_current_window->dcc_selected = dcc_selected->next_dcc;
else
gui_current_window->dcc_selected = NULL;
dcc_free (dcc_selected);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
}
}
else
{
/*gui_printf (gui_current_window->buffer,
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/
new_char[0] = key;
new_char[1] = '\0';
decoded_string = NULL;
/* UTF-8 input */
if (key == 0xC3)
{
if ((key = getch()) != ERR)
{
new_char[1] = key;
new_char[2] = '\0';
decoded_string = weechat_convert_encoding (local_charset, cfg_look_charset_internal, new_char);
}
}
gui_buffer_insert_string (gui_current_window->buffer,
(decoded_string) ? decoded_string : new_char,
gui_current_window->buffer->input_buffer_pos);
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_current_window->buffer->completion.position = -1;
if (decoded_string)
free (decoded_string);
}
break;
gui_curses_resize_handler ();
continue;
}
if (key < 32)
{
key_str[0] = '^';
key_str[1] = (char) key + '@';
key_str[2] = '\0';
}
else if (key == 127)
{
key_str[0] = '^';
key_str[1] = '?';
key_str[2] = '\0';
}
else
{
if (key > 0xff)
{
key_str[0] = (char) (key >> 8);
key_str[1] = (char) (key & 0xff);
key_str[2] = '\0';
}
else
{
key_str[0] = (char) key;
key_str[1] = '\0';
}
}
if (strcmp (key_str, "^") == 0)
{
key_str[1] = '^';
key_str[2] = '\0';
}
/*gui_printf (gui_current_window->buffer, "gui_input_read: key = %s (%d)\n", key_str, key);*/
if (gui_key_pressed (key_str) != 0)
gui_input_insert_char (key);
i++;
}
}
@@ -723,6 +225,14 @@ gui_main_loop ()
{
old_sec = local_time->tm_sec;
if (cfg_look_infobar_seconds)
{
gui_draw_buffer_infobar_time (gui_current_window->buffer);
wmove (gui_current_window->win_input,
0, gui_current_window->win_input_x);
wrefresh (gui_current_window->win_input);
}
/* infobar count down */
if (gui_infobar && gui_infobar->remaining_time > 0)
{
@@ -807,7 +317,7 @@ gui_main_loop ()
{
if (FD_ISSET (STDIN_FILENO, &read_fd))
{
gui_read_keyb ();
gui_input_read ();
}
if ((weechat_fifo != -1) && (FD_ISSET (weechat_fifo, &read_fd)))
{
+826 -61
View File
@@ -34,6 +34,7 @@
#include "../common/weechat.h"
#include "gui.h"
#include "../common/command.h"
#include "../common/weeconfig.h"
#include "../common/hotlist.h"
#include "../common/log.h"
@@ -89,6 +90,8 @@ gui_window_new (int x, int y, int width, int height)
new_window->win_nick_height = 0;
new_window->win_nick_start = 0;
new_window->win_input_x = 0;
new_window->win_title = NULL;
new_window->win_chat = NULL;
new_window->win_nick = NULL;
@@ -552,12 +555,12 @@ gui_new_message (t_gui_buffer *buffer)
}
/*
* gui_optimize_input_buffer_size: optimize input buffer size by adding
* gui_input_optimize_buffer_size: optimize input buffer size by adding
* or deleting data block (predefined size)
*/
void
gui_optimize_input_buffer_size (t_gui_buffer *buffer)
gui_input_optimize_buffer_size (t_gui_buffer *buffer)
{
int optimal_size;
@@ -571,29 +574,343 @@ gui_optimize_input_buffer_size (t_gui_buffer *buffer)
}
/*
* gui_delete_previous_word: delete previous word
* gui_input_insert_string: insert a string into the input buffer
*/
void
gui_delete_previous_word (t_gui_buffer *buffer)
gui_input_insert_string (char *string, int pos)
{
int i, start, end, length;
length = strlen (string);
/* increase buffer size */
gui_current_window->buffer->input_buffer_size += length;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
/* move end of string to the right */
start = pos + length;
end = gui_current_window->buffer->input_buffer_size - 1;
for (i = end; i >= start; i--)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i - length];
/* insert new string */
strncpy (gui_current_window->buffer->input_buffer + pos, string, length);
}
/*
* gui_input_insert_char: insert a char into input buffer
*/
void
gui_input_insert_char (int key)
{
char new_char[3];
t_irc_dcc *dcc_selected, *ptr_dcc, *ptr_dcc_next;
if (key < 32)
return;
if (gui_current_window->buffer->dcc)
{
dcc_selected = (gui_current_window->dcc_selected) ?
(t_irc_dcc *) gui_current_window->dcc_selected : dcc_list;
switch (key)
{
/* accept DCC */
case 'a':
case 'A':
if (dcc_selected
&& (DCC_IS_RECV(dcc_selected->status))
&& (dcc_selected->status == DCC_WAITING))
{
dcc_accept (dcc_selected);
}
break;
/* cancel DCC */
case 'c':
case 'C':
if (dcc_selected
&& (!DCC_ENDED(dcc_selected->status)))
{
dcc_close (dcc_selected, DCC_ABORTED);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
/* purge old DCC */
case 'p':
case 'P':
gui_current_window->dcc_selected = NULL;
ptr_dcc = dcc_list;
while (ptr_dcc)
{
ptr_dcc_next = ptr_dcc->next_dcc;
if (DCC_ENDED(ptr_dcc->status))
dcc_free (ptr_dcc);
ptr_dcc = ptr_dcc_next;
}
gui_redraw_buffer (gui_current_window->buffer);
break;
/* close DCC window */
case 'q':
case 'Q':
if (buffer_before_dcc)
{
gui_buffer_free (gui_current_window->buffer, 1);
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
}
else
gui_buffer_free (gui_current_window->buffer, 1);
gui_redraw_buffer (gui_current_window->buffer);
break;
/* remove from DCC list */
case 'r':
case 'R':
if (dcc_selected
&& (DCC_ENDED(dcc_selected->status)))
{
if (dcc_selected->next_dcc)
gui_current_window->dcc_selected = dcc_selected->next_dcc;
else
gui_current_window->dcc_selected = NULL;
dcc_free (dcc_selected);
gui_redraw_buffer (gui_current_window->buffer);
}
break;
}
}
else
{
/*gui_printf (gui_current_window->buffer,
"[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/
new_char[0] = key;
new_char[1] = '\0';
gui_input_insert_string (new_char,
gui_current_window->buffer->input_buffer_pos);
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_current_window->buffer->completion.position = -1;
}
}
/*
* gui_input_return: terminate line (return pressed)
*/
void
gui_input_return ()
{
t_gui_buffer *ptr_buffer;
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_size > 0)
{
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
history_add (gui_current_window->buffer, gui_current_window->buffer->input_buffer);
gui_current_window->buffer->input_buffer_size = 0;
gui_current_window->buffer->input_buffer_pos = 0;
gui_current_window->buffer->input_buffer_1st_display = 0;
gui_current_window->buffer->completion.position = -1;
gui_current_window->buffer->ptr_history = NULL;
ptr_buffer = gui_current_window->buffer;
user_command (SERVER(gui_current_window->buffer),
gui_current_window->buffer,
gui_current_window->buffer->input_buffer);
if (ptr_buffer == gui_current_window->buffer)
{
ptr_buffer->input_buffer[0] = '\0';
gui_draw_buffer_input (ptr_buffer, 0);
}
}
}
}
/*
* gui_input_tab: tab key => completion
*/
void
gui_input_tab ()
{
int i;
if (!gui_current_window->buffer->dcc)
{
completion_search (&(gui_current_window->buffer->completion),
CHANNEL(gui_current_window->buffer),
gui_current_window->buffer->input_buffer,
gui_current_window->buffer->input_buffer_size,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.word_found)
{
/* replace word with new completed word into input buffer */
if (gui_current_window->buffer->completion.diff_size > 0)
{
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
for (i = gui_current_window->buffer->input_buffer_size - 1;
i >= gui_current_window->buffer->completion.position_replace +
(int)strlen (gui_current_window->buffer->completion.word_found); i--)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
}
else
{
for (i = gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
i < gui_current_window->buffer->input_buffer_size; i++)
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i -
gui_current_window->buffer->completion.diff_size];
gui_current_window->buffer->input_buffer_size +=
gui_current_window->buffer->completion.diff_size;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
}
strncpy (gui_current_window->buffer->input_buffer + gui_current_window->buffer->completion.position_replace,
gui_current_window->buffer->completion.word_found,
strlen (gui_current_window->buffer->completion.word_found));
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->completion.position_replace +
strlen (gui_current_window->buffer->completion.word_found);
/* position is < 0 this means only one word was found to complete,
so reinit to stop completion */
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position =
gui_current_window->buffer->input_buffer_pos;
/* add space or completor to the end of completion, if needed */
if ((gui_current_window->buffer->completion.context == COMPLETION_COMMAND)
|| (gui_current_window->buffer->completion.context == COMPLETION_COMMAND_ARG))
{
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_input_insert_string (" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
else
{
/* add nick completor if position 0 and completing nick */
if ((gui_current_window->buffer->completion.base_word_pos == 0)
&& (gui_current_window->buffer->completion.context == COMPLETION_NICK))
{
if (strncmp (gui_current_window->buffer->input_buffer + gui_current_window->buffer->input_buffer_pos,
cfg_look_completor, strlen (cfg_look_completor)) != 0)
gui_input_insert_string (cfg_look_completor,
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position += strlen (cfg_look_completor);
gui_current_window->buffer->input_buffer_pos += strlen (cfg_look_completor);
if (gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] != ' ')
gui_input_insert_string (" ",
gui_current_window->buffer->input_buffer_pos);
if (gui_current_window->buffer->completion.position >= 0)
gui_current_window->buffer->completion.position++;
gui_current_window->buffer->input_buffer_pos++;
}
}
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_backspace: backspace key
*/
void
gui_input_backspace ()
{
int i;
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = gui_current_window->buffer->input_buffer_pos-1;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer_pos--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
}
/*
* gui_input_delete: delete key
*/
void
gui_input_delete ()
{
int i;
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
i = gui_current_window->buffer->input_buffer_pos;
while (gui_current_window->buffer->input_buffer[i])
{
gui_current_window->buffer->input_buffer[i] =
gui_current_window->buffer->input_buffer[i+1];
i++;
}
gui_current_window->buffer->input_buffer_size--;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
}
/*
* gui_input_delete_previous_word: delete previous word
*/
void
gui_input_delete_previous_word ()
{
int i, j, num_char_deleted, num_char_end;
if (buffer->input_buffer_pos > 0)
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = buffer->input_buffer_pos - 1;
i = gui_current_window->buffer->input_buffer_pos - 1;
while ((i >= 0) &&
(buffer->input_buffer[i] == ' '))
(gui_current_window->buffer->input_buffer[i] == ' '))
i--;
if (i >= 0)
{
while ((i >= 0) &&
(buffer->input_buffer[i] != ' '))
(gui_current_window->buffer->input_buffer[i] != ' '))
i--;
if (i >= 0)
{
while ((i >= 0) &&
(buffer->input_buffer[i] == ' '))
(gui_current_window->buffer->input_buffer[i] == ' '))
i--;
}
}
@@ -601,110 +918,554 @@ gui_delete_previous_word (t_gui_buffer *buffer)
if (i >= 0)
i++;
i++;
num_char_deleted = buffer->input_buffer_pos - i;
num_char_end = buffer->input_buffer_size -
buffer->input_buffer_pos;
num_char_deleted = gui_current_window->buffer->input_buffer_pos - i;
num_char_end = gui_current_window->buffer->input_buffer_size -
gui_current_window->buffer->input_buffer_pos;
for (j = 0; j < num_char_end; j++)
buffer->input_buffer[i + j] =
buffer->input_buffer[buffer->input_buffer_pos + j];
gui_current_window->buffer->input_buffer[i + j] =
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos + j];
buffer->input_buffer_size -= num_char_deleted;
buffer->input_buffer[buffer->input_buffer_size] = '\0';
buffer->input_buffer_pos = i;
gui_draw_buffer_input (buffer, 0);
gui_optimize_input_buffer_size (buffer);
buffer->completion.position = -1;
gui_current_window->buffer->input_buffer_size -= num_char_deleted;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_current_window->buffer->input_buffer_pos = i;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
}
/*
* gui_move_previous_word: move to beginning of previous word
* gui_input_delete_next_word: delete next word
*/
void
gui_move_previous_word (t_gui_buffer *buffer)
gui_input_delete_next_word ()
{
int i, j, num_char_deleted;
i = gui_current_window->buffer->input_buffer_pos;
while (i < gui_current_window->buffer->input_buffer_size)
{
if ((gui_current_window->buffer->input_buffer[i] == ' ')
&& i != gui_current_window->buffer->input_buffer_pos)
break;
i++;
}
num_char_deleted = i - gui_current_window->buffer->input_buffer_pos;
for (j = i; j < gui_current_window->buffer->input_buffer_size; j++)
gui_current_window->buffer->input_buffer[j - num_char_deleted] =
gui_current_window->buffer->input_buffer[j];
gui_current_window->buffer->input_buffer_size -= num_char_deleted;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_delete_begin_of_line: delete all from cursor pos to beginning of line
*/
void
gui_input_delete_begin_of_line ()
{
int i;
if (buffer->input_buffer_pos > 0)
for (i = gui_current_window->buffer->input_buffer_pos;
i < gui_current_window->buffer->input_buffer_size; i++)
gui_current_window->buffer->input_buffer[i - gui_current_window->buffer->input_buffer_pos] =
gui_current_window->buffer->input_buffer[i];
gui_current_window->buffer->input_buffer_size -=
gui_current_window->buffer->input_buffer_pos;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_delete_end_of_line: delete all from cursor pos to end of line
*/
void
gui_input_delete_end_of_line ()
{
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] = ' ';
gui_current_window->buffer->input_buffer_size = gui_current_window->buffer->input_buffer_pos ;
gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0';
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_delete_line: delete entire line
*/
void
gui_input_delete_line ()
{
gui_current_window->buffer->input_buffer[0] = '\0';
gui_current_window->buffer->input_buffer_size = 0;
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->completion.position = -1;
}
/*
* gui_input_home: home key
*/
void
gui_input_home ()
{
if (!gui_current_window->buffer->dcc)
{
i = buffer->input_buffer_pos - 1;
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos = 0;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_end: end key
*/
void
gui_input_end ()
{
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_left: move to previous char
*/
void
gui_input_left ()
{
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos > 0)
{
gui_current_window->buffer->input_buffer_pos--;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_previous_word: move to beginning of previous word
*/
void
gui_input_previous_word ()
{
int i;
if (gui_current_window->buffer->input_buffer_pos > 0)
{
i = gui_current_window->buffer->input_buffer_pos - 1;
while ((i >= 0) &&
(buffer->input_buffer[i] == ' '))
(gui_current_window->buffer->input_buffer[i] == ' '))
i--;
if (i < 0)
buffer->input_buffer_pos = 0;
gui_current_window->buffer->input_buffer_pos = 0;
else
{
while ((i >= 0) &&
(buffer->input_buffer[i] != ' '))
(gui_current_window->buffer->input_buffer[i] != ' '))
i--;
buffer->input_buffer_pos = i + 1;
gui_current_window->buffer->input_buffer_pos = i + 1;
}
gui_draw_buffer_input (buffer, 0);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
/*
* gui_move_next_word: move to the end of next
* gui_input_right: move to previous char
*/
void
gui_move_next_word (t_gui_buffer *buffer)
gui_input_right ()
{
if (!gui_current_window->buffer->dcc)
{
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size)
{
gui_current_window->buffer->input_buffer_pos++;
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_next_word: move to the end of next
*/
void
gui_input_next_word ()
{
int i;
if (buffer->input_buffer_pos <
buffer->input_buffer_size + 1)
if (gui_current_window->buffer->input_buffer_pos <
gui_current_window->buffer->input_buffer_size + 1)
{
i = buffer->input_buffer_pos;
while ((i <= buffer->input_buffer_size) &&
(buffer->input_buffer[i] == ' '))
i = gui_current_window->buffer->input_buffer_pos;
while ((i <= gui_current_window->buffer->input_buffer_size) &&
(gui_current_window->buffer->input_buffer[i] == ' '))
i++;
if (i > buffer->input_buffer_size)
buffer->input_buffer_pos = i - 1;
if (i > gui_current_window->buffer->input_buffer_size)
gui_current_window->buffer->input_buffer_pos = i - 1;
else
{
while ((i <= buffer->input_buffer_size) &&
(buffer->input_buffer[i] != ' '))
while ((i <= gui_current_window->buffer->input_buffer_size) &&
(gui_current_window->buffer->input_buffer[i] != ' '))
i++;
if (i > buffer->input_buffer_size)
buffer->input_buffer_pos =
buffer->input_buffer_size;
if (i > gui_current_window->buffer->input_buffer_size)
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
else
buffer->input_buffer_pos = i;
gui_current_window->buffer->input_buffer_pos = i;
}
gui_draw_buffer_input (buffer, 0);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
/*
* gui_buffer_insert_string: insert a string into the input buffer
* gui_input_up: recall last command or move to previous DCC in list
*/
void
gui_buffer_insert_string (t_gui_buffer *buffer, char *string, int pos)
gui_input_up ()
{
int i, start, end, length;
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (gui_current_window->dcc_selected
&& ((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc)
{
if (gui_current_window->dcc_selected ==
gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->prev_dcc;
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->prev_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->next_history;
if (!gui_current_window->buffer->ptr_history)
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
}
else
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->history;
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_down: recall next command or move to next DCC in list
*/
void
gui_input_down ()
{
if (gui_current_window->buffer->dcc)
{
if (dcc_list)
{
if (!gui_current_window->dcc_selected
|| ((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc)
{
if (gui_current_window->dcc_last_displayed
&& (gui_current_window->dcc_selected ==
gui_current_window->dcc_last_displayed))
{
if (gui_current_window->dcc_first)
gui_current_window->dcc_first =
((t_irc_dcc *)(gui_current_window->dcc_first))->next_dcc;
else
gui_current_window->dcc_first =
dcc_list->next_dcc;
}
if (gui_current_window->dcc_selected)
gui_current_window->dcc_selected =
((t_irc_dcc *)(gui_current_window->dcc_selected))->next_dcc;
else
gui_current_window->dcc_selected =
dcc_list->next_dcc;
gui_draw_buffer_chat (gui_current_window->buffer, 1);
gui_draw_buffer_input (gui_current_window->buffer, 1);
}
}
}
else
{
if (gui_current_window->buffer->ptr_history)
{
gui_current_window->buffer->ptr_history =
gui_current_window->buffer->ptr_history->prev_history;
if (gui_current_window->buffer->ptr_history)
gui_current_window->buffer->input_buffer_size =
strlen (gui_current_window->buffer->ptr_history->text);
else
gui_current_window->buffer->input_buffer_size = 0;
gui_input_optimize_buffer_size (gui_current_window->buffer);
gui_current_window->buffer->input_buffer_pos =
gui_current_window->buffer->input_buffer_size;
if (gui_current_window->buffer->ptr_history)
strcpy (gui_current_window->buffer->input_buffer,
gui_current_window->buffer->ptr_history->text);
gui_draw_buffer_input (gui_current_window->buffer, 0);
}
}
}
/*
* gui_input_jump_smart: jump to buffer with activity (alt-A by default)
*/
void
gui_input_jump_smart ()
{
if (hotlist)
{
if (!hotlist_initial_buffer)
hotlist_initial_buffer = gui_current_window->buffer;
gui_switch_to_buffer (gui_current_window, hotlist->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
else
{
if (hotlist_initial_buffer)
{
gui_switch_to_buffer (gui_current_window, hotlist_initial_buffer);
gui_redraw_buffer (gui_current_window->buffer);
hotlist_initial_buffer = NULL;
}
}
}
/*
* gui_input_jump_dcc: jump to DCC buffer
*/
void
gui_input_jump_dcc ()
{
if (gui_current_window->buffer->dcc)
{
if (buffer_before_dcc)
{
gui_switch_to_buffer (gui_current_window,
buffer_before_dcc);
gui_redraw_buffer (gui_current_window->buffer);
}
}
else
{
buffer_before_dcc = gui_current_window->buffer;
gui_switch_to_dcc_buffer ();
}
}
/*
* gui_input_jump_server: jump to server buffer
*/
void
gui_input_jump_server ()
{
if (!gui_current_window->buffer->dcc)
{
if (SERVER(gui_current_window->buffer)->buffer !=
gui_current_window->buffer)
{
gui_switch_to_buffer (gui_current_window,
SERVER(gui_current_window->buffer)->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
}
/*
* gui_input_jump_next_server: jump to next server
*/
void
gui_input_jump_next_server ()
{
t_irc_server *ptr_server;
t_gui_buffer *ptr_buffer;
length = strlen (string);
if (!gui_current_window->buffer->dcc)
{
ptr_server = SERVER(gui_current_window->buffer)->next_server;
if (!ptr_server)
ptr_server = irc_servers;
while (ptr_server != SERVER(gui_current_window->buffer))
{
if (ptr_server->buffer)
break;
ptr_server = (ptr_server->next_server) ?
ptr_server->next_server : irc_servers;
}
if (ptr_server != SERVER(gui_current_window->buffer))
{
ptr_buffer = (ptr_server->channels) ?
ptr_server->channels->buffer : ptr_server->buffer;
gui_switch_to_buffer (gui_current_window, ptr_buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
}
}
/*
* gui_input_hotlist_clear: clear hotlist
*/
void
gui_input_hotlist_clear ()
{
if (hotlist)
{
hotlist_free_all ();
gui_redraw_buffer (gui_current_window->buffer);
}
hotlist_initial_buffer = gui_current_window->buffer;
}
/*
* gui_input_infobar_clear: clear infobar
*/
void
gui_input_infobar_clear ()
{
gui_infobar_remove ();
gui_draw_buffer_infobar (gui_current_window->buffer, 1);
}
/*
* gui_switch_to_previous_buffer: switch to previous buffer
*/
void
gui_switch_to_previous_buffer ()
{
if (!gui_ok)
return;
/* increase buffer size */
buffer->input_buffer_size += length;
gui_optimize_input_buffer_size (buffer);
buffer->input_buffer[buffer->input_buffer_size] = '\0';
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
/* move end of string to the right */
start = pos + length;
end = buffer->input_buffer_size - 1;
for (i = end; i >= start; i--)
buffer->input_buffer[i] =
buffer->input_buffer[i - length];
if (gui_current_window->buffer->prev_buffer)
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer->prev_buffer);
else
gui_switch_to_buffer (gui_current_window, last_gui_buffer);
/* insert new string */
strncpy (buffer->input_buffer + pos, string, length);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_next_buffer: switch to next buffer
*/
void
gui_switch_to_next_buffer ()
{
if (!gui_ok)
return;
/* if only one buffer then return */
if (gui_buffers == last_gui_buffer)
return;
if (gui_current_window->buffer->next_buffer)
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer->next_buffer);
else
gui_switch_to_buffer (gui_current_window, gui_buffers);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_previous_window: switch to previous window
*/
void
gui_switch_to_previous_window ()
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (gui_current_window->prev_window) ? gui_current_window->prev_window : last_gui_window;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
* gui_switch_to_next_window: switch to next window
*/
void
gui_switch_to_next_window ()
{
if (!gui_ok)
return;
/* if only one window then return */
if (gui_windows == last_gui_window)
return;
gui_current_window = (gui_current_window->next_window) ? gui_current_window->next_window : gui_windows;
gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_redraw_buffer (gui_current_window->buffer);
}
/*
@@ -716,6 +1477,10 @@ gui_switch_to_buffer_by_number (t_gui_window *window, int number)
{
t_gui_buffer *ptr_buffer;
/* invalid buffer */
if (number < 0)
return NULL;
/* buffer is currently displayed ? */
if (number == window->buffer->number)
return window->buffer;
+528
View File
@@ -0,0 +1,528 @@
/*
* Copyright (c) 2003-2005 by FlashCode <flashcode@flashtux.org>
* See README for License detail, AUTHORS for developers list.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* gui-keyboard: keyboard functions (GUI independant) */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "../common/weechat.h"
#include "gui.h"
#include "../common/command.h"
t_gui_key *gui_keys = NULL;
t_gui_key *last_gui_key = NULL;
char gui_key_buffer[128];
t_gui_key_function gui_key_functions[] =
{ { "return", gui_input_return,
N_("terminate line") },
{ "tab", gui_input_tab,
N_("complete word") },
{ "backspace", gui_input_backspace,
N_("delete previous char") },
{ "delete", gui_input_delete,
N_("delete next char") },
{ "delete_end_line", gui_input_delete_end_of_line,
N_("delete until end of line") },
{ "delete_beginning_line", gui_input_delete_begin_of_line,
N_("delete until beginning of line") },
{ "delete_line", gui_input_delete_line,
N_("delete entire line") },
{ "delete_previous_word", gui_input_delete_previous_word,
N_("delete previous word") },
{ "delete_next_word", gui_input_delete_next_word,
N_("delete next word") },
{ "home", gui_input_home,
N_("go to beginning of line") },
{ "end", gui_input_end,
N_("go to end of line") },
{ "left", gui_input_left,
N_("move one char left") },
{ "previous_word", gui_input_previous_word,
N_("move to previous word") },
{ "right", gui_input_right,
N_("move one char right") },
{ "next_word", gui_input_next_word,
N_("move to next word") },
{ "up", gui_input_up,
N_("call previous command in history") },
{ "down", gui_input_down,
N_("call next command in history") },
{ "page_up", gui_input_page_up,
N_("scroll one page up") },
{ "page_down", gui_input_page_down,
N_("scroll one page down") },
{ "infobar_clear", gui_input_infobar_clear,
N_("clear infobar") },
{ "nick_page_up", gui_input_nick_page_up,
N_("scroll nicklist one page up") },
{ "nick_page_down", gui_input_nick_page_down,
N_("scroll nicklist one page down") },
{ "nick_beginning", gui_input_nick_beginning,
N_("display beginning of nicklist") },
{ "nick_end", gui_input_nick_end,
N_("display end of nicklist") },
{ "refresh", gui_curses_resize_handler,
N_("refresh screen") },
{ "jump_smart", gui_input_jump_smart,
N_("jump to buffer with activity") },
{ "jump_dcc", gui_input_jump_dcc,
N_("jump to DCC buffer") },
{ "jump_server", gui_input_jump_server,
N_("jump to server buffer") },
{ "jump_next_server", gui_input_jump_next_server,
N_("jump to next server") },
{ "hotlist_clear", gui_input_hotlist_clear,
N_("clear hotlist") },
{ NULL, NULL, NULL }
};
/*
* gui_key_init: init keyboard (create default key bindings)
*/
void
gui_key_init ()
{
gui_key_buffer[0] = '\0';
gui_input_default_key_bindings ();
}
/*
* gui_key_get_internal_code: get internal code from user key name
* for example: return "^R" for "ctrl-R"
*/
char *
gui_key_get_internal_code (char *key)
{
char *result;
if ((result = (char *) malloc (strlen (key) + 1)))
{
result[0] = '\0';
while (key[0])
{
if (strncasecmp (key, "meta2-", 6) == 0)
{
strcat (result, "^[[");
key += 6;
}
if (strncasecmp (key, "meta-", 5) == 0)
{
strcat (result, "^[");
key += 5;
}
else if (strncasecmp (key, "ctrl-", 5) == 0)
{
strcat (result, "^");
key += 5;
}
else
{
strncat (result, key, 1);
key++;
}
}
}
else
return NULL;
return result;
}
/*
* gui_key_get_expanded_name: get expanded name from internal key code
* for example: return "ctrl-R" for "^R"
*/
char *
gui_key_get_expanded_name (char *key)
{
char *result;
if ((result = (char *) malloc ((strlen (key) * 5) + 1)))
{
result[0] = '\0';
while (key[0])
{
if (strncasecmp (key, "^[[", 3) == 0)
{
strcat (result, "meta2-");
key += 3;
}
if (strncasecmp (key, "^[", 2) == 0)
{
strcat (result, "meta-");
key += 2;
}
else if (key[0] == '^')
{
strcat (result, "ctrl-");
key++;
}
else
{
strncat (result, key, 1);
key++;
}
}
}
else
return NULL;
return result;
}
/*
* gui_key_find_pos: find position for a key (for sorting keys list)
*/
t_gui_key *
gui_key_find_pos (t_gui_key *key)
{
t_gui_key *ptr_key;
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
if (strcasecmp (key->key, ptr_key->key) < 0)
return ptr_key;
}
return NULL;
}
/*
* gui_key_insert_sorted: insert key into sorted list
*/
void
gui_key_insert_sorted (t_gui_key *key)
{
t_gui_key *pos_key;
if (gui_keys)
{
pos_key = gui_key_find_pos (key);
if (pos_key)
{
/* insert key into the list (before key found) */
key->prev_key = pos_key->prev_key;
key->next_key = pos_key;
if (pos_key->prev_key)
pos_key->prev_key->next_key = key;
else
gui_keys = key;
pos_key->prev_key = key;
}
else
{
/* add key to the end */
key->prev_key = last_gui_key;
key->next_key = NULL;
last_gui_key->next_key = key;
last_gui_key = key;
}
}
else
{
key->prev_key = NULL;
key->next_key = NULL;
gui_keys = key;
last_gui_key = key;
}
}
/*
* gui_key_new: add a new key in keys list
*/
t_gui_key *
gui_key_new (char *key, char *command, void *function)
{
t_gui_key *new_key;
char *internal_code;
if ((new_key = (t_gui_key *) malloc (sizeof (t_gui_key))))
{
internal_code = gui_key_get_internal_code (key);
new_key->key = (internal_code) ? strdup (internal_code) : strdup (key);
if (internal_code)
free (internal_code);
new_key->command = (command) ? strdup (command) : NULL;
new_key->function = function;
gui_key_insert_sorted (new_key);
}
else
return NULL;
return new_key;
}
/*
* gui_key_search: search a key
*/
t_gui_key *
gui_key_search (char *key)
{
t_gui_key *ptr_key;
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
if (strcasecmp (ptr_key->key, key) == 0)
return ptr_key;
}
/* key not found */
return NULL;
}
/*
* gui_key_cmp: compares 2 keys
*/
int
gui_key_cmp (char *key, char *search)
{
while (search[0])
{
if (toupper(key[0]) != toupper(search[0]))
return search[0] - key[0];
key++;
search++;
}
return 0;
}
/*
* gui_key_search_part: search a key (maybe part of string)
*/
t_gui_key *
gui_key_search_part (char *key)
{
t_gui_key *ptr_key;
for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
{
if (gui_key_cmp (ptr_key->key, key) == 0)
return ptr_key;
}
/* key not found */
return NULL;
}
/*
* gui_key_function_search_by_name: search a function by name
*/
void *
gui_key_function_search_by_name (char *name)
{
int i;
i = 0;
while (gui_key_functions[i].function_name)
{
if (strcasecmp (gui_key_functions[i].function_name, name) == 0)
return gui_key_functions[i].function;
i++;
}
/* function not found */
return NULL;
}
/*
* gui_key_function_search_by_ptr: search a function by pointer
*/
char *
gui_key_function_search_by_ptr (void *function)
{
int i;
i = 0;
while (gui_key_functions[i].function_name)
{
if (gui_key_functions[i].function == function)
return gui_key_functions[i].function_name;
i++;
}
/* function not found */
return NULL;
}
/*
* gui_key_bind: bind a key to a function (command or special function)
*/
t_gui_key *
gui_key_bind (char *key, char *command)
{
t_gui_key_function *ptr_function;
t_gui_key *new_key;
if (!key || !command)
{
wee_log_printf (_("%s unable to bind key \"%s\"\n"),
WEECHAT_ERROR, key);
return NULL;
}
ptr_function = NULL;
if (command[0] != '/')
{
ptr_function = gui_key_function_search_by_name (command);
if (!ptr_function)
{
wee_log_printf (_("%s unable to bind key \"%s\" (invalid function name: \"%s\")\n"),
WEECHAT_ERROR, key, command);
return NULL;
}
}
gui_key_unbind (key);
new_key = gui_key_new (key,
(ptr_function) ? NULL : command,
ptr_function);
if (!new_key)
{
wee_log_printf (_("%s not enough memory for key binding\n"),
WEECHAT_ERROR);
return NULL;
}
return new_key;
}
/*
* gui_key_unbind: remove a key binding
*/
int
gui_key_unbind (char *key)
{
t_gui_key *ptr_key;
char *internal_code;
internal_code = gui_key_get_internal_code (key);
ptr_key = gui_key_search ((internal_code) ? internal_code : key);
if (ptr_key)
gui_key_free (ptr_key);
if (internal_code)
free (internal_code);
return (ptr_key != NULL);
}
/*
* gui_key_pressed: treat new key pressed
* return: 1 if key should be added to input buffer
* 0 otherwise
*/
int
gui_key_pressed (char *key_str)
{
int first_key;
t_gui_key *ptr_key;
first_key = (gui_key_buffer[0] == '\0');
strcat (gui_key_buffer, key_str);
ptr_key = gui_key_search_part (gui_key_buffer);
if (ptr_key)
{
if (strcasecmp (ptr_key->key, gui_key_buffer) == 0)
{
/* exact combo found => execute function or command */
gui_key_buffer[0] = '\0';
if (ptr_key->command)
user_command (SERVER(gui_current_window->buffer),
gui_current_window->buffer,
ptr_key->command);
else
(void)(ptr_key->function)();
}
//else
// gui_printf (gui_current_window->buffer, "partial key found\n");
return 0;
}
gui_key_buffer[0] = '\0';
/* if this is first key and not found (even partial) => return 1
else return 0 (= silently discard sequence of bad keys) */
return first_key;
}
/*
* key_free: delete a key binding
*/
void
gui_key_free (t_gui_key *key)
{
/* free memory */
if (key->key)
free (key->key);
if (key->command)
free (key->command);
/* remove key from keys list */
if (key->prev_key)
key->prev_key->next_key = key->next_key;
if (key->next_key)
key->next_key->prev_key = key->prev_key;
if (gui_keys == key)
gui_keys = key->next_key;
if (last_gui_key == key)
last_gui_key = key->prev_key;
free (key);
}
/*
* gui_key_free_all: delete all key bindings
*/
void
gui_key_free_all ()
{
while (gui_keys)
gui_key_free (gui_keys);
}
+103 -42
View File
@@ -26,7 +26,7 @@
#define INPUT_BUFFER_BLOCK_SIZE 256
#define NUM_COLORS 50
#define NUM_COLORS 51
#define COLOR_WIN_TITLE 1
#define COLOR_WIN_CHAT 2
#define COLOR_WIN_CHAT_TIME 3
@@ -45,31 +45,32 @@
#define COLOR_WIN_STATUS_DATA_OTHER 16
#define COLOR_WIN_STATUS_MORE 17
#define COLOR_WIN_INFOBAR 18
#define COLOR_WIN_INFOBAR_HIGHLIGHT 19
#define COLOR_WIN_INPUT 20
#define COLOR_WIN_INPUT_CHANNEL 21
#define COLOR_WIN_INPUT_NICK 22
#define COLOR_WIN_NICK 23
#define COLOR_WIN_NICK_AWAY 24
#define COLOR_WIN_NICK_CHANOWNER 25
#define COLOR_WIN_NICK_CHANADMIN 26
#define COLOR_WIN_NICK_OP 27
#define COLOR_WIN_NICK_HALFOP 28
#define COLOR_WIN_NICK_VOICE 29
#define COLOR_WIN_NICK_MORE 30
#define COLOR_WIN_NICK_SEP 31
#define COLOR_WIN_NICK_SELF 32
#define COLOR_WIN_NICK_PRIVATE 33
#define COLOR_WIN_NICK_FIRST 34
#define COLOR_WIN_NICK_LAST 43
#define COLOR_WIN_INFOBAR_DELIMITERS 19
#define COLOR_WIN_INFOBAR_HIGHLIGHT 20
#define COLOR_WIN_INPUT 21
#define COLOR_WIN_INPUT_CHANNEL 22
#define COLOR_WIN_INPUT_NICK 23
#define COLOR_WIN_NICK 24
#define COLOR_WIN_NICK_AWAY 25
#define COLOR_WIN_NICK_CHANOWNER 26
#define COLOR_WIN_NICK_CHANADMIN 27
#define COLOR_WIN_NICK_OP 28
#define COLOR_WIN_NICK_HALFOP 29
#define COLOR_WIN_NICK_VOICE 30
#define COLOR_WIN_NICK_MORE 31
#define COLOR_WIN_NICK_SEP 32
#define COLOR_WIN_NICK_SELF 33
#define COLOR_WIN_NICK_PRIVATE 34
#define COLOR_WIN_NICK_FIRST 35
#define COLOR_WIN_NICK_LAST 44
#define COLOR_WIN_NICK_NUMBER (COLOR_WIN_NICK_LAST - COLOR_WIN_NICK_FIRST + 1)
#define COLOR_DCC_SELECTED 44
#define COLOR_DCC_WAITING 45
#define COLOR_DCC_CONNECTING 46
#define COLOR_DCC_ACTIVE 47
#define COLOR_DCC_DONE 48
#define COLOR_DCC_FAILED 49
#define COLOR_DCC_ABORTED 50
#define COLOR_DCC_SELECTED 45
#define COLOR_DCC_WAITING 46
#define COLOR_DCC_CONNECTING 47
#define COLOR_DCC_ACTIVE 48
#define COLOR_DCC_DONE 49
#define COLOR_DCC_FAILED 40
#define COLOR_DCC_ABORTED 51
#define SERVER(buffer) ((t_irc_server *)(buffer->server))
#define CHANNEL(buffer) ((t_irc_channel *)(buffer->channel))
@@ -219,6 +220,9 @@ struct t_gui_window
int win_nick_height; /* height of nick window */
int win_nick_start; /* # of 1st nick for display (scroll) */
/* input window settings */
int win_input_x; /* position of cursor in input window */
/* windows for Curses GUI */
void *win_title; /* title window */
void *win_chat; /* chat window (example: channel) */
@@ -252,6 +256,26 @@ struct t_gui_window
t_gui_window *next_window; /* link to next window */
};
typedef struct t_gui_key t_gui_key;
struct t_gui_key
{
char *key; /* key combo (ex: a, ^W, ^W^C, meta-a) */
char *command; /* associated command (may be NULL) */
void (*function)(); /* associated function (if cmd is NULL) */
t_gui_key *prev_key; /* link to previous key */
t_gui_key *next_key; /* link to next key */
};
typedef struct t_gui_key_function t_gui_key_function;
struct t_gui_key_function
{
char *function_name; /* name of function */
void (*function)(); /* associated function */
char *description; /* description of function */
};
/* variables */
extern int gui_init_ok;
@@ -264,8 +288,11 @@ extern t_gui_buffer *gui_buffers;
extern t_gui_buffer *last_gui_buffer;
extern t_gui_buffer *buffer_before_dcc;
extern t_gui_infobar *gui_infobar;
extern t_gui_key *gui_keys;
extern t_gui_key *last_gui_key;
extern t_gui_key_function gui_key_functions[];
/* GUI independent functions */
/* GUI independent functions: windows & buffers */
extern t_gui_window *gui_window_new (int, int, int, int);
extern t_gui_buffer *gui_buffer_new (t_gui_window *, void *, void *, int, int);
@@ -277,17 +304,53 @@ extern void gui_infobar_remove ();
extern void gui_buffer_free (t_gui_buffer *, int);
extern t_gui_line *gui_new_line (t_gui_buffer *);
extern t_gui_message *gui_new_message (t_gui_buffer *);
extern void gui_optimize_input_buffer_size (t_gui_buffer *);
extern void gui_delete_previous_word (t_gui_buffer *);
extern void gui_move_previous_word (t_gui_buffer *);
extern void gui_move_next_word (t_gui_buffer *);
extern void gui_buffer_insert_string (t_gui_buffer *, char *, int);
extern void gui_input_insert_char ();
extern void gui_input_return ();
extern void gui_input_tab ();
extern void gui_input_backspace ();
extern void gui_input_delete ();
extern void gui_input_delete_previous_word ();
extern void gui_input_delete_next_word ();
extern void gui_input_delete_begin_of_line ();
extern void gui_input_delete_end_of_line ();
extern void gui_input_delete_line ();
extern void gui_input_home ();
extern void gui_input_end ();
extern void gui_input_left ();
extern void gui_input_previous_word ();
extern void gui_input_right ();
extern void gui_input_next_word ();
extern void gui_input_up ();
extern void gui_input_down ();
extern void gui_input_jump_smart ();
extern void gui_input_jump_dcc ();
extern void gui_input_jump_server ();
extern void gui_input_jump_next_server ();
extern void gui_input_hotlist_clear ();
extern void gui_input_infobar_clear ();
extern void gui_switch_to_previous_buffer ();
extern void gui_switch_to_next_buffer ();
extern void gui_switch_to_previous_window ();
extern void gui_switch_to_next_window ();
extern t_gui_buffer *gui_switch_to_buffer_by_number (t_gui_window *, int);
extern void gui_move_buffer_to_number (t_gui_window *, int);
extern void gui_window_print_log (t_gui_window *);
extern void gui_buffer_print_log (t_gui_buffer *);
/* GUI dependant functions */
/* GUI independent functions: keys */
extern void gui_key_init ();
extern char *gui_key_get_internal_code (char *);
extern char *gui_key_get_expanded_name (char *);
extern void *gui_key_function_search_by_name (char *);
extern char *gui_key_function_search_by_ptr (void *);
extern t_gui_key *gui_key_bind (char *, char *);
extern int gui_key_unbind (char *);
extern int gui_key_pressed (char *);
extern void gui_key_free (t_gui_key *);
extern void gui_key_free_all ();
/* GUI dependant functions: display */
extern int gui_assign_color (int *, char *);
extern int gui_get_color_by_name (char *);
@@ -298,22 +361,19 @@ extern void gui_draw_buffer_title (t_gui_buffer *, int);
extern void gui_draw_buffer_chat (t_gui_buffer *, int);
extern void gui_draw_buffer_nick (t_gui_buffer *, int);
extern void gui_draw_buffer_status (t_gui_buffer *, int);
extern void gui_draw_buffer_infobar_time (t_gui_buffer *);
extern void gui_draw_buffer_infobar (t_gui_buffer *, int);
extern void gui_draw_buffer_input (t_gui_buffer *, int);
extern void gui_redraw_buffer (t_gui_buffer *);
extern void gui_switch_to_buffer (t_gui_window *, t_gui_buffer *);
extern t_gui_buffer *gui_get_dcc_buffer ();
extern void gui_switch_to_dcc_buffer ();
extern void gui_switch_to_previous_buffer (t_gui_window *);
extern void gui_switch_to_next_buffer (t_gui_window *);
extern void gui_switch_to_previous_window (t_gui_window *);
extern void gui_switch_to_next_window (t_gui_window *);
extern void gui_move_page_up (t_gui_window *);
extern void gui_move_page_down (t_gui_window *);
extern void gui_nick_move_beginning (t_gui_window *);
extern void gui_nick_move_end (t_gui_window *);
extern void gui_nick_move_page_up (t_gui_window *);
extern void gui_nick_move_page_down (t_gui_window *);
extern void gui_input_page_up ();
extern void gui_input_page_down ();
extern void gui_input_nick_beginning ();
extern void gui_input_nick_end ();
extern void gui_input_nick_page_up ();
extern void gui_input_nick_page_down ();
extern void gui_curses_resize_handler ();
extern void gui_window_init_subwindows (t_gui_window *);
extern void gui_window_split_horiz (t_gui_window *);
@@ -330,6 +390,7 @@ extern void gui_set_window_title ();
extern void gui_init ();
extern void gui_end ();
extern void gui_printf_type_color (/*@null@*/ t_gui_buffer *, int, int, char *, ...);
extern void gui_input_default_key_bindings ();
extern void gui_main_loop ();
#endif /* gui.h */