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