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