summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2011-07-05 15:36:42 +0200
committerSebastien Helleu <flashcode@flashtux.org>2011-07-05 15:36:42 +0200
commit3bea55b2f0759541b0d8930396eb4fc1f7d62ecc (patch)
tree08d5886e45a114e02e7a8aa9b30708466d102970 /src
parent5250b68d0a1d9871b9d89ff1253290372a747cf6 (diff)
downloadweechat-3bea55b2f0759541b0d8930396eb4fc1f7d62ecc.zip
core: add context "search" for keys (to define keys used during search in buffer with ctrl+"r")
Diffstat (limited to 'src')
-rw-r--r--src/core/wee-command.c520
-rw-r--r--src/core/wee-completion.c110
-rw-r--r--src/core/wee-config.c81
-rw-r--r--src/core/wee-debug.c4
-rw-r--r--src/core/weechat.c40
-rw-r--r--src/gui/CMakeLists.txt2
-rw-r--r--src/gui/Makefile.am4
-rw-r--r--src/gui/curses/CMakeLists.txt2
-rw-r--r--src/gui/curses/Makefile.am2
-rw-r--r--src/gui/curses/gui-curses-key.c508
-rw-r--r--src/gui/curses/gui-curses-keyboard.c501
-rw-r--r--src/gui/curses/gui-curses-main.c2
-rw-r--r--src/gui/curses/gui-curses-window.c1
-rw-r--r--src/gui/curses/gui-curses.h6
-rw-r--r--src/gui/gtk/CMakeLists.txt2
-rw-r--r--src/gui/gtk/Makefile.am2
-rw-r--r--src/gui/gtk/gui-gtk-key.c (renamed from src/gui/gtk/gui-gtk-keyboard.c)11
-rw-r--r--src/gui/gtk/gui-gtk.h8
-rw-r--r--src/gui/gui-bar-item.c6
-rw-r--r--src/gui/gui-buffer.c16
-rw-r--r--src/gui/gui-input.c303
-rw-r--r--src/gui/gui-input.h4
-rw-r--r--src/gui/gui-key.c (renamed from src/gui/gui-keyboard.c)462
-rw-r--r--src/gui/gui-key.h105
-rw-r--r--src/gui/gui-keyboard.h93
-rw-r--r--src/gui/gui-window.c1
-rw-r--r--src/plugins/plugin-api.c22
27 files changed, 1639 insertions, 1179 deletions
diff --git a/src/core/wee-command.c b/src/core/wee-command.c
index a47450d84..24c886190 100644
--- a/src/core/wee-command.c
+++ b/src/core/wee-command.c
@@ -59,7 +59,7 @@
#include "../gui/gui-history.h"
#include "../gui/gui-hotlist.h"
#include "../gui/gui-input.h"
-#include "../gui/gui-keyboard.h"
+#include "../gui/gui-key.h"
#include "../gui/gui-layout.h"
#include "../gui/gui-main.h"
#include "../gui/gui-window.h"
@@ -2123,6 +2123,14 @@ COMMAND_CALLBACK(input)
gui_input_complete_previous (buffer);
else if (string_strcasecmp (argv[1], "search_text") == 0)
gui_input_search_text (buffer);
+ else if (string_strcasecmp (argv[1], "search_previous") == 0)
+ gui_input_search_previous (buffer);
+ else if (string_strcasecmp (argv[1], "search_next") == 0)
+ gui_input_search_next (buffer);
+ else if (string_strcasecmp (argv[1], "search_switch_case") == 0)
+ gui_input_search_switch_case (buffer);
+ else if (string_strcasecmp (argv[1], "search_stop") == 0)
+ gui_input_search_stop (buffer);
else if (string_strcasecmp (argv[1], "delete_previous_char") == 0)
gui_input_delete_previous_char (buffer);
else if (string_strcasecmp (argv[1], "delete_next_char") == 0)
@@ -2208,7 +2216,7 @@ command_key_display (struct t_gui_key *key, struct t_gui_key *default_key)
char str_spaces[20 + 1];
int length_screen, num_spaces;
- expanded_name = gui_keyboard_get_expanded_name (key->key);
+ expanded_name = gui_key_get_expanded_name (key->key);
str_spaces[0] = '\0';
length_screen = utf8_strlen_screen ((expanded_name) ?
@@ -2255,17 +2263,20 @@ command_key_display (struct t_gui_key *key, struct t_gui_key *default_key)
void
command_key_display_list (const char *message_no_key,
const char *message_keys,
+ int context,
struct t_gui_key *keys,
int keys_count)
{
struct t_gui_key *ptr_key;
if (keys_count == 0)
- gui_chat_printf (NULL, message_no_key);
+ gui_chat_printf (NULL, message_no_key,
+ gui_key_context_string[context]);
else
{
gui_chat_printf (NULL, "");
- gui_chat_printf (NULL, message_keys, keys_count);
+ gui_chat_printf (NULL, message_keys,
+ keys_count, gui_key_context_string[context]);
for (ptr_key = keys; ptr_key; ptr_key = ptr_key->next_key)
{
command_key_display (ptr_key, NULL);
@@ -2279,17 +2290,17 @@ command_key_display_list (const char *message_no_key,
*/
void
-command_key_display_listdiff ()
+command_key_display_listdiff (int context)
{
struct t_gui_key *ptr_key, *ptr_default_key;
int count_added, count_deleted;
/* list keys added or redefined */
count_added = 0;
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
+ for (ptr_key = gui_keys[context]; ptr_key; ptr_key = ptr_key->next_key)
{
- ptr_default_key = gui_keyboard_search (gui_default_keys,
- ptr_key->key);
+ ptr_default_key = gui_key_search (gui_default_keys[context],
+ ptr_key->key);
if (!ptr_default_key
|| (strcmp (ptr_default_key->command, ptr_key->command) != 0))
{
@@ -2299,12 +2310,15 @@ command_key_display_listdiff ()
if (count_added > 0)
{
gui_chat_printf (NULL, "");
- gui_chat_printf (NULL, _("Key bindings added or redefined (%d):"),
- count_added);
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
- {
- ptr_default_key = gui_keyboard_search (gui_default_keys,
- ptr_key->key);
+ gui_chat_printf (NULL,
+ _("Key bindings added or redefined (%d) for "
+ "context \"%s\":"),
+ count_added,
+ _(gui_key_context_string[context]));
+ for (ptr_key = gui_keys[context]; ptr_key; ptr_key = ptr_key->next_key)
+ {
+ ptr_default_key = gui_key_search (gui_default_keys[context],
+ ptr_key->key);
if (!ptr_default_key
|| (strcmp (ptr_default_key->command, ptr_key->command) != 0))
{
@@ -2315,21 +2329,24 @@ command_key_display_listdiff ()
/* list keys deleted */
count_deleted = 0;
- for (ptr_default_key = gui_default_keys; ptr_default_key;
+ for (ptr_default_key = gui_default_keys[context]; ptr_default_key;
ptr_default_key = ptr_default_key->next_key)
{
- ptr_key = gui_keyboard_search (gui_keys, ptr_default_key->key);
+ ptr_key = gui_key_search (gui_keys[context], ptr_default_key->key);
if (!ptr_key)
count_deleted++;
- }
+ }
if (count_deleted > 0)
{
gui_chat_printf (NULL, "");
- gui_chat_printf (NULL, _("Key bindings deleted (%d):"), count_deleted);
- for (ptr_default_key = gui_default_keys; ptr_default_key;
+ gui_chat_printf (NULL,
+ _("Key bindings deleted (%d) for context \"%s\":"),
+ count_deleted,
+ _(gui_key_context_string[context]));
+ for (ptr_default_key = gui_default_keys[context]; ptr_default_key;
ptr_default_key = ptr_default_key->next_key)
{
- ptr_key = gui_keyboard_search (gui_keys, ptr_default_key->key);
+ ptr_key = gui_key_search (gui_keys[context], ptr_default_key->key);
if (!ptr_key)
{
command_key_display (ptr_default_key, NULL);
@@ -2341,10 +2358,104 @@ command_key_display_listdiff ()
if ((count_added == 0) && (count_deleted == 0))
{
gui_chat_printf (NULL,
- _("No key binding added, redefined or removed"));
+ _("No key binding added, redefined or removed "
+ "for context \"%s\""),
+ _(gui_key_context_string[context]));
}
}
-
+
+/*
+ * command_key_reset: reset a key for a given context
+ */
+
+int
+command_key_reset (int context, const char *key)
+{
+ char *internal_code;
+ struct t_gui_key *ptr_key, *ptr_default_key, *ptr_new_key;
+
+ internal_code = gui_key_get_internal_code (key);
+ if (!internal_code)
+ return WEECHAT_RC_ERROR;
+
+ ptr_key = gui_key_search (gui_keys[context],
+ internal_code);
+ ptr_default_key = gui_key_search (gui_default_keys[context],
+ internal_code);
+ free (internal_code);
+
+ if (ptr_key || ptr_default_key)
+ {
+ if (ptr_key && ptr_default_key)
+ {
+ if (strcmp (ptr_key->command, ptr_default_key->command) != 0)
+ {
+ gui_key_verbose = 1;
+ ptr_new_key = gui_key_bind (NULL, context, key,
+ ptr_default_key->command);
+ gui_key_verbose = 0;
+ if (!ptr_new_key)
+ {
+ gui_chat_printf (NULL,
+ _("%sError: unable to bind key \"%s\""),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ key);
+ return WEECHAT_RC_OK;
+ }
+ }
+ else
+ {
+ gui_chat_printf (NULL,
+ _("Key \"%s\" has already default "
+ "value"),
+ key);
+ }
+ }
+ else if (ptr_key)
+ {
+ /* no default key, so just unbind key */
+ if (gui_key_unbind (NULL, context, key, 1))
+ {
+ gui_chat_printf (NULL,
+ _("Key \"%s\" unbound (context: \"%s\")"),
+ key,
+ gui_key_context_string[context]);
+ }
+ else
+ {
+ gui_chat_printf (NULL,
+ _("%sError: unable to unbind key \"%s\""),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ key);
+ return WEECHAT_RC_OK;
+ }
+ }
+ else
+ {
+ /* no key, but default key exists */
+ gui_key_verbose = 1;
+ ptr_new_key = gui_key_bind (NULL, context, key,
+ ptr_default_key->command);
+ gui_key_verbose = 0;
+ if (!ptr_new_key)
+ {
+ gui_chat_printf (NULL,
+ _("%sError: unable to bind key \"%s\""),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ key);
+ return WEECHAT_RC_OK;
+ }
+ }
+ }
+ else
+ {
+ gui_chat_printf (NULL, _("%sKey \"%s\" not found"),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ key);
+ }
+ return WEECHAT_RC_OK;
+}
+
/*
* command_key: bind/unbind keys
*/
@@ -2352,8 +2463,8 @@ command_key_display_listdiff ()
COMMAND_CALLBACK(key)
{
char *internal_code;
- struct t_gui_key *ptr_key, *ptr_default_key, *ptr_new_key;
- int old_keys_count, keys_added;
+ struct t_gui_key *ptr_new_key;
+ int old_keys_count, keys_added, i, context;
/* make C compiler happy */
(void) data;
@@ -2362,39 +2473,68 @@ COMMAND_CALLBACK(key)
/* display all key bindings (current keys) */
if ((argc == 1) || (string_strcasecmp (argv[1], "list") == 0))
{
- command_key_display_list (_("No key binding defined"),
- _("Key bindings (%d):"),
- gui_keys,
- gui_keys_count);
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ if ((argc < 3)
+ || (string_strcasecmp (argv[2], gui_key_context_string[i]) == 0))
+ {
+ command_key_display_list (_("No key binding defined for "
+ "context \"%s\""),
+ _("Key bindings (%d) for "
+ "context \"%s\":"),
+ i, gui_keys[i], gui_keys_count[i]);
+ }
+ }
return WEECHAT_RC_OK;
}
/* display redefined or key bindings added */
if (string_strcasecmp (argv[1], "listdiff") == 0)
{
- command_key_display_listdiff ();
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ if ((argc < 3)
+ || (string_strcasecmp (argv[2], gui_key_context_string[i]) == 0))
+ {
+ command_key_display_listdiff (i);
+ }
+ }
return WEECHAT_RC_OK;
}
/* display default key bindings */
if (string_strcasecmp (argv[1], "listdefault") == 0)
{
- command_key_display_list (_("No default key binding"),
- _("Default key bindings (%d):"),
- gui_default_keys,
- gui_default_keys_count);
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ if ((argc < 3)
+ || (string_strcasecmp (argv[2], gui_key_context_string[i]) == 0))
+ {
+ command_key_display_list (_("No default key binding for "
+ "context \"%s\""),
+ _("Default key bindings (%d) for "
+ "context \"%s\":"),
+ i,
+ gui_default_keys[i],
+ gui_default_keys_count[i]);
+ }
+ }
return WEECHAT_RC_OK;
}
/* bind a key (or display binding) */
if (string_strcasecmp (argv[1], "bind") == 0)
{
+ COMMAND_MIN_ARGS(3, "key bind");
+
+ /* display a key binding */
if (argc == 3)
{
ptr_new_key = NULL;
- internal_code = gui_keyboard_get_internal_code (argv[2]);
+ internal_code = gui_key_get_internal_code (argv[2]);
if (internal_code)
- ptr_new_key = gui_keyboard_search (gui_keys, internal_code);
+ ptr_new_key = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT],
+ internal_code);
if (ptr_new_key)
{
gui_chat_printf (NULL, "");
@@ -2411,12 +2551,11 @@ COMMAND_CALLBACK(key)
return WEECHAT_RC_OK;
}
- COMMAND_MIN_ARGS(4, "key bind");
-
/* bind new key */
- gui_keyboard_verbose = 1;
- ptr_new_key = gui_keyboard_bind (NULL, argv[2], argv_eol[3]);
- gui_keyboard_verbose = 0;
+ gui_key_verbose = 1;
+ ptr_new_key = gui_key_bind (NULL, GUI_KEY_CONTEXT_DEFAULT,
+ argv[2], argv_eol[3]);
+ gui_key_verbose = 0;
if (!ptr_new_key)
{
gui_chat_printf (NULL,
@@ -2428,25 +2567,115 @@ COMMAND_CALLBACK(key)
return WEECHAT_RC_OK;
}
- /* unbind a key */
- if (string_strcasecmp (argv[1], "unbind") == 0)
+ /* bind a key for given context (or display binding) */
+ if (string_strcasecmp (argv[1], "bindctxt") == 0)
{
- if (argc >= 3)
+ COMMAND_MIN_ARGS(4, "key bindctxt");
+
+ /* search context */
+ context = gui_key_search_context (argv[2]);
+ if (context < 0)
+ {
+ gui_chat_printf (NULL,
+ _("%sError: context \"%s\" not found"),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ argv[2]);
+ return WEECHAT_RC_OK;
+ }
+
+ /* display a key binding */
+ if (argc == 4)
{
- if (gui_keyboard_unbind (NULL, argv[2], 1))
+ ptr_new_key = NULL;
+ internal_code = gui_key_get_internal_code (argv[2]);
+ if (internal_code)
+ ptr_new_key = gui_key_search (gui_keys[context],
+ internal_code);
+ if (ptr_new_key)
{
- gui_chat_printf (NULL,
- _("Key \"%s\" unbound"),
- argv[2]);
+ gui_chat_printf (NULL, "");
+ gui_chat_printf (NULL, _("Key:"));
+ command_key_display (ptr_new_key, NULL);
}
else
{
gui_chat_printf (NULL,
- _("%sError: unable to unbind key \"%s\""),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
- argv[2]);
- return WEECHAT_RC_OK;
+ _("No key found"));
}
+ if (internal_code)
+ free (internal_code);
+ return WEECHAT_RC_OK;
+ }
+
+ /* bind new key */
+ gui_key_verbose = 1;
+ ptr_new_key = gui_key_bind (NULL, context,
+ argv[3], argv_eol[4]);
+ gui_key_verbose = 0;
+ if (!ptr_new_key)
+ {
+ gui_chat_printf (NULL,
+ _("%sError: unable to bind key \"%s\""),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ argv[3]);
+ return WEECHAT_RC_OK;
+ }
+ return WEECHAT_RC_OK;
+ }
+
+ /* unbind a key */
+ if (string_strcasecmp (argv[1], "unbind") == 0)
+ {
+ COMMAND_MIN_ARGS(3, "key unbind");
+
+ if (gui_key_unbind (NULL, GUI_KEY_CONTEXT_DEFAULT, argv[2], 1))
+ {
+ gui_chat_printf (NULL,
+ _("Key \"%s\" unbound (context: \"%s\")"),
+ argv[2],
+ gui_key_context_string[GUI_KEY_CONTEXT_DEFAULT]);
+ }
+ else
+ {
+ gui_chat_printf (NULL,
+ _("%sError: unable to unbind key \"%s\""),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ argv[2]);
+ return WEECHAT_RC_OK;
+ }
+ return WEECHAT_RC_OK;
+ }
+
+ /* unbind a key for a given context */
+ if (string_strcasecmp (argv[1], "unbindctxt") == 0)
+ {
+ COMMAND_MIN_ARGS(4, "key unbindctxt");
+
+ /* search context */
+ context = gui_key_search_context (argv[2]);
+ if (context < 0)
+ {
+ gui_chat_printf (NULL,
+ _("%sError: context \"%s\" not found"),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ argv[2]);
+ return WEECHAT_RC_OK;
+ }
+
+ if (gui_key_unbind (NULL, context, argv[3], 1))
+ {
+ gui_chat_printf (NULL,
+ _("Key \"%s\" unbound (context: \"%s\")"),
+ argv[3],
+ gui_key_context_string[context]);
+ }
+ else
+ {
+ gui_chat_printf (NULL,
+ _("%sError: unable to unbind key \"%s\""),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ argv[3]);
+ return WEECHAT_RC_OK;
}
return WEECHAT_RC_OK;
}
@@ -2454,86 +2683,28 @@ COMMAND_CALLBACK(key)
/* reset a key to default binding */
if (string_strcasecmp (argv[1], "reset") == 0)
{
- if (argc >= 3)
+ COMMAND_MIN_ARGS(3, "key reset");
+
+ return command_key_reset (GUI_KEY_CONTEXT_DEFAULT, argv[2]);
+ }
+
+ /* reset a key to default binding for a given context */
+ if (string_strcasecmp (argv[1], "resetctxt") == 0)
+ {
+ COMMAND_MIN_ARGS(4, "key reset");
+
+ /* search context */
+ context = gui_key_search_context (argv[2]);
+ if (context < 0)
{
- internal_code = gui_keyboard_get_internal_code (argv[2]);
- if (!internal_code)
- return WEECHAT_RC_ERROR;
-
- ptr_key = gui_keyboard_search (gui_keys, internal_code);
- ptr_default_key = gui_keyboard_search (gui_default_keys, internal_code);
- free (internal_code);
-
- if (ptr_key || ptr_default_key)
- {
- if (ptr_key && ptr_default_key)
- {
- if (strcmp (ptr_key->command, ptr_default_key->command) != 0)
- {
- gui_keyboard_verbose = 1;
- ptr_new_key = gui_keyboard_bind (NULL, argv[2],
- ptr_default_key->command);
- gui_keyboard_verbose = 0;
- if (!ptr_new_key)
- {
- gui_chat_printf (NULL,
- _("%sError: unable to bind key \"%s\""),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
- argv[2]);
- return WEECHAT_RC_OK;
- }
- }
- else
- {
- gui_chat_printf (NULL,
- _("Key \"%s\" has already default "
- "value"),
- argv[2]);
- }
- }
- else if (ptr_key)
- {
- /* no default key, so just unbind key */
- if (gui_keyboard_unbind (NULL, argv[2], 1))
- {
- gui_chat_printf (NULL,
- _("Key \"%s\" unbound"),
- argv[2]);
- }
- else
- {
- gui_chat_printf (NULL,
- _("%sError: unable to unbind key \"%s\""),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
- argv[2]);
- return WEECHAT_RC_OK;
- }
- }
- else
- {
- /* no key, but default key exists */
- gui_keyboard_verbose = 1;
- ptr_new_key = gui_keyboard_bind (NULL, argv[2],
- ptr_default_key->command);
- gui_keyboard_verbose = 0;
- if (!ptr_new_key)
- {
- gui_chat_printf (NULL,
- _("%sError: unable to bind key \"%s\""),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
- argv[2]);
- return WEECHAT_RC_OK;
- }
- }
- }
- else
- {
- gui_chat_printf (NULL, _("%sKey \"%s\" not found"),
- gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
- argv[2]);
- }
+ gui_chat_printf (NULL,
+ _("%sError: context \"%s\" not found"),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
+ argv[2]);
+ return WEECHAT_RC_OK;
}
- return WEECHAT_RC_OK;
+
+ return command_key_reset (context, argv[3]);
}
/* reset ALL keys (only with "-yes", for security reason) */
@@ -2541,10 +2712,20 @@ COMMAND_CALLBACK(key)
{
if ((argc >= 3) && (string_strcasecmp (argv[2], "-yes") == 0))
{
- gui_keyboard_free_all (&gui_keys, &last_gui_key, &gui_keys_count);
- gui_keyboard_default_bindings ();
- gui_chat_printf (NULL,
- _("Default key bindings restored"));
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ if ((argc < 4)
+ || (string_strcasecmp (argv[3], gui_key_context_string[i]) == 0))
+ {
+ gui_key_free_all (&gui_keys[i], &last_gui_key[i],
+ &gui_keys_count[i]);
+ gui_key_default_bindings (i);
+ gui_chat_printf (NULL,
+ _("Default key bindings restored for "
+ "context \"%s\""),
+ gui_key_context_string[i]);
+ }
+ }
}
else
{
@@ -2560,15 +2741,24 @@ COMMAND_CALLBACK(key)
/* add missing keys */
if (string_strcasecmp (argv[1], "missing") == 0)
{
- old_keys_count = gui_keys_count;
- gui_keyboard_verbose = 1;
- gui_keyboard_default_bindings ();
- gui_keyboard_verbose = 0;
- keys_added = (gui_keys_count > old_keys_count) ?
- gui_keys_count - old_keys_count : 0;
- gui_chat_printf (NULL,
- NG_("%d new key added", "%d new keys added", keys_added),
- keys_added);
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ if ((argc < 3)
+ || (string_strcasecmp (argv[2], gui_key_context_string[i]) == 0))
+ {
+ old_keys_count = gui_keys_count[i];
+ gui_key_verbose = 1;
+ gui_key_default_bindings (i);
+ gui_key_verbose = 0;
+ keys_added = (gui_keys_count[i] > old_keys_count) ?
+ gui_keys_count[i] - old_keys_count : 0;
+ gui_chat_printf (NULL,
+ NG_("%d new key added", "%d new keys added "
+ "(context: \"%s\")", keys_added),
+ keys_added,
+ gui_key_context_string[i]);
+ }
+ }
return WEECHAT_RC_OK;
}
@@ -4980,6 +5170,10 @@ command_init ()
" complete_previous: complete word with previous "
"completion\n"
" search_text: search text in buffer\n"
+ " search_switch_case: switch exact case for search\n"
+ " search_previous: search previous line\n"
+ " search_next: search next line\n"
+ " search_stop: stop search\n"
" delete_previous_char: delete previous char\n"
" delete_next_char: delete next char\n"
" delete_previous_word: delete previous word\n"
@@ -5027,6 +5221,7 @@ command_init ()
" insert: insert text in command line\n\n"
"This command is used by key bindings or plugins."),
"return|complete_next|complete_previous|search_text|"
+ "search_switch_case|search_previous|search_next|search_stop|"
"delete_previous_char|delete_next_char|"
"delete_previous_word|delete_next_word|"
"delete_beginning_of_line|delete_end_of_line|"
@@ -5043,21 +5238,33 @@ command_init ()
&command_input, NULL);
hook_command (NULL, "key",
N_("bind/unbind keys"),
- N_("list|listdefault|listdiff"
+ N_("list|listdefault|listdiff [<context>]"
" || bind <key> [<command> [<args>]]"
+ " || bindctxt <context> <key> [<command> [<args>]]"
" || unbind <key>"
+ " || unbindctxt <context> <key>"
" || reset <key>"
- " || resetall -yes"
- " || missing"),
+ " || resetctxt <context> <key>"
+ " || resetall -yes [<context>]"
+ " || missing [<context>]"),
N_(" list: list all current keys (without argument, "
"this list is displayed)\n"
"listdefault: list default keys\n"
" listdiff: list differences between current and "
- "default keys (keys added, redefined or deleted)\n"
+ "default keys (keys added, redefined or deleted)\n"
+ " context: name of context (\"default\" or "
+ "\"search\")\n"
" bind: bind a command to a key or display command "
- "bound to key\n"
- " unbind: remove a key binding\n"
- " reset: reset a key to default binding\n"
+ "bound to key (for context \"default\")\n"
+ " bindctxt: bind a command to a key or display command "
+ "bound to key, for given context\n"
+ " unbind: remove a key binding (for context "
+ "\"default\")\n"
+ " unbindctxt: remove a key binding for given context\n"
+ " reset: reset a key to default binding (for "
+ "context \"default\")\n"
+ " resetctxt: reset a key to default binding, for given "
+ "context\n"
" resetall: restore bindings to the default values and "
"delete ALL personal bindings (use carefully!)\n"
" missing: add missing keys (using default bindings), "
@@ -5071,15 +5278,20 @@ command_init ()
" key alt-r to jump to #weechat IRC channel:\n"
" /key bind meta-r /buffer #weechat\n"
" restore default binding for key alt-r:\n"
- " /key reset meta-r"),
- "list"
- " || listdefault"
- " || listdiff"
+ " /key reset meta-r\n"
+ " key \"tab\" to stop search in buffer:\n"
+ " /key bindctxt search ctrl-I /input search_stop"),
+ "list %(keys_contexts)"
+ " || listdefault %(keys_contexts)"
+ " || listdiff %(keys_contexts)"
" || bind %(keys_codes) %(commands)"
+ " || bindctxt %(keys_contexts) %(keys_codes) %(commands)"
" || unbind %(keys_codes)"
+ " || unbindctxt %(keys_contexts) %(keys_codes)"
" || reset %(keys_codes_for_reset)"
+ " || resetctxt %(keys_contexts) %(keys_codes_for_reset)"
" || resetall"
- " || missing",
+ " || missing %(keys_contexts)",
&command_key, NULL);
hook_command (NULL, "layout",
N_("save/apply/reset layout for buffers and windows"),
diff --git a/src/core/wee-completion.c b/src/core/wee-completion.c
index 5298fd0cf..49cdf9a91 100644
--- a/src/core/wee-completion.c
+++ b/src/core/wee-completion.c
@@ -48,7 +48,7 @@
#include "../gui/gui-buffer.h"
#include "../gui/gui-color.h"
#include "../gui/gui-filter.h"
-#include "../gui/gui-keyboard.h"
+#include "../gui/gui-key.h"
#include "../gui/gui-nicklist.h"
@@ -1106,6 +1106,32 @@ completion_list_add_proxies_options_cb (void *data,
}
/*
+ * completion_list_add_keys_contexts_cb: add keys contexts to completion list
+ */
+
+int
+completion_list_add_keys_contexts_cb (void *data,
+ const char *completion_item,
+ struct t_gui_buffer *buffer,
+ struct t_gui_completion *completion)
+{
+ int i;
+
+ /* make C compiler happy */
+ (void) data;
+ (void) completion_item;
+ (void) buffer;
+
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ gui_completion_list_add (completion, gui_key_context_string[i],
+ 0, WEECHAT_LIST_POS_END);
+ }
+
+ return WEECHAT_RC_OK;
+}
+
+/*
* completion_list_add_keys_codes_cb: add keys to completion list
*/
@@ -1115,6 +1141,7 @@ completion_list_add_keys_codes_cb (void *data,
struct t_gui_buffer *buffer,
struct t_gui_completion *completion)
{
+ int i;
struct t_gui_key *ptr_key;
char *expanded_name;
@@ -1122,15 +1149,18 @@ completion_list_add_keys_codes_cb (void *data,
(void) data;
(void) completion_item;
(void) buffer;
-
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
+
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
{
- expanded_name = gui_keyboard_get_expanded_name (ptr_key->key);
- gui_completion_list_add (completion,
- (expanded_name) ? expanded_name : ptr_key->key,
- 0, WEECHAT_LIST_POS_SORT);
- if (expanded_name)
- free (expanded_name);
+ for (ptr_key = gui_keys[i]; ptr_key; ptr_key = ptr_key->next_key)
+ {
+ expanded_name = gui_key_get_expanded_name (ptr_key->key);
+ gui_completion_list_add (completion,
+ (expanded_name) ? expanded_name : ptr_key->key,
+ 0, WEECHAT_LIST_POS_SORT);
+ if (expanded_name)
+ free (expanded_name);
+ }
}
return WEECHAT_RC_OK;
@@ -1148,6 +1178,7 @@ completion_list_add_keys_codes_for_reset_cb (void *data,
struct t_gui_buffer *buffer,
struct t_gui_completion *completion)
{
+ int i;
struct t_gui_key *ptr_key, *ptr_default_key;
char *expanded_name;
@@ -1155,36 +1186,39 @@ completion_list_add_keys_codes_for_reset_cb (void *data,
(void) data;
(void) completion_item;
(void) buffer;
-
- /* keys added or redefined */
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
+
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
{
- ptr_default_key = gui_keyboard_search (gui_default_keys, ptr_key->key);
- if (!ptr_default_key
- || (strcmp (ptr_default_key->command, ptr_key->command) != 0))
+ /* keys added or redefined */
+ for (ptr_key = gui_keys[i]; ptr_key; ptr_key = ptr_key->next_key)
{
- expanded_name = gui_keyboard_get_expanded_name (ptr_key->key);
- gui_completion_list_add (completion,
- (expanded_name) ? expanded_name : ptr_key->key,
- 0, WEECHAT_LIST_POS_SORT);
- if (expanded_name)
- free (expanded_name);
+ ptr_default_key = gui_key_search (gui_default_keys[i], ptr_key->key);
+ if (!ptr_default_key
+ || (strcmp (ptr_default_key->command, ptr_key->command) != 0))
+ {
+ expanded_name = gui_key_get_expanded_name (ptr_key->key);
+ gui_completion_list_add (completion,
+ (expanded_name) ? expanded_name : ptr_key->key,
+ 0, WEECHAT_LIST_POS_SORT);
+ if (expanded_name)
+ free (expanded_name);
+ }
}
- }
-
- /* keys deleted */
- for (ptr_default_key = gui_default_keys; ptr_default_key;
- ptr_default_key = ptr_default_key->next_key)
- {
- ptr_key = gui_keyboard_search (gui_keys, ptr_default_key->key);
- if (!ptr_key)
+
+ /* keys deleted */
+ for (ptr_default_key = gui_default_keys[i]; ptr_default_key;
+ ptr_default_key = ptr_default_key->next_key)
{
- expanded_name = gui_keyboard_get_expanded_name (ptr_default_key->key);
- gui_completion_list_add (completion,
- (expanded_name) ? expanded_name : ptr_default_key->key,
- 0, WEECHAT_LIST_POS_SORT);
- if (expanded_name)
- free (expanded_name);
+ ptr_key = gui_key_search (gui_keys[i], ptr_default_key->key);
+ if (!ptr_key)
+ {
+ expanded_name = gui_key_get_expanded_name (ptr_default_key->key);
+ gui_completion_list_add (completion,
+ (expanded_name) ? expanded_name : ptr_default_key->key,
+ 0, WEECHAT_LIST_POS_SORT);
+ if (expanded_name)
+ free (expanded_name);
+ }
}
}
@@ -1264,10 +1298,16 @@ completion_init ()
hook_completion (NULL, "bars_options",
N_("options for bars"),
&completion_list_add_bars_options_cb, NULL);
+ hook_completion (NULL, "keys_contexts",
+ /* TRANSLATORS: "key" means "key on the keyboard" */
+ N_("key contexts"),
+ &completion_list_add_keys_contexts_cb, NULL);
hook_completion (NULL, "keys_codes",
+ /* TRANSLATORS: "key" means "key on the keyboard" */
N_("key codes"),
&completion_list_add_keys_codes_cb, NULL);
hook_completion (NULL, "keys_codes_for_reset",
+ /* TRANSLATORS: "key" means "key on the keyboard" */
N_("key codes that can be reset (keys added, redefined "
"or removed)"),
&completion_list_add_keys_codes_for_reset_cb, NULL);
diff --git a/src/core/wee-config.c b/src/core/wee-config.c
index 94f0af776..da8de105b 100644
--- a/src/core/wee-config.c
+++ b/src/core/wee-config.c
@@ -52,7 +52,7 @@
#include "../gui/gui-color.h"
#include "../gui/gui-filter.h"
#include "../gui/gui-hotlist.h"
-#include "../gui/gui-keyboard.h"
+#include "../gui/gui-key.h"
#include "../gui/gui-layout.h"
#include "../gui/gui-line.h"
#include "../gui/gui-main.h"
@@ -581,6 +581,8 @@ config_day_change_timer_cb (void *data, int remaining_calls)
void
config_weechat_init_after_read ()
{
+ int i;
+
gui_buffer_notify_set_all ();
proxy_use_temp_proxies ();
@@ -601,8 +603,11 @@ config_weechat_init_after_read ()
}
/* if no key was found config file, then we use default bindings */
- if (!gui_keys)
- gui_keyboard_default_bindings ();
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ if (!gui_keys[i])
+ gui_key_default_bindings (i);
+ }
}
/*
@@ -616,13 +621,17 @@ config_weechat_init_after_read ()
int
config_weechat_reload_cb (void *data, struct t_config_file *config_file)
{
- int rc;
+ int i, rc;
/* make C compiler happy */
(void) data;
/* remove all keys */
- gui_keyboard_free_all (&gui_keys, &last_gui_key, &gui_keys_count);
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ gui_key_free_all (&gui_keys[i], &last_gui_key[i],
+ &gui_keys_count[i]);
+ }
/* remove all proxies */
proxy_free_all ();
@@ -1425,22 +1434,33 @@ config_weechat_key_read_cb (void *data, struct t_config_file *config_file,
struct t_config_section *section,
const char *option_name, const char *value)
{
+ int context;
+ char *pos;
+
/* make C compiler happy */
(void) data;
(void) config_file;
- (void) section;
if (option_name)
{
+ context = GUI_KEY_CONTEXT_DEFAULT;
+ pos = strchr (section->name, '_');
+ if (pos)
+ {
+ context = gui_key_search_context (pos + 1);
+ if (context < 0)
+ context = GUI_KEY_CONTEXT_DEFAULT;
+ }
+
if (value && value[0])
{
/* bind key (overwrite any binding with same key) */
- gui_keyboard_bind (NULL, option_name, value);
+ gui_key_bind (NULL, context, option_name, value);
}
else
{
/* unbind key if no value given */
- gui_keyboard_unbind (NULL, option_name, 1);
+ gui_key_unbind (NULL, context, option_name, 1);
}
}
@@ -1456,18 +1476,26 @@ config_weechat_key_write_cb (void *data, struct t_config_file *config_file,
const char *section_name)
{
struct t_gui_key *ptr_key;
- char *expanded_name;
- int rc;
+ char *pos, *expanded_name;
+ int rc, context;
/* make C compiler happy */
(void) data;
if (!config_file_write_line (config_file, section_name, NULL))
return WEECHAT_CONFIG_WRITE_ERROR;
-
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
+
+ context = GUI_KEY_CONTEXT_DEFAULT;
+ pos = strchr (section_name, '_');
+ if (pos)
+ {
+ context = gui_key_search_context (pos + 1);
+ if (context < 0)
+ context = GUI_KEY_CONTEXT_DEFAULT;
+ }
+ for (ptr_key = gui_keys[context]; ptr_key; ptr_key = ptr_key->next_key)
{
- expanded_name = gui_keyboard_get_expanded_name (ptr_key->key);
+ expanded_name = gui_key_get_expanded_name (ptr_key->key);
if (expanded_name)
{
rc = config_file_write_line (config_file,
@@ -1493,6 +1521,8 @@ int
config_weechat_init_options ()
{
struct t_config_section *ptr_section;
+ int i;
+ char section_name[128];
weechat_config_file = config_file_new (NULL, WEECHAT_CONFIG_NAME,
&config_weechat_reload_cb, NULL);
@@ -2507,16 +2537,23 @@ config_weechat_init_options ()
}
/* keys */
- ptr_section = config_file_new_section (weechat_config_file, "key",
- 0, 0,
- &config_weechat_key_read_cb, NULL,
- &config_weechat_key_write_cb, NULL,
- &config_weechat_key_write_cb, NULL,
- NULL, NULL, NULL, NULL);
- if (!ptr_section)
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
{
- config_file_free (weechat_config_file);
- return 0;
+ snprintf (section_name, sizeof (section_name),
+ "key%s%s",
+ (i == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
+ (i == GUI_KEY_CONTEXT_DEFAULT) ? "" : gui_key_context_string[i]);
+ ptr_section = config_file_new_section (weechat_config_file, section_name,
+ 0, 0,
+ &config_weechat_key_read_cb, NULL,
+ &config_weechat_key_write_cb, NULL,
+ &config_weechat_key_write_cb, NULL,
+ NULL, NULL, NULL, NULL);
+ if (!ptr_section)
+ {
+ config_file_free (weechat_config_file);
+ return 0;
+ }
}
return 1;
diff --git a/src/core/wee-debug.c b/src/core/wee-debug.c
index b79c4c43d..14eabec89 100644
--- a/src/core/wee-debug.c
+++ b/src/core/wee-debug.c
@@ -49,7 +49,7 @@
#include "../gui/gui-chat.h"
#include "../gui/gui-filter.h"
#include "../gui/gui-hotlist.h"
-#include "../gui/gui-keyboard.h"
+#include "../gui/gui-key.h"
#include "../gui/gui-layout.h"
#include "../gui/gui-main.h"
#include "../gui/gui-window.h"
@@ -92,7 +92,7 @@ debug_dump (int crash)
gui_window_print_log ();
gui_buffer_print_log ();
gui_layout_print_log ();
- gui_keyboard_print_log (NULL);
+ gui_key_print_log (NULL);
gui_filter_print_log ();
gui_bar_print_log ();
gui_bar_item_print_log ();
diff --git a/src/core/weechat.c b/src/core/weechat.c
index 26fe4f6d9..aebfda775 100644
--- a/src/core/weechat.c
+++ b/src/core/weechat.c
@@ -72,7 +72,7 @@
#include "../gui/gui-completion.h"
#include "../gui/gui-layout.h"
#include "../gui/gui-main.h"
-#include "../gui/gui-keyboard.h"
+#include "../gui/gui-key.h"
#include "../plugins/plugin.h"
@@ -164,22 +164,28 @@ weechat_display_keys ()
{
struct t_gui_key *ptr_key;
char *expanded_name;
-
- gui_keyboard_default_bindings ();
- string_iconv_fprintf (stdout,
- /* TRANSLATORS: "%s" is "weechat" */
- _("%s default keys:\n"),
- PACKAGE_NAME);
- string_iconv_fprintf (stdout, "\n");
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
+ int i;
+
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
{
- expanded_name = gui_keyboard_get_expanded_name (ptr_key->key);
+ gui_key_default_bindings (i);
string_iconv_fprintf (stdout,
- "* %s => %s\n",
- (expanded_name) ? expanded_name : ptr_key->key,
- ptr_key->command);
- if (expanded_name)
- free (expanded_name);
+ /* TRANSLATORS: first "%s" is "weechat" */
+ _("%s default keys (context: \"%s\"):\n"),
+ (gui_key_context_string[i] && gui_key_context_string[i][0]) ?
+ _(gui_key_context_string[i]) : "",
+ PACKAGE_NAME);
+ string_iconv_fprintf (stdout, "\n");
+ for (ptr_key = gui_keys[i]; ptr_key; ptr_key = ptr_key->next_key)
+ {
+ expanded_name = gui_key_get_expanded_name (ptr_key->key);
+ string_iconv_fprintf (stdout,
+ "* %s => %s\n",
+ (expanded_name) ? expanded_name : ptr_key->key,
+ ptr_key->command);
+ if (expanded_name)
+ free (expanded_name);
+ }
}
}
@@ -418,7 +424,7 @@ main (int argc, char *argv[])
gui_main_pre_init (&argc, &argv); /* pre-initiliaze interface */
command_init (); /* initialize WeeChat commands */
completion_init (); /* add core completion hooks */
- gui_keyboard_init (); /* init keyboard */
+ gui_key_init (); /* init keys */
if (!config_weechat_init ()) /* init options with default values */
exit (EXIT_FAILURE);
weechat_parse_args (argc, argv); /* parse command line args */
@@ -451,7 +457,7 @@ main (int argc, char *argv[])
gui_main_end (1); /* shut down WeeChat GUI */
proxy_free_all (); /* free all proxies */
config_file_free_all (); /* free all configuration files */
- gui_keyboard_end (); /* end keyboard */
+ gui_key_end (); /* remove all keys */
unhook_all (); /* remove all hooks */
hdata_end (); /* end hdata */
weechat_shutdown (EXIT_SUCCESS, 0); /* quit WeeChat (oh no, why?) */
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index 1096280ec..ebbfcac48 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -29,7 +29,7 @@ gui-completion.c gui-completion.h
gui-history.c gui-history.h
gui-hotlist.c gui-hotlist.h
gui-input.c gui-input.h
-gui-keyboard.c gui-keyboard.h
+gui-key.c gui-key.h
gui-layout.c gui-layout.h
gui-line.c gui-line.h
gui-main.h
diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index 797a284c0..443bc9968 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -43,8 +43,8 @@ lib_weechat_gui_common_a_SOURCES = gui-bar.c \
gui-hotlist.h \
gui-input.c \
gui-input.h \
- gui-keyboard.c \
- gui-keyboard.h \
+ gui-key.c \
+ gui-key.h \
gui-layout.c \
gui-layout.h \
gui-line.c \
diff --git a/src/gui/curses/CMakeLists.txt b/src/gui/curses/CMakeLists.txt
index 3f4cd0a5e..85007323a 100644
--- a/src/gui/curses/CMakeLists.txt
+++ b/src/gui/curses/CMakeLists.txt
@@ -28,7 +28,7 @@ gui-curses.h
gui-curses-bar-window.c
gui-curses-chat.c
gui-curses-color.c
-gui-curses-keyboard.c
+gui-curses-key.c
gui-curses-main.c
gui-curses-term.c
gui-curses-window.c)
diff --git a/src/gui/curses/Makefile.am b/src/gui/curses/Makefile.am
index 284f21fc7..61ac1f2ec 100644
--- a/src/gui/curses/Makefile.am
+++ b/src/gui/curses/Makefile.am
@@ -35,7 +35,7 @@ weechat_curses_LDADD = ./../../core/lib_weechat_core.a \
weechat_curses_SOURCES = gui-curses-bar-window.c \
gui-curses-chat.c \
gui-curses-color.c \
- gui-curses-keyboard.c \
+ gui-curses-key.c \
gui-curses-main.c \
gui-curses-term.c \
gui-curses-window.c \
diff --git a/src/gui/curses/gui-curses-key.c b/src/gui/curses/gui-curses-key.c
new file mode 100644
index 000000000..731a66ee5
--- /dev/null
+++ b/src/gui/curses/gui-curses-key.c
@@ -0,0 +1,508 @@
+/*
+ * Copyright (C) 2003-2011 Sebastien Helleu <flashcode@flashtux.org>
+ *
+ * This file is part of WeeChat, the extensible chat client.
+ *
+ * WeeChat 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * gui-curses-key.c: keyboard functions for Curses GUI
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "../../core/weechat.h"
+#include "../../core/wee-config.h"
+#include "../../core/wee-hook.h"
+#include "../../core/wee-log.h"
+#include "../../core/wee-utf8.h"
+#include "../../core/wee-string.h"
+#include "../../plugins/plugin.h"
+#include "../gui-key.h"
+#include "../gui-buffer.h"
+#include "../gui-color.h"
+#include "../gui-input.h"
+#include "../gui-completion.h"
+#include "../gui-window.h"
+#include "gui-curses.h"
+
+#define BIND(key, command) gui_key_default_bind(context, key, command)
+
+
+/*
+ * gui_key_default_bind: create key bind, only if it does not exist yet
+ */
+
+void
+gui_key_default_bind (int context, const char *key, const char *command)
+{
+ struct t_gui_key *ptr_key;
+ char *internal_code;
+
+ internal_code = gui_key_get_internal_code (key);
+
+ ptr_key = gui_key_search (gui_keys[context],
+ (internal_code) ? internal_code : key);
+ if (!ptr_key)
+ gui_key_new (NULL, context, key, command);
+
+ if (internal_code)
+ free (internal_code);
+}
+
+/*
+ * gui_key_default_bindings: create default key bindings for context given
+ */
+
+void
+gui_key_default_bindings (int context)
+{
+ int i;
+ char key_str[32], command[32];
+
+ switch (context)
+ {
+ case GUI_KEY_CONTEXT_DEFAULT:
+ BIND(/* RC */ "ctrl-M", "/input return");
+ BIND(/* RC */ "ctrl-J", "/input return");
+ BIND(/* tab */ "ctrl-I", "/input complete_next");
+ BIND(/* s-tab */ "meta2-Z", "/input complete_previous");
+ BIND(/* ^R */ "ctrl-R", "/input search_text");
+ BIND(/* basckpace */ "ctrl-H", "/input delete_previous_char");
+ BIND(/* basckpace */ "ctrl-?", "/input delete_previous_char");
+ BIND(/* ^_ */ "ctrl-_", "/input undo");
+ BIND(/* m-_ */ "meta-_", "/input redo");
+ BIND(/* del */ "meta2-3~", "/input delete_next_char");
+ BIND(/* ^D */ "ctrl-D", "/input delete_next_char");
+ BIND(/* ^W */ "ctrl-W", "/input delete_previous_word");
+ BIND(/* ^X */ "ctrl-X", "/input switch_active_buffer");
+ BIND(/* m-d */ "meta-d", "/input delete_next_word");
+ BIND(/* ^K */ "ctrl-K", "/input delete_end_of_line");
+ BIND(/* m-r */ "meta-r", "/input delete_line");
+ BIND(/* ^T */ "ctrl-T", "/input transpose_chars");
+ BIND(/* ^U */ "ctrl-U", "/input delete_beginning_of_line");
+ BIND(/* ^Y */ "ctrl-Y", "/input clipboard_paste");
+ BIND(/* home */ "meta2-1~", "/input move_beginning_of_line");
+ BIND(/* home */ "meta2-H", "/input move_beginning_of_line");
+ BIND(/* home */ "meta2-7~", "/input move_beginning_of_line");
+ BIND(/* home */ "meta-OH", "/input move_beginning_of_line");
+ BIND(/* ^A */ "ctrl-A", "/input move_beginning_of_line");
+ BIND(/* end */ "meta2-4~", "/input move_end_of_line");
+ BIND(/* end */ "meta2-F", "/input move_end_of_line");
+ BIND(/* end */ "meta2-8~", "/input move_end_of_line");
+ BIND(/* end */ "meta-OF", "/input move_end_of_line");
+ BIND(/* ^E */ "ctrl-E", "/input move_end_of_line");
+ BIND(/* left */ "meta2-D", "/input move_previous_char");
+ BIND(/* ^B */ "ctrl-B", "/input move_previous_char");
+ BIND(/* right */ "meta2-C", "/input move_next_char");
+ BIND(/* ^F */ "ctrl-F", "/input move_next_char");
+ BIND(/* m-b */ "meta-b", "/input move_previous_word");
+ BIND(/* ^left */ "meta-Od", "/input move_previous_word");
+ BIND(/* ^left */ "meta-OD", "/input move_previous_word");
+ BIND(/* m-f */ "meta-f", "/input move_next_word");
+ BIND(/* ^right */ "meta-Oc", "/input move_next_word");
+ BIND(/* ^right */ "meta-OC", "/input move_next_word");
+ BIND(/* up */ "meta2-A", "/input history_previous");
+ BIND(/* down */ "meta2-B", "/input history_next");
+ BIND(/* ^up */ "meta-Oa", "/input history_global_previous");
+ BIND(/* ^up */ "meta-OA", "/input history_global_previous");
+ BIND(/* ^up */ "meta2-1;5A", "/input history_global_previous");
+ BIND(/* ^down */ "meta-Ob", "/input history_global_next");
+ BIND(/* ^down */ "meta-OB", "/input history_global_next");
+ BIND(/* ^down */ "meta2-1;5B", "/input history_global_next");
+ BIND(/* m-a */ "meta-a", "/input jump_smart");
+ BIND(/* m-j,m-l */ "meta-jmeta-l", "/input jump_last_buffer");
+ BIND(/* m-j,m-r */ "meta-jmeta-r", "/server raw");
+ BIND(/* m-j,m-s */ "meta-jmeta-s", "/server jump");
+ BIND(/* m-h */ "meta-h", "/input hotlist_clear");
+ BIND(/* m-k */ "meta-k", "/input grab_key_command");
+ BIND(/* m-u */ "meta-u", "/input scroll_unread");
+ BIND(/* ^S^U */ "ctrl-Sctrl-U", "/input set_unread");
+ BIND(/* ^Cb */ "ctrl-Cb", "/input insert \\x02");
+ BIND(/* ^Cc */ "ctrl-Cc", "/input insert \\x03");
+ BIND(/* ^Ci */ "ctrl-Ci", "/input insert \\x1D");
+ BIND(/* ^Co */ "ctrl-Co", "/input insert \\x0F");
+ BIND(/* ^Cr */ "ctrl-Cr", "/input insert \\x12");
+ BIND(/* ^Cu */ "ctrl-Cu", "/input insert \\x15");
+ BIND(/* m-right */ "meta-meta2-C", "/buffer +1");
+ BIND(/* m-right */ "meta2-1;3C", "/buffer +1");
+ BIND(/* m-down */ "meta-meta2-B", "/buffer +1");
+ BIND(/* m-down */ "meta2-1;3B", "/buffer +1");
+ BIND(/* F6 */ "meta2-17~", "/buffer +1");
+ BIND(/* ^N */ "ctrl-N", "/buffer +1");
+ BIND(/* m-left */ "meta-meta2-D", "/buffer -1");
+ BIND(/* m-left */ "meta2-1;3D", "/buffer -1");
+ BIND(/* m-up */ "meta-meta2-A", "/buffer -1");
+ BIND(/* m-up */ "meta2-1;3A", "/buffer -1");
+ BIND(/* F5 */ "meta2-15~", "/buffer -1");
+ BIND(/* ^P */ "ctrl-P", "/buffer -1");
+ BIND(/* pgup */ "meta2-5~", "/window page_up");
+ BIND(/* pgup */ "meta2-I", "/window page_up");
+ BIND(/* pgdn */ "meta2-6~", "/window page_down");
+ BIND(/* pgdn */ "meta2-G", "/window page_down");
+ BIND(/* m-pgup */ "meta-meta2-5~", "/window scroll_up");
+ BIND(/* m-pgup */ "meta2-5;3~", "/window scroll_up");
+ BIND(/* m-pgdn */ "meta-meta2-6~", "/window scroll_down");
+ BIND(/* m-pgdn */ "meta2-6;3~", "/window scroll_down");
+ BIND(/* m-home */ "meta-meta2-1~", "/window scroll_top");
+ BIND(/* m-home */ "meta-meta2-7~", "/window scroll_top");
+ BIND(/* m-end */ "meta-meta2-4~", "/window scroll_bottom");
+ BIND(/* m-end */ "meta-meta2-8~", "/window scroll_bottom");
+ BIND(/* m-n */ "meta-n", "/window scroll_next_highlight");
+ BIND(/* m-p */ "meta-p", "/window scroll_previous_highlight");
+ BIND(/* F9 */ "meta2-20~", "/bar scroll title * x-50%");
+ BIND(/* F10 */ "meta2-21~", "/bar scroll title * x+50%");
+ BIND(/* F11 */ "meta2-23~", "/bar scroll nicklist * y-100%");
+ BIND(/* F12 */ "meta2-24~", "/bar scroll nicklist * y+100%");
+ BIND(/* m-F11 */ "meta-meta2-23~", "/bar scroll nicklist * yb");
+ BIND(/* m-F12 */ "meta-meta2-24~", "/bar scroll nicklist * ye");
+ BIND(/* ^L */ "ctrl-L", "/window refresh");
+ BIND(/* F7 */ "meta2-18~", "/window -1");
+ BIND(/* F8 */ "meta2-19~", "/window +1");
+ BIND(/* m-w,m-up */ "meta-wmeta-meta2-A", "/window up");
+ BIND(/* m-w,m-up */ "meta-wmeta2-1;3A", "/window up");
+ BIND(/* m-w,m-down */ "meta-wmeta-meta2-B", "/window down");
+ BIND(/* m-w,m-down */ "meta-wmeta2-1;3B", "/window down");
+ BIND(/* m-w,m-right */ "meta-wmeta-meta2-C", "/window right");
+ BIND(/* m-w,m-right */ "meta-wmeta2-1;3C", "/window right");
+ BIND(/* m-w,m-left */ "meta-wmeta-meta2-D", "/window left");
+ BIND(/* m-w,m-left */ "meta-wmeta2-1;3D", "/window left");
+ BIND(/* m-w,m-b */ "meta-wmeta-b", "/window balance");
+ BIND(/* m-w,m-s */ "meta-wmeta-s", "/window swap");
+ BIND(/* m-z */ "meta-z", "/window zoom");
+ BIND(/* m-= */ "meta-=", "/filter toggle");
+ BIND(/* m-0 */ "meta-0", "/buffer *10");
+ BIND(/* m-1 */ "meta-1", "/buffer *1");
+ BIND(/* m-2 */ "meta-2", "/buffer *2");
+ BIND(/* m-3 */ "meta-3", "/buffer *3");
+ BIND(/* m-4 */ "meta-4", "/buffer *4");
+ BIND(/* m-5 */ "meta-5", "/buffer *5");
+ BIND(/* m-6 */ "meta-6", "/buffer *6");
+ BIND(/* m-7 */ "meta-7", "/buffer *7");
+ BIND(/* m-8 */ "meta-8", "/buffer *8");
+ BIND(/* m-9 */ "meta-9", "/buffer *9");
+ BIND(/* m-< */ "meta-<", "/input jump_previously_visited_buffer");
+ BIND(/* m-> */ "meta->", "/input jump_next_visited_buffer");
+
+ /* 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);
+ BIND(key_str, command);
+ }
+ break;
+ case GUI_KEY_CONTEXT_SEARCH:
+ BIND(/* RC */ "ctrl-M", "/input search_stop");
+ BIND(/* RC */ "ctrl-J", "/input search_stop");
+ BIND(/* ^R */ "ctrl-R", "/input search_switch_case");
+ BIND(/* up */ "meta2-A", "/input search_previous");
+ BIND(/* down */ "meta2-B", "/input search_next");
+ break;
+ }
+}
+
+/*
+ * gui_key_flush: flush keyboard buffer
+ */
+
+void
+gui_key_flush ()
+{
+ int i, key, insert_ok;
+ char key_str[32], *key_utf, *input_old;
+
+ /*
+ * if there's no paste pending, then we use buffer and do actions
+ * according to keys
+ */
+ if (!gui_key_paste_pending)
+ {
+ if (gui_key_buffer_size > 0)
+ gui_key_last_activity_time = time (NULL);
+
+ for (i = 0; i < gui_key_buffer_size; i++)
+ {
+ key = gui_key_buffer[i];
+
+ insert_ok = 1;
+
+ if (key < 32)
+ {
+ insert_ok = 0;
+ 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 (local_utf8)
+ {
+ /* 1 char: 0vvvvvvv */
+ if (key < 0x80)
+ {
+ key_str[0] = (char) key;
+ key_str[1] = '\0';
+ }
+ /* 2 chars: 110vvvvv 10vvvvvv */
+ else if ((key & 0xE0) == 0xC0)
+ {
+ key_str[0] = (char) key;
+ if (i < gui_key_buffer_size - 1)
+ {
+ key_str[1] = (char) (gui_key_buffer[++i]);
+ key_str[2] = '\0';
+ }
+ else
+ key_str[1] = '\0';
+ }
+ /* 3 chars: 1110vvvv 10vvvvvv 10vvvvvv */
+ else if ((key & 0xF0) == 0xE0)
+ {
+ key_str[0] = (char) key;
+ if (i < gui_key_buffer_size - 1)
+ {
+ key_str[1] = (char) (gui_key_buffer[++i]);
+ if (i < gui_key_buffer_size - 1)
+ {
+ key_str[2] = (char) (gui_key_buffer[++i]);
+ key_str[3] = '\0';
+ }
+ else
+ key_str[2] = '\0';
+ }
+ else
+ key_str[1] = '\0';
+ }
+ /* 4 chars: 11110vvv 10vvvvvv 10vvvvvv 10vvvvvv */
+ else if ((key & 0xF8) == 0xF0)
+ {
+ key_str[0] = (char) key;
+ if (i < gui_key_buffer_size - 1)
+ {
+ key_str[1] = (char) (gui_key_buffer[++i]);
+ if (i < gui_key_buffer_size - 1)
+ {
+ key_str[2] = (char) (gui_key_buffer[++i]);
+ if (i < gui_key_buffer_size - 1)
+ {
+ key_str[3] = (char) (gui_key_buffer[++i]);
+ key_str[4] = '\0';
+ }
+ else
+ key_str[3] = '\0';
+ }
+ else
+ key_str[2] = '\0';
+ }
+ else
+ key_str[1] = '\0';
+ }
+ }
+ else
+ {
+ key_str[0] = (char) key;
+ key_str[1] = '\0';
+
+ /* convert input to UTF-8 is user is not using UTF-8 as locale */
+ if (!local_utf8)
+ {
+ key_utf = string_iconv_to_internal (NULL, key_str);
+ strncpy (key_str, key_utf, sizeof (key_str));
+ key_str[sizeof (key_str) - 1] = '\0';
+ }
+ }
+ }
+
+ if (strcmp (key_str, "^") == 0)
+ {
+ key_str[1] = '^';
+ key_str[2] = '\0';
+ }
+
+ hook_signal_send ("key_pressed",
+ WEECHAT_HOOK_SIGNAL_STRING, key_str);
+
+ if (gui_current_window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
+ input_old = (gui_current_window->buffer->input_buffer) ?
+ strdup (gui_current_window->buffer->input_buffer) : strdup ("");
+ else
+ input_old = NULL;
+
+ if ((gui_key_pressed (key_str) != 0) && (insert_ok))
+ {
+ if (strcmp (key_str, "^^") == 0)
+ key_str[1] = '\0';
+
+ gui_buffer_undo_snap (gui_current_window->buffer);
+ gui_input_insert_string (gui_current_window->buffer,
+ key_str, -1);
+ if (gui_current_window->buffer->completion)
+ gui_completion_stop (gui_current_window->buffer->completion, 0);
+ gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 1);
+ }
+
+ /* incremental text search in buffer */
+ if ((gui_current_window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
+ && ((input_old == NULL)
+ || (gui_current_window->buffer->input_buffer == NULL)
+ || (strcmp (input_old, gui_current_window->buffer->input_buffer) != 0)))
+ {
+ /*
+ * if current input is longer than old input, and that
+ * beginning of current input is exactly equal to old input,
+ * then do nothing (search will not find any result and can
+ * take some time on buffer with many lines..)
+ */
+ if (!gui_current_window->buffer->text_search_found
+ && (input_old != NULL)
+ && (input_old[0])
+ && (gui_current_window->buffer->input_buffer != NULL)
+ && (gui_current_window->buffer->input_buffer[0])
+ && (strlen (gui_current_window->buffer->input_buffer) > strlen (input_old))
+ && (strncmp (gui_current_window->buffer->input_buffer, input_old,
+ strlen (input_old)) == 0))
+ {
+ /*
+ * do not search text in buffer, just alert about text not
+ * found
+ */
+ if (CONFIG_BOOLEAN(config_look_search_text_not_found_alert))
+ printf ("\a");
+ }
+ else
+ {
+ gui_window_search_restart (gui_current_window);
+ }
+ }
+
+ if (input_old)
+ free (input_old);
+ }
+
+ if (gui_key_grab && (gui_key_grab_count > 0))
+ gui_key_grab_end ();
+
+ gui_key_buffer_reset ();
+ }
+}
+
+/*
+ * gui_key_read_cb: read keyboard chars
+ */
+
+int
+gui_key_read_cb (void *data, int fd)
+{
+ int ret, i, accept_paste, cancel_paste, text_added_to_buffer, paste_lines;
+ unsigned char buffer[4096];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) fd;
+
+ accept_paste = 0;
+ cancel_paste = 0;
+ text_added_to_buffer = 0;
+
+ if (gui_key_paste_pending)
+ {
+ ret = read (STDIN_FILENO, buffer, 1);
+ if (ret == 0)
+ {
+ /* no data on stdin, terminal lost */
+ log_printf (_("Terminal lost, exiting WeeChat..."));
+ hook_signal_send ("quit", WEECHAT_HOOK_SIGNAL_STRING, NULL);
+ weechat_quit = 1;
+ return WEECHAT_RC_OK;
+ }
+ if (ret <= 0)
+ return WEECHAT_RC_OK;
+
+ /* ctrl-Y: accept paste */
+ if (buffer[0] == 25)
+ accept_paste = 1;
+
+ /* ctrl-N: cancel paste */
+ if (buffer[0] == 14)
+ cancel_paste = 1;
+ }
+ else
+ {
+ ret = read (STDIN_FILENO, buffer, sizeof (buffer));
+ if (ret == 0)
+ {
+ /* no data on stdin, terminal lost */
+ log_printf (_("Terminal lost, exiting WeeChat..."));
+ hook_signal_send ("quit", WEECHAT_HOOK_SIGNAL_STRING, NULL);
+ weechat_quit = 1;
+ return WEECHAT_RC_OK;
+ }
+ if (ret < 0)
+ return WEECHAT_RC_OK;
+
+ for (i = 0; i < ret; i++)
+ {
+ gui_key_buffer_add (buffer[i]);
+ }
+
+ text_added_to_buffer = 1;
+ }
+
+ if (gui_key_paste_pending)
+ {
+ /* user is ok for pasting text, let's paste! */
+ if (accept_paste)
+ gui_key_paste_accept ();
+ /* user doesn't want to paste text: clear whole buffer! */
+ else if (cancel_paste)
+ gui_key_paste_cancel ();
+ else if (text_added_to_buffer)
+ gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 0);
+ }
+ else
+ {
+ /*
+ * detect user paste or large amount of text
+ * if so, ask user what to do
+ */
+ if (CONFIG_INTEGER(config_look_paste_max_lines) > 0)
+ {
+ paste_lines = gui_key_get_paste_lines ();
+ if (paste_lines > CONFIG_INTEGER(config_look_paste_max_lines))
+ {
+ gui_key_paste_pending = 1;
+ gui_input_paste_pending_signal ();
+ }
+ }
+ }
+
+ gui_key_flush ();
+
+ return WEECHAT_RC_OK;
+}
diff --git a/src/gui/curses/gui-curses-keyboard.c b/src/gui/curses/gui-curses-keyboard.c
deleted file mode 100644
index 8331bf4c2..000000000
--- a/src/gui/curses/gui-curses-keyboard.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright (C) 2003-2011 Sebastien Helleu <flashcode@flashtux.org>
- *
- * This file is part of WeeChat, the extensible chat client.
- *
- * WeeChat 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 3 of the License, or
- * (at your option) any later version.
- *
- * WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * gui-curses-keyboard.c: keyboard functions for Curses GUI
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "../../core/weechat.h"
-#include "../../core/wee-config.h"
-#include "../../core/wee-hook.h"
-#include "../../core/wee-log.h"
-#include "../../core/wee-utf8.h"
-#include "../../core/wee-string.h"
-#include "../../plugins/plugin.h"
-#include "../gui-keyboard.h"
-#include "../gui-buffer.h"
-#include "../gui-color.h"
-#include "../gui-input.h"
-#include "../gui-completion.h"
-#include "../gui-window.h"
-#include "gui-curses.h"
-
-#define BIND(key, command) gui_keyboard_default_bind(key, command)
-
-
-/*
- * gui_keyboard_default_bind: create key bind, only if it does not exist yet
- */
-
-void
-gui_keyboard_default_bind (const char *key, const char *command)
-{
- struct t_gui_key *ptr_key;
- char *internal_code;
-
- internal_code = gui_keyboard_get_internal_code (key);
-
- ptr_key = gui_keyboard_search (gui_keys,
- (internal_code) ? internal_code : key);
- if (!ptr_key)
- {
- gui_keyboard_new (NULL, key, command);
- }
-
- if (internal_code)
- free (internal_code);
-}
-
-/*
- * gui_keyboard_default_bindings: create default key bindings
- */
-
-void
-gui_keyboard_default_bindings ()
-{
- int i;
- char key_str[32], command[32];
-
- BIND(/* RC */ "ctrl-M", "/input return");
- BIND(/* RC */ "ctrl-J", "/input return");
- BIND(/* tab */ "ctrl-I", "/input complete_next");
- BIND(/* s-tab */ "meta2-Z", "/input complete_previous");
- BIND(/* ^R */ "ctrl-R", "/input search_text");
- BIND(/* basckpace */ "ctrl-H", "/input delete_previous_char");
- BIND(/* basckpace */ "ctrl-?", "/input delete_previous_char");
- BIND(/* ^_ */ "ctrl-_", "/input undo");
- BIND(/* m-_ */ "meta-_", "/input redo");
- BIND(/* del */ "meta2-3~", "/input delete_next_char");
- BIND(/* ^D */ "ctrl-D", "/input delete_next_char");
- BIND(/* ^W */ "ctrl-W", "/input delete_previous_word");
- BIND(/* ^X */ "ctrl-X", "/input switch_active_buffer");
- BIND(/* m-d */ "meta-d", "/input delete_next_word");
- BIND(/* ^K */ "ctrl-K", "/input delete_end_of_line");
- BIND(/* m-r */ "meta-r", "/input delete_line");
- BIND(/* ^T */ "ctrl-T", "/input transpose_chars");
- BIND(/* ^U */ "ctrl-U", "/input delete_beginning_of_line");
- BIND(/* ^Y */ "ctrl-Y", "/input clipboard_paste");
- BIND(/* home */ "meta2-1~", "/input move_beginning_of_line");
- BIND(/* home */ "meta2-H", "/input move_beginning_of_line");
- BIND(/* home */ "meta2-7~", "/input move_beginning_of_line");
- BIND(/* home */ "meta-OH", "/input move_beginning_of_line");
- BIND(/* ^A */ "ctrl-A", "/input move_beginning_of_line");
- BIND(/* end */ "meta2-4~", "/input move_end_of_line");
- BIND(/* end */ "meta2-F", "/input move_end_of_line");
- BIND(/* end */ "meta2-8~", "/input move_end_of_line");
- BIND(/* end */ "meta-OF", "/input move_end_of_line");
- BIND(/* ^E */ "ctrl-E", "/input move_end_of_line");
- BIND(/* left */ "meta2-D", "/input move_previous_char");
- BIND(/* ^B */ "ctrl-B", "/input move_previous_char");
- BIND(/* right */ "meta2-C", "/input move_next_char");
- BIND(/* ^F */ "ctrl-F", "/input move_next_char");
- BIND(/* m-b */ "meta-b", "/input move_previous_word");
- BIND(/* ^left */ "meta-Od", "/input move_previous_word");
- BIND(/* ^left */ "meta-OD", "/input move_previous_word");
- BIND(/* m-f */ "meta-f", "/input move_next_word");
- BIND(/* ^right */ "meta-Oc", "/input move_next_word");
- BIND(/* ^right */ "meta-OC", "/input move_next_word");
- BIND(/* up */ "meta2-A", "/input history_previous");
- BIND(/* down */ "meta2-B", "/input history_next");
- BIND(/* ^up */ "meta-Oa", "/input history_global_previous");
- BIND(/* ^up */ "meta-OA", "/input history_global_previous");
- BIND(/* ^up */ "meta2-1;5A", "/input history_global_previous");
- BIND(/* ^down */ "meta-Ob", "/input history_global_next");
- BIND(/* ^down */ "meta-OB", "/input history_global_next");
- BIND(/* ^down */ "meta2-1;5B", "/input history_global_next");
- BIND(/* m-a */ "meta-a", "/input jump_smart");
- BIND(/* m-j,m-l */ "meta-jmeta-l", "/input jump_last_buffer");
- BIND(/* m-j,m-r */ "meta-jmeta-r", "/server raw");
- BIND(/* m-j,m-s */ "meta-jmeta-s", "/server jump");
- BIND(/* m-h */ "meta-h", "/input hotlist_clear");
- BIND(/* m-k */ "meta-k", "/input grab_key_command");
- BIND(/* m-u */ "meta-u", "/input scroll_unread");
- BIND(/* ^S^U */ "ctrl-Sctrl-U", "/input set_unread");
- BIND(/* ^Cb */ "ctrl-Cb", "/input insert \\x02");
- BIND(/* ^Cc */ "ctrl-Cc", "/input insert \\x03");
- BIND(/* ^Ci */ "ctrl-Ci", "/input insert \\x1D");
- BIND(/* ^Co */ "ctrl-Co", "/input insert \\x0F");
- BIND(/* ^Cr */ "ctrl-Cr", "/input insert \\x12");
- BIND(/* ^Cu */ "ctrl-Cu", "/input insert \\x15");
- BIND(/* m-right */ "meta-meta2-C", "/buffer +1");
- BIND(/* m-right */ "meta2-1;3C", "/buffer +1");
- BIND(/* m-down */ "meta-meta2-B", "/buffer +1");
- BIND(/* m-down */ "meta2-1;3B", "/buffer +1");
- BIND(/* F6 */ "meta2-17~", "/buffer +1");
- BIND(/* ^N */ "ctrl-N", "/buffer +1");
- BIND(/* m-left */ "meta-meta2-D", "/buffer -1");
- BIND(/* m-left */ "meta2-1;3D", "/buffer -1");
- BIND(/* m-up */ "meta-meta2-A", "/buffer -1");
- BIND(/* m-up */ "meta2-1;3A", "/buffer -1");
- BIND(/* F5 */ "meta2-15~", "/buffer -1");
- BIND(/* ^P */ "ctrl-P", "/buffer -1");
- BIND(/* pgup */ "meta2-5~", "/window page_up");
- BIND(/* pgup */ "meta2-I", "/window page_up");
- BIND(/* pgdn */ "meta2-6~", "/window page_down");
- BIND(/* pgdn */ "meta2-G", "/window page_down");
- BIND(/* m-pgup */ "meta-meta2-5~", "/window scroll_up");
- BIND(/* m-pgup */ "meta2-5;3~", "/window scroll_up");
- BIND(/* m-pgdn */ "meta-meta2-6~", "/window scroll_down");
- BIND(/* m-pgdn */ "meta2-6;3~", "/window scroll_down");
- BIND(/* m-home */ "meta-meta2-1~", "/window scroll_top");
- BIND(/* m-home */ "meta-meta2-7~", "/window scroll_top");
- BIND(/* m-end */ "meta-meta2-4~", "/window scroll_bottom");
- BIND(/* m-end */ "meta-meta2-8~", "/window scroll_bottom");
- BIND(/* m-n */ "meta-n", "/window scroll_next_highlight");
- BIND(/* m-p */ "meta-p", "/window scroll_previous_highlight");
- BIND(/* F9 */ "meta2-20~", "/bar scroll title * x-50%");
- BIND(/* F10 */ "meta2-21~", "/bar scroll title * x+50%");
- BIND(/* F11 */ "meta2-23~", "/bar scroll nicklist * y-100%");
- BIND(/* F12 */ "meta2-24~", "/bar scroll nicklist * y+100%");
- BIND(/* m-F11 */ "meta-meta2-23~", "/bar scroll nicklist * yb");
- BIND(/* m-F12 */ "meta-meta2-24~", "/bar scroll nicklist * ye");
- BIND(/* ^L */ "ctrl-L", "/window refresh");
- BIND(/* F7 */ "meta2-18~", "/window -1");
- BIND(/* F8 */ "meta2-19~", "/window +1");
- BIND(/* m-w,m-up */ "meta-wmeta-meta2-A", "/window up");
- BIND(/* m-w,m-up */ "meta-wmeta2-1;3A", "/window up");
- BIND(/* m-w,m-down */ "meta-wmeta-meta2-B", "/window down");
- BIND(/* m-w,m-down */ "meta-wmeta2-1;3B", "/window down");
- BIND(/* m-w,m-right */ "meta-wmeta-meta2-C", "/window right");
- BIND(/* m-w,m-right */ "meta-wmeta2-1;3C", "/window right");
- BIND(/* m-w,m-left */ "meta-wmeta-meta2-D", "/window left");
- BIND(/* m-w,m-left */ "meta-wmeta2-1;3D", "/window left");
- BIND(/* m-w,m-b */ "meta-wmeta-b", "/window balance");
- BIND(/* m-w,m-s */ "meta-wmeta-s", "/window swap");
- BIND(/* m-z */ "meta-z", "/window zoom");
- BIND(/* m-= */ "meta-=", "/filter toggle");
- BIND(/* m-0 */ "meta-0", "/buffer *10");
- BIND(/* m-1 */ "meta-1", "/buffer *1");
- BIND(/* m-2 */ "meta-2", "/buffer *2");
- BIND(/* m-3 */ "meta-3", "/buffer *3");
- BIND(/* m-4 */ "meta-4", "/buffer *4");
- BIND(/* m-5 */ "meta-5", "/buffer *5");
- BIND(/* m-6 */ "meta-6", "/buffer *6");
- BIND(/* m-7 */ "meta-7", "/buffer *7");
- BIND(/* m-8 */ "meta-8", "/buffer *8");
- BIND(/* m-9 */ "meta-9", "/buffer *9");
- BIND(/* m-< */ "meta-<", "/input jump_previously_visited_buffer");
- BIND(/* m-> */ "meta->", "/input jump_next_visited_buffer");
-
- /* 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);
- BIND(key_str, command);
- }
-}
-
-/*
- * gui_keyboard_flush: flush keyboard buffer
- */
-
-void
-gui_keyboard_flush ()
-{
- int i, key, insert_ok;
- char key_str[32], *key_utf, *input_old;
-
- /*
- * if there's no paste pending, then we use buffer and do actions
- * according to keys
- */
- if (!gui_keyboard_paste_pending)
- {
- if (gui_keyboard_buffer_size > 0)
- gui_keyboard_last_activity_time = time (NULL);
-
- for (i = 0; i < gui_keyboard_buffer_size; i++)
- {
- key = gui_keyboard_buffer[i];
-
- insert_ok = 1;
-
- if (key < 32)
- {
- insert_ok = 0;
- 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 (local_utf8)
- {
- /* 1 char: 0vvvvvvv */
- if (key < 0x80)
- {
- key_str[0] = (char) key;
- key_str[1] = '\0';
- }
- /* 2 chars: 110vvvvv 10vvvvvv */
- else if ((key & 0xE0) == 0xC0)
- {
- key_str[0] = (char) key;
- if (i < gui_keyboard_buffer_size - 1)
- {
- key_str[1] = (char) (gui_keyboard_buffer[++i]);
- key_str[2] = '\0';
- }
- else
- key_str[1] = '\0';
- }
- /* 3 chars: 1110vvvv 10vvvvvv 10vvvvvv */
- else if ((key & 0xF0) == 0xE0)
- {
- key_str[0] = (char) key;
- if (i < gui_keyboard_buffer_size - 1)
- {
- key_str[1] = (char) (gui_keyboard_buffer[++i]);
- if (i < gui_keyboard_buffer_size - 1)
- {
- key_str[2] = (char) (gui_keyboard_buffer[++i]);
- key_str[3] = '\0';
- }
- else
- key_str[2] = '\0';
- }
- else
- key_str[1] = '\0';
- }
- /* 4 chars: 11110vvv 10vvvvvv 10vvvvvv 10vvvvvv */
- else if ((key & 0xF8) == 0xF0)
- {
- key_str[0] = (char) key;
- if (i < gui_keyboard_buffer_size - 1)
- {
- key_str[1] = (char) (gui_keyboard_buffer[++i]);
- if (i < gui_keyboard_buffer_size - 1)
- {
- key_str[2] = (char) (gui_keyboard_buffer[++i]);
- if (i < gui_keyboard_buffer_size - 1)
- {
- key_str[3] = (char) (gui_keyboard_buffer[++i]);
- key_str[4] = '\0';
- }
- else
- key_str[3] = '\0';
- }
- else
- key_str[2] = '\0';
- }
- else
- key_str[1] = '\0';
- }
- }
- else
- {
- key_str[0] = (char) key;
- key_str[1] = '\0';
-
- /* convert input to UTF-8 is user is not using UTF-8 as locale */
- if (!local_utf8)
- {
- key_utf = string_iconv_to_internal (NULL, key_str);
- strncpy (key_str, key_utf, sizeof (key_str));
- key_str[sizeof (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);*/
-
- hook_signal_send ("key_pressed",
- WEECHAT_HOOK_SIGNAL_STRING, key_str);
-
- if (gui_current_window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
- input_old = (gui_current_window->buffer->input_buffer) ?
- strdup (gui_current_window->buffer->input_buffer) : strdup ("");
- else
- input_old = NULL;
-
- if ((gui_keyboard_pressed (key_str) != 0) && (insert_ok))
- {
- if (strcmp (key_str, "^^") == 0)
- key_str[1] = '\0';
-
- gui_buffer_undo_snap (gui_current_window->buffer);
- gui_input_insert_string (gui_current_window->buffer,
- key_str, -1);
- if (gui_current_window->buffer->completion)
- gui_completion_stop (gui_current_window->buffer->completion, 0);
- gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 1);
- }
-
- /* incremental text search in buffer */
- if ((gui_current_window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
- && ((input_old == NULL)
- || (gui_current_window->buffer->input_buffer == NULL)
- || (strcmp (input_old, gui_current_window->buffer->input_buffer) != 0)))
- {
- /*
- * if current input is longer than old input, and that
- * beginning of current input is exactly equal to old input,
- * then do nothing (search will not find any result and can
- * take some time on buffer with many lines..)
- */
- if (!gui_current_window->buffer->text_search_found
- && (input_old != NULL)
- && (input_old[0])
- && (gui_current_window->buffer->input_buffer != NULL)
- && (gui_current_window->buffer->input_buffer[0])
- && (strlen (gui_current_window->buffer->input_buffer) > strlen (input_old))
- && (strncmp (gui_current_window->buffer->input_buffer, input_old,
- strlen (input_old)) == 0))
- {
- /*
- * do not search text in buffer, just alert about text not
- * found
- */
- if (CONFIG_BOOLEAN(config_look_search_text_not_found_alert))
- printf ("\a");
- }
- else
- {
- gui_window_search_restart (gui_current_window);
- }
- }
-
- if (input_old)
- free (input_old);
- }
-
- if (gui_key_grab && (gui_key_grab_count > 0))
- gui_keyboard_grab_end ();
-
- gui_keyboard_buffer_reset ();
- }
-}
-
-/*
- * gui_keyboard_read_cb: read keyboard chars
- */
-
-int
-gui_keyboard_read_cb (void *data, int fd)
-{
- int ret, i, accept_paste, cancel_paste, text_added_to_buffer, paste_lines;
- unsigned char buffer[4096];
-
- /* make C compiler happy */
- (void) data;
- (void) fd;
-
- accept_paste = 0;
- cancel_paste = 0;
- text_added_to_buffer = 0;
-
- if (gui_keyboard_paste_pending)
- {
- ret = read (STDIN_FILENO, buffer, 1);
- if (ret == 0)
- {
- /* no data on stdin, terminal lost */
- log_printf (_("Terminal lost, exiting WeeChat..."));
- hook_signal_send ("quit", WEECHAT_HOOK_SIGNAL_STRING, NULL);
- weechat_quit = 1;
- return WEECHAT_RC_OK;
- }
- if (ret <= 0)
- return WEECHAT_RC_OK;
-
- /* ctrl-Y: accept paste */
- if (buffer[0] == 25)
- accept_paste = 1;
-
- /* ctrl-N: cancel paste */
- if (buffer[0] == 14)
- cancel_paste = 1;
- }
- else
- {
- ret = read (STDIN_FILENO, buffer, sizeof (buffer));
- if (ret == 0)
- {
- /* no data on stdin, terminal lost */
- log_printf (_("Terminal lost, exiting WeeChat..."));
- hook_signal_send ("quit", WEECHAT_HOOK_SIGNAL_STRING, NULL);
- weechat_quit = 1;
- return WEECHAT_RC_OK;
- }
- if (ret < 0)
- return WEECHAT_RC_OK;
-
- for (i = 0; i < ret; i++)
- {
- gui_keyboard_buffer_add (buffer[i]);
- }
-
- text_added_to_buffer = 1;
- }
-
- if (gui_keyboard_paste_pending)
- {
- /* user is ok for pasting text, let's paste! */
- if (accept_paste)
- gui_keyboard_paste_accept ();
- /* user doesn't want to paste text: clear whole buffer! */
- else if (cancel_paste)
- gui_keyboard_paste_cancel ();
- else if (text_added_to_buffer)
- gui_input_text_changed_modifier_and_signal (gui_current_window->buffer, 0);
- }
- else
- {
- /*
- * detect user paste or large amount of text
- * if so, ask user what to do
- */
- if (CONFIG_INTEGER(config_look_paste_max_lines) > 0)
- {
- paste_lines = gui_keyboard_get_paste_lines ();
- if (paste_lines > CONFIG_INTEGER(config_look_paste_max_lines))
- {
- gui_keyboard_paste_pending = 1;
- gui_input_paste_pending_signal ();
- }
- }
- }
-
- gui_keyboard_flush ();
-
- return WEECHAT_RC_OK;
-}
diff --git a/src/gui/curses/gui-curses-main.c b/src/gui/curses/gui-curses-main.c
index d95c3f56a..ce95938a1 100644
--- a/src/gui/curses/gui-curses-main.c
+++ b/src/gui/curses/gui-curses-main.c
@@ -314,7 +314,7 @@ gui_main_loop ()
/* hook stdin (read keyboard) */
hook_fd_keyboard = hook_fd (NULL, STDIN_FILENO, 1, 0, 0,
- &gui_keyboard_read_cb, NULL);
+ &gui_key_read_cb, NULL);
gui_window_ask_refresh (1);
diff --git a/src/gui/curses/gui-curses-window.c b/src/gui/curses/gui-curses-window.c
index 4d808fd02..3e2f0d90f 100644
--- a/src/gui/curses/gui-curses-window.c
+++ b/src/gui/curses/gui-curses-window.c
@@ -48,6 +48,7 @@
#include "../gui-color.h"
#include "../gui-hotlist.h"
#include "../gui-input.h"
+#include "../gui-key.h"
#include "../gui-main.h"
#include "../gui-line.h"
#include "../gui-nicklist.h"
diff --git a/src/gui/curses/gui-curses.h b/src/gui/curses/gui-curses.h
index 7c5033912..5301234bd 100644
--- a/src/gui/curses/gui-curses.h
+++ b/src/gui/curses/gui-curses.h
@@ -78,9 +78,9 @@ extern void gui_chat_calculate_line_diff (struct t_gui_window *window,
struct t_gui_line **line,
int *line_pos, int difference);
-/* keyboard functions */
-extern void gui_keyboard_default_bindings ();
-extern int gui_keyboard_read_cb (void *data, int fd);
+/* key functions */
+extern void gui_key_default_bindings (int context);
+extern int gui_key_read_cb (void *data, int fd);
/* window functions */
extern void gui_window_read_terminal_size ();
diff --git a/src/gui/gtk/CMakeLists.txt b/src/gui/gtk/CMakeLists.txt
index 817c3e715..d40e6b6f6 100644
--- a/src/gui/gtk/CMakeLists.txt
+++ b/src/gui/gtk/CMakeLists.txt
@@ -23,7 +23,7 @@ gui-gtk.h
gui-gtk-bar-window.c
gui-gtk-chat.c
gui-gtk-color.c
-gui-gtk-keyboard.c
+gui-gtk-key.c
gui-gtk-main.c
gui-gtk-term.c
gui-gtk-window.c)
diff --git a/src/gui/gtk/Makefile.am b/src/gui/gtk/Makefile.am
index 4bd2fa16c..6f84e647f 100644
--- a/src/gui/gtk/Makefile.am
+++ b/src/gui/gtk/Makefile.am
@@ -35,7 +35,7 @@ weechat_gtk_LDADD = ./../../core/lib_weechat_core.a \
weechat_gtk_SOURCES = gui-gtk-bar-window.c \
gui-gtk-chat.c \
gui-gtk-color.c \
- gui-gtk-keyboard.c \
+ gui-gtk-key.c \
gui-gtk-main.c \
gui-gtk-term.c \
gui-gtk-window.c \
diff --git a/src/gui/gtk/gui-gtk-keyboard.c b/src/gui/gtk/gui-gtk-key.c
index bf3a9db5b..5fc5b5887 100644
--- a/src/gui/gtk/gui-gtk-keyboard.c
+++ b/src/gui/gtk/gui-gtk-key.c
@@ -31,27 +31,28 @@
#include "../../core/weechat.h"
#include "../../core/wee-utf8.h"
#include "../../plugins/plugin.h"
-#include "../gui-keyboard.h"
+#include "../gui-key.h"
#include "../gui-buffer.h"
#include "gui-gtk.h"
/*
- * gui_keyboard_default_bindings: create default key bindings
+ * gui_key_default_bindings: create default key bindings
*/
void
-gui_keyboard_default_bindings ()
+gui_key_default_bindings (int context)
{
/* TODO: write this function for Gtk */
+ (void) context;
}
/*
- * gui_keyboard_read: read keyboard chars
+ * gui_key_read: read keyboard chars
*/
void
-gui_keyboard_read ()
+gui_key_read ()
{
/* TODO: write this function for Gtk */
}
diff --git a/src/gui/gtk/gui-gtk.h b/src/gui/gtk/gui-gtk.h
index fac1eb00a..69cd4daa3 100644
--- a/src/gui/gtk/gui-gtk.h
+++ b/src/gui/gtk/gui-gtk.h
@@ -98,10 +98,10 @@ extern void gui_chat_calculate_line_diff (struct t_gui_window *window,
struct t_gui_line **line,
int *line_pos, int difference);
-/* keyboard functions */
-extern void gui_keyboard_default_bindings ();
-extern void gui_keyboard_read ();
-extern void gui_keyboard_flush ();
+/* key functions */
+extern void gui_key_default_bindings (int context);
+extern void gui_key_read ();
+extern void gui_key_flush ();
/* window functions */
extern void gui_window_redraw_buffer (struct t_gui_buffer *buffer);
diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c
index c806a042c..8a20a65bc 100644
--- a/src/gui/gui-bar-item.c
+++ b/src/gui/gui-bar-item.c
@@ -49,7 +49,7 @@
#include "gui-completion.h"
#include "gui-filter.h"
#include "gui-hotlist.h"
-#include "gui-keyboard.h"
+#include "gui-key.h"
#include "gui-line.h"
#include "gui-nicklist.h"
#include "gui-window.h"
@@ -628,7 +628,7 @@ gui_bar_item_default_input_paste (void *data, struct t_gui_bar_item *item,
if (window != gui_current_window)
return NULL;
- if (!gui_keyboard_paste_pending)
+ if (!gui_key_paste_pending)
return NULL;
ptr_message = _(text_paste_pending);
@@ -637,7 +637,7 @@ gui_bar_item_default_input_paste (void *data, struct t_gui_bar_item *item,
if (buf)
snprintf (buf, length, ptr_message,
gui_color_get_custom (gui_color_get_name (CONFIG_COLOR(config_color_input_actions))),
- gui_keyboard_get_paste_lines ());
+ gui_key_get_paste_lines ());
return buf;
}
diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c
index 8a920d27a..cc2f2ef3b 100644
--- a/src/gui/gui-buffer.c
+++ b/src/gui/gui-buffer.c
@@ -53,7 +53,7 @@
#include "gui-history.h"
#include "gui-hotlist.h"
#include "gui-input.h"
-#include "gui-keyboard.h"
+#include "gui-key.h"
#include "gui-layout.h"
#include "gui-line.h"
#include "gui-main.h"
@@ -1532,17 +1532,17 @@ gui_buffer_set (struct t_gui_buffer *buffer, const char *property,
}
else if (string_strncasecmp (property, "key_bind_", 9) == 0)
{
- gui_keyboard_bind (buffer, property + 9, value);
+ gui_key_bind (buffer, 0, property + 9, value);
}
else if (string_strncasecmp (property, "key_unbind_", 11) == 0)
{
if (strcmp (property + 11, "*") == 0)
{
- gui_keyboard_free_all (&buffer->keys, &buffer->last_key,
- &buffer->keys_count);
+ gui_key_free_all (&buffer->keys, &buffer->last_key,
+ &buffer->keys_count);
}
else
- gui_keyboard_unbind (buffer, property + 11, 1);
+ gui_key_unbind (buffer, 0, property + 11, 1);
}
else if (string_strcasecmp (property, "input") == 0)
{
@@ -2138,8 +2138,8 @@ gui_buffer_close (struct t_gui_buffer *buffer)
string_free_split (buffer->highlight_tags_array);
if (buffer->hotlist_max_level_nicks)
hashtable_free (buffer->hotlist_max_level_nicks);
- gui_keyboard_free_all (&buffer->keys, &buffer->last_key,
- &buffer->keys_count);
+ gui_key_free_all (&buffer->keys, &buffer->last_key,
+ &buffer->keys_count);
gui_buffer_local_var_remove_all (buffer);
hashtable_free (buffer->local_variables);
@@ -3365,7 +3365,7 @@ gui_buffer_print_log ()
{
log_printf ("");
log_printf (" => keys:");
- gui_keyboard_print_log (ptr_buffer);
+ gui_key_print_log (ptr_buffer);
}
if (ptr_buffer->local_variables)
diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c
index 8659e062b..7828e77a9 100644
--- a/src/gui/gui-input.c
+++ b/src/gui/gui-input.c
@@ -40,7 +40,7 @@
#include "gui-completion.h"
#include "gui-history.h"
#include "gui-hotlist.h"
-#include "gui-keyboard.h"
+#include "gui-key.h"
#include "gui-line.h"
#include "gui-window.h"
@@ -341,35 +341,28 @@ gui_input_return (struct t_gui_buffer *buffer)
char *command;
window = gui_window_search_with_buffer (buffer);
- if (window && window->buffer->input)
+ if (window && window->buffer->input
+ && (window->buffer->input_buffer_size > 0))
{
- if (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ command = strdup (window->buffer->input_buffer);
+ if (command)
{
- gui_window_search_stop (window);
- gui_input_search_signal ();
- }
- else if (window->buffer->input_buffer_size > 0)
- {
- window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
- command = strdup (window->buffer->input_buffer);
- if (command)
- {
- gui_history_add (window->buffer,
- window->buffer->input_buffer);
- window->buffer->input_buffer[0] = '\0';
- window->buffer->input_buffer_size = 0;
- window->buffer->input_buffer_length = 0;
- window->buffer->input_buffer_pos = 0;
- window->buffer->input_buffer_1st_display = 0;
- gui_completion_stop (window->buffer->completion, 1);
- gui_buffer_undo_free_all (window->buffer);
- window->buffer->ptr_history = NULL;
- history_global_ptr = NULL;
- gui_input_optimize_size (window->buffer);
- gui_input_text_changed_modifier_and_signal (window->buffer, 0);
- input_data (window->buffer, command);
- free (command);
- }
+ gui_history_add (window->buffer,
+ window->buffer->input_buffer);
+ window->buffer->input_buffer[0] = '\0';
+ window->buffer->input_buffer_size = 0;
+ window->buffer->input_buffer_length = 0;
+ window->buffer->input_buffer_pos = 0;
+ window->buffer->input_buffer_1st_display = 0;
+ gui_completion_stop (window->buffer->completion, 1);
+ gui_buffer_undo_free_all (window->buffer);
+ window->buffer->ptr_history = NULL;
+ history_global_ptr = NULL;
+ gui_input_optimize_size (window->buffer);
+ gui_input_text_changed_modifier_and_signal (window->buffer, 0);
+ input_data (window->buffer, command);
+ free (command);
}
}
}
@@ -498,7 +491,7 @@ gui_input_complete_previous (struct t_gui_buffer *buffer)
}
/*
- * gui_input_search_text: search text in buffer history (default key: ctrl-r)
+ * gui_input_search_text: search text in buffer (default key: ctrl-r)
*/
void
@@ -507,16 +500,86 @@ gui_input_search_text (struct t_gui_buffer *buffer)
struct t_gui_window *window;
window = gui_window_search_with_buffer (buffer);
- if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED))
+ if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
+ && (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED))
{
- /* toggle search */
- if (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED)
- gui_window_search_start (window);
- else
- {
- window->buffer->text_search_exact ^= 1;
- gui_window_search_restart (window);
- }
+ gui_window_search_start (window);
+ gui_input_search_signal ();
+ }
+}
+
+/*
+ * gui_input_search_previous: search backward in buffer (default key: up during
+ * search)
+ */
+
+void
+gui_input_search_previous (struct t_gui_buffer *buffer)
+{
+ struct t_gui_window *window;
+
+ window = gui_window_search_with_buffer (buffer);
+ if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
+ && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
+ {
+ window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
+ (void) gui_window_search_text (window);
+ }
+}
+
+/*
+ * gui_input_search_next: search forward in buffer (default key: down during
+ * search)
+ */
+
+void
+gui_input_search_next (struct t_gui_buffer *buffer)
+{
+ struct t_gui_window *window;
+
+ window = gui_window_search_with_buffer (buffer);
+ if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
+ && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
+ {
+ window->buffer->text_search = GUI_TEXT_SEARCH_FORWARD;
+ (void) gui_window_search_text (window);
+ }
+}
+
+/*
+ * gui_input_search_switch_case: switch case for search in buffer (default key:
+ * ctrl-r during search)
+ */
+
+void
+gui_input_search_switch_case (struct t_gui_buffer *buffer)
+{
+ struct t_gui_window *window;
+
+ window = gui_window_search_with_buffer (buffer);
+ if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
+ && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
+ {
+ window->buffer->text_search_exact ^= 1;
+ gui_window_search_restart (window);
+ gui_input_search_signal ();
+ }
+}
+
+/*
+ * gui_input_search_stop: stop text search (default key: return during search)
+ */
+
+void
+gui_input_search_stop (struct t_gui_buffer *buffer)
+{
+ struct t_gui_window *window;
+
+ window = gui_window_search_with_buffer (buffer);
+ if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
+ && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
+ {
+ gui_window_search_stop (window);
gui_input_search_signal ();
}
}
@@ -948,57 +1011,48 @@ gui_input_history_previous (struct t_gui_window *window,
if (!window->buffer->input)
return;
- if (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED)
+ if (*ptr_history)
{
- if (*ptr_history)
+ if (!(*ptr_history)->next_history)
+ return;
+ *ptr_history = (*ptr_history)->next_history;
+ }
+ if (!(*ptr_history))
+ *ptr_history = history;
+
+ if (!(*ptr_history))
+ return;
+
+ /* bash/readline like use of history */
+ if (window->buffer->input_buffer_size > 0)
+ {
+ if ((*ptr_history)->prev_history)
{
- if (!(*ptr_history)->next_history)
- return;
- *ptr_history = (*ptr_history)->next_history;
+ /* replace text in history with current input */
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ if ((*ptr_history)->prev_history->text)
+ free ((*ptr_history)->prev_history->text);
+ (*ptr_history)->prev_history->text =
+ strdup (window->buffer->input_buffer);
}
- if (!(*ptr_history))
- *ptr_history = history;
-
- if (!(*ptr_history))
- return;
-
- /* bash/readline like use of history */
- if (window->buffer->input_buffer_size > 0)
+ else
{
- if ((*ptr_history)->prev_history)
- {
- /* replace text in history with current input */
- window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
- if ((*ptr_history)->prev_history->text)
- free ((*ptr_history)->prev_history->text);
- (*ptr_history)->prev_history->text =
- strdup (window->buffer->input_buffer);
- }
- else
- {
- /* add current input in history */
- window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
- gui_history_add (window->buffer,
- window->buffer->input_buffer);
- }
+ /* add current input in history */
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ gui_history_add (window->buffer,
+ window->buffer->input_buffer);
}
- window->buffer->input_buffer_size =
- strlen ((*ptr_history)->text);
- window->buffer->input_buffer_length =
- utf8_strlen ((*ptr_history)->text);
- gui_input_optimize_size (window->buffer);
- window->buffer->input_buffer_pos = window->buffer->input_buffer_length;
- window->buffer->input_buffer_1st_display = 0;
- strcpy (window->buffer->input_buffer, (*ptr_history)->text);
- gui_input_text_changed_modifier_and_signal (window->buffer, 0);
- gui_buffer_undo_free_all (window->buffer);
- }
- else
- {
- /* search backward in buffer history */
- window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
- (void) gui_window_search_text (window);
}
+ window->buffer->input_buffer_size =
+ strlen ((*ptr_history)->text);
+ window->buffer->input_buffer_length =
+ utf8_strlen ((*ptr_history)->text);
+ gui_input_optimize_size (window->buffer);
+ window->buffer->input_buffer_pos = window->buffer->input_buffer_length;
+ window->buffer->input_buffer_1st_display = 0;
+ strcpy (window->buffer->input_buffer, (*ptr_history)->text);
+ gui_input_text_changed_modifier_and_signal (window->buffer, 0);
+ gui_buffer_undo_free_all (window->buffer);
}
/*
@@ -1020,62 +1074,53 @@ gui_input_history_next (struct t_gui_window *window,
if (!window->buffer->input)
return;
- if (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED)
+ if (*ptr_history)
{
+ *ptr_history = (*ptr_history)->prev_history;
if (*ptr_history)
{
- *ptr_history = (*ptr_history)->prev_history;
- if (*ptr_history)
- {
- window->buffer->input_buffer_size =
- strlen ((*ptr_history)->text);
- window->buffer->input_buffer_length =
- utf8_strlen ((*ptr_history)->text);
- }
- else
- {
- window->buffer->input_buffer[0] = '\0';
- window->buffer->input_buffer_size = 0;
- window->buffer->input_buffer_length = 0;
- }
- gui_input_optimize_size (window->buffer);
- window->buffer->input_buffer_pos =
- window->buffer->input_buffer_length;
- window->buffer->input_buffer_1st_display = 0;
- if (*ptr_history)
- {
- strcpy (window->buffer->input_buffer, (*ptr_history)->text);
- }
- input_changed = 1;
+ window->buffer->input_buffer_size =
+ strlen ((*ptr_history)->text);
+ window->buffer->input_buffer_length =
+ utf8_strlen ((*ptr_history)->text);
}
else
{
- /* add line to history then clear input */
- if (window->buffer->input_buffer_size > 0)
- {
- window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
- gui_history_add (window->buffer,
- window->buffer->input_buffer);
- window->buffer->input_buffer[0] = '\0';
- window->buffer->input_buffer_size = 0;
- window->buffer->input_buffer_length = 0;
- window->buffer->input_buffer_pos = 0;
- window->buffer->input_buffer_1st_display = 0;
- gui_input_optimize_size (window->buffer);
- input_changed = 1;
- }
+ window->buffer->input_buffer[0] = '\0';
+ window->buffer->input_buffer_size = 0;
+ window->buffer->input_buffer_length = 0;
}
- if (input_changed)
+ gui_input_optimize_size (window->buffer);
+ window->buffer->input_buffer_pos =
+ window->buffer->input_buffer_length;
+ window->buffer->input_buffer_1st_display = 0;
+ if (*ptr_history)
{
- gui_input_text_changed_modifier_and_signal (window->buffer, 0);
- gui_buffer_undo_free_all (window->buffer);
+ strcpy (window->buffer->input_buffer, (*ptr_history)->text);
}
+ input_changed = 1;
}
else
{
- /* search forward in buffer history */
- window->buffer->text_search = GUI_TEXT_SEARCH_FORWARD;
- (void) gui_window_search_text (window);
+ /* add line to history then clear input */
+ if (window->buffer->input_buffer_size > 0)
+ {
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ gui_history_add (window->buffer,
+ window->buffer->input_buffer);
+ window->buffer->input_buffer[0] = '\0';
+ window->buffer->input_buffer_size = 0;
+ window->buffer->input_buffer_length = 0;
+ window->buffer->input_buffer_pos = 0;
+ window->buffer->input_buffer_1st_display = 0;
+ gui_input_optimize_size (window->buffer);
+ input_changed = 1;
+ }
+ }
+ if (input_changed)
+ {
+ gui_input_text_changed_modifier_and_signal (window->buffer, 0);
+ gui_buffer_undo_free_all (window->buffer);
}
}
@@ -1297,7 +1342,7 @@ void
gui_input_grab_key (struct t_gui_buffer *buffer)
{
if (buffer->input)
- gui_keyboard_grab_init (0);
+ gui_key_grab_init (0);
}
/*
@@ -1309,7 +1354,7 @@ void
gui_input_grab_key_command (struct t_gui_buffer *buffer)
{
if (buffer->input)
- gui_keyboard_grab_init (1);
+ gui_key_grab_init (1);
}
/*
diff --git a/src/gui/gui-input.h b/src/gui/gui-input.h
index 557180154..dbad22b7a 100644
--- a/src/gui/gui-input.h
+++ b/src/gui/gui-input.h
@@ -43,6 +43,10 @@ extern void gui_input_return (struct t_gui_buffer *buffer);
extern void gui_input_complete_next (struct t_gui_buffer *buffer);
extern void gui_input_complete_previous (struct t_gui_buffer *buffer);
extern void gui_input_search_text (struct t_gui_buffer *buffer);
+extern void gui_input_search_previous (struct t_gui_buffer *buffer);
+extern void gui_input_search_next (struct t_gui_buffer *buffer);
+extern void gui_input_search_switch_case (struct t_gui_buffer *buffer);
+extern void gui_input_search_stop (struct t_gui_buffer *buffer);
extern void gui_input_delete_previous_char (struct t_gui_buffer *buffer);
extern void gui_input_delete_next_char (struct t_gui_buffer *buffer);
extern void gui_input_delete_previous_word (struct t_gui_buffer *buffer);
diff --git a/src/gui/gui-keyboard.c b/src/gui/gui-key.c
index 5ba07ab05..30d40d65f 100644
--- a/src/gui/gui-keyboard.c
+++ b/src/gui/gui-key.c
@@ -18,7 +18,7 @@
*/
/*
- * gui-keyboard: keyboard functions (used by all GUI)
+ * gui-key.c: keyboard functions (used by all GUI)
*/
#ifdef HAVE_CONFIG_H
@@ -40,7 +40,7 @@
#include "../core/wee-string.h"
#include "../core/wee-utf8.h"
#include "../plugins/plugin.h"
-#include "gui-keyboard.h"
+#include "gui-key.h"
#include "gui-buffer.h"
#include "gui-chat.h"
#include "gui-color.h"
@@ -49,60 +49,106 @@
#include "gui-window.h"
-struct t_gui_key *gui_keys = NULL; /* key bindings */
-struct t_gui_key *last_gui_key = NULL; /* last key binding */
-struct t_gui_key *gui_default_keys = NULL; /* default key bindings */
-struct t_gui_key *last_gui_default_key = NULL; /* last default key binding */
+struct t_gui_key *gui_keys[GUI_KEY_NUM_CONTEXTS]; /* keys by context */
+struct t_gui_key *last_gui_key[GUI_KEY_NUM_CONTEXTS]; /* last key */
+struct t_gui_key *gui_default_keys[GUI_KEY_NUM_CONTEXTS]; /* default keys */
+struct t_gui_key *last_gui_default_key[GUI_KEY_NUM_CONTEXTS];
+int gui_keys_count[GUI_KEY_NUM_CONTEXTS]; /* keys number */
+int gui_default_keys_count[GUI_KEY_NUM_CONTEXTS]; /* default keys number */
-int gui_keys_count = 0; /* number of defined keys */
-int gui_default_keys_count = 0; /* number of default keys */
+char *gui_key_context_string[GUI_KEY_NUM_CONTEXTS] =
+{ "default", "search" };
-int gui_keyboard_verbose = 0; /* 1 to see some messages */
+int gui_key_verbose = 0; /* 1 to see some messages */
char gui_key_combo_buffer[128]; /* buffer used for combos */
int gui_key_grab = 0; /* 1 if grab mode enabled (alt-k) */
int gui_key_grab_count = 0; /* number of keys pressed in grab mode */
int gui_key_grab_command = 0; /* grab command bound to key? */
-int *gui_keyboard_buffer = NULL; /* input buffer (for paste detection) */
-int gui_keyboard_buffer_alloc = 0; /* input buffer allocated size */
-int gui_keyboard_buffer_size = 0; /* input buffer size in bytes */
+int *gui_key_buffer = NULL; /* input buffer (for paste detection) */
+int gui_key_buffer_alloc = 0; /* input buffer allocated size */
+int gui_key_buffer_size = 0; /* input buffer size in bytes */
-int gui_keyboard_paste_pending = 0; /* 1 is big paste was detected and */
+int gui_key_paste_pending = 0; /* 1 is big paste was detected and */
/* WeeChat is asking user what to do */
-int gui_keyboard_paste_lines = 0; /* number of lines for pending paste */
+int gui_key_paste_lines = 0; /* number of lines for pending paste */
-time_t gui_keyboard_last_activity_time = 0; /* last activity time (key) */
+time_t gui_key_last_activity_time = 0; /* last activity time (key) */
/*
- * gui_keyboard_init: init keyboard
+ * gui_key_init: init keyboard
*/
void
-gui_keyboard_init ()
+gui_key_init ()
{
+ int i;
+
gui_key_combo_buffer[0] = '\0';
gui_key_grab = 0;
gui_key_grab_count = 0;
- gui_keyboard_last_activity_time = time (NULL);
+ gui_key_last_activity_time = time (NULL);
/* create default keys and save them in a separate list */
- gui_keyboard_default_bindings ();
- gui_default_keys = gui_keys;
- last_gui_default_key = last_gui_key;
- gui_default_keys_count = gui_keys_count;
- gui_keys = NULL;
- last_gui_key = NULL;
- gui_keys_count = 0;
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ gui_keys[i] = NULL;
+ last_gui_key[i] = NULL;
+ gui_default_keys[i] = NULL;
+ last_gui_default_key[i] = NULL;
+ gui_keys_count[i] = 0;
+ gui_default_keys_count[i] = 0;
+ gui_key_default_bindings (i);
+ gui_default_keys[i] = gui_keys[i];
+ last_gui_default_key[i] = last_gui_key[i];
+ gui_default_keys_count[i] = gui_keys_count[i];
+ gui_keys[i] = NULL;
+ last_gui_key[i] = NULL;
+ gui_keys_count[i] = 0;
+ }
+}
+
+/*
+ * gui_key_search_context: search context by name
+ */
+
+int
+gui_key_search_context (const char *context)
+{
+ int i;
+
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ if (string_strcasecmp (gui_key_context_string[i], context) == 0)
+ return i;
+ }
+
+ /* context not found */
+ return -1;
+}
+
+/*
+ * gui_key_get_current_context: get current context
+ */
+
+int
+gui_key_get_current_context ()
+{
+ if (gui_current_window
+ && (gui_current_window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
+ return GUI_KEY_CONTEXT_SEARCH;
+
+ return GUI_KEY_CONTEXT_DEFAULT;
}
/*
- * gui_keyboard_grab_init: init "grab" mode
+ * gui_key_grab_init: init "grab" mode
*/
void
-gui_keyboard_grab_init (int grab_command)
+gui_key_grab_init (int grab_command)
{
gui_key_grab = 1;
gui_key_grab_count = 0;
@@ -110,17 +156,17 @@ gui_keyboard_grab_init (int grab_command)
}
/*
- * gui_keyboard_grab_end: insert grabbed key in input buffer
+ * gui_key_grab_end: insert grabbed key in input buffer
*/
void
-gui_keyboard_grab_end ()
+gui_key_grab_end ()
{
char *expanded_key;
struct t_gui_key *ptr_key;
/* get expanded name (for example: ^U => ctrl-u) */
- expanded_key = gui_keyboard_get_expanded_name (gui_key_combo_buffer);
+ expanded_key = gui_key_get_expanded_name (gui_key_combo_buffer);
if (expanded_key)
{
@@ -129,7 +175,8 @@ gui_keyboard_grab_end ()
gui_input_insert_string (gui_current_window->buffer, expanded_key, -1);
if (gui_key_grab_command)
{
- ptr_key = gui_keyboard_search (gui_keys, gui_key_combo_buffer);
+ ptr_key = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT],
+ gui_key_combo_buffer);
if (ptr_key)
{
gui_input_insert_string (gui_current_window->buffer, " ", -1);
@@ -151,12 +198,12 @@ gui_keyboard_grab_end ()
}
/*
- * gui_keyboard_get_internal_code: get internal code from user key name
- * for example: return "^R" for "ctrl-R"
+ * gui_key_get_internal_code: get internal code from user key name
+ * for example: return "^R" for "ctrl-R"
*/
char *
-gui_keyboard_get_internal_code (const char *key)
+gui_key_get_internal_code (const char *key)
{
char *result;
@@ -194,12 +241,12 @@ gui_keyboard_get_internal_code (const char *key)
}
/*
- * gui_keyboard_get_expanded_name: get expanded name from internal key code
- * for example: return "ctrl-R" for "^R"
+ * gui_key_get_expanded_name: get expanded name from internal key code
+ * for example: return "ctrl-R" for "^R"
*/
char *
-gui_keyboard_get_expanded_name (const char *key)
+gui_key_get_expanded_name (const char *key)
{
char *result;
@@ -239,11 +286,11 @@ gui_keyboard_get_expanded_name (const char *key)
}
/*
- * gui_keyboard_find_pos: find position for a key (for sorting keys list)
+ * gui_key_find_pos: find position for a key (for sorting keys list)
*/
struct t_gui_key *
-gui_keyboard_find_pos (struct t_gui_key *keys, struct t_gui_key *key)
+gui_key_find_pos (struct t_gui_key *keys, struct t_gui_key *key)
{
struct t_gui_key *ptr_key;
@@ -256,20 +303,20 @@ gui_keyboard_find_pos (struct t_gui_key *keys, struct t_gui_key *key)
}
/*
- * gui_keyboard_insert_sorted: insert key into sorted list
+ * gui_key_insert_sorted: insert key into sorted list
*/
void
-gui_keyboard_insert_sorted (struct t_gui_key **keys,
- struct t_gui_key **last_key,
- int *keys_count,
- struct t_gui_key *key)
+gui_key_insert_sorted (struct t_gui_key **keys,
+ struct t_gui_key **last_key,
+ int *keys_count,
+ struct t_gui_key *key)
{
struct t_gui_key *pos_key;
if (*keys)
{
- pos_key = gui_keyboard_find_pos (*keys, key);
+ pos_key = gui_key_find_pos (*keys, key);
if (pos_key)
{
@@ -304,14 +351,14 @@ gui_keyboard_insert_sorted (struct t_gui_key **keys,
}
/*
- * gui_keyboard_new: add a new key in keys list
- * if buffer is not null, then key is specific to buffer
- * otherwise it's general key (for most keys)
+ * gui_key_new: add a new key in keys list
+ * if buffer is not null, then key is specific to buffer
+ * otherwise it's general key (for most keys)
*/
struct t_gui_key *
-gui_keyboard_new (struct t_gui_buffer *buffer, const char *key,
- const char *command)
+gui_key_new (struct t_gui_buffer *buffer, int context, const char *key,
+ const char *command)
{
struct t_gui_key *new_key;
char *expanded_name;
@@ -321,7 +368,7 @@ gui_keyboard_new (struct t_gui_buffer *buffer, const char *key,
if ((new_key = malloc (sizeof (*new_key))))
{
- new_key->key = gui_keyboard_get_internal_code (key);
+ new_key->key = gui_key_get_internal_code (key);
if (!new_key->key)
new_key->key = strdup (key);
if (!new_key->key)
@@ -339,21 +386,22 @@ gui_keyboard_new (struct t_gui_buffer *buffer, const char *key,
if (buffer)
{
- gui_keyboard_insert_sorted (&buffer->keys, &buffer->last_key,
- &buffer->keys_count, new_key);
+ gui_key_insert_sorted (&buffer->keys, &buffer->last_key,
+ &buffer->keys_count, new_key);
}
else
{
- gui_keyboard_insert_sorted (&gui_keys, &last_gui_key,
- &gui_keys_count, new_key);
+ gui_key_insert_sorted (&gui_keys[context],
+ &last_gui_key[context],
+ &gui_keys_count[context], new_key);
}
- expanded_name = gui_keyboard_get_expanded_name (new_key->key);
+ expanded_name = gui_key_get_expanded_name (new_key->key);
hook_signal_send ("key_bind",
WEECHAT_HOOK_SIGNAL_STRING, expanded_name);
- if (gui_keyboard_verbose)
+ if (gui_key_verbose)
{
gui_chat_printf (NULL,
_("New key binding: %s%s => %s%s"),
@@ -372,11 +420,11 @@ gui_keyboard_new (struct t_gui_buffer *buffer, const char *key,
}
/*
- * gui_keyboard_search: search a key
+ * gui_key_search: search a key
*/
struct t_gui_key *
-gui_keyboard_search (struct t_gui_key *keys, const char *key)
+gui_key_search (struct t_gui_key *keys, const char *key)
{
struct t_gui_key *ptr_key;
@@ -391,11 +439,11 @@ gui_keyboard_search (struct t_gui_key *keys, const char *key)
}
/*
- * gui_keyboard_cmp: compares 2 keys
+ * gui_key_cmp: compares 2 keys
*/
int
-gui_keyboard_cmp (const char *key, const char *search)
+gui_key_cmp (const char *key, const char *search)
{
int diff;
@@ -412,18 +460,19 @@ gui_keyboard_cmp (const char *key, const char *search)
}
/*
- * gui_keyboard_search_part: search a key (maybe part of string)
+ * gui_key_search_part: search a key (maybe part of string)
*/
struct t_gui_key *
-gui_keyboard_search_part (struct t_gui_buffer *buffer, const char *key)
+gui_key_search_part (struct t_gui_buffer *buffer, int context,
+ const char *key)
{
struct t_gui_key *ptr_key;
- for (ptr_key = (buffer) ? buffer->keys : gui_keys; ptr_key;
+ for (ptr_key = (buffer) ? buffer->keys : gui_keys[context]; ptr_key;
ptr_key = ptr_key->next_key)
{
- if (ptr_key->key && (gui_keyboard_cmp (ptr_key->key, key) == 0))
+ if (ptr_key->key && (gui_key_cmp (ptr_key->key, key) == 0))
return ptr_key;
}
@@ -432,13 +481,14 @@ gui_keyboard_search_part (struct t_gui_buffer *buffer, const char *key)
}
/*
- * gui_keyboard_bind: bind a key to a function (command or special function)
- * if buffer is not null, then key is specific to buffer
- * otherwise it's general key (for most keys)
+ * gui_key_bind: bind a key to a function (command or special function)
+ * if buffer is not null, then key is specific to buffer
+ * otherwise it's general key (for most keys)
*/
struct t_gui_key *
-gui_keyboard_bind (struct t_gui_buffer *buffer, const char *key, const char *command)
+gui_key_bind (struct t_gui_buffer *buffer, int context, const char *key,
+ const char *command)
{
struct t_gui_key *new_key;
@@ -448,9 +498,9 @@ gui_keyboard_bind (struct t_gui_buffer *buffer, const char *key, const char *com
return NULL;
}
- gui_keyboard_unbind (buffer, key, 0);
+ gui_key_unbind (buffer, context, key, 0);
- new_key = gui_keyboard_new (buffer, key, command);
+ new_key = gui_key_new (buffer, context, key, command);
if (!new_key)
{
log_printf (_("Error: not enough memory for key binding"));
@@ -461,31 +511,31 @@ gui_keyboard_bind (struct t_gui_buffer *buffer, const char *key, const char *com
}
/*
- * gui_keyboard_unbind: remove a key binding
+ * gui_key_unbind: remove a key binding
*/
int
-gui_keyboard_unbind (struct t_gui_buffer *buffer, const char *key,
- int send_signal)
+gui_key_unbind (struct t_gui_buffer *buffer, int context, const char *key,
+ int send_signal)
{
struct t_gui_key *ptr_key;
char *internal_code;
- internal_code = gui_keyboard_get_internal_code (key);
+ internal_code = gui_key_get_internal_code (key);
- ptr_key = gui_keyboard_search ((buffer) ? buffer->keys : gui_keys,
- (internal_code) ? internal_code : key);
+ ptr_key = gui_key_search ((buffer) ? buffer->keys : gui_keys[context],
+ (internal_code) ? internal_code : key);
if (ptr_key)
{
if (buffer)
{
- gui_keyboard_free (&buffer->keys, &buffer->last_key,
- &buffer->keys_count, ptr_key);
+ gui_key_free (&buffer->keys, &buffer->last_key,
+ &buffer->keys_count, ptr_key);
}
else
{
- gui_keyboard_free (&gui_keys, &last_gui_key,
- &gui_keys_count, ptr_key);
+ gui_key_free (&gui_keys[context], &last_gui_key[context],
+ &gui_keys_count[context], ptr_key);
}
}
@@ -502,15 +552,15 @@ gui_keyboard_unbind (struct t_gui_buffer *buffer, const char *key,
}
/*
- * gui_keyboard_pressed: treat new key pressed
- * return: 1 if key should be added to input buffer
- * 0 otherwise
+ * gui_key_pressed: treat new key pressed
+ * return: 1 if key should be added to input buffer
+ * 0 otherwise
*/
int
-gui_keyboard_pressed (const char *key_str)
+gui_key_pressed (const char *key_str)
{
- int first_key;
+ int first_key, context;
struct t_gui_key *ptr_key;
char *buffer_before_key;
char **commands, **ptr_cmd;
@@ -526,12 +576,32 @@ gui_keyboard_pressed (const char *key_str)
return 0;
}
- /* look for key combo in key table for current buffer */
- ptr_key = gui_keyboard_search_part (gui_current_window->buffer,
- gui_key_combo_buffer);
- /* if key is not found for buffer, then look in general table */
- if (!ptr_key)
- ptr_key = gui_keyboard_search_part (NULL, gui_key_combo_buffer);
+ context = gui_key_get_current_context ();
+ switch (context)
+ {
+ case GUI_KEY_CONTEXT_DEFAULT:
+ /* look for key combo in key table for current buffer */
+ ptr_key = gui_key_search_part (gui_current_window->buffer,
+ GUI_KEY_CONTEXT_DEFAULT,
+ gui_key_combo_buffer);
+ /* if key is not found for buffer, then look in general table */
+ if (!ptr_key)
+ ptr_key = gui_key_search_part (NULL,
+ GUI_KEY_CONTEXT_DEFAULT,
+ gui_key_combo_buffer);
+ break;
+ case GUI_KEY_CONTEXT_SEARCH:
+ ptr_key = gui_key_search_part (NULL,
+ GUI_KEY_CONTEXT_SEARCH,
+ gui_key_combo_buffer);
+ if (!ptr_key)
+ {
+ ptr_key = gui_key_search_part (NULL,
+ GUI_KEY_CONTEXT_DEFAULT,
+ gui_key_combo_buffer);
+ }
+ break;
+ }
/* if key is found, then execute action */
if (ptr_key)
@@ -573,12 +643,12 @@ gui_keyboard_pressed (const char *key_str)
}
/*
- * gui_keyboard_free: delete a key binding
+ * gui_key_free: delete a key binding
*/
void
-gui_keyboard_free (struct t_gui_key **keys, struct t_gui_key **last_key,
- int *keys_count, struct t_gui_key *key)
+gui_key_free (struct t_gui_key **keys, struct t_gui_key **last_key,
+ int *keys_count, struct t_gui_key *key)
{
/* free memory */
if (key->key)
@@ -602,157 +672,161 @@ gui_keyboard_free (struct t_gui_key **keys, struct t_gui_key **last_key,
}
/*
- * gui_keyboard_free_all: delete all key bindings
+ * gui_key_free_all: delete all key bindings
*/
void
-gui_keyboard_free_all (struct t_gui_key **keys, struct t_gui_key **last_key,
+gui_key_free_all (struct t_gui_key **keys, struct t_gui_key **last_key,
int *keys_count)
{
while (*keys)
{
- gui_keyboard_free (keys, last_key, keys_count, *keys);
+ gui_key_free (keys, last_key, keys_count, *keys);
}
}
/*
- * gui_keyboard_buffer_optimize: optimize keyboard buffer size
+ * gui_key_buffer_optimize: optimize keyboard buffer size
*/
void
-gui_keyboard_buffer_optimize ()
+gui_key_buffer_optimize ()
{
int optimal_size;
- optimal_size = (((gui_keyboard_buffer_size * sizeof (int)) /
- GUI_KEYBOARD_BUFFER_BLOCK_SIZE) *
- GUI_KEYBOARD_BUFFER_BLOCK_SIZE) +
- GUI_KEYBOARD_BUFFER_BLOCK_SIZE;
+ optimal_size = (((gui_key_buffer_size * sizeof (int)) /
+ GUI_KEY_BUFFER_BLOCK_SIZE) *
+ GUI_KEY_BUFFER_BLOCK_SIZE) +
+ GUI_KEY_BUFFER_BLOCK_SIZE;
- if (gui_keyboard_buffer_alloc != optimal_size)
+ if (gui_key_buffer_alloc != optimal_size)
{
- gui_keyboard_buffer_alloc = optimal_size;
- gui_keyboard_buffer = realloc (gui_keyboard_buffer, optimal_size);
+ gui_key_buffer_alloc = optimal_size;
+ gui_key_buffer = realloc (gui_key_buffer, optimal_size);
}
}
/*
- * gui_keyboard_buffer_reset: reset keyboard buffer
- * (create empty if never created before)
+ * gui_key_buffer_reset: reset keyboard buffer
+ * (create empty if never created before)
*/
void
-gui_keyboard_buffer_reset ()
+gui_key_buffer_reset ()
{
- if (!gui_keyboard_buffer)
+ if (!gui_key_buffer)
{
- gui_keyboard_buffer_alloc = GUI_KEYBOARD_BUFFER_BLOCK_SIZE;
- gui_keyboard_buffer_size = 0;
- gui_keyboard_buffer = malloc (gui_keyboard_buffer_alloc);
+ gui_key_buffer_alloc = GUI_KEY_BUFFER_BLOCK_SIZE;
+ gui_key_buffer_size = 0;
+ gui_key_buffer = malloc (gui_key_buffer_alloc);
}
else
{
- gui_keyboard_buffer_size = 0;
- gui_keyboard_buffer_optimize ();
+ gui_key_buffer_size = 0;
+ gui_key_buffer_optimize ();
}
- gui_keyboard_paste_lines = 0;
+ gui_key_paste_lines = 0;
}
/*
- * gui_keyboard_buffer_add: add a key to keyboard buffer
+ * gui_key_buffer_add: add a key to keyboard buffer
*/
void
-gui_keyboard_buffer_add (unsigned char key)
+gui_key_buffer_add (unsigned char key)
{
- if (!gui_keyboard_buffer)
- gui_keyboard_buffer_reset ();
+ if (!gui_key_buffer)
+ gui_key_buffer_reset ();
- gui_keyboard_buffer_size++;
+ gui_key_buffer_size++;
- gui_keyboard_buffer_optimize ();
+ gui_key_buffer_optimize ();
- if (gui_keyboard_buffer)
+ if (gui_key_buffer)
{
- gui_keyboard_buffer[gui_keyboard_buffer_size - 1] = key;
+ gui_key_buffer[gui_key_buffer_size - 1] = key;
if ((key == 13)
- && (gui_keyboard_buffer_size > 1)
- && (gui_keyboard_buffer[gui_keyboard_buffer_size - 2] != 13))
- gui_keyboard_paste_lines++;
+ && (gui_key_buffer_size > 1)
+ && (gui_key_buffer[gui_key_buffer_size - 2] != 13))
+ gui_key_paste_lines++;
}
else
{
- gui_keyboard_buffer_alloc = 0;
- gui_keyboard_buffer_size = 0;
- gui_keyboard_paste_lines = 0;
+ gui_key_buffer_alloc = 0;
+ gui_key_buffer_size = 0;
+ gui_key_paste_lines = 0;
}
}
/*
- * gui_keyboard_get_paste_lines: return real number of lines in buffer
- * if last key is not Return, then this is lines + 1
- * else it's lines
+ * gui_key_get_paste_lines: return real number of lines in buffer
+ * if last key is not Return, then this is lines + 1
+ * else it's lines
*/
int
-gui_keyboard_get_paste_lines ()
+gui_key_get_paste_lines ()
{
- if ((gui_keyboard_buffer_size > 0)
- && (gui_keyboard_buffer[gui_keyboard_buffer_size - 1] != 13))
- return gui_keyboard_paste_lines + 1;
+ if ((gui_key_buffer_size > 0)
+ && (gui_key_buffer[gui_key_buffer_size - 1] != 13))
+ return gui_key_paste_lines + 1;
- return gui_keyboard_paste_lines;
+ return gui_key_paste_lines;
}
/*
- * gui_keyboard_paste_accept: accept paste from user
+ * gui_key_paste_accept: accept paste from user
*/
void
-gui_keyboard_paste_accept ()
+gui_key_paste_accept ()
{
- gui_keyboard_paste_pending = 0;
+ gui_key_paste_pending = 0;
gui_input_paste_pending_signal ();
}
-
/*
- * gui_keyboard_paste_cancel: cancel paste from user (reset buffer)
+ * gui_key_paste_cancel: cancel paste from user (reset buffer)
*/
void
-gui_keyboard_paste_cancel ()
+gui_key_paste_cancel ()
{
- gui_keyboard_buffer_reset ();
- gui_keyboard_paste_pending = 0;
+ gui_key_buffer_reset ();
+ gui_key_paste_pending = 0;
gui_input_paste_pending_signal ();
}
/*
- * gui_keyboard_end: end keyboard (free some data)
+ * gui_key_end: end keyboard (free some data)
*/
void
-gui_keyboard_end ()
+gui_key_end ()
{
- /* free keyboard buffer */
- if (gui_keyboard_buffer)
- free (gui_keyboard_buffer);
+ int i;
- /* free all keys */
- gui_keyboard_free_all (&gui_keys, &last_gui_key, &gui_keys_count);
+ /* free key buffer */
+ if (gui_key_buffer)
+ free (gui_key_buffer);
- /* free all default keys */
- gui_keyboard_free_all (&gui_default_keys, &last_gui_default_key,
- &gui_default_keys_count);
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ /* free keys */
+ gui_key_free_all (&gui_keys[i], &last_gui_key[i],
+ &gui_keys_count[i]);
+ /* free default keys */
+ gui_key_free_all (&gui_default_keys[i], &last_gui_default_key[i],
+ &gui_default_keys_count[i]);
+ }
}
/*
- * gui_keyboard_hdata_key_cb: return hdata for key
+ * gui_key_hdata_key_cb: return hdata for key
*/
struct t_hdata *
-gui_keyboard_hdata_key_cb (void *data, const char *hdata_name)
+gui_key_hdata_key_cb (void *data, const char *hdata_name)
{
struct t_hdata *hdata;
@@ -775,13 +849,12 @@ gui_keyboard_hdata_key_cb (void *data, const char *hdata_name)
}
/*
- * gui_keyboard_add_to_infolist: add a key in an infolist
- * return 1 if ok, 0 if error
+ * gui_key_add_to_infolist: add a key in an infolist
+ * return 1 if ok, 0 if error
*/
int
-gui_keyboard_add_to_infolist (struct t_infolist *infolist,
- struct t_gui_key *key)
+gui_key_add_to_infolist (struct t_infolist *infolist, struct t_gui_key *key)
{
struct t_infolist_item *ptr_item;
char *expanded_key;
@@ -795,7 +868,7 @@ gui_keyboard_add_to_infolist (struct t_infolist *infolist,
if (!infolist_new_var_string (ptr_item, "key_internal", key->key))
return 0;
- expanded_key = gui_keyboard_get_expanded_name (key->key);
+ expanded_key = gui_key_get_expanded_name (key->key);
if (expanded_key)
{
if (!infolist_new_var_string (ptr_item, "key", expanded_key))
@@ -809,34 +882,49 @@ gui_keyboard_add_to_infolist (struct t_infolist *infolist,
}
/*
- * gui_keyboard_print_log: print key infos in log (usually for crash dump)
+ * gui_key_print_log: print key infos in log (usually for crash dump)
*/
void
-gui_keyboard_print_log (struct t_gui_buffer *buffer)
+gui_key_print_log (struct t_gui_buffer *buffer)
{
- struct t_gui_key *ptr_keys, *ptr_last_key, *ptr_key;
- int keys_count;
- char prefix[32];
-
- ptr_keys = (buffer) ? buffer->keys : gui_keys;
- ptr_last_key = (buffer) ? buffer->last_key : last_gui_key;
- keys_count = (buffer) ? buffer->keys_count : gui_keys_count;
-
- snprintf (prefix, sizeof (prefix), "%s", (buffer) ? " " : "");
-
- log_printf ("%skeys . . . . . . . . : 0x%lx", prefix, ptr_keys);
- log_printf ("%slast_key . . . . . . : 0x%lx", prefix, ptr_last_key);
- log_printf ("%skeys_count . . . . . : %d", prefix, keys_count);
+ struct t_gui_key *ptr_key;
+ int i;
- for (ptr_key = (buffer) ? buffer->keys : gui_keys; ptr_key;
- ptr_key = ptr_key->next_key)
+ if (buffer)
+ {
+ log_printf (" keys . . . . . . . . : 0x%lx", buffer->keys);
+ log_printf (" last_key . . . . . . : 0x%lx", buffer->last_key);
+ log_printf (" keys_count . . . . . : %d", buffer->keys_count);
+ for (ptr_key = buffer->keys; ptr_key; ptr_key = ptr_key->next_key)
+ {
+ log_printf ("");
+ log_printf (" [key (addr:0x%lx)]", ptr_key);
+ log_printf (" key. . . . . . . . : '%s'", ptr_key->key);
+ log_printf (" command. . . . . . : '%s'", ptr_key->command);
+ log_printf (" prev_key . . . . . : 0x%lx", ptr_key->prev_key);
+ log_printf (" next_key . . . . . : 0x%lx", ptr_key->next_key);
+ }
+ }
+ else
{
- log_printf ("");
- log_printf ("%s[key (addr:0x%lx)]", prefix, ptr_key);
- log_printf ("%s key. . . . . . . . : '%s'", prefix, ptr_key->key);
- log_printf ("%s command. . . . . . : '%s'", prefix, ptr_key->command);
- log_printf ("%s prev_key . . . . . : 0x%lx", prefix, ptr_key->prev_key);
- log_printf ("%s next_key . . . . . : 0x%lx", prefix, ptr_key->next_key);
+ for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
+ {
+ log_printf ("[keys for context: %s]", gui_key_context_string[i]);
+ log_printf ("");
+ log_printf (" keys . . . . . . . . : 0x%lx", gui_keys[i]);
+ log_printf (" last_key . . . . . . : 0x%lx", last_gui_key[i]);
+ log_printf (" keys_count . . . . . : %d", gui_keys_count[i]);
+
+ for (ptr_key = gui_keys[i]; ptr_key; ptr_key = ptr_key->next_key)
+ {
+ log_printf ("");
+ log_printf ("[key (addr:0x%lx)]", ptr_key);
+ log_printf (" key. . . . . . . . : '%s'", ptr_key->key);
+ log_printf (" command. . . . . . : '%s'", ptr_key->command);
+ log_printf (" prev_key . . . . . : 0x%lx", ptr_key->prev_key);
+ log_printf (" next_key . . . . . : 0x%lx", ptr_key->next_key);
+ }
+ }
}
}
diff --git a/src/gui/gui-key.h b/src/gui/gui-key.h
new file mode 100644
index 000000000..32e3f0482
--- /dev/null
+++ b/src/gui/gui-key.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2003-2011 Sebastien Helleu <flashcode@flashtux.org>
+ *
+ * This file is part of WeeChat, the extensible chat client.
+ *
+ * WeeChat 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __WEECHAT_GUI_KEY_H
+#define __WEECHAT_GUI_KEY_H 1
+
+#define GUI_KEY_BUFFER_BLOCK_SIZE 256
+
+enum t_gui_key_context
+{
+ GUI_KEY_CONTEXT_DEFAULT = 0,
+ GUI_KEY_CONTEXT_SEARCH,
+ /* number of key contexts */
+ GUI_KEY_NUM_CONTEXTS,
+};
+
+/* key structures */
+
+struct t_gui_key
+{
+ char *key; /* key combo (ex: a, ^W, ^W^C, meta-a) */
+ char *command; /* associated command (may be NULL) */
+ struct t_gui_key *prev_key; /* link to previous key */
+ struct t_gui_key *next_key; /* link to next key */
+};
+
+/* key variables */
+
+extern struct t_gui_key *gui_keys[GUI_KEY_NUM_CONTEXTS];
+extern struct t_gui_key *last_gui_key[GUI_KEY_NUM_CONTEXTS];
+extern struct t_gui_key *gui_default_keys[GUI_KEY_NUM_CONTEXTS];
+extern struct t_gui_key *last_gui_default_key[GUI_KEY_NUM_CONTEXTS];
+extern int gui_keys_count[GUI_KEY_NUM_CONTEXTS];
+extern int gui_default_keys_count[GUI_KEY_NUM_CONTEXTS];
+extern char *gui_key_context_string[GUI_KEY_NUM_CONTEXTS];
+extern int gui_key_verbose;
+extern char gui_key_combo_buffer[];
+extern int gui_key_grab;
+extern int gui_key_grab_count;
+extern int *gui_key_buffer;
+extern int gui_key_buffer_size;
+extern int gui_key_paste_pending;
+extern time_t gui_key_last_activity_time;
+
+/* key functions */
+
+extern void gui_key_init ();
+extern int gui_key_search_context (const char *context);
+extern void gui_key_grab_init (int grab_command);
+extern void gui_key_grab_end ();
+extern char *gui_key_get_internal_code (const char *key);
+extern char *gui_key_get_expanded_name (const char *key);
+extern struct t_gui_key *gui_key_new (struct t_gui_buffer *buffer,
+ int context,
+ const char *key,
+ const char *command);
+extern struct t_gui_key *gui_key_search (struct t_gui_key *keys,
+ const char *key);
+extern struct t_gui_key *gui_key_bind (struct t_gui_buffer *buffer,
+ int context,
+ const char *key,
+ const char *command);
+extern int gui_key_unbind (struct t_gui_buffer *buffer, int context,
+ const char *key, int send_signal);
+extern int gui_key_pressed (const char *key_str);
+extern void gui_key_free (struct t_gui_key **keys,
+ struct t_gui_key **last_key,
+ int *keys_count,
+ struct t_gui_key *key);
+extern void gui_key_free_all (struct t_gui_key **keys,
+ struct t_gui_key **last_key,
+ int *keys_count);
+extern void gui_key_buffer_reset ();
+extern void gui_key_buffer_add (unsigned char key);
+extern int gui_key_get_paste_lines ();
+extern void gui_key_paste_accept ();
+extern void gui_key_paste_cancel ();
+extern void gui_key_end ();
+extern struct t_hdata *gui_key_hdata_key_cb (void *data,
+ const char *hdata_name);
+extern int gui_key_add_to_infolist (struct t_infolist *infolist,
+ struct t_gui_key *key);
+extern void gui_key_print_log (struct t_gui_buffer *buffer);
+
+/* key functions (GUI dependent) */
+
+extern void gui_key_default_bindings ();
+
+#endif /* __WEECHAT_GUI_KEY_H */
diff --git a/src/gui/gui-keyboard.h b/src/gui/gui-keyboard.h
deleted file mode 100644
index 6c5de214b..000000000
--- a/src/gui/gui-keyboard.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2003-2011 Sebastien Helleu <flashcode@flashtux.org>
- *
- * This file is part of WeeChat, the extensible chat client.
- *
- * WeeChat 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 3 of the License, or
- * (at your option) any later version.
- *
- * WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __WEECHAT_GUI_KEYBOARD_H
-#define __WEECHAT_GUI_KEYBOARD_H 1
-
-#define GUI_KEYBOARD_BUFFER_BLOCK_SIZE 256
-
-/* keyboard structures */
-
-struct t_gui_key
-{
- char *key; /* key combo (ex: a, ^W, ^W^C, meta-a) */
- char *command; /* associated command (may be NULL) */
- struct t_gui_key *prev_key; /* link to previous key */
- struct t_gui_key *next_key; /* link to next key */
-};
-
-/* keyboard variables */
-
-extern struct t_gui_key *gui_keys;
-extern struct t_gui_key *last_gui_key;
-extern struct t_gui_key *gui_default_keys;
-extern struct t_gui_key *last_gui_default_key;
-extern int gui_keys_count;
-extern int gui_default_keys_count;
-extern int gui_keyboard_verbose;
-extern char gui_key_combo_buffer[];
-extern int gui_key_grab;
-extern int gui_key_grab_count;
-extern int *gui_keyboard_buffer;
-extern int gui_keyboard_buffer_size;
-extern int gui_keyboard_paste_pending;
-extern time_t gui_keyboard_last_activity_time;
-
-/* keyboard functions */
-
-extern void gui_keyboard_init ();
-extern void gui_keyboard_grab_init (int grab_command);
-extern void gui_keyboard_grab_end ();
-extern char *gui_keyboard_get_internal_code (const char *key);
-extern char *gui_keyboard_get_expanded_name (const char *key);
-extern struct t_gui_key *gui_keyboard_new (struct t_gui_buffer *buffer,
- const char *key,
- const char *command);
-extern struct t_gui_key *gui_keyboard_search (struct t_gui_key *keys,
- const char *key);
-extern struct t_gui_key *gui_keyboard_bind (struct t_gui_buffer *buffer,
- const char *key,
- const char *command);
-extern int gui_keyboard_unbind (struct t_gui_buffer *buffer, const char *key,
- int send_signal);
-extern int gui_keyboard_pressed (const char *key_str);
-extern void gui_keyboard_free (struct t_gui_key **keys,
- struct t_gui_key **last_key,
- int *keys_count,
- struct t_gui_key *key);
-extern void gui_keyboard_free_all (struct t_gui_key **keys,
- struct t_gui_key **last_key,
- int *keys_count);
-extern void gui_keyboard_buffer_reset ();
-extern void gui_keyboard_buffer_add (unsigned char key);
-extern int gui_keyboard_get_paste_lines ();
-extern void gui_keyboard_paste_accept ();
-extern void gui_keyboard_paste_cancel ();
-extern void gui_keyboard_end ();
-extern struct t_hdata *gui_keyboard_hdata_key_cb (void *data,
- const char *hdata_name);
-extern int gui_keyboard_add_to_infolist (struct t_infolist *infolist,
- struct t_gui_key *key);
-extern void gui_keyboard_print_log (struct t_gui_buffer *buffer);
-
-/* keyboard functions (GUI dependent) */
-
-extern void gui_keyboard_default_bindings ();
-
-#endif /* __WEECHAT_GUI_KEYBOARD_H */
diff --git a/src/gui/gui-window.c b/src/gui/gui-window.c
index 6108d2b0c..bb22d1297 100644
--- a/src/gui/gui-window.c
+++ b/src/gui/gui-window.c
@@ -1099,6 +1099,7 @@ gui_window_scroll_next_highlight (struct t_gui_window *window)
/*
* gui_window_search_text: search text in a buffer
+ * return 1 if line has been found with text, otherwise 0
*/
int
diff --git a/src/plugins/plugin-api.c b/src/plugins/plugin-api.c
index c2ebab2e4..e5b85558a 100644
--- a/src/plugins/plugin-api.c
+++ b/src/plugins/plugin-api.c
@@ -53,7 +53,7 @@
#include "../gui/gui-filter.h"
#include "../gui/gui-history.h"
#include "../gui/gui-hotlist.h"
-#include "../gui/gui-keyboard.h"
+#include "../gui/gui-key.h"
#include "../gui/gui-line.h"
#include "../gui/gui-nicklist.h"
#include "../gui/gui-window.h"
@@ -353,10 +353,10 @@ plugin_api_info_get_internal (void *data, const char *info_name,
}
else if (string_strcasecmp (info_name, "inactivity") == 0)
{
- if (gui_keyboard_last_activity_time == 0)
+ if (gui_key_last_activity_time == 0)
inactivity = 0;
else
- inactivity = time (NULL) - gui_keyboard_last_activity_time;
+ inactivity = time (NULL) - gui_key_last_activity_time;
snprintf (value, sizeof (value), "%ld", (long int)inactivity);
return value;
}
@@ -394,6 +394,7 @@ plugin_api_infolist_get_internal (void *data, const char *infolist_name,
struct t_gui_key *ptr_key;
struct t_weechat_plugin *ptr_plugin;
char buffer_full_name[1024];
+ int context;
/* make C compiler happy */
(void) data;
@@ -678,12 +679,17 @@ plugin_api_infolist_get_internal (void *data, const char *infolist_name,
ptr_infolist = infolist_new ();
if (ptr_infolist)
{
- for (ptr_key = gui_keys; ptr_key; ptr_key = ptr_key->next_key)
+ context = gui_key_search_context (arguments);
+ if (context >= 0)
{
- if (!gui_keyboard_add_to_infolist (ptr_infolist, ptr_key))
+ for (ptr_key = gui_keys[context]; ptr_key;
+ ptr_key = ptr_key->next_key)
{
- infolist_free (ptr_infolist);
- return NULL;
+ if (!gui_key_add_to_infolist (ptr_infolist, ptr_key))
+ {
+ infolist_free (ptr_infolist);
+ return NULL;
+ }
}
}
return ptr_infolist;
@@ -1074,7 +1080,7 @@ plugin_api_init ()
hook_hdata (NULL, "input_undo", N_("structure with undo for input line"),
&gui_buffer_hdata_input_undo_cb, NULL);
hook_hdata (NULL, "key", N_("a key (keyboard shortcut)"),
- &gui_keyboard_hdata_key_cb, NULL);
+ &gui_key_hdata_key_cb, NULL);
hook_hdata (NULL, "lines", N_("structure with lines"),
&gui_line_hdata_lines_cb, NULL);
hook_hdata (NULL, "line", N_("structure with one line"),