Command history

Added following functionality:
  * Command history

Fixes and other changes:
  * Reduced the toggle inputbar code
This commit is contained in:
Moritz Lipp 2009-09-19 15:53:35 +02:00
parent 582f926b82
commit 8f8ffb5e9d
2 changed files with 44 additions and 13 deletions

View file

@ -66,6 +66,8 @@ Shortcut shortcuts[] = {
{0, GDK_z, sc_focus_inputbar, { .data = ":zoom " } }, {0, GDK_z, sc_focus_inputbar, { .data = ":zoom " } },
{0, GDK_g, sc_focus_inputbar, { .data = ":goto " } }, {0, GDK_g, sc_focus_inputbar, { .data = ":goto " } },
{0, GDK_slash, sc_focus_inputbar, { .data = "/" } }, {0, GDK_slash, sc_focus_inputbar, { .data = "/" } },
{0, GDK_Up, sc_focus_inputbar, {0} },
{0, GDK_Down, sc_focus_inputbar, {0} },
}; };
/* commands */ /* commands */

View file

@ -24,6 +24,7 @@ struct
GtkWidget *drawing_area; GtkWidget *drawing_area;
GtkBox *notification; GtkBox *notification;
GtkEntry *inputbar; GtkEntry *inputbar;
GList *history;
struct struct
{ {
@ -81,6 +82,7 @@ typedef struct
/* function declarations */ /* function declarations */
void init(); void init();
void history(int);
void update_title(); void update_title();
void update_status(); void update_status();
void set_page(int); void set_page(int);
@ -216,6 +218,26 @@ init()
gtk_widget_modify_font(GTK_WIDGET(Zathura.inputbar), Zathura.Settings.font); gtk_widget_modify_font(GTK_WIDGET(Zathura.inputbar), Zathura.Settings.font);
} }
void
history(int direction)
{
static int current = 0;
int length = g_list_length(Zathura.history);
if(length > 0)
{
if(direction == NEXT)
current = (length + current + 1) % length;
else
current = (length + current - 1) % length;
char* command = (char*) g_list_nth_data(Zathura.history, current);
gtk_widget_grab_focus(GTK_WIDGET(Zathura.inputbar));
gtk_entry_set_text(Zathura.inputbar, command);
gtk_editable_set_position(GTK_EDITABLE(Zathura.inputbar), -1);
}
}
void void
update_title() update_title()
{ {
@ -619,12 +641,19 @@ complete(Argument* argument)
void void
sc_focus_inputbar(Argument *argument) sc_focus_inputbar(Argument *argument)
{ {
if(argument->data)
gtk_entry_set_text(Zathura.inputbar, argument->data); gtk_entry_set_text(Zathura.inputbar, argument->data);
else
history(PREVIOUS);
gtk_widget_modify_text(GTK_WIDGET(Zathura.inputbar), GTK_STATE_NORMAL, &(Zathura.Settings.inputbar_fg)); gtk_widget_modify_text(GTK_WIDGET(Zathura.inputbar), GTK_STATE_NORMAL, &(Zathura.Settings.inputbar_fg));
gtk_widget_modify_base(GTK_WIDGET(Zathura.inputbar), GTK_STATE_NORMAL, &(Zathura.Settings.inputbar_bg)); gtk_widget_modify_base(GTK_WIDGET(Zathura.inputbar), GTK_STATE_NORMAL, &(Zathura.Settings.inputbar_bg));
if(argument->data)
{
gtk_widget_grab_focus(GTK_WIDGET(Zathura.inputbar)); gtk_widget_grab_focus(GTK_WIDGET(Zathura.inputbar));
gtk_editable_set_position(GTK_EDITABLE(Zathura.inputbar), -1); gtk_editable_set_position(GTK_EDITABLE(Zathura.inputbar), -1);
}
} }
void void
@ -781,18 +810,10 @@ sc_search(Argument *argument)
void void
sc_toggle_inputbar(Argument *argument) sc_toggle_inputbar(Argument *argument)
{ {
static gboolean visible = TRUE; if(GTK_WIDGET_VISIBLE(GTK_WIDGET(Zathura.inputbar)))
if(visible)
{
gtk_widget_hide(GTK_WIDGET(Zathura.inputbar)); gtk_widget_hide(GTK_WIDGET(Zathura.inputbar));
visible = FALSE;
}
else else
{
gtk_widget_show(GTK_WIDGET(Zathura.inputbar)); gtk_widget_show(GTK_WIDGET(Zathura.inputbar));
visible = TRUE;
}
cb_draw(Zathura.drawing_area, NULL); cb_draw(Zathura.drawing_area, NULL);
} }
@ -1210,6 +1231,8 @@ cb_inputbar_activate(GtkEntry* entry, gpointer data)
if(!success) if(!success)
notify(ERROR, g_strdup_printf("\"%s\" is not a valid command", command)); notify(ERROR, g_strdup_printf("\"%s\" is not a valid command", command));
Zathura.history = g_list_append(Zathura.history, (char*) g_strdup(gtk_entry_get_text(entry)));
update_status(); update_status();
g_strfreev(tokens); g_strfreev(tokens);
gtk_widget_grab_focus(GTK_WIDGET(Zathura.view)); gtk_widget_grab_focus(GTK_WIDGET(Zathura.view));
@ -1317,6 +1340,12 @@ cb_inputbar_key_pressed(GtkEntry* entry, GdkEventKey *event, gpointer data)
case GDK_ISO_Left_Tab: case GDK_ISO_Left_Tab:
argument.n = PREVIOUS; argument.n = PREVIOUS;
return complete(&argument); return complete(&argument);
case GDK_Up:
history(PREVIOUS);
return TRUE;
case GDK_Down:
history(NEXT);
return TRUE;
} }
return FALSE; return FALSE;