1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
35 static GtkWidgetClass
*parent_class
= NULL
;
43 /* Forward declararations */
44 static void gtk_vim_class_init (GtkVimClass
*class);
45 static void gtk_vim_init (GtkVim
*vim
);
46 static void gtk_vim_set_arg (GtkObject
*object
,
49 static void gtk_vim_get_arg (GtkObject
*object
,
52 static void gtk_vim_realize (GtkWidget
*widget
);
53 static void gtk_vim_unrealize (GtkWidget
*widget
);
54 static gint
gtk_vim_delete_event (GtkWidget
*widget
,
59 gtk_vim_get_type (void)
61 static GtkType vim_type
= 0;
65 static const GtkTypeInfo vim_info
=
70 (GtkClassInitFunc
) gtk_vim_class_init
,
71 (GtkObjectInitFunc
) gtk_vim_init
,
72 /* reserved_1 */ NULL
,
73 /* reserved_2 */ NULL
,
74 (GtkClassInitFunc
) NULL
,
77 vim_type
= gtk_type_unique (GTK_TYPE_SOCKET
, &vim_info
);
85 gtk_vim_class_init (GtkVimClass
*class)
87 GtkObjectClass
*object_class
;
88 GtkWidgetClass
*widget_class
;
90 object_class
= GTK_OBJECT_CLASS (class);
91 widget_class
= GTK_WIDGET_CLASS (class);
92 parent_class
= gtk_type_class (GTK_TYPE_SOCKET
);
94 gtk_object_add_arg_type ("GtkVim::server_name", GTK_TYPE_STRING
, GTK_ARG_READABLE
, ARG_SERVER_NAME
);
96 object_class
->set_arg
= gtk_vim_set_arg
;
97 object_class
->get_arg
= gtk_vim_get_arg
;
98 widget_class
->delete_event
= gtk_vim_delete_event
;
99 widget_class
->realize
= gtk_vim_realize
;
100 widget_class
->unrealize
= gtk_vim_unrealize
;
104 plug_added (GtkWidget
*widget
,
107 gtk_widget_show (widget
);
111 plug_removed (GtkWidget
*widget
,
114 gtk_widget_hide (widget
);
119 gtk_vim_init (GtkVim
*vim
)
121 vim
->server_name
= NULL
;
124 vim
->init_files
= g_strdup ("");
126 g_signal_connect (GTK_WIDGET (vim
), "plug_added", G_CALLBACK (plug_added
), NULL
);
127 g_signal_connect (GTK_WIDGET (vim
), "plug_removed", G_CALLBACK (plug_removed
), NULL
);
131 * Args. are initial character cols/rows size of widget, plus NULL terminated
132 * list of filenames to edit and/or gvim arguments.
133 * You may of course give everything in one string with space separators.
134 * But you still need the NULL.
137 gtk_vim_new (gint init_cols
,
139 const gchar
*filename
,
144 vim
= gtk_type_new (gtk_vim_get_type ());
146 if (init_cols
<= 0 && init_rows
<= 0)
148 vim
->init_cols
= vim
->init_rows
= 0;
152 vim
->init_cols
= (init_cols
<= 0 ? 80 : init_cols
);
153 vim
->init_rows
= (init_rows
<= 0 ? 24 : init_rows
);
161 va_start( args
, filename
);
163 vim
->init_files
= g_strdup(filename
);
164 for (arg
= (gchar
*)va_arg( args
, gchar
* ); arg
; )
166 tmp
= vim
->init_files
;
167 vim
->init_files
= g_strconcat( tmp
, " ", arg
, NULL
);
175 vim
->init_files
= g_strdup("");
178 return GTK_WIDGET (vim
);
183 gtk_vim_set_arg (GtkObject
*object
,
189 vim
= GTK_VIM (object
);
199 gtk_vim_get_arg (GtkObject
*object
,
205 vim
= GTK_VIM (object
);
209 case ARG_SERVER_NAME
:
210 GTK_VALUE_STRING (*arg
) = g_strdup (vim
->server_name
);
213 arg
->type
= GTK_TYPE_INVALID
;
219 gtk_vim_delete_event (GtkWidget
*widget
,
224 vim
= GTK_VIM (widget
);
226 if (!vim
->server_name
) return TRUE
;
228 if (vim
->socket
.plug_window
)
231 cmd
= g_strdup_printf(
232 "gvim --servername %s --remote-send '<C-\\><C-N>:qa<CR>'",
239 * Eventually, I think this ought to ask vim to quit, and wait for it's
240 * 'save changes' dialogue to return ok/no, and then return here
242 * But we don't have that I/F yet, so just return TRUE ("OK to delete").
243 * So for now, don't select 'Cancel' from a vim 'save changes' prompt!
249 gtk_vim_realize (GtkWidget
*widget
)
252 gchar
*cmd
, *xid_str
;
254 /* Do socket realize */
255 parent_class
->realize(widget
);
257 vim
= GTK_VIM (widget
);
261 g_error( "gtk_vim_realize(): no parent" );
264 else if (!widget
->parent
->window
)
266 g_error( "gtk_vim_realize(): no parent window" );
270 /* Ensure GDK has created our window so we know it's ID */
274 g_error( "gtk_vim_realize(): no window" );
278 /* Now find XID of sub-window we're to use */
279 xid_str
= g_strdup_printf( "0x%X",
281 GDK_WINDOW_XWINDOW(widget
->window
)
283 gtk_socket_get_id(&(vim
->socket
))
286 vim
->server_name
= g_strdup_printf( "GtkVim-%s", xid_str
);
288 /* Fork off a gvim (it forks itself) */
289 if (vim
->init_cols
== 0 || vim
->init_rows
== 0)
291 cmd
= g_strdup_printf(
292 "gvim --servername %s --socketid %s %s",
293 vim
->server_name
, xid_str
,
298 cmd
= g_strdup_printf(
299 "gvim -geom %dx%d --servername %s --socketid %s %s",
300 vim
->init_cols
, vim
->init_rows
,
301 vim
->server_name
, xid_str
,
312 gtk_vim_unrealize (GtkWidget
*widget
)
316 vim
= GTK_VIM (widget
);
318 if (vim
->server_name
)
320 g_free (vim
->server_name
);
321 vim
->server_name
= NULL
;
325 g_free (vim
->init_files
);
326 vim
->init_files
= NULL
;
329 /* Do socket unrealize */
330 parent_class
->unrealize(widget
);
335 gtk_vim_get_server_name (GtkVim
*widget
)
339 g_return_val_if_fail (widget
!= NULL
, NULL
);
340 g_return_val_if_fail (GTK_IS_VIM (widget
), NULL
);
342 vim
= GTK_VIM (widget
);
344 return g_strdup (vim
->server_name
);
349 gtk_vim_edit (GtkVim
*widget
,
350 const gchar
*filename
,
356 gchar
*arg
, *tmp
, *cmd
;
358 g_return_if_fail (widget
!= NULL
);
359 g_return_if_fail (GTK_IS_VIM (widget
));
360 g_return_if_fail (filename
!= NULL
);
362 vim
= GTK_VIM (widget
);
365 g_return_if_fail (vim->server_name != NULL);
366 g_return_if_fail (vim->socket.plug_window != NULL);
369 g_message ("Adding files to edit");
370 va_start( args
, filename
);
372 /* If the server is not yet started, put the files in init files list */
373 if (vim
->server_name
)
375 files
= g_strdup(filename
);
379 tmp
= vim
->init_files
;
380 vim
->init_files
= g_strconcat(tmp
, " ", filename
, NULL
);
383 for (arg
= (gchar
*)va_arg( args
, gchar
* ); arg
; )
385 if (vim
->server_name
)
388 files
= g_strconcat( tmp
, " ", arg
, NULL
);
393 tmp
= vim
->init_files
;
394 vim
->init_files
= g_strconcat( tmp
, " ", arg
, NULL
);
401 if (!vim
->server_name
)
404 cmd
= g_strdup_printf(
405 "gvim --servername %s --remote-send '<C-\\><C-N>:drop %s<CR>'",
406 vim
->server_name
, files
);
415 gtk_vim_remote_send (GtkVim
*widget
,
421 g_return_if_fail (widget
!= NULL
);
422 g_return_if_fail (GTK_IS_VIM (widget
));
423 g_return_if_fail (keys
!= NULL
);
425 vim
= GTK_VIM (widget
);
427 g_return_if_fail (vim
->server_name
!= NULL
);
428 g_return_if_fail (vim
->socket
.plug_window
!= NULL
);
430 cmd
= g_strdup_printf(
431 "gvim --servername %s --remote-send '%s'",
432 vim
->server_name
, keys
);
440 gtk_vim_goto( GtkVim
*widget
,
448 g_return_if_fail (widget
!= NULL
);
449 g_return_if_fail (GTK_IS_VIM (widget
));
450 g_return_if_fail (line
> 0 && column
>= 0);
452 vim
= GTK_VIM (widget
);
454 g_return_if_fail (vim
->server_name
!= NULL
);
455 g_return_if_fail (vim
->socket
.plug_window
!= NULL
);
459 vimcmd
= g_strdup_printf(
460 "<C-\\><C-N>:buffer %s<cr>%dG%d|",
461 buffer
, line
, column
);
465 vimcmd
= g_strdup_printf(
470 cmd
= g_strdup_printf(
471 "gvim --servername %s --remote-send '%s'",
472 vim
->server_name
, vimcmd
);