* moved zeroradiant (1.6) into trunk
[xonotic/netradiant.git] / contrib / gtkgensurf / gendlgs.cpp
1 /*
2 GenSurf plugin for GtkRadiant
3 Copyright (C) 2001 David Hyde, 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 #include <gtk/gtk.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <math.h>
25 #include "gensurf.h"
26
27 #define GENERAL_TAB   0
28 #define EXTENTS_TAB   1
29 #define BITMAP_TAB    2
30 #define FIXPOINTS_TAB 3
31 #define TEXTURE_TAB   4
32 //#define BUFF_SIZE     32768
33
34 #define ENABLE_WIDGET(name,enable) \
35   gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), (name))), (enable))
36 #define CHECK_WIDGET(name,check) \
37   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), name)), check)
38
39 static GtkWidget *game_radios[NUMGAMES];
40 static GtkWidget *wave_radios[5];
41 static GtkWidget *plane_radios[6];
42 static guint current_tab;
43 static int OldPreview;
44 static int WasDetail;
45 static GtkTooltips *tooltips;
46 static int FirstPassComplete = 0;
47
48 void About (GtkWidget *parent)
49 {
50 /*
51   char *icon_xpm[] = {
52 "32 32 4 1",
53 "       c None",
54 ".      c #000000",
55 "+      c #FFFFFF",
56 "@      c #838183",
57 "................................",
58 "................................",
59 "................................",
60 "................................",
61 "................................",
62 "................................",
63 "................................",
64 "...............++...............",
65 ".............++++++.............",
66 "............++@+++@+............",
67 "..........+++..++..+++..........",
68 "........++.+.++..++.+.@+........",
69 ".......+..+..+.++.+..+..++......",
70 ".....++..++.+..++..+.++..++.....",
71 "...++..++...+.+..+.++..++..++...",
72 "..++.+.++....++..++....++.+..+..",
73 ".+.+..+..++....++....++..++.+.+.",
74 "..+++....+.++++++++++.+....+++..",
75 "....++.@@+++++.++.++++@++.++....",
76 "......+++++++......++@+++++.....",
77 ".......+++.+.++..++.+..++.......",
78 ".........++..+.++.+..++.........",
79 "...........++..++..++...........",
80 ".............++..+.+............",
81 "..............+..+@.............",
82 "...............@@...............",
83 "................................",
84 "................................",
85 "................................",
86 "................................",
87 "................................",
88 "................................"
89 };
90 */
91   // leo: I'm too lazy to create a nice about box
92         // ^Fishman - I am lazy too :P.
93   g_FuncTable.m_pfnMessageBox (parent, "GtkGenSurf 1.05\n\n"
94                                "Original version\n"
95                                                                                                                          "David Hyde (rascal@vicksburg.com)\n\n"
96                                                                                                                          "Porting\n"
97                                "Leonardo Zide (leo@lokigames.com)\n\n"
98                                                                                                                          "Enhancements\n"
99                                                                                                                          "Pablo Zurita (pablo@qeradiant.com)\n"
100                                                                                                                          "Hydra (hydra@hydras-world.com)",
101                                "About GtkGenSurf", MB_OK, NULL);
102 }
103
104 // =============================================================================
105 // main dialog
106
107 static void SetupControls ()
108 {
109   switch (current_tab)
110   {
111   case GENERAL_TAB:
112     break;
113
114   case EXTENTS_TAB:
115     if (Game != QUAKE3)
116     {
117       gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
118       ENABLE_WIDGET ("use_patches", FALSE);
119     }
120     else
121     {
122       gtk_widget_show (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
123       ENABLE_WIDGET ("use_patches", TRUE);
124     }
125
126     if (Game == QUAKE3 && UsePatches != 0)
127     {
128       ENABLE_WIDGET ("decimate", FALSE);
129     }
130                 gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "snap_text")), "Snap to grid:"); // ^Fishman - Snap to grid.
131     break;
132
133   case BITMAP_TAB:
134     if (WaveType != WAVE_BITMAP)
135     {
136       ENABLE_WIDGET ("bmp_file", FALSE);
137       ENABLE_WIDGET ("bmp_file_browse", FALSE);
138       ENABLE_WIDGET ("bmp_black", FALSE);
139       ENABLE_WIDGET ("bmp_white", FALSE);
140       ENABLE_WIDGET ("bmp_text1", FALSE);
141       ENABLE_WIDGET ("bmp_text2", FALSE);
142       ENABLE_WIDGET ("bmp_text3", FALSE);
143       ENABLE_WIDGET ("bmp_reload", FALSE);
144       gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
145                           "These options are disabled unless \"From Bitmap\"\n"
146                           "is selected as the Waveform on the General tab.");
147     }
148     else
149     {
150       ENABLE_WIDGET ("bmp_file", TRUE);
151       ENABLE_WIDGET ("bmp_file_browse", TRUE);
152       ENABLE_WIDGET ("bmp_black", TRUE);
153       ENABLE_WIDGET ("bmp_white", TRUE);
154       ENABLE_WIDGET ("bmp_text1", TRUE);
155       ENABLE_WIDGET ("bmp_text2", TRUE);
156       ENABLE_WIDGET ("bmp_text3", TRUE);
157       ENABLE_WIDGET ("bmp_reload", strlen(gbmp.name) != 0);
158       gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
159                           "GenSurf works only with 8-bit bitmaps. Color indices are\n"
160                           "mapped to values for each vertex. Generally, gray scale\n"
161                           "images are stored with black as color 0, white as color 255.");
162     }
163     break;
164
165   case FIXPOINTS_TAB:
166     ENABLE_WIDGET ("fix_value", (NumVerticesSelected != 0));
167     ENABLE_WIDGET ("fix_value_text", (NumVerticesSelected != 0));
168     ENABLE_WIDGET ("fix_free", (NumVerticesSelected != 0));
169     ENABLE_WIDGET ("fix_range", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
170     ENABLE_WIDGET ("fix_range_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
171     ENABLE_WIDGET ("fix_rate", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
172     ENABLE_WIDGET ("fix_rate_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
173     break;
174
175   case TEXTURE_TAB:
176     ENABLE_WIDGET ("texture2", (UsePatches == 0));
177     ENABLE_WIDGET ("texture3", (UsePatches == 0));
178     ENABLE_WIDGET ("tex_slant", (UsePatches == 0));
179     ENABLE_WIDGET ("detail", (UsePatches == 0));
180     if (Game != QUAKE3 )
181                 {
182                         ENABLE_WIDGET ("terrain_ent", FALSE); // ^Fishman - Adds terrain key to func_group.
183       ENABLE_WIDGET ("hint", (UsePatches == 0));
184                 }
185     break;
186   }
187
188   switch (WaveType)
189   {
190   case WAVE_HCYLINDER:
191   case WAVE_VCYLINDER:
192     ENABLE_WIDGET ("amplitude", TRUE);
193     ENABLE_WIDGET ("wavelength", TRUE);
194     ENABLE_WIDGET ("z00", TRUE);
195     ENABLE_WIDGET ("z01", TRUE);
196     ENABLE_WIDGET ("z10", TRUE);
197     ENABLE_WIDGET ("z11", TRUE);
198     ENABLE_WIDGET ("linearborder", TRUE);
199     ENABLE_WIDGET ("go", TRUE);
200     break;
201   case WAVE_BITMAP:
202     ENABLE_WIDGET ("amplitude", FALSE);
203     ENABLE_WIDGET ("wavelength", FALSE);
204     ENABLE_WIDGET ("z00", FALSE);
205     ENABLE_WIDGET ("z01", FALSE);
206     ENABLE_WIDGET ("z10", FALSE);
207     ENABLE_WIDGET ("z11", FALSE);
208     ENABLE_WIDGET ("linearborder", FALSE);
209     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
210     break;
211   case WAVE_ROUGH_ONLY:
212     ENABLE_WIDGET ("amplitude", FALSE);
213     ENABLE_WIDGET ("wavelength", FALSE);
214     ENABLE_WIDGET ("z00", TRUE);
215     ENABLE_WIDGET ("z01", TRUE);
216     ENABLE_WIDGET ("z10", TRUE);
217     ENABLE_WIDGET ("z11", TRUE);
218     ENABLE_WIDGET ("linearborder", TRUE);
219     ENABLE_WIDGET ("go", TRUE);
220     break;
221   default:
222     ENABLE_WIDGET ("amplitude", TRUE);
223     ENABLE_WIDGET ("wavelength", TRUE);
224     ENABLE_WIDGET ("z00", TRUE);
225     ENABLE_WIDGET ("z01", TRUE);
226     ENABLE_WIDGET ("z10", TRUE);
227     ENABLE_WIDGET ("z11", TRUE);
228     ENABLE_WIDGET ("linearborder", TRUE);
229     ENABLE_WIDGET ("go", TRUE);
230   }
231
232   switch (Plane)
233   {
234   case PLANE_XZ0:
235   case PLANE_XZ1:
236     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
237     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
238     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
239     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
240     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
241     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
242     break;
243   case PLANE_YZ0:
244   case PLANE_YZ1:
245     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "Y:");
246     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "Y:");
247     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
248     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
249     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "Y:");
250     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
251     break;
252   default:
253     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
254     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
255     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Y:");
256     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Y:");
257     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
258     gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Y:");
259     break;
260   }
261 }
262
263 // SetDlgValues fills in text boxes and initializes other input controls
264 static void SetDlgValues (int tab)
265 {
266   char Text[256];
267   char RForm[16] = "%.5g";
268   int i;
269
270   switch (tab)
271   {
272   case GENERAL_TAB:
273         // mattn: Deactivated because one wasn't able to switch the gametype or orientation
274 #if 0
275     // Hell if I know why, but in the release build the 2nd pass thru the
276     // set_sensitive loop for game_radios crashes. No need to do this more
277     // than once anyhow.
278     if (!FirstPassComplete)
279     {
280       for (i = 0; i < NUMGAMES; i++)
281         gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE));
282       for (i = 0; i < 6; i++)
283         gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE));
284     }
285 #endif
286     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE);
287     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE);
288     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE);
289     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")),
290                                RandomSeed);
291     sprintf (Text, RForm, WaveLength);
292     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text);
293     sprintf (Text, RForm, Amplitude);
294     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text);
295     sprintf (Text, RForm, Roughness);
296     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text);
297                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
298                                                      (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing);
299     break;
300
301   case EXTENTS_TAB:
302     sprintf (Text,RForm,Hll);
303     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text);
304     sprintf (Text,RForm,Vll);
305     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text);
306     sprintf (Text,RForm,Hur);
307     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text);
308     sprintf (Text,RForm,Vur);
309     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text);
310     sprintf (Text,RForm,Z00);
311     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text);
312     sprintf (Text,RForm,Z01);
313     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text);
314     sprintf (Text,RForm,Z10);
315     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text);
316     sprintf (Text,RForm,Z11);
317     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text);
318     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
319     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
320                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid.
321
322     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
323                                                      (G_OBJECT (g_pWnd), "linearborder")), FixBorders);
324     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
325                                                      (G_OBJECT (g_pWnd), "use_patches")), UsePatches);
326     gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")),
327                               Decimate);
328
329     if (Game == QUAKE3 && UsePatches)
330     {
331       gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE);
332
333       if (NH % 2)
334       {
335         NH++;
336         if (NH > MAX_ROWS) NH -= 2;
337         SetDlgValues (current_tab);
338       }
339
340       if (NV % 2)
341       {
342         NV++;
343         if (NV > MAX_ROWS) NV -= 2;
344         SetDlgValues (current_tab);
345       }
346       if (NH % 2 ) NH++;
347       if (NH < 2 ) NH = 2;
348       if (NH > MAX_ROWS) NH = MAX_ROWS;
349       if (NV % 2 ) NV++;
350       if (NV < 2 ) NV = 2;
351       if (NV > MAX_ROWS) NV = MAX_ROWS;
352
353       gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
354       GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
355       adj->lower = 2;
356       gtk_adjustment_changed (adj);
357       spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
358       adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
359       adj->lower = 2;
360       gtk_adjustment_changed (adj);
361     }
362     else
363     {
364       gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE);
365
366       gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
367       GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
368       adj->lower = 1;
369       gtk_adjustment_changed (adj);
370       spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
371       adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
372       adj->lower = 1;
373       gtk_adjustment_changed (adj);
374     }
375
376     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
377     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
378
379     break;
380
381   case BITMAP_TAB:
382     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name);
383     sprintf(Text,"%g",gbmp.black_value);
384     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text);
385     sprintf(Text,"%g",gbmp.white_value);
386     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text);
387     break;
388
389   case FIXPOINTS_TAB:
390     break;
391
392   case TEXTURE_TAB:
393     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]);
394     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]);
395     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]);
396     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")),
397                                SlantAngle);
398     sprintf(Text,RForm,TexOffset[0]);
399     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text);
400     sprintf(Text,RForm,TexOffset[1]);
401     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text);
402     sprintf(Text,RForm,TexScale[0]);
403     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text);
404     sprintf(Text,RForm,TexScale[1]);
405     gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text);
406     CHECK_WIDGET ("detail", UseDetail);
407
408     if (Game==QUAKE3)
409     {
410       ENABLE_WIDGET ("hint", FALSE);
411       AddHints=0;
412     }
413     else
414       ENABLE_WIDGET ("hint", TRUE);
415     CHECK_WIDGET ("hint", AddHints);
416
417     /*
418     if (Game==SIN)
419     {
420       // ArghRad doesn't currently support SiN
421       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
422       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
423       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
424       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
425       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
426       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
427       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
428     }
429     */
430
431     if(Game==QUAKE3)
432     {
433       /*
434       // ArghRad sun is inapplicable (so far)
435       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
436       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
437       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
438       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
439       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
440       // No ladders in Q3
441       EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);
442       ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);
443       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file");
444       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:");
445       */
446     }
447
448 /*trix  if(Game==HERETIC2)
449                 {
450                         // ArghRad doesn't currently support Heretic2
451                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
452                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
453                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
454                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
455                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
456
457                         SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file");
458                         SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:");
459                 } */
460     /*
461                 if(Game==HALFLIFE)
462                 {
463                         // A bunch of controls aren't applicable to HL
464                         EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0);
465                         EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0);
466                         EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0);
467                         EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         0);
468                         EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);
469                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
470                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
471                         ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE);
472                         ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE);
473                         ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE);
474                         ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         SW_HIDE);
475                         ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);
476                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
477                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
478                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
479
480                         SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file");
481                         SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:");
482                         SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes");
483                 }
484
485                 if(Game==GENESIS3D)
486                 {
487                         // No Q2-type compilers support Genesis3D (including ArghRad)
488                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
489                         EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
490                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
491                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
492                         ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
493
494                         SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
495                         SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
496                 }
497     */
498     break;
499   }
500   SetupControls ();
501 }
502
503 static void ReadDlgValues (int tab)
504 {
505   //  char Text[256];
506   //  int i;
507
508   switch (tab)
509   {
510   case GENERAL_TAB:
511     gpointer spin;
512     Roughness  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness"))));
513     WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength"))));
514     Amplitude  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude"))));
515     spin = g_object_get_data (G_OBJECT (g_pWnd), "random");
516     RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
517     break;
518
519   case EXTENTS_TAB:
520                 SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp"))));
521     NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh"))));
522     NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv"))));
523
524     if (Game == QUAKE3 && UsePatches != 0)
525     {
526       if (NH % 2 ) NH++;
527       if (NH < 2 ) NH = 2;
528       if (NH > MAX_ROWS) NH = MAX_ROWS;
529       if (NV % 2 ) NV++;
530       if (NV < 2 ) NV = 2;
531       if (NV > MAX_ROWS) NV = MAX_ROWS;
532     }
533     break;
534
535 #if 0
536   case BITMAP_TAB:
537
538     if (WaveType == WAVE_BITMAP)
539     {
540       GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name));
541       CheckValidDIB(hwnd);
542       GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text));
543       gbmp.black_value = atof(Text);
544       GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text));
545       gbmp.white_value = atof(Text);
546       UpdatePreview(TRUE);
547     }
548     break;
549
550   case FIXPOINTS_TAB:
551     GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text));
552     temp.fixed_value = atoi(Text);
553     GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text));
554     temp.range = atoi(Text);
555     GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text));
556     temp.rate = atof(Text);
557     for(k=0; k<NumVerticesSelected; k++)
558     {
559       xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;
560       xyz[Vertex[k].i][Vertex[k].j].range       = temp.range;
561       xyz[Vertex[k].i][Vertex[k].j].rate        = temp.rate;
562     }
563     if(!OldPreview)
564     {
565       Preview = 0;
566       CheckDlgButton(ghwnd,DLG_PREVIEW,0);
567       SendMessage(ghwnd,WM_COMMAND,DLG_PREVIEW,0);
568     }
569     VertexMode = 0;
570     UpdatePreview(TRUE);
571     break;
572
573   case TEXTURE_TAB:
574     if(UsePak[Game])
575     {
576       i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );
577       if(i == CB_ERR)
578         Texture[Game][0][0] = '\0';
579       else
580         SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,
581           (LPARAM)(LPCSTR)Texture[Game][0]);
582
583       i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );
584       if(i == CB_ERR)
585         Texture[Game][1][0] = '\0';
586       else
587         SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,
588           (LPARAM)(LPCSTR)Texture[Game][1]);
589
590       i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );
591       if(i == CB_ERR)
592         Texture[Game][2][0] = '\0';
593       else
594         SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,
595           (LPARAM)(LPCSTR)Texture[Game][2]);
596     }
597     else
598     {
599       GetDlgItemText(hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof(Texture[Game][0]));
600       GetDlgItemText(hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof(Texture[Game][1]));
601       GetDlgItemText(hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof(Texture[Game][2]));
602     }
603     GetDlgItemText(hwndDisplay,DLG_TEX_SLANT,Text,sizeof(Text));
604     SlantAngle = atoi(Text);
605     SlantAngle = max(0,min(SlantAngle,90));
606     GetDlgItemText(hwndDisplay,DLG_TEXOFFSETX,Text,sizeof(Text));
607     TexOffset[0] = atof(Text);
608     GetDlgItemText(hwndDisplay,DLG_TEXOFFSETY,Text,sizeof(Text));
609     TexOffset[1] = atof(Text);
610     GetDlgItemText(hwndDisplay,DLG_TEXSCALEX,Text,sizeof(Text));
611     TexScale[0] = atof(Text);
612     if(TexScale[0] == 0.) TexScale[0] = 1.0;
613     GetDlgItemText(hwndDisplay,DLG_TEXSCALEY,Text,sizeof(Text));
614     TexScale[1] = atof(Text);
615     if(TexScale[1] == 0.) TexScale[1] = 1.0;
616     GetDlgItemText(hwndDisplay,DLG_ARGHRAD2,Text,sizeof(Text));
617     ArghRad2 = atoi(Text);
618     break;
619 #endif
620   }
621 }
622
623 // =============================================================================
624 // main dialog callbacks
625
626 static void switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)
627 {
628   if (current_tab != page_num)
629   {
630     if (page_num == FIXPOINTS_TAB)
631     {
632       OldPreview = Preview;
633       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
634                                                                             "main_preview")), TRUE);
635       VertexMode = 1;
636       UpdatePreview (true);
637       NumVerticesSelected = 0;
638     }
639
640     if (current_tab == FIXPOINTS_TAB)
641     {
642       if (!OldPreview)
643         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
644                                                                               "main_preview")), FALSE);
645       VertexMode = 0;
646       UpdatePreview (true);
647       NumVerticesSelected = 0;
648     }
649
650     if (page_num == TEXTURE_TAB)
651     {
652       WasDetail = UseDetail;
653       if (AddHints)
654       {
655         UseDetail = 1;
656         ENABLE_WIDGET ("detail", FALSE);
657       }
658     }
659
660     ReadDlgValues (current_tab);
661     current_tab = page_num;
662     SetDlgValues (current_tab);
663   }
664 }
665
666 static gint main_close (GtkWidget *widget, gpointer data)
667 {
668   gtk_widget_hide (g_pWnd);
669   gtk_widget_hide (g_pWndPreview);
670
671   return TRUE;
672 }
673
674 static void main_save (GtkWidget *widget, gpointer data)
675 {
676   ReadDlgValues (current_tab);
677   SaveSetup (g_pWnd);
678 }
679
680 static void main_open (GtkWidget *widget, gpointer data)
681 {
682   OpenSetup (g_pWnd, 0);
683   for (int i = 0; i < 5; i++)
684     SetDlgValues (i);
685   ShowPreview ();
686 }
687
688 static void main_defaults (GtkWidget *widget, gpointer data)
689 {
690   OpenSetup (g_pWnd, 1);
691   for (int i = 0; i < 5; i++)
692     SetDlgValues (i);
693   ShowPreview ();
694 }
695
696 static void main_preview (GtkWidget *widget, gpointer data)
697 {
698   Preview = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
699   ShowPreview ();
700 }
701
702 // ^Fishman - Antializing for the preview window.
703 static void main_antialiasing (GtkWidget *widget, gpointer data)
704 {
705         Antialiasing = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
706         UpdatePreview (true);
707 }
708
709 static void main_about (GtkWidget *widget, gpointer data)
710 {
711   About (g_pWnd);
712 }
713
714 static void main_go (GtkWidget *widget, gpointer data)
715 {
716   GtkWidget *notebook = GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "notebook"));
717   char Text[256];
718
719   ReadDlgValues (current_tab);
720   if (NH < 1 || NH > MAX_ROWS)
721   {
722     sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
723     g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL);
724     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
725     return;
726   }
727
728   if (NV < 1 || NV > MAX_ROWS)
729   {
730     sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
731     g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION, NULL);
732     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
733     return;
734   }
735
736   if (Hll >= Hur)
737   {
738     g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than "
739                                  "the corresponding \"upper-right\" values in "
740                                  "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
741     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
742     return;
743   }
744
745   if (Vll >= Vur)
746   {
747     g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than "
748                                  "the corresponding \"upper-right\" values in "
749                                  "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
750     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
751     return;
752   }
753
754   if (!strlen (Texture[Game][0]))
755   {
756     g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", MB_ICONEXCLAMATION, NULL);
757     gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
758     return;
759   }
760
761 /*  if (Decimate>0 && GimpHints!=0)
762   {
763     MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "
764                "This combination usually produces bizarre visual errors in the game, "
765                "so GenSurf has turned off the hint brush option.",
766                "GenSurf",MB_ICONEXCLAMATION);
767     GimpHints = 0;
768   } */
769
770   gtk_widget_hide (g_pWnd);
771   if (g_pWndPreview)
772     gtk_widget_hide (g_pWndPreview);
773
774   GenerateMap();
775   WriteIniFile(gszIni);
776 }
777
778 // =============================================================================
779 // general tab callbacks
780
781 static void general_game (GtkToggleButton *widget, gpointer data)
782 {
783   if (gtk_toggle_button_get_active (widget))
784   {
785     Game = GPOINTER_TO_INT (data);
786     UpdatePreview (TRUE);
787   }
788 }
789
790 static void general_plane (GtkToggleButton *widget, gpointer data)
791 {
792   if (gtk_toggle_button_get_active (widget))
793   {
794     Plane = GPOINTER_TO_INT (data);
795     SetupControls ();
796     UpdatePreview (TRUE);
797   }
798 }
799
800 static void general_wave (GtkToggleButton *widget, gpointer data)
801 {
802   if (gtk_toggle_button_get_active (widget))
803   {
804     WaveType = GPOINTER_TO_INT (data);
805     SetupControls ();
806     UpdatePreview (TRUE);
807   }
808 }
809
810 static void general_random (GtkAdjustment *adj, gpointer data)
811 {
812   int nPos = (int)adj->value;
813
814   if (RandomSeed != nPos)
815   {
816     RandomSeed = nPos;
817     UpdatePreview (true);
818   }
819 }
820
821 // =============================================================================
822 // extents tab callbacks
823
824 static void extents_linearborder (GtkToggleButton *check, gpointer data)
825 {
826   FixBorders = gtk_toggle_button_get_active (check);
827   UpdatePreview (true);
828 }
829
830 static void extents_use_patches (GtkToggleButton *check, gpointer data)
831 {
832   if (Game != QUAKE3)
833     return;
834
835   UsePatches = gtk_toggle_button_get_active (check);
836   SetDlgValues (current_tab);
837   SetupControls ();
838   UpdatePreview (true);
839 }
840
841 static void extents_nhnv_spin (GtkAdjustment *adj, int *data)
842 {
843   int nPos = (int)adj->value;
844
845   if (*data != nPos)
846   {
847     if (Game==QUAKE3 && UsePatches && (nPos % 2))
848     {
849       if (*data < nPos)
850         *data += 2;
851       else
852         *data -= 2;
853       gtk_adjustment_set_value (adj, *data);
854     }
855     else
856       *data = nPos;
857     UpdatePreview (true);
858   }
859 }
860
861 static void extents_decimate (GtkAdjustment *adj, gpointer data)
862 {
863   int nPos = (int)adj->value;
864
865   Decimate = nPos;
866   UpdatePreview (true);
867 }
868
869 // Hydra : snap to grid begin
870 /*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)
871 {
872   int nPos = (int)adj->value;
873
874   SnapToGrid = nPos;
875   UpdatePreview (true);
876 }*/
877
878 // ^Fishman - Modified version of Hydra's snap to grid code.
879 static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data)
880 {
881         int nPos = (int)adj->value;
882         SnapToGrid = nPos;
883         UpdatePreview (true);
884 }
885
886 // =============================================================================
887 // bitmap tab callbacks
888
889 static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
890 {
891   char filename[NAME_MAX];
892
893   strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget)));
894   if(strcmp (filename,gbmp.name))
895   {
896     if (gbmp.colors)
897     {
898       free(gbmp.colors);
899       gbmp.colors=NULL;
900     }
901     strcpy (gbmp.name,filename);
902     if (strlen(gbmp.name) )
903       OpenBitmap ();
904     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
905   }
906   return FALSE;
907 }
908
909 static void bitmap_browse (GtkWidget *widget, gpointer data)
910 {
911   const char *filename;
912   char *ptr;
913
914   filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath, "gtkgensurf");
915
916   if (filename != NULL)
917   {
918     strcpy (gbmp.name, filename);
919
920     ptr = strrchr (filename, G_DIR_SEPARATOR);
921     if (ptr != NULL)
922     {
923       *(ptr+1) = '\0';
924       strcpy (gbmp.defpath, filename);
925     }
926
927     OpenBitmap ();
928     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
929   }
930 }
931
932 static void bitmap_reload (GtkWidget *widget, gpointer data)
933 {
934   strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file"))));
935   if(strlen (gbmp.name) )
936   {
937     OpenBitmap ();
938     ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
939   }
940   else
941     ENABLE_WIDGET ("go", FALSE );
942 }
943
944 // =============================================================================
945 // fix points tab callbacks
946
947 static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data)
948 {
949   int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
950   char Text[32];
951
952   if (i < -65536 || i > 65536)
953   {
954     gdk_beep ();
955     g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.",
956                                  "GenSurf", MB_OK | MB_ICONEXCLAMATION, NULL);
957     sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
958     gtk_entry_set_text (GTK_ENTRY(widget), Text);
959     gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget);
960   }
961   else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value)
962   {
963     for(k=0; k<NumVerticesSelected; k++)
964       xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
965
966     gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
967                                (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
968     UpdatePreview (true);
969   }
970   return FALSE;
971 }
972
973 static void fix_value_changed (GtkAdjustment *adj, gpointer data)
974 {
975   int k, i = (int)adj->value;
976
977   if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i)
978   {
979     for(k=0; k<NumVerticesSelected; k++)
980       xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
981     UpdatePreview(true);
982   }
983 }
984
985 static gint fix_range_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
986 {
987   int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
988
989   if (i != xyz[Vertex[0].i][Vertex[0].j].range)
990   {
991     for (k=0; k<NumVerticesSelected; k++)
992       xyz[Vertex[k].i][Vertex[k].j].range = i;
993     UpdatePreview (true);
994   }
995   return FALSE;
996 }
997
998 static gint fix_rate_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
999 {
1000   double r = atof (gtk_entry_get_text (GTK_ENTRY(widget)));
1001   int k;
1002
1003   if (r != xyz[Vertex[0].i][Vertex[0].j].rate)
1004   {
1005     for(k=0; k<NumVerticesSelected; k++)
1006       xyz[Vertex[k].i][Vertex[k].j].rate = r;
1007     UpdatePreview (true);
1008   }
1009   return FALSE;
1010 }
1011
1012 static void fix_free (GtkWidget *widget, gpointer data)
1013 {
1014   int k;
1015
1016   for (k=0; k<NumVerticesSelected; k++)
1017     xyz[Vertex[k].i][Vertex[k].j].fixed = 0;
1018   NumVerticesSelected = 0;
1019   SetupControls ();
1020   UpdatePreview (true);
1021 }
1022
1023 static void fix_freeall (GtkWidget *widget, gpointer data)
1024 {
1025   int i, j;
1026
1027   for (i=0; i<=NH; i++)
1028   {
1029     for(j=0; j<=NV; j++)
1030       xyz[i][j].fixed = 0;
1031   }
1032   fix_free (NULL, data); // keep these together
1033 }
1034
1035 void vertex_selected ()
1036 {
1037   char Text[32];
1038   int k;
1039
1040   SetupControls ();
1041
1042   switch(Plane)
1043   {
1044   case PLANE_XZ0:
1045   case PLANE_XZ1:
1046     for(k=0; k<NumVerticesSelected; k++)
1047       xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];
1048     break;
1049   case PLANE_YZ0:
1050   case PLANE_YZ1:
1051     for(k=0; k<NumVerticesSelected; k++)
1052       xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];
1053     break;
1054   default:
1055     for(k=0; k<NumVerticesSelected; k++)
1056       xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];
1057     break;
1058   }
1059
1060   gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1061                              (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
1062
1063   sprintf(Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range);
1064   gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), Text);
1065   sprintf(Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate);
1066   gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), Text);
1067
1068   for (k=0; k<NumVerticesSelected; k++)
1069     xyz[Vertex[k].i][Vertex[k].j].fixed = 1;
1070
1071   UpdatePreview (true);
1072 }
1073
1074 // =============================================================================
1075 // texture tab callbacks
1076
1077 static void texture_detail (GtkToggleButton *check, gpointer data)
1078 {
1079   UseDetail = gtk_toggle_button_get_active (check);
1080   WasDetail = UseDetail;
1081 }
1082
1083 static void texture_hint (GtkToggleButton *check, gpointer data)
1084 {
1085   AddHints = gtk_toggle_button_get_active (check);
1086   if (AddHints == 1)
1087   {
1088     UseDetail = 1;
1089     ENABLE_WIDGET ("detail", FALSE);
1090   }
1091   else
1092   {
1093     UseDetail = WasDetail;
1094     ENABLE_WIDGET ("detail", FALSE);
1095   }
1096   CHECK_WIDGET ("detail", UseDetail);
1097 }
1098
1099 // ^Fishman - Add terrain key to func_group.
1100 static void texture_terrainent (GtkToggleButton *check, gpointer data)
1101 {
1102         AddTerrainKey = gtk_toggle_button_get_active (check);
1103 }
1104
1105 static void texture_set(int index, const char* name)
1106 {
1107   strcpy(Texture[Game][index], name);
1108 }
1109
1110 static gint texture_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1111 {
1112   texture_set(GPOINTER_TO_INT(data), gtk_entry_get_text(GTK_ENTRY(widget)));
1113   return FALSE;
1114 }
1115
1116 // =============================================================================
1117 // misc stuff
1118
1119 static void UpdateVariable (GtkEntry *entry, GdkEventFocus *event, double *data)
1120 {
1121   double x = atof (gtk_entry_get_text (entry));
1122
1123   if (x != *data)
1124   {
1125     *data = x;
1126     UpdatePreview (true);
1127   }
1128 }
1129
1130 static gint doublevariable_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
1131 {
1132   UpdateVariable(GTK_ENTRY(widget), event, reinterpret_cast<double*>(data));
1133   return FALSE;
1134 }
1135
1136 // =============================================================================
1137 // create tooltips
1138
1139 void create_tooltips ()
1140 {
1141   tooltips = gtk_tooltips_new ();
1142
1143   // Main
1144   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1145         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")),
1146         "Accept all input and generate a surface in Q3Radiant",
1147         "");
1148   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1149         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")),
1150         "Open a previously saved GenSurf settings file.",
1151         "");
1152   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1153         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")),
1154         "Save all settings to a file.",
1155         "");
1156   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1157         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")),
1158         "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "
1159         "initializes all input parameters to reasonable values. You can create your own "
1160         "default surface by setting all parameters to your liking, then saving a settings "
1161         "file as DEFAULTS.SRF with the Save As button.",
1162         "");
1163
1164   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1165         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")),
1166         "View a wire-frame representation of the surface",
1167         "");
1168
1169         gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1170         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")),
1171         "The lines in the preview window are antialiased for better quality",
1172         ""); 
1173
1174   // General tab
1175   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1176         GTK_WIDGET (wave_radios[0]),
1177         "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "
1178         "x sin(Y)",
1179         "");
1180   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1181         GTK_WIDGET (wave_radios[1]),
1182         "Builds a surface with ridges parallel to the vertical axis.",
1183         "");
1184   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1185         GTK_WIDGET (wave_radios[2]),
1186         "Builds a surface with ridges parallel to the horizontal axis.",
1187         "");
1188   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1189         GTK_WIDGET (wave_radios[3]),
1190         "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "
1191         "tab to select the image. GenSurf only supports 256-color (8 bit) "
1192         "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "
1193         "more intuitive.",
1194         "" ); 
1195   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1196         GTK_WIDGET (wave_radios[4]),
1197         "Builds a random surface using the Plasma Cloud technique. Variance is controlled "
1198         "by the Roughness input. To build a surface with completely random values not "
1199         "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",
1200         "");
1201   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1202         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")),
1203         "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "
1204         "size or 2 times the grid size will result in 0 amplitudes. For best results, the "
1205         "wavelength value should be at least 4 times the grid size (extents divided by the "
1206         "number of divisions",
1207         "");
1208   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1209         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")),
1210         "Enter the height of hills/ridges.",
1211         "");
1212   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1213         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")),
1214         "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "
1215         "is used as a variance in the fractal calculations.",
1216         "");
1217   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1218         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")),
1219         "Seed value for the pseudo-random number generator.",
1220         "");
1221   // Extents tab
1222   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1223         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")),
1224         "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1225         "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1226         "the extents (maximum-minimum values) in a given direction should be evenly "
1227         "divisible by the number of divisions in that direction.",
1228         "");
1229   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1230         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")),
1231         "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "
1232         "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
1233         "the extents (maximum-minimum values) in a given direction should be evenly "
1234         "divisible by the number of divisions in that direction.",
1235         "");
1236   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1237         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")),
1238         "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1239         "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1240         "the extents (maximum-minimum values) in a given direction should be evenly "
1241         "divisible by the number of divisions in that direction.",
1242         "");
1243   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1244         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")),
1245         "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "
1246         "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
1247         "the extents (maximum-minimum values) in a given direction should be evenly "
1248         "divisible by the number of divisions in that direction.",
1249         "");
1250   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1251         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")),
1252         "Number of divisions in the horizontal direction. For best results, the extents "
1253         "in a given direction should be evenly divisible by the number of divisions in "
1254         "that direction.",
1255         "");
1256   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1257         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")),
1258         "Number of divisions in the vertical direction. For best results, the extents "
1259         "in a given direction should be evenly divisible by the number of divisions in "
1260         "that direction.",
1261         "");
1262   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1263         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")),
1264         "Produce one or more curved patches in the shape of your selected surface rather "
1265         "than producing solid brushes. Depending on the size of your surface (and the "
1266         "user's graphic detail settings, which you cannot control), curved surfaces will "
1267         "be represented in the game by a very large number of polygons. Read the warnings "
1268         "concerning curved surfaces on the GenSurf web page before using this feature.",
1269         "");
1270   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1271         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")),
1272         "Use the slider to control the number of vertices discarded by GenSurf. For many "
1273         "surfaces, you can produce roughly the same shape surface with a high decimation "
1274         "value. This will generally result in a map with lower polygon counts (and better "
1275         "in-game performance). However, this feature should NOT be used for large terrain "
1276         "surfaces in Q3",
1277         "");
1278   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1279         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")),
1280         "Enter the height of the surface at the lower left corner. This value will likely "
1281         "be modified unless \"Linear Borders\" is checked.",
1282         "");
1283   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1284         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")),
1285         "Enter the height of the surface at the upper left corner. This value will likely "
1286         "be modified unless \"Linear Borders\" is checked.",
1287         "");
1288   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1289         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")),
1290         "Enter the height of the surface at the lower right corner. This value will likely "
1291         "be modified unless \"Linear Borders\" is checked.",
1292         "");
1293   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1294         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")),
1295         "Enter the height of the surface at the upper right corner. This value will likely "
1296         "be modified unless \"Linear Borders\" is checked.",
1297         "");
1298   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1299         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")),
1300         "Restrict the edges of the surface to a straight line. This will help match up "
1301         "brush edges if you drop this surface into another map.",
1302         "");
1303   // Bitmap tab
1304   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1305         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")),
1306         "Type the name of an 8-bit bitmap image file, or click Browse to select an image "
1307         "from a list of those available on your system.",
1308         "");
1309   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1310         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")),
1311         "Select a bitmap image file from a list of those available on your system.",
1312         "");
1313   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1314         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_reload")),
1315         "Reload the selected bitmap file after making changes in an external image editor.",
1316         "");
1317   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1318         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")),
1319         "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "
1320         "images, color 0 is normally black.",
1321         "");
1322   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1323         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")),
1324         "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "
1325         "images, color 255 is normally white.",
1326         "");
1327   // Fixpoints tab
1328   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1329         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
1330         "Enter a value for the selected vertex. This value will not be adjusted when applying "
1331         "a waveform or roughness to the surface. Unlock this vertex (so that it will be "
1332         "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "
1333         "the \"Range affected\" of this vertex.",
1334         "");
1335   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1336         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")),
1337         "Enter the range away from the selected vertex that other vertices will be affected. "
1338         "Use 0 if you don't want other vertices to be influenced by the currently selected "
1339         "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "
1340         "a completely different method for determining values.",
1341         "");
1342   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1343         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")),
1344         "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "
1345         "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "
1346         "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "
1347         "set to -30 and 30, respectively. Note that this entry will have no effect unless "
1348         "you also specify a \"range affected\".",
1349         "");
1350   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1351         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")),
1352         "Click this to free (unlock the value of) the currently selected vertex.",
1353         "");
1354   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1355         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")),
1356         "Click this to free (unlock the values of) all vertices.",
1357         "");
1358   // Texture tab
1359   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1360         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")),
1361         "Enter the name of the texture or shader used for the surface faces.",
1362         "");
1363   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1364         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")),
1365         "Enter the name of the texture or shader used for faces other than the surface. Under "
1366         "normal circumstances this should be \"common/caulk\"",
1367         "");
1368   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1369         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")),
1370         "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "
1371         "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "
1372         "all surface faces will use the texture specified by \"Surface\".",
1373         "");
1374
1375   gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
1376         GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")),
1377         "Check this box to use the detail content property on the generated brushes. Compile "
1378         "times will be considerably shorter if the detail property is used, though the surface "
1379         "will not block visibility at all. If you use the detail property, you should make sure "
1380         "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "
1381         "much higher than necessary.",
1382         "");
1383 }
1384
1385 // =============================================================================
1386 // create main dialog
1387
1388 GtkWidget* create_main_dialog ()
1389 {
1390   GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;
1391   GtkWidget *check, *spin, *radio, *label, *entry, *scale;
1392   GtkObject *adj;
1393   GSList *group;
1394   int i;
1395   char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };
1396   char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",
1397                         "From bitmap", "Fractal" };
1398   char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",
1399                            "Wall facing 180","Wall facing 270" }; 
1400
1401   g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1402   gtk_window_set_title (GTK_WINDOW (dlg), gszCaption);
1403   g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL);
1404   //  g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);
1405   gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd));
1406
1407   hbox = gtk_hbox_new (FALSE, 5);
1408   gtk_widget_show (hbox);
1409   gtk_container_add (GTK_CONTAINER (dlg), hbox);
1410   gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
1411
1412   notebook = gtk_notebook_new ();
1413   gtk_widget_show (notebook);
1414   gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
1415   g_signal_connect (G_OBJECT (notebook), "switch_page",
1416                       G_CALLBACK (switch_page), NULL);
1417   gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
1418   g_object_set_data (G_OBJECT (dlg), "notebook", notebook);
1419
1420   table = gtk_table_new (2, 2, FALSE);
1421   gtk_widget_show (table);
1422   gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1423   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1424   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1425
1426   label = gtk_label_new ("General");
1427   gtk_widget_show (label);
1428   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);
1429
1430   frame = gtk_frame_new ("Game");
1431   gtk_widget_show (frame);
1432   gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,
1433                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1434                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1435
1436   vbox = gtk_vbox_new (TRUE, 5);
1437   gtk_widget_show (vbox);
1438   gtk_container_add (GTK_CONTAINER (frame), vbox);
1439   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1440
1441   for (i = 0, group = NULL; i < NUMGAMES; i++)
1442   {
1443     radio = gtk_radio_button_new_with_label (group, games[i]);
1444     gtk_widget_show (radio);
1445     gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1446     group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1447     game_radios[i] = radio;
1448     g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i));
1449   }
1450
1451   frame = gtk_frame_new ("Waveform");
1452   gtk_widget_show (frame);
1453   gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,
1454                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1455                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1456
1457   vbox = gtk_vbox_new (TRUE, 5);
1458   gtk_widget_show (vbox);
1459   gtk_container_add (GTK_CONTAINER (frame), vbox);
1460   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1461
1462   for (i = 0, group = NULL; i < 5; i++)
1463   {
1464     radio = gtk_radio_button_new_with_label (group, waveforms[i]);
1465     gtk_widget_show (radio);
1466     gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1467     group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1468     wave_radios[i] = radio;
1469     g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i));
1470   }
1471
1472   frame = gtk_frame_new ("Orientation");
1473   gtk_widget_show (frame);
1474   gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2,
1475                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1476                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1477
1478   vbox = gtk_vbox_new (TRUE, 5);
1479   gtk_widget_show (vbox);
1480   gtk_container_add (GTK_CONTAINER (frame), vbox);
1481   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1482
1483   for (i = 0, group = NULL; i < 6; i++)
1484   {
1485     radio = gtk_radio_button_new_with_label (group, orientations[i]);
1486     gtk_widget_show (radio);
1487     gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
1488     group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
1489     plane_radios[i] = radio;
1490     g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i));
1491   }
1492
1493   table2 = gtk_table_new (4, 2, FALSE);
1494   gtk_widget_show (table2);
1495   gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
1496   gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
1497   gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2,
1498                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1499                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1500
1501   label = gtk_label_new ("Wavelength:");
1502   gtk_widget_show (label);
1503   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
1504                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1505                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1506   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1507   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1508
1509   label = gtk_label_new ("Max. amplitude:");
1510   gtk_widget_show (label);
1511   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2,
1512                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1513                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1514   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1515   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1516
1517   label = gtk_label_new ("Roughness:");
1518   gtk_widget_show (label);
1519   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3,
1520                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1521                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1522   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1523   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1524
1525   label = gtk_label_new ("Random seed:");
1526   gtk_widget_show (label);
1527   gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4,
1528                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1529                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1530   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1531   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1532
1533   entry = gtk_entry_new ();
1534   gtk_widget_show (entry);
1535   gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1,
1536                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1537                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1538   gtk_widget_set_usize (entry, 50, -2);
1539   g_object_set_data (G_OBJECT (dlg), "wavelength", entry);
1540   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength);
1541
1542   entry = gtk_entry_new ();
1543   gtk_widget_show (entry);
1544   gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2,
1545                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1546                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1547   gtk_widget_set_usize (entry, 50, -2);
1548   g_object_set_data (G_OBJECT (dlg), "amplitude", entry);
1549   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude);
1550
1551   entry = gtk_entry_new ();
1552   gtk_widget_show (entry);
1553   gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3,
1554                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1555                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1556   gtk_widget_set_usize (entry, 50, -2);
1557   g_object_set_data (G_OBJECT (dlg), "roughness", entry);
1558   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness);
1559
1560   adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 10);
1561   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL);
1562   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1563   gtk_widget_show (spin);
1564   gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4,
1565                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1566                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1567   gtk_widget_set_usize (spin, 60, -2);
1568   g_object_set_data (G_OBJECT (dlg), "random", spin);
1569
1570   vbox = gtk_vbox_new (FALSE, 5);
1571   gtk_widget_show (vbox);
1572   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1573
1574   label = gtk_label_new ("Extents");
1575   gtk_widget_show (label);
1576   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1577
1578   hbox2 = gtk_hbox_new (FALSE, 5);
1579   gtk_widget_show (hbox2);
1580   gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
1581
1582   frame = gtk_frame_new ("Extents");
1583   gtk_widget_show (frame);
1584   gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1585
1586   table = gtk_table_new (3, 4, FALSE);
1587   gtk_widget_show (table);
1588   gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1589   gtk_container_add (GTK_CONTAINER (frame), table);
1590   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1591   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1592
1593   label = gtk_label_new ("X:");
1594   gtk_widget_show (label);
1595   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1596                     (GtkAttachOptions) (GTK_FILL),
1597                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1598   g_object_set_data (G_OBJECT (dlg), "hmin_text", label);
1599
1600   label = gtk_label_new ("X:");
1601   gtk_widget_show (label);
1602   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1603                     (GtkAttachOptions) (GTK_FILL),
1604                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1605   g_object_set_data (G_OBJECT (dlg), "hmax_text", label);
1606
1607   label = gtk_label_new ("Y:");
1608   gtk_widget_show (label);
1609   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1610                     (GtkAttachOptions) (GTK_FILL),
1611                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1612   g_object_set_data (G_OBJECT (dlg), "vmin_text", label);
1613
1614   label = gtk_label_new ("Y:");
1615   gtk_widget_show (label);
1616   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3,
1617                     (GtkAttachOptions) (GTK_FILL),
1618                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1619   g_object_set_data (G_OBJECT (dlg), "vmax_text", label);
1620
1621   label = gtk_label_new ("Lower-left");
1622   gtk_widget_show (label);
1623   gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
1624                     (GtkAttachOptions) (GTK_FILL),
1625                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1626
1627   label = gtk_label_new ("Upper-right");
1628   gtk_widget_show (label);
1629   gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,
1630                     (GtkAttachOptions) (GTK_FILL),
1631                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1632
1633   entry = gtk_entry_new ();
1634   gtk_widget_show (entry);
1635   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1636                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1637                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1638   gtk_widget_set_usize (entry, 50, -2);
1639   g_object_set_data (G_OBJECT (dlg), "hmin", entry);
1640   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll);
1641
1642   entry = gtk_entry_new ();
1643   gtk_widget_show (entry);
1644   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1645                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1646                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1647   gtk_widget_set_usize (entry, 50, -2);
1648   g_object_set_data (G_OBJECT (dlg), "hmax", entry);
1649   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur);
1650
1651   entry = gtk_entry_new ();
1652   gtk_widget_show (entry);
1653   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
1654                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1655                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1656   gtk_widget_set_usize (entry, 50, -2);
1657   g_object_set_data (G_OBJECT (dlg), "vmin", entry);
1658   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll);
1659
1660   entry = gtk_entry_new ();
1661   gtk_widget_show (entry);
1662   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3,
1663                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1664                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1665   gtk_widget_set_usize (entry, 50, -2);
1666   g_object_set_data (G_OBJECT (dlg), "vmax", entry);
1667   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur);
1668
1669   frame = gtk_frame_new ("Divisions");
1670   gtk_widget_show (frame);
1671   gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
1672
1673   table = gtk_table_new (2, 2, FALSE);
1674   gtk_widget_show (table);
1675   gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1676   gtk_container_add (GTK_CONTAINER (frame), table);
1677   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1678   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1679
1680   label = gtk_label_new ("X:");
1681   gtk_widget_show (label);
1682   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1683                     (GtkAttachOptions) (GTK_FILL),
1684                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1685   g_object_set_data (G_OBJECT (dlg), "nh_text", label);
1686
1687   label = gtk_label_new ("Y:");
1688   gtk_widget_show (label);
1689   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1690                     (GtkAttachOptions) (GTK_FILL),
1691                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1692   g_object_set_data (G_OBJECT (dlg), "nv_text", label);
1693
1694   adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
1695   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH);
1696   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1697   gtk_widget_show (spin);
1698   gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1699                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1700                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1701   gtk_widget_set_usize (spin, 60, -2);
1702   g_object_set_data (G_OBJECT (dlg), "nh", spin);
1703
1704   adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
1705   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV);
1706   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1707   gtk_widget_show (spin);
1708   gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,
1709                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1710                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1711   gtk_widget_set_usize (spin, 60, -2);
1712   g_object_set_data (G_OBJECT (dlg), "nv", spin);
1713
1714   check = gtk_check_button_new_with_label ("Use Bezier patches");
1715   gtk_widget_show (check);
1716   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
1717   g_object_set_data (G_OBJECT (dlg), "use_patches", check);
1718   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL);
1719
1720         // ^Fishman - Snap to grid, replaced scroll bar with a texbox.
1721         label = gtk_label_new ("Snap to grid:");
1722   gtk_widget_show (label);
1723         gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1724   gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label);
1725
1726         adj = gtk_adjustment_new (8, 0, 256, 1, 10, 10);
1727   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP);
1728   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1729   gtk_widget_show (spin);
1730         gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);
1731   gtk_widget_set_usize (spin, 60, -2);
1732   g_object_set_data (G_OBJECT (dlg), "sp", spin);
1733         // ^Fishman - End of Snap to grid code.
1734
1735   hbox2 = gtk_hbox_new (FALSE, 5);
1736   gtk_widget_show (hbox2);
1737   gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10);
1738
1739   label = gtk_label_new ("Decimate:");
1740   gtk_widget_show (label);
1741   gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
1742
1743   adj = gtk_adjustment_new (0, 0, 110, 1, 10, 10);
1744   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL);
1745   g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj);
1746   scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));
1747   gtk_widget_show (scale);
1748   gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0);
1749   gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT);
1750   gtk_scale_set_digits (GTK_SCALE (scale), 0);
1751   g_object_set_data (G_OBJECT (dlg), "decimate", scale);
1752
1753   frame = gtk_frame_new ("Corner values");
1754   gtk_widget_show (frame);
1755   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1756
1757   table = gtk_table_new (3, 4, FALSE);
1758   gtk_widget_show (table);
1759   gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1760   gtk_container_add (GTK_CONTAINER (frame), table);
1761   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1762   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1763
1764   label = gtk_label_new ("Upper-left:");
1765   gtk_widget_show (label);
1766   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1767                     (GtkAttachOptions) (GTK_FILL),
1768                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1769
1770   label = gtk_label_new ("Lower-left:");
1771   gtk_widget_show (label);
1772   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1773                     (GtkAttachOptions) (GTK_FILL),
1774                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1775
1776   label = gtk_label_new ("Upper-right:");
1777   gtk_widget_show (label);
1778   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
1779                     (GtkAttachOptions) (GTK_FILL),
1780                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1781
1782   label = gtk_label_new ("Lower-right:");
1783   gtk_widget_show (label);
1784   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
1785                     (GtkAttachOptions) (GTK_FILL),
1786                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1787
1788   entry = gtk_entry_new ();
1789   gtk_widget_show (entry);
1790   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1791                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1792                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1793   gtk_widget_set_usize (entry, 50, -2);
1794   g_object_set_data (G_OBJECT (dlg), "z01", entry);
1795   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01);
1796
1797   entry = gtk_entry_new ();
1798   gtk_widget_show (entry);
1799   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
1800                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1801                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1802   gtk_widget_set_usize (entry, 50, -2);
1803   g_object_set_data (G_OBJECT (dlg), "z00", entry);
1804   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00);
1805
1806   entry = gtk_entry_new ();
1807   gtk_widget_show (entry);
1808   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,
1809                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1810                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1811   gtk_widget_set_usize (entry, 50, -2);
1812   g_object_set_data (G_OBJECT (dlg), "z11", entry);
1813   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11);
1814
1815   entry = gtk_entry_new ();
1816   gtk_widget_show (entry);
1817   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
1818                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1819                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1820   gtk_widget_set_usize (entry, 50, -2);
1821   g_object_set_data (G_OBJECT (dlg), "z10", entry);
1822   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10);
1823
1824   check = gtk_check_button_new_with_label ("Linear borders");
1825   gtk_widget_show (check);
1826   gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3,
1827                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1828                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1829   g_object_set_data (G_OBJECT (dlg), "linearborder", check);
1830   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL);
1831
1832   vbox = gtk_vbox_new (FALSE, 10);
1833   gtk_widget_show (vbox);
1834   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1835
1836   label = gtk_label_new ("Bitmap");
1837   gtk_widget_show (label);
1838   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1839
1840   label = gtk_label_new ("");
1841   gtk_widget_show (label);
1842   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1843   g_object_set_data (G_OBJECT (dlg), "bmp_note", label);
1844
1845   table = gtk_table_new (2, 2, FALSE);
1846   gtk_widget_show (table);
1847   gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1848   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1849   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1850   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1851
1852   label = gtk_label_new ("Filename:");
1853   gtk_widget_show (label);
1854   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1855                     (GtkAttachOptions) (GTK_FILL),
1856                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1857   g_object_set_data (G_OBJECT (dlg), "bmp_text1", label);
1858
1859   entry = gtk_entry_new ();
1860   gtk_widget_show (entry);
1861   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
1862                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1863                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1864   g_object_set_data (G_OBJECT (dlg), "bmp_file", entry);
1865   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL);
1866
1867   hbox2 = gtk_hbox_new (TRUE, 5);
1868   gtk_widget_show (hbox2);
1869   gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1870                     (GtkAttachOptions) (0),
1871                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1872
1873   button = gtk_button_new_with_label ("Browse...");
1874   gtk_widget_show (button);
1875   gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1876   gtk_widget_set_usize (button, 60, -2);
1877   g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button);
1878   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL);
1879
1880   button = gtk_button_new_with_label ("Reload");
1881   gtk_widget_show (button);
1882   gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
1883   gtk_widget_set_usize (button, 60, -2);
1884   g_object_set_data (G_OBJECT (dlg), "bmp_reload", button);
1885   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL);
1886
1887   table = gtk_table_new (2, 2, TRUE);
1888   gtk_widget_show (table);
1889   gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1890   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1891   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1892   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1893
1894   label = gtk_label_new ("Map color 0 to:");
1895   gtk_widget_show (label);
1896   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1897                     (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1898                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1899   g_object_set_data (G_OBJECT (dlg), "bmp_text2", label);
1900   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1901   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1902
1903   label = gtk_label_new ("Map color 255 to:");
1904   gtk_widget_show (label);
1905   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1906                     (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1907                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1908   g_object_set_data (G_OBJECT (dlg), "bmp_text3", label);
1909   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1910   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1911
1912   hbox2 = gtk_hbox_new (FALSE, 5);
1913   gtk_widget_show (hbox2);
1914   gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1,
1915                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1916                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1917
1918   entry = gtk_entry_new ();
1919   gtk_widget_show (entry);
1920   gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1921   gtk_widget_set_usize (entry, 50, -2);
1922   g_object_set_data (G_OBJECT (dlg), "bmp_black", entry);
1923   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value);
1924
1925   hbox2 = gtk_hbox_new (FALSE, 5);
1926   gtk_widget_show (hbox2);
1927   gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
1928                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
1929                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
1930
1931   entry = gtk_entry_new ();
1932   gtk_widget_show (entry);
1933   gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
1934   gtk_widget_set_usize (entry, 50, -2);
1935   g_object_set_data (G_OBJECT (dlg), "bmp_white", entry);
1936   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value);
1937
1938   vbox = gtk_vbox_new (FALSE, 10);
1939   gtk_widget_show (vbox);
1940   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
1941
1942   label = gtk_label_new ("Fix Points");
1943   gtk_widget_show (label);
1944   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
1945
1946   label = gtk_label_new ("Click on a vertex in the lower half of the preview window,\n"
1947                          "then use the arrow keys or text box to assign a value.\n"
1948                          "Use Ctrl+Click to select multiple vertices/toggle a\n"
1949                          "selection. Use Shift+Click to select a range of vertices.\n\n"
1950                          "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"
1951                          "affected\" will be influenced by this vertex.");
1952   gtk_widget_show (label);
1953   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
1954
1955   table = gtk_table_new (3, 3, FALSE);
1956   gtk_widget_show (table);
1957   gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1958   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1959   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1960   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1961
1962   label = gtk_label_new ("Value:");
1963   gtk_widget_show (label);
1964   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
1965                     (GtkAttachOptions) (GTK_FILL),
1966                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1967   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1968   g_object_set_data (G_OBJECT (dlg), "fix_value_text", label);
1969
1970   label = gtk_label_new ("Range affected:");
1971   gtk_widget_show (label);
1972   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
1973                     (GtkAttachOptions) (GTK_FILL),
1974                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1975   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1976   g_object_set_data (G_OBJECT (dlg), "fix_range_text", label);
1977
1978   label = gtk_label_new ("Rate of change:");
1979   gtk_widget_show (label);
1980   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
1981                     (GtkAttachOptions) (GTK_FILL),
1982                     (GtkAttachOptions) (GTK_FILL), 0, 0);
1983   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1984   g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label);
1985
1986   adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 16);
1987   g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL);
1988   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
1989   gtk_widget_show (spin);
1990   gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
1991                     (GtkAttachOptions) (GTK_EXPAND),
1992                     (GtkAttachOptions) (GTK_EXPAND), 0, 0);
1993   gtk_widget_set_usize (spin, 60, -2);
1994   g_object_set_data (G_OBJECT (dlg), "fix_value", spin);
1995   g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL);
1996
1997   entry = gtk_entry_new ();
1998   gtk_widget_show (entry);
1999   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2000                     (GtkAttachOptions) (GTK_EXPAND),
2001                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2002   gtk_widget_set_usize (entry, 60, -2);
2003   g_object_set_data (G_OBJECT (dlg), "fix_range", entry);
2004   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL);
2005
2006   entry = gtk_entry_new ();
2007   gtk_widget_show (entry);
2008   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2009                     (GtkAttachOptions) (GTK_EXPAND),
2010                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2011   gtk_widget_set_usize (entry, 60, -2);
2012   g_object_set_data (G_OBJECT (dlg), "fix_rate", entry);
2013   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL);
2014
2015   button = gtk_button_new_with_label ("Free");
2016   gtk_widget_show (button);
2017   gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
2018                     (GtkAttachOptions) (GTK_EXPAND),
2019                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2020   gtk_widget_set_usize (button, 60, -2);
2021   g_object_set_data (G_OBJECT (dlg), "fix_free", button);
2022   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL);
2023
2024   button = gtk_button_new_with_label ("Free All");
2025   gtk_widget_show (button);
2026   gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
2027                     (GtkAttachOptions) (GTK_EXPAND),
2028                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2029   gtk_widget_set_usize (button, 60, -2);
2030   g_object_set_data (G_OBJECT (dlg), "fix_freeall", button);
2031   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL);
2032
2033   vbox = gtk_vbox_new (FALSE, 10);
2034   gtk_widget_show (vbox);
2035   gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
2036
2037   label = gtk_label_new ("Texture");
2038   gtk_widget_show (label);
2039   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
2040
2041         // ^Fishman - Modified to add more labels and textboxes.
2042         table = gtk_table_new (5, 2, FALSE);
2043   gtk_widget_show (table);
2044   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2045   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2046   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2047
2048   label = gtk_label_new ("Surface:");
2049   gtk_widget_show (label);
2050   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2051                     (GtkAttachOptions) (GTK_FILL),
2052                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2053   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2054
2055   label = gtk_label_new ("Other:");
2056   gtk_widget_show (label);
2057   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2058                     (GtkAttachOptions) (GTK_FILL),
2059                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2060   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2061
2062   label = gtk_label_new ("Steep:");
2063   gtk_widget_show (label);
2064   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
2065                     (GtkAttachOptions) (GTK_FILL),
2066                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2067   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2068
2069   entry = gtk_entry_new ();
2070   gtk_widget_show (entry);
2071   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
2072                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2073                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2074   gtk_widget_set_usize (entry, 60, -2);
2075   g_object_set_data (G_OBJECT (dlg), "texture1", entry);
2076   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0));
2077
2078   entry = gtk_entry_new ();
2079   gtk_widget_show (entry);
2080   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2081                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2082                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2083   gtk_widget_set_usize (entry, 60, -2);
2084   g_object_set_data (G_OBJECT (dlg), "texture2", entry);
2085   g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1));
2086
2087   entry = gtk_entry_new ();
2088   gtk_widget_show (entry);
2089   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2090                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2091                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2092   gtk_widget_set_usize (entry, 60, -2);
2093   g_object_set_data (G_OBJECT (dlg), "texture3", entry);
2094
2095   hbox2 = gtk_hbox_new (FALSE, 5);
2096   gtk_widget_show (hbox2);
2097   gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
2098
2099   label = gtk_label_new ("\"Steep\" angle:");
2100   gtk_widget_show (label);
2101   gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
2102
2103   adj = gtk_adjustment_new (60, 0, 90, 1, 10, 10);
2104   spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
2105   gtk_widget_show (spin);
2106   gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0);
2107   g_object_set_data (G_OBJECT (dlg), "tex_slant", spin);
2108
2109   table = gtk_table_new (2, 4, TRUE);
2110   gtk_widget_show (table);
2111   gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2112   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2113   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2114
2115   label = gtk_label_new ("Offset <h,v>");
2116   gtk_widget_show (label);
2117   gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1,
2118                     (GtkAttachOptions) (GTK_FILL),
2119                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2120
2121   label = gtk_label_new ("Scale <h,v>");
2122   gtk_widget_show (label);
2123   gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1,
2124                     (GtkAttachOptions) (GTK_FILL),
2125                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2126
2127   entry = gtk_entry_new ();
2128   gtk_widget_show (entry);
2129   gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2,
2130                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2131                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2132   gtk_widget_set_usize (entry, 60, -2);
2133   g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry);
2134
2135   entry = gtk_entry_new ();
2136   gtk_widget_show (entry);
2137   gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2138                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2139                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2140   gtk_widget_set_usize (entry, 60, -2);
2141   g_object_set_data (G_OBJECT (dlg), "texoffsety", entry);
2142
2143   entry = gtk_entry_new ();
2144   gtk_widget_show (entry);
2145   gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2,
2146                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2147                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2148   gtk_widget_set_usize (entry, 60, -2);
2149   g_object_set_data (G_OBJECT (dlg), "texscalex", entry);
2150
2151   entry = gtk_entry_new ();
2152   gtk_widget_show (entry);
2153   gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
2154                     (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
2155                     (GtkAttachOptions) (GTK_FILL), 0, 0);
2156   gtk_widget_set_usize (entry, 60, -2);
2157   g_object_set_data (G_OBJECT (dlg), "texscaley", entry);
2158
2159
2160
2161   check = gtk_check_button_new_with_label ("Use detail brushes");
2162   gtk_widget_show (check);
2163   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2164   g_object_set_data (G_OBJECT (dlg), "detail", check);
2165   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL);
2166
2167   check = gtk_check_button_new_with_label ("Detail hint brushes");
2168   gtk_widget_show (check);
2169   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2170   g_object_set_data (G_OBJECT (dlg), "hint", check);
2171   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL);
2172
2173         // ^Fishman - Add terrain key to func_group.
2174         check = gtk_check_button_new_with_label ("Add terrain key");
2175   gtk_widget_show (check);
2176   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2177   g_object_set_data (G_OBJECT (dlg), "terrain_ent", check);
2178   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL);
2179
2180   vbox = gtk_vbox_new (FALSE, 5);
2181   gtk_widget_show (vbox);
2182   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
2183
2184   button = gtk_button_new_with_label ("OK");
2185   gtk_widget_show (button);
2186   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2187   gtk_widget_set_usize (button, 60, -2);
2188   g_object_set_data (G_OBJECT (dlg), "go", button);
2189   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL);
2190
2191   label = gtk_label_new ("Settings:");
2192   gtk_widget_show (label);
2193   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
2194
2195   button = gtk_button_new_with_label ("Open...");
2196   gtk_widget_show (button);
2197   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2198   g_object_set_data (G_OBJECT (dlg), "open", button);
2199   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL);
2200
2201   button = gtk_button_new_with_label ("Save as...");
2202   gtk_widget_show (button);
2203   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2204   g_object_set_data (G_OBJECT (dlg), "save", button);
2205   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL);
2206
2207   button = gtk_button_new_with_label ("Defaults");
2208   gtk_widget_show (button);
2209   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2210   g_object_set_data (G_OBJECT (dlg), "defaults", button);
2211   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL);
2212
2213   button = gtk_button_new_with_label ("About...");
2214   gtk_widget_show (button);
2215   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
2216   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL);
2217
2218   check = gtk_check_button_new_with_label ("Preview");
2219   gtk_widget_show (check);
2220   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2221   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL);
2222   g_object_set_data (G_OBJECT (dlg), "main_preview", check);
2223
2224         // ^Fishman - Antializing for the preview window.
2225   check = gtk_check_button_new_with_label ("Antialised lines");
2226   gtk_widget_show (check);
2227   gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
2228         g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check);
2229   g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL);
2230
2231   for (i = 0; i < 5; i++)
2232     SetDlgValues (i);
2233
2234   CreateViewWindow ();
2235
2236   create_tooltips();
2237
2238   FirstPassComplete = 1;
2239
2240   return dlg;
2241 }
2242
2243
2244 #if 0
2245
2246 HWND hwndDisplay = (HWND)NULL;
2247 HWND ghwndTab    = (HWND)NULL;
2248 int  iTab=0;
2249 RECT rcTab;
2250 FILE *ftex;
2251
2252 char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};
2253 char GenSurfBoard[40]={"http://tarot.telefragged.com/board"};
2254
2255 /*
2256 * AboutDlgProc - processes messages for the about dialog.
2257 */
2258
2259 qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )
2260 {
2261         char           szText[256];
2262         DRAWITEMSTRUCT *dis;
2263         HDC            hdc;
2264         HPEN           hpen;
2265         HWND           hwndURL;
2266         RECT           rc;
2267         SIZE           size;
2268
2269         lparam = lparam;                                        /* turn off warning */
2270
2271         switch( msg ) {
2272         case WM_INITDIALOG:
2273                 strcpy(szText,"About " );
2274                 strcat(szText,gszCaption);
2275                 SetWindowText(hwnd,gszCaption);
2276                 SetDlgItemText(hwnd,DLG_ABOUT_APP,szText);
2277                 /*      Application icon: */
2278                 SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,
2279                         STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"),
2280                         (LPARAM) NULL);
2281
2282                 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL);
2283                 hdc = GetDC(hwndURL);
2284                 GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size);
2285                 ReleaseDC(hwndURL,hdc);
2286                 GetWindowRect(hwndURL,&rc);
2287                 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2288                         SWP_NOMOVE | SWP_NOZORDER);
2289
2290                 hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD);
2291                 hdc = GetDC(hwndURL);
2292                 GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size);
2293                 ReleaseDC(hwndURL,hdc);
2294                 GetWindowRect(hwndURL,&rc);
2295                 SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
2296                         SWP_NOMOVE | SWP_NOZORDER);
2297
2298                 return TRUE;
2299
2300         case WM_COMMAND:
2301                 switch(LOWORD(wparam))
2302                 {
2303                 case DLG_ABOUT_URL:
2304                         HTTP(GenSurfURL);
2305                         break;
2306                 case DLG_ABOUT_BOARD:
2307                         HTTP(GenSurfBoard);
2308                         break;
2309                 case IDOK:
2310                         EndDialog(hwnd,1);
2311                         return TRUE;
2312                 }
2313                 break;
2314
2315         case WM_DRAWITEM:
2316                 if(wparam == DLG_ABOUT_URL)
2317                 {
2318                         dis = (LPDRAWITEMSTRUCT)lparam;
2319                         SetTextColor(dis->hDC,RGB(0,0,255));
2320                         TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL));
2321                         GetWindowRect(dis->hwndItem,&rc);
2322                         GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size);
2323                         hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2324                         SelectObject(dis->hDC,hpen);
2325                         MoveToEx(dis->hDC,0,size.cy,NULL);
2326                         LineTo(dis->hDC,size.cx,size.cy);
2327                         SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2328                         DeleteObject(hpen);
2329                 }
2330                 else if(wparam==DLG_ABOUT_BOARD)
2331                 {
2332                         dis = (LPDRAWITEMSTRUCT)lparam;
2333                         SetTextColor(dis->hDC,RGB(0,0,255));
2334                         TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard));
2335                         GetWindowRect(dis->hwndItem,&rc);
2336                         GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size);
2337                         hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
2338                         SelectObject(dis->hDC,hpen);
2339                         MoveToEx(dis->hDC,0,size.cy,NULL);
2340                         LineTo(dis->hDC,size.cx,size.cy);
2341                         SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
2342                         DeleteObject(hpen);
2343                 }
2344                 break;
2345
2346         case WM_CLOSE:
2347                 EndDialog(hwnd,1);
2348                 return TRUE;
2349
2350         default:
2351                 return FALSE;
2352         }
2353         return FALSE;
2354         
2355 } /* AboutDlgProc */
2356
2357 void About()
2358 {
2359         if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0)
2360         {
2361                 char Text[256];
2362                 sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError());
2363                 MessageBox(ghwnd_main,Text,"GenSurf",MB_ICONEXCLAMATION);
2364         }
2365 }
2366
2367 #endif