summaryrefslogtreecommitdiff
path: root/src/core/wee-input.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/wee-input.c')
-rw-r--r--src/core/wee-input.c108
1 files changed, 68 insertions, 40 deletions
diff --git a/src/core/wee-input.c b/src/core/wee-input.c
index e8ca08605..beef72d9d 100644
--- a/src/core/wee-input.c
+++ b/src/core/wee-input.c
@@ -35,6 +35,7 @@
#include "../gui/gui-buffer.h"
#include "../gui/gui-chat.h"
#include "../gui/gui-filter.h"
+#include "../gui/gui-window.h"
#include "../plugins/plugin.h"
@@ -154,13 +155,17 @@ input_exec_command (struct t_gui_buffer *buffer,
void
input_data (struct t_gui_buffer *buffer, const char *data)
{
- char *pos, *buf, str_buffer[128], *new_data;
+ char *pos, *buf, str_buffer[128], *new_data, *buffer_full_name;
const char *ptr_data, *ptr_data_for_buffer;
- int length, char_size;
+ int length, char_size, first_command;
if (!buffer || !data || !data[0] || (data[0] == '\r') || (data[0] == '\n'))
return;
+ buffer_full_name = strdup (buffer->full_name);
+ if (!buffer_full_name)
+ return;
+
/* execute modifier "input_text_for_buffer" */
snprintf (str_buffer, sizeof (str_buffer),
"0x%lx", (long unsigned int)buffer);
@@ -169,56 +174,79 @@ input_data (struct t_gui_buffer *buffer, const char *data)
str_buffer,
data);
- /* data not dropped? */
- if (!new_data || new_data[0])
+ /* data was dropped? */
+ if (new_data && !new_data[0])
+ goto end;
+
+ first_command = 1;
+ ptr_data = (new_data) ? new_data : data;
+ while (ptr_data && ptr_data[0])
{
- ptr_data = (new_data) ? new_data : data;
- while (ptr_data && ptr_data[0])
+ /*
+ * if the buffer pointer is not valid any more (or if it's another
+ * buffer), use the current buffer for the next command
+ */
+ if (!first_command
+ && (!gui_buffer_valid (buffer)
+ || (strcmp (buffer->full_name, buffer_full_name) != 0)))
{
- pos = strchr (ptr_data, '\n');
- if (pos)
- pos[0] = '\0';
+ if (!gui_current_window || !gui_current_window->buffer)
+ break;
+ buffer = gui_current_window->buffer;
+ free (buffer_full_name);
+ buffer_full_name = strdup (buffer->full_name);
+ if (!buffer_full_name)
+ break;
+ }
+
+ pos = strchr (ptr_data, '\n');
+ if (pos)
+ pos[0] = '\0';
- ptr_data_for_buffer = string_input_for_buffer (ptr_data);
- if (ptr_data_for_buffer)
+ ptr_data_for_buffer = string_input_for_buffer (ptr_data);
+ if (ptr_data_for_buffer)
+ {
+ /*
+ * input string is NOT a command, send it to buffer input
+ * callback
+ */
+ if (string_is_command_char (ptr_data_for_buffer))
{
- /*
- * input string is NOT a command, send it to buffer input
- * callback
- */
- if (string_is_command_char (ptr_data_for_buffer))
+ char_size = utf8_char_size (ptr_data_for_buffer);
+ length = strlen (ptr_data_for_buffer) + char_size + 1;
+ buf = malloc (length);
+ if (buf)
{
- char_size = utf8_char_size (ptr_data_for_buffer);
- length = strlen (ptr_data_for_buffer) + char_size + 1;
- buf = malloc (length);
- if (buf)
- {
- memcpy (buf, ptr_data_for_buffer, char_size);
- snprintf (buf + char_size, length - char_size,
- "%s", ptr_data_for_buffer);
- input_exec_data (buffer, buf);
- free (buf);
- }
+ memcpy (buf, ptr_data_for_buffer, char_size);
+ snprintf (buf + char_size, length - char_size,
+ "%s", ptr_data_for_buffer);
+ input_exec_data (buffer, buf);
+ free (buf);
}
- else
- input_exec_data (buffer, ptr_data_for_buffer);
}
else
- {
- /* input string is a command */
- input_exec_command (buffer, 1, buffer->plugin, ptr_data);
- }
+ input_exec_data (buffer, ptr_data_for_buffer);
+ }
+ else
+ {
+ /* input string is a command */
+ input_exec_command (buffer, 1, buffer->plugin, ptr_data);
+ }
- if (pos)
- {
- pos[0] = '\n';
- ptr_data = pos + 1;
- }
- else
- ptr_data = NULL;
+ if (pos)
+ {
+ pos[0] = '\n';
+ ptr_data = pos + 1;
}
+ else
+ ptr_data = NULL;
+
+ first_command = 0;
}
+end:
if (new_data)
free (new_data);
+ if (buffer_full_name)
+ free (buffer_full_name);
}