[gnome-mud] Input History Patch



Hi all,

Here's a small patch that adds support for input history to gmud.

The keys are bound to Up and Down for the moment.  It works something
like a shell in as much as you hit the up key to go back through the
input history and down to go forward through it.

Les
Index: src/mud-connection-view.c
===================================================================
--- src/mud-connection-view.c	(revision 662)
+++ src/mud-connection-view.c	(working copy)
@@ -24,6 +24,7 @@
 #include <glib-object.h>
 #include <glib/gi18n.h>
 #include <gtk/gtkmenu.h>
+#include <glib/gqueue.h>
 #include <vte/vte.h>
 
 #include "gnome-mud.h"
@@ -60,6 +61,9 @@
 	gchar *connect_string;
 
 	MudParseBase *parse;
+	
+	GQueue *history;
+	guint current_history_index;
 };
 
 static void mud_connection_view_init                     (MudConnectionView *connection_view);
@@ -300,10 +304,13 @@
 mud_connection_view_init (MudConnectionView *connection_view)
 {
 	GtkWidget *box;
-
+    
   	connection_view->priv = g_new0(MudConnectionViewPrivate, 1);
   	//FIXME connection_view->priv->prefs = mud_preferences_new(NULL);
   
+    connection_view->priv->history = g_queue_new();
+    connection_view->priv->current_history_index = 0;
+  
 	connection_view->priv->parse = mud_parse_base_new(connection_view);
 	
 	connection_view->priv->connect_hook = FALSE;
@@ -354,13 +361,21 @@
 {
 	MudConnectionView *connection_view;
 	GObjectClass *parent_class;
+	gchar *history_item;
 
 	connection_view = MUD_CONNECTION_VIEW(object);
 
+    while((history_item = (gchar *)g_queue_pop_head(connection_view->priv->history)) != NULL)
+        if(history_item != NULL)
+            g_free(history_item);
+            
+    if(connection_view->priv->history)
+        g_queue_free(connection_view->priv->history);
+        
 	gnetwork_connection_close(GNETWORK_CONNECTION(connection_view->connection));
 	g_object_unref(connection_view->connection);
 	g_free(connection_view->priv);
-
+    
 	parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
 	parent_class->finalize(object);
 }
@@ -486,6 +501,9 @@
 	GList *commands, *command;
 	gchar *text;
 
+    g_queue_push_head(view->priv->history, (gpointer)g_strdup(data));
+    view->priv->current_history_index = 0;
+    
 	commands = mud_profile_process_commands(view->priv->profile, data);
 	
 	for (command = g_list_first(commands); command != NULL; command = command->next)
@@ -796,3 +814,24 @@
 {
 	return view->priv->parse;
 }
+
+gchar *
+mud_connection_view_get_history_item(MudConnectionView *view, enum
+MudConnectionHistoryDirection direction)
+{
+    gchar *history_item;
+    
+    if(direction == HISTORY_DOWN)
+        if(view->priv->current_history_index != 0)
+            view->priv->current_history_index--;
+            
+    history_item = (gchar *)g_queue_peek_nth(view->priv->history,
+                            view->priv->current_history_index);
+                            
+    if(direction == HISTORY_UP)
+        if(view->priv->current_history_index < 
+            g_queue_get_length(view->priv->history) - 1)
+                view->priv->current_history_index++;
+    
+    return history_item;
+}
Index: src/mud-connection-view.h
===================================================================
--- src/mud-connection-view.h	(revision 662)
+++ src/mud-connection-view.h	(working copy)
@@ -40,6 +40,12 @@
 	System
 };
 
+enum MudConnectionHistoryDirection
+{
+    HISTORY_UP,
+    HISTORY_DOWN
+};
+
 GType mud_connection_view_get_type (void) G_GNUC_CONST;
 
 MudConnectionView* mud_connection_view_new (const gchar *profile, const gchar *hostname, const gint port, GtkWidget *window, GtkWidget *tray, gchar *name);
@@ -51,6 +57,8 @@
 void mud_connection_view_set_connect_string(MudConnectionView *view, gchar *connect_string);
 void mud_connection_view_set_id(MudConnectionView *view, gint id);
 void mud_connection_view_add_text(MudConnectionView *view, gchar *message, enum MudConnectionColorType type);
+gchar *mud_connection_view_get_history_item(MudConnectionView *view, enum
+MudConnectionHistoryDirection direction);
 
 #include "mud-profile.h"
 void mud_connection_view_set_profile(MudConnectionView *view, MudProfile *profile);
Index: src/mud-window.c
===================================================================
--- src/mud-window.c	(revision 662)
+++ src/mud-window.c	(working copy)
@@ -275,10 +275,34 @@
 		else
 			gtk_text_buffer_select_range(buffer, &start, &end);
 
-		free(text);
+		g_free(text);
 
 		return TRUE;
 	}
+	
+	if(event->keyval == GDK_Up)
+	{
+	    text = mud_connection_view_get_history_item(
+	        MUD_CONNECTION_VIEW(window->priv->current_view), HISTORY_UP);
+	    
+	    gtk_text_buffer_set_text(buffer, text, strlen(text));
+	    gtk_text_buffer_get_bounds(buffer, &start, &end);
+	    gtk_text_buffer_select_range(buffer, &start, &end);
+	    
+	    return TRUE;
+	}
+	
+	if(event->keyval == GDK_Down)
+	{
+	    text = mud_connection_view_get_history_item(
+	        MUD_CONNECTION_VIEW(window->priv->current_view), HISTORY_DOWN);
+	    
+	    gtk_text_buffer_set_text(buffer, text, strlen(text));
+	    gtk_text_buffer_get_bounds(buffer, &start, &end);
+	    gtk_text_buffer_select_range(buffer, &start, &end);
+	    
+	    return TRUE;
+	}
 
 	return FALSE;
 }
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 662)
+++ ChangeLog	(working copy)
@@ -1,3 +1,7 @@
+2008-06-17  Les Harris  <me lesharris com>
+    * src/mud-window.c, src/mud-connection-view.c, src/mud-connection-view.h:
+    Added in input history support for our text entry widget.
+
 2007-07-13  Jordi Mallach  <jordi sindominio net>
 
 	* configure.ac, Makefile.am: Prepare for icon changes.
Index: MAINTAINERS
===================================================================
--- MAINTAINERS	(revision 662)
+++ MAINTAINERS	(working copy)
@@ -8,7 +8,7 @@
 Email: seven-nation army com
 
 Les Harris
-Email: lescom comcast net
+Email: me lesharris com
 
 Mart Raudsepp
 Email: leio gentoo org


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]