From d67fb05aeb718cb7c175c838873af4965ef042ea Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Fri, 10 Mar 2006 05:26:11 +0000
Subject: [PATCH] Navigation works. Loading data on the personal page works.
 This is now (effectively) a user browser.

---
 src/sbbs3/gtkuseredit/GNUmakefile       |   8 +-
 src/sbbs3/gtkuseredit/events.c          | 185 +++++++++++++++++++
 src/sbbs3/gtkuseredit/events.h          |   1 +
 src/sbbs3/gtkuseredit/gtkuseredit.c     |  69 ++++++-
 src/sbbs3/gtkuseredit/gtkuseredit.glade | 236 ++++++++++--------------
 src/sbbs3/gtkuseredit/gtkuseredit.h     |  15 ++
 src/sbbs3/gtkuseredit/objects.mk        |   1 +
 7 files changed, 372 insertions(+), 143 deletions(-)
 create mode 100644 src/sbbs3/gtkuseredit/events.c
 create mode 100644 src/sbbs3/gtkuseredit/events.h
 create mode 100644 src/sbbs3/gtkuseredit/gtkuseredit.h

diff --git a/src/sbbs3/gtkuseredit/GNUmakefile b/src/sbbs3/gtkuseredit/GNUmakefile
index b0da89a861..dd5290a413 100644
--- a/src/sbbs3/gtkuseredit/GNUmakefile
+++ b/src/sbbs3/gtkuseredit/GNUmakefile
@@ -15,6 +15,7 @@
 
 SRC_ROOT	=	../..
 include $(SRC_ROOT)/build/Common.gmake
+include $(SRC_ROOT)/sbbs3/sbbsdefs.mk
 
 ifeq ($(os),sunos)
  LDFLAGS	+=	-lnsl
@@ -22,9 +23,10 @@ endif
 
 vpath %.c ..
 
-CFLAGS	+=	-I.. $(SMBLIB_CFLAGS) $(XPDEV-MT_CFLAGS) `pkg-config libglade-2.0 --cflags`
-LDFLAGS	+=	$(SMBLIB_LDFLAGS) $(XPDEV-MT_LDFLAGS) $(MT_LDFLAGS) `pkg-config libglade-2.0 --libs`
+CFLAGS	+=	$(SBBSDEFS) -I.. $(SMBLIB_CFLAGS) $(XPDEV-MT_CFLAGS) `pkg-config libglade-2.0 --cflags`
+# Hopefully, -Wl,-E exports all symbols dynamically everywhere.
+LDFLAGS	+=	-Wl,-E -L../$(LIBODIR) $(SMBLIB_LDFLAGS) $(XPDEV-MT_LDFLAGS) $(MT_LDFLAGS) `pkg-config libglade-2.0 --libs`
 
 $(GTKUSEREDIT): $(OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(LDFLAGS) $(OBJS) -o $@ $(SMBLIB_LIBS) $(XPDEV-MT_LIBS)
+	$(QUIET)$(CC) $(LDFLAGS) $(OBJS) -o $@ -lsbbs $(SMBLIB_LIBS) $(XPDEV-MT_LIBS)
diff --git a/src/sbbs3/gtkuseredit/events.c b/src/sbbs3/gtkuseredit/events.c
new file mode 100644
index 0000000000..67bae62244
--- /dev/null
+++ b/src/sbbs3/gtkuseredit/events.c
@@ -0,0 +1,185 @@
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+
+#include "sbbs.h"
+#include "dirwrap.h"
+
+#include "gtkuseredit.h"
+
+/* 
+ * This is one of the two big gruntwork functions
+ * (the other being save_user)
+ */
+void load_user(GtkWidget *wiggy, gpointer data)
+{
+	GtkWidget	*w;
+	char		str[1024];
+
+	user.number=current_user;
+	if(user.number < 1 || user.number > totalusers) {
+		fprintf(stderr,"Attempted to load illegal user number %d.\n",user.number);
+		return;
+	}
+	if(getuserdat(&cfg, &user)) {
+		fprintf(stderr,"Error loading user %d.\n",current_user);
+		return;
+	}
+
+	/* Alias */
+	w=glade_xml_get_widget(xml, "eUserAlias");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the alias widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.alias);
+
+	/* Real Name */
+	w=glade_xml_get_widget(xml, "eRealName");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the real name widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.name);
+
+	/* Computer */
+	w=glade_xml_get_widget(xml, "eComputer");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the computer widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.comp);
+
+	/* NetMail */
+	w=glade_xml_get_widget(xml, "eNetMail");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the netmail widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.netmail);
+
+	/* Phone */
+	w=glade_xml_get_widget(xml, "ePhone");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the phone widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.phone);
+
+	/* Note */
+	w=glade_xml_get_widget(xml, "eNote");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the note widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.note);
+
+	/* Comment */
+	w=glade_xml_get_widget(xml, "eComment");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the comment widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.comment);
+
+	/* Gender */
+	w=glade_xml_get_widget(xml, "eGender");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the gender widget\n");
+	else {
+		str[0]=user.sex;
+		str[1]=0;
+		gtk_entry_set_text(GTK_ENTRY(w),str);
+	}
+
+	/* Connection */
+	w=glade_xml_get_widget(xml, "eConnection");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the connection widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.modem);
+
+	/* Chat Handle */
+	w=glade_xml_get_widget(xml, "eHandle");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the handle widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.handle);
+
+	/* Birthdate */
+	w=glade_xml_get_widget(xml, "eBirthdate");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the birthdate widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.birth);
+
+	/* Password */
+	w=glade_xml_get_widget(xml, "ePassword");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the password widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.pass);
+
+	/* Address */
+	w=glade_xml_get_widget(xml, "eAddress");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the address widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.address);
+
+	/* Location */
+	w=glade_xml_get_widget(xml, "eLocation");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the location widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.location);
+
+	/* Postal/ZIP code */
+	w=glade_xml_get_widget(xml, "eZip");
+	if(w==NULL)
+		fprintf(stderr,"Cannot get the postal/zip code widget\n");
+	else
+		gtk_entry_set_text(GTK_ENTRY(w),user.zipcode);
+}
+
+int update_current_user(int new_user)
+{
+	char	str[11];
+	GtkWidget	*eCurrentUser;
+
+	if(new_user<1 || new_user>totalusers)
+		new_user=current_user;
+	sprintf(str,"%d",new_user);
+	eCurrentUser=glade_xml_get_widget(xml, "eCurrentUser");
+	if(eCurrentUser==NULL) {
+		fprintf(stderr,"Cannot get the current user widget\n");
+		return(-1);
+	}
+	if(strcmp(gtk_entry_get_text(GTK_ENTRY(eCurrentUser)),str))
+		gtk_entry_set_text(GTK_ENTRY(eCurrentUser), str);
+	if(new_user!=current_user) {
+		current_user=new_user;
+		load_user(eCurrentUser,NULL);
+	}
+	return(0);
+}
+
+void current_user_changed(GtkWidget *w, gpointer data)
+{
+	int new_user;
+
+	new_user=atoi(gtk_entry_get_text(GTK_ENTRY(w)));
+	update_current_user(new_user);
+}
+
+void first_user(GtkWidget *w, gpointer data)
+{
+	update_current_user(1);
+}
+
+void prev_user(GtkWidget *w, gpointer data)
+{
+	update_current_user(current_user-1);
+}
+
+void next_user(GtkWidget *w, gpointer data)
+{
+	update_current_user(current_user+1);
+}
+
+void last_user(GtkWidget *w, gpointer data)
+{
+	update_current_user(totalusers);
+}
diff --git a/src/sbbs3/gtkuseredit/events.h b/src/sbbs3/gtkuseredit/events.h
new file mode 100644
index 0000000000..34f5f8d305
--- /dev/null
+++ b/src/sbbs3/gtkuseredit/events.h
@@ -0,0 +1 @@
+int update_current_user(int new_user);
diff --git a/src/sbbs3/gtkuseredit/gtkuseredit.c b/src/sbbs3/gtkuseredit/gtkuseredit.c
index a4782967ba..ece6bcf8b9 100644
--- a/src/sbbs3/gtkuseredit/gtkuseredit.c
+++ b/src/sbbs3/gtkuseredit/gtkuseredit.c
@@ -1,16 +1,79 @@
 #include <gtk/gtk.h>
 #include <glade/glade.h>
 
-int main(int argc, char *argv[]) {
-    GladeXML *xml;
+#include "sbbs.h"
+#include "dirwrap.h"
+
+#include "events.h"
+#include "gtkuseredit.h"
+
+scfg_t	cfg;
+user_t	user;
+GladeXML *xml;
+int		totalusers=0;
+int		current_user=0;
+
+/* Refreshes global variables... ie: Number of users */
+int refresh_globals(void)
+{
+	gchar		newlabel[14];
+	GtkWidget	*lTotalUsers;
+
+	totalusers=lastuser(&cfg);
+	sprintf(newlabel,"of %d",totalusers);
+	lTotalUsers=glade_xml_get_widget(xml, "lTotalUsers");
+	if(lTotalUsers==NULL) {
+		fprintf(stderr,"Cannot get the total users widget\n");
+		return(-1);
+	}
+	gtk_label_set_text(GTK_LABEL(lTotalUsers), newlabel);
+	return(0);
+}
+
+/* Initializes global stuff, loads first user etc */
+int read_config(void)
+{
+	char	ctrl_dir[MAX_PATH+1];
+	char	str[1024];
+	char	*p;
 
+	p=getenv("SBBSCTRL");
+	if(p==NULL) {
+		fprintf(stderr,"SBBSCTRL not set\n");
+		return(-1);
+	}
+	SAFECOPY(ctrl_dir, p);
+	prep_dir("",ctrl_dir,sizeof(ctrl_dir));
+	if(!isdir(ctrl_dir)) {
+		fprintf(stderr,"SBBSCTRL does not point to a directory\n");
+		return(-1);
+	}
+    /* Read .cfg files here */
+    memset(&cfg,0,sizeof(cfg));
+    cfg.size=sizeof(cfg);
+    SAFECOPY(cfg.ctrl_dir,ctrl_dir);
+    if(!load_cfg(&cfg, NULL, TRUE, str)) {
+		fprintf(stderr,"Cannot load configuration data\n");
+        return(-1);
+	}
+	if(refresh_globals())
+		return(-1);
+	if(totalusers > 0)
+		update_current_user(1);
+	return(0);
+}
+
+int main(int argc, char *argv[]) {
     gtk_init(&argc, &argv);
     glade_init();
 
     /* load the interface */
-    xml = glade_xml_new("gtkuseredit.glade", NULL, NULL);
+    xml = glade_xml_new("gtkuseredit.glade", "MainWindow", NULL);
     /* connect the signals in the interface */
     glade_xml_signal_autoconnect(xml);
+	/* Set up the global config stuff. */
+	if(read_config())
+		return(1);
     /* start the event loop */
     gtk_main();
     return 0;
diff --git a/src/sbbs3/gtkuseredit/gtkuseredit.glade b/src/sbbs3/gtkuseredit/gtkuseredit.glade
index c00043de5b..07795ed384 100644
--- a/src/sbbs3/gtkuseredit/gtkuseredit.glade
+++ b/src/sbbs3/gtkuseredit/gtkuseredit.glade
@@ -11,6 +11,7 @@
   <property name="modal">False</property>
   <property name="resizable">True</property>
   <property name="destroy_with_parent">False</property>
+  <property name="icon_name">gtk-execute</property>
   <property name="decorated">True</property>
   <property name="skip_taskbar_hint">False</property>
   <property name="skip_pager_hint">False</property>
@@ -18,6 +19,7 @@
   <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
   <property name="focus_on_map">True</property>
   <property name="urgency_hint">False</property>
+  <signal name="destroy" handler="gtk_main_quit" last_modification_time="Fri, 10 Mar 2006 02:32:02 GMT"/>
 
   <child>
     <widget class="GtkVBox" id="vbox1">
@@ -45,7 +47,7 @@
 		      <property name="visible">True</property>
 		      <property name="label">gtk-new</property>
 		      <property name="use_stock">True</property>
-		      <signal name="activate" handler="on_new1_activate" last_modification_time="Thu, 09 Mar 2006 21:02:51 GMT"/>
+		      <signal name="activate" handler="new_user" last_modification_time="Fri, 10 Mar 2006 02:20:53 GMT"/>
 		    </widget>
 		  </child>
 
@@ -54,7 +56,7 @@
 		      <property name="visible">True</property>
 		      <property name="label">gtk-save</property>
 		      <property name="use_stock">True</property>
-		      <signal name="activate" handler="on_save1_activate" last_modification_time="Thu, 09 Mar 2006 21:02:51 GMT"/>
+		      <signal name="activate" handler="save_user" last_modification_time="Fri, 10 Mar 2006 02:20:53 GMT"/>
 		    </widget>
 		  </child>
 
@@ -63,7 +65,7 @@
 		      <property name="visible">True</property>
 		      <property name="label">gtk-refresh</property>
 		      <property name="use_stock">True</property>
-		      <signal name="activate" handler="on_save_as1_activate" last_modification_time="Thu, 09 Mar 2006 21:02:51 GMT"/>
+		      <signal name="activate" handler="load_user" last_modification_time="Fri, 10 Mar 2006 02:20:53 GMT"/>
 		    </widget>
 		  </child>
 
@@ -72,7 +74,7 @@
 		      <property name="visible">True</property>
 		      <property name="label">gtk-delete</property>
 		      <property name="use_stock">True</property>
-		      <signal name="activate" handler="on_delete2_activate" last_modification_time="Thu, 09 Mar 2006 21:16:16 GMT"/>
+		      <signal name="activate" handler="delete_user" last_modification_time="Fri, 10 Mar 2006 02:20:53 GMT"/>
 		    </widget>
 		  </child>
 
@@ -81,7 +83,7 @@
 		      <property name="visible">True</property>
 		      <property name="label">gtk-remove</property>
 		      <property name="use_stock">True</property>
-		      <signal name="activate" handler="on_remove1_activate" last_modification_time="Thu, 09 Mar 2006 21:16:16 GMT"/>
+		      <signal name="activate" handler="disable_user" last_modification_time="Fri, 10 Mar 2006 02:20:53 GMT"/>
 		    </widget>
 		  </child>
 
@@ -96,7 +98,7 @@
 		      <property name="visible">True</property>
 		      <property name="label">gtk-quit</property>
 		      <property name="use_stock">True</property>
-		      <signal name="activate" handler="on_quit1_activate" last_modification_time="Thu, 09 Mar 2006 21:02:51 GMT"/>
+		      <signal name="activate" handler="gtk_main_quit" last_modification_time="Fri, 10 Mar 2006 02:20:53 GMT"/>
 		    </widget>
 		  </child>
 		</widget>
@@ -114,11 +116,11 @@
 		<widget class="GtkMenu" id="menuitem4_menu">
 
 		  <child>
-		    <widget class="GtkMenuItem" id="about1">
+		    <widget class="GtkImageMenuItem" id="about1">
 		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">_About</property>
-		      <property name="use_underline">True</property>
-		      <signal name="activate" handler="on_about1_activate" last_modification_time="Thu, 09 Mar 2006 21:02:51 GMT"/>
+		      <property name="label">gtk-about</property>
+		      <property name="use_stock">True</property>
+		      <signal name="activate" handler="show_about_box" last_modification_time="Fri, 10 Mar 2006 02:20:53 GMT"/>
 		    </widget>
 		  </child>
 		</widget>
@@ -144,10 +146,13 @@
 	  <child>
 	    <widget class="GtkToolButton" id="newuserbutton">
 	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">New</property>
+	      <property name="use_underline">True</property>
 	      <property name="stock_id">gtk-new</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">True</property>
+	      <signal name="clicked" handler="new_user" last_modification_time="Fri, 10 Mar 2006 02:22:12 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -156,12 +161,15 @@
 	  </child>
 
 	  <child>
-	    <widget class="GtkToolButton" id="toolbutton8">
+	    <widget class="GtkToolButton" id="bSaveUser">
 	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Save</property>
+	      <property name="use_underline">True</property>
 	      <property name="stock_id">gtk-save</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">True</property>
+	      <signal name="clicked" handler="save_user" last_modification_time="Fri, 10 Mar 2006 02:22:50 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -172,10 +180,13 @@
 	  <child>
 	    <widget class="GtkToolButton" id="toolbutton9">
 	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Refresh</property>
+	      <property name="use_underline">True</property>
 	      <property name="stock_id">gtk-refresh</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">True</property>
+	      <signal name="clicked" handler="load_user" last_modification_time="Fri, 10 Mar 2006 02:23:25 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -186,10 +197,13 @@
 	  <child>
 	    <widget class="GtkToolButton" id="toolbutton10">
 	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Delete</property>
+	      <property name="use_underline">True</property>
 	      <property name="stock_id">gtk-delete</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">True</property>
+	      <signal name="clicked" handler="delete_user" last_modification_time="Fri, 10 Mar 2006 02:24:05 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -204,6 +218,7 @@
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">True</property>
+	      <signal name="clicked" handler="disable_user" last_modification_time="Fri, 10 Mar 2006 02:25:11 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -254,56 +269,19 @@
 	  <child>
 	    <widget class="GtkToolButton" id="toolbutton12">
 	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Find</property>
+	      <property name="use_underline">True</property>
 	      <property name="stock_id">gtk-find</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">True</property>
+	      <signal name="clicked" handler="find_user" last_modification_time="Fri, 10 Mar 2006 02:26:06 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
 	      <property name="homogeneous">True</property>
 	    </packing>
 	  </child>
-
-	  <child>
-	    <widget class="GtkSeparatorToolItem" id="separatortoolitem2">
-	      <property name="visible">True</property>
-	      <property name="draw">True</property>
-	      <property name="visible_horizontal">True</property>
-	      <property name="visible_vertical">True</property>
-	    </widget>
-	    <packing>
-	      <property name="expand">False</property>
-	      <property name="homogeneous">False</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkToolItem" id="toolitem3">
-	      <property name="visible">True</property>
-	      <property name="visible_horizontal">True</property>
-	      <property name="visible_vertical">True</property>
-	      <property name="is_important">False</property>
-
-	      <child>
-		<widget class="GtkEntry" id="entry3">
-		  <property name="visible">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="editable">True</property>
-		  <property name="visibility">True</property>
-		  <property name="max_length">0</property>
-		  <property name="text" translatable="yes"></property>
-		  <property name="has_frame">True</property>
-		  <property name="invisible_char">*</property>
-		  <property name="activates_default">False</property>
-		</widget>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="expand">False</property>
-	      <property name="homogeneous">False</property>
-	    </packing>
-	  </child>
 	</widget>
 	<packing>
 	  <property name="padding">0</property>
@@ -344,7 +322,7 @@
 	  </child>
 
 	  <child>
-	    <widget class="GtkEntry" id="entry4">
+	    <widget class="GtkEntry" id="eUserAlias">
 	      <property name="visible">True</property>
 	      <property name="can_focus">True</property>
 	      <property name="editable">True</property>
@@ -362,71 +340,6 @@
 	      <property name="fill">False</property>
 	    </packing>
 	  </child>
-
-	  <child>
-	    <widget class="GtkLabel" id="label8">
-	      <property name="visible">True</property>
-	      <property name="label" translatable="yes">Number</property>
-	      <property name="use_underline">False</property>
-	      <property name="use_markup">False</property>
-	      <property name="justify">GTK_JUSTIFY_LEFT</property>
-	      <property name="wrap">False</property>
-	      <property name="selectable">False</property>
-	      <property name="xalign">0.5</property>
-	      <property name="yalign">0.5</property>
-	      <property name="xpad">0</property>
-	      <property name="ypad">0</property>
-	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	      <property name="width_chars">-1</property>
-	      <property name="single_line_mode">False</property>
-	      <property name="angle">0</property>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkEntry" id="entry5">
-	      <property name="visible">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="editable">True</property>
-	      <property name="visibility">True</property>
-	      <property name="max_length">5</property>
-	      <property name="text" translatable="yes"></property>
-	      <property name="has_frame">True</property>
-	      <property name="invisible_char">*</property>
-	      <property name="activates_default">False</property>
-	      <property name="width_chars">5</property>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkEntry" id="entry6">
-	      <property name="visible">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="editable">False</property>
-	      <property name="visibility">True</property>
-	      <property name="max_length">8</property>
-	      <property name="text" translatable="yes"></property>
-	      <property name="has_frame">True</property>
-	      <property name="invisible_char">*</property>
-	      <property name="activates_default">False</property>
-	      <property name="width_chars">8</property>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
 	</widget>
 	<packing>
 	  <property name="padding">0</property>
@@ -775,7 +688,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry7">
+			<widget class="GtkEntry" id="eRealName">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -815,7 +728,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry8">
+			<widget class="GtkEntry" id="eComputer">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -855,7 +768,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry9">
+			<widget class="GtkEntry" id="eNetMail">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -895,7 +808,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry10">
+			<widget class="GtkEntry" id="ePhone">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -935,7 +848,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry11">
+			<widget class="GtkEntry" id="eNote">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -975,7 +888,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry17">
+			<widget class="GtkEntry" id="eComment">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -1015,7 +928,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry12">
+			<widget class="GtkEntry" id="eGender">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -1055,7 +968,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry13">
+			<widget class="GtkEntry" id="eConnection">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -1095,7 +1008,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry14">
+			<widget class="GtkEntry" id="eHandle">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -1135,7 +1048,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry15">
+			<widget class="GtkEntry" id="eBirthdate">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -1175,7 +1088,7 @@
 		      <property name="spacing">0</property>
 
 		      <child>
-			<widget class="GtkEntry" id="entry16">
+			<widget class="GtkEntry" id="ePassword">
 			  <property name="visible">True</property>
 			  <property name="can_focus">True</property>
 			  <property name="editable">True</property>
@@ -1254,7 +1167,7 @@
 			      <property name="column_spacing">0</property>
 
 			      <child>
-				<widget class="GtkEntry" id="entry21">
+				<widget class="GtkEntry" id="eAddress">
 				  <property name="visible">True</property>
 				  <property name="can_focus">True</property>
 				  <property name="editable">True</property>
@@ -1277,7 +1190,7 @@
 			      </child>
 
 			      <child>
-				<widget class="GtkEntry" id="entry22">
+				<widget class="GtkEntry" id="eZip">
 				  <property name="visible">True</property>
 				  <property name="can_focus">True</property>
 				  <property name="editable">True</property>
@@ -1300,7 +1213,7 @@
 			      </child>
 
 			      <child>
-				<widget class="GtkEntry" id="entry23">
+				<widget class="GtkEntry" id="eLocation">
 				  <property name="visible">True</property>
 				  <property name="can_focus">True</property>
 				  <property name="editable">True</property>
@@ -5304,12 +5217,13 @@ Item2</property>
 	  <property name="show_arrow">True</property>
 
 	  <child>
-	    <widget class="GtkToolButton" id="toolbutton14">
+	    <widget class="GtkToolButton" id="bFirstUser">
 	      <property name="visible">True</property>
 	      <property name="stock_id">gtk-goto-first</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">False</property>
+	      <signal name="clicked" handler="first_user" last_modification_time="Fri, 10 Mar 2006 02:26:52 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -5318,12 +5232,13 @@ Item2</property>
 	  </child>
 
 	  <child>
-	    <widget class="GtkToolButton" id="toolbutton15">
+	    <widget class="GtkToolButton" id="bPrevUser">
 	      <property name="visible">True</property>
 	      <property name="stock_id">gtk-go-back</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">False</property>
+	      <signal name="clicked" handler="prev_user" last_modification_time="Fri, 10 Mar 2006 02:27:58 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -5339,7 +5254,7 @@ Item2</property>
 	      <property name="is_important">False</property>
 
 	      <child>
-		<widget class="GtkEntry" id="entry53">
+		<widget class="GtkEntry" id="eCurrentUser">
 		  <property name="visible">True</property>
 		  <property name="can_focus">True</property>
 		  <property name="editable">True</property>
@@ -5350,6 +5265,7 @@ Item2</property>
 		  <property name="invisible_char">*</property>
 		  <property name="activates_default">False</property>
 		  <property name="width_chars">5</property>
+		  <signal name="focus_out_event" handler="current_user_changed" last_modification_time="Fri, 10 Mar 2006 04:46:51 GMT"/>
 		</widget>
 	      </child>
 	    </widget>
@@ -5367,7 +5283,7 @@ Item2</property>
 	      <property name="is_important">False</property>
 
 	      <child>
-		<widget class="GtkLabel" id="label61">
+		<widget class="GtkLabel" id="lTotalUsers">
 		  <property name="visible">True</property>
 		  <property name="label" translatable="yes">of 0</property>
 		  <property name="use_underline">False</property>
@@ -5393,12 +5309,13 @@ Item2</property>
 	  </child>
 
 	  <child>
-	    <widget class="GtkToolButton" id="toolbutton16">
+	    <widget class="GtkToolButton" id="bNextUser">
 	      <property name="visible">True</property>
 	      <property name="stock_id">gtk-go-forward</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">False</property>
+	      <signal name="clicked" handler="next_user" last_modification_time="Fri, 10 Mar 2006 02:28:14 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -5407,12 +5324,13 @@ Item2</property>
 	  </child>
 
 	  <child>
-	    <widget class="GtkToolButton" id="toolbutton17">
+	    <widget class="GtkToolButton" id="bLastUser">
 	      <property name="visible">True</property>
 	      <property name="stock_id">gtk-goto-last</property>
 	      <property name="visible_horizontal">True</property>
 	      <property name="visible_vertical">True</property>
 	      <property name="is_important">False</property>
+	      <signal name="clicked" handler="last_user" last_modification_time="Fri, 10 Mar 2006 02:28:25 GMT"/>
 	    </widget>
 	    <packing>
 	      <property name="expand">False</property>
@@ -5430,4 +5348,48 @@ Item2</property>
   </child>
 </widget>
 
+<widget class="GtkWindow" id="AboutWindow">
+  <property name="width_request">272</property>
+  <property name="height_request">118</property>
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">About Menu Editor</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">True</property>
+  <property name="icon_name">gtk-about</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkLabel" id="label73">
+      <property name="visible">True</property>
+      <property name="label" translatable="yes">GNU GPL, Copyright 2006, Rob Swindell.
+
+Written By Stephen Hurd
+
+Blah Blah Blah.</property>
+      <property name="use_underline">False</property>
+      <property name="use_markup">False</property>
+      <property name="justify">GTK_JUSTIFY_CENTER</property>
+      <property name="wrap">False</property>
+      <property name="selectable">False</property>
+      <property name="xalign">0.5</property>
+      <property name="yalign">0.5</property>
+      <property name="xpad">0</property>
+      <property name="ypad">0</property>
+      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+      <property name="width_chars">-1</property>
+      <property name="single_line_mode">False</property>
+      <property name="angle">0</property>
+    </widget>
+  </child>
+</widget>
+
 </glade-interface>
diff --git a/src/sbbs3/gtkuseredit/gtkuseredit.h b/src/sbbs3/gtkuseredit/gtkuseredit.h
new file mode 100644
index 0000000000..9cdc5bf437
--- /dev/null
+++ b/src/sbbs3/gtkuseredit/gtkuseredit.h
@@ -0,0 +1,15 @@
+#ifndef _GTKUSEREDIT_H_
+#define _GTKUSEREDIT_H_
+
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+
+#include "sbbs.h"
+
+extern scfg_t	cfg;
+extern user_t	user;
+extern GladeXML *xml;
+extern int		totalusers;
+extern int		current_user;
+
+#endif
diff --git a/src/sbbs3/gtkuseredit/objects.mk b/src/sbbs3/gtkuseredit/objects.mk
index 3e45587b44..fdc78a83ec 100644
--- a/src/sbbs3/gtkuseredit/objects.mk
+++ b/src/sbbs3/gtkuseredit/objects.mk
@@ -1,2 +1,3 @@
 OBJS	:=	\
+			$(MTOBJODIR)$(DIRSEP)events$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)gtkuseredit$(OFILE) \
-- 
GitLab