minix/dist/nvi/gtk/gtkviwindow.c

693 lines
15 KiB
C
Raw Normal View History

/* $NetBSD: gtkviwindow.c,v 1.1.1.2 2008/05/18 14:31:22 aymeric Exp $ */
/* change further to gtkviwindow have no knowledge of ipvi */
#include "config.h"
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#if 0
#ifdef HAVE_ZVT
#include <zvt/zvtterm.h>
#include <zvt/vt.h>
#endif
#endif
#include "../common/common.h"
#include "../ipc/ip.h"
#include "gtkvi.h"
#include "gtkviscreen.h"
#include "gtkviwindow.h"
#include "extern.h"
enum {
RENAME,
LAST_SIGNAL
};
static void gtk_vi_window_class_init (GtkViWindowClass *klass);
static void gtk_vi_window_init (GtkViWindow *vi);
static void gtk_vi_window_destroy (GtkObject *object);
static int vi_key_press_event __P((GtkWidget*, GdkEventKey*, GtkViWindow*));
static void vi_map __P((GtkWidget *, GtkWidget*));
static void vi_resized __P((GtkWidget *, int, int, IPVIWIN*));
static void vi_adjustment_value_changed __P((GtkAdjustment *, IPVIWIN *));
static void vi_input_func __P((gpointer , gint , GdkInputCondition));
static void vi_init_window __P((GtkViWindow *window, int));
static int vi_addstr __P((IPVIWIN*, const char *, u_int32_t));
static int vi_waddstr __P((IPVIWIN*, const CHAR_T *, u_int32_t));
static int vi_attribute __P((IPVIWIN*,u_int32_t ,u_int32_t ));
static int vi_bell __P((IPVIWIN*));
static int vi_busyon __P((IPVIWIN*, const char *, u_int32_t));
static int vi_busyoff __P((IPVIWIN*));
static int vi_clrtoeol __P((IPVIWIN*));
static int vi_deleteln __P((IPVIWIN*));
static int vi_discard __P((IPVIWIN*));
static int vi_editopt __P((IPVIWIN*, const char *, u_int32_t,
const char *, u_int32_t, u_int32_t));
static int vi_insertln __P((IPVIWIN*));
static int vi_move __P((IPVIWIN*, u_int32_t, u_int32_t));
static int vi_quit __P((IPVIWIN*));
static int vi_redraw __P((IPVIWIN*));
static int vi_refresh __P((IPVIWIN*));
static int vi_rename __P((IPVIWIN*, const char *, u_int32_t));
static int vi_rewrite __P((IPVIWIN*, u_int32_t));
static int vi_scrollbar __P((IPVIWIN*, u_int32_t, u_int32_t , u_int32_t ));
static int vi_select __P((IPVIWIN*, const char *, u_int32_t));
static int vi_split __P((IPVIWIN*));
static int vi_ex_init __P((IPVIWIN*));
static int vi_vi_init __P((IPVIWIN*));
static int vi_fork __P((IPVIWIN*));
static GtkWidgetClass *parent_class = NULL;
static guint vi_window_signals[LAST_SIGNAL] = { 0 };
GtkType
gtk_vi_window_get_type (void)
{
static GtkType vi_window_type = 0;
if (!vi_window_type)
{
static const GtkTypeInfo vi_window_info =
{
"GtkViWindow",
sizeof (GtkViWindow),
sizeof (GtkViWindowClass),
(GtkClassInitFunc) gtk_vi_window_class_init,
(GtkObjectInitFunc) gtk_vi_window_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL,
};
vi_window_type = gtk_type_unique (GTK_TYPE_NOTEBOOK, &vi_window_info);
}
return vi_window_type;
}
static void
gtk_vi_window_class_init (GtkViWindowClass *class)
{
GtkObjectClass *object_class;
object_class = (GtkObjectClass*) class;
parent_class = gtk_type_class (GTK_TYPE_WIDGET);
vi_window_signals[RENAME] =
gtk_signal_new ("rename",
GTK_RUN_FIRST,
GTK_CLASS_TYPE(object_class),
GTK_SIGNAL_OFFSET (GtkViScreenClass, rename),
gtk_marshal_VOID__STRING,
GTK_TYPE_NONE, 1, GTK_TYPE_STRING, 0);
#ifndef HAVE_PANGO
gtk_object_class_add_signals(object_class, vi_window_signals, LAST_SIGNAL);
#endif
object_class->destroy = gtk_vi_window_destroy;
}
static void
gtk_vi_window_init (GtkViWindow *vi)
{
}
GtkWidget *
gtk_vi_window_new (GtkVi *vi)
{
GtkViWindow* window;
GtkWidget *vi_widget;
GtkWidget *vscroll;
GtkWidget *table;
GtkWidget *term;
int fd;
#ifdef HAVE_ZVT
int pty[2];
#endif
window = gtk_type_new(gtk_vi_window_get_type());
window->vi = vi;
//vi->vi_window = GTK_WIDGET(window);
vi_widget = gtk_vi_screen_new(NULL);
gtk_widget_show(GTK_WIDGET(vi_widget));
/*
vi->vi = vi_widget;
*/
window->vi_screen = vi_widget;
vscroll = gtk_vscrollbar_new(GTK_VI_SCREEN(vi_widget)->vadj);
gtk_widget_show(vscroll);
table = gtk_table_new(2, 2, FALSE);
gtk_table_attach_defaults(GTK_TABLE(table), GTK_WIDGET(vi_widget),
0, 1, 0, 1);
gtk_table_attach(GTK_TABLE(table), vscroll, 1, 2, 0, 1,
(GtkAttachOptions)0, GTK_FILL, 0, 0);
gtk_widget_show(table);
gtk_signal_connect(GTK_OBJECT(table), "map", GTK_SIGNAL_FUNC(vi_map),
vi_widget/*->ipvi*/);
window->table = table;
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(window), FALSE);
gtk_notebook_set_show_border(GTK_NOTEBOOK(window), FALSE);
gtk_notebook_append_page(GTK_NOTEBOOK(window), table, NULL);
term = 0;
fd = -1;
#if 0
#ifdef HAVE_ZVT
term = zvt_term_new();
zvt_term_set_blink(ZVT_TERM(term), FALSE);
zvt_term_get_ptys(ZVT_TERM(term), 0, pty);
fd = pty[1]; /* slave */
gtk_widget_show(term);
gtk_notebook_append_page(GTK_NOTEBOOK(window), term, NULL);
#endif
#endif
window->term = term;
vi_init_window(window, fd);
gtk_signal_connect(GTK_OBJECT(vi_widget), "resized",
GTK_SIGNAL_FUNC(vi_resized), window->ipviwin);
gtk_signal_connect(GTK_OBJECT(vi_widget), "key_press_event",
(GtkSignalFunc) vi_key_press_event, window);
window->value_changed =
gtk_signal_connect(GTK_OBJECT(GTK_VI_SCREEN(vi_widget)->vadj),
"value_changed",
(GtkSignalFunc) vi_adjustment_value_changed, window->ipviwin);
return GTK_WIDGET(window);
}
static void
gtk_vi_window_destroy (GtkObject *object)
{
GtkViWindow *vi_window;
g_return_if_fail (object != NULL);
g_return_if_fail (GTK_IS_VI_WINDOW (object));
vi_window = (GtkViWindow*) object;
if (vi_window->table) {
gtk_signal_disconnect_by_data(GTK_OBJECT(vi_window->table),
vi_window->vi_screen);
vi_window->table = 0;
}
if (vi_window->vi_screen) {
gtk_signal_disconnect_by_data(GTK_OBJECT(vi_window->vi_screen),
vi_window->ipviwin);
gtk_signal_disconnect(GTK_OBJECT(GTK_VI_SCREEN(vi_window->vi_screen)->vadj),
vi_window->value_changed);
gtk_widget_destroy(vi_window->vi_screen);
vi_window->vi_screen = 0;
}
GTK_OBJECT_CLASS(parent_class)->destroy (object);
}
void
gtk_vi_window_scrollbar(GtkViWindow *vi, guint top, guint size, guint max)
{
GtkViScreen *vi_screen;
/* work around gcc bug */
volatile guint mymax = max;
volatile guint mysize = size;
vi_screen = GTK_VI_SCREEN(vi->vi_screen);
vi_screen->vadj->value = top;
vi_screen->vadj->upper = mymax;
vi_screen->vadj->page_size =
vi_screen->vadj->page_increment = mysize;
gtk_signal_handler_block(GTK_OBJECT(vi_screen->vadj), vi->value_changed);
gtk_adjustment_changed(vi_screen->vadj);
/*
gtk_adjustment_value_changed(vi_screen->vadj);
*/
gtk_signal_handler_unblock(GTK_OBJECT(vi_screen->vadj), vi->value_changed);
}
/*
* PUBLIC: void gtk_vi_quit __P((GtkViWindow*, gint));
*/
void
gtk_vi_quit(vi, write)
GtkViWindow *vi;
gint write;
{
if (write)
vi->ipviwin->wq(vi->ipviwin);
else
vi->ipviwin->quit(vi->ipviwin);
}
/*
* PUBLIC: void gtk_vi_show_term __P((GtkViWindow*, gint));
*/
void
gtk_vi_show_term(window, show)
GtkViWindow *window;
gint show;
{
gtk_notebook_set_page(GTK_NOTEBOOK(window), show ? 1 : 0);
}
/*
* PUBLIC: void gtk_vi_key_press_event __P((GtkViWindow*, GdkEventKey*));
*/
void
gtk_vi_key_press_event(window, event)
GtkViWindow *window;
GdkEventKey *event;
{
#if 0
static struct {
guint key;
gint offset;
} table[] = {
{GDK_Home, GTK_STRUCT_OFFSET(IPVI, c_bol) },
//{VI_C_BOTTOM, GTK_STRUCT_OFFSET(IPVI, c_bottom) },
{GDK_End, GTK_STRUCT_OFFSET(IPVI, c_eol) },
{GDK_Insert, GTK_STRUCT_OFFSET(IPVI, c_insert) },
{GDK_Left, GTK_STRUCT_OFFSET(IPVI, c_left) },
{GDK_Right, GTK_STRUCT_OFFSET(IPVI, c_right) },
//{VI_C_TOP, GTK_STRUCT_OFFSET(IPVI, c_top) },
};
#endif
static struct {
guint keyval;
char key;
} table[] = {
{ GDK_Left, 'h' },
{ GDK_Right, 'l' },
{ GDK_Up, 'k' },
{ GDK_Down, 'j' },
{ GDK_Page_Up, 'B' - '@' },
{ GDK_Page_Down, 'F' - '@' },
};
char key = event->keyval;
int i;
#if 0
for (i = 0; i < sizeof(table)/sizeof(*table); ++i)
if (table[i].key == event->keyval) {
int (*fun) __P((IPVI*)) =
*(int (**) __P((IPVI*)) )(((char *)vi->ipvi)+table[i].offset);
fun(vi->ipvi);
return;
}
#endif
for (i = 0; i < sizeof(table)/sizeof(*table); ++i)
if (table[i].keyval == event->keyval) {
window->ipviwin->string(window->ipviwin, &table[i].key, 1);
return;
}
if (event->state & GDK_CONTROL_MASK) {
if ((key >= 'a') && (key <= 'z'))
key -= 'a' - 'A';
key -= '@';
}
/*
fprintf(stderr, "key_press %d %d %d %c %p\n",
event->length, event->keyval, event->keyval, key, ipvi);
*/
if (event->length > 0)
window->ipviwin->string(window->ipviwin, &key, 1);
}
static int
vi_key_press_event(vi_screen, event, vi)
GtkViWindow *vi;
GtkWidget *vi_screen;
GdkEventKey *event;
{
gint handled;
handled = gtk_accel_groups_activate (GTK_OBJECT (vi),
event->keyval, (GdkModifierType) event->state);
if (handled)
return 1;
gtk_vi_key_press_event(vi, event);
gtk_signal_emit_stop_by_name(GTK_OBJECT(vi_screen), "key_press_event");
/* handled */
return 1;
}
static void
vi_map(table, vi_screen)
GtkWidget *vi_screen;
GtkWidget *table;
{
gtk_widget_grab_focus(vi_screen);
}
static void
vi_resized(vi_screen, rows, cols, ipviwin)
int rows,cols;
IPVIWIN *ipviwin;
GtkWidget *vi_screen;
{
GtkViWindow *vi_window = GTK_VI_WINDOW((GtkVi*)(ipviwin->private_data));
ipviwin->resize(ipviwin, rows, cols);
vi_window->resized = 1;
}
static void
vi_adjustment_value_changed (adjustment, ipviwin)
GtkAdjustment *adjustment;
IPVIWIN *ipviwin;
{
GtkViWindow *vi_window = GTK_VI_WINDOW((GtkVi*)(ipviwin->private_data));
if (vi_window->resized)
ipviwin->c_settop(ipviwin, adjustment->value);
}
static void
vi_input_func (gpointer data, gint source, GdkInputCondition condition)
{
IPVIWIN *ipviwin = (IPVIWIN *) data;
(void)ipviwin->input(ipviwin, source);
}
static void
vi_init_window (GtkViWindow *window, int fd)
{
static struct ip_si_operations ipsi_ops_gtk = {
vi_addstr,
vi_attribute,
vi_bell,
vi_busyoff,
vi_busyon,
vi_clrtoeol,
vi_deleteln,
vi_discard,
vi_editopt,
vi_insertln,
vi_move,
vi_quit,
vi_redraw,
vi_refresh,
vi_rename,
vi_rewrite,
vi_scrollbar,
vi_select,
vi_split,
(IPFunc_a)vi_waddstr,
};
GtkVi *vi = window->vi;
vi->ipvi->new_window(vi->ipvi, &window->ipviwin, fd);
window->ipviwin->private_data = window;
window->ipviwin->set_ops(window->ipviwin, &ipsi_ops_gtk);
window->input_func = gtk_input_add_full(window->ipviwin->ifd,
GDK_INPUT_READ,
vi_input_func, 0, (gpointer)window->ipviwin, 0);
}
static int
vi_addstr(ipviwin, str, len)
IPVIWIN *ipviwin;
const char *str;
u_int32_t len;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_addstr(GTK_VI_SCREEN(vi->vi_screen), str, len);
return (0);
}
static int
vi_waddstr(ipviwin, str, len)
IPVIWIN *ipviwin;
const CHAR_T *str;
u_int32_t len;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_waddstr(GTK_VI_SCREEN(vi->vi_screen), str, len/sizeof(CHAR_T));
return (0);
}
static int
vi_attribute(ipviwin,attribute,on)
IPVIWIN *ipviwin;
u_int32_t attribute, on;
{
GtkViWindow* window = (GtkViWindow*)(ipviwin->private_data);
if (attribute == SA_ALTERNATE) {
gtk_vi_show_term(window, !on);
}
else
gtk_vi_screen_attribute(GTK_VI_SCREEN(window->vi_screen), attribute, on);
return (0);
}
static int
vi_bell(ipbp)
IPVIWIN *ipbp;
{
/*
fprintf(stderr, "vi_bell\n");
*/
#if 0
/*
* XXX
* Future... implement visible bell.
*/
XBell(XtDisplay(__vi_screen->area), 0);
#endif
return (0);
}
static int
vi_busyon (IPVIWIN* ipviwin, const char *a, u_int32_t s)
{
/*
fprintf(stderr, "vi_busyon\n");
*/
#if 0
__vi_set_cursor(__vi_screen, 1);
#endif
return (0);
}
static int
vi_busyoff(ipbp)
IPVIWIN *ipbp;
{
/*
fprintf(stderr, "vi_busyoff\n");
*/
#if 0
__vi_set_cursor(__vi_screen, 0);
#endif
return (0);
}
static int
vi_clrtoeol(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_clrtoel(GTK_VI_SCREEN(vi->vi_screen));
return 0;
}
static int
vi_deleteln(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_deleteln(GTK_VI_SCREEN(vi->vi_screen));
return (0);
}
static int
vi_editopt (IPVIWIN* a, const char *b, u_int32_t c,
const char *d, u_int32_t e, u_int32_t f)
{
/*
fprintf(stderr, "%p %p vi_editopt\n", a, a->private_data);
*/
#if 0
/* XXX: Nothing. */
#endif
return (0);
}
static int
vi_discard(ipbp)
IPVIWIN *ipbp;
{
/*
fprintf(stderr, "vi_discard\n");
*/
#if 0
/* XXX: Nothing. */
#endif
return (0);
}
static int
vi_insertln(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_insertln(GTK_VI_SCREEN(vi->vi_screen));
return (0);
}
static int
vi_move(ipviwin, row, col)
IPVIWIN *ipviwin;
u_int32_t row;
u_int32_t col;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_move(GTK_VI_SCREEN(vi->vi_screen), row, col);
return (0);
}
static int
vi_redraw(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_widget_draw(GTK_WIDGET(vi->vi_screen), NULL);
return (0);
}
static int
vi_refresh(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_refresh(GTK_VI_SCREEN(vi->vi_screen));
return (0);
}
static int
vi_quit(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_input_remove(vi->input_func);
gtk_widget_destroy(GTK_WIDGET(vi));
return (0);
}
static int
vi_rename(ipviwin, str, len)
IPVIWIN *ipviwin;
const char *str;
u_int32_t len;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gchar* name = g_strndup(str, len);
gtk_signal_emit_by_name(GTK_OBJECT(vi), "rename", name);
g_free(name);
return (0);
}
static int
vi_rewrite(ipviwin, row)
IPVIWIN *ipviwin;
u_int32_t row;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_screen_rewrite(GTK_VI_SCREEN(vi->vi_screen), row);
return (0);
}
static int
vi_scrollbar(ipviwin, top, size, max)
IPVIWIN *ipviwin;
u_int32_t top, size, max;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
gtk_vi_window_scrollbar(vi, top, size, max);
return (0);
}
static int vi_select (IPVIWIN* a, const char * b, u_int32_t c)
{
/*
fprintf(stderr, "vi_select\n");
*/
#if 0
/* XXX: Nothing. */
#endif
return (0);
}
static int
vi_split(ipbp)
IPVIWIN *ipbp;
{
fprintf(stderr, "vi_split\n");
#if 0
/* XXX: Nothing. */
#endif
return (0);
}
static int
vi_ex_init(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
/*
gtk_vi_show_term(vi, 1);
*/
return 0;
}
static int
vi_vi_init(ipviwin)
IPVIWIN *ipviwin;
{
GtkViWindow* vi = (GtkViWindow*)(ipviwin->private_data);
/*
gtk_vi_show_term(vi, 0);
*/
return 0;
}