1 /*
2 * Copyright 2000-2001: Sergio Rua
3 * Copyright 2008 Joop Stakenborg <pg4i@amsat.org>
4 * Copyright 2008 Anibal Avelar <aavelar@cofradia.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
19 */
20
21 #include <stdio.h>
22 #include <errno.h>
23 #include <string.h>
24 #include <unistd.h>
25 #include <stdlib.h>
26 #include <time.h>
27 #include <zlib.h>
28 #include <sys/types.h>
29 #include <signal.h>
30 #include <unistd.h>
31 #include <sys/wait.h>
32
33 #include <gtk/gtk.h>
34
35 #include "callbacks.h"
36 #include "interface.h"
37 #include "support.h"
38
39 #define BUFFER_SIZE 131072
40
41 extern GtkWidget *wprincipal;
42 GtkWidget *open_file=NULL;
43 GtkWidget *save_file=NULL;
44 GtkWidget *buscar=NULL;
45 GtkWidget *about=NULL;
46 GtkWidget *exit_dialog=NULL;
47 GtkWidget *prefs=NULL;
48 GtkWidget *wizard=NULL;
49
50 gchar *filename=NULL;
51 gint in_gzip=0;
52
53 /* Funciones */
54 static void save_as(gchar *name);
55 static void mensaje (gchar *msg,gint tipo);
56 static gchar *ReadConfFromFile(gchar *variable);
57 static void insert_label(const gchar *base,const gchar *text_info);
58 static void help_without_gnome(GtkWidget *wid);
59 static void open_man_file(gchar *manfile);
60
61
62 /* Eventos */
63 void
on_wprincipal_delete(GtkObject * object,gpointer user_data)64 on_wprincipal_delete (GtkObject *object,
65 gpointer user_data)
66 {
67 if (exit_dialog==NULL)
68 exit_dialog=create_exit_dialog();
69
70 gtk_widget_show(exit_dialog);
71 }
72
73 void
on_cortar1_activate(GtkMenuItem * menuitem,gpointer user_data)74 on_cortar1_activate (GtkMenuItem *menuitem,
75 gpointer user_data)
76 {
77 GtkWidget *text,*statusbar;
78
79 text = lookup_widget (GTK_WIDGET (wprincipal), "text");
80 GtkTextBuffer *b = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text));
81 gtk_text_buffer_cut_clipboard (b, gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), TRUE);
82 statusbar = lookup_widget (GTK_WIDGET (wprincipal), "statusbar1");
83 gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
84 gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, _("Text cut."));
85 }
86
87
88 void
on_copiar1_activate(GtkMenuItem * menuitem,gpointer user_data)89 on_copiar1_activate (GtkMenuItem *menuitem,
90 gpointer user_data)
91 {
92 GtkWidget *text,*statusbar;
93
94 text = lookup_widget (GTK_WIDGET (wprincipal), "text");
95 GtkTextBuffer *b = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text));
96 gtk_text_buffer_copy_clipboard (b, gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
97 statusbar = lookup_widget (GTK_WIDGET (wprincipal), "statusbar1");
98 gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
99 gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, _("Text copied."));
100
101 }
102
103
104 void
on_pegar1_activate(GtkMenuItem * menuitem,gpointer user_data)105 on_pegar1_activate (GtkMenuItem *menuitem,
106 gpointer user_data)
107 {
108 GtkWidget *text,*statusbar;
109
110 text = lookup_widget (GTK_WIDGET (wprincipal), "text");
111 GtkTextBuffer *b = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text));
112 gtk_text_buffer_paste_clipboard (b, gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), NULL, TRUE);
113
114 statusbar = lookup_widget (GTK_WIDGET (wprincipal), "statusbar1");
115 gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
116 gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, _("Text pasted."));
117 }
118
119
120 void
on_pagina_base1_activate(GtkMenuItem * menuitem,gpointer user_data)121 on_pagina_base1_activate (GtkMenuItem *menuitem,
122 gpointer user_data)
123 {
124 const gchar *base=_(
125 ".\\\"Created with GNOME Manpages Editor\n"
126 ".\\\"http://sourceforge.net/projects/gmanedit2\n\n"
127 ".\\\"Replace <program> with the program name, x with the Section Number\n"
128 ".TH <program> x \"<date>\" \"\" \"Linux User\'s Manual\"\n\n"
129 ".SH NAME\n<program> \\- program for...\n\n."
130 ".SH SYNOPSIS\n.B <program>\n.RI [ options ]\n.br\n\n"
131 ".SH DESCRIPTION\nThis manual page explains the \\fB<program>\\fP program."
132 " The \\fB<program>\\fP program is for...\n\n"
133 ".SH OPTIONS\n.IP \\fB\\-OPTION\\fP\nThis option...\n\n"
134 ".SH NOTES\n\n"
135 ".SH \"SEE ALSO\"\n");
136
137 insert_label(base,"Page created.");
138 }
139
140
141 void
on_novo1_activate(GtkMenuItem * menuitem,gpointer user_data)142 on_novo1_activate (GtkMenuItem *menuitem,
143 gpointer user_data)
144 {
145 GtkWidget *text,*statusbar;
146
147 text=lookup_widget(GTK_WIDGET(wprincipal),"text");
148 GtkTextBuffer *b = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text));
149 gtk_text_buffer_set_text (b, "", -1);
150 statusbar = lookup_widget(GTK_WIDGET(wprincipal),"statusbar1");
151 gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
152 gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, _("New file."));
153 in_gzip=0;
154 }
155
156
157 void
on_abrir1_activate(GtkMenuItem * menuitem,gpointer user_data)158 on_abrir1_activate (GtkMenuItem *menuitem,
159 gpointer user_data)
160 {
161 const gchar *temp;
162
163 open_file = create_fileselection (GTK_WIDGET(wprincipal));
164 gtk_widget_show (open_file);
165 if (gtk_dialog_run (GTK_DIALOG (open_file)) == GTK_RESPONSE_ACCEPT)
166 {
167 temp = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (open_file));
168 filename = g_strdup(temp);
169 gtk_widget_hide(open_file);
170 open_man_file(filename);
171 }
172 else
173 gtk_widget_destroy (open_file);
174 }
175
176
177 void
on_gardar1_activate(GtkMenuItem * menuitem,gpointer user_data)178 on_gardar1_activate (GtkMenuItem *menuitem,
179 gpointer user_data)
180 {
181 const gchar *temp;
182 if (filename!=NULL)
183 save_as(filename);
184 else
185 {
186 save_file=create_save_file(GTK_WIDGET(wprincipal));
187 gtk_widget_show(save_file);
188 if (gtk_dialog_run (GTK_DIALOG (save_file)) == GTK_RESPONSE_ACCEPT)
189 {
190 temp = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (save_file));
191 filename = g_strdup(temp);
192 gtk_widget_hide(save_file);
193 save_as(filename);
194 }else{
195 gtk_widget_destroy (save_file);
196 }
197 }
198 }
199
200
201 void
on_gardar_como1_activate(GtkMenuItem * menuitem,gpointer user_data)202 on_gardar_como1_activate (GtkMenuItem *menuitem,
203 gpointer user_data)
204 {
205 const gchar *temp;
206 save_file=create_save_file(GTK_WIDGET(wprincipal));
207 gtk_widget_show(save_file);
208 if (gtk_dialog_run (GTK_DIALOG (save_file)) == GTK_RESPONSE_ACCEPT)
209 {
210 temp = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (save_file));
211 filename = g_strdup(temp);
212 gtk_widget_hide(save_file);
213 save_as(filename);
214 }else{
215 gtk_widget_destroy (save_file);
216 }
217 }
218
219
220 void
on_sair4_activate(GtkMenuItem * menuitem,gpointer user_data)221 on_sair4_activate (GtkMenuItem *menuitem,
222 gpointer user_data)
223 {
224 if (exit_dialog==NULL)
225 exit_dialog=create_exit_dialog();
226
227 gtk_widget_show(exit_dialog);
228 }
229
save_as(gchar * name)230 static void save_as(gchar *name)
231 {
232 GtkWidget *text,*statusbar;
233 FILE *f;
234 gchar *datos;
235 gint bytes_written;
236 char extension[5];
237 int n;
238
239 /* Esta comprabaci�n se hace para permitir guardar un fichero comprimido */
240 /* sin comprimir */
241 n = strlen(name)-3;
242 strncpy(extension,name+n,3);
243 if (!strncmp(extension,".gz",3))
244 in_gzip=1;
245 else
246 in_gzip=0;
247
248 text=lookup_widget(GTK_WIDGET(wprincipal),"text");
249
250 /* Barra de estado */
251 statusbar=lookup_widget(GTK_WIDGET(wprincipal),"statusbar1");
252 gtk_statusbar_pop(GTK_STATUSBAR(statusbar),1);
253
254 GtkTextBuffer *b = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text));
255 GtkTextIter startiter, enditer;
256 gtk_text_buffer_get_start_iter (b, &startiter);
257 gtk_text_buffer_get_end_iter (b, &enditer);
258 datos=gtk_text_buffer_get_text (b, &startiter, &enditer, FALSE);
259
260 if (in_gzip)
261 f=gzopen(name,"wb");
262 else
263 f=fopen(name,"w");
264
265 if ((f!=NULL) && (f!=Z_NULL))
266 {
267 if (!in_gzip)
268 bytes_written=fwrite(datos,sizeof(gchar),strlen(datos),f);
269 else
270 bytes_written=gzwrite(f,datos,strlen(datos));
271 gtk_statusbar_push(GTK_STATUSBAR(statusbar),1,_("File saved."));
272 }
273 else
274 {
275 gtk_statusbar_push(GTK_STATUSBAR(statusbar),1,_("File NOT saved."));
276 mensaje(strerror(errno),GTK_MESSAGE_ERROR);
277 }
278 if (in_gzip)
279 gzclose(f);
280 else
281 fclose(f);
282 }
283
284 void
on_titulo_activate(GtkMenuItem * menuitem,gpointer user_data)285 on_titulo_activate (GtkMenuItem *menuitem,
286 gpointer user_data)
287 {
288 const gchar *base=_(".TH <program> <section number> \"<date>\" \"\" \"Linux User\'s Manual\"\n\n");
289
290 insert_label(base,"Title written.");
291 }
292
293
294 void
on_nome1_activate(GtkMenuItem * menuitem,gpointer user_data)295 on_nome1_activate (GtkMenuItem *menuitem,
296 gpointer user_data)
297 {
298 const gchar *base=_(".SH NAME\n<program> \\- program for... \n");
299
300 insert_label(base,"Section name written.");
301 }
302
303
304 void
on_sinopsis1_activate(GtkMenuItem * menuitem,gpointer user_data)305 on_sinopsis1_activate (GtkMenuItem *menuitem,
306 gpointer user_data)
307 {
308 const gchar *base=_(".SH SYNOPSIS\n");
309
310 insert_label(base,"Section synopsis written.");
311 }
312
313
314 void
on_configuration_activate(GtkMenuItem * menuitem,gpointer user_data)315 on_configuration_activate (GtkMenuItem *menuitem,
316 gpointer user_data)
317 {
318 const gchar *base=_(".SH CONFIGURATION\n");
319
320 insert_label(base,"Section configuration written.");
321 }
322
323 void
on_descripcion1_activate(GtkMenuItem * menuitem,gpointer user_data)324 on_descripcion1_activate (GtkMenuItem *menuitem,
325 gpointer user_data)
326 {
327 const gchar *base=_(".SH DESCRIPTION\n");
328
329 insert_label(base,"Section description written.");
330 }
331
332
333 void
on_opcions1_activate(GtkMenuItem * menuitem,gpointer user_data)334 on_opcions1_activate (GtkMenuItem *menuitem,
335 gpointer user_data)
336 {
337 const gchar *base=_(".SH OPTIONS\n");
338
339 insert_label(base,"Section options written.");
340 }
341
342
343 void
on_valores_retornados1_activate(GtkMenuItem * menuitem,gpointer user_data)344 on_valores_retornados1_activate (GtkMenuItem *menuitem,
345 gpointer user_data)
346 {
347 const gchar *base=_(".SH \"RETURN VALUE\"\n");
348
349 insert_label(base,"Section return value written.");
350 }
351
352
353 void
on_estados_de_saida1_activate(GtkMenuItem * menuitem,gpointer user_data)354 on_estados_de_saida1_activate (GtkMenuItem *menuitem,
355 gpointer user_data)
356 {
357 const gchar *base=_(".SH \"EXIT STATUS\"\n");
358 insert_label(base,"Section exit status written.");
359 }
360
361
362 void
on_errors_activate(GtkMenuItem * menuitem,gpointer user_data)363 on_errors_activate (GtkMenuItem *menuitem,
364 gpointer user_data)
365 {
366 const gchar *base=_(".SH ERRORS\n");
367
368 insert_label(base,"Section errors written.");
369 }
370
371
372 void
on_ficheiro1_activate(GtkMenuItem * menuitem,gpointer user_data)373 on_ficheiro1_activate (GtkMenuItem *menuitem,
374 gpointer user_data)
375 {
376 const gchar *base=_(".SH FILES\n");
377 insert_label(base,"Section files written.");
378 }
379
380
381 void
on_entorno1_activate(GtkMenuItem * menuitem,gpointer user_data)382 on_entorno1_activate (GtkMenuItem *menuitem,
383 gpointer user_data)
384 {
385 const gchar *base=_(".SH ENVIRONMENT\n");
386 insert_label(base,"Section environment written.");
387 }
388
389
390 void
on_versions_activate(GtkMenuItem * menuitem,gpointer user_data)391 on_versions_activate (GtkMenuItem *menuitem,
392 gpointer user_data)
393 {
394 const gchar *base=_(".SH VERSIONS\n");
395 insert_label(base,"Section versions written.");
396 }
397
398
399 void
on_notas1_activate(GtkMenuItem * menuitem,gpointer user_data)400 on_notas1_activate (GtkMenuItem *menuitem,
401 gpointer user_data)
402 {
403 const gchar *base=_(".SH NOTES\n");
404 insert_label(base,"Section notes written.");
405 }
406
407
408 void
on_bugs1_activate(GtkMenuItem * menuitem,gpointer user_data)409 on_bugs1_activate (GtkMenuItem *menuitem,
410 gpointer user_data)
411 {
412 const gchar *base=_(".SH BUGS\n");
413 insert_label(base,"Section bugs written.");
414 }
415
416
417 void
on_exemplos1_activate(GtkMenuItem * menuitem,gpointer user_data)418 on_exemplos1_activate (GtkMenuItem *menuitem,
419 gpointer user_data)
420 {
421 const gchar *base=_(".SH EXAMPLE\n");
422
423 insert_label(base,"Section examples written.");
424 }
425
426
427 void
on_ver_tamen1_activate(GtkMenuItem * menuitem,gpointer user_data)428 on_ver_tamen1_activate (GtkMenuItem *menuitem,
429 gpointer user_data)
430 {
431 const gchar *base=_(".SH \"SEE ALSO\"\n");
432 insert_label(base,"Section see also written.");
433 }
434
435
436 void
on_conforme_a1_activate(GtkMenuItem * menuitem,gpointer user_data)437 on_conforme_a1_activate (GtkMenuItem *menuitem,
438 gpointer user_data)
439 {
440 const gchar *base=_(".SH \"CONFORMING TO\"\n");
441 insert_label(base,"Section conforming to written.");
442 }
443
444
445 void
on__1_activate(GtkMenuItem * menuitem,gpointer user_data)446 on__1_activate (GtkMenuItem *menuitem,
447 gpointer user_data)
448 {
449
450 }
451
452
453 void
on_otro1_activate(GtkMenuItem * menuitem,gpointer user_data)454 on_otro1_activate (GtkMenuItem *menuitem,
455 gpointer user_data)
456 {
457 const gchar *base=_(".SH \"<SECTION NAME>\"\n");
458 insert_label(base,"Section other written.");
459 }
460
461
462 void
on_ambas1_activate(GtkMenuItem * menuitem,gpointer user_data)463 on_ambas1_activate (GtkMenuItem *menuitem,
464 gpointer user_data)
465 {
466 const gchar *base=".AD B\n";
467 insert_label(base,"Right and left justify.");
468 }
469
470
471 void
on_activar1_activate(GtkMenuItem * menuitem,gpointer user_data)472 on_activar1_activate (GtkMenuItem *menuitem,
473 gpointer user_data)
474 {
475 const gchar *base=".FI\n";
476 insert_label(base,"Filling enabled.");
477 }
478
479
480 void
on_desactivar1_activate(GtkMenuItem * menuitem,gpointer user_data)481 on_desactivar1_activate (GtkMenuItem *menuitem,
482 gpointer user_data)
483 {
484 const gchar *base=".NF\n";
485 insert_label(base,"Filling disabled.");
486 }
487
488
489 void
on_bold1_activate(GtkMenuItem * menuitem,gpointer user_data)490 on_bold1_activate (GtkMenuItem *menuitem,
491 gpointer user_data)
492 {
493 const gchar *base=".B\n";
494 insert_label(base,"Font Bold selected.");
495 }
496
497
498 void
on_bold_roman1_activate(GtkMenuItem * menuitem,gpointer user_data)499 on_bold_roman1_activate (GtkMenuItem *menuitem,
500 gpointer user_data)
501 {
502 const gchar *base=".BR\n";
503 insert_label(base,"Font Bold-Roman selected.");
504 }
505
506
507 void
on_italica1_activate(GtkMenuItem * menuitem,gpointer user_data)508 on_italica1_activate (GtkMenuItem *menuitem,
509 gpointer user_data)
510 {
511 const gchar *base=".I\n";
512 insert_label(base,"Font Italic selected.");
513 }
514
515
516 void
on_italica_bold1_activate(GtkMenuItem * menuitem,gpointer user_data)517 on_italica_bold1_activate (GtkMenuItem *menuitem,
518 gpointer user_data)
519 {
520 const gchar *base=".IB\n";
521 insert_label(base,"Font Italic-Bold selected.");
522 }
523
524
525 void
on_italica_roman1_activate(GtkMenuItem * menuitem,gpointer user_data)526 on_italica_roman1_activate (GtkMenuItem *menuitem,
527 gpointer user_data)
528 {
529 const gchar *base=".IR\n";
530 insert_label(base,"Font Italic-Roman selected.");
531 }
532
533
534 void
on_roman_bold1_activate(GtkMenuItem * menuitem,gpointer user_data)535 on_roman_bold1_activate (GtkMenuItem *menuitem,
536 gpointer user_data)
537 {
538 const gchar *base=".RB\n";
539 insert_label(base,"Font Roman-Bold selected.");
540 }
541
542
543 void
on_roman_italic1_activate(GtkMenuItem * menuitem,gpointer user_data)544 on_roman_italic1_activate (GtkMenuItem *menuitem,
545 gpointer user_data)
546 {
547 const gchar *base=".RI\n";
548 insert_label(base,"Font Roman-Italic selected.");
549 }
550
551
552 void
on_small_bold1_activate(GtkMenuItem * menuitem,gpointer user_data)553 on_small_bold1_activate (GtkMenuItem *menuitem,
554 gpointer user_data)
555 {
556 const gchar *base=".SB\n";
557 insert_label(base,"Font Small-Bold selected.");
558 }
559
560
561 void
on_small1_activate(GtkMenuItem * menuitem,gpointer user_data)562 on_small1_activate (GtkMenuItem *menuitem,
563 gpointer user_data)
564 {
565 const gchar *base=".SM\n";
566 insert_label(base,"Font Small selected.");
567 }
568
569
570 void
on_novo_parrafo1_activate(GtkMenuItem * menuitem,gpointer user_data)571 on_novo_parrafo1_activate (GtkMenuItem *menuitem,
572 gpointer user_data)
573 {
574 const gchar *base=".LP\n";
575 insert_label(base,"New paragraph.");
576 }
577
578
579 void
on_comezo_parrafo1_activate(GtkMenuItem * menuitem,gpointer user_data)580 on_comezo_parrafo1_activate (GtkMenuItem *menuitem,
581 gpointer user_data)
582 {
583 const gchar *base=".PP\n";
584 insert_label(base,"Paragraph start.");
585 }
586
587
588 void
on_comezo_marxen1_activate(GtkMenuItem * menuitem,gpointer user_data)589 on_comezo_marxen1_activate (GtkMenuItem *menuitem,
590 gpointer user_data)
591 {
592 const gchar *base=_(".RS <margin position>\n");
593 insert_label(base,"Margin position.");
594 }
595
596
597 void
on_finaliza_marxen1_activate(GtkMenuItem * menuitem,gpointer user_data)598 on_finaliza_marxen1_activate (GtkMenuItem *menuitem,
599 gpointer user_data)
600 {
601 const gchar *base=".RE\n";
602 insert_label(base,"Relative margin end.");
603 }
604
605
606 void
on_tabulador_por_defecto1_activate(GtkMenuItem * menuitem,gpointer user_data)607 on_tabulador_por_defecto1_activate (GtkMenuItem *menuitem,
608 gpointer user_data)
609 {
610 const gchar *base=".DT\n";
611 insert_label(base,"Default tab.");
612 }
613
614
615 void
on_subcabeceira1_activate(GtkMenuItem * menuitem,gpointer user_data)616 on_subcabeceira1_activate (GtkMenuItem *menuitem,
617 gpointer user_data)
618 {
619 const gchar *base=_(".SS \"<NAME>\"\n");
620 insert_label(base,"Subheader inserted.");
621 }
622
623 void
on_xustificacion_a_esquerda1_activate(GtkMenuItem * menuitem,gpointer user_data)624 on_xustificacion_a_esquerda1_activate (GtkMenuItem *menuitem,
625 gpointer user_data)
626 {
627 const gchar *base=".AD L\n";
628 insert_label(base,"Left justifier.");
629
630 }
631
632 void
on_paxina_creada1_activate(GtkMenuItem * menuitem,gpointer user_data)633 on_paxina_creada1_activate (GtkMenuItem *menuitem,
634 gpointer user_data)
635 {
636 GtkWidget *text,*statusbar;
637 FILE *f;
638 gint bytes_written=0;
639 gchar temp[30];
640 gchar command[50],*datos;
641 gint exitstatus;
642
643 /* I read conf file ~/.gmaneditrc */
644
645 strcpy(temp, "/tmp/gmanedit.XXXXXX");
646 mkstemp (temp);
647 datos=ReadConfFromFile("COMMAND");
648
649 if (datos==NULL)
650 snprintf(command, sizeof command, "xterm -e man -l %s", temp);
651 else
652 snprintf(command, sizeof command, "%s -l %s", datos, temp);
653
654 text=lookup_widget(wprincipal,"text");
655
656 /* Barra de estado */
657 statusbar=lookup_widget(wprincipal,"statusbar1");
658 gtk_statusbar_pop(GTK_STATUSBAR(statusbar),1);
659 gtk_statusbar_push(GTK_STATUSBAR(statusbar),1,_("Page preview."));
660
661 GtkTextBuffer *b = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text));
662 GtkTextIter startiter, enditer;
663 gtk_text_buffer_get_start_iter (b, &startiter);
664 gtk_text_buffer_get_end_iter (b, &enditer);
665 datos=gtk_text_buffer_get_text (b, &startiter, &enditer, FALSE);
666 if ((f=fopen(temp,"w"))!=NULL)
667 {
668 bytes_written=fwrite(datos,sizeof(gchar),strlen(datos),f);
669 fclose(f);
670 }
671 else
672 mensaje(strerror(errno),GTK_MESSAGE_ERROR);
673
674
675 if (bytes_written>0)
676 g_spawn_command_line_sync(command, NULL, NULL, &exitstatus, NULL);
677 unlink(temp);
678 }
679
680 void
on_buscar_e_reemprazar1_activate(GtkMenuItem * menuitem,gpointer user_data)681 on_buscar_e_reemprazar1_activate (GtkMenuItem *menuitem,
682 gpointer user_data)
683 {
684 if (buscar == NULL)
685 buscar = create_wbuscar();
686
687 gtk_widget_show(buscar);
688 }
689
690 void
on_opcions_programa1_activate(GtkMenuItem * menuitem,gpointer user_data)691 on_opcions_programa1_activate (GtkMenuItem *menuitem,
692 gpointer user_data)
693 {
694 gchar *aux;
695 GtkWidget *obj;
696 gchar datos[255];
697
698 prefs=create_wpreferences();
699 aux=ReadConfFromFile("COMMAND");
700 if (aux != NULL)
701 {
702 strncpy(datos,aux, sizeof datos - 1);
703 datos[sizeof(datos) - 1] = 0;
704 obj=lookup_widget(GTK_WIDGET(prefs),"entry_command");
705 gtk_entry_set_text(GTK_ENTRY(obj),datos);
706 }
707 aux=ReadConfFromFile("INTERNET_BROWSER");
708 if (aux != NULL)
709 {
710 strncpy(datos,aux, sizeof(datos) - 1);
711 datos[sizeof(datos) - 1] = 0;
712 obj=lookup_widget(GTK_WIDGET(prefs),"combo2");
713 if (!strcmp(datos, "mozilla"))
714 gtk_combo_box_set_active (GTK_COMBO_BOX(obj), 0);
715 else if (!strcmp(datos, "firefox"))
716 gtk_combo_box_set_active (GTK_COMBO_BOX(obj), 1);
717 else if (!strcmp(datos, "galeon"))
718 gtk_combo_box_set_active (GTK_COMBO_BOX(obj), 2);
719 else if (!strcmp(datos, "epiphany"))
720 gtk_combo_box_set_active (GTK_COMBO_BOX(obj), 3);
721 else if (!strcmp(datos, "konqueror"))
722 gtk_combo_box_set_active (GTK_COMBO_BOX(obj), 4);
723 }
724 gtk_widget_show(prefs);
725 }
726
727
728 void
on_bbuscar_clicked(GtkButton * button,gpointer user_data)729 on_bbuscar_clicked (GtkButton *button,
730 gpointer user_data)
731 {
732
733 }
734
735
736 void
on_breemprazar_clicked(GtkButton * button,gpointer user_data)737 on_breemprazar_clicked (GtkButton *button,
738 gpointer user_data)
739 {
740
741 }
742
743
744 void
on_bpechar_clicked(GtkButton * button,gpointer user_data)745 on_bpechar_clicked (GtkButton *button,
746 gpointer user_data)
747 {
748 gtk_widget_hide(buscar);
749 }
750
751
752 void
on_data1_activate(GtkMenuItem * menuitem,gpointer user_data)753 on_data1_activate (GtkMenuItem *menuitem,
754 gpointer user_data)
755 {
756 GtkWidget *text,*statusbar;
757 GtkTextBuffer* buffer;
758 time_t fech;
759 struct tm *fecha;
760 gchar cad[30];
761 gchar *meses[]={_("January"),_("February"),_("March"),_("April"),
762 _("May"),_("June"),_("July"),_("August"),
763 _("September"),_("October"),_("November"),_("December")};
764
765
766 time(&fech);
767 fecha=localtime(&fech);
768
769 if (fecha!=NULL)
770 {
771 sprintf(cad,"%d %s %d",fecha->tm_mday,meses[fecha->tm_mon],fecha->tm_year+1900);
772 text=lookup_widget(wprincipal,"text");
773 if (GTK_IS_TEXT_VIEW (text)){
774 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
775 gtk_text_buffer_insert_at_cursor( buffer, cad ,strlen(cad));
776 }
777 statusbar = lookup_widget(wprincipal,"statusbar1");
778 gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
779 gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, _("Date inserted."));
780 }
781 else
782 mensaje(_("Cannot get system date!"),GTK_MESSAGE_ERROR);
783 }
784
785 void
on_about2_activate(GtkMenuItem * menuitem,gpointer user_data)786 on_about2_activate (GtkMenuItem *menuitem,
787 gpointer user_data)
788 {
789 create_about();
790 }
791
792 static void
mensaje(gchar * msg,gint tipo)793 mensaje (gchar *msg,gint tipo)
794 {
795 GtkWidget *msgbox;
796
797 msgbox=gtk_message_dialog_new(GTK_WINDOW(wprincipal),GTK_DIALOG_MODAL,tipo, GTK_BUTTONS_OK, msg,NULL);
798 gtk_dialog_run (GTK_DIALOG (msgbox));
799 gtk_widget_destroy (msgbox);
800 }
801
802 void
on_bdialog_yes_clicked(GtkButton * button,gpointer user_data)803 on_bdialog_yes_clicked (GtkButton *button,
804 gpointer user_data)
805 {
806 gtk_main_quit();
807 }
808
809
810 void
on_bdialog_no_clicked(GtkButton * button,gpointer user_data)811 on_bdialog_no_clicked (GtkButton *button,
812 gpointer user_data)
813 {
814 gtk_widget_hide(exit_dialog);
815 }
816
817 void
on_bpok_clicked(GtkButton * button,gpointer user_data)818 on_bpok_clicked (GtkButton *button,
819 gpointer user_data)
820 {
821 FILE *p;
822 GtkWidget *entry,*ch;
823 const gchar *entry_text=NULL;
824 gchar buf[1024];
825 gchar *rcname, *browser;
826
827 rcname = g_build_filename (g_get_home_dir(), G_DIR_SEPARATOR_S, ".gmaneditrc", NULL );
828
829 entry=lookup_widget(prefs,"entry_command");
830 entry_text=gtk_entry_get_text(GTK_ENTRY(entry));
831 ch = lookup_widget(prefs, "combo2");
832 browser = gtk_combo_box_get_active_text (GTK_COMBO_BOX (ch));
833 snprintf(buf, sizeof buf, "# File created by gmanedit preferences option\n\nCOMMAND=%s\nINTERNET_BROWSER=%s", entry_text, browser);
834 g_free(browser);
835
836 if ((p=fopen(rcname,"w"))!=NULL)
837 {
838 fprintf(p,"%s\n",buf);
839 fclose(p);
840 }
841 else
842 mensaje(strerror(errno),GTK_MESSAGE_ERROR);
843 g_free (rcname);
844 gtk_widget_destroy(prefs);
845 }
846
847
848 void
on_bpcancel_clicked(GtkButton * button,gpointer user_data)849 on_bpcancel_clicked (GtkButton *button,
850 gpointer user_data)
851 {
852 gtk_widget_destroy(prefs);
853 }
854
ReadConfFromFile(gchar * variable)855 static gchar *ReadConfFromFile(gchar *variable)
856 {
857 FILE *f;
858 gchar *rcname;
859 gchar *tok;
860 gchar buf[1024];
861
862 rcname = g_build_filename (g_get_home_dir(), G_DIR_SEPARATOR_S, ".gmaneditrc", NULL );
863 f = fopen(rcname,"r");
864 g_free (rcname);
865
866 if (f == NULL) return((gchar *)NULL);
867
868 while (fgets(buf,80,f) != NULL)
869 {
870 if (buf[strlen(buf)-1] == '\n')
871 buf[strlen(buf)-1] = '\0';
872
873 if ((buf[0] != '#') && (!strncmp(variable,buf,strlen(variable))))
874 {
875 tok = strtok(buf,"=");
876 tok = strtok(NULL,"=");
877 fclose(f);
878 return(tok);
879 }
880 }
881 fclose(f);
882 return((gchar *)NULL);
883 }
884
885 void
on_help1_activate(GtkMenuItem * menuitem,gpointer user_data)886 on_help1_activate (GtkMenuItem *menuitem,
887 gpointer user_data)
888 {
889 help_without_gnome(wprincipal);
890 }
891
892
893 void
on_select_all1_activate(GtkMenuItem * menuitem,gpointer user_data)894 on_select_all1_activate (GtkMenuItem *menuitem,
895 gpointer user_data)
896 {
897 GtkWidget *text,*statusbar;
898 gchar *datos;
899
900 text = lookup_widget (GTK_WIDGET (wprincipal), "text");
901
902 GtkTextBuffer *b = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text));
903 GtkTextIter startiter, enditer;
904 gtk_text_buffer_get_start_iter (b, &startiter);
905 gtk_text_buffer_get_end_iter (b, &enditer);
906 datos=gtk_text_buffer_get_text (b, &startiter, &enditer, FALSE);
907
908 if (strlen(datos)>0)
909 {
910 gtk_text_buffer_select_range (b, &startiter, &enditer);
911 statusbar = lookup_widget (GTK_WIDGET (wprincipal), "statusbar1");
912 gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
913 gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, _("Text selected."));
914 }
915 }
916
917
918 void
on_new_wizard_page1_activate(GtkMenuItem * menuitem,gpointer user_data)919 on_new_wizard_page1_activate (GtkMenuItem *menuitem,
920 gpointer user_data)
921 {
922 if (wizard == NULL)
923 wizard=create_wizard();
924 gtk_widget_show(wizard);
925 }
926
927 void
on_assistant_cancel(GtkAssistant * assistant,gpointer user_data)928 on_assistant_cancel (GtkAssistant *assistant,
929 gpointer user_data)
930 {
931 gtk_widget_destroy (GTK_WIDGET(assistant));
932 wizard = NULL;
933 }
934
935
936 void
on_dthe_end_finish(GtkAssistant * assistant,gpointer user_data)937 on_dthe_end_finish (GtkAssistant *assistant,
938 gpointer user_data)
939 {
940 GtkWidget *ch,*text,*druid;
941 gchar *nombre,*snumber,*date,*title;
942 gchar cadena[500];
943 gint number;
944
945 /* Init for main_window */
946 druid = gtk_widget_get_toplevel (GTK_WIDGET (assistant));
947
948 /* First, I get man page name from step 1 */
949 text = lookup_widget(GTK_WIDGET(assistant), "mname");
950 nombre = gtk_editable_get_chars(GTK_EDITABLE(text),0,-1);
951
952 /* Date from step 1 */
953 text = lookup_widget(GTK_WIDGET(assistant), "mdate");
954 date = gtk_editable_get_chars(GTK_EDITABLE(text),0,-1);
955
956 /* Title from step 1 */
957 text = lookup_widget(GTK_WIDGET(assistant), "mtitle");
958 title = gtk_editable_get_chars(GTK_EDITABLE(text),0,-1);
959
960 /* Section number from combo */
961 ch = lookup_widget(GTK_WIDGET(assistant), "combo1");
962 number = gtk_combo_box_get_active (GTK_COMBO_BOX(ch));
963 snumber = g_strdup_printf ("%d", number+1);
964
965 /* Page Start */
966 strcpy(cadena,
967 ".\\\"Created with GNOME Manpages Editor Wizard\n"
968 ".\\\"http://sourceforge.net/projects/gmanedit2\n");
969 strcat(cadena,".TH ");
970 strcat(cadena,nombre);
971 strcat(cadena," ");
972 strcat(cadena,snumber);
973 strcat(cadena," \"");
974 strcat(cadena,date);
975 strcat(cadena,"\" ");
976 strcat(cadena,"\"\" ");
977 strcat(cadena,"\"");
978 strcat(cadena,title);
979 strcat(cadena,"\"\n\n");
980
981 /* Section NAME */
982 ch = lookup_widget (GTK_WIDGET (assistant), "chname");
983 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
984 {
985 strcat(cadena,_(".SH NAME\n"));
986 strcat(cadena,nombre);
987 strcat(cadena,_(" \\- program for...\n\n"));
988 }
989 /* Section SYNOPSIS */
990 ch = lookup_widget (GTK_WIDGET (assistant), "chsynopsis");
991 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
992 {
993 strcat(cadena,_(".SH SYNOPSIS\n.B "));
994 strcat(cadena,nombre);
995 strcat(cadena,_("\n.RI [ options ]\n.br\n\n"));
996 }
997 /* Section CONFIGURATION */
998 ch = lookup_widget (GTK_WIDGET (assistant), "chconfiguration");
999 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1000 strcat(cadena,_(".SH CONFIGURATION\n\n"));
1001 /* Section DESCRIPTION */
1002 ch = lookup_widget (GTK_WIDGET (assistant), "chdescription");
1003 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1004 {
1005 strcat(cadena,_(".SH DESCRIPTION\nThis manual page explains the\n.B "));
1006 strcat(cadena,nombre);
1007 strcat(cadena,_("\nprogram. This program...\n.PP\n\\fB"));
1008 strcat(cadena,nombre);
1009 strcat(cadena,_("\\fP is for...\n\n"));
1010 }
1011 /* Section OPTIONS */
1012 ch = lookup_widget (GTK_WIDGET (assistant), "choptions");
1013 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1014 strcat(cadena,_(".SH OPTIONS\n.B\n.IP -OPTION\nThis option...\n\n"));
1015 /* Section EXIT STATUS */
1016 ch = lookup_widget (GTK_WIDGET (assistant), "chexitstatus");
1017 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1018 strcat(cadena,_(".SH \"EXIT STATUS\"\n\n"));
1019
1020
1021 /* Section RETURN VALUE */
1022 ch = lookup_widget (GTK_WIDGET (assistant), "chreturnvalues");
1023 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1024 strcat(cadena,".SH \"RETURN VALUE\"\n\n");
1025 /* Section ERRORS */
1026 ch = lookup_widget (GTK_WIDGET (assistant), "cherrors");
1027 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1028 strcat(cadena,_(".SH ERRORS\n\n"));
1029 /* Section ENVIRONMENT */
1030 ch = lookup_widget (GTK_WIDGET (assistant), "chenvironment");
1031 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1032 strcat(cadena,_(".SH ENVIRONMENT\n\n"));
1033 /* Section FILES */
1034 ch = lookup_widget (GTK_WIDGET (assistant), "chfiles");
1035 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1036 strcat(cadena,_(".SH FILES\n\n"));
1037 /* Section VERSIONS */
1038 ch = lookup_widget (GTK_WIDGET (assistant), "chversions");
1039 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1040 strcat(cadena,_(".SH VERSIONS\n\n"));
1041
1042 /* Section CONFORMING TO */
1043 ch = lookup_widget (GTK_WIDGET (assistant), "chconformingto");
1044 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1045 strcat(cadena,_(".SH \"CONFORMING TO\"\n\n"));
1046 /* Section NOTES */
1047 ch = lookup_widget (GTK_WIDGET (assistant), "chnotes");
1048 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1049 strcat(cadena,_(".SH NOTES\n\n"));
1050 /* Section BUGS */
1051 ch = lookup_widget (GTK_WIDGET (assistant), "chbugs");
1052 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1053 strcat(cadena,_(".SH BUGS\n\n"));
1054 /* Section EXAMPLE */
1055 ch = lookup_widget (GTK_WIDGET (assistant), "chexample");
1056 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1057 strcat(cadena,_(".SH EXAMPLE\n\n"));
1058 /* Section SEE ALSO */
1059 ch = lookup_widget (GTK_WIDGET (assistant), "chseealso");
1060 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ch))==TRUE)
1061 strcat(cadena,_(".SH \"SEE ALSO\"\n\n"));
1062
1063 /* Hide wizard */
1064 gtk_widget_hide(wizard);
1065
1066 /* Insert all into gmanedit */
1067 insert_label(cadena,_("Wizard page created."));
1068
1069 /* Wizard closed */
1070 gtk_widget_destroy(wizard);
1071 wizard=NULL;
1072 }
1073
1074 static
insert_label(const gchar * base,const gchar * text_info)1075 void insert_label(const gchar *base,const gchar *text_info)
1076 {
1077 GtkWidget *text,*statusbar;
1078 GtkTextBuffer *buffer;
1079
1080 text=lookup_widget(GTK_WIDGET(wprincipal),"text");
1081 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
1082 gtk_text_buffer_insert_at_cursor(buffer, base, -1);
1083
1084 statusbar = lookup_widget(GTK_WIDGET(wprincipal),"statusbar1");
1085 gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 1);
1086 gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, text_info);
1087 }
1088
1089 void
on_home_page1_activate(GtkMenuItem * menuitem,gpointer user_data)1090 on_home_page1_activate (GtkMenuItem *menuitem,
1091 gpointer user_data)
1092 {
1093 gchar *browser;
1094 gchar buf[1024];
1095 gint exitstatus;
1096
1097 browser=ReadConfFromFile("INTERNET_BROWSER");
1098 if (browser==NULL)
1099 browser="mozilla";
1100 snprintf(buf, sizeof buf, "%s http://sourceforge.net/projects/gmanedit2", browser);
1101
1102 g_spawn_command_line_sync(buf, NULL, NULL, &exitstatus, NULL);
1103 }
1104
help_without_gnome(GtkWidget * wid)1105 static void help_without_gnome(GtkWidget *wid)
1106 {
1107 GtkWidget *statusbar;
1108 gchar *datos;
1109 gchar temp[10],command[1024];
1110 gint exitstatus;
1111
1112 strcpy(temp," 7 man");
1113 datos=ReadConfFromFile("COMMAND");
1114
1115 if (datos==NULL)
1116 snprintf(command, sizeof command, "xterm -e man %s", temp);
1117 else
1118 snprintf(command, sizeof command, "%s %s", datos, temp);
1119
1120 g_spawn_command_line_sync(command, NULL, NULL, &exitstatus, NULL);
1121
1122 /* Barra de estado */
1123 statusbar=lookup_widget(GTK_WIDGET(wprincipal),"statusbar1");
1124 gtk_statusbar_pop(GTK_STATUSBAR(statusbar),1);
1125 gtk_statusbar_push(GTK_STATUSBAR(statusbar),1,_("Man help."));
1126 }
1127
open_man_file(gchar * manfile)1128 static void open_man_file(gchar *manfile)
1129 {
1130 GtkWidget *statusbar,*text;
1131 GtkTextBuffer *tb;
1132 gzFile *f;
1133 gint bytes_read;
1134 int n;
1135 char extension[10];
1136 gchar *utf8;
1137 gchar * buffer = (gchar*)malloc(BUFFER_SIZE);
1138
1139
1140 text=lookup_widget(GTK_WIDGET(wprincipal),"text");
1141 tb = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
1142 gtk_text_buffer_set_text (tb, "", 0);
1143
1144 /* Barra de estado */
1145 statusbar=lookup_widget(GTK_WIDGET(wprincipal),"statusbar1");
1146 gtk_statusbar_pop(GTK_STATUSBAR(statusbar),1);
1147 gtk_statusbar_push(GTK_STATUSBAR(statusbar),1,_("File opened."));
1148
1149 /* Ahora abro el fichero */
1150
1151 n = strlen(manfile)-3;
1152 strncpy(extension,manfile+n,3);
1153 if (!strncmp(extension,".gz",3))
1154 in_gzip=1;
1155 else
1156 in_gzip=0;
1157
1158
1159 if ((f=gzopen((gchar *)manfile,"rb"))!=NULL)
1160 {
1161 while(!gzeof(f))
1162 {
1163 bytes_read=gzread(f,buffer,BUFFER_SIZE);
1164 if (bytes_read>0)
1165 {
1166 utf8 = NULL;
1167 if (g_utf8_validate(buffer, -1, NULL) == FALSE)
1168 {
1169 utf8 = g_locale_to_utf8(buffer, -1, NULL, NULL, NULL);
1170 }
1171 if (utf8 != NULL){
1172 strncpy(buffer,utf8, BUFFER_SIZE - 1);
1173 buffer[BUFFER_SIZE - 1] = 0;
1174 }
1175 gtk_text_buffer_insert_at_cursor(tb, buffer ,bytes_read);
1176 }
1177 }
1178 gzclose(f);
1179 }
1180 else
1181 mensaje(strerror(errno),GTK_MESSAGE_ERROR);
1182 if (open_file) gtk_widget_destroy (open_file);
1183 }
1184
1185 void
on_text_drag_data_received(GtkWidget * widget,GdkDragContext * drag_context,gint x,gint y,GtkSelectionData * data,guint info,guint time,gpointer user_data)1186 on_text_drag_data_received (GtkWidget *widget,
1187 GdkDragContext *drag_context,
1188 gint x,
1189 gint y,
1190 GtkSelectionData *data,
1191 guint info,
1192 guint time,
1193 gpointer user_data)
1194 {
1195 if (data->length >= 0)
1196 {
1197 if (!strncmp((gchar *)data->data,"file:",4))
1198 {
1199 filename=(gchar *)data->data+5;
1200 filename[strlen(filename)-2]='\0';
1201 open_man_file(filename);
1202 }
1203
1204 }
1205 gtk_drag_finish(drag_context, TRUE, FALSE, time);
1206 }
1207
1208
1209 void
on_comments1_activate(GtkMenuItem * menuitem,gpointer user_data)1210 on_comments1_activate (GtkMenuItem *menuitem,
1211 gpointer user_data)
1212 {
1213 const gchar *comm=".\\\" ";
1214
1215 insert_label(comm,"Label Comments Inserted.");
1216 }
1217