C-/ for forward-search C-? for backward-search
This commit is contained in:
parent
613977132f
commit
f5b0bebd42
27
term.c
27
term.c
|
@ -6,9 +6,15 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
enum search_direction {
|
||||||
|
search_forward,
|
||||||
|
search_backward
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct search_dialog_info {
|
typedef struct search_dialog_info {
|
||||||
GtkWidget *vte;
|
GtkWidget *vte;
|
||||||
GtkWidget *entry;
|
GtkWidget *entry;
|
||||||
|
enum search_direction direction;
|
||||||
} search_dialog_info;
|
} search_dialog_info;
|
||||||
|
|
||||||
static void search_response_cb(GtkDialog *dialog, gint response_id, search_dialog_info *info) {
|
static void search_response_cb(GtkDialog *dialog, gint response_id, search_dialog_info *info) {
|
||||||
|
@ -16,14 +22,21 @@ static void search_response_cb(GtkDialog *dialog, gint response_id, search_dialo
|
||||||
if (!regex) regex = g_regex_new(gtk_entry_get_text(GTK_ENTRY(info->entry)), 0, 0, NULL);
|
if (!regex) regex = g_regex_new(gtk_entry_get_text(GTK_ENTRY(info->entry)), 0, 0, NULL);
|
||||||
vte_terminal_search_set_gregex(VTE_TERMINAL(info->vte), regex);
|
vte_terminal_search_set_gregex(VTE_TERMINAL(info->vte), regex);
|
||||||
|
|
||||||
|
if (info->direction == search_forward) {
|
||||||
|
vte_terminal_search_find_next(VTE_TERMINAL(info->vte));
|
||||||
|
} else {
|
||||||
|
vte_terminal_search_find_previous(VTE_TERMINAL(info->vte));
|
||||||
|
}
|
||||||
|
|
||||||
free(info);
|
free(info);
|
||||||
gtk_widget_destroy(GTK_WIDGET(dialog));
|
gtk_widget_destroy(GTK_WIDGET(dialog));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void open_search_dialog(GtkWidget *vte) {
|
static void open_search_dialog(GtkWidget *vte, enum search_direction direction) {
|
||||||
search_dialog_info *info = malloc(sizeof (info));
|
search_dialog_info *info = malloc(sizeof (info));
|
||||||
info->vte = vte;
|
info->vte = vte;
|
||||||
info->entry = gtk_entry_new();
|
info->entry = gtk_entry_new();
|
||||||
|
info->direction = direction;
|
||||||
|
|
||||||
GtkWidget *dialog, *content_area;
|
GtkWidget *dialog, *content_area;
|
||||||
dialog = gtk_dialog_new_with_buttons("Search",
|
dialog = gtk_dialog_new_with_buttons("Search",
|
||||||
|
@ -44,7 +57,9 @@ static void open_search_dialog(GtkWidget *vte) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean key_press_cb(GtkWidget *vte, GdkEventKey *event) {
|
static gboolean key_press_cb(GtkWidget *vte, GdkEventKey *event) {
|
||||||
if (event->state == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
|
const GdkModifierType modifiers = event->state & gtk_accelerator_get_default_mod_mask();
|
||||||
|
|
||||||
|
if (modifiers == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
|
||||||
switch (gdk_keyval_to_lower(event->keyval)) {
|
switch (gdk_keyval_to_lower(event->keyval)) {
|
||||||
case GDK_p:
|
case GDK_p:
|
||||||
vte_terminal_search_find_previous(VTE_TERMINAL(vte));
|
vte_terminal_search_find_previous(VTE_TERMINAL(vte));
|
||||||
|
@ -52,11 +67,15 @@ static gboolean key_press_cb(GtkWidget *vte, GdkEventKey *event) {
|
||||||
case GDK_n:
|
case GDK_n:
|
||||||
vte_terminal_search_find_next(VTE_TERMINAL(vte));
|
vte_terminal_search_find_next(VTE_TERMINAL(vte));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
case GDK_f:
|
case GDK_question:
|
||||||
open_search_dialog(vte);
|
open_search_dialog(vte, search_backward);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (modifiers == GDK_CONTROL_MASK && event->keyval == GDK_slash) {
|
||||||
|
open_search_dialog(vte, search_forward);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue