xref: /netbsd-src/external/bsd/nvi/dist/gtk/gtkviwindow.c (revision 8d01a27e2b735e802aea2b531dbc8b21a5af4376)
1dbd550edSchristos /* change further to gtkviwindow have no knowledge of ipvi */
2dbd550edSchristos #include "config.h"
3dbd550edSchristos 
4dbd550edSchristos #include <gdk/gdkkeysyms.h>
5dbd550edSchristos #include <gtk/gtk.h>
6dbd550edSchristos #if 0
7dbd550edSchristos #ifdef HAVE_ZVT
8dbd550edSchristos #include <zvt/zvtterm.h>
9dbd550edSchristos #include <zvt/vt.h>
10dbd550edSchristos #endif
11dbd550edSchristos #endif
12dbd550edSchristos 
13dbd550edSchristos #include "../common/common.h"
14dbd550edSchristos #include "../ipc/ip.h"
15dbd550edSchristos 
16dbd550edSchristos #include "gtkvi.h"
17dbd550edSchristos #include "gtkviscreen.h"
18dbd550edSchristos #include "gtkviwindow.h"
19*8d01a27eSchristos #include "gtk_extern.h"
20dbd550edSchristos 
21dbd550edSchristos enum {
22dbd550edSchristos     RENAME,
23dbd550edSchristos     LAST_SIGNAL
24dbd550edSchristos };
25dbd550edSchristos 
26dbd550edSchristos static void gtk_vi_window_class_init     (GtkViWindowClass   *klass);
27dbd550edSchristos static void gtk_vi_window_init           (GtkViWindow        *vi);
28dbd550edSchristos static void gtk_vi_window_destroy 	 (GtkObject *object);
29dbd550edSchristos 
30dbd550edSchristos static int vi_key_press_event __P((GtkWidget*, GdkEventKey*, GtkViWindow*));
31dbd550edSchristos static void vi_map __P((GtkWidget *, GtkWidget*));
32dbd550edSchristos static void vi_resized __P((GtkWidget *, int, int, IPVIWIN*));
33dbd550edSchristos static void vi_adjustment_value_changed __P((GtkAdjustment *, IPVIWIN *));
34dbd550edSchristos 
35dbd550edSchristos static void vi_input_func __P((gpointer , gint , GdkInputCondition));
36dbd550edSchristos 
37dbd550edSchristos static void vi_init_window __P((GtkViWindow *window, int));
38dbd550edSchristos 
39dbd550edSchristos static int vi_addstr __P((IPVIWIN*, const char *, u_int32_t));
40dbd550edSchristos static int vi_waddstr __P((IPVIWIN*, const CHAR_T *, u_int32_t));
41dbd550edSchristos static int vi_attribute __P((IPVIWIN*,u_int32_t  ,u_int32_t   ));
42dbd550edSchristos static int vi_bell __P((IPVIWIN*));
43dbd550edSchristos static int vi_busyon __P((IPVIWIN*, const char *, u_int32_t));
44dbd550edSchristos static int vi_busyoff __P((IPVIWIN*));
45dbd550edSchristos static int vi_clrtoeol __P((IPVIWIN*));
46dbd550edSchristos static int vi_deleteln __P((IPVIWIN*));
47dbd550edSchristos static int vi_discard __P((IPVIWIN*));
48dbd550edSchristos static int vi_editopt __P((IPVIWIN*, const char *, u_int32_t,
49dbd550edSchristos                             const char *, u_int32_t, u_int32_t));
50dbd550edSchristos static int vi_insertln __P((IPVIWIN*));
51dbd550edSchristos static int vi_move __P((IPVIWIN*, u_int32_t, u_int32_t));
52dbd550edSchristos static int vi_quit __P((IPVIWIN*));
53dbd550edSchristos static int vi_redraw __P((IPVIWIN*));
54dbd550edSchristos static int vi_refresh __P((IPVIWIN*));
55dbd550edSchristos static int vi_rename __P((IPVIWIN*, const char *, u_int32_t));
56dbd550edSchristos static int vi_rewrite __P((IPVIWIN*, u_int32_t));
57dbd550edSchristos static int vi_scrollbar __P((IPVIWIN*, u_int32_t, u_int32_t , u_int32_t ));
58dbd550edSchristos static int vi_select __P((IPVIWIN*, const char *, u_int32_t));
59dbd550edSchristos static int vi_split __P((IPVIWIN*));
60dbd550edSchristos static int vi_ex_init __P((IPVIWIN*));
61dbd550edSchristos static int vi_vi_init __P((IPVIWIN*));
62dbd550edSchristos static int vi_fork __P((IPVIWIN*));
63dbd550edSchristos 
64dbd550edSchristos static GtkWidgetClass *parent_class = NULL;
65dbd550edSchristos static guint vi_window_signals[LAST_SIGNAL] = { 0 };
66dbd550edSchristos 
67dbd550edSchristos GtkType
gtk_vi_window_get_type(void)68dbd550edSchristos gtk_vi_window_get_type (void)
69dbd550edSchristos {
70dbd550edSchristos   static GtkType vi_window_type = 0;
71dbd550edSchristos 
72dbd550edSchristos   if (!vi_window_type)
73dbd550edSchristos     {
74dbd550edSchristos       static const GtkTypeInfo vi_window_info =
75dbd550edSchristos       {
76dbd550edSchristos 	"GtkViWindow",
77dbd550edSchristos 	sizeof (GtkViWindow),
78dbd550edSchristos 	sizeof (GtkViWindowClass),
79dbd550edSchristos 	(GtkClassInitFunc) gtk_vi_window_class_init,
80dbd550edSchristos 	(GtkObjectInitFunc) gtk_vi_window_init,
81dbd550edSchristos 	/* reserved_1 */ NULL,
82dbd550edSchristos         /* reserved_2 */ NULL,
83dbd550edSchristos         (GtkClassInitFunc) NULL,
84dbd550edSchristos       };
85dbd550edSchristos 
86dbd550edSchristos       vi_window_type = gtk_type_unique (GTK_TYPE_NOTEBOOK, &vi_window_info);
87dbd550edSchristos     }
88dbd550edSchristos 
89dbd550edSchristos   return vi_window_type;
90dbd550edSchristos }
91dbd550edSchristos 
92dbd550edSchristos static void
gtk_vi_window_class_init(GtkViWindowClass * class)93dbd550edSchristos gtk_vi_window_class_init (GtkViWindowClass *class)
94dbd550edSchristos {
95dbd550edSchristos   GtkObjectClass *object_class;
96dbd550edSchristos 
97dbd550edSchristos   object_class = (GtkObjectClass*) class;
98dbd550edSchristos   parent_class = gtk_type_class (GTK_TYPE_WIDGET);
99dbd550edSchristos 
100dbd550edSchristos   vi_window_signals[RENAME] =
101dbd550edSchristos     gtk_signal_new ("rename",
102dbd550edSchristos 		    GTK_RUN_FIRST,
103dbd550edSchristos 		    GTK_CLASS_TYPE(object_class),
104dbd550edSchristos 		    GTK_SIGNAL_OFFSET (GtkViScreenClass, rename),
105dbd550edSchristos 		    gtk_marshal_VOID__STRING,
106dbd550edSchristos 		    GTK_TYPE_NONE, 1, GTK_TYPE_STRING, 0);
107dbd550edSchristos 
108dbd550edSchristos #ifndef HAVE_PANGO
109dbd550edSchristos   gtk_object_class_add_signals(object_class, vi_window_signals, LAST_SIGNAL);
110dbd550edSchristos #endif
111dbd550edSchristos 
112dbd550edSchristos   object_class->destroy = gtk_vi_window_destroy;
113dbd550edSchristos }
114dbd550edSchristos 
115dbd550edSchristos static void
gtk_vi_window_init(GtkViWindow * vi)116dbd550edSchristos gtk_vi_window_init (GtkViWindow *vi)
117dbd550edSchristos {
118dbd550edSchristos }
119dbd550edSchristos 
120dbd550edSchristos GtkWidget *
gtk_vi_window_new(GtkVi * vi)121dbd550edSchristos gtk_vi_window_new (GtkVi *vi)
122dbd550edSchristos {
123dbd550edSchristos     GtkViWindow* window;
124dbd550edSchristos     GtkWidget *vi_widget;
125dbd550edSchristos     GtkWidget *vscroll;
126dbd550edSchristos     GtkWidget *table;
127dbd550edSchristos     GtkWidget *term;
128dbd550edSchristos     int	       fd;
129dbd550edSchristos #ifdef HAVE_ZVT
130dbd550edSchristos     int	       pty[2];
131dbd550edSchristos #endif
132dbd550edSchristos 
133dbd550edSchristos     window = gtk_type_new(gtk_vi_window_get_type());
134dbd550edSchristos 
135dbd550edSchristos     window->vi = vi;
136dbd550edSchristos     //vi->vi_window = GTK_WIDGET(window);
137dbd550edSchristos 
138dbd550edSchristos     vi_widget = gtk_vi_screen_new(NULL);
139dbd550edSchristos     gtk_widget_show(GTK_WIDGET(vi_widget));
140dbd550edSchristos     /*
141dbd550edSchristos     vi->vi = vi_widget;
142dbd550edSchristos     */
143dbd550edSchristos     window->vi_screen = vi_widget;
144dbd550edSchristos 
145dbd550edSchristos     vscroll = gtk_vscrollbar_new(GTK_VI_SCREEN(vi_widget)->vadj);
146dbd550edSchristos     gtk_widget_show(vscroll);
147dbd550edSchristos 
148dbd550edSchristos     table = gtk_table_new(2, 2, FALSE);
149dbd550edSchristos     gtk_table_attach_defaults(GTK_TABLE(table), GTK_WIDGET(vi_widget),
150dbd550edSchristos 	0, 1, 0, 1);
151dbd550edSchristos     gtk_table_attach(GTK_TABLE(table), vscroll, 1, 2, 0, 1,
152dbd550edSchristos 	(GtkAttachOptions)0, GTK_FILL, 0, 0);
153dbd550edSchristos     gtk_widget_show(table);
154dbd550edSchristos     gtk_signal_connect(GTK_OBJECT(table), "map", GTK_SIGNAL_FUNC(vi_map),
155dbd550edSchristos 			vi_widget/*->ipvi*/);
156dbd550edSchristos     window->table = table;
157dbd550edSchristos 
158dbd550edSchristos 
159dbd550edSchristos     gtk_notebook_set_show_tabs(GTK_NOTEBOOK(window), FALSE);
160dbd550edSchristos     gtk_notebook_set_show_border(GTK_NOTEBOOK(window), FALSE);
161dbd550edSchristos     gtk_notebook_append_page(GTK_NOTEBOOK(window), table, NULL);
162dbd550edSchristos 
163dbd550edSchristos     term = 0;
164dbd550edSchristos     fd = -1;
165dbd550edSchristos 
166dbd550edSchristos #if 0
167dbd550edSchristos #ifdef HAVE_ZVT
168dbd550edSchristos     term = zvt_term_new();
169dbd550edSchristos     zvt_term_set_blink(ZVT_TERM(term), FALSE);
170dbd550edSchristos     zvt_term_get_ptys(ZVT_TERM(term), 0, pty);
171dbd550edSchristos     fd = pty[1]; /* slave */
172dbd550edSchristos     gtk_widget_show(term);
173dbd550edSchristos     gtk_notebook_append_page(GTK_NOTEBOOK(window), term, NULL);
174dbd550edSchristos #endif
175dbd550edSchristos #endif
176dbd550edSchristos     window->term = term;
177dbd550edSchristos 
178dbd550edSchristos     vi_init_window(window, fd);
179dbd550edSchristos 
180dbd550edSchristos     gtk_signal_connect(GTK_OBJECT(vi_widget), "resized",
181dbd550edSchristos 	GTK_SIGNAL_FUNC(vi_resized), window->ipviwin);
182dbd550edSchristos     gtk_signal_connect(GTK_OBJECT(vi_widget), "key_press_event",
183dbd550edSchristos 	(GtkSignalFunc) vi_key_press_event, window);
184dbd550edSchristos     window->value_changed =
185dbd550edSchristos 	gtk_signal_connect(GTK_OBJECT(GTK_VI_SCREEN(vi_widget)->vadj),
186dbd550edSchristos 	    "value_changed",
187dbd550edSchristos 	    (GtkSignalFunc) vi_adjustment_value_changed, window->ipviwin);
188dbd550edSchristos 
189dbd550edSchristos     return GTK_WIDGET(window);
190dbd550edSchristos }
191dbd550edSchristos 
192dbd550edSchristos static void
gtk_vi_window_destroy(GtkObject * object)193dbd550edSchristos gtk_vi_window_destroy (GtkObject *object)
194dbd550edSchristos {
195dbd550edSchristos   GtkViWindow *vi_window;
196dbd550edSchristos 
197dbd550edSchristos   g_return_if_fail (object != NULL);
198dbd550edSchristos   g_return_if_fail (GTK_IS_VI_WINDOW (object));
199dbd550edSchristos 
200dbd550edSchristos   vi_window = (GtkViWindow*) object;
201dbd550edSchristos 
202dbd550edSchristos   if (vi_window->table) {
203dbd550edSchristos     gtk_signal_disconnect_by_data(GTK_OBJECT(vi_window->table),
204dbd550edSchristos 				  vi_window->vi_screen);
205dbd550edSchristos     vi_window->table = 0;
206dbd550edSchristos   }
207dbd550edSchristos 
208dbd550edSchristos   if (vi_window->vi_screen) {
209dbd550edSchristos     gtk_signal_disconnect_by_data(GTK_OBJECT(vi_window->vi_screen),
210dbd550edSchristos 				  vi_window->ipviwin);
211dbd550edSchristos     gtk_signal_disconnect(GTK_OBJECT(GTK_VI_SCREEN(vi_window->vi_screen)->vadj),
212dbd550edSchristos 	vi_window->value_changed);
213dbd550edSchristos     gtk_widget_destroy(vi_window->vi_screen);
214dbd550edSchristos     vi_window->vi_screen = 0;
215dbd550edSchristos   }
216dbd550edSchristos 
217dbd550edSchristos   GTK_OBJECT_CLASS(parent_class)->destroy (object);
218dbd550edSchristos }
219dbd550edSchristos 
220dbd550edSchristos void
gtk_vi_window_scrollbar(GtkViWindow * vi,guint top,guint size,guint max)221dbd550edSchristos gtk_vi_window_scrollbar(GtkViWindow *vi, guint top, guint size, guint max)
222dbd550edSchristos {
223dbd550edSchristos     GtkViScreen *vi_screen;
224dbd550edSchristos     /* work around gcc bug */
225dbd550edSchristos     volatile guint mymax = max;
226dbd550edSchristos     volatile guint mysize = size;
227dbd550edSchristos 
228dbd550edSchristos     vi_screen = GTK_VI_SCREEN(vi->vi_screen);
229dbd550edSchristos     vi_screen->vadj->value = top;
230dbd550edSchristos     vi_screen->vadj->upper = mymax;
231dbd550edSchristos     vi_screen->vadj->page_size =
232dbd550edSchristos 	vi_screen->vadj->page_increment = mysize;
233dbd550edSchristos     gtk_signal_handler_block(GTK_OBJECT(vi_screen->vadj), vi->value_changed);
234dbd550edSchristos     gtk_adjustment_changed(vi_screen->vadj);
235dbd550edSchristos     /*
236dbd550edSchristos     gtk_adjustment_value_changed(vi_screen->vadj);
237dbd550edSchristos     */
238dbd550edSchristos     gtk_signal_handler_unblock(GTK_OBJECT(vi_screen->vadj), vi->value_changed);
239dbd550edSchristos }
240dbd550edSchristos 
241dbd550edSchristos /*
242dbd550edSchristos  * PUBLIC: void gtk_vi_quit __P((GtkViWindow*, gint));
243dbd550edSchristos  */
244dbd550edSchristos void
gtk_vi_quit(vi,write)245dbd550edSchristos gtk_vi_quit(vi, write)
246dbd550edSchristos     GtkViWindow *vi;
247dbd550edSchristos     gint write;
248dbd550edSchristos {
249dbd550edSchristos     if (write)
250dbd550edSchristos 	vi->ipviwin->wq(vi->ipviwin);
251dbd550edSchristos     else
252dbd550edSchristos 	vi->ipviwin->quit(vi->ipviwin);
253dbd550edSchristos }
254dbd550edSchristos 
255dbd550edSchristos /*
256dbd550edSchristos  * PUBLIC: void gtk_vi_show_term __P((GtkViWindow*, gint));
257dbd550edSchristos  */
258dbd550edSchristos void
gtk_vi_show_term(window,show)259dbd550edSchristos gtk_vi_show_term(window, show)
260dbd550edSchristos     GtkViWindow *window;
261dbd550edSchristos     gint show;
262dbd550edSchristos {
263dbd550edSchristos     gtk_notebook_set_page(GTK_NOTEBOOK(window), show ? 1 : 0);
264dbd550edSchristos }
265dbd550edSchristos 
266dbd550edSchristos /*
267dbd550edSchristos  * PUBLIC: void gtk_vi_key_press_event __P((GtkViWindow*, GdkEventKey*));
268dbd550edSchristos  */
269dbd550edSchristos void
gtk_vi_key_press_event(window,event)270dbd550edSchristos gtk_vi_key_press_event(window, event)
271dbd550edSchristos     GtkViWindow *window;
272dbd550edSchristos     GdkEventKey *event;
273dbd550edSchristos {
274dbd550edSchristos #if 0
275dbd550edSchristos     static struct {
276dbd550edSchristos 	guint key;
277dbd550edSchristos 	gint offset;
278dbd550edSchristos     } table[] = {
279dbd550edSchristos 	{GDK_Home,	GTK_STRUCT_OFFSET(IPVI, c_bol)	    },
280dbd550edSchristos 	//{VI_C_BOTTOM,	GTK_STRUCT_OFFSET(IPVI, c_bottom)   },
281dbd550edSchristos 	{GDK_End,  	GTK_STRUCT_OFFSET(IPVI, c_eol)	    },
282dbd550edSchristos 	{GDK_Insert,	GTK_STRUCT_OFFSET(IPVI, c_insert)   },
283dbd550edSchristos 	{GDK_Left, 	GTK_STRUCT_OFFSET(IPVI, c_left)     },
284dbd550edSchristos 	{GDK_Right,	GTK_STRUCT_OFFSET(IPVI, c_right)    },
285dbd550edSchristos 	//{VI_C_TOP,  	GTK_STRUCT_OFFSET(IPVI, c_top)	    },
286dbd550edSchristos     };
287dbd550edSchristos #endif
288dbd550edSchristos     static struct {
289dbd550edSchristos 	guint	keyval;
290dbd550edSchristos 	char	key;
291dbd550edSchristos     } table[] = {
292dbd550edSchristos 	{ GDK_Left,	    'h' },
293dbd550edSchristos 	{ GDK_Right,	    'l' },
294dbd550edSchristos 	{ GDK_Up,	    'k' },
295dbd550edSchristos 	{ GDK_Down,	    'j' },
296dbd550edSchristos 	{ GDK_Page_Up,	    'B' - '@' },
297dbd550edSchristos 	{ GDK_Page_Down,    'F' - '@' },
298dbd550edSchristos     };
299dbd550edSchristos     char key = event->keyval;
300dbd550edSchristos     int i;
301dbd550edSchristos 
302dbd550edSchristos #if 0
303dbd550edSchristos     for (i = 0; i < sizeof(table)/sizeof(*table); ++i)
304dbd550edSchristos 	if (table[i].key == event->keyval) {
305dbd550edSchristos 	    int (*fun) __P((IPVI*)) =
306dbd550edSchristos 		*(int (**) __P((IPVI*)) )(((char *)vi->ipvi)+table[i].offset);
307dbd550edSchristos 	    fun(vi->ipvi);
308dbd550edSchristos 	    return;
309dbd550edSchristos 	}
310dbd550edSchristos #endif
311dbd550edSchristos     for (i = 0; i < sizeof(table)/sizeof(*table); ++i)
312dbd550edSchristos 	if (table[i].keyval == event->keyval) {
313dbd550edSchristos 	    window->ipviwin->string(window->ipviwin, &table[i].key, 1);
314dbd550edSchristos 	    return;
315dbd550edSchristos 	}
316dbd550edSchristos 
317dbd550edSchristos     if (event->state & GDK_CONTROL_MASK) {
318dbd550edSchristos 	if ((key >= 'a') && (key <= 'z'))
319dbd550edSchristos 	    key -= 'a' - 'A';
320dbd550edSchristos 	key -= '@';
321dbd550edSchristos     }
322dbd550edSchristos     /*
323dbd550edSchristos     fprintf(stderr, "key_press %d %d %d %c %p\n",
324dbd550edSchristos 	event->length, event->keyval, event->keyval, key, ipvi);
325dbd550edSchristos     */
326dbd550edSchristos     if (event->length > 0)
327dbd550edSchristos 	window->ipviwin->string(window->ipviwin, &key, 1);
328dbd550edSchristos }
329dbd550edSchristos 
330dbd550edSchristos 
331dbd550edSchristos 
332dbd550edSchristos static int
vi_key_press_event(vi_screen,event,vi)333dbd550edSchristos vi_key_press_event(vi_screen, event, vi)
334dbd550edSchristos     GtkViWindow *vi;
335dbd550edSchristos     GtkWidget *vi_screen;
336dbd550edSchristos     GdkEventKey *event;
337dbd550edSchristos {
338dbd550edSchristos     gint handled;
339dbd550edSchristos 
340dbd550edSchristos     handled = gtk_accel_groups_activate (GTK_OBJECT (vi),
341dbd550edSchristos 		    event->keyval, (GdkModifierType) event->state);
342dbd550edSchristos     if (handled)
343dbd550edSchristos 	return 1;
344dbd550edSchristos 
345dbd550edSchristos     gtk_vi_key_press_event(vi, event);
346dbd550edSchristos     gtk_signal_emit_stop_by_name(GTK_OBJECT(vi_screen), "key_press_event");
347dbd550edSchristos     /* handled */
348dbd550edSchristos     return 1;
349dbd550edSchristos }
350dbd550edSchristos 
351dbd550edSchristos static void
vi_map(table,vi_screen)352dbd550edSchristos vi_map(table, vi_screen)
353dbd550edSchristos 	GtkWidget *vi_screen;
354dbd550edSchristos 	GtkWidget *table;
355dbd550edSchristos {
356dbd550edSchristos 	gtk_widget_grab_focus(vi_screen);
357dbd550edSchristos }
358dbd550edSchristos 
359dbd550edSchristos static void
vi_resized(vi_screen,rows,cols,ipviwin)360dbd550edSchristos vi_resized(vi_screen, rows, cols, ipviwin)
361dbd550edSchristos     int rows,cols;
362dbd550edSchristos     IPVIWIN *ipviwin;
363dbd550edSchristos     GtkWidget *vi_screen;
364dbd550edSchristos {
365dbd550edSchristos 	GtkViWindow *vi_window = GTK_VI_WINDOW((GtkVi*)(ipviwin->private_data));
366dbd550edSchristos 
367dbd550edSchristos 	ipviwin->resize(ipviwin, rows, cols);
368dbd550edSchristos 	vi_window->resized = 1;
369dbd550edSchristos }
370dbd550edSchristos 
371dbd550edSchristos static void
vi_adjustment_value_changed(adjustment,ipviwin)372dbd550edSchristos vi_adjustment_value_changed (adjustment, ipviwin)
373dbd550edSchristos     GtkAdjustment *adjustment;
374dbd550edSchristos     IPVIWIN *ipviwin;
375dbd550edSchristos {
376dbd550edSchristos 	GtkViWindow *vi_window = GTK_VI_WINDOW((GtkVi*)(ipviwin->private_data));
377dbd550edSchristos 
378dbd550edSchristos 	if (vi_window->resized)
379dbd550edSchristos 		ipviwin->c_settop(ipviwin, adjustment->value);
380dbd550edSchristos }
381dbd550edSchristos 
382dbd550edSchristos 
383dbd550edSchristos static void
vi_input_func(gpointer data,gint source,GdkInputCondition condition)384dbd550edSchristos vi_input_func (gpointer data, gint source, GdkInputCondition condition)
385dbd550edSchristos {
386dbd550edSchristos     IPVIWIN *ipviwin = (IPVIWIN *) data;
387dbd550edSchristos 
388dbd550edSchristos     (void)ipviwin->input(ipviwin, source);
389dbd550edSchristos }
390dbd550edSchristos 
391dbd550edSchristos static void
vi_init_window(GtkViWindow * window,int fd)392dbd550edSchristos vi_init_window (GtkViWindow *window, int fd)
393dbd550edSchristos {
394dbd550edSchristos     static struct ip_si_operations ipsi_ops_gtk = {
395dbd550edSchristos 	vi_addstr,
396dbd550edSchristos 	vi_attribute,
397dbd550edSchristos 	vi_bell,
398dbd550edSchristos 	vi_busyoff,
399dbd550edSchristos 	vi_busyon,
400dbd550edSchristos 	vi_clrtoeol,
401dbd550edSchristos 	vi_deleteln,
402dbd550edSchristos 	vi_discard,
403dbd550edSchristos 	vi_editopt,
404dbd550edSchristos 	vi_insertln,
405dbd550edSchristos 	vi_move,
406dbd550edSchristos 	vi_quit,
407dbd550edSchristos 	vi_redraw,
408dbd550edSchristos 	vi_refresh,
409dbd550edSchristos 	vi_rename,
410dbd550edSchristos 	vi_rewrite,
411dbd550edSchristos 	vi_scrollbar,
412dbd550edSchristos 	vi_select,
413dbd550edSchristos 	vi_split,
414dbd550edSchristos 	(IPFunc_a)vi_waddstr,
415dbd550edSchristos     };
416dbd550edSchristos     GtkVi *vi = window->vi;
417dbd550edSchristos 
418dbd550edSchristos     vi->ipvi->new_window(vi->ipvi, &window->ipviwin, fd);
419dbd550edSchristos 
420dbd550edSchristos     window->ipviwin->private_data = window;
421dbd550edSchristos     window->ipviwin->set_ops(window->ipviwin, &ipsi_ops_gtk);
422dbd550edSchristos     window->input_func = gtk_input_add_full(window->ipviwin->ifd,
423dbd550edSchristos 			    GDK_INPUT_READ,
424dbd550edSchristos 			    vi_input_func, 0, (gpointer)window->ipviwin, 0);
425dbd550edSchristos }
426dbd550edSchristos 
427dbd550edSchristos static int
vi_addstr(ipviwin,str,len)428dbd550edSchristos vi_addstr(ipviwin, str, len)
429dbd550edSchristos 	IPVIWIN	*ipviwin;
430dbd550edSchristos 	const char *str;
431dbd550edSchristos 	u_int32_t len;
432dbd550edSchristos {
433dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
434dbd550edSchristos 
435dbd550edSchristos 	gtk_vi_screen_addstr(GTK_VI_SCREEN(vi->vi_screen), str, len);
436dbd550edSchristos 	return (0);
437dbd550edSchristos }
438dbd550edSchristos 
439dbd550edSchristos static int
vi_waddstr(ipviwin,str,len)440dbd550edSchristos vi_waddstr(ipviwin, str, len)
441dbd550edSchristos 	IPVIWIN	*ipviwin;
442dbd550edSchristos 	const CHAR_T *str;
443dbd550edSchristos 	u_int32_t len;
444dbd550edSchristos {
445dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
446dbd550edSchristos 
447dbd550edSchristos 	gtk_vi_screen_waddstr(GTK_VI_SCREEN(vi->vi_screen), str, len/sizeof(CHAR_T));
448dbd550edSchristos 	return (0);
449dbd550edSchristos }
450dbd550edSchristos 
451dbd550edSchristos static int
vi_attribute(ipviwin,attribute,on)452dbd550edSchristos vi_attribute(ipviwin,attribute,on)
453dbd550edSchristos 	IPVIWIN	*ipviwin;
454dbd550edSchristos 	u_int32_t   attribute, on;
455dbd550edSchristos {
456dbd550edSchristos 	GtkViWindow* window = (GtkViWindow*)(ipviwin->private_data);
457dbd550edSchristos 
458dbd550edSchristos 	if (attribute == SA_ALTERNATE) {
459dbd550edSchristos 		gtk_vi_show_term(window, !on);
460dbd550edSchristos 	}
461dbd550edSchristos 	else
462dbd550edSchristos 		gtk_vi_screen_attribute(GTK_VI_SCREEN(window->vi_screen), attribute, on);
463dbd550edSchristos 	return (0);
464dbd550edSchristos }
465dbd550edSchristos 
466dbd550edSchristos static int
vi_bell(ipbp)467dbd550edSchristos vi_bell(ipbp)
468dbd550edSchristos 	IPVIWIN *ipbp;
469dbd550edSchristos {
470dbd550edSchristos     /*
471dbd550edSchristos     fprintf(stderr, "vi_bell\n");
472dbd550edSchristos     */
473dbd550edSchristos #if 0
474dbd550edSchristos 	/*
475dbd550edSchristos 	 * XXX
476dbd550edSchristos 	 * Future... implement visible bell.
477dbd550edSchristos 	 */
478dbd550edSchristos 	XBell(XtDisplay(__vi_screen->area), 0);
479dbd550edSchristos #endif
480dbd550edSchristos 	return (0);
481dbd550edSchristos }
482dbd550edSchristos 
483dbd550edSchristos static int
vi_busyon(IPVIWIN * ipviwin,const char * a,u_int32_t s)484dbd550edSchristos vi_busyon (IPVIWIN* ipviwin, const char *a, u_int32_t s)
485dbd550edSchristos {
486dbd550edSchristos     /*
487dbd550edSchristos     fprintf(stderr, "vi_busyon\n");
488dbd550edSchristos     */
489dbd550edSchristos #if 0
490dbd550edSchristos 	__vi_set_cursor(__vi_screen, 1);
491dbd550edSchristos #endif
492dbd550edSchristos 	return (0);
493dbd550edSchristos }
494dbd550edSchristos 
495dbd550edSchristos static int
vi_busyoff(ipbp)496dbd550edSchristos vi_busyoff(ipbp)
497dbd550edSchristos 	IPVIWIN *ipbp;
498dbd550edSchristos {
499dbd550edSchristos     /*
500dbd550edSchristos     fprintf(stderr, "vi_busyoff\n");
501dbd550edSchristos     */
502dbd550edSchristos #if 0
503dbd550edSchristos 	__vi_set_cursor(__vi_screen, 0);
504dbd550edSchristos #endif
505dbd550edSchristos 	return (0);
506dbd550edSchristos }
507dbd550edSchristos 
508dbd550edSchristos static int
vi_clrtoeol(ipviwin)509dbd550edSchristos vi_clrtoeol(ipviwin)
510dbd550edSchristos 	IPVIWIN	*ipviwin;
511dbd550edSchristos {
512dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
513dbd550edSchristos 
514dbd550edSchristos 	gtk_vi_screen_clrtoel(GTK_VI_SCREEN(vi->vi_screen));
515dbd550edSchristos 	return 0;
516dbd550edSchristos }
517dbd550edSchristos 
518dbd550edSchristos static int
vi_deleteln(ipviwin)519dbd550edSchristos vi_deleteln(ipviwin)
520dbd550edSchristos 	IPVIWIN	*ipviwin;
521dbd550edSchristos {
522dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
523dbd550edSchristos 
524dbd550edSchristos 	gtk_vi_screen_deleteln(GTK_VI_SCREEN(vi->vi_screen));
525dbd550edSchristos 	return (0);
526dbd550edSchristos }
527dbd550edSchristos 
528dbd550edSchristos static int
vi_editopt(IPVIWIN * a,const char * b,u_int32_t c,const char * d,u_int32_t e,u_int32_t f)529dbd550edSchristos vi_editopt (IPVIWIN* a, const char *b, u_int32_t c,
530dbd550edSchristos                             const char *d, u_int32_t e, u_int32_t f)
531dbd550edSchristos {
532dbd550edSchristos     /*
533dbd550edSchristos     fprintf(stderr, "%p %p vi_editopt\n", a, a->private_data);
534dbd550edSchristos     */
535dbd550edSchristos #if 0
536dbd550edSchristos 	/* XXX: Nothing. */
537dbd550edSchristos #endif
538dbd550edSchristos 	return (0);
539dbd550edSchristos }
540dbd550edSchristos 
541dbd550edSchristos 
542dbd550edSchristos static int
vi_discard(ipbp)543dbd550edSchristos vi_discard(ipbp)
544dbd550edSchristos 	IPVIWIN *ipbp;
545dbd550edSchristos {
546dbd550edSchristos     /*
547dbd550edSchristos     fprintf(stderr, "vi_discard\n");
548dbd550edSchristos     */
549dbd550edSchristos #if 0
550dbd550edSchristos 	/* XXX: Nothing. */
551dbd550edSchristos #endif
552dbd550edSchristos 	return (0);
553dbd550edSchristos }
554dbd550edSchristos 
555dbd550edSchristos static int
vi_insertln(ipviwin)556dbd550edSchristos vi_insertln(ipviwin)
557dbd550edSchristos 	IPVIWIN	*ipviwin;
558dbd550edSchristos {
559dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
560dbd550edSchristos 
561dbd550edSchristos     gtk_vi_screen_insertln(GTK_VI_SCREEN(vi->vi_screen));
562dbd550edSchristos     return (0);
563dbd550edSchristos }
564dbd550edSchristos 
565dbd550edSchristos static int
vi_move(ipviwin,row,col)566dbd550edSchristos vi_move(ipviwin, row, col)
567dbd550edSchristos 	IPVIWIN	*ipviwin;
568dbd550edSchristos 	u_int32_t row;
569dbd550edSchristos 	u_int32_t col;
570dbd550edSchristos {
571dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
572dbd550edSchristos 
573dbd550edSchristos 	gtk_vi_screen_move(GTK_VI_SCREEN(vi->vi_screen), row, col);
574dbd550edSchristos 	return (0);
575dbd550edSchristos }
576dbd550edSchristos 
577dbd550edSchristos static int
vi_redraw(ipviwin)578dbd550edSchristos vi_redraw(ipviwin)
579dbd550edSchristos 	IPVIWIN	*ipviwin;
580dbd550edSchristos {
581dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
582dbd550edSchristos 
583dbd550edSchristos 	gtk_widget_draw(GTK_WIDGET(vi->vi_screen), NULL);
584dbd550edSchristos 	return (0);
585dbd550edSchristos }
586dbd550edSchristos 
587dbd550edSchristos static int
vi_refresh(ipviwin)588dbd550edSchristos vi_refresh(ipviwin)
589dbd550edSchristos 	IPVIWIN	*ipviwin;
590dbd550edSchristos {
591dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
592dbd550edSchristos 
593dbd550edSchristos 	gtk_vi_screen_refresh(GTK_VI_SCREEN(vi->vi_screen));
594dbd550edSchristos 	return (0);
595dbd550edSchristos }
596dbd550edSchristos 
597dbd550edSchristos static int
vi_quit(ipviwin)598dbd550edSchristos vi_quit(ipviwin)
599dbd550edSchristos 	IPVIWIN	*ipviwin;
600dbd550edSchristos {
601dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
602dbd550edSchristos 
603dbd550edSchristos 	gtk_input_remove(vi->input_func);
604dbd550edSchristos 	gtk_widget_destroy(GTK_WIDGET(vi));
605dbd550edSchristos 	return (0);
606dbd550edSchristos }
607dbd550edSchristos 
608dbd550edSchristos static int
vi_rename(ipviwin,str,len)609dbd550edSchristos vi_rename(ipviwin, str, len)
610dbd550edSchristos 	IPVIWIN	*ipviwin;
611dbd550edSchristos 	const char *str;
612dbd550edSchristos 	u_int32_t len;
613dbd550edSchristos {
614dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
615dbd550edSchristos 
616dbd550edSchristos 	gchar* name = g_strndup(str, len);
617dbd550edSchristos 	gtk_signal_emit_by_name(GTK_OBJECT(vi), "rename", name);
618dbd550edSchristos 	g_free(name);
619dbd550edSchristos 	return (0);
620dbd550edSchristos }
621dbd550edSchristos 
622dbd550edSchristos static int
vi_rewrite(ipviwin,row)623dbd550edSchristos vi_rewrite(ipviwin, row)
624dbd550edSchristos 	IPVIWIN	*ipviwin;
625dbd550edSchristos 	u_int32_t row;
626dbd550edSchristos {
627dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
628dbd550edSchristos 
629dbd550edSchristos 	gtk_vi_screen_rewrite(GTK_VI_SCREEN(vi->vi_screen), row);
630dbd550edSchristos 	return (0);
631dbd550edSchristos }
632dbd550edSchristos 
633dbd550edSchristos 
634dbd550edSchristos static int
vi_scrollbar(ipviwin,top,size,max)635dbd550edSchristos vi_scrollbar(ipviwin, top, size, max)
636dbd550edSchristos 	IPVIWIN	*ipviwin;
637dbd550edSchristos 	u_int32_t top, size, max;
638dbd550edSchristos {
639dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
640dbd550edSchristos 
641dbd550edSchristos 	gtk_vi_window_scrollbar(vi, top, size, max);
642dbd550edSchristos 
643dbd550edSchristos 	return (0);
644dbd550edSchristos }
645dbd550edSchristos 
vi_select(IPVIWIN * a,const char * b,u_int32_t c)646dbd550edSchristos static int vi_select (IPVIWIN* a, const char * b, u_int32_t c)
647dbd550edSchristos {
648dbd550edSchristos     /*
649dbd550edSchristos     fprintf(stderr, "vi_select\n");
650dbd550edSchristos     */
651dbd550edSchristos #if 0
652dbd550edSchristos 	/* XXX: Nothing. */
653dbd550edSchristos #endif
654dbd550edSchristos 	return (0);
655dbd550edSchristos }
656dbd550edSchristos 
657dbd550edSchristos static int
vi_split(ipbp)658dbd550edSchristos vi_split(ipbp)
659dbd550edSchristos 	IPVIWIN *ipbp;
660dbd550edSchristos {
661dbd550edSchristos     fprintf(stderr, "vi_split\n");
662dbd550edSchristos #if 0
663dbd550edSchristos 	/* XXX: Nothing. */
664dbd550edSchristos #endif
665dbd550edSchristos 	return (0);
666dbd550edSchristos }
667dbd550edSchristos 
668dbd550edSchristos static int
vi_ex_init(ipviwin)669dbd550edSchristos vi_ex_init(ipviwin)
670dbd550edSchristos 	IPVIWIN	*ipviwin;
671dbd550edSchristos {
672dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
673dbd550edSchristos 
674dbd550edSchristos /*
675dbd550edSchristos 	gtk_vi_show_term(vi, 1);
676dbd550edSchristos */
677dbd550edSchristos 	return 0;
678dbd550edSchristos }
679dbd550edSchristos 
680dbd550edSchristos static int
vi_vi_init(ipviwin)681dbd550edSchristos vi_vi_init(ipviwin)
682dbd550edSchristos 	IPVIWIN	*ipviwin;
683dbd550edSchristos {
684dbd550edSchristos 	GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
685dbd550edSchristos 
686dbd550edSchristos /*
687dbd550edSchristos 	gtk_vi_show_term(vi, 0);
688dbd550edSchristos */
689dbd550edSchristos 	return 0;
690dbd550edSchristos }
691