{
}
-static gboolean key_pressed(GtkWidget *UNUSED(widget), GdkEventKey *event,
- LogWindow *logwin)
+static gboolean iter_char_search_cb(gunichar ch, gpointer data)
{
+ gboolean ret;
+
+ if (ch == GPOINTER_TO_UINT(data))
+ {
+ ret = TRUE;
+ }
+ else
+ {
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+/**
+ * @brief Handle escape and F1 keys
+ * @param UNUSED
+ * @param event
+ * @param logwin
+ * @returns
+ *
+ * If escape key pressed, hide log window. \n
+ * If no text selected, form a selection bounded by space characters or
+ * start and end of line. \n
+ * If F1 pressed, execute command line program: \n
+ * <options->log_window.action> <selected text>
+ *
+*/
+static gboolean key_pressed(GtkWidget *UNUSED(widget), GdkEventKey *event, LogWindow *logwin)
+{
+ GtkTextBuffer *buffer;
+ GtkTextIter chr_end;
+ GtkTextIter chr_start;
+ GtkTextIter cursor_iter;
+ GtkTextIter line_end;
+ GtkTextIter line_start;
+ GtkTextMark *cursor_mark;
+ gchar *cmd_line;
+ gchar *sel_text;
+
if (event && event->keyval == GDK_KEY_Escape)
gtk_widget_hide(logwin->window);
+
+ if (event && event->keyval == GDK_KEY_F1)
+ {
+ if (strlen(options->log_window.action) > 0)
+ {
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(logwin->text));
+
+ if (!gtk_text_buffer_get_has_selection(buffer))
+ {
+ cursor_mark = gtk_text_buffer_get_insert(buffer);
+ gtk_text_buffer_get_iter_at_mark(buffer, &cursor_iter, cursor_mark);
+
+ line_start = cursor_iter;
+ gtk_text_iter_set_line_offset(&line_start, 0);
+ line_end = cursor_iter;
+ gtk_text_iter_forward_to_line_end(&line_end);
+
+ chr_start = cursor_iter;
+ gtk_text_iter_backward_find_char(&chr_start, (GtkTextCharPredicate)iter_char_search_cb, GUINT_TO_POINTER(' '), &line_start);
+
+ chr_end = cursor_iter;
+ gtk_text_iter_forward_find_char(&chr_end, (GtkTextCharPredicate)iter_char_search_cb, GUINT_TO_POINTER(' '), &line_end);
+
+ gtk_text_buffer_select_range(buffer, &chr_start, &chr_end);
+ }
+
+ if (gtk_text_buffer_get_selection_bounds(gtk_text_view_get_buffer(GTK_TEXT_VIEW(logwin->text)), &chr_start, &chr_end))
+ {
+ sel_text = gtk_text_buffer_get_text( gtk_text_view_get_buffer(GTK_TEXT_VIEW(logwin->text)), &chr_start, &chr_end, FALSE);
+
+ cmd_line = g_strconcat(options->log_window.action, " ", sel_text, NULL);
+
+ runcmd(cmd_line);
+
+ g_free(sel_text);
+ g_free(cmd_line);
+ }
+ }
+ }
+
return FALSE;
}