* moved zeroradiant (1.6) into trunk
[xonotic/netradiant.git] / contrib / prtview / ConfigDialog.cpp
1 /*
2 PrtView plugin for GtkRadiant
3 Copyright (C) 2001 Geoffrey Dewan, Loki software and qeradiant.com
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 // ConfigDialog.cpp : implementation file
21 //
22
23 #include "stdafx.h"
24 #include <stdio.h>
25
26 #ifdef _DEBUG
27 #define new DEBUG_NEW
28 #undef THIS_FILE
29 //static char THIS_FILE[] = __FILE__;
30 #endif
31
32 /////////////////////////////////////////////////////////////////////////////
33 // CConfigDialog dialog
34
35 static void dialog_button_callback (GtkWidget *widget, gpointer data)
36 {
37   GtkWidget *parent;
38   int *loop, *ret;
39
40   parent = gtk_widget_get_toplevel (widget);
41   loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
42   ret = (int*)g_object_get_data (G_OBJECT (parent), "ret");
43
44   *loop = 0;
45   *ret = (int)data;
46 }
47
48 static gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
49 {
50   int *loop;
51
52   gtk_widget_hide (widget);
53   loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");
54   *loop = 0;
55
56   return TRUE;
57 }
58
59 // =============================================================================
60 // Color selection dialog
61
62 static int DoColor (COLORREF *c)
63 {
64   GtkWidget* dlg;
65   double clr[3];
66   int loop = 1, ret = IDCANCEL;
67
68   clr[0] = ((double)GetRValue (*c)) / 255.0;
69   clr[1] = ((double)GetGValue (*c)) / 255.0;
70   clr[2] = ((double)GetBValue (*c)) / 255.0;
71
72   dlg = gtk_color_selection_dialog_new ("Choose Color");
73   gtk_color_selection_set_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
74   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
75                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
76   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
77                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
78   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button), "clicked",
79                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
80   gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button), "clicked",
81                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
82   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
83   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
84
85   gtk_widget_show(dlg);
86   gtk_grab_add(dlg);
87
88   while (loop)
89     gtk_main_iteration ();
90
91   gtk_color_selection_get_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
92
93   gtk_grab_remove (dlg);
94   gtk_widget_destroy (dlg);
95
96   if (ret == IDOK)
97   {
98     *c = RGB (clr[0]*255, clr[1]*255, clr[2]*255);
99   }
100
101   return ret;
102 }
103
104 static void Set2DText (GtkWidget* label)
105 {
106   char s[40];
107
108   sprintf(s, "Line Width = %6.3f", portals.width_2d * 0.5f);
109
110   gtk_label_set_text (GTK_LABEL (label), s);
111 }
112
113 static void Set3DText (GtkWidget* label)
114 {
115   char s[40];
116
117   sprintf(s, "Line Width = %6.3f", portals.width_3d * 0.5f);
118
119   gtk_label_set_text (GTK_LABEL (label), s);
120 }
121
122 static void Set3DTransText (GtkWidget* label)
123 {
124   char s[40];
125
126   sprintf(s, "Polygon transparency = %d%%", (int)portals.trans_3d);
127
128   gtk_label_set_text (GTK_LABEL (label), s);
129 }
130
131 static void SetClipText (GtkWidget* label)
132 {
133   char s[40];
134
135   sprintf(s, "Cubic clip range = %d", (int)portals.clip_range * 64);
136
137   gtk_label_set_text (GTK_LABEL (label), s);
138 }
139
140 static void OnScroll2d (GtkAdjustment *adj, gpointer data)
141 {
142   portals.width_2d = adj->value;
143   Set2DText (GTK_WIDGET (data));
144
145   if(interfaces_started)
146     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
147 }
148
149 static void OnScroll3d (GtkAdjustment *adj, gpointer data)
150 {
151   portals.width_3d = adj->value;
152   Set3DText (GTK_WIDGET (data));
153
154   if(interfaces_started)
155     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
156 }
157
158 static void OnScrollTrans (GtkAdjustment *adj, gpointer data)
159 {
160   portals.trans_3d = adj->value;
161   Set3DTransText (GTK_WIDGET (data));
162
163   if(interfaces_started)
164     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
165 }
166
167 static void OnScrollClip (GtkAdjustment *adj, gpointer data)
168 {
169   portals.clip_range = adj->value;
170   SetClipText (GTK_WIDGET (data));
171
172   if(interfaces_started)
173     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
174 }
175
176 static void OnAntiAlias2d (GtkWidget *widget, gpointer data)
177 {
178   portals.aa_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
179
180   if(interfaces_started)
181     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
182 }
183
184 static void OnConfig2d (GtkWidget *widget, gpointer data)
185 {
186   portals.show_2d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
187
188   if(interfaces_started)
189     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
190 }
191
192 static void OnColor2d (GtkWidget *widget, gpointer data)
193 {
194   if (DoColor (&portals.color_2d) == IDOK)
195   {
196     portals.FixColors();
197
198     if(interfaces_started)
199       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_2D);
200   }
201 }
202
203 static void OnConfig3d (GtkWidget *widget, gpointer data)
204 {
205   portals.show_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
206
207   if(interfaces_started)
208     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
209 }
210
211
212 static void OnAntiAlias3d (GtkWidget *widget, gpointer data)
213 {
214   portals.aa_3d = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
215
216   if(interfaces_started)
217     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
218 }
219
220 static void OnColor3d (GtkWidget *widget, gpointer data)
221 {
222   if (DoColor (&portals.color_3d) == IDOK)
223   {
224     portals.FixColors();
225
226     if(interfaces_started)
227       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
228   }
229 }
230
231 static void OnColorFog (GtkWidget *widget, gpointer data)
232 {
233   if (DoColor (&portals.color_fog) == IDOK)
234   {
235     portals.FixColors();
236
237     if(interfaces_started)
238       g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
239   }
240 }
241
242 static void OnFog (GtkWidget *widget, gpointer data)
243 {
244   portals.fog = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
245
246   if(interfaces_started)
247     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
248 }
249
250 static void OnSelchangeZbuffer (GtkWidget *widget, gpointer data)
251 {
252   portals.zbuffer = GPOINTER_TO_INT (data);
253
254   if(interfaces_started)
255     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
256 }
257
258 static void OnPoly (GtkWidget *widget, gpointer data)
259 {
260   portals.polygons = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
261
262   if(interfaces_started)
263     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
264 }
265
266 static void OnLines (GtkWidget *widget, gpointer data)
267 {
268   portals.lines = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
269
270   if(interfaces_started)
271     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
272 }
273
274 static void OnClip (GtkWidget *widget, gpointer data)
275 {
276   portals.clip = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? true : false;
277
278   if(interfaces_started)
279     g_FuncTable.m_pfnSysUpdateWindows(UPDATE_3D);
280 }
281
282 void DoConfigDialog ()
283 {
284   GtkWidget *dlg, *hbox, *vbox, *vbox2, *button, *table, *frame;
285   GtkWidget *lw3slider, *lw3label, *lw2slider, *lw2label, *zlist, *menu, *item;
286   GtkWidget *aa2check, *aa3check, *depthcheck, *linescheck, *polyscheck;
287   GtkWidget *transslider, *translabel, *clipslider, *cliplabel;
288   GtkWidget *show2check, *show3check, *portalcheck;
289   int loop = 1, ret = IDCANCEL;
290   GtkObject *adj;
291
292   dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
293   gtk_window_set_title (GTK_WINDOW (dlg), "Portal Viewer Configuration");
294   gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
295                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
296   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
297                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
298   g_object_set_data (G_OBJECT (dlg), "loop", &loop);
299   g_object_set_data (G_OBJECT (dlg), "ret", &ret);
300
301   vbox = gtk_vbox_new (FALSE, 5);
302   gtk_widget_show (vbox);
303   gtk_container_add (GTK_CONTAINER (dlg), vbox);
304   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
305
306   frame = gtk_frame_new ("3D View");
307   gtk_widget_show (frame);
308   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
309
310   vbox2 = gtk_vbox_new (FALSE, 5);
311   gtk_widget_show (vbox2);
312   gtk_container_add (GTK_CONTAINER (frame), vbox2);
313   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
314
315   hbox = gtk_hbox_new (FALSE, 5);
316   gtk_widget_show (hbox);
317   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);
318
319   adj = gtk_adjustment_new (portals.width_3d, 2, 40, 1, 1, 1);
320   lw3slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
321   gtk_widget_show (lw3slider);
322   gtk_box_pack_start (GTK_BOX (hbox), lw3slider, TRUE, TRUE, 0);
323   gtk_scale_set_draw_value (GTK_SCALE (lw3slider), FALSE);
324
325   lw3label = gtk_label_new ("");
326   gtk_widget_show (lw3label);
327   gtk_box_pack_start (GTK_BOX (hbox), lw3label, FALSE, TRUE, 0);
328   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll3d), lw3label);
329
330   table = gtk_table_new (2, 4, FALSE);
331   gtk_widget_show (table);
332   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
333   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
334   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
335
336   button = gtk_button_new_with_label ("Color");
337   gtk_widget_show (button);
338   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 0, 1,
339                     (GtkAttachOptions) (GTK_FILL),
340                     (GtkAttachOptions) (0), 0, 0);
341   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor3d), NULL);
342
343   button = gtk_button_new_with_label ("Depth Color");
344   gtk_widget_show (button);
345   gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
346                     (GtkAttachOptions) (GTK_FILL),
347                     (GtkAttachOptions) (0), 0, 0);
348   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColorFog), NULL);
349
350   aa3check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
351   gtk_widget_show (aa3check);
352   gtk_table_attach (GTK_TABLE (table), aa3check, 1, 4, 0, 1,
353                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
354                     (GtkAttachOptions) (0), 0, 0);
355   gtk_signal_connect (GTK_OBJECT (aa3check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias3d), NULL);
356
357   depthcheck = gtk_check_button_new_with_label ("Depth Cue");
358   gtk_widget_show (depthcheck);
359   gtk_table_attach (GTK_TABLE (table), depthcheck, 1, 2, 1, 2,
360                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
361                     (GtkAttachOptions) (0), 0, 0);
362   gtk_signal_connect (GTK_OBJECT (depthcheck), "toggled", GTK_SIGNAL_FUNC (OnFog), NULL);
363
364   linescheck = gtk_check_button_new_with_label ("Lines");
365   gtk_widget_show (linescheck);
366   gtk_table_attach (GTK_TABLE (table), linescheck, 2, 3, 1, 2,
367                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
368                     (GtkAttachOptions) (0), 0, 0);
369   gtk_signal_connect (GTK_OBJECT (linescheck), "toggled", GTK_SIGNAL_FUNC (OnLines), NULL);
370
371   polyscheck = gtk_check_button_new_with_label ("Polygons");
372   gtk_widget_show (polyscheck);
373   gtk_table_attach (GTK_TABLE (table), polyscheck, 3, 4, 1, 2,
374                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
375                     (GtkAttachOptions) (0), 0, 0);
376   gtk_signal_connect (GTK_OBJECT (polyscheck), "toggled", GTK_SIGNAL_FUNC (OnPoly), NULL);
377
378   zlist = gtk_option_menu_new ();
379   gtk_widget_show (zlist);
380   gtk_box_pack_start (GTK_BOX (vbox2), zlist, TRUE, FALSE, 0);
381
382   menu = gtk_menu_new ();
383   gtk_widget_show (menu);
384   gtk_option_menu_set_menu (GTK_OPTION_MENU (zlist), menu);
385
386   item = gtk_menu_item_new_with_label ("Z-Buffer Test and Write (recommended for solid or no polygons)");
387   gtk_widget_show (item);
388   gtk_signal_connect (GTK_OBJECT (item), "activate",
389                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (0));
390   gtk_menu_append (GTK_MENU (menu), item);
391
392   item = gtk_menu_item_new_with_label ("Z-Buffer Test Only (recommended for transparent polygons)");
393   gtk_widget_show (item);
394   gtk_signal_connect (GTK_OBJECT (item), "activate",
395                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (1));
396   gtk_menu_append (GTK_MENU (menu), item);
397
398   item = gtk_menu_item_new_with_label ("Z-Buffer Off");
399   gtk_widget_show (item);
400   gtk_signal_connect (GTK_OBJECT (item), "activate",
401                       GTK_SIGNAL_FUNC (OnSelchangeZbuffer), GINT_TO_POINTER (2));
402   gtk_menu_append (GTK_MENU (menu), item);
403
404   table = gtk_table_new (2, 2, FALSE);
405   gtk_widget_show (table);
406   gtk_box_pack_start (GTK_BOX (vbox2), table, TRUE, TRUE, 0);
407   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
408   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
409
410   adj = gtk_adjustment_new (portals.trans_3d, 0, 100, 1, 1, 1);
411   transslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
412   gtk_widget_show (transslider);
413   gtk_table_attach (GTK_TABLE (table), transslider, 0, 1, 0, 1,
414                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
415                     (GtkAttachOptions) (0), 0, 0);
416   gtk_scale_set_draw_value (GTK_SCALE (transslider), FALSE);
417
418   translabel = gtk_label_new ("");
419   gtk_widget_show (translabel);
420   gtk_table_attach (GTK_TABLE (table), translabel, 1, 2, 0, 1,
421                     (GtkAttachOptions) (GTK_FILL),
422                     (GtkAttachOptions) (0), 0, 0);
423   gtk_misc_set_alignment (GTK_MISC (translabel), 0.0, 0.0);
424   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollTrans), translabel);
425
426   adj = gtk_adjustment_new (portals.clip_range, 1, 128, 1, 1, 1);
427   clipslider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
428   gtk_widget_show (clipslider);
429   gtk_table_attach (GTK_TABLE (table), clipslider, 0, 1, 1, 2,
430                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
431                     (GtkAttachOptions) (0), 0, 0);
432   gtk_scale_set_draw_value (GTK_SCALE (clipslider), FALSE);
433
434   cliplabel = gtk_label_new ("");
435   gtk_widget_show (cliplabel);
436   gtk_table_attach (GTK_TABLE (table), cliplabel, 1, 2, 1, 2,
437                     (GtkAttachOptions) (GTK_FILL),
438                     (GtkAttachOptions) (0), 0, 0);
439   gtk_misc_set_alignment (GTK_MISC (cliplabel), 0.0, 0.0);
440   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScrollClip), cliplabel);
441
442   hbox = gtk_hbox_new (TRUE, 5);
443   gtk_widget_show (hbox);
444   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
445
446   show3check = gtk_check_button_new_with_label ("Show");
447   gtk_widget_show (show3check);
448   gtk_box_pack_start (GTK_BOX (hbox), show3check, TRUE, TRUE, 0);
449   gtk_signal_connect (GTK_OBJECT (show3check), "toggled", GTK_SIGNAL_FUNC (OnConfig3d), NULL);
450
451   portalcheck = gtk_check_button_new_with_label ("Portal cubic clipper");
452   gtk_widget_show (portalcheck);
453   gtk_box_pack_start (GTK_BOX (hbox), portalcheck, TRUE, TRUE, 0);
454   gtk_signal_connect (GTK_OBJECT (portalcheck), "toggled", GTK_SIGNAL_FUNC (OnClip), NULL);
455
456   frame = gtk_frame_new ("2D View");
457   gtk_widget_show (frame);
458   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
459
460   vbox2 = gtk_vbox_new (FALSE, 5);
461   gtk_widget_show (vbox2);
462   gtk_container_add (GTK_CONTAINER (frame), vbox2);
463   gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
464
465   hbox = gtk_hbox_new (FALSE, 5);
466   gtk_widget_show (hbox);
467   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
468
469   adj = gtk_adjustment_new (portals.width_2d, 2, 40, 1, 1, 1);
470   lw2slider = gtk_hscale_new (GTK_ADJUSTMENT (adj));
471   gtk_widget_show (lw2slider);
472   gtk_box_pack_start (GTK_BOX (hbox), lw2slider, TRUE, TRUE, 0);
473   gtk_scale_set_draw_value (GTK_SCALE (lw2slider), FALSE);
474
475   lw2label = gtk_label_new ("");
476   gtk_widget_show (lw2label);
477   gtk_box_pack_start (GTK_BOX (hbox), lw2label, FALSE, TRUE, 0);
478   gtk_signal_connect (adj, "value_changed", GTK_SIGNAL_FUNC (OnScroll2d), lw2label);
479
480   hbox = gtk_hbox_new (FALSE, 5);
481   gtk_widget_show (hbox);
482   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
483
484   button = gtk_button_new_with_label ("Color");
485   gtk_widget_show (button);
486   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
487   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnColor2d), NULL);
488   gtk_widget_set_usize (button, 60, -2);
489
490   aa2check = gtk_check_button_new_with_label ("Anti-Alias (May not work on some video cards)");
491   gtk_widget_show (aa2check);
492   gtk_box_pack_start (GTK_BOX (hbox), aa2check, TRUE, TRUE, 0);
493   gtk_signal_connect (GTK_OBJECT (aa2check), "toggled", GTK_SIGNAL_FUNC (OnAntiAlias2d), NULL);
494
495   hbox = gtk_hbox_new (FALSE, 5);
496   gtk_widget_show (hbox);
497   gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, FALSE, 0);
498
499   show2check = gtk_check_button_new_with_label ("Show");
500   gtk_widget_show (show2check);
501   gtk_box_pack_start (GTK_BOX (hbox), show2check, FALSE, FALSE, 0);
502   gtk_signal_connect (GTK_OBJECT (show2check), "toggled", GTK_SIGNAL_FUNC (OnConfig2d), NULL);
503
504   hbox = gtk_hbox_new (FALSE, 5);
505   gtk_widget_show (hbox);
506   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
507
508   button = gtk_button_new_with_label ("OK");
509   gtk_widget_show (button);
510   gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
511   gtk_signal_connect (GTK_OBJECT (button), "clicked",
512                       GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
513   gtk_widget_set_usize (button, 60, -2);
514
515   // initialize dialog
516   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show2check), portals.show_2d);
517   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa2check), portals.aa_2d);
518   Set2DText (lw2label);
519
520   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show3check), portals.show_3d);
521   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (depthcheck), portals.fog);
522   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (polyscheck), portals.polygons);
523   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linescheck), portals.lines);
524   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (aa3check), portals.aa_3d);
525   gtk_option_menu_set_history (GTK_OPTION_MENU (zlist), portals.zbuffer);
526   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (portalcheck), portals.clip);
527
528   Set3DText (lw3label);
529   Set3DTransText (translabel);
530   SetClipText (cliplabel);
531
532   gtk_grab_add (dlg);
533   gtk_widget_show (dlg);
534
535   while (loop)
536     gtk_main_iteration ();
537
538   gtk_grab_remove (dlg);
539   gtk_widget_destroy (dlg);
540 }