Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/source/gtkbitchx.c
1069 views
1
/* gtkbitchx.c: Written by Brian Smith (NuKe) for BitchX */
2
3
/* So X11/X.h won't get included */
4
#define X_H
5
6
#include <zvt/zvtterm.h>
7
#include <gdk/gdkkeysyms.h>
8
#include <pthread.h>
9
#ifdef SOUND
10
#include <esd.h>
11
#endif
12
#include "ircaux.h"
13
#include "misc.h"
14
#include "window.h"
15
#include "server.h"
16
#include "hook.h"
17
#include "input.h"
18
#include "commands.h"
19
#include "list.h"
20
#include "hash2.h"
21
#include "gui.h"
22
#include "newio.h"
23
#include "../doc/BitchX.xpm"
24
25
char BitchXbg[] = "BitchX.xpm";
26
27
GtkWidget *mainwindow,
28
*mainviewport,
29
*mainmenubar,
30
*mainscroller,
31
*mainscrolledwindow,
32
*mainclist,
33
*mainbox;
34
GdkFont *mainfont;
35
char *mainfontname;
36
GtkAdjustment *mainadjust;
37
int mainpipe[2];
38
39
/* For MDI */
40
GtkWidget *MDIWindow,
41
*notebook;
42
int current_mdi_mode = 0;
43
44
/* This is a pointer to the clipboard data (cut & paste) */
45
char *clipboarddata = NULL,
46
*pasteargs = NULL, *selectdata;
47
48
/* Theses variables are used for interthread communication and
49
synchronization */
50
gint gtkio;
51
52
int gtkipcin[2],
53
guiipc[2],
54
gtkcommandpipe[2];
55
pthread_t gtkthread;
56
pthread_mutex_t evmutex;
57
pthread_cond_t evcond,
58
gtkcond;
59
int predicate;;
60
extern fd_set readables;
61
62
/* These are for $lastclickline() function */
63
char *lastclicklinedata = NULL;
64
65
int lastclickcol,
66
lastclickrow,
67
contextx,
68
contexty;
69
70
/* Used by the scroller bars */
71
int newscrollerpos,
72
lastscrollerpos,
73
lastscrollerwindow;
74
unsigned long menucmd;
75
int justscrolled = 0;
76
77
/* needed for rclick */
78
#include "keys.h"
79
80
unsigned long menucmd;
81
82
/* This structure is used for passing commands to the gtk thread from the main thread */
83
int gtkincommand = FALSE;
84
typedef struct _gtkcommand {
85
int command;
86
gpointer data[20];
87
} GtkCommand;
88
89
GtkCommand gtkcommand;
90
91
/* This is used in File Dialog to pass code to the main thread */
92
char *codeptr,
93
*paramptr;
94
95
/* Used for sound support */
96
#ifdef SOUND
97
char *gtk_hostname = NULL;
98
int esd_connection = -1;
99
#endif
100
101
/* Function Prototypes */
102
MenuStruct *findmenu(char *menuname);
103
int gtk_getx(void);
104
int gtk_gety(void);
105
void newmenubar(Screen *menuscreen, MenuStruct *menutoadd);
106
GtkWidget *newsubmenu(MenuStruct *menutoadd);
107
void gtk_new_window(Screen *new, Window *win);
108
void gtk_paste (GtkWidget *widget, GtkSelectionData *selection_data,
109
gpointer data);
110
void selection_handle (GtkWidget *widget,
111
GtkSelectionData *selection_data,
112
guint info, guint seltime);
113
int gtkprintf(char *format, ...);
114
void size_allocate (GtkWidget *widget, GtkWindow *window);
115
116
/* Function prototypes needed for the properties notebook */
117
IrcVariable *return_irc_var(int nummer);
118
IrcVariable *return_fset_var(int nummer);
119
CSetArray *return_cset_var(int nummer);
120
WSetArray *return_wset_var(int nummer);
121
int in_properties = 0;
122
123
#define WIDTH 10
124
125
gushort bx_red[] = { 0x0000, 0xbbbb, 0x0000, 0xaaaa, 0x0000, 0xbbbb, 0x0000, 0xaaaa, 0x7777,
126
0xffff, 0x0000, 0xeeee, 0x0000, 0xffff, 0x0000, 0xffff, 0xaaaa, 0x0000 };
127
gushort bx_green[] = { 0x0000, 0x0000, 0xbbbb, 0xaaaa, 0x0000, 0x0000, 0xbbbb, 0xaaaa, 0x7777,
128
0x0000, 0xffff, 0xeeee, 0x0000, 0x0000, 0xeeee, 0xffff, 0xaaaa, 0x0000 };
129
gushort bx_blue[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xcccc, 0xbbbb, 0xbbbb, 0xaaaa, 0x7777,
130
0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0xeeee, 0xffff, 0xaaaa, 0x0000};
131
132
GdkColor colors[] =
133
{
134
{ 0, 0x0000, 0x0000, 0x0000 }, /* 0 black */
135
{ 0, 0xbbbb, 0x0000, 0x0000 }, /* 1 red */
136
{ 0, 0x0000, 0xbbbb, 0x0000 }, /* 2 green */
137
{ 0, 0xaaaa, 0xaaaa, 0x0000 }, /* 3 yellow */
138
{ 0, 0x0000, 0x0000, 0xcccc }, /* 4 blue */
139
{ 0, 0xbbbb, 0x0000, 0xbbbb }, /* 5 magenta */
140
{ 0, 0x0000, 0xbbbb, 0xbbbb }, /* 6 cyan */
141
{ 0, 0xaaaa, 0xaaaa, 0xaaaa }, /* 7 white */
142
{ 0, 0x7777, 0x7777, 0x7777 }, /* 8 grey */
143
{ 0, 0xffff, 0x0000, 0x0000 }, /* 9 bright red */
144
{ 0, 0x0000, 0xffff, 0x0000 }, /* 10 bright green */
145
{ 0, 0xeeee, 0xeeee, 0x0000 }, /* 11 bright yellow */
146
{ 0, 0x0000, 0x0000, 0xffff }, /* 12 bright blue */
147
{ 0, 0xffff, 0x0000, 0xffff }, /* 13 bright magenta */
148
{ 0, 0x0000, 0xeeee, 0xeeee }, /* 14 bright cyan */
149
{ 0, 0xffff, 0xffff, 0xffff }, /* 15 bright white */
150
};
151
152
typedef enum _gtkcommandlist
153
{
154
GTKNONE,
155
GTKFILEDIALOG,
156
GTKMENUBAR,
157
GTKEXIT,
158
GTKSETFOCUS,
159
GTKMENUPOPUP,
160
GTKNEWWIN,
161
GTKTITLE,
162
GTKPROP,
163
GTKFONT,
164
GTKWINKILL,
165
GTKSCROLL,
166
GTKMDI,
167
GTKMSGBOX,
168
GTKPASTE,
169
GTKSETFONT,
170
GTKREDRAWMENUS,
171
GTKNICKLIST,
172
GTKSETWINDOWPOS,
173
GTKABOUTBOX,
174
GTKACTIVITY,
175
GTKNICKLISTWIDTH
176
} gtkcommandlist;
177
178
#ifdef __sun__
179
int gtkputs (const char *str, int n, int (*blah)(int))
180
#else
181
int gtkputs __P((const char *str, int n, int (*blah)(int)))
182
#endif
183
{
184
if (str && *str)
185
{
186
/*write((output_screen && output_screen->pipe[1]) ? output_screen->pipe[1] : mainpipe[1], str, strlen(str));*/
187
if (output_screen && output_screen->pipe[1])
188
write(output_screen->pipe[1], str, strlen(str));
189
return strlen(str);
190
}
191
return 0;
192
}
193
194
/* Find the screen of the Window that generated an event */
195
Screen *findscreen(GtkWidget *widget)
196
{
197
Screen *tmp;
198
199
for (tmp = screen_list; tmp; tmp = tmp->next)
200
{
201
if(tmp->alive && widget == tmp->window)
202
return tmp;
203
}
204
return NULL;
205
}
206
207
Screen *findoutputscreen(int fd)
208
{
209
Screen *tmp;
210
211
for (tmp = screen_list; tmp; tmp = tmp->next)
212
{
213
if(tmp->alive && fd == tmp->pipe[0])
214
return tmp;
215
}
216
return NULL;
217
}
218
219
int notebook_page_by_refnum(int refnum)
220
{
221
Window *thiswindow = get_window_by_refnum(refnum);
222
223
if(thiswindow)
224
{
225
Screen *thisscreen = thiswindow->screen;
226
227
if(thisscreen && thisscreen->page)
228
return gtk_notebook_page_num(GTK_NOTEBOOK(notebook),thisscreen->page->child);
229
}
230
return -1;
231
}
232
233
void sendevent(unsigned int event, unsigned int window)
234
{
235
unsigned int evbuf[2];
236
237
if(guiipc[1])
238
{
239
evbuf[0] = event;
240
evbuf[1] = window;
241
write(guiipc[1], (void *)evbuf, sizeof(unsigned int) * 2);
242
}
243
return;
244
}
245
246
int new_menuref(MenuRef **root, int refnum, char *menutext, int checked)
247
{
248
MenuRef *new = new_malloc(sizeof(MenuRef));
249
250
if (new)
251
{
252
new->refnum = refnum;
253
if (menutext)
254
new->menutext = m_strdup(menutext);
255
else
256
new->menutext = NULL;
257
new->checked = checked;
258
new->next = NULL;
259
new->menuhandle = NULL;
260
261
if (!root || !*root)
262
*root = new;
263
else
264
{
265
MenuRef *prev = NULL, *tmp = *root;
266
while (tmp)
267
{
268
prev = tmp;
269
tmp = tmp->next;
270
}
271
if (prev)
272
prev->next = new;
273
else
274
*root = new;
275
}
276
return TRUE;
277
}
278
return FALSE;
279
}
280
281
int remove_menuref(MenuRef **root, int refnum)
282
{
283
MenuRef *prev = NULL, *tmp = *root;
284
285
while (tmp)
286
{
287
if (tmp->refnum == refnum)
288
{
289
if (!prev)
290
{
291
new_free(&tmp->menutext);
292
new_free(&tmp);
293
*root = NULL;
294
return 0;
295
}
296
else
297
{
298
prev->next = tmp->next;
299
new_free(&tmp->menutext);
300
new_free(&tmp);
301
return 0;
302
}
303
}
304
tmp = tmp->next;
305
}
306
return 0;
307
}
308
309
MenuRef *find_menuref(MenuRef *root, int refnum)
310
{
311
MenuRef *tmp = root;
312
313
while (tmp)
314
{
315
if (tmp->refnum == refnum)
316
return tmp;
317
tmp = tmp->next;
318
}
319
return NULL;
320
}
321
322
/* This gets called when a window close event occurs, if it is the last
323
active window, kill_screen will exit the application if WINDOW_CREATE
324
is defined. Otherwise it exits the application immediately. */
325
gint window_destroy(GtkWidget *widget, GdkEvent *event, gpointer data)
326
{
327
#ifdef WINDOW_CREATE
328
Screen *closescreen;
329
330
if((closescreen = findscreen(widget)) && closescreen->current_window)
331
sendevent(EVDELETE, closescreen->current_window->refnum);
332
return TRUE;
333
#else
334
irc_exit(1, NULL, "%s rocks your world!", VERSION);
335
return FALSE;
336
#endif
337
}
338
339
/* Wait for a command to be processed */
340
void gtk_wait_command(void)
341
{
342
#if 1
343
/* should use a mutex here to be clean */
344
while (gtkincommand==TRUE)
345
usleep(10);
346
#else
347
pthread_cond_wait(&gtkcond, &evmutex);
348
#endif
349
}
350
351
/* Write a formatted string to the output_screen */
352
int gtkprintf(char *format, ...)
353
{
354
va_list args;
355
char putbuf[400];
356
357
va_start(args, format);
358
vsprintf(putbuf, format, args);
359
va_end(args);
360
361
if(output_screen && output_screen->pipe[1])
362
write(output_screen->pipe[1], putbuf, strlen(putbuf));
363
return strlen(putbuf);
364
}
365
366
/* Write a character to the current output_screen */
367
int gtkputc(unsigned char c)
368
{
369
unsigned char tmpbuf[2];
370
371
tmpbuf[0] = (unsigned char)c; tmpbuf[1]=0;
372
if (output_screen && output_screen->pipe[1])
373
write(output_screen->pipe[1], tmpbuf, 1);
374
return 1;
375
}
376
377
void drawnicklist(Screen *this_screen)
378
{
379
NickList *n, *list = NULL;
380
ChannelList *cptr;
381
char minibuffer[NICKNAME_LEN+1];
382
int nickcount=0;
383
char *tmptext[1];
384
385
if(!this_screen)
386
return;
387
388
gtk_clist_clear((GtkCList *)this_screen->clist);
389
390
if(this_screen->current_window && this_screen->current_window->current_channel)
391
{
392
cptr = lookup_channel(this_screen->current_window->current_channel, this_screen->current_window->server, 0);
393
list = sorted_nicklist(cptr, get_int_var(NICKLIST_SORT_VAR));
394
395
for(n = list; n; n = n->next)
396
{
397
minibuffer[0]='\0';
398
if(nick_isvoice(n))
399
strcpy(minibuffer, "+");
400
if(nick_isop(n))
401
strcpy(minibuffer, "@");
402
if(nick_isircop(n))
403
strcat(minibuffer, "*");
404
strcat(minibuffer, n->nick);
405
tmptext[0] = &minibuffer[0];
406
gtk_clist_append((GtkCList *)this_screen->clist, tmptext);
407
gtk_clist_set_background((GtkCList *)this_screen->clist, nickcount, &colors[0]);
408
gtk_clist_set_foreground((GtkCList *)this_screen->clist, nickcount, &colors[7]);
409
nickcount++;
410
}
411
clear_sorted_nicklist(&list);
412
}
413
}
414
415
/* This gets called on a keypress event and writes it to the input queue */
416
gint gtk_keypress(GtkWidget *widget, GdkEventKey *event, gpointer data)
417
{
418
char extkeycode[4];
419
420
if (gtkipcin[1])
421
{
422
extkeycode[2] = 0;
423
switch(event->keyval)
424
{
425
case GDK_Home:
426
extkeycode[2] = '7';
427
break;
428
case GDK_End:
429
extkeycode[2] = '8';
430
break;
431
case GDK_Page_Up:
432
extkeycode[2] = '5';
433
break;
434
case GDK_Page_Down:
435
extkeycode[2] = '6';
436
break;
437
case GDK_Insert:
438
extkeycode[2] = '2';
439
break;
440
case GDK_Delete:
441
extkeycode[2] = '3';
442
break;
443
case GDK_Up:
444
extkeycode[2] = 'A';
445
break;
446
case GDK_Down:
447
extkeycode[2] = 'B';
448
break;
449
case GDK_Left:
450
extkeycode[2] = 'D';
451
break;
452
case GDK_Right:
453
extkeycode[2] = 'C';
454
break;
455
}
456
if (extkeycode[2] != 0)
457
{
458
extkeycode[0] = 27;
459
extkeycode[1] = '[';
460
extkeycode[3] = '~';
461
if(event->keyval >= GDK_Left && event->keyval <= GDK_Down)
462
write(gtkipcin[1], extkeycode, 3);
463
else
464
write(gtkipcin[1], extkeycode, 4);
465
return TRUE;
466
}
467
write(gtkipcin[1], event->string, strlen(event->string));
468
}
469
return TRUE;
470
}
471
472
/* This is the main output function, code will need to be added here to make
473
sure text goes to the correct window as well as ANSI handling etc, this
474
will probably be the most complex part of gtkBitchX */
475
476
void output_info(gpointer data, int pipefd)
477
{
478
unsigned char buffer[201] = "";
479
int t;
480
Screen *os;
481
482
gdk_threads_enter();
483
t = read(pipefd, buffer, 200);
484
buffer[t] = 0;
485
486
os = findoutputscreen(pipefd);
487
if (os && os->viewport)
488
zvt_term_feed((ZvtTerm *)os->viewport, buffer, t);
489
gdk_threads_leave();
490
}
491
492
/* This function sets the window size to the current columns and rows */
493
void gtk_sizewindow(Screen *thisscreen)
494
{
495
zvt_term_set_size((ZvtTerm *)thisscreen->viewport, thisscreen->co, thisscreen->li);
496
if(!get_int_var(MDI_VAR))
497
size_allocate(thisscreen->viewport, (GtkWindow *)thisscreen->window);
498
}
499
500
void gtk_label_set_color(GtkWidget *label, int color)
501
{
502
GtkStyle *style;
503
GtkStyle *defstyle;
504
505
style = gtk_style_new();
506
/*
507
* This is kind of a hack.
508
*/
509
defstyle = gtk_widget_get_default_style();
510
511
switch(color)
512
{
513
case COLOR_INACTIVE:
514
gtk_widget_set_style(label, defstyle);
515
break;
516
case COLOR_HIGHLIGHT:
517
style->fg[0] = colors[12];
518
gtk_widget_set_style(label, style);
519
break;
520
case COLOR_ACTIVE:
521
if ((label->style->fg[0].red == defstyle->fg[0].red) &&
522
(label->style->fg[0].blue == defstyle->fg[0].blue) &&
523
(label->style->fg[0].green == defstyle->fg[0].green))
524
{
525
style->fg[0] = colors[9];
526
gtk_widget_set_style(label, style);
527
}
528
break;
529
}
530
}
531
532
/* This may be going away, it replaces code which is currently elsewhere in BitchX */
533
void gtk_resize(Screen *this_screen)
534
{
535
co = this_screen->co; li = this_screen->li;
536
537
/* Recalculate some stuff that was done in input.c previously */
538
this_screen->input_line = this_screen->li-1;
539
540
this_screen->input_zone_len = this_screen->co - (WIDTH * 2);
541
if (this_screen->input_zone_len < 10)
542
this_screen->input_zone_len = 10; /* Take that! */
543
544
this_screen->input_start_zone = WIDTH;
545
this_screen->input_end_zone = this_screen->co - WIDTH;
546
}
547
548
/* This gets called when the window size event occurs */
549
void gtk_windowsize(GtkWidget *widget, gpointer data)
550
{
551
Screen *sizescreen;
552
553
if(get_int_var(MDI_VAR))
554
sizescreen = screen_list;
555
else
556
sizescreen = findscreen(widget);
557
558
while(sizescreen)
559
{
560
561
/* In MDI mode we check that viewport exists... otherwise the tab is being removed */
562
if (sizescreen->alive && sizescreen->maxfontwidth > 0 && sizescreen->maxfontwidth > 0 && sizescreen->viewport)
563
{
564
/* Not sure why it is x3 and x2.... klass shows as 2x2 and the variation is 6x4 */
565
sizescreen->co = (int) ((sizescreen->viewport->allocation.width-(GTK_WIDGET(sizescreen->viewport)->style->klass->xthickness*3)) / sizescreen->maxfontwidth);
566
sizescreen->li = (int) ((sizescreen->viewport->allocation.height-(GTK_WIDGET(sizescreen->viewport)->style->klass->ythickness*2)) / sizescreen->maxfontheight);
567
gtk_sizewindow(sizescreen);
568
/* Set the nicklist width */
569
if(sizescreen->nicklist)
570
{
571
gtk_widget_set_usize(sizescreen->clist, sizescreen->nicklist, 0);
572
size_allocate(sizescreen->viewport, (GtkWindow *)sizescreen->window);
573
}
574
/*size_allocate((GtkWidget *)sizescreen->viewport, (GtkWindow *)sizescreen->window);*/
575
gtk_resize(sizescreen);
576
recalculate_windows(sizescreen);
577
578
/* Send the resize message to the main thread */
579
sendevent(EVREFRESH, sizescreen->current_window->refnum);
580
}
581
if(get_int_var(MDI_VAR))
582
sizescreen = sizescreen->next;
583
else
584
sizescreen = NULL;
585
}
586
}
587
588
/* This gets called when a window gets the focus */
589
void gtk_windowfocus(GtkWidget *widget, gpointer *data)
590
{
591
Screen *focusscreen;
592
593
if ((focusscreen = findscreen(widget))!=NULL && focusscreen->current_window)
594
sendevent(EVFOCUS, focusscreen->current_window->refnum);
595
}
596
597
/* This gets called when a notebook page gets the focus */
598
void gtk_notebookpage(GtkWidget *widget, GtkNotebookPage *page, gint page_num, gpointer *data)
599
{
600
Screen *focusscreen = screen_list;
601
GtkWidget *child = page->child;
602
603
while(focusscreen)
604
{
605
if(focusscreen->alive && focusscreen->window == child)
606
{
607
focusscreen->page = page;
608
if (focusscreen->current_window)
609
{
610
gtk_label_set_color(focusscreen->page->tab_label, COLOR_INACTIVE);
611
sendevent(EVFOCUS, focusscreen->current_window->refnum);
612
}
613
return;
614
}
615
focusscreen = focusscreen->next;
616
}
617
}
618
619
/* This gets called when the scroller bar gets moved on a window */
620
void gtk_scrollerchanged(GtkWidget *widget, Screen *thisscreen)
621
{
622
if (justscrolled && thisscreen->current_window && thisscreen->current_window->refnum == lastscrollerwindow)
623
{
624
justscrolled = 0;
625
return;
626
}
627
newscrollerpos = thisscreen->adjust->value - 1;
628
if (newscrollerpos < 0)
629
newscrollerpos=0;
630
if (newscrollerpos > get_int_var(SCROLLBACK_VAR))
631
newscrollerpos=get_int_var(SCROLLBACK_VAR);
632
sendevent(EVSTRACK, thisscreen->current_window->refnum);
633
}
634
635
/* This handles right click events on the viewport */
636
int gtk_contextmenu(GtkWidget *widget, GdkEventButton *event, Screen *this_screen)
637
{
638
int statusstart, doubleclick = FALSE;
639
char *zvt_buffer;
640
641
if(event->type == GDK_2BUTTON_PRESS)
642
doubleclick = TRUE;
643
644
/* This will only give decent results with fixed width fonts at the moment */
645
646
if (this_screen->maxfontheight > 0 && this_screen->maxfontwidth > 0)
647
{
648
lastclickrow = (int)(event->y/this_screen->maxfontheight);
649
lastclickcol = (int)(event->x/this_screen->maxfontwidth);
650
}
651
else
652
lastclickrow = lastclickcol = 1;
653
654
last_input_screen=output_screen=this_screen;
655
make_window_current(this_screen->current_window);
656
statusstart=this_screen->li - 2;
657
658
zvt_buffer = zvt_term_get_buffer((ZvtTerm *)this_screen->viewport, NULL, VT_SELTYPE_LINE, 0, lastclickrow+1, 0, lastclickrow);
659
if (zvt_buffer && *zvt_buffer)
660
{
661
int z;
662
malloc_strcpy(&lastclicklinedata, zvt_buffer);
663
for (z = 0;z < this_screen->co && lastclicklinedata[z]; z++)
664
if(lastclicklinedata[z] == '\r' || lastclicklinedata[z] == '\n')
665
lastclicklinedata[z] = 0;
666
free(zvt_buffer);
667
}
668
else
669
new_free(&lastclicklinedata);
670
671
if(this_screen->window_list_end->status_lines == 0 && this_screen->window_list_end->double_status == 1 && this_screen->window_list_end->status_split == 1)
672
statusstart=statusstart-1;
673
if(this_screen->window_list_end->status_lines == 1 && this_screen->window_list_end->double_status == 0 && this_screen->window_list_end->status_split == 0)
674
statusstart=statusstart-1;
675
if(this_screen->window_list_end->status_lines == 1 && this_screen->window_list_end->double_status == 1 && this_screen->window_list_end->status_split == 1)
676
statusstart=statusstart-1;
677
if(this_screen->window_list_end->status_lines == 1 && this_screen->window_list_end->double_status == 1 && this_screen->window_list_end->status_split == 0)
678
statusstart=statusstart-2;
679
if(lastclickrow <= (current_window->screen->li - 2) && lastclickrow >= statusstart)
680
{
681
switch(event->button)
682
{
683
case 3:
684
if(doubleclick)
685
sendevent(EVKEY, STATUSRDBLCLICK);
686
else
687
sendevent(EVKEY, STATUSRCLICK);
688
break;
689
case 2:
690
if(doubleclick)
691
sendevent(EVKEY, STATUSMDBLCLICK);
692
else
693
sendevent(EVKEY, STATUSMCLICK);
694
break;
695
case 1:
696
if(doubleclick)
697
sendevent(EVKEY, STATUSLDBLCLICK);
698
else
699
sendevent(EVKEY, STATUSLCLICK);
700
break;
701
}
702
}
703
else
704
{
705
switch(event->button)
706
{
707
case 3:
708
if(doubleclick)
709
sendevent(EVKEY, RDBLCLICK);
710
else
711
sendevent(EVKEY, RCLICK);
712
break;
713
case 2:
714
if(doubleclick)
715
sendevent(EVKEY, MDBLCLICK);
716
else
717
sendevent(EVKEY, MCLICK);
718
break;
719
case 1:
720
if(doubleclick)
721
sendevent(EVKEY, LDBLCLICK);
722
else
723
sendevent(EVKEY, LCLICK);
724
break;
725
}
726
}
727
728
if (event->button == 2) {
729
int len;
730
char *tmpptr;
731
732
if(clipboarddata)
733
free(clipboarddata);
734
tmpptr = vt_get_selection(((ZvtTerm *)(this_screen->viewport))->vx,
735
#ifdef HAVE_NEW_ZVT
736
this_screen->co*this_screen->li,
737
#endif
738
&len);
739
740
clipboarddata = malloc(len+1);
741
strncpy(clipboarddata, tmpptr, len);
742
clipboarddata[len] = 0;
743
}
744
gtk_widget_grab_focus(widget);
745
return FALSE;
746
}
747
748
/* These are support routines for gui_file_dialog() */
749
750
/* Ripped from functions.c because I couldn't get it to link from there */
751
char * fencode (unsigned char * input)
752
{
753
char *result;
754
int i = 0;
755
756
result = (char *)new_malloc(strlen((char *)input) * 2 + 1);
757
while (*input)
758
{
759
result[i++] = (*input >> 4) + 0x41;
760
result[i++] = (*input & 0x0f) + 0x41;
761
input++;
762
}
763
result[i] = '\0';
764
765
return result; /* DONT USE RETURN_STR HERE! */
766
}
767
768
typedef struct _gtkparam {
769
GtkWidget *window;
770
Screen *screen;
771
gpointer data[10];
772
} GtkParam;
773
774
void gtk_file_ok(GtkWidget *widget, GtkParam *param)
775
{
776
char *tmp;
777
778
codeptr = (char *)param->data[0];
779
paramptr = m_strdup("OK ");
780
tmp = fencode(gtk_file_selection_get_filename(GTK_FILE_SELECTION(param->window)));
781
gtk_widget_destroy(GTK_WIDGET(param->window));
782
malloc_strcat(&paramptr, tmp);
783
new_free(&tmp);
784
sendevent(EVFILE, param->screen->current_window->refnum);
785
free(param);
786
}
787
788
void gtk_file_cancel(GtkWidget *widget, GtkParam *param)
789
{
790
gtk_widget_destroy(GTK_WIDGET(param->window));
791
codeptr = (char *)param->data[0];
792
paramptr = m_strdup("CANCEL ");
793
sendevent(EVFILE, param->screen->current_window->refnum);
794
free(param);
795
}
796
797
void delete(GtkWidget *widget, GtkWidget *event, GtkParam *param)
798
{
799
gtk_widget_destroy(GTK_WIDGET(param->window));
800
free(param);
801
}
802
803
void delete2(GtkWidget *widget, GtkParam *param)
804
{
805
gtk_widget_destroy(GTK_WIDGET(param->window));
806
free(param);
807
}
808
809
void zvt_load_font(char *fontname, Screen *screen)
810
{
811
GdkFont *font = NULL;
812
813
font = gdk_font_load(fontname);
814
if(!font)
815
{
816
bitchsay("Unable to load font \"%s\".", fontname);
817
/* Fall back to fixed */
818
font = gdk_font_load("fixed");
819
fontname = "fixed";
820
if(!font)
821
{
822
printf("Fatal %s error! Could not load \"fixed\" font!\r\n", VERSION);
823
exit(100);
824
}
825
}
826
827
gtk_widget_hide(screen->viewport);
828
zvt_term_set_fonts((ZvtTerm *)screen->viewport, font, font);
829
screen->maxfontwidth = ((ZvtTerm *)screen->viewport)->charwidth;
830
screen->maxfontheight = ((ZvtTerm *)screen->viewport)->charheight;
831
screen->font = font;
832
833
if(screen->fontname)
834
new_free(&screen->fontname);
835
screen->fontname = m_strdup(fontname);
836
gtk_sizewindow(screen);
837
gtk_widget_show(screen->viewport);
838
sendevent(EVREFRESH, screen->current_window->refnum);
839
}
840
841
void gtk_windowicon(GtkWidget *window)
842
{
843
#ifndef USE_IMLIB
844
GtkStyle *iconstyle;
845
#endif
846
GdkBitmap *bitmap;
847
GdkPixmap *icon_pixmap = NULL;
848
849
#ifndef USE_IMLIB
850
iconstyle = gtk_widget_get_style(window);
851
if (!icon_pixmap)
852
icon_pixmap = gdk_pixmap_create_from_xpm_d(window->window, &bitmap, &iconstyle->bg[GTK_STATE_NORMAL], BitchX);
853
#else
854
gdk_imlib_data_to_pixmap(BitchX, &icon_pixmap, &bitmap);
855
#endif
856
857
gdk_window_set_icon(window->window, NULL, icon_pixmap, bitmap);
858
}
859
860
void font_ok_handler(GtkWidget *widget, GtkParam *param)
861
{
862
gchar *font;
863
864
font = gtk_entry_get_text((GtkEntry *)param->data[0]);
865
if(!font)
866
{
867
bitchsay("Unable to load font.");
868
free(param);
869
return;
870
}
871
/* All Windows is checked */
872
if(GTK_TOGGLE_BUTTON(param->data[2])->active)
873
{
874
Screen *tmp;
875
for (tmp = screen_list; tmp; tmp = tmp->next)
876
{
877
if(tmp->alive && tmp->viewport)
878
zvt_load_font(font, tmp);
879
}
880
}
881
else
882
zvt_load_font(font, param->screen);
883
884
/* Default font is checked */
885
if(GTK_TOGGLE_BUTTON(param->data[1])->active)
886
set_string_var(DEFAULT_FONT_VAR, font);
887
gtk_widget_destroy(GTK_WIDGET(param->window));
888
free(param);
889
}
890
891
void font_ok_handler2(GtkWidget *widget, GtkParam *param)
892
{
893
gchar *font;
894
895
font = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(param->window));
896
if(font)
897
gtk_entry_set_text((GtkEntry *)param->data[0], font);
898
gtk_widget_destroy(GTK_WIDGET(param->window));
899
free(param);
900
}
901
902
typedef struct _propstruct {
903
GtkWidget *nbwindow,
904
*clist,
905
*entryfield,
906
*check;
907
int which, last;
908
Window *nb_window;
909
} GtkProp;
910
911
GtkWidget *notebook;
912
913
/* So we can free it later */
914
GtkProp *PropPages[4] = { NULL, NULL, NULL, NULL };
915
916
void updatevars(GtkProp *gtkprop)
917
{
918
int i;
919
char *szBuffer;
920
ChannelList *chan;
921
922
if(gtkprop->last > -1)
923
{
924
switch(gtkprop->which)
925
{
926
case 1:
927
switch(return_irc_var(gtkprop->last)->type)
928
{
929
case BOOL_TYPE_VAR:
930
i = GTK_TOGGLE_BUTTON(gtkprop->check)->active;
931
set_int_var(gtkprop->last, i);
932
break;
933
case CHAR_TYPE_VAR:
934
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
935
set_string_var(gtkprop->last, szBuffer);
936
break;
937
case STR_TYPE_VAR:
938
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
939
set_string_var(gtkprop->last, szBuffer);
940
break;
941
case INT_TYPE_VAR:
942
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
943
set_int_var(gtkprop->last, my_atol(szBuffer));
944
break;
945
}
946
break;
947
case 2:
948
if(gtkprop->nb_window && gtkprop->nb_window->current_channel)
949
chan = (ChannelList *) find_in_list((List **)get_server_channels(from_server), gtkprop->nb_window->current_channel, 0);
950
else
951
chan = NULL;
952
953
if(chan)
954
{
955
switch(return_cset_var(gtkprop->last)->type)
956
{
957
case BOOL_TYPE_VAR:
958
i = GTK_TOGGLE_BUTTON(gtkprop->check)->active;
959
set_cset_int_var(chan->csets, gtkprop->last, i);
960
break;
961
case CHAR_TYPE_VAR:
962
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
963
set_cset_str_var(chan->csets, gtkprop->last, szBuffer);
964
break;
965
case STR_TYPE_VAR:
966
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
967
set_cset_str_var(chan->csets, gtkprop->last, szBuffer);
968
break;
969
case INT_TYPE_VAR:
970
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
971
set_cset_int_var(chan->csets, gtkprop->last, my_atol(szBuffer));
972
break;
973
}
974
}
975
break;
976
case 3:
977
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
978
fset_string_var(gtkprop->last, szBuffer);
979
break;
980
case 4:
981
szBuffer = gtk_entry_get_text((GtkEntry *)gtkprop->entryfield);
982
set_wset_string_var(gtkprop->nb_window->wset, gtkprop->last, szBuffer);
983
break;
984
}
985
}
986
}
987
988
void nb_delete(GtkWidget *widget, GtkWidget *event, GtkProp *gtkprop)
989
{
990
int z;
991
992
for(z=0;z<4;z++)
993
updatevars(PropPages[z]);
994
gtk_widget_destroy(GTK_WIDGET(gtkprop->nbwindow));
995
/* Free the memory used by the pages */
996
for(z=0;z<4;z++)
997
{
998
if(PropPages[z])
999
free(PropPages[z]);
1000
PropPages[z] = NULL;
1001
}
1002
1003
in_properties = 0;
1004
}
1005
1006
int gtk_click_nicklist(GtkWidget *widget, GdkEventButton *event, GtkWidget *window)
1007
{
1008
gchar *nicktext = NULL;
1009
int row, col, doubleclick = FALSE;
1010
1011
if(event->type == GDK_2BUTTON_PRESS)
1012
doubleclick = TRUE;
1013
1014
gtk_clist_get_selection_info((GtkCList *)widget,
1015
event->x,
1016
event->y,
1017
&row,
1018
&col);
1019
gtk_clist_get_text((GtkCList *)widget, row, col, &nicktext);
1020
1021
malloc_strcpy(&lastclicklinedata, nicktext);
1022
lastclickcol = lastclickrow = 0;
1023
switch(event->button)
1024
{
1025
case 3:
1026
if(doubleclick)
1027
sendevent(EVKEY, NICKLISTRDBLCLICK);
1028
else
1029
sendevent(EVKEY, NICKLISTRCLICK);
1030
break;
1031
case 2:
1032
if(doubleclick)
1033
sendevent(EVKEY, NICKLISTMDBLCLICK);
1034
else
1035
sendevent(EVKEY, NICKLISTMCLICK);
1036
break;
1037
case 1:
1038
if(doubleclick)
1039
sendevent(EVKEY, NICKLISTLDBLCLICK);
1040
else
1041
sendevent(EVKEY, NICKLISTLCLICK);
1042
break;
1043
}
1044
return FALSE;
1045
}
1046
1047
void select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *event, GtkProp *gtkprop)
1048
{
1049
char szBuffer[100], *tmptext;
1050
ChannelList *chan;
1051
1052
updatevars(gtkprop);
1053
switch(gtkprop->which)
1054
{
1055
case 1:
1056
switch(return_irc_var(row)->type)
1057
{
1058
case BOOL_TYPE_VAR:
1059
gtk_widget_set_sensitive(gtkprop->entryfield, FALSE);
1060
gtk_widget_set_sensitive(gtkprop->check, TRUE);
1061
1062
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkprop->check), get_int_var(row));
1063
break;
1064
case CHAR_TYPE_VAR:
1065
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1066
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1067
1068
tmptext = get_string_var(row);
1069
if(tmptext)
1070
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, tmptext);
1071
else
1072
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, "");
1073
break;
1074
case STR_TYPE_VAR:
1075
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1076
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1077
1078
tmptext = get_string_var(row);
1079
if(tmptext)
1080
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, tmptext);
1081
else
1082
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, "");
1083
break;
1084
case INT_TYPE_VAR:
1085
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1086
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1087
1088
sprintf(szBuffer, "%d", get_int_var(row));
1089
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, szBuffer);
1090
break;
1091
}
1092
break;
1093
case 2:
1094
if(gtkprop->nb_window && gtkprop->nb_window->current_channel)
1095
chan = (ChannelList *) find_in_list((List **)get_server_channels(from_server), gtkprop->nb_window->current_channel, 0);
1096
else
1097
chan = NULL;
1098
1099
if(chan)
1100
{
1101
switch(return_cset_var(row)->type)
1102
{
1103
case BOOL_TYPE_VAR:
1104
gtk_widget_set_sensitive(gtkprop->entryfield, FALSE);
1105
gtk_widget_set_sensitive(gtkprop->check, TRUE);
1106
1107
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkprop->check), get_cset_int_var(chan->csets, row));
1108
break;
1109
case CHAR_TYPE_VAR:
1110
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1111
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1112
1113
tmptext = get_cset_str_var(chan->csets, row);
1114
if(tmptext)
1115
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, tmptext);
1116
else
1117
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, "");
1118
break;
1119
case STR_TYPE_VAR:
1120
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1121
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1122
1123
tmptext = get_cset_str_var(chan->csets, row);
1124
if(tmptext)
1125
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, tmptext);
1126
else
1127
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, "");
1128
break;
1129
case INT_TYPE_VAR:
1130
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1131
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1132
1133
sprintf(szBuffer, "%d", get_cset_int_var(chan->csets, row));
1134
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, szBuffer);
1135
break;
1136
}
1137
break;
1138
}
1139
break;
1140
case 3:
1141
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1142
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1143
tmptext = fget_string_var(row);
1144
if(tmptext)
1145
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, tmptext);
1146
else
1147
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, "");
1148
break;
1149
case 4:
1150
gtk_widget_set_sensitive(gtkprop->entryfield, TRUE);
1151
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1152
tmptext = get_wset_string_var(gtkprop->nb_window->wset, row);
1153
if(tmptext)
1154
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, tmptext);
1155
else
1156
gtk_entry_set_text((GtkEntry *)gtkprop->entryfield, "");
1157
break;
1158
}
1159
1160
gtkprop->last = row;
1161
}
1162
1163
void font_browse(GtkWidget *widget, GtkParam *firstparam)
1164
{
1165
GtkWidget *fontdialog;
1166
GtkParam *param;
1167
1168
fontdialog = gtk_font_selection_dialog_new("Font Browser");
1169
1170
param = malloc(sizeof(GtkParam));
1171
1172
param->window = fontdialog;
1173
param->screen = (Screen *)gtkcommand.data[0];
1174
param->data[0] = firstparam->data[0];
1175
1176
gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontdialog)->ok_button), "clicked", GTK_SIGNAL_FUNC(font_ok_handler2), param);
1177
gtk_signal_connect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontdialog)->cancel_button), "clicked", GTK_SIGNAL_FUNC(delete2), param);
1178
gtk_widget_show(fontdialog);
1179
}
1180
1181
void gtk_setfocus(Screen *thisscreen)
1182
{
1183
if(get_int_var(MDI_VAR))
1184
{
1185
Screen *tmp = screen_list;
1186
GtkWidget *page;
1187
int z = 0;
1188
1189
while(tmp)
1190
{
1191
1192
if(tmp->alive)
1193
{
1194
page = gtk_notebook_get_nth_page((GtkNotebook *)notebook,z);
1195
if(page == thisscreen->window)
1196
gtk_notebook_set_page((GtkNotebook *)notebook, z);
1197
z++;
1198
}
1199
tmp = tmp->next;
1200
}
1201
}
1202
else
1203
{
1204
gdk_window_raise(GTK_WIDGET(thisscreen->window)->window);
1205
/*gtk_window_activate_focus(GTK_WINDOW(thisscreen->window));*/
1206
}
1207
}
1208
1209
void gtk_command_handler(void)
1210
{
1211
char buf[2];
1212
1213
gdk_threads_enter();
1214
1215
/* Clear the command */
1216
read(gtkcommandpipe[0], buf, 1);
1217
1218
switch(gtkcommand.command)
1219
{
1220
/* Paste command */
1221
case GTKPASTE:
1222
{
1223
static GdkAtom targets_atom = GDK_NONE;
1224
1225
if (targets_atom == GDK_NONE)
1226
targets_atom = gdk_atom_intern ("STRING", FALSE);
1227
1228
/* Save the parameters passed */
1229
if(pasteargs)
1230
free(pasteargs);
1231
pasteargs = (char *)gtkcommand.data[0];
1232
1233
gtk_selection_convert (current_window->screen->window, GDK_SELECTION_PRIMARY, targets_atom,
1234
GDK_CURRENT_TIME);
1235
}
1236
break;
1237
/* File Dialog */
1238
case GTKFILEDIALOG:
1239
{
1240
GtkWidget *filew;
1241
GtkParam *param;
1242
int t;
1243
1244
filew = gtk_file_selection_new((char *)gtkcommand.data[2]);
1245
1246
param = malloc(sizeof(GtkParam));
1247
1248
param->window = filew;
1249
param->screen = (Screen *)gtkcommand.data[7];
1250
param->data[0] = gtkcommand.data[6];
1251
1252
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) gtk_file_ok, param);
1253
gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) gtk_file_cancel, param);
1254
1255
gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), (char *)gtkcommand.data[1]);
1256
1257
gtk_widget_show(filew);
1258
for(t=0;t<6;t++)
1259
new_free(&gtkcommand.data[t]);
1260
}
1261
break;
1262
/* Creates a menubar on a window */
1263
case GTKMENUBAR:
1264
{
1265
if(!my_stricmp((char *)gtkcommand.data[1], "-delete"))
1266
{
1267
if(((Screen *)gtkcommand.data[0])->menubar)
1268
{
1269
gtk_widget_destroy(((Screen *)gtkcommand.data[0])->menubar);
1270
((Screen *)gtkcommand.data[0])->menubar = NULL;
1271
}
1272
}
1273
else
1274
newmenubar((Screen *)gtkcommand.data[0], (MenuStruct *)gtkcommand.data[2]);
1275
new_free(&gtkcommand.data[1]);
1276
}
1277
break;
1278
/* Exit procedure for gtk thread */
1279
case GTKEXIT:
1280
gtk_exit(0);
1281
break;
1282
/* Focuses the window passed to it */
1283
case GTKSETFOCUS:
1284
gtk_setfocus((Screen *)gtkcommand.data[0]);
1285
break;
1286
/* Creates a popup context menu */
1287
case GTKMENUPOPUP:
1288
{
1289
MenuStruct *menupopup;
1290
1291
if((menupopup=findmenu((char *)gtkcommand.data[0]))!=NULL)
1292
gtk_menu_popup(GTK_MENU(newsubmenu(menupopup)), NULL, NULL, NULL, NULL, 0, 0);
1293
new_free(&gtkcommand.data[0]);
1294
}
1295
break;
1296
/* Updates the nicklist window */
1297
case GTKNICKLIST:
1298
{
1299
char *channel = (char *)gtkcommand.data[0];
1300
1301
if(channel)
1302
{
1303
ChannelList *cptr = lookup_channel(channel, from_server, 0);
1304
Window *this_window;
1305
1306
if(cptr)
1307
{
1308
this_window = get_window_by_refnum(cptr->refnum);
1309
if(this_window && this_window->screen)
1310
drawnicklist(this_window->screen);
1311
}
1312
1313
}
1314
else
1315
{
1316
Screen *tmp = screen_list;
1317
1318
while(tmp)
1319
{
1320
if(tmp->alive)
1321
drawnicklist(tmp);
1322
tmp = tmp->next;
1323
}
1324
}
1325
}
1326
break;
1327
/* Creates an nice looking about box for the /about command */
1328
case GTKABOUTBOX:
1329
gtk_about_box((char *)gtkcommand.data[0]);
1330
break;
1331
/* Creates a new IRC window */
1332
case GTKNEWWIN:
1333
gtk_new_window((Screen *)gtkcommand.data[0], (Window *)gtkcommand.data[1]);
1334
gdk_threads_leave();
1335
return;
1336
break;
1337
/* Sets the title bar of the window */
1338
case GTKTITLE:
1339
if(((Screen *)gtkcommand.data[0])->window)
1340
{
1341
if(get_int_var(MDI_VAR))
1342
{
1343
Screen *tmpscreen = (Screen *)gtkcommand.data[0];
1344
char *labeltext = "<none>";
1345
1346
if(tmpscreen->current_window)
1347
{
1348
if(tmpscreen->current_window->current_channel)
1349
labeltext = tmpscreen->current_window->current_channel;
1350
else if(tmpscreen->current_window->query_nick)
1351
labeltext = tmpscreen->current_window->query_nick;
1352
}
1353
1354
if(tmpscreen->page)
1355
gtk_label_set_text(GTK_LABEL(tmpscreen->page->tab_label),labeltext);
1356
if(current_window && current_window->screen == (Screen *)gtkcommand.data[0])
1357
gtk_window_set_title(GTK_WINDOW(MDIWindow), (char *)gtkcommand.data[1]);
1358
}
1359
else
1360
gtk_window_set_title(GTK_WINDOW(((Screen *)gtkcommand.data[0])->window), (char *)gtkcommand.data[1]);
1361
}
1362
new_free(&gtkcommand.data[1]);
1363
break;
1364
/* Opens a properties notebook for the current window */
1365
case GTKPROP:
1366
{
1367
GtkWidget *nbwindow,
1368
*frame,
1369
*label,
1370
*tmphbox,
1371
*tmpvbox,
1372
*scrollwindow;
1373
GtkProp *gtkprop;
1374
char titletext[150], *entryname[1];
1375
int t = 0;
1376
1377
in_properties = 1;
1378
1379
nbwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1380
1381
PropPages[0] = gtkprop = malloc(sizeof(GtkProp));
1382
1383
gtkprop->nbwindow = nbwindow;
1384
1385
gtk_signal_connect(GTK_OBJECT(nbwindow), "delete_event", GTK_SIGNAL_FUNC (nb_delete), gtkprop);
1386
1387
gtk_container_border_width(GTK_CONTAINER(nbwindow), 10);
1388
1389
notebook = gtk_notebook_new();
1390
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
1391
gtk_container_add(GTK_CONTAINER(nbwindow), notebook);
1392
gtk_widget_show(notebook);
1393
1394
/* Sets */
1395
gtkprop = malloc(sizeof(GtkProp));
1396
1397
gtkprop->nbwindow = nbwindow;
1398
frame = gtk_frame_new("Page 1 of 5");
1399
gtk_container_border_width(GTK_CONTAINER(frame), 10);
1400
gtk_widget_set_usize(frame, 500, 250);
1401
1402
tmphbox = gtk_hbox_new(TRUE, 10);
1403
gtk_container_add(GTK_CONTAINER(frame), tmphbox);
1404
gtk_container_border_width(GTK_CONTAINER(tmphbox), 10);
1405
1406
scrollwindow = gtk_scrolled_window_new (NULL, NULL);
1407
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwindow),
1408
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1409
gtk_box_pack_start(GTK_BOX(tmphbox), scrollwindow, TRUE, TRUE, 0);
1410
gtk_widget_show(scrollwindow);
1411
1412
gtkprop->clist = gtk_clist_new(1);
1413
gtk_clist_set_column_auto_resize(GTK_CLIST(gtkprop->clist), 0, TRUE);
1414
gtk_container_add(GTK_CONTAINER(scrollwindow), gtkprop->clist);
1415
gtk_widget_show(gtkprop->clist);
1416
1417
for(t=0; t<NUMBER_OF_VARIABLES; t++)
1418
{
1419
entryname[0] = return_irc_var(t)->name;
1420
gtk_clist_append((GtkCList *)gtkprop->clist, entryname);
1421
}
1422
1423
tmpvbox = gtk_vbox_new(FALSE, 10);
1424
gtk_box_pack_start(GTK_BOX(tmphbox), tmpvbox, TRUE, TRUE, 0);
1425
1426
gtkprop->entryfield = gtk_entry_new();
1427
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->entryfield, TRUE, TRUE, 0);
1428
gtk_widget_show(gtkprop->entryfield);
1429
1430
gtkprop->check = gtk_check_button_new_with_label("On/Off");
1431
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->check, TRUE, FALSE, 0);
1432
1433
gtk_widget_set_sensitive(gtkprop->entryfield, FALSE);
1434
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1435
1436
gtkprop->nb_window = current_window;
1437
gtkprop->which = 1;
1438
gtkprop->last = -1;
1439
gtk_signal_connect(GTK_OBJECT(gtkprop->clist), "select_row", GTK_SIGNAL_FUNC(select_row), gtkprop);
1440
1441
gtk_widget_show(gtkprop->check);
1442
gtk_widget_show(tmphbox);
1443
gtk_widget_show(tmpvbox);
1444
gtk_widget_show(frame);
1445
1446
label = gtk_label_new("Sets");
1447
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
1448
1449
/* Csets */
1450
PropPages[1] = gtkprop = malloc(sizeof(GtkProp));
1451
1452
gtkprop->nbwindow = nbwindow;
1453
frame = gtk_frame_new("Page 2 of 5");
1454
gtk_container_border_width(GTK_CONTAINER(frame), 10);
1455
gtk_widget_set_usize(frame, 500, 250);
1456
1457
tmphbox = gtk_hbox_new(TRUE, 10);
1458
gtk_container_add(GTK_CONTAINER(frame), tmphbox);
1459
gtk_container_border_width(GTK_CONTAINER(tmphbox), 10);
1460
1461
scrollwindow = gtk_scrolled_window_new (NULL, NULL);
1462
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwindow),
1463
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1464
gtk_box_pack_start(GTK_BOX(tmphbox), scrollwindow, TRUE, TRUE, 0);
1465
gtk_widget_show(scrollwindow);
1466
1467
gtkprop->clist = gtk_clist_new(1);
1468
gtk_clist_set_column_auto_resize(GTK_CLIST(gtkprop->clist), 0, TRUE);
1469
gtk_container_add(GTK_CONTAINER(scrollwindow), gtkprop->clist);
1470
gtk_widget_show(gtkprop->clist);
1471
1472
for(t=0; t<NUMBER_OF_CSETS; t++)
1473
{
1474
entryname[0] = return_cset_var(t)->name;
1475
gtk_clist_append((GtkCList *)gtkprop->clist, entryname);
1476
}
1477
1478
tmpvbox = gtk_vbox_new(FALSE, 10);
1479
gtk_box_pack_start(GTK_BOX(tmphbox), tmpvbox, TRUE, TRUE, 0);
1480
1481
gtkprop->entryfield = gtk_entry_new();
1482
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->entryfield, TRUE, TRUE, 0);
1483
gtk_widget_show(gtkprop->entryfield);
1484
1485
gtkprop->check = gtk_check_button_new_with_label("On/Off");
1486
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->check, TRUE, FALSE, 0);
1487
1488
gtk_widget_set_sensitive(gtkprop->entryfield, FALSE);
1489
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1490
1491
gtkprop->nb_window = current_window;
1492
gtkprop->which = 2;
1493
gtkprop->last = -1;
1494
gtk_signal_connect(GTK_OBJECT(gtkprop->clist), "select_row", GTK_SIGNAL_FUNC(select_row), gtkprop);
1495
1496
gtk_widget_show(gtkprop->check);
1497
gtk_widget_show(tmphbox);
1498
gtk_widget_show(tmpvbox);
1499
gtk_widget_show(frame);
1500
1501
label = gtk_label_new("Csets");
1502
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
1503
1504
/* Fsets */
1505
PropPages[2] = gtkprop = malloc(sizeof(GtkProp));
1506
1507
gtkprop->nbwindow = nbwindow;
1508
frame = gtk_frame_new("Page 3 of 5");
1509
gtk_container_border_width(GTK_CONTAINER(frame), 10);
1510
gtk_widget_set_usize(frame, 500, 250);
1511
1512
tmphbox = gtk_hbox_new(TRUE, 10);
1513
gtk_container_add(GTK_CONTAINER(frame), tmphbox);
1514
gtk_container_border_width(GTK_CONTAINER(tmphbox), 10);
1515
1516
scrollwindow = gtk_scrolled_window_new (NULL, NULL);
1517
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwindow),
1518
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1519
gtk_box_pack_start(GTK_BOX(tmphbox), scrollwindow, TRUE, TRUE, 0);
1520
gtk_widget_show(scrollwindow);
1521
1522
gtkprop->clist = gtk_clist_new(1);
1523
gtk_clist_set_column_auto_resize(GTK_CLIST(gtkprop->clist), 0, TRUE);
1524
gtk_container_add(GTK_CONTAINER(scrollwindow), gtkprop->clist);
1525
gtk_widget_show(gtkprop->clist);
1526
1527
for(t=0; t<NUMBER_OF_FSET; t++)
1528
{
1529
entryname[0] = return_fset_var(t)->name;
1530
gtk_clist_append((GtkCList *)gtkprop->clist, entryname);
1531
}
1532
1533
tmpvbox = gtk_vbox_new(FALSE, 10);
1534
gtk_box_pack_start(GTK_BOX(tmphbox), tmpvbox, TRUE, TRUE, 0);
1535
1536
gtkprop->entryfield = gtk_entry_new();
1537
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->entryfield, TRUE, TRUE, 0);
1538
gtk_widget_show(gtkprop->entryfield);
1539
1540
gtkprop->check = gtk_check_button_new_with_label("On/Off");
1541
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->check, TRUE, FALSE, 0);
1542
1543
gtk_widget_set_sensitive(gtkprop->entryfield, FALSE);
1544
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1545
1546
gtkprop->nb_window = current_window;
1547
gtkprop->which = 3;
1548
gtkprop->last = -1;
1549
gtk_signal_connect(GTK_OBJECT(gtkprop->clist), "select_row", GTK_SIGNAL_FUNC(select_row), gtkprop);
1550
1551
gtk_widget_show(gtkprop->check);
1552
gtk_widget_show(tmphbox);
1553
gtk_widget_show(tmpvbox);
1554
gtk_widget_show(frame);
1555
1556
label = gtk_label_new("Fsets");
1557
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
1558
1559
/* Wsets */
1560
PropPages[3] = gtkprop = malloc(sizeof(GtkProp));
1561
1562
gtkprop->nbwindow = nbwindow;
1563
frame = gtk_frame_new("Page 4 of 5");
1564
gtk_container_border_width(GTK_CONTAINER(frame), 10);
1565
gtk_widget_set_usize(frame, 500, 250);
1566
1567
tmphbox = gtk_hbox_new(TRUE, 10);
1568
gtk_container_add(GTK_CONTAINER(frame), tmphbox);
1569
gtk_container_border_width(GTK_CONTAINER(tmphbox), 10);
1570
1571
scrollwindow = gtk_scrolled_window_new (NULL, NULL);
1572
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwindow),
1573
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1574
gtk_box_pack_start(GTK_BOX(tmphbox), scrollwindow, TRUE, TRUE, 0);
1575
gtk_widget_show(scrollwindow);
1576
1577
gtkprop->clist = gtk_clist_new(1);
1578
gtk_clist_set_column_auto_resize(GTK_CLIST(gtkprop->clist), 0, TRUE);
1579
gtk_container_add(GTK_CONTAINER(scrollwindow), gtkprop->clist);
1580
gtk_widget_show(gtkprop->clist);
1581
1582
for(t=0; t<NUMBER_OF_WSETS; t++)
1583
{
1584
entryname[0] = return_wset_var(t)->name;
1585
gtk_clist_append((GtkCList *)gtkprop->clist, entryname);
1586
}
1587
1588
tmpvbox = gtk_vbox_new(FALSE, 10);
1589
gtk_box_pack_start(GTK_BOX(tmphbox), tmpvbox, TRUE, TRUE, 0);
1590
1591
gtkprop->entryfield = gtk_entry_new();
1592
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->entryfield, TRUE, TRUE, 0);
1593
gtk_widget_show(gtkprop->entryfield);
1594
1595
gtkprop->check = gtk_check_button_new_with_label("On/Off");
1596
gtk_box_pack_start(GTK_BOX(tmpvbox), gtkprop->check, TRUE, FALSE, 0);
1597
1598
gtk_widget_set_sensitive(gtkprop->entryfield, FALSE);
1599
gtk_widget_set_sensitive(gtkprop->check, FALSE);
1600
1601
gtkprop->nb_window = current_window;
1602
gtkprop->which = 4;
1603
gtkprop->last = -1;
1604
gtk_signal_connect(GTK_OBJECT(gtkprop->clist), "select_row", GTK_SIGNAL_FUNC(select_row), gtkprop);
1605
1606
gtk_widget_show(gtkprop->check);
1607
gtk_widget_show(tmphbox);
1608
gtk_widget_show(tmpvbox);
1609
gtk_widget_show(frame);
1610
1611
label = gtk_label_new("Wsets");
1612
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
1613
1614
/* GTK Settings */
1615
frame = gtk_frame_new("Page 5 of 5");
1616
gtk_container_border_width(GTK_CONTAINER(frame), 10);
1617
gtk_widget_show(frame);
1618
1619
label = gtk_label_new("GTK Settings");
1620
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
1621
1622
strcpy(titletext, VERSION);
1623
strcat(titletext, " Properties");
1624
1625
if(current_window->current_channel)
1626
{
1627
strcat(titletext, " for ");
1628
strcat(titletext, current_window->current_channel);
1629
}
1630
1631
gtk_window_set_title(GTK_WINDOW(nbwindow), titletext);
1632
gtk_widget_show(nbwindow);
1633
}
1634
break;
1635
/* The Font Dialog */
1636
case GTKFONT:
1637
{
1638
GtkWidget *fontwindow,
1639
*fontentry,
1640
*browsebutton,
1641
*defaultcheck,
1642
*allwindowscheck,
1643
*okbutton,
1644
*cancelbutton,
1645
*hbox,
1646
*vbox;
1647
GtkParam *param = malloc(sizeof(GtkParam));
1648
Screen *fontscreen = (Screen *)gtkcommand.data[0];
1649
1650
param->window = fontwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1651
param->screen = fontscreen;
1652
1653
gtk_window_set_title(GTK_WINDOW(fontwindow), "Font Selection");
1654
gtk_container_border_width(GTK_CONTAINER(fontwindow), 10);
1655
1656
vbox = gtk_vbox_new(TRUE, 10);
1657
gtk_container_add(GTK_CONTAINER(fontwindow), vbox);
1658
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
1659
1660
fontentry = gtk_entry_new();
1661
gtk_box_pack_start(GTK_BOX(vbox), fontentry, TRUE, TRUE, 0);
1662
if(fontscreen && fontscreen->fontname)
1663
gtk_entry_set_text((GtkEntry *)fontentry, fontscreen->fontname);
1664
1665
browsebutton = gtk_button_new_with_label("Browse");
1666
gtk_box_pack_start(GTK_BOX(vbox), browsebutton, TRUE, TRUE, 0);
1667
1668
defaultcheck = gtk_check_button_new_with_label("Default Font");
1669
allwindowscheck = gtk_check_button_new_with_label("Change for All Windows");
1670
1671
gtk_box_pack_start(GTK_BOX(vbox), defaultcheck, TRUE, TRUE, 0);
1672
gtk_box_pack_start(GTK_BOX(vbox), allwindowscheck, TRUE, TRUE, 0);
1673
1674
hbox = gtk_hbox_new(TRUE, 10);
1675
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
1676
1677
okbutton = gtk_button_new_with_label("Ok");
1678
cancelbutton = gtk_button_new_with_label("Cancel");
1679
1680
gtk_box_pack_start(GTK_BOX(hbox), okbutton, TRUE, TRUE, 0);
1681
gtk_box_pack_start(GTK_BOX(hbox), cancelbutton, TRUE, TRUE, 0);
1682
1683
param->data[0] = fontentry;
1684
param->data[1] = defaultcheck;
1685
param->data[2] = allwindowscheck;
1686
1687
gtk_signal_connect(GTK_OBJECT(okbutton), "clicked", GTK_SIGNAL_FUNC(font_ok_handler), param);
1688
gtk_signal_connect(GTK_OBJECT(cancelbutton), "clicked", GTK_SIGNAL_FUNC(delete2), param);
1689
gtk_signal_connect(GTK_OBJECT(browsebutton), "clicked", GTK_SIGNAL_FUNC(font_browse), param);
1690
1691
gtk_widget_show(hbox);
1692
gtk_widget_show(okbutton);
1693
gtk_widget_show(cancelbutton);
1694
gtk_widget_show(allwindowscheck);
1695
gtk_widget_show(defaultcheck);
1696
gtk_widget_show(browsebutton);
1697
gtk_widget_show(fontentry);
1698
gtk_widget_show(vbox);
1699
gtk_widget_show(fontwindow);
1700
}
1701
break;
1702
case GTKREDRAWMENUS:
1703
{
1704
Screen *tmpscreen;
1705
/* Recreate the menus after a change */
1706
for(tmpscreen = screen_list; tmpscreen; tmpscreen = tmpscreen->next)
1707
{
1708
MenuStruct *tmpms;
1709
if(tmpscreen->alive && tmpscreen->menu && (tmpms = findmenu(tmpscreen->menu)))
1710
newmenubar(tmpscreen, tmpms);
1711
}
1712
}
1713
break;
1714
case GTKSETWINDOWPOS:
1715
if(gtkcommand.data[1])
1716
gdk_window_raise(((GtkWidget *)gtkcommand.data[0])->window);
1717
if(gtkcommand.data[2])
1718
gdk_window_lower(((GtkWidget *)gtkcommand.data[0])->window);
1719
if(gtkcommand.data[3])
1720
gdk_window_resize(((GtkWidget *)gtkcommand.data[0])->window, (int)gtkcommand.data[7], (int)gtkcommand.data[8]);
1721
if(gtkcommand.data[4])
1722
gdk_window_move(((GtkWidget *)gtkcommand.data[0])->window, (int)gtkcommand.data[9], (int)gtkcommand.data[10]);
1723
if(gtkcommand.data[5])
1724
gdk_window_hide(((GtkWidget *)gtkcommand.data[0])->window);
1725
if(gtkcommand.data[6])
1726
gdk_window_show(((GtkWidget *)gtkcommand.data[0])->window);
1727
break;
1728
case GTKSETFONT:
1729
{
1730
Screen *this_screen = (Screen *)gtkcommand.data[1];
1731
zvt_load_font((char *)gtkcommand.data[0], (Screen *)gtkcommand.data[1]);
1732
if((this_screen->nicklist = get_int_var(NICKLIST_VAR))==0)
1733
gtk_widget_hide(this_screen->scrolledwindow);
1734
else
1735
{
1736
gtk_widget_show(this_screen->scrolledwindow);
1737
gtk_widget_set_usize(this_screen->scrolledwindow, this_screen->nicklist, 0);
1738
size_allocate(this_screen->viewport, (GtkWindow *)this_screen->window);
1739
}
1740
free(gtkcommand.data[0]);
1741
}
1742
break;
1743
case GTKWINKILL:
1744
{
1745
Screen *thisscreen = (Screen *)gtkcommand.data[0];
1746
1747
gtk_signal_disconnect_by_data (GTK_OBJECT(thisscreen->window), thisscreen);
1748
1749
gdk_input_remove(thisscreen->gtkio);
1750
new_close(thisscreen->pipe[0]);
1751
new_close(thisscreen->pipe[1]);
1752
1753
thisscreen->page = NULL;
1754
1755
if(get_int_var(MDI_VAR))
1756
{
1757
Screen *tmp = screen_list;
1758
GtkWidget *page;
1759
int z = 0;
1760
1761
/* Make sure gtk_windowsize() doesn't try to use this screen */
1762
thisscreen->viewport = (GtkWidget *)NULL;
1763
while(tmp)
1764
{
1765
1766
if(tmp->alive)
1767
{
1768
page = gtk_notebook_get_nth_page((GtkNotebook *)notebook,z);
1769
if(page == thisscreen->window)
1770
gtk_notebook_remove_page((GtkNotebook *)notebook, z);
1771
z++;
1772
}
1773
tmp = tmp->next;
1774
}
1775
}
1776
if(thisscreen->window)
1777
gtk_widget_destroy(thisscreen->window);
1778
thisscreen->window = 0;
1779
}
1780
break;
1781
case GTKMDI:
1782
if(gtkcommand.data[0])
1783
{
1784
Screen *tmp = screen_list;
1785
1786
current_mdi_mode = 1;
1787
1788
MDIWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1789
1790
gtk_window_set_title(GTK_WINDOW(MDIWindow), VERSION);
1791
gtk_window_set_wmclass(GTK_WINDOW(MDIWindow), VERSION, VERSION);
1792
gtk_window_set_policy(GTK_WINDOW (MDIWindow), TRUE, TRUE, TRUE);
1793
gtk_widget_realize(MDIWindow);
1794
1795
/*gtk_signal_connect(GTK_OBJECT(nbwindow), "delete_event", GTK_SIGNAL_FUNC (nb_delete), gtkprop);*/
1796
1797
gtk_container_border_width(GTK_CONTAINER(MDIWindow), 0);
1798
1799
notebook = gtk_notebook_new();
1800
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
1801
gtk_container_add(GTK_CONTAINER(MDIWindow), notebook);
1802
gtk_widget_show(notebook);
1803
1804
while(tmp)
1805
{
1806
if(tmp->alive)
1807
{
1808
GtkWidget *tmpwidget = tmp->window, *label;
1809
1810
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->window), tmp);
1811
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->clist), tmp);
1812
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->viewport), tmp);
1813
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->adjust), tmp);
1814
tmp->window = gtk_hbox_new(0,0);
1815
1816
gtk_widget_reparent(tmp->box, tmp->window);
1817
gtk_widget_destroy(tmpwidget);
1818
1819
if(!tmp->current_window)
1820
label = gtk_label_new("<none>");
1821
else if(tmp->current_window->current_channel)
1822
label = gtk_label_new(tmp->current_window->current_channel);
1823
else if(tmp->current_window->query_nick)
1824
label = gtk_label_new(tmp->current_window->query_nick);
1825
else
1826
label = gtk_label_new("<none>");
1827
1828
gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tmp->window, label);
1829
zvt_term_set_color_scheme((ZvtTerm *)tmp->viewport, bx_red, bx_green, bx_blue);
1830
gtk_widget_show_all (tmp->window);
1831
1832
/* Re-attach handlers to the events */
1833
gtk_signal_connect (GTK_OBJECT(tmp->window), "selection_get",
1834
GTK_SIGNAL_FUNC (selection_handle), tmp);
1835
gtk_signal_connect (GTK_OBJECT(tmp->window), "selection_received",
1836
GTK_SIGNAL_FUNC (gtk_paste), tmp);
1837
gtk_signal_connect(GTK_OBJECT(tmp->window), "delete_event", GTK_SIGNAL_FUNC(window_destroy), tmp);
1838
gtk_signal_connect(GTK_OBJECT(tmp->viewport), "button_press_event", GTK_SIGNAL_FUNC(gtk_contextmenu), (gpointer)tmp);
1839
gtk_signal_connect(GTK_OBJECT(tmp->adjust), "value_changed", GTK_SIGNAL_FUNC(gtk_scrollerchanged), tmp);
1840
gtk_signal_connect(GTK_OBJECT(tmp->clist), "button_press_event", GTK_SIGNAL_FUNC(gtk_click_nicklist), (gpointer)tmp);
1841
gtk_signal_connect(GTK_OBJECT(tmp->viewport), "key_press_event", GTK_SIGNAL_FUNC(gtk_keypress), tmp);
1842
}
1843
1844
tmp = tmp->next;
1845
}
1846
1847
gtk_signal_connect(GTK_OBJECT(notebook), "switch-page", GTK_SIGNAL_FUNC(gtk_notebookpage), MDIWindow);
1848
gtk_signal_connect(GTK_OBJECT(MDIWindow), "size_allocate", GTK_SIGNAL_FUNC(gtk_windowsize), MDIWindow);
1849
gtk_widget_show(MDIWindow);
1850
1851
gtk_windowicon(MDIWindow);
1852
}
1853
else
1854
{
1855
Screen *tmp = screen_list;
1856
1857
current_mdi_mode = 0;
1858
1859
while(tmp)
1860
{
1861
if(tmp->alive)
1862
{
1863
GtkWidget *tmpwidget = tmp->window;
1864
1865
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->window), tmp);
1866
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->clist), tmp);
1867
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->viewport), tmp);
1868
gtk_signal_disconnect_by_data (GTK_OBJECT(tmp->adjust), tmp);
1869
tmp->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1870
gtk_window_set_title(GTK_WINDOW(tmp->window), VERSION);
1871
gtk_window_set_wmclass(GTK_WINDOW(tmp->window), VERSION, VERSION);
1872
gtk_window_set_policy(GTK_WINDOW (tmp->window), TRUE, TRUE, TRUE);
1873
gtk_widget_realize(tmp->window);
1874
1875
gtk_widget_reparent(tmp->box, tmp->window);
1876
gtk_widget_destroy(tmpwidget);
1877
1878
zvt_term_set_color_scheme((ZvtTerm *)tmp->viewport, bx_red, bx_green, bx_blue);
1879
gtk_widget_show_all(tmp->window);
1880
1881
tmp->page = NULL;
1882
1883
/* Re-attach handlers to the events */
1884
gtk_signal_connect(GTK_OBJECT(tmp->window), "delete_event", GTK_SIGNAL_FUNC(window_destroy), tmp);
1885
gtk_signal_connect(GTK_OBJECT(tmp->viewport), "key_press_event", GTK_SIGNAL_FUNC(gtk_keypress), tmp);
1886
gtk_signal_connect(GTK_OBJECT(tmp->window), "focus_in_event", GTK_SIGNAL_FUNC(gtk_windowfocus), tmp);
1887
gtk_signal_connect (GTK_OBJECT(tmp->window), "selection_get",
1888
GTK_SIGNAL_FUNC (selection_handle), tmp);
1889
gtk_signal_connect (GTK_OBJECT(tmp->window), "selection_received",
1890
GTK_SIGNAL_FUNC (gtk_paste), tmp);
1891
gtk_signal_connect(GTK_OBJECT(tmp->window), "size_allocate", GTK_SIGNAL_FUNC(gtk_windowsize), tmp);
1892
gtk_signal_connect(GTK_OBJECT(tmp->viewport), "button_press_event", GTK_SIGNAL_FUNC(gtk_contextmenu), (gpointer)tmp);
1893
gtk_signal_connect(GTK_OBJECT(tmp->adjust), "value_changed", GTK_SIGNAL_FUNC(gtk_scrollerchanged), tmp);
1894
gtk_signal_connect(GTK_OBJECT(tmp->clist), "button_press_event", GTK_SIGNAL_FUNC(gtk_click_nicklist), (gpointer)tmp);
1895
1896
gtk_windowicon(tmp->window);
1897
gtk_sizewindow(tmp);
1898
1899
}
1900
1901
tmp = tmp->next;
1902
}
1903
1904
gtk_widget_destroy(MDIWindow);
1905
sendevent(EVTITLE,0);
1906
}
1907
break;
1908
case GTKSCROLL:
1909
justscrolled = 1;
1910
gtk_adjustment_set_value(((Screen *)gtkcommand.data[0])->adjust, *((int *)gtkcommand.data[1]));
1911
free(gtkcommand.data[1]);
1912
break;
1913
case GTKACTIVITY:
1914
{
1915
int color = (int)gtkcommand.data[0];
1916
Window *this_window = (Window *)gtkcommand.data[1];
1917
1918
if (this_window->screen->page && notebook_page_by_refnum(this_window->refnum) != gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)))
1919
gtk_label_set_color(this_window->screen->page->tab_label, color);
1920
}
1921
break;
1922
case GTKMSGBOX:
1923
{
1924
GtkWidget *dialog,
1925
*button,
1926
*label;
1927
GtkParam *param;
1928
1929
dialog = gtk_dialog_new();
1930
1931
param = malloc(sizeof(GtkParam));
1932
1933
param->window = dialog;
1934
1935
gtk_window_set_title(GTK_WINDOW(dialog), VERSION);
1936
1937
button = gtk_button_new_with_label("Ok");
1938
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0);
1939
gtk_widget_show(button);
1940
1941
gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(delete2), param);
1942
gtk_signal_connect(GTK_OBJECT(dialog), "delete_event", GTK_SIGNAL_FUNC(delete), param);
1943
1944
label = gtk_label_new((char *)gtkcommand.data[0]);
1945
gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 20);
1946
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, TRUE, 0);
1947
gtk_widget_show(label);
1948
1949
gtk_widget_show(dialog);
1950
1951
new_free(&gtkcommand.data[0]);
1952
}
1953
break;
1954
case GTKNICKLISTWIDTH:
1955
{
1956
Screen *this_screen = (Screen *)gtkcommand.data[0];
1957
int width = (int)gtkcommand.data[1];
1958
int old = this_screen->nicklist;
1959
1960
this_screen->nicklist = width;
1961
1962
if(old && !width)
1963
gtk_widget_hide(this_screen->scrolledwindow);
1964
else if(!old && width)
1965
{
1966
gtk_widget_show(this_screen->scrolledwindow);
1967
gtk_widget_set_usize(this_screen->scrolledwindow, width, 0);
1968
size_allocate(this_screen->viewport, (GtkWindow *)this_screen->window);
1969
}
1970
else
1971
gtk_sizewindow(this_screen);
1972
}
1973
break;
1974
}
1975
gtkcommand.command = GTKNONE;
1976
gtkincommand = FALSE;
1977
pthread_cond_signal(&gtkcond);
1978
gdk_threads_leave();
1979
}
1980
1981
1982
/* Supplies the last selected text as the selection. */
1983
void
1984
selection_handle (GtkWidget *widget,
1985
GtkSelectionData *selection_data,
1986
guint info, guint seltime)
1987
{
1988
if(clipboarddata)
1989
gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
1990
8, clipboarddata, strlen(clipboarddata));
1991
}
1992
1993
/* Used to tell the main thread to continue after the window has
1994
been created. */
1995
void viewport_map(GtkWidget *widget, gpointer data)
1996
{
1997
pthread_mutex_lock(&evmutex);
1998
predicate = 1;
1999
pthread_cond_signal(&evcond);
2000
pthread_mutex_unlock(&evmutex);
2001
}
2002
2003
/* Add menubar after the screen has been mapped */
2004
void window_map(GtkWidget *widget, gpointer data)
2005
{
2006
Screen *mapscreen;
2007
2008
if ((mapscreen = findscreen(widget))!=NULL && mapscreen->window)
2009
{
2010
zvt_term_set_size((ZvtTerm *)mapscreen->viewport, mapscreen->co, mapscreen->li);
2011
if(mapscreen->nicklist)
2012
{
2013
gtk_widget_set_usize(mapscreen->scrolledwindow, mapscreen->nicklist, 0);
2014
size_allocate(mapscreen->viewport, (GtkWindow *)mapscreen->window);
2015
}
2016
}
2017
}
2018
2019
void gtk_sendcommand(int wait)
2020
{
2021
if(gtkincommand && wait)
2022
gtk_wait_command();
2023
2024
gtkincommand = TRUE;
2025
write(gtkcommandpipe[1], "A", 1);
2026
2027
if(wait)
2028
gtk_wait_command();
2029
}
2030
2031
/* Initialize all needed structures, create the main window,
2032
start the gtk_thread and gtk handler */
2033
2034
void gtkbx_init(void)
2035
{
2036
int z;
2037
GtkStyle *style;
2038
GdkColormap *cmap;
2039
GtkWidget *tmpbox;
2040
char *bg = NULL;
2041
2042
close(0);
2043
close(1);
2044
close(2);
2045
2046
/* glib 1.2.10 seems to poll on fd 0,
2047
* so we can't leave it in a closed state.
2048
*/
2049
z = open("/dev/null", O_RDONLY);
2050
if(z>0)
2051
{
2052
dup2(z, 0);
2053
close(z);
2054
}
2055
2056
/* Load the default font */
2057
mainfont = gdk_font_load("vga");
2058
2059
/* Absolute fallback fixed */
2060
if(!mainfont)
2061
{
2062
mainfont = gdk_font_load("fixed");
2063
if(!mainfont)
2064
{
2065
printf("Fatal %s error! Could not load \"fixed\" font!\r\n", VERSION);
2066
exit(100);
2067
}
2068
mainfontname = m_strdup("fixed");
2069
}
2070
else
2071
mainfontname = m_strdup("vga");
2072
2073
/* Create the main window */
2074
mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2075
gtk_window_set_title(GTK_WINDOW(mainwindow), VERSION);
2076
gtk_window_set_wmclass(GTK_WINDOW(mainwindow), VERSION, VERSION);
2077
gtk_window_set_policy(GTK_WINDOW (mainwindow), TRUE, TRUE, TRUE);
2078
gtk_widget_realize(mainwindow);
2079
2080
/* Attach handlers to the events */
2081
gtk_signal_connect(GTK_OBJECT(mainwindow), "delete_event", GTK_SIGNAL_FUNC(window_destroy), mainwindow);
2082
gtk_signal_connect(GTK_OBJECT(mainwindow), "size_allocate", GTK_SIGNAL_FUNC(gtk_windowsize), mainwindow);
2083
gtk_signal_connect(GTK_OBJECT(mainwindow), "focus_in_event", GTK_SIGNAL_FUNC(gtk_windowfocus), mainwindow);
2084
2085
gtk_container_set_border_width(GTK_CONTAINER(mainwindow), 0);
2086
2087
tmpbox = gtk_hbox_new(FALSE, 0); mainbox = gtk_vbox_new(FALSE, 0);
2088
2089
mainviewport = (GtkWidget *)zvt_term_new();
2090
zvt_term_set_fonts((ZvtTerm *)mainviewport, mainfont, mainfont);
2091
zvt_term_set_scrollback((ZvtTerm *)mainviewport, 0);
2092
zvt_term_set_blink((ZvtTerm *)mainviewport, TRUE);
2093
zvt_term_set_bell((ZvtTerm *)mainviewport, TRUE);
2094
2095
gtk_signal_connect(GTK_OBJECT(mainviewport), "key_press_event", GTK_SIGNAL_FUNC(gtk_keypress), mainwindow);
2096
2097
/* Add BitchX colors to the system colormap */
2098
cmap = gdk_colormap_get_system();
2099
for(z=0;z<16;z++)
2100
gdk_color_alloc(cmap, &colors[z]);
2101
2102
gtk_signal_connect(GTK_OBJECT(mainviewport), "map", GTK_SIGNAL_FUNC(viewport_map), mainwindow);
2103
2104
/* Create the vertical scroll bar */
2105
mainadjust = (GtkAdjustment *)gtk_adjustment_new(get_int_var(SCROLLBACK_VAR), 0, get_int_var(SCROLLBACK_VAR)+22, 1, 22, 22);
2106
mainscroller = gtk_vscrollbar_new(mainadjust);
2107
GTK_WIDGET_UNSET_FLAGS(mainscroller, GTK_CAN_FOCUS);
2108
2109
/* Create the nicklist */
2110
mainscrolledwindow = gtk_scrolled_window_new (NULL, NULL);
2111
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (mainscrolledwindow),
2112
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
2113
mainclist = gtk_clist_new(1);
2114
gtk_clist_set_column_auto_resize(GTK_CLIST(mainclist), 0, TRUE);
2115
/* Set the color to black */
2116
style = gtk_style_copy(gtk_widget_get_style(mainclist));
2117
style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = colors[0];
2118
gtk_widget_set_style(mainclist, style);
2119
gtk_container_add(GTK_CONTAINER(mainscrolledwindow), mainclist);
2120
2121
gtk_signal_connect(GTK_OBJECT(mainclist), "button_press_event", GTK_SIGNAL_FUNC(gtk_click_nicklist), (gpointer)mainwindow);
2122
2123
/* Add to the layout */
2124
gtk_container_add(GTK_CONTAINER(mainwindow), mainbox);
2125
2126
gtk_box_pack_start(GTK_BOX(tmpbox), GTK_WIDGET(mainviewport), TRUE, TRUE, 0);
2127
gtk_box_pack_start(GTK_BOX(tmpbox), mainscroller, FALSE, TRUE, 0);
2128
gtk_box_pack_start(GTK_BOX(tmpbox), mainscrolledwindow, FALSE, TRUE, 0);
2129
2130
gtk_box_pack_end(GTK_BOX(mainbox), tmpbox, TRUE, TRUE, 0);
2131
2132
/* Add to the gtk IO event list */
2133
gtkio = gdk_input_add(mainpipe[0], GDK_INPUT_READ, (GdkInputFunction)output_info, (gpointer)NULL);
2134
gdk_input_add(gtkcommandpipe[0], GDK_INPUT_READ, (GdkInputFunction)gtk_command_handler, (gpointer)NULL);
2135
2136
gtk_windowicon(mainwindow);
2137
2138
/* Show the widgets */
2139
gtk_widget_show(mainscrolledwindow);
2140
gtk_widget_show(mainclist);
2141
gtk_widget_show(mainviewport);
2142
gtk_widget_show(mainscroller);
2143
gtk_widget_show(mainbox);
2144
gtk_widget_show(tmpbox);
2145
2146
gtk_signal_connect (GTK_OBJECT(mainwindow), "selection_get",
2147
GTK_SIGNAL_FUNC (selection_handle), mainwindow);
2148
2149
gtk_signal_connect (GTK_OBJECT(mainwindow), "selection_received",
2150
GTK_SIGNAL_FUNC (gtk_paste), mainwindow);
2151
2152
gtk_selection_add_target (mainwindow, GDK_SELECTION_PRIMARY,
2153
GDK_SELECTION_TYPE_STRING, 0);
2154
2155
zvt_term_set_color_scheme((ZvtTerm *)mainviewport, bx_red, bx_green, bx_blue);
2156
2157
/* Use a background XPM if it exists */
2158
if ((bg = path_search(BitchXbg, get_string_var(LOAD_PATH_VAR))))
2159
zvt_term_set_background((ZvtTerm *)mainviewport, bg, FALSE, FALSE);
2160
2161
zvt_term_set_size((ZvtTerm *)mainviewport, 80, 25);
2162
2163
#ifdef SOUND
2164
gtk_hostname = m_strdup(getenv("DISPLAY"));
2165
if(gtk_hostname)
2166
esd_connection = esd_open_sound((char *)gtk_hostname);
2167
#endif
2168
2169
gtk_widget_show(mainwindow);
2170
2171
gdk_threads_enter();
2172
gtk_main();
2173
gdk_threads_leave();
2174
2175
pthread_exit(NULL);
2176
}
2177
2178
void gui_init(void)
2179
{
2180
current_term->TI_cols = 80;
2181
current_term->TI_lines = 25;
2182
li = current_term->TI_lines;
2183
co = current_term->TI_cols;
2184
2185
pthread_mutex_init(&evmutex, NULL);
2186
pthread_cond_init(&evcond, NULL);
2187
pthread_cond_init(&gtkcond, NULL);
2188
2189
/* Open the IPC pipes */
2190
pipe(gtkipcin);
2191
pipe(gtkcommandpipe);
2192
pipe(mainpipe);
2193
new_open(gtkipcin[0]);
2194
2195
predicate = 0;
2196
2197
if(pthread_create(&gtkthread, NULL, (void *)&gtkbx_init, NULL))
2198
{
2199
printf("%s panic! Could not create gtk thread!\n", VERSION);
2200
exit(500);
2201
}
2202
2203
/* Wait for the window to be realized */
2204
pthread_mutex_lock(&evmutex);
2205
while(!predicate)
2206
{
2207
pthread_cond_wait(&evcond, &evmutex);
2208
}
2209
pthread_mutex_unlock(&evmutex);
2210
2211
}
2212
2213
/* Handler for menuitem events */
2214
void menuitemhandler(gpointer *data)
2215
{
2216
menucmd = (int) *data;
2217
2218
sendevent(EVMENU, last_input_screen->current_window->refnum);
2219
}
2220
2221
void removetilde(char *dest, char *src)
2222
{
2223
int z, cur=0;
2224
2225
for(z=0;z<strlen(src);z++)
2226
{
2227
if(src[z] != '~')
2228
{
2229
dest[cur] = src[z];
2230
cur++;
2231
}
2232
}
2233
dest[cur] = 0;
2234
}
2235
2236
/* Create a submenu, used in menubar and popup menu creation */
2237
GtkWidget *newsubmenu(MenuStruct *menutoadd)
2238
{
2239
GtkWidget *tmphandle,
2240
*tmpmenu;
2241
MenuList *tmp;
2242
char expbuf[500];
2243
2244
tmp = menutoadd->menuorigin;
2245
2246
/* When you readd shared menu support remove the #ifndef GTK from commands2.c */
2247
2248
tmpmenu = gtk_menu_new();
2249
2250
while(tmp!=NULL)
2251
{
2252
if(tmp->menutype & GUISEPARATOR)
2253
tmphandle=gtk_menu_item_new();
2254
else
2255
{
2256
int checkstate = (tmp->menutype & GUICHECKEDMENUITEM);
2257
2258
/* Using a slightly different approach to shared
2259
menus in GTK */
2260
if(tmp->refnum > 0)
2261
{
2262
/* If we already have an entry defined, use it's info */
2263
MenuRef *tmpref = find_menuref(menutoadd->root, tmp->refnum);
2264
if(tmpref)
2265
{
2266
if(tmpref->checked)
2267
checkstate = TRUE;
2268
else
2269
checkstate = FALSE;
2270
2271
if(tmpref->menutext)
2272
strcpy(expbuf, tmpref->menutext);
2273
}
2274
else
2275
{
2276
/* We don't have an entry so we create a new one */
2277
removetilde(expbuf, tmp->name);
2278
if(tmp->menutype & GUICHECKEDMENUITEM)
2279
new_menuref(&menutoadd->root, tmp->refnum, expbuf, 1);
2280
else
2281
new_menuref(&menutoadd->root, tmp->refnum, expbuf, 0);
2282
}
2283
}
2284
else
2285
removetilde(expbuf, tmp->name);
2286
2287
if(tmp->menutype & GUICHECKMENUITEM)
2288
{
2289
tmphandle=gtk_check_menu_item_new_with_label(expbuf);
2290
2291
if(tmp->refnum > 0)
2292
{
2293
MenuRef *tmpref = find_menuref(menutoadd->root, tmp->refnum);
2294
if(tmpref)
2295
tmpref->menuhandle = tmphandle;
2296
}
2297
gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(tmphandle), TRUE);
2298
2299
if(checkstate)
2300
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tmphandle), checkstate);
2301
}
2302
else
2303
tmphandle=gtk_menu_item_new_with_label(expbuf);
2304
}
2305
if(tmp->menutype & GUISUBMENU)
2306
gtk_menu_item_set_submenu(GTK_MENU_ITEM(tmphandle), newsubmenu((MenuStruct *)findmenu(tmp->submenu)));
2307
if(tmp->menutype & GUIMENUITEM)
2308
gtk_signal_connect_object(GTK_OBJECT(tmphandle), "activate", GTK_SIGNAL_FUNC(menuitemhandler), (gpointer) &tmp->menuid);
2309
/*if((tmp->menutype & GUIBRKSUBMENU) || (tmp->menutype & GUIBRKMENUITEM))
2310
gtk_menu_item_right_justify(GTK_MENU_ITEM(tmphandle));*/
2311
gtk_menu_append(GTK_MENU(tmpmenu), tmphandle);
2312
gtk_widget_show(tmphandle);
2313
tmp=tmp->next;
2314
}
2315
2316
gtk_widget_show(tmpmenu);
2317
return tmpmenu;
2318
}
2319
2320
/* Creates a menubar on a given window/screen */
2321
void newmenubar(Screen *menuscreen, MenuStruct *menutoadd)
2322
{
2323
GtkWidget *tmphandle;
2324
MenuList *tmp;
2325
char expbuf[500];
2326
2327
if(!menutoadd || !menutoadd->menuorigin)
2328
{
2329
say("Cannot create blank menu.");
2330
return;
2331
}
2332
2333
tmp = menutoadd->menuorigin;
2334
if(menuscreen->menubar)
2335
{
2336
gtk_widget_destroy(menuscreen->menubar);
2337
menuscreen->menubar = NULL;
2338
}
2339
2340
if(menuscreen->menu)
2341
new_free(&menuscreen->menu);
2342
menuscreen->menu = m_strdup(menutoadd->name);
2343
2344
menuscreen->menubar = gtk_menu_bar_new();
2345
while(tmp!=NULL)
2346
{
2347
if(tmp->menutype & GUISEPARATOR)
2348
tmphandle = gtk_menu_item_new();
2349
else
2350
{
2351
removetilde(expbuf, tmp->name);
2352
tmphandle=gtk_menu_item_new_with_label(expbuf);
2353
}
2354
if(tmp->menutype & GUISUBMENU)
2355
gtk_menu_item_set_submenu(GTK_MENU_ITEM(tmphandle), newsubmenu((MenuStruct *)findmenu(tmp->submenu)));
2356
if(tmp->menutype & GUIMENUITEM)
2357
gtk_signal_connect_object(GTK_OBJECT(tmphandle), "activate", GTK_SIGNAL_FUNC(menuitemhandler), (gpointer) &tmp->menuid);
2358
gtk_menu_bar_append(GTK_MENU_BAR(menuscreen->menubar), tmphandle);
2359
gtk_widget_show(tmphandle);
2360
tmp=tmp->next;
2361
}
2362
gtk_box_pack_end(GTK_BOX(menuscreen->box), menuscreen->menubar, FALSE, TRUE, 0);
2363
gtk_widget_show(menuscreen->menubar);
2364
gtk_sizewindow(menuscreen);
2365
}
2366
2367
/* This section is for portability considerations */
2368
void gui_clreol(void)
2369
{
2370
gtkprintf(current_term->TI_el);
2371
}
2372
2373
void gui_gotoxy(int col, int row)
2374
{
2375
col++;row++;
2376
gtkprintf("\e[%d;%dH", row, col);
2377
}
2378
2379
void gui_clrscr(void)
2380
{
2381
Screen *tmp;
2382
2383
for(tmp = screen_list; tmp; tmp = tmp->next)
2384
{
2385
if(tmp->alive && tmp->pipe[1])
2386
write(tmp->pipe[1], "\e[2J", 4);
2387
}
2388
}
2389
2390
void gui_left(int num)
2391
{
2392
gtkprintf("\e[D");
2393
}
2394
2395
void gui_right(int num)
2396
{
2397
gtkprintf("\e[C");
2398
}
2399
2400
void gui_scroll(int top, int bot, int n)
2401
{
2402
/* Stolen from term.c */
2403
int i,oneshot=0,rn,sr,er;
2404
char thing[128], final[128], start[128];
2405
2406
/* Some basic sanity checks */
2407
if (n == 0 || top == bot || bot < top)
2408
return;
2409
2410
sr = er = 0;
2411
final[0] = start[0] = thing[0] = 0;
2412
2413
if (n < 0)
2414
rn = -n;
2415
else
2416
rn = n;
2417
2418
if (current_term->TI_csr && (current_term->TI_ri || current_term->TI_rin) && (current_term->TI_ind || current_term->TI_indn))
2419
{
2420
/*
2421
* Previously there was a test to see if the entire scrolling
2422
* region was the full screen. That test *always* fails,
2423
* because we never scroll the bottom line of the screen.
2424
*/
2425
strcpy(start, (char *)tparm(current_term->TI_csr, top, bot));
2426
strcpy(final, (char *)tparm(current_term->TI_csr, 0, current_term->TI_lines-1));
2427
2428
if (n > 0)
2429
{
2430
sr = bot;
2431
er = top;
2432
strcpy(thing, current_term->TI_ind);
2433
}
2434
else
2435
{
2436
sr = top;
2437
er = bot;
2438
strcpy (thing, current_term->TI_ri);
2439
}
2440
}
2441
2442
if (!thing[0])
2443
return;
2444
2445
/* Do the actual work here */
2446
if (start[0])
2447
gtkprintf(start);
2448
2449
gui_gotoxy (0, sr);
2450
2451
if (oneshot)
2452
gtkprintf(thing);
2453
else
2454
{
2455
for (i = 0; i < rn; i++)
2456
gtkprintf(thing);
2457
}
2458
gui_gotoxy (0, er);
2459
if (final[0])
2460
gtkprintf(final);
2461
2462
}
2463
2464
void gui_flush(void)
2465
{
2466
}
2467
2468
void gui_puts(unsigned char *buffer)
2469
{
2470
int i;
2471
2472
for (i = 0; i < strlen(buffer); i++)
2473
gtkputc(buffer[i]);
2474
2475
gtkputc('\n');
2476
}
2477
2478
/* Create a new (non-main) window */
2479
void gui_new_window(Screen *gtknew, Window *win)
2480
{
2481
predicate = 0;
2482
gtkcommand.command = GTKNEWWIN;
2483
gtkcommand.data[0] = (gpointer) gtknew;
2484
gtkcommand.data[1] = (gpointer) win;
2485
gtk_sendcommand(TRUE);
2486
2487
/* Wait for the window to be realized */
2488
pthread_mutex_lock(&evmutex);
2489
while(!predicate)
2490
{
2491
pthread_cond_wait(&evcond, &evmutex);
2492
}
2493
pthread_mutex_unlock(&evmutex);
2494
/* This is a hack which should be removed ASAP - Brian */
2495
write(gtkipcin[1], "\r", 1);
2496
}
2497
2498
void gtk_new_window(Screen *gtknew, Window *win)
2499
{
2500
char *defmenu, *deffont;
2501
GtkWidget *tmpbox, *label;
2502
GtkStyle *style;
2503
MenuStruct *tmpms;
2504
char *bg = NULL;
2505
2506
gtknew->page = NULL;
2507
2508
/* Create the main window */
2509
if(get_int_var(MDI_VAR))
2510
{
2511
gtknew->window = gtk_hbox_new(0,0);
2512
label = gtk_label_new("<none>");
2513
gtk_notebook_append_page (GTK_NOTEBOOK(notebook), gtknew->window, label);
2514
}
2515
else
2516
{
2517
gtknew->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2518
2519
gtk_window_set_title(GTK_WINDOW(gtknew->window), VERSION);
2520
gtk_window_set_wmclass(GTK_WINDOW(gtknew->window), VERSION, VERSION);
2521
gtk_window_set_policy(GTK_WINDOW (gtknew->window), TRUE, TRUE, TRUE);
2522
gtk_widget_realize(gtknew->window);
2523
}
2524
2525
/* Attach handlers to the events */
2526
if(!get_int_var(MDI_VAR))
2527
{
2528
gtk_signal_connect(GTK_OBJECT(gtknew->window), "delete_event", GTK_SIGNAL_FUNC(window_destroy), gtknew);
2529
gtk_signal_connect(GTK_OBJECT(gtknew->window), "size_allocate", GTK_SIGNAL_FUNC(gtk_windowsize), gtknew);
2530
gtk_signal_connect(GTK_OBJECT(gtknew->window), "focus_in_event", GTK_SIGNAL_FUNC(gtk_windowfocus), gtknew);
2531
}
2532
2533
gtk_container_set_border_width(GTK_CONTAINER(gtknew->window), 0);
2534
2535
tmpbox = gtk_hbox_new(FALSE, 0);
2536
gtknew->box = gtk_vbox_new(FALSE, 0);
2537
2538
style = gtk_style_new();
2539
2540
deffont=get_string_var(DEFAULT_FONT_VAR);
2541
gtknew->viewport = (GtkWidget *)zvt_term_new();
2542
if(deffont && *deffont)
2543
zvt_load_font(deffont, gtknew);
2544
else
2545
zvt_load_font("fixed", gtknew);
2546
2547
gtknew->co = co; gtknew->li = li;
2548
zvt_term_set_scrollback((ZvtTerm *)gtknew->viewport, 0);
2549
zvt_term_set_blink((ZvtTerm *)gtknew->viewport, TRUE);
2550
zvt_term_set_bell((ZvtTerm *)gtknew->viewport, TRUE);
2551
2552
gtk_signal_connect(GTK_OBJECT(gtknew->viewport), "key_press_event", GTK_SIGNAL_FUNC(gtk_keypress), gtknew);
2553
2554
/* Add a background XPM if it exists */
2555
if ((bg = path_search(BitchXbg, get_string_var(LOAD_PATH_VAR))))
2556
zvt_term_set_background((ZvtTerm *)gtknew->viewport, bg, FALSE, FALSE);
2557
2558
gtk_signal_connect(GTK_OBJECT(gtknew->viewport), "map", GTK_SIGNAL_FUNC(viewport_map), NULL);
2559
2560
/* Create the vertical scroll bar */
2561
gtknew->adjust = (GtkAdjustment *)gtk_adjustment_new(get_int_var(SCROLLBACK_VAR), 0, get_int_var(SCROLLBACK_VAR)+22, 1, 22, 22);
2562
gtknew->scroller = gtk_vscrollbar_new(gtknew->adjust);
2563
GTK_WIDGET_UNSET_FLAGS(gtknew->scroller, GTK_CAN_FOCUS);
2564
2565
gtk_signal_connect(GTK_OBJECT(gtknew->adjust), "value_changed", GTK_SIGNAL_FUNC(gtk_scrollerchanged), (gpointer)gtknew);
2566
2567
/* Create the nicklist */
2568
gtknew->scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
2569
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (gtknew->scrolledwindow),
2570
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
2571
gtknew->clist = gtk_clist_new(1);
2572
gtk_clist_set_column_auto_resize(GTK_CLIST(gtknew->clist), 0, TRUE);
2573
/* Set the color to black */
2574
style = gtk_style_copy(gtk_widget_get_style(gtknew->clist));
2575
style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = colors[0];
2576
gtk_widget_set_style(gtknew->clist, style);
2577
gtk_container_add(GTK_CONTAINER(gtknew->scrolledwindow), gtknew->clist);
2578
2579
gtk_signal_connect(GTK_OBJECT(gtknew->viewport), "button_press_event", GTK_SIGNAL_FUNC(gtk_contextmenu), gtknew);
2580
gtk_signal_connect(GTK_OBJECT(gtknew->clist), "button_press_event", GTK_SIGNAL_FUNC(gtk_click_nicklist), gtknew);
2581
2582
/* Add to the layout */
2583
gtk_container_add(GTK_CONTAINER(gtknew->window), gtknew->box);
2584
2585
gtk_box_pack_start(GTK_BOX(tmpbox), gtknew->viewport, TRUE, TRUE, 0);
2586
gtk_box_pack_start(GTK_BOX(tmpbox), gtknew->scroller, FALSE, TRUE, 0);
2587
gtk_box_pack_start(GTK_BOX(tmpbox), gtknew->scrolledwindow, FALSE, TRUE, 0);
2588
2589
gtk_box_pack_end(GTK_BOX(gtknew->box), tmpbox, TRUE, TRUE, 0);
2590
2591
gtknew->nicklist = get_int_var(NICKLIST_VAR);
2592
2593
gtk_windowicon(gtknew->window);
2594
2595
if(gtknew->nicklist)
2596
gtk_widget_show(gtknew->scrolledwindow);
2597
gtk_widget_show(gtknew->clist);
2598
gtk_widget_show(GTK_WIDGET(gtknew->viewport));
2599
gtk_widget_show(gtknew->scroller);
2600
gtk_widget_show(gtknew->box);
2601
gtk_widget_show(tmpbox);
2602
gtk_widget_show(gtknew->window);
2603
2604
gtk_signal_connect (GTK_OBJECT(gtknew->window), "selection_get",
2605
GTK_SIGNAL_FUNC (selection_handle), gtknew);
2606
2607
gtk_signal_connect (GTK_OBJECT(gtknew->window), "selection_received",
2608
GTK_SIGNAL_FUNC (gtk_paste), gtknew);
2609
2610
gtk_selection_add_target (gtknew->window, GDK_SELECTION_PRIMARY,
2611
GDK_SELECTION_TYPE_STRING, 0);
2612
2613
zvt_term_set_color_scheme((ZvtTerm *)gtknew->viewport, bx_red, bx_green, bx_blue);
2614
2615
/* Open the screen's output pipe */
2616
pipe(gtknew->pipe);
2617
2618
/* Add to the gtk IO event list */
2619
gtknew->gtkio = gdk_input_add(gtknew->pipe[0], GDK_INPUT_READ, (GdkInputFunction)output_info, (gpointer)NULL);
2620
2621
output_screen = last_input_screen = gtknew;
2622
make_window_current(win);
2623
gtk_sizewindow(gtknew);
2624
zvt_term_set_size((ZvtTerm *)gtknew->viewport, gtknew->co, gtknew->li);
2625
if(gtknew->nicklist)
2626
gtk_widget_set_usize(gtknew->scrolledwindow, gtknew->nicklist, 0);
2627
2628
gtk_widget_realize(gtknew->window);
2629
2630
gtknew->menubar = (GtkWidget *)NULL;
2631
2632
gtkcommand.command = GTKNONE;
2633
2634
defmenu=get_string_var(DEFAULT_MENU_VAR);
2635
if(defmenu && *defmenu)
2636
{
2637
if((tmpms = (MenuStruct *)findmenu(defmenu))!=NULL)
2638
{
2639
gtkcommand.command = GTKMENUBAR;
2640
gtkcommand.data[0] = (gpointer) gtknew;
2641
gtkcommand.data[1] = (gpointer) m_strdup(defmenu);
2642
gtkcommand.data[2] = (gpointer) tmpms;
2643
}
2644
}
2645
2646
gtkincommand = TRUE;
2647
write(gtkcommandpipe[1], "A", 1);
2648
2649
/* Make the new tab visiable */
2650
if(get_int_var(MDI_VAR))
2651
gtk_setfocus(gtknew);
2652
}
2653
2654
void gui_kill_window(Screen *killscreen)
2655
{
2656
gtkcommand.command = GTKWINKILL;
2657
gtkcommand.data[0] = (gpointer) killscreen;
2658
gtk_sendcommand(TRUE);
2659
}
2660
2661
int gui_read(Screen *screen, char *buffer, int maxbufsize)
2662
{
2663
return read(gtkipcin[0], buffer, maxbufsize);
2664
}
2665
2666
void gui_settitle(char *titletext, Screen *gtkwin)
2667
{
2668
if(gtkwin->alive == 0)
2669
return;
2670
2671
gtkcommand.command = GTKTITLE;
2672
gtkcommand.data[1] = (gpointer) m_strdup(titletext);
2673
gtkcommand.data[0] = (gpointer) gtkwin;
2674
gtk_sendcommand(TRUE);
2675
}
2676
2677
void gui_msgbox(void)
2678
{
2679
extern char *msgtext;
2680
2681
gtkcommand.command = GTKMSGBOX;
2682
gtkcommand.data[0] = (gpointer) msgtext;
2683
gtk_sendcommand(TRUE);
2684
}
2685
2686
void gui_popupmenu(char *menuname)
2687
{
2688
gtkcommand.command = GTKMENUPOPUP;
2689
gtkcommand.data[0] = (gpointer) m_strdup(menuname);
2690
gtk_sendcommand(TRUE);
2691
}
2692
2693
void gui_font_dialog(Screen *screen)
2694
{
2695
gtkcommand.command = GTKFONT;
2696
gtkcommand.data[0] = (gpointer) screen;
2697
gtk_sendcommand(TRUE);
2698
}
2699
2700
2701
void gui_file_dialog(char *type, char *path, char *title, char *ok, char *apply, char *code, char *szButton)
2702
{
2703
gtkcommand.command = GTKFILEDIALOG;
2704
gtkcommand.data[0] = (gpointer) m_strdup(type);
2705
gtkcommand.data[1] = (gpointer) m_strdup(path);
2706
gtkcommand.data[2] = (gpointer) m_strdup(title);
2707
gtkcommand.data[3] = (gpointer) m_strdup(ok);
2708
gtkcommand.data[4] = (gpointer) m_strdup(apply);
2709
gtkcommand.data[5] = (gpointer) m_strdup(szButton);
2710
gtkcommand.data[6] = (gpointer) m_strdup(code);
2711
gtkcommand.data[7] = (gpointer) current_window->screen;
2712
gtk_sendcommand(TRUE);
2713
}
2714
2715
void gui_properties_notebook(void)
2716
{
2717
if(in_properties)
2718
return;
2719
2720
gtkcommand.command = GTKPROP;
2721
gtk_sendcommand(TRUE);
2722
}
2723
2724
#define current_screen last_input_screen
2725
#define INPUT_BUFFER current_screen->input_buffer
2726
#define ADD_TO_INPUT(x) strmcat(INPUT_BUFFER, (x), INPUT_BUFFER_SIZE);
2727
2728
void gtk_paste (GtkWidget *widget, GtkSelectionData *selection_data, gpointer data)
2729
{
2730
char *sdata;
2731
2732
/* If we didn't get anything abort */
2733
if (selection_data->length < 0)
2734
return;
2735
2736
/* Make sure we got the data in the expected form */
2737
if (selection_data->type != GDK_SELECTION_TYPE_STRING)
2738
return;
2739
2740
sdata = (char *)selection_data->data;;
2741
2742
if(!sdata)
2743
return;
2744
2745
selectdata = strdup(sdata);
2746
2747
if(strlen(selectdata) < 1)
2748
{
2749
free(selectdata);
2750
return;
2751
}
2752
2753
sendevent(EVPASTE, current_window ? current_window->refnum : 0);
2754
/* I don't think we need to free "data" */
2755
}
2756
2757
void gtk_main_paste (int refnum)
2758
{
2759
char *oclip, *clip, *bit = NULL;
2760
int line = 0, i = 0;
2761
char *channel = NULL;
2762
int topic = 0;
2763
int smartpaste = 0;
2764
char smart[512]; /* SmartPaste buffer (256) */
2765
int smartsize = 80;
2766
int input_line = 0;
2767
char *args = pasteargs;
2768
Window *this_window = get_window_by_refnum(refnum);
2769
2770
if(this_window)
2771
{
2772
make_window_current(this_window);
2773
from_server = this_window->server;
2774
}
2775
2776
/* Parse arguments */
2777
if (!args || !*args)
2778
channel = get_current_channel_by_refnum(0);
2779
else
2780
{
2781
char *t;
2782
while (args && *args)
2783
{
2784
t = next_arg(args, &args);
2785
if (*t == '-')
2786
{
2787
if (!my_strnicmp(t, "-topic", strlen(t)))
2788
{
2789
topic = 1;
2790
}
2791
else if (!my_strnicmp(t, "-smart", strlen(t)))
2792
{
2793
/* Smartpaste */
2794
smartpaste = 1;
2795
}
2796
else if (!my_strnicmp(t, "-input", strlen(t)))
2797
{
2798
/* Smartpaste */
2799
input_line = 1;
2800
}
2801
}
2802
else
2803
channel = t;
2804
}
2805
}
2806
if (!channel)
2807
channel = get_current_channel_by_refnum(0);
2808
2809
2810
if(!channel && !(current_window || current_window->query_nick) && !topic && !input_line)
2811
return;
2812
2813
oclip = (char *)selectdata; line = 0;
2814
2815
if (!smartpaste)
2816
{
2817
/* Ordinary paste */
2818
clip = oclip; bit = strtok(clip, "\n\r");
2819
while (bit)
2820
{
2821
if (input_line)
2822
{
2823
if(bit && *bit)
2824
{
2825
ADD_TO_INPUT(bit);
2826
update_input(UPDATE_FROM_CURSOR);
2827
}
2828
} else
2829
if (!topic)
2830
{
2831
if(current_window->query_nick)
2832
{
2833
if(*current_window->query_nick && bit && *bit)
2834
if (do_hook(PASTE_LIST, "%s %s", current_window->query_nick, bit))
2835
send_text(current_window->query_nick, bit, NULL, 1, 0);
2836
}
2837
else
2838
{
2839
if(channel && *channel && bit && *bit)
2840
if (do_hook(PASTE_LIST, "%s %s", channel, bit))
2841
send_text(channel, bit, NULL, 1, 0);
2842
}
2843
} else
2844
{
2845
send_to_server("TOPIC %s :%s", channel, bit);
2846
break;
2847
}
2848
line++;
2849
bit = strtok(NULL, "\n\r");
2850
if (input_line && bit)
2851
send_line(0, NULL);
2852
2853
}
2854
} else
2855
{
2856
/* Rosmo's Incredibly Dull SmartPaste:
2857
Fits as much as possible into a 80-nick_length buffer, stripping
2858
spaces from beginning and end and then pasting */
2859
2860
if (!topic)
2861
smartsize = 512;
2862
else
2863
smartsize = 128; /* 'tis correct? */
2864
2865
clip = oclip;
2866
while (*clip && *clip == ' ') clip++; /* Strip spaces from the start */
2867
2868
*smart = '\0';
2869
while (*clip)
2870
{
2871
if (input_line && *smart)
2872
send_line(0, NULL);
2873
2874
*smart = '\0';
2875
2876
i = 0;
2877
while (*clip && i < smartsize)
2878
{
2879
if (*clip != '\n')
2880
{
2881
if (*clip != '\r') strncat(smart, clip, 1);
2882
}
2883
else
2884
{
2885
strcat(smart, " "); clip++; i++;
2886
while (*clip && *clip == ' ') clip++; /* Strip spaces */
2887
clip--;
2888
}
2889
clip++; i++;
2890
}
2891
2892
if (strcmp(smart, "") != 0) /* If our smart buffer has stuff, send it! */
2893
{
2894
if (input_line)
2895
{
2896
if(*smart)
2897
{
2898
ADD_TO_INPUT(smart);
2899
update_input(UPDATE_FROM_CURSOR);
2900
}
2901
} else
2902
if (!topic)
2903
{
2904
if(current_window->query_nick)
2905
{
2906
if(*current_window->query_nick && *smart)
2907
if (do_hook(PASTE_LIST, "%s %s", current_window->query_nick, smart))
2908
send_text(current_window->query_nick, smart, NULL, 1, 0);
2909
}
2910
else
2911
{
2912
if(channel && *channel && *smart)
2913
if (do_hook(PASTE_LIST, "%s %s", channel, smart))
2914
send_text(channel, smart, NULL, 1, 0);
2915
}
2916
}
2917
else
2918
{
2919
send_to_server("TOPIC %s :%s", channel, smart);
2920
break;
2921
}
2922
}
2923
}
2924
2925
free(oclip); /* Free */
2926
}
2927
}
2928
2929
void gui_paste(char *args)
2930
{
2931
gtkcommand.command = GTKPASTE;
2932
gtkcommand.data[0] = (gpointer) strdup(args);
2933
gtk_sendcommand(TRUE);
2934
}
2935
2936
void gui_setfocus(Screen *screen)
2937
{
2938
gtkcommand.command = GTKSETFOCUS;
2939
gtkcommand.data[0] = (gpointer) screen;
2940
gtk_sendcommand(TRUE);
2941
}
2942
2943
void gui_scrollerchanged(Screen *screen, int position)
2944
{
2945
int *pos;
2946
2947
pos = malloc(sizeof(int));
2948
*pos = position;
2949
2950
gtkcommand.command = GTKSCROLL;
2951
gtkcommand.data[0] = (gpointer) screen;
2952
gtkcommand.data[1] = (gpointer) pos;
2953
gtk_sendcommand(TRUE);
2954
}
2955
2956
/* Assuming fontinfo is allocated as 100 bytes in function_winitem() */
2957
void gui_query_window_info(Screen *screen, char *fontinfo, int *x, int *y, int *cx, int *cy)
2958
{
2959
if(screen && screen->window)
2960
{
2961
gdk_window_get_position(screen->window->window, x, y);
2962
gdk_window_get_size(screen->window->window, cx, cy);
2963
if(screen->fontname)
2964
strlcpy(fontinfo, screen->fontname, 100);
2965
else
2966
strcpy(fontinfo, "unknown");
2967
}
2968
}
2969
2970
/* Sound is implemented using ESD at the moment */
2971
void gui_play_sound(char *filename)
2972
{
2973
#ifdef SOUND
2974
esd_play_file(VERSION, filename, 0);
2975
#endif
2976
}
2977
2978
int gui_send_mci_string(char *mcistring, char *retstring)
2979
{
2980
return 0;
2981
}
2982
2983
void gui_get_sound_error(int errnum, char *errstring)
2984
{
2985
}
2986
2987
void gui_menu(Screen *screen, char *addmenu)
2988
{
2989
MenuStruct *menutoadd;
2990
menutoadd = findmenu(addmenu);
2991
2992
gtkcommand.command = GTKMENUBAR;
2993
gtkcommand.data[0] = (gpointer) screen;
2994
gtkcommand.data[1] = (gpointer) m_strdup(addmenu);
2995
gtkcommand.data[2] = (gpointer) menutoadd;
2996
gtk_sendcommand(TRUE);
2997
}
2998
2999
int gui_isset(Screen *screen, fd_set *rd, int what)
3000
{
3001
if(screen == last_input_screen)
3002
return FD_ISSET(gtkipcin[0], rd);
3003
else
3004
return FALSE;
3005
}
3006
3007
int gui_putc(int c)
3008
{
3009
return gtkputc((unsigned char)c);
3010
}
3011
3012
void gui_exit(void)
3013
{
3014
#ifdef SOUND
3015
if(esd_connection >= 0)
3016
esd_close(esd_connection);
3017
#endif
3018
3019
gtkcommand.command = GTKEXIT;
3020
gtk_sendcommand(FALSE);
3021
usleep(1000);
3022
exit(0);
3023
}
3024
3025
void gui_screen(Screen *gtknew)
3026
{
3027
/* Copy the global variables into the screen struct */
3028
gtknew->old_li=gtknew->li;
3029
gtknew->old_co=gtknew->co;
3030
gtknew->window = mainwindow;
3031
gtknew->viewport = mainviewport;
3032
gtknew->menubar = mainmenubar;
3033
gtknew->scroller = mainscroller;
3034
gtknew->scrolledwindow = mainscrolledwindow;
3035
gtknew->clist = mainclist;
3036
gtknew->box = mainbox;
3037
gtknew->adjust = mainadjust;
3038
gtknew->font = mainfont;
3039
gtknew->fontname = mainfontname;
3040
gtknew->gtkio = gtkio;
3041
gtknew->pipe[0] = mainpipe[0];
3042
gtknew->pipe[1] = mainpipe[1];
3043
gtknew->maxfontwidth = ((ZvtTerm *)gtknew->viewport)->charwidth;
3044
gtknew->maxfontheight = ((ZvtTerm *)gtknew->viewport)->charheight;
3045
gtknew->page = NULL;
3046
main_screen = gtknew;
3047
/* Clean out the globals */
3048
mainwindow = (GtkWidget *)NULL;
3049
mainviewport = (GtkWidget *)NULL;
3050
mainmenubar = (GtkWidget *)NULL;
3051
mainscroller = (GtkWidget *)NULL;
3052
mainscrolledwindow = (GtkWidget *)NULL;
3053
mainclist = (GtkWidget *)NULL;
3054
mainbox = (GtkWidget *)NULL;
3055
3056
gtk_signal_disconnect_by_data (GTK_OBJECT(gtknew->window), gtknew->window);
3057
gtk_signal_disconnect_by_data (GTK_OBJECT(gtknew->clist), gtknew->window);
3058
gtk_signal_disconnect_by_data (GTK_OBJECT(gtknew->viewport), gtknew->window);
3059
/* Re-attach handlers to the events */
3060
gtk_signal_connect(GTK_OBJECT(gtknew->window), "delete_event", GTK_SIGNAL_FUNC(window_destroy), gtknew);
3061
gtk_signal_connect(GTK_OBJECT(gtknew->viewport), "key_press_event", GTK_SIGNAL_FUNC(gtk_keypress), gtknew);
3062
gtk_signal_connect(GTK_OBJECT(gtknew->window), "size_allocate", GTK_SIGNAL_FUNC(gtk_windowsize), gtknew);
3063
gtk_signal_connect(GTK_OBJECT(gtknew->window), "focus_in_event", GTK_SIGNAL_FUNC(gtk_windowfocus), gtknew);
3064
gtk_signal_connect(GTK_OBJECT(gtknew->viewport), "button_press_event", GTK_SIGNAL_FUNC(gtk_contextmenu), (gpointer)gtknew);
3065
gtk_signal_connect(GTK_OBJECT(gtknew->adjust), "value_changed", GTK_SIGNAL_FUNC(gtk_scrollerchanged), gtknew);
3066
gtk_signal_connect(GTK_OBJECT(gtknew->clist), "button_press_event", GTK_SIGNAL_FUNC(gtk_click_nicklist), (gpointer)gtknew);
3067
gtk_signal_connect (GTK_OBJECT(gtknew->window), "selection_get",
3068
GTK_SIGNAL_FUNC (selection_handle), gtknew);
3069
gtk_signal_connect (GTK_OBJECT(gtknew->window), "selection_received",
3070
GTK_SIGNAL_FUNC (gtk_paste), gtknew);
3071
}
3072
3073
void gui_resize(Screen *gtknew)
3074
{
3075
gtk_resize(gtknew);
3076
}
3077
3078
/* Load the font now that the Saves are loaded */
3079
void gui_font_init(void)
3080
{
3081
char *font;
3082
3083
if((font=get_string_var(DEFAULT_FONT_VAR))!=NULL)
3084
gui_font_set(font, main_screen);
3085
else
3086
gui_font_set(mainfontname, main_screen);
3087
}
3088
3089
void gui_font_set(char *font, Screen *screen)
3090
{
3091
gtkcommand.command = GTKSETFONT;
3092
gtkcommand.data[0] = (gpointer)strdup(font);
3093
gtkcommand.data[1] = (gpointer)screen;
3094
gtk_sendcommand(TRUE);
3095
}
3096
3097
int gui_screen_width(void)
3098
{
3099
return gdk_screen_width();
3100
}
3101
3102
int gui_screen_height(void)
3103
{
3104
return gdk_screen_height();
3105
}
3106
3107
void gui_setwindowpos(Screen *screen, int x, int y, int cx, int cy, int top, int bottom, int min, int max, int restore, int activate, int size, int position)
3108
{
3109
if(screen && screen->window)
3110
{
3111
gtkcommand.command = GTKSETWINDOWPOS;
3112
gtkcommand.data[0] = (gpointer)screen->window;
3113
gtkcommand.data[1] = (gpointer)top;
3114
gtkcommand.data[2] = (gpointer)bottom;
3115
gtkcommand.data[3] = (gpointer)size;
3116
gtkcommand.data[4] = (gpointer)position;
3117
gtkcommand.data[5] = (gpointer)min;
3118
gtkcommand.data[6] = (gpointer)restore;
3119
gtkcommand.data[7] = (gpointer)cx;
3120
gtkcommand.data[8] = (gpointer)cy;
3121
gtkcommand.data[9] = (gpointer)x;
3122
gtkcommand.data[10] = (gpointer)y;
3123
gtk_sendcommand(TRUE);
3124
}
3125
}
3126
3127
void BX_gui_mutex_lock(void)
3128
{
3129
gdk_threads_enter();
3130
}
3131
3132
void BX_gui_mutex_unlock(void)
3133
{
3134
gdk_threads_leave();
3135
}
3136
3137
int gui_setmenuitem(char *menuname, int refnum, char *what, char *param)
3138
{
3139
MenuRef *tmp = NULL;
3140
MenuStruct *tmpmenu = findmenu(menuname);
3141
MenuList *thismenu;
3142
3143
if(!tmpmenu)
3144
return FALSE;
3145
3146
tmp = find_menuref(tmpmenu->root, refnum);
3147
3148
thismenu = tmpmenu->menuorigin;
3149
3150
while(thismenu && thismenu->next && thismenu->refnum != refnum)
3151
{
3152
thismenu = thismenu->next;
3153
}
3154
3155
if(!thismenu || thismenu->refnum != refnum)
3156
return FALSE;
3157
3158
if(my_stricmp(what, "check")==0)
3159
{
3160
int checkstate = my_atol(param);
3161
3162
if(checkstate)
3163
thismenu->menutype |= GUICHECKEDMENUITEM;
3164
else
3165
thismenu->menutype &= ~GUICHECKEDMENUITEM;
3166
3167
if(!tmp)
3168
return TRUE;
3169
3170
if(checkstate)
3171
tmp->checked = TRUE;
3172
else
3173
tmp->checked = FALSE;
3174
3175
if(tmp->menuhandle && GTK_CHECK_MENU_ITEM(tmp->menuhandle)->active != tmp->checked)
3176
{
3177
tmp->checked = GTK_CHECK_MENU_ITEM(tmp->menuhandle)->active;
3178
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tmp->menuhandle), tmp->checked);
3179
}
3180
}
3181
else if(my_stricmp(what, "text")==0)
3182
{
3183
if(thismenu->name)
3184
{
3185
new_free(&thismenu->name);
3186
thismenu->name = m_strdup(param);
3187
}
3188
3189
if(!tmp)
3190
return TRUE;
3191
3192
if(tmp->menutext)
3193
new_free(&tmp->menutext);
3194
tmp->menutext = m_strdup(param);
3195
gtkcommand.command = GTKREDRAWMENUS;
3196
gtk_sendcommand(TRUE);
3197
}
3198
else
3199
return FALSE;
3200
3201
return TRUE;
3202
}
3203
3204
/* Hrm... for some reason I was thinking there was something platform
3205
* specific about this subroutine but... now looking at it once it is
3206
* coded it doesn't appear to be... maybe it will cease to be a gui_*
3207
* function in the short future.
3208
*/
3209
void gui_remove_menurefs(char *menu)
3210
{
3211
MenuStruct *cleanmenu = findmenu(menu);
3212
3213
if(cleanmenu)
3214
{
3215
MenuList *tmplist = cleanmenu->menuorigin;
3216
3217
while(tmplist)
3218
{
3219
if(tmplist->refnum > 0)
3220
remove_menuref(&cleanmenu->root, tmplist->refnum);
3221
if(tmplist->menutype == GUISUBMENU || tmplist->menutype == GUIBRKSUBMENU)
3222
gui_remove_menurefs(tmplist->submenu);
3223
tmplist = tmplist->next;
3224
}
3225
}
3226
}
3227
3228
void gui_mdi(Window *window, char *text, int value)
3229
{
3230
if(current_mdi_mode == value)
3231
return;
3232
3233
gtkcommand.command = GTKMDI;
3234
gtkcommand.data[0] = (gpointer)value;
3235
gtk_sendcommand(TRUE);
3236
}
3237
3238
void gui_update_nicklist(char *channel)
3239
{
3240
gtkcommand.command = GTKNICKLIST;
3241
gtkcommand.data[0] = (gpointer) channel;
3242
gtk_sendcommand(TRUE);
3243
}
3244
3245
void gui_nicklist_width(int width, Screen *this_screen)
3246
{
3247
gtkcommand.command = GTKNICKLISTWIDTH;
3248
gtkcommand.data[0] = (gpointer)this_screen;
3249
gtkcommand.data[1] = (gpointer)width;
3250
gtk_sendcommand(TRUE);
3251
}
3252
3253
void gui_startup(int argc, char *argv[])
3254
{
3255
pipe(guiipc);
3256
new_open(guiipc[0]);
3257
3258
gtk_set_locale();
3259
{
3260
char *p;
3261
if ((p = path_search("gtkrc", "/usr/share/themes/Default/gtk:/usr/local/share/themes/Default/gtk")))
3262
gtk_rc_add_default_file(p);
3263
}
3264
g_thread_init(NULL);
3265
gtk_init(&argc, &argv);
3266
#ifdef USE_IMLIB
3267
gdk_imlib_init();
3268
#endif
3269
}
3270
3271
GtkWidget *about_window = NULL;
3272
3273
void gtk_about_box(char *about_text)
3274
{
3275
GtkWidget *vbox, *label, *hbox;
3276
GtkWidget *button;
3277
GdkBitmap *bitmap;
3278
GdkPixmap *icon_pixmap = NULL;
3279
#ifndef USE_IMLIB
3280
GtkStyle *style;
3281
#endif
3282
GtkWidget *pixmap;
3283
gchar *text;
3284
3285
if (!about_window)
3286
{
3287
about_window = gtk_window_new(GTK_WINDOW_DIALOG);
3288
text = g_strdup_printf("About %s", _VERSION_);
3289
gtk_window_set_title(GTK_WINDOW(about_window), text);
3290
g_free(text);
3291
gtk_window_set_policy(GTK_WINDOW(about_window), FALSE, FALSE, FALSE);
3292
gtk_window_position(GTK_WINDOW(about_window), GTK_WIN_POS_MOUSE);
3293
gtk_container_set_border_width(GTK_CONTAINER(about_window), 10);
3294
gtk_signal_connect(GTK_OBJECT(about_window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &about_window);
3295
gtk_widget_realize(about_window);
3296
3297
#ifndef USE_IMLIB
3298
style = gtk_widget_get_style(about_window);
3299
if (!icon_pixmap)
3300
icon_pixmap = gdk_pixmap_create_from_xpm_d(about_window->window, &bitmap, &style->bg[GTK_STATE_NORMAL], BitchX);
3301
#else
3302
gdk_imlib_data_to_pixmap(BitchX, &icon_pixmap, &bitmap);
3303
#endif
3304
3305
gdk_window_set_icon(about_window->window, NULL, icon_pixmap, bitmap);
3306
pixmap = gtk_pixmap_new(icon_pixmap, bitmap);
3307
3308
vbox = gtk_vbox_new(FALSE, 5);
3309
gtk_container_add(GTK_CONTAINER(about_window), vbox);
3310
gtk_container_add(GTK_CONTAINER(vbox), pixmap);
3311
gtk_widget_show(vbox);
3312
gtk_widget_show(pixmap);
3313
3314
label = gtk_label_new(VERSION);
3315
gtk_container_add(GTK_CONTAINER(vbox), label);
3316
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
3317
gtk_widget_show(label);
3318
3319
label = gtk_label_new("Copyright (c) 1996-2002 Colten Edwards\nAll rights reserved.\n");
3320
gtk_container_add(GTK_CONTAINER(vbox), label);
3321
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
3322
gtk_widget_show(label);
3323
3324
label = gtk_label_new(about_text);
3325
gtk_container_add(GTK_CONTAINER(vbox), label);
3326
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
3327
gtk_widget_show(label);
3328
3329
hbox = gtk_hbox_new(TRUE, 2);
3330
gtk_container_add(GTK_CONTAINER(vbox), hbox);
3331
gtk_widget_show(hbox);
3332
3333
button = gtk_button_new_with_label("OK");
3334
gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
3335
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
3336
GTK_WIDGET_SET_FLAGS(GTK_WIDGET(button), GTK_CAN_DEFAULT);
3337
gtk_widget_grab_default(button);
3338
gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(about_window));
3339
gtk_widget_show(button);
3340
3341
gtk_widget_show(about_window);
3342
}
3343
}
3344
3345
void gui_about_box(char *about_text)
3346
{
3347
gtkcommand.command = GTKABOUTBOX;
3348
gtkcommand.data[0] = (gpointer) about_text;
3349
gtk_sendcommand(TRUE);
3350
}
3351
3352
void gui_activity(int color)
3353
{
3354
if(get_int_var(MDI_VAR))
3355
{
3356
gtkcommand.command = GTKACTIVITY;
3357
gtkcommand.data[0] = (gpointer) color;
3358
gtkcommand.data[1] = (gpointer) target_window;
3359
gtk_sendcommand(TRUE);
3360
}
3361
}
3362
3363
void gui_setfileinfo(char *filename, char *nick, int server)
3364
{
3365
}
3366
3367
void gui_setfd(fd_set *rd)
3368
{
3369
/* Set the GUI IPC pipe readable for select() */
3370
FD_SET(guiipc[0], rd);
3371
FD_SET(gtkipcin[0], rd);
3372
}
3373
3374