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