more eol-style
[xonotic/netradiant.git] / contrib / gtkgensurf / gendlgs.cpp
index 3faf2707bb39c2cd42bebf5e7811ba2cb425a0c9..69c0805a9bbb744824232fa972dc9216d5ae1c01 100644 (file)
-/*\r
-GenSurf plugin for GtkRadiant\r
-Copyright (C) 2001 David Hyde, Loki software and qeradiant.com\r
-\r
-This library is free software; you can redistribute it and/or\r
-modify it under the terms of the GNU Lesser General Public\r
-License as published by the Free Software Foundation; either\r
-version 2.1 of the License, or (at your option) any later version.\r
-\r
-This library is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-Lesser General Public License for more details.\r
-\r
-You should have received a copy of the GNU Lesser General Public\r
-License along with this library; if not, write to the Free Software\r
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-*/\r
-\r
-#include <gtk/gtk.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <math.h>\r
-#include "gensurf.h"\r
-\r
-#define GENERAL_TAB   0\r
-#define EXTENTS_TAB   1\r
-#define BITMAP_TAB    2\r
-#define FIXPOINTS_TAB 3\r
-#define TEXTURE_TAB   4\r
-//#define BUFF_SIZE    32768\r
-\r
-#define ENABLE_WIDGET(name,enable) \\r
-  gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), (name))), (enable))\r
-#define CHECK_WIDGET(name,check) \\r
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), name)), check)\r
-\r
-static GtkWidget *game_radios[NUMGAMES];\r
-static GtkWidget *wave_radios[5];\r
-static GtkWidget *plane_radios[6];\r
-static guint current_tab;\r
-static int OldPreview;\r
-static int WasDetail;\r
-static GtkTooltips *tooltips;\r
-static int FirstPassComplete = 0;\r
-\r
-void About (GtkWidget *parent)\r
-{\r
-/*\r
-  char *icon_xpm[] = {\r
-"32 32 4 1",\r
-"      c None",\r
-".     c #000000",\r
-"+     c #FFFFFF",\r
-"@     c #838183",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"...............++...............",\r
-".............++++++.............",\r
-"............++@+++@+............",\r
-"..........+++..++..+++..........",\r
-"........++.+.++..++.+.@+........",\r
-".......+..+..+.++.+..+..++......",\r
-".....++..++.+..++..+.++..++.....",\r
-"...++..++...+.+..+.++..++..++...",\r
-"..++.+.++....++..++....++.+..+..",\r
-".+.+..+..++....++....++..++.+.+.",\r
-"..+++....+.++++++++++.+....+++..",\r
-"....++.@@+++++.++.++++@++.++....",\r
-"......+++++++......++@+++++.....",\r
-".......+++.+.++..++.+..++.......",\r
-".........++..+.++.+..++.........",\r
-"...........++..++..++...........",\r
-".............++..+.+............",\r
-"..............+..+@.............",\r
-"...............@@...............",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"................................",\r
-"................................"\r
-};\r
-*/\r
-  // leo: I'm too lazy to create a nice about box\r
-       // ^Fishman - I am lazy too :P.\r
-  g_FuncTable.m_pfnMessageBox (parent, "GtkGenSurf 1.05\n\n"\r
-                               "Original version\n"\r
-                                                                                                                        "David Hyde (rascal@vicksburg.com)\n\n"\r
-                                                                                                                        "Porting\n"\r
-                               "Leonardo Zide (leo@lokigames.com)\n\n"\r
-                                                                                                                        "Enhancements\n"\r
-                                                                                                                        "Pablo Zurita (pablo@qeradiant.com)\n"\r
-                                                                                                                        "Hydra (hydra@hydras-world.com)",\r
-                               "About GtkGenSurf", MB_OK);\r
-}\r
-\r
-// =============================================================================\r
-// main dialog\r
-\r
-static void SetupControls ()\r
-{\r
-  switch (current_tab)\r
-  {\r
-  case GENERAL_TAB:\r
-    break;\r
-\r
-  case EXTENTS_TAB:\r
-    if (Game != QUAKE3)\r
-    {\r
-      gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));\r
-      ENABLE_WIDGET ("use_patches", FALSE);\r
-    }\r
-    else\r
-    {\r
-      gtk_widget_show (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));\r
-      ENABLE_WIDGET ("use_patches", TRUE);\r
-    }\r
-\r
-    if (Game == QUAKE3 && UsePatches != 0)\r
-    {\r
-      ENABLE_WIDGET ("decimate", FALSE);\r
-    }\r
-               gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "snap_text")), "Snap to grid:"); // ^Fishman - Snap to grid.\r
-    break;\r
-\r
-  case BITMAP_TAB:\r
-    if (WaveType != WAVE_BITMAP)\r
-    {\r
-      ENABLE_WIDGET ("bmp_file", FALSE);\r
-      ENABLE_WIDGET ("bmp_file_browse", FALSE);\r
-      ENABLE_WIDGET ("bmp_black", FALSE);\r
-      ENABLE_WIDGET ("bmp_white", FALSE);\r
-      ENABLE_WIDGET ("bmp_text1", FALSE);\r
-      ENABLE_WIDGET ("bmp_text2", FALSE);\r
-      ENABLE_WIDGET ("bmp_text3", FALSE);\r
-      ENABLE_WIDGET ("bmp_reload", FALSE);\r
-      gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),\r
-                          "These options are disabled unless \"From Bitmap\"\n"\r
-                          "is selected as the Waveform on the General tab.");\r
-    }\r
-    else\r
-    {\r
-      ENABLE_WIDGET ("bmp_file", TRUE);\r
-      ENABLE_WIDGET ("bmp_file_browse", TRUE);\r
-      ENABLE_WIDGET ("bmp_black", TRUE);\r
-      ENABLE_WIDGET ("bmp_white", TRUE);\r
-      ENABLE_WIDGET ("bmp_text1", TRUE);\r
-      ENABLE_WIDGET ("bmp_text2", TRUE);\r
-      ENABLE_WIDGET ("bmp_text3", TRUE);\r
-      ENABLE_WIDGET ("bmp_reload", strlen(gbmp.name) != 0);\r
-      gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),\r
-                          "GenSurf works only with 8-bit bitmaps. Color indices are\n"\r
-                          "mapped to values for each vertex. Generally, gray scale\n"\r
-                          "images are stored with black as color 0, white as color 255.");\r
-    }\r
-    break;\r
-\r
-  case FIXPOINTS_TAB:\r
-    ENABLE_WIDGET ("fix_value", (NumVerticesSelected != 0));\r
-    ENABLE_WIDGET ("fix_value_text", (NumVerticesSelected != 0));\r
-    ENABLE_WIDGET ("fix_free", (NumVerticesSelected != 0));\r
-    ENABLE_WIDGET ("fix_range", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
-    ENABLE_WIDGET ("fix_range_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
-    ENABLE_WIDGET ("fix_rate", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
-    ENABLE_WIDGET ("fix_rate_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));\r
-    break;\r
-\r
-  case TEXTURE_TAB:\r
-    ENABLE_WIDGET ("texture2", (UsePatches == 0));\r
-    ENABLE_WIDGET ("texture3", (UsePatches == 0));\r
-    ENABLE_WIDGET ("tex_slant", (UsePatches == 0));\r
-    ENABLE_WIDGET ("detail", (UsePatches == 0));\r
-    if (Game != QUAKE3 )\r
-               {\r
-                       ENABLE_WIDGET ("terrain_ent", FALSE); // ^Fishman - Adds terrain key to func_group.\r
-      ENABLE_WIDGET ("hint", (UsePatches == 0));\r
-               }\r
-    break;\r
-  }\r
-\r
-  switch (WaveType)\r
-  {\r
-  case WAVE_HCYLINDER:\r
-  case WAVE_VCYLINDER:\r
-    ENABLE_WIDGET ("amplitude", TRUE);\r
-    ENABLE_WIDGET ("wavelength", TRUE);\r
-    ENABLE_WIDGET ("z00", TRUE);\r
-    ENABLE_WIDGET ("z01", TRUE);\r
-    ENABLE_WIDGET ("z10", TRUE);\r
-    ENABLE_WIDGET ("z11", TRUE);\r
-    ENABLE_WIDGET ("linearborder", TRUE);\r
-    ENABLE_WIDGET ("go", TRUE);\r
-    break;\r
-  case WAVE_BITMAP:\r
-    ENABLE_WIDGET ("amplitude", FALSE);\r
-    ENABLE_WIDGET ("wavelength", FALSE);\r
-    ENABLE_WIDGET ("z00", FALSE);\r
-    ENABLE_WIDGET ("z01", FALSE);\r
-    ENABLE_WIDGET ("z10", FALSE);\r
-    ENABLE_WIDGET ("z11", FALSE);\r
-    ENABLE_WIDGET ("linearborder", FALSE);\r
-    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
-    break;\r
-  case WAVE_ROUGH_ONLY:\r
-    ENABLE_WIDGET ("amplitude", FALSE);\r
-    ENABLE_WIDGET ("wavelength", FALSE);\r
-    ENABLE_WIDGET ("z00", TRUE);\r
-    ENABLE_WIDGET ("z01", TRUE);\r
-    ENABLE_WIDGET ("z10", TRUE);\r
-    ENABLE_WIDGET ("z11", TRUE);\r
-    ENABLE_WIDGET ("linearborder", TRUE);\r
-    ENABLE_WIDGET ("go", TRUE);\r
-    break;\r
-  default:\r
-    ENABLE_WIDGET ("amplitude", TRUE);\r
-    ENABLE_WIDGET ("wavelength", TRUE);\r
-    ENABLE_WIDGET ("z00", TRUE);\r
-    ENABLE_WIDGET ("z01", TRUE);\r
-    ENABLE_WIDGET ("z10", TRUE);\r
-    ENABLE_WIDGET ("z11", TRUE);\r
-    ENABLE_WIDGET ("linearborder", TRUE);\r
-    ENABLE_WIDGET ("go", TRUE);\r
-  }\r
-\r
-  switch (Plane)\r
-  {\r
-  case PLANE_XZ0:\r
-  case PLANE_XZ1:\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");\r
-    break;\r
-  case PLANE_YZ0:\r
-  case PLANE_YZ1:\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "Y:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "Y:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "Y:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");\r
-    break;\r
-  default:\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Y:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Y:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");\r
-    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Y:");\r
-    break;\r
-  }\r
-}\r
-\r
-// SetDlgValues fills in text boxes and initializes other input controls\r
-static void SetDlgValues (int tab)\r
-{\r
-  char Text[256];\r
-  char RForm[16] = "%.5g";\r
-  int i;\r
-\r
-  switch (tab)\r
-  {\r
-  case GENERAL_TAB:\r
-    // Hell if I know why, but in the release build the 2nd pass thru the\r
-    // set_sensitive loop for game_radios crashes. No need to do this more\r
-    // than once anyhow.\r
-    if (!FirstPassComplete)\r
-    {\r
-      for (i = 0; i < NUMGAMES; i++)\r
-        gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE));\r
-      for (i = 0; i < 6; i++)\r
-        gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE));\r
-    }\r
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE);\r
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE);\r
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE);\r
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")),\r
-                               RandomSeed);\r
-    sprintf (Text, RForm, WaveLength);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text);\r
-    sprintf (Text, RForm, Amplitude);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text);\r
-    sprintf (Text, RForm, Roughness);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text);\r
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data\r
-                                                     (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing);\r
-    break;\r
-\r
-  case EXTENTS_TAB:\r
-    sprintf (Text,RForm,Hll);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text);\r
-    sprintf (Text,RForm,Vll);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text);\r
-    sprintf (Text,RForm,Hur);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text);\r
-    sprintf (Text,RForm,Vur);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text);\r
-    sprintf (Text,RForm,Z00);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text);\r
-    sprintf (Text,RForm,Z01);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text);\r
-    sprintf (Text,RForm,Z10);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text);\r
-    sprintf (Text,RForm,Z11);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text);\r
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);\r
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);\r
-               gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid.\r
-\r
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data\r
-                                                     (G_OBJECT (g_pWnd), "linearborder")), FixBorders);\r
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data\r
-                                                     (G_OBJECT (g_pWnd), "use_patches")), UsePatches);\r
-    gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")),\r
-                              Decimate);\r
-\r
-    if (Game == QUAKE3 && UsePatches)\r
-    {\r
-      gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE);\r
-\r
-      if (NH % 2)\r
-      {\r
-        NH++;\r
-        if (NH > MAX_ROWS) NH -= 2;\r
-        SetDlgValues (current_tab);\r
-      }\r
-\r
-      if (NV % 2)\r
-      {\r
-        NV++;\r
-        if (NV > MAX_ROWS) NV -= 2;\r
-        SetDlgValues (current_tab);\r
-      }\r
-      if (NH % 2 ) NH++;\r
-      if (NH < 2 ) NH = 2;\r
-      if (NH > MAX_ROWS) NH = MAX_ROWS;\r
-      if (NV % 2 ) NV++;\r
-      if (NV < 2 ) NV = 2;\r
-      if (NV > MAX_ROWS) NV = MAX_ROWS;\r
-\r
-      gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");\r
-      GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
-      adj->lower = 2;\r
-      gtk_adjustment_changed (adj);\r
-      spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");\r
-      adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
-      adj->lower = 2;\r
-      gtk_adjustment_changed (adj);\r
-    }\r
-    else\r
-    {\r
-      gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE);\r
-\r
-      gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");\r
-      GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
-      adj->lower = 1;\r
-      gtk_adjustment_changed (adj);\r
-      spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");\r
-      adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
-      adj->lower = 1;\r
-      gtk_adjustment_changed (adj);\r
-    }\r
-\r
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);\r
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);\r
-\r
-    break;\r
-\r
-  case BITMAP_TAB:\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name);\r
-    sprintf(Text,"%g",gbmp.black_value);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text);\r
-    sprintf(Text,"%g",gbmp.white_value);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text);\r
-    break;\r
-\r
-  case FIXPOINTS_TAB:\r
-    break;\r
-\r
-  case TEXTURE_TAB:\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]);\r
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")),\r
-                               SlantAngle);\r
-    sprintf(Text,RForm,TexOffset[0]);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text);\r
-    sprintf(Text,RForm,TexOffset[1]);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text);\r
-    sprintf(Text,RForm,TexScale[0]);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text);\r
-    sprintf(Text,RForm,TexScale[1]);\r
-    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text);\r
-    CHECK_WIDGET ("detail", UseDetail);\r
-\r
-    if (Game==QUAKE3)\r
-    {\r
-      ENABLE_WIDGET ("hint", FALSE);\r
-      AddHints=0;\r
-    }\r
-    else\r
-      ENABLE_WIDGET ("hint", TRUE);\r
-    CHECK_WIDGET ("hint", AddHints);\r
-\r
-    /*\r
-    if (Game==SIN)\r
-    {\r
-      // ArghRad doesn't currently support SiN\r
-      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
-      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
-      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
-      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
-      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
-      SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");\r
-      SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");\r
-    }\r
-    */\r
-\r
-    if(Game==QUAKE3)\r
-    {\r
-      /*\r
-      // ArghRad sun is inapplicable (so far)\r
-      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
-      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
-      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
-      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
-      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
-      // No ladders in Q3\r
-      EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);\r
-      ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);\r
-      SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file");\r
-      SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:");\r
-      */\r
-    }\r
-\r
-/*trix if(Game==HERETIC2)\r
-               {\r
-                       // ArghRad doesn't currently support Heretic2\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
-\r
-                       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file");\r
-                       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:");\r
-               } */\r
-    /*\r
-               if(Game==HALFLIFE)\r
-               {\r
-                       // A bunch of controls aren't applicable to HL\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
-\r
-                       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file");\r
-                       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:");\r
-                       SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes");\r
-               }\r
-\r
-               if(Game==GENESIS3D)\r
-               {\r
-                       // No Q2-type compilers support Genesis3D (including ArghRad)\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);\r
-                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);\r
-                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);\r
-\r
-                       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");\r
-                       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");\r
-               }\r
-    */\r
-    break;\r
-  }\r
-  SetupControls ();\r
-}\r
-\r
-static void ReadDlgValues (int tab)\r
-{\r
-  //  char Text[256];\r
-  //  int i;\r
-\r
-  switch (tab)\r
-  {\r
-  case GENERAL_TAB:\r
-    gpointer spin;\r
-    Roughness  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness"))));\r
-    WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength"))));\r
-    Amplitude  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude"))));\r
-    spin = g_object_get_data (G_OBJECT (g_pWnd), "random");\r
-    RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));\r
-    break;\r
-\r
-  case EXTENTS_TAB:\r
-               SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp"))));\r
-    NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh"))));\r
-    NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv"))));\r
-\r
-    if (Game == QUAKE3 && UsePatches != 0)\r
-    {\r
-      if (NH % 2 ) NH++;\r
-      if (NH < 2 ) NH = 2;\r
-      if (NH > MAX_ROWS) NH = MAX_ROWS;\r
-      if (NV % 2 ) NV++;\r
-      if (NV < 2 ) NV = 2;\r
-      if (NV > MAX_ROWS) NV = MAX_ROWS;\r
-    }\r
-    break;\r
-\r
-#if 0\r
-  case BITMAP_TAB:\r
-\r
-    if (WaveType == WAVE_BITMAP)\r
-    {\r
-      GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name));\r
-      CheckValidDIB(hwnd);\r
-      GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text));\r
-      gbmp.black_value = atof(Text);\r
-      GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text));\r
-      gbmp.white_value = atof(Text);\r
-      UpdatePreview(TRUE);\r
-    }\r
-    break;\r
-\r
-  case FIXPOINTS_TAB:\r
-    GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text));\r
-    temp.fixed_value = atoi(Text);\r
-    GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text));\r
-    temp.range = atoi(Text);\r
-    GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text));\r
-    temp.rate = atof(Text);\r
-    for(k=0; k<NumVerticesSelected; k++)\r
-    {\r
-      xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;\r
-      xyz[Vertex[k].i][Vertex[k].j].range       = temp.range;\r
-      xyz[Vertex[k].i][Vertex[k].j].rate        = temp.rate;\r
-    }\r
-    if(!OldPreview)\r
-    {\r
-      Preview = 0;\r
-      CheckDlgButton(ghwnd,DLG_PREVIEW,0);\r
-      SendMessage(ghwnd,WM_COMMAND,DLG_PREVIEW,0);\r
-    }\r
-    VertexMode = 0;\r
-    UpdatePreview(TRUE);\r
-    break;\r
-\r
-  case TEXTURE_TAB:\r
-    if(UsePak[Game])\r
-    {\r
-      i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );\r
-      if(i == CB_ERR)\r
-        Texture[Game][0][0] = '\0';\r
-      else\r
-        SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,\r
-          (LPARAM)(LPCSTR)Texture[Game][0]);\r
-\r
-      i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );\r
-      if(i == CB_ERR)\r
-        Texture[Game][1][0] = '\0';\r
-      else\r
-        SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,\r
-          (LPARAM)(LPCSTR)Texture[Game][1]);\r
-\r
-      i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );\r
-      if(i == CB_ERR)\r
-        Texture[Game][2][0] = '\0';\r
-      else\r
-        SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,\r
-          (LPARAM)(LPCSTR)Texture[Game][2]);\r
-    }\r
-    else\r
-    {\r
-      GetDlgItemText(hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof(Texture[Game][0]));\r
-      GetDlgItemText(hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof(Texture[Game][1]));\r
-      GetDlgItemText(hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof(Texture[Game][2]));\r
-    }\r
-    GetDlgItemText(hwndDisplay,DLG_TEX_SLANT,Text,sizeof(Text));\r
-    SlantAngle = atoi(Text);\r
-    SlantAngle = max(0,min(SlantAngle,90));\r
-    GetDlgItemText(hwndDisplay,DLG_TEXOFFSETX,Text,sizeof(Text));\r
-    TexOffset[0] = atof(Text);\r
-    GetDlgItemText(hwndDisplay,DLG_TEXOFFSETY,Text,sizeof(Text));\r
-    TexOffset[1] = atof(Text);\r
-    GetDlgItemText(hwndDisplay,DLG_TEXSCALEX,Text,sizeof(Text));\r
-    TexScale[0] = atof(Text);\r
-    if(TexScale[0] == 0.) TexScale[0] = 1.0;\r
-    GetDlgItemText(hwndDisplay,DLG_TEXSCALEY,Text,sizeof(Text));\r
-    TexScale[1] = atof(Text);\r
-    if(TexScale[1] == 0.) TexScale[1] = 1.0;\r
-    GetDlgItemText(hwndDisplay,DLG_ARGHRAD2,Text,sizeof(Text));\r
-    ArghRad2 = atoi(Text);\r
-    break;\r
-#endif\r
-  }\r
-}\r
-\r
-// =============================================================================\r
-// main dialog callbacks\r
-\r
-static void switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)\r
-{\r
-  if (current_tab != page_num)\r
-  {\r
-    if (page_num == FIXPOINTS_TAB)\r
-    {\r
-      OldPreview = Preview;\r
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),\r
-                                                                            "main_preview")), TRUE);\r
-      VertexMode = 1;\r
-      UpdatePreview (true);\r
-      NumVerticesSelected = 0;\r
-    }\r
-\r
-    if (current_tab == FIXPOINTS_TAB)\r
-    {\r
-      if (!OldPreview)\r
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),\r
-                                                                              "main_preview")), FALSE);\r
-      VertexMode = 0;\r
-      UpdatePreview (true);\r
-      NumVerticesSelected = 0;\r
-    }\r
-\r
-    if (page_num == TEXTURE_TAB)\r
-    {\r
-      WasDetail = UseDetail;\r
-      if (AddHints)\r
-      {\r
-        UseDetail = 1;\r
-        ENABLE_WIDGET ("detail", FALSE);\r
-      }\r
-    }\r
-\r
-    ReadDlgValues (current_tab);\r
-    current_tab = page_num;\r
-    SetDlgValues (current_tab);\r
-  }\r
-}\r
-\r
-static gint main_close (GtkWidget *widget, gpointer data)\r
-{\r
-  gtk_widget_hide (g_pWnd);\r
-  gtk_widget_hide (g_pWndPreview);\r
-\r
-  return TRUE;\r
-}\r
-\r
-static void main_save (GtkWidget *widget, gpointer data)\r
-{\r
-  ReadDlgValues (current_tab);\r
-  SaveSetup (g_pWnd);\r
-}\r
-\r
-static void main_open (GtkWidget *widget, gpointer data)\r
-{\r
-  OpenSetup (g_pWnd, 0);\r
-  for (int i = 0; i < 5; i++)\r
-    SetDlgValues (i);\r
-  ShowPreview ();\r
-}\r
-\r
-static void main_defaults (GtkWidget *widget, gpointer data)\r
-{\r
-  OpenSetup (g_pWnd, 1);\r
-  for (int i = 0; i < 5; i++)\r
-    SetDlgValues (i);\r
-  ShowPreview ();\r
-}\r
-\r
-static void main_preview (GtkWidget *widget, gpointer data)\r
-{\r
-  Preview = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));\r
-  ShowPreview ();\r
-}\r
-\r
-// ^Fishman - Antializing for the preview window.\r
-static void main_antialiasing (GtkWidget *widget, gpointer data)\r
-{\r
-       Antialiasing = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));\r
-       UpdatePreview (true);\r
-}\r
-\r
-static void main_about (GtkWidget *widget, gpointer data)\r
-{\r
-  About (g_pWnd);\r
-}\r
-\r
-static void main_go (GtkWidget *widget, gpointer data)\r
-{\r
-  GtkWidget *notebook = GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "notebook"));\r
-  char Text[256];\r
-\r
-  ReadDlgValues (current_tab);\r
-  if (NH < 1 || NH > MAX_ROWS)\r
-  {\r
-    sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);\r
-    g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION);\r
-    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
-    return;\r
-  }\r
-\r
-  if (NV < 1 || NV > MAX_ROWS)\r
-  {\r
-    sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);\r
-    g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION);\r
-    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
-    return;\r
-  }\r
-\r
-  if (Hll >= Hur)\r
-  {\r
-    g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than "\r
-                                 "the corresponding \"upper-right\" values in "\r
-                                 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION);\r
-    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
-    return;\r
-  }\r
-\r
-  if (Vll >= Vur)\r
-  {\r
-    g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than "\r
-                                 "the corresponding \"upper-right\" values in "\r
-                                 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION);\r
-    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
-    return;\r
-  }\r
-\r
-  if (!strlen (Texture[Game][0]))\r
-  {\r
-    g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", MB_ICONEXCLAMATION);\r
-    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);\r
-    return;\r
-  }\r
-\r
-/*  if (Decimate>0 && GimpHints!=0)\r
-  {\r
-    MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "\r
-               "This combination usually produces bizarre visual errors in the game, "\r
-               "so GenSurf has turned off the hint brush option.",\r
-               "GenSurf",MB_ICONEXCLAMATION);\r
-    GimpHints = 0;\r
-  } */\r
-\r
-  gtk_widget_hide (g_pWnd);\r
-  if (g_pWndPreview)\r
-    gtk_widget_hide (g_pWndPreview);\r
-\r
-  GenerateMap();\r
-  WriteIniFile(gszIni);\r
-}\r
-\r
-// =============================================================================\r
-// general tab callbacks\r
-\r
-static void general_game (GtkToggleButton *widget, gpointer data)\r
-{\r
-  if (gtk_toggle_button_get_active (widget))\r
-  {\r
-    Game = GPOINTER_TO_INT (data);\r
-    UpdatePreview (TRUE);\r
-  }\r
-}\r
-\r
-static void general_plane (GtkToggleButton *widget, gpointer data)\r
-{\r
-  if (gtk_toggle_button_get_active (widget))\r
-  {\r
-    Plane = GPOINTER_TO_INT (data);\r
-    SetupControls ();\r
-    UpdatePreview (TRUE);\r
-  }\r
-}\r
-\r
-static void general_wave (GtkToggleButton *widget, gpointer data)\r
-{\r
-  if (gtk_toggle_button_get_active (widget))\r
-  {\r
-    WaveType = GPOINTER_TO_INT (data);\r
-    SetupControls ();\r
-    UpdatePreview (TRUE);\r
-  }\r
-}\r
-\r
-static void general_random (GtkAdjustment *adj, gpointer data)\r
-{\r
-  int nPos = (int)adj->value;\r
-\r
-  if (RandomSeed != nPos)\r
-  {\r
-    RandomSeed = nPos;\r
-    UpdatePreview (true);\r
-  }\r
-}\r
-\r
-// =============================================================================\r
-// extents tab callbacks\r
-\r
-static void extents_linearborder (GtkToggleButton *check, gpointer data)\r
-{\r
-  FixBorders = gtk_toggle_button_get_active (check);\r
-  UpdatePreview (true);\r
-}\r
-\r
-static void extents_use_patches (GtkToggleButton *check, gpointer data)\r
-{\r
-  if (Game != QUAKE3)\r
-    return;\r
-\r
-  UsePatches = gtk_toggle_button_get_active (check);\r
-  SetDlgValues (current_tab);\r
-  SetupControls ();\r
-  UpdatePreview (true);\r
-}\r
-\r
-static void extents_nhnv_spin (GtkAdjustment *adj, int *data)\r
-{\r
-  int nPos = (int)adj->value;\r
-\r
-  if (*data != nPos)\r
-  {\r
-    if (Game==QUAKE3 && UsePatches && (nPos % 2))\r
-    {\r
-      if (*data < nPos)\r
-        *data += 2;\r
-      else\r
-        *data -= 2;\r
-      gtk_adjustment_set_value (adj, *data);\r
-    }\r
-    else\r
-      *data = nPos;\r
-    UpdatePreview (true);\r
-  }\r
-}\r
-\r
-static void extents_decimate (GtkAdjustment *adj, gpointer data)\r
-{\r
-  int nPos = (int)adj->value;\r
-\r
-  Decimate = nPos;\r
-  UpdatePreview (true);\r
-}\r
-\r
-// Hydra : snap to grid begin\r
-/*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)\r
-{\r
-  int nPos = (int)adj->value;\r
-\r
-  SnapToGrid = nPos;\r
-  UpdatePreview (true);\r
-}*/\r
-\r
-// ^Fishman - Modified version of Hydra's snap to grid code.\r
-static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data)\r
-{\r
-       int nPos = (int)adj->value;\r
-       SnapToGrid = nPos;\r
-       UpdatePreview (true);\r
-}\r
-\r
-// =============================================================================\r
-// bitmap tab callbacks\r
-\r
-static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)\r
-{\r
-  char filename[NAME_MAX];\r
-\r
-  strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget)));\r
-  if(strcmp (filename,gbmp.name))\r
-  {\r
-    if (gbmp.colors)\r
-    {\r
-      free(gbmp.colors);\r
-      gbmp.colors=NULL;\r
-    }\r
-    strcpy (gbmp.name,filename);\r
-    if (strlen(gbmp.name) )\r
-      OpenBitmap ();\r
-    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-static void bitmap_browse (GtkWidget *widget, gpointer data)\r
-{\r
-  const char *filename;\r
-  char *ptr;\r
-\r
-  filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath);\r
-\r
-  if (filename != NULL)\r
-  {\r
-    strcpy (gbmp.name, filename);\r
-\r
-    ptr = strrchr (filename, G_DIR_SEPARATOR);\r
-    if (ptr != NULL)\r
-    {\r
-      *(ptr+1) = '\0';\r
-      strcpy (gbmp.defpath, filename);\r
-    }\r
-\r
-    OpenBitmap ();\r
-    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
-  }\r
-}\r
-\r
-static void bitmap_reload (GtkWidget *widget, gpointer data)\r
-{\r
-  strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file"))));\r
-  if(strlen (gbmp.name) )\r
-  {\r
-    OpenBitmap ();\r
-    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));\r
-  }\r
-  else\r
-    ENABLE_WIDGET ("go", FALSE );\r
-}\r
-\r
-// =============================================================================\r
-// fix points tab callbacks\r
-\r
-static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data)\r
-{\r
-  int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;\r
-  char Text[32];\r
-\r
-  if (i < -65536 || i > 65536)\r
-  {\r
-    gdk_beep ();\r
-    g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.",\r
-                                 "GenSurf", MB_OK | MB_ICONEXCLAMATION);\r
-    sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);\r
-    gtk_entry_set_text (GTK_ENTRY(widget), Text);\r
-    gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget);\r
-  }\r
-  else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value)\r
-  {\r
-    for(k=0; k<NumVerticesSelected; k++)\r
-      xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;\r
-\r
-    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),\r
-                               (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);\r
-    UpdatePreview (true);\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-static void fix_value_changed (GtkAdjustment *adj, gpointer data)\r
-{\r
-  int k, i = (int)adj->value;\r
-\r
-  if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i)\r
-  {\r
-    for(k=0; k<NumVerticesSelected; k++)\r
-      xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;\r
-    UpdatePreview(true);\r
-  }\r
-}\r
-\r
-static gint fix_range_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)\r
-{\r
-  int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;\r
-\r
-  if (i != xyz[Vertex[0].i][Vertex[0].j].range)\r
-  {\r
-    for (k=0; k<NumVerticesSelected; k++)\r
-      xyz[Vertex[k].i][Vertex[k].j].range = i;\r
-    UpdatePreview (true);\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-static gint fix_rate_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)\r
-{\r
-  double r = atof (gtk_entry_get_text (GTK_ENTRY(widget)));\r
-  int k;\r
-\r
-  if (r != xyz[Vertex[0].i][Vertex[0].j].rate)\r
-  {\r
-    for(k=0; k<NumVerticesSelected; k++)\r
-      xyz[Vertex[k].i][Vertex[k].j].rate = r;\r
-    UpdatePreview (true);\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-static void fix_free (GtkWidget *widget, gpointer data)\r
-{\r
-  int k;\r
-\r
-  for (k=0; k<NumVerticesSelected; k++)\r
-    xyz[Vertex[k].i][Vertex[k].j].fixed = 0;\r
-  NumVerticesSelected = 0;\r
-  SetupControls ();\r
-  UpdatePreview (true);\r
-}\r
-\r
-static void fix_freeall (GtkWidget *widget, gpointer data)\r
-{\r
-  int i, j;\r
-\r
-  for (i=0; i<=NH; i++)\r
-  {\r
-    for(j=0; j<=NV; j++)\r
-      xyz[i][j].fixed = 0;\r
-  }\r
-  fix_free (NULL, data); // keep these together\r
-}\r
-\r
-void vertex_selected ()\r
-{\r
-  char Text[32];\r
-  int k;\r
-\r
-  SetupControls ();\r
-\r
-  switch(Plane)\r
-  {\r
-  case PLANE_XZ0:\r
-  case PLANE_XZ1:\r
-    for(k=0; k<NumVerticesSelected; k++)\r
-      xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];\r
-    break;\r
-  case PLANE_YZ0:\r
-  case PLANE_YZ1:\r
-    for(k=0; k<NumVerticesSelected; k++)\r
-      xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];\r
-    break;\r
-  default:\r
-    for(k=0; k<NumVerticesSelected; k++)\r
-      xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];\r
-    break;\r
-  }\r
-\r
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),\r
-                             (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);\r
-\r
-  sprintf(Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range);\r
-  gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), Text);\r
-  sprintf(Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate);\r
-  gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), Text);\r
-\r
-  for (k=0; k<NumVerticesSelected; k++)\r
-    xyz[Vertex[k].i][Vertex[k].j].fixed = 1;\r
-\r
-  UpdatePreview (true);\r
-}\r
-\r
-// =============================================================================\r
-// texture tab callbacks\r
-\r
-static void texture_detail (GtkToggleButton *check, gpointer data)\r
-{\r
-  UseDetail = gtk_toggle_button_get_active (check);\r
-  WasDetail = UseDetail;\r
-}\r
-\r
-static void texture_hint (GtkToggleButton *check, gpointer data)\r
-{\r
-  AddHints = gtk_toggle_button_get_active (check);\r
-  if (AddHints == 1)\r
-  {\r
-    UseDetail = 1;\r
-    ENABLE_WIDGET ("detail", FALSE);\r
-  }\r
-  else\r
-  {\r
-    UseDetail = WasDetail;\r
-    ENABLE_WIDGET ("detail", FALSE);\r
-  }\r
-  CHECK_WIDGET ("detail", UseDetail);\r
-}\r
-\r
-// ^Fishman - Add terrain key to func_group.\r
-static void texture_terrainent (GtkToggleButton *check, gpointer data)\r
-{\r
-       AddTerrainKey = gtk_toggle_button_get_active (check);\r
-}\r
-\r
-static void texture_set(int index, const char* name)\r
-{\r
-  strcpy(Texture[Game][index], name);\r
-}\r
-\r
-static gint texture_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)\r
-{\r
-  texture_set(GPOINTER_TO_INT(data), gtk_entry_get_text(GTK_ENTRY(widget)));\r
-  return FALSE;\r
-}\r
-\r
-// =============================================================================\r
-// misc stuff\r
-\r
-static void UpdateVariable (GtkEntry *entry, GdkEventFocus *event, double *data)\r
-{\r
-  double x = atof (gtk_entry_get_text (entry));\r
-\r
-  if (x != *data)\r
-  {\r
-    *data = x;\r
-    UpdatePreview (true);\r
-  }\r
-}\r
-\r
-static gint doublevariable_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)\r
-{\r
-  UpdateVariable(GTK_ENTRY(widget), event, reinterpret_cast<double*>(data));\r
-  return FALSE;\r
-}\r
-\r
-// =============================================================================\r
-// create tooltips\r
-\r
-void create_tooltips ()\r
-{\r
-  tooltips = gtk_tooltips_new ();\r
-\r
-  // Main\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")),\r
-        "Accept all input and generate a surface in Q3Radiant",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")),\r
-        "Open a previously saved GenSurf settings file.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")),\r
-        "Save all settings to a file.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")),\r
-        "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "\r
-        "initializes all input parameters to reasonable values. You can create your own "\r
-        "default surface by setting all parameters to your liking, then saving a settings "\r
-        "file as DEFAULTS.SRF with the Save As button.",\r
-        "");\r
-\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")),\r
-        "View a wire-frame representation of the surface",\r
-        "");\r
-\r
-       gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")),\r
-        "The lines in the preview window are antialiased for better quality",\r
-        ""); \r
-\r
-  // General tab\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (wave_radios[0]),\r
-        "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "\r
-        "x sin(Y)",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (wave_radios[1]),\r
-        "Builds a surface with ridges parallel to the vertical axis.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (wave_radios[2]),\r
-        "Builds a surface with ridges parallel to the horizontal axis.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (wave_radios[3]),\r
-        "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "\r
-        "tab to select the image. GenSurf only supports 256-color (8 bit) "\r
-        "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "\r
-        "more intuitive.",\r
-        "" ); \r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (wave_radios[4]),\r
-        "Builds a random surface using the Plasma Cloud technique. Variance is controlled "\r
-        "by the Roughness input. To build a surface with completely random values not "\r
-        "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")),\r
-        "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "\r
-        "size or 2 times the grid size will result in 0 amplitudes. For best results, the "\r
-        "wavelength value should be at least 4 times the grid size (extents divided by the "\r
-        "number of divisions",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")),\r
-        "Enter the height of hills/ridges.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")),\r
-        "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "\r
-        "is used as a variance in the fractal calculations.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")),\r
-        "Seed value for the pseudo-random number generator.",\r
-        "");\r
-  // Extents tab\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")),\r
-        "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "\r
-        "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "\r
-        "the extents (maximum-minimum values) in a given direction should be evenly "\r
-        "divisible by the number of divisions in that direction.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")),\r
-        "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "\r
-        "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "\r
-        "the extents (maximum-minimum values) in a given direction should be evenly "\r
-        "divisible by the number of divisions in that direction.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")),\r
-        "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "\r
-        "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "\r
-        "the extents (maximum-minimum values) in a given direction should be evenly "\r
-        "divisible by the number of divisions in that direction.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")),\r
-        "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "\r
-        "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "\r
-        "the extents (maximum-minimum values) in a given direction should be evenly "\r
-        "divisible by the number of divisions in that direction.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")),\r
-        "Number of divisions in the horizontal direction. For best results, the extents "\r
-        "in a given direction should be evenly divisible by the number of divisions in "\r
-        "that direction.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")),\r
-        "Number of divisions in the vertical direction. For best results, the extents "\r
-        "in a given direction should be evenly divisible by the number of divisions in "\r
-        "that direction.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")),\r
-        "Produce one or more curved patches in the shape of your selected surface rather "\r
-        "than producing solid brushes. Depending on the size of your surface (and the "\r
-        "user's graphic detail settings, which you cannot control), curved surfaces will "\r
-        "be represented in the game by a very large number of polygons. Read the warnings "\r
-        "concerning curved surfaces on the GenSurf web page before using this feature.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")),\r
-        "Use the slider to control the number of vertices discarded by GenSurf. For many "\r
-        "surfaces, you can produce roughly the same shape surface with a high decimation "\r
-        "value. This will generally result in a map with lower polygon counts (and better "\r
-        "in-game performance). However, this feature should NOT be used for large terrain "\r
-        "surfaces in Q3",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")),\r
-        "Enter the height of the surface at the lower left corner. This value will likely "\r
-        "be modified unless \"Linear Borders\" is checked.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")),\r
-        "Enter the height of the surface at the upper left corner. This value will likely "\r
-        "be modified unless \"Linear Borders\" is checked.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")),\r
-        "Enter the height of the surface at the lower right corner. This value will likely "\r
-        "be modified unless \"Linear Borders\" is checked.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")),\r
-        "Enter the height of the surface at the upper right corner. This value will likely "\r
-        "be modified unless \"Linear Borders\" is checked.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")),\r
-        "Restrict the edges of the surface to a straight line. This will help match up "\r
-        "brush edges if you drop this surface into another map.",\r
-        "");\r
-  // Bitmap tab\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")),\r
-        "Type the name of an 8-bit bitmap image file, or click Browse to select an image "\r
-        "from a list of those available on your system.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")),\r
-        "Select a bitmap image file from a list of those available on your system.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_reload")),\r
-        "Reload the selected bitmap file after making changes in an external image editor.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")),\r
-        "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "\r
-        "images, color 0 is normally black.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")),\r
-        "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "\r
-        "images, color 255 is normally white.",\r
-        "");\r
-  // Fixpoints tab\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),\r
-        "Enter a value for the selected vertex. This value will not be adjusted when applying "\r
-        "a waveform or roughness to the surface. Unlock this vertex (so that it will be "\r
-        "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "\r
-        "the \"Range affected\" of this vertex.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")),\r
-        "Enter the range away from the selected vertex that other vertices will be affected. "\r
-        "Use 0 if you don't want other vertices to be influenced by the currently selected "\r
-        "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "\r
-        "a completely different method for determining values.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")),\r
-        "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "\r
-        "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "\r
-        "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "\r
-        "set to -30 and 30, respectively. Note that this entry will have no effect unless "\r
-        "you also specify a \"range affected\".",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")),\r
-        "Click this to free (unlock the value of) the currently selected vertex.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")),\r
-        "Click this to free (unlock the values of) all vertices.",\r
-        "");\r
-  // Texture tab\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")),\r
-        "Enter the name of the texture or shader used for the surface faces.",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")),\r
-        "Enter the name of the texture or shader used for faces other than the surface. Under "\r
-        "normal circumstances this should be \"common/caulk\"",\r
-        "");\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")),\r
-        "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "\r
-        "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "\r
-        "all surface faces will use the texture specified by \"Surface\".",\r
-        "");\r
-\r
-  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),\r
-        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")),\r
-        "Check this box to use the detail content property on the generated brushes. Compile "\r
-        "times will be considerably shorter if the detail property is used, though the surface "\r
-        "will not block visibility at all. If you use the detail property, you should make sure "\r
-        "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "\r
-        "much higher than necessary.",\r
-        "");\r
-}\r
-\r
-// =============================================================================\r
-// create main dialog\r
-\r
-GtkWidget* create_main_dialog ()\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;\r
-  GtkWidget *check, *spin, *radio, *label, *entry, *scale;\r
-  GtkObject *adj;\r
-  GSList *group;\r
-  int i;\r
-  char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };\r
-  char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",\r
-                        "From bitmap", "Fractal" };\r
-  char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",\r
-                           "Wall facing 180","Wall facing 270" }; \r
-\r
-  g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), gszCaption);\r
-  g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL);\r
-  //  g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);\r
-  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd));\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), hbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
-  notebook = gtk_notebook_new ();\r
-  gtk_widget_show (notebook);\r
-  gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);\r
-  g_signal_connect (G_OBJECT (notebook), "switch_page",\r
-                      G_CALLBACK (switch_page), NULL);\r
-  gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);\r
-  g_object_set_data (G_OBJECT (dlg), "notebook", notebook);\r
-\r
-  table = gtk_table_new (2, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("General");\r
-  gtk_widget_show (label);\r
-  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);\r
-\r
-  frame = gtk_frame_new ("Game");\r
-  gtk_widget_show (frame);\r
-  gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-\r
-  vbox = gtk_vbox_new (TRUE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (frame), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  for (i = 0, group = NULL; i < NUMGAMES; i++)\r
-  {\r
-    radio = gtk_radio_button_new_with_label (group, games[i]);\r
-    gtk_widget_show (radio);\r
-    gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);\r
-    group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));\r
-    game_radios[i] = radio;\r
-    g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i));\r
-  }\r
-\r
-  frame = gtk_frame_new ("Waveform");\r
-  gtk_widget_show (frame);\r
-  gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-\r
-  vbox = gtk_vbox_new (TRUE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (frame), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  for (i = 0, group = NULL; i < 5; i++)\r
-  {\r
-    radio = gtk_radio_button_new_with_label (group, waveforms[i]);\r
-    gtk_widget_show (radio);\r
-    gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);\r
-    group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));\r
-    wave_radios[i] = radio;\r
-    g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i));\r
-  }\r
-\r
-  frame = gtk_frame_new ("Orientation");\r
-  gtk_widget_show (frame);\r
-  gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-\r
-  vbox = gtk_vbox_new (TRUE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (frame), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  for (i = 0, group = NULL; i < 6; i++)\r
-  {\r
-    radio = gtk_radio_button_new_with_label (group, orientations[i]);\r
-    gtk_widget_show (radio);\r
-    gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);\r
-    group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));\r
-    plane_radios[i] = radio;\r
-    g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i));\r
-  }\r
-\r
-  table2 = gtk_table_new (4, 2, FALSE);\r
-  gtk_widget_show (table2);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table2), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table2), 5);\r
-  gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-\r
-  label = gtk_label_new ("Wavelength:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
-\r
-  label = gtk_label_new ("Max. amplitude:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
-\r
-  label = gtk_label_new ("Roughness:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
-\r
-  label = gtk_label_new ("Random seed:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "wavelength", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "amplitude", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "roughness", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness);\r
-\r
-  adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 10);\r
-  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL);\r
-  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  gtk_widget_show (spin);\r
-  gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (spin, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "random", spin);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  label = gtk_label_new ("Extents");\r
-  gtk_widget_show (label);\r
-  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
-\r
-  hbox2 = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox2);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);\r
-\r
-  frame = gtk_frame_new ("Extents");\r
-  gtk_widget_show (frame);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);\r
-\r
-  table = gtk_table_new (3, 4, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
-  gtk_container_add (GTK_CONTAINER (frame), table);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("X:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "hmin_text", label);\r
-\r
-  label = gtk_label_new ("X:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "hmax_text", label);\r
-\r
-  label = gtk_label_new ("Y:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "vmin_text", label);\r
-\r
-  label = gtk_label_new ("Y:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "vmax_text", label);\r
-\r
-  label = gtk_label_new ("Lower-left");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  label = gtk_label_new ("Upper-right");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "hmin", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "hmax", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "vmin", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "vmax", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur);\r
-\r
-  frame = gtk_frame_new ("Divisions");\r
-  gtk_widget_show (frame);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);\r
-\r
-  table = gtk_table_new (2, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
-  gtk_container_add (GTK_CONTAINER (frame), table);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("X:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "nh_text", label);\r
-\r
-  label = gtk_label_new ("Y:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "nv_text", label);\r
-\r
-  adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);\r
-  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH);\r
-  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  gtk_widget_show (spin);\r
-  gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (spin, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "nh", spin);\r
-\r
-  adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);\r
-  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV);\r
-  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  gtk_widget_show (spin);\r
-  gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (spin, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "nv", spin);\r
-\r
-  check = gtk_check_button_new_with_label ("Use Bezier patches");\r
-  gtk_widget_show (check);\r
-  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "use_patches", check);\r
-  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL);\r
-\r
-       // ^Fishman - Snap to grid, replaced scroll bar with a texbox.\r
-       label = gtk_label_new ("Snap to grid:");\r
-  gtk_widget_show (label);\r
-       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
-  gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label);\r
-\r
-       adj = gtk_adjustment_new (8, 0, 256, 1, 10, 10);\r
-  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP);\r
-  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  gtk_widget_show (spin);\r
-       gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);\r
-  gtk_widget_set_usize (spin, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "sp", spin);\r
-       // ^Fishman - End of Snap to grid code.\r
-\r
-  hbox2 = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox2);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10);\r
-\r
-  label = gtk_label_new ("Decimate:");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);\r
-\r
-  adj = gtk_adjustment_new (0, 0, 110, 1, 10, 10);\r
-  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj);\r
-  scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));\r
-  gtk_widget_show (scale);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0);\r
-  gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT);\r
-  gtk_scale_set_digits (GTK_SCALE (scale), 0);\r
-  g_object_set_data (G_OBJECT (dlg), "decimate", scale);\r
-\r
-  frame = gtk_frame_new ("Corner values");\r
-  gtk_widget_show (frame);\r
-  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);\r
-\r
-  table = gtk_table_new (3, 4, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
-  gtk_container_add (GTK_CONTAINER (frame), table);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("Upper-left:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  label = gtk_label_new ("Lower-left:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  label = gtk_label_new ("Upper-right:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  label = gtk_label_new ("Lower-right:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "z01", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "z00", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "z11", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "z10", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10);\r
-\r
-  check = gtk_check_button_new_with_label ("Linear borders");\r
-  gtk_widget_show (check);\r
-  gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "linearborder", check);\r
-  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 10);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  label = gtk_label_new ("Bitmap");\r
-  gtk_widget_show (label);\r
-  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
-\r
-  label = gtk_label_new ("");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_note", label);\r
-\r
-  table = gtk_table_new (2, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
-  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("Filename:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_text1", label);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_file", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL);\r
-\r
-  hbox2 = gtk_hbox_new (TRUE, 5);\r
-  gtk_widget_show (hbox2);\r
-  gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (0),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-\r
-  button = gtk_button_new_with_label ("Browse...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL);\r
-\r
-  button = gtk_button_new_with_label ("Reload");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_reload", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL);\r
-\r
-  table = gtk_table_new (2, 2, TRUE);\r
-  gtk_widget_show (table);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
-  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("Map color 0 to:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_text2", label);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
-\r
-  label = gtk_label_new ("Map color 255 to:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_text3", label);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);\r
-\r
-  hbox2 = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox2);\r
-  gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_black", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value);\r
-\r
-  hbox2 = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox2);\r
-  gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);\r
-  gtk_widget_set_usize (entry, 50, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "bmp_white", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 10);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  label = gtk_label_new ("Fix Points");\r
-  gtk_widget_show (label);\r
-  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
-\r
-  label = gtk_label_new ("Click on a vertex in the lower half of the preview window,\n"\r
-                         "then use the arrow keys or text box to assign a value.\n"\r
-                         "Use Ctrl+Click to select multiple vertices/toggle a\n"\r
-                         "selection. Use Shift+Click to select a range of vertices.\n\n"\r
-                         "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"\r
-                         "affected\" will be influenced by this vertex.");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
-\r
-  table = gtk_table_new (3, 3, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
-  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("Value:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_value_text", label);\r
-\r
-  label = gtk_label_new ("Range affected:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_range_text", label);\r
-\r
-  label = gtk_label_new ("Rate of change:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label);\r
-\r
-  adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 16);\r
-  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL);\r
-  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  gtk_widget_show (spin);\r
-  gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND),\r
-                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);\r
-  gtk_widget_set_usize (spin, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_value", spin);\r
-  g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_range", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_rate", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL);\r
-\r
-  button = gtk_button_new_with_label ("Free");\r
-  gtk_widget_show (button);\r
-  gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_free", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL);\r
-\r
-  button = gtk_button_new_with_label ("Free All");\r
-  gtk_widget_show (button);\r
-  gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "fix_freeall", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 10);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  label = gtk_label_new ("Texture");\r
-  gtk_widget_show (label);\r
-  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);\r
-\r
-       // ^Fishman - Modified to add more labels and textboxes.\r
-       table = gtk_table_new (5, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("Surface:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-  label = gtk_label_new ("Other:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-  label = gtk_label_new ("Steep:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "texture1", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0));\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "texture2", entry);\r
-  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1));\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "texture3", entry);\r
-\r
-  hbox2 = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox2);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);\r
-\r
-  label = gtk_label_new ("\"Steep\" angle:");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);\r
-\r
-  adj = gtk_adjustment_new (60, 0, 90, 1, 10, 10);\r
-  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  gtk_widget_show (spin);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "tex_slant", spin);\r
-\r
-  table = gtk_table_new (2, 4, TRUE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  label = gtk_label_new ("Offset <h,v>");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  label = gtk_label_new ("Scale <h,v>");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "texoffsety", entry);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "texscalex", entry);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-  gtk_widget_set_usize (entry, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "texscaley", entry);\r
-\r
-\r
-\r
-  check = gtk_check_button_new_with_label ("Use detail brushes");\r
-  gtk_widget_show (check);\r
-  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "detail", check);\r
-  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL);\r
-\r
-  check = gtk_check_button_new_with_label ("Detail hint brushes");\r
-  gtk_widget_show (check);\r
-  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "hint", check);\r
-  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL);\r
-\r
-       // ^Fishman - Add terrain key to func_group.\r
-       check = gtk_check_button_new_with_label ("Add terrain key");\r
-  gtk_widget_show (check);\r
-  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "terrain_ent", check);\r
-  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);\r
-\r
-  button = gtk_button_new_with_label ("OK");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-  g_object_set_data (G_OBJECT (dlg), "go", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL);\r
-\r
-  label = gtk_label_new ("Settings:");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
-\r
-  button = gtk_button_new_with_label ("Open...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "open", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL);\r
-\r
-  button = gtk_button_new_with_label ("Save as...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "save", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL);\r
-\r
-  button = gtk_button_new_with_label ("Defaults");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "defaults", button);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL);\r
-\r
-  button = gtk_button_new_with_label ("About...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);\r
-  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL);\r
-\r
-  check = gtk_check_button_new_with_label ("Preview");\r
-  gtk_widget_show (check);\r
-  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
-  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "main_preview", check);\r
-\r
-       // ^Fishman - Antializing for the preview window.\r
-  check = gtk_check_button_new_with_label ("Antialised lines");\r
-  gtk_widget_show (check);\r
-  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);\r
-       g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check);\r
-  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL);\r
-\r
-  for (i = 0; i < 5; i++)\r
-    SetDlgValues (i);\r
-\r
-  CreateViewWindow ();\r
-\r
-  create_tooltips();\r
-\r
-  FirstPassComplete = 1;\r
-\r
-  return dlg;\r
-}\r
-\r
-\r
-#if 0\r
-\r
-HWND hwndDisplay = (HWND)NULL;\r
-HWND ghwndTab    = (HWND)NULL;\r
-int  iTab=0;\r
-RECT rcTab;\r
-FILE *ftex;\r
-\r
-char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};\r
-char GenSurfBoard[40]={"http://tarot.telefragged.com/board"};\r
-\r
-/*\r
-* AboutDlgProc - processes messages for the about dialog.\r
-*/\r
-\r
-qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )\r
-{\r
-       char           szText[256];\r
-       DRAWITEMSTRUCT *dis;\r
-       HDC            hdc;\r
-       HPEN           hpen;\r
-       HWND           hwndURL;\r
-       RECT           rc;\r
-       SIZE           size;\r
-\r
-       lparam = lparam;                                        /* turn off warning */\r
-\r
-       switch( msg ) {\r
-       case WM_INITDIALOG:\r
-               strcpy(szText,"About " );\r
-               strcat(szText,gszCaption);\r
-               SetWindowText(hwnd,gszCaption);\r
-               SetDlgItemText(hwnd,DLG_ABOUT_APP,szText);\r
-               /*      Application icon: */\r
-               SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,\r
-                       STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"),\r
-                       (LPARAM) NULL);\r
-\r
-               hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL);\r
-               hdc = GetDC(hwndURL);\r
-               GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size);\r
-               ReleaseDC(hwndURL,hdc);\r
-               GetWindowRect(hwndURL,&rc);\r
-               SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,\r
-                       SWP_NOMOVE | SWP_NOZORDER);\r
-\r
-               hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD);\r
-               hdc = GetDC(hwndURL);\r
-               GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size);\r
-               ReleaseDC(hwndURL,hdc);\r
-               GetWindowRect(hwndURL,&rc);\r
-               SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,\r
-                       SWP_NOMOVE | SWP_NOZORDER);\r
-\r
-               return TRUE;\r
-\r
-       case WM_COMMAND:\r
-               switch(LOWORD(wparam))\r
-               {\r
-               case DLG_ABOUT_URL:\r
-                       HTTP(GenSurfURL);\r
-                       break;\r
-               case DLG_ABOUT_BOARD:\r
-                       HTTP(GenSurfBoard);\r
-                       break;\r
-               case IDOK:\r
-                       EndDialog(hwnd,1);\r
-                       return TRUE;\r
-               }\r
-               break;\r
-\r
-       case WM_DRAWITEM:\r
-               if(wparam == DLG_ABOUT_URL)\r
-               {\r
-                       dis = (LPDRAWITEMSTRUCT)lparam;\r
-                       SetTextColor(dis->hDC,RGB(0,0,255));\r
-                       TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL));\r
-                       GetWindowRect(dis->hwndItem,&rc);\r
-                       GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size);\r
-                       hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));\r
-                       SelectObject(dis->hDC,hpen);\r
-                       MoveToEx(dis->hDC,0,size.cy,NULL);\r
-                       LineTo(dis->hDC,size.cx,size.cy);\r
-                       SelectObject(dis->hDC,GetStockObject(BLACK_PEN));\r
-                       DeleteObject(hpen);\r
-               }\r
-               else if(wparam==DLG_ABOUT_BOARD)\r
-               {\r
-                       dis = (LPDRAWITEMSTRUCT)lparam;\r
-                       SetTextColor(dis->hDC,RGB(0,0,255));\r
-                       TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard));\r
-                       GetWindowRect(dis->hwndItem,&rc);\r
-                       GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size);\r
-                       hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));\r
-                       SelectObject(dis->hDC,hpen);\r
-                       MoveToEx(dis->hDC,0,size.cy,NULL);\r
-                       LineTo(dis->hDC,size.cx,size.cy);\r
-                       SelectObject(dis->hDC,GetStockObject(BLACK_PEN));\r
-                       DeleteObject(hpen);\r
-               }\r
-               break;\r
-\r
-       case WM_CLOSE:\r
-               EndDialog(hwnd,1);\r
-               return TRUE;\r
-\r
-       default:\r
-               return FALSE;\r
-       }\r
-       return FALSE;\r
-       \r
-} /* AboutDlgProc */\r
-\r
-void About()\r
-{\r
-       if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0)\r
-       {\r
-               char Text[256];\r
-               sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError());\r
-               MessageBox(ghwnd_main,Text,"GenSurf",MB_ICONEXCLAMATION);\r
-       }\r
-}\r
-\r
-#endif \r
+/*
+GenSurf plugin for GtkRadiant
+Copyright (C) 2001 David Hyde, Loki software and qeradiant.com
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "gensurf.h"
+
+#define GENERAL_TAB   0
+#define EXTENTS_TAB   1
+#define BITMAP_TAB    2
+#define FIXPOINTS_TAB 3
+#define TEXTURE_TAB   4
+//#define BUFF_SIZE    32768
+
+#define ENABLE_WIDGET(name,enable) \
+  gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), (name))), (enable))
+#define CHECK_WIDGET(name,check) \
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), name)), check)
+
+static GtkWidget *game_radios[NUMGAMES];
+static GtkWidget *wave_radios[5];
+static GtkWidget *plane_radios[6];
+static guint current_tab;
+static int OldPreview;
+static int WasDetail;
+static GtkTooltips *tooltips;
+static int FirstPassComplete = 0;
+
+void About (GtkWidget *parent)
+{
+/*
+  char *icon_xpm[] = {
+"32 32 4 1",
+"      c None",
+".     c #000000",
+"+     c #FFFFFF",
+"@     c #838183",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"...............++...............",
+".............++++++.............",
+"............++@+++@+............",
+"..........+++..++..+++..........",
+"........++.+.++..++.+.@+........",
+".......+..+..+.++.+..+..++......",
+".....++..++.+..++..+.++..++.....",
+"...++..++...+.+..+.++..++..++...",
+"..++.+.++....++..++....++.+..+..",
+".+.+..+..++....++....++..++.+.+.",
+"..+++....+.++++++++++.+....+++..",
+"....++.@@+++++.++.++++@++.++....",
+"......+++++++......++@+++++.....",
+".......+++.+.++..++.+..++.......",
+".........++..+.++.+..++.........",
+"...........++..++..++...........",
+".............++..+.+............",
+"..............+..+@.............",
+"...............@@...............",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"
+};
+*/
+  // leo: I'm too lazy to create a nice about box
+       // ^Fishman - I am lazy too :P.
+  g_FuncTable.m_pfnMessageBox (parent, "GtkGenSurf 1.05\n\n"
+                               "Original version\n"
+                                                                                                                        "David Hyde (rascal@vicksburg.com)\n\n"
+                                                                                                                        "Porting\n"
+                               "Leonardo Zide (leo@lokigames.com)\n\n"
+                                                                                                                        "Enhancements\n"
+                                                                                                                        "Pablo Zurita (pablo@qeradiant.com)\n"
+                                                                                                                        "Hydra (hydra@hydras-world.com)",
+                               "About GtkGenSurf", MB_OK);
+}
+
+// =============================================================================
+// main dialog
+
+static void SetupControls ()
+{
+  switch (current_tab)
+  {
+  case GENERAL_TAB:
+    break;
+
+  case EXTENTS_TAB:
+    if (Game != QUAKE3)
+    {
+      gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
+      ENABLE_WIDGET ("use_patches", FALSE);
+    }
+    else
+    {
+      gtk_widget_show (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")));
+      ENABLE_WIDGET ("use_patches", TRUE);
+    }
+
+    if (Game == QUAKE3 && UsePatches != 0)
+    {
+      ENABLE_WIDGET ("decimate", FALSE);
+    }
+               gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "snap_text")), "Snap to grid:"); // ^Fishman - Snap to grid.
+    break;
+
+  case BITMAP_TAB:
+    if (WaveType != WAVE_BITMAP)
+    {
+      ENABLE_WIDGET ("bmp_file", FALSE);
+      ENABLE_WIDGET ("bmp_file_browse", FALSE);
+      ENABLE_WIDGET ("bmp_black", FALSE);
+      ENABLE_WIDGET ("bmp_white", FALSE);
+      ENABLE_WIDGET ("bmp_text1", FALSE);
+      ENABLE_WIDGET ("bmp_text2", FALSE);
+      ENABLE_WIDGET ("bmp_text3", FALSE);
+      ENABLE_WIDGET ("bmp_reload", FALSE);
+      gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
+                          "These options are disabled unless \"From Bitmap\"\n"
+                          "is selected as the Waveform on the General tab.");
+    }
+    else
+    {
+      ENABLE_WIDGET ("bmp_file", TRUE);
+      ENABLE_WIDGET ("bmp_file_browse", TRUE);
+      ENABLE_WIDGET ("bmp_black", TRUE);
+      ENABLE_WIDGET ("bmp_white", TRUE);
+      ENABLE_WIDGET ("bmp_text1", TRUE);
+      ENABLE_WIDGET ("bmp_text2", TRUE);
+      ENABLE_WIDGET ("bmp_text3", TRUE);
+      ENABLE_WIDGET ("bmp_reload", strlen(gbmp.name) != 0);
+      gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "bmp_note")),
+                          "GenSurf works only with 8-bit bitmaps. Color indices are\n"
+                          "mapped to values for each vertex. Generally, gray scale\n"
+                          "images are stored with black as color 0, white as color 255.");
+    }
+    break;
+
+  case FIXPOINTS_TAB:
+    ENABLE_WIDGET ("fix_value", (NumVerticesSelected != 0));
+    ENABLE_WIDGET ("fix_value_text", (NumVerticesSelected != 0));
+    ENABLE_WIDGET ("fix_free", (NumVerticesSelected != 0));
+    ENABLE_WIDGET ("fix_range", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
+    ENABLE_WIDGET ("fix_range_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
+    ENABLE_WIDGET ("fix_rate", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
+    ENABLE_WIDGET ("fix_rate_text", ((NumVerticesSelected != 0) && (WaveType != WAVE_ROUGH_ONLY)));
+    break;
+
+  case TEXTURE_TAB:
+    ENABLE_WIDGET ("texture2", (UsePatches == 0));
+    ENABLE_WIDGET ("texture3", (UsePatches == 0));
+    ENABLE_WIDGET ("tex_slant", (UsePatches == 0));
+    ENABLE_WIDGET ("detail", (UsePatches == 0));
+    if (Game != QUAKE3 )
+               {
+                       ENABLE_WIDGET ("terrain_ent", FALSE); // ^Fishman - Adds terrain key to func_group.
+      ENABLE_WIDGET ("hint", (UsePatches == 0));
+               }
+    break;
+  }
+
+  switch (WaveType)
+  {
+  case WAVE_HCYLINDER:
+  case WAVE_VCYLINDER:
+    ENABLE_WIDGET ("amplitude", TRUE);
+    ENABLE_WIDGET ("wavelength", TRUE);
+    ENABLE_WIDGET ("z00", TRUE);
+    ENABLE_WIDGET ("z01", TRUE);
+    ENABLE_WIDGET ("z10", TRUE);
+    ENABLE_WIDGET ("z11", TRUE);
+    ENABLE_WIDGET ("linearborder", TRUE);
+    ENABLE_WIDGET ("go", TRUE);
+    break;
+  case WAVE_BITMAP:
+    ENABLE_WIDGET ("amplitude", FALSE);
+    ENABLE_WIDGET ("wavelength", FALSE);
+    ENABLE_WIDGET ("z00", FALSE);
+    ENABLE_WIDGET ("z01", FALSE);
+    ENABLE_WIDGET ("z10", FALSE);
+    ENABLE_WIDGET ("z11", FALSE);
+    ENABLE_WIDGET ("linearborder", FALSE);
+    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
+    break;
+  case WAVE_ROUGH_ONLY:
+    ENABLE_WIDGET ("amplitude", FALSE);
+    ENABLE_WIDGET ("wavelength", FALSE);
+    ENABLE_WIDGET ("z00", TRUE);
+    ENABLE_WIDGET ("z01", TRUE);
+    ENABLE_WIDGET ("z10", TRUE);
+    ENABLE_WIDGET ("z11", TRUE);
+    ENABLE_WIDGET ("linearborder", TRUE);
+    ENABLE_WIDGET ("go", TRUE);
+    break;
+  default:
+    ENABLE_WIDGET ("amplitude", TRUE);
+    ENABLE_WIDGET ("wavelength", TRUE);
+    ENABLE_WIDGET ("z00", TRUE);
+    ENABLE_WIDGET ("z01", TRUE);
+    ENABLE_WIDGET ("z10", TRUE);
+    ENABLE_WIDGET ("z11", TRUE);
+    ENABLE_WIDGET ("linearborder", TRUE);
+    ENABLE_WIDGET ("go", TRUE);
+  }
+
+  switch (Plane)
+  {
+  case PLANE_XZ0:
+  case PLANE_XZ1:
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
+    break;
+  case PLANE_YZ0:
+  case PLANE_YZ1:
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "Y:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "Y:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Z:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Z:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "Y:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Z:");
+    break;
+  default:
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmin_text")), "X:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "hmax_text")), "X:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmin_text")), "Y:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "vmax_text")), "Y:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nh_text")), "X:");
+    gtk_label_set_text (GTK_LABEL (g_object_get_data (G_OBJECT (g_pWnd), "nv_text")), "Y:");
+    break;
+  }
+}
+
+// SetDlgValues fills in text boxes and initializes other input controls
+static void SetDlgValues (int tab)
+{
+  char Text[256];
+  char RForm[16] = "%.5g";
+  int i;
+
+  switch (tab)
+  {
+  case GENERAL_TAB:
+    // Hell if I know why, but in the release build the 2nd pass thru the
+    // set_sensitive loop for game_radios crashes. No need to do this more
+    // than once anyhow.
+    if (!FirstPassComplete)
+    {
+      for (i = 0; i < NUMGAMES; i++)
+        gtk_widget_set_sensitive (game_radios[i], (i == Game ? TRUE : FALSE));
+      for (i = 0; i < 6; i++)
+        gtk_widget_set_sensitive (plane_radios[i], (i == Plane ? TRUE : FALSE));
+    }
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (game_radios[Game]), TRUE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plane_radios[Plane]), TRUE);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wave_radios[WaveType]), TRUE);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "random")),
+                               RandomSeed);
+    sprintf (Text, RForm, WaveLength);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")), Text);
+    sprintf (Text, RForm, Amplitude);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")), Text);
+    sprintf (Text, RForm, Roughness);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness")), Text);
+               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
+                                                     (G_OBJECT (g_pWnd), "main_antialiasing")), Antialiasing);
+    break;
+
+  case EXTENTS_TAB:
+    sprintf (Text,RForm,Hll);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmin")), Text);
+    sprintf (Text,RForm,Vll);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmin")), Text);
+    sprintf (Text,RForm,Hur);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "hmax")), Text);
+    sprintf (Text,RForm,Vur);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "vmax")), Text);
+    sprintf (Text,RForm,Z00);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z00")), Text);
+    sprintf (Text,RForm,Z01);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z01")), Text);
+    sprintf (Text,RForm,Z10);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z10")), Text);
+    sprintf (Text,RForm,Z11);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "z11")), Text);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "sp")), SP); // ^Fishman - Snap to grid.
+
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
+                                                     (G_OBJECT (g_pWnd), "linearborder")), FixBorders);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data
+                                                     (G_OBJECT (g_pWnd), "use_patches")), UsePatches);
+    gtk_adjustment_set_value (GTK_ADJUSTMENT (g_object_get_data (G_OBJECT (g_pWnd), "decimate_adj")),
+                              Decimate);
+
+    if (Game == QUAKE3 && UsePatches)
+    {
+      gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), FALSE);
+
+      if (NH % 2)
+      {
+        NH++;
+        if (NH > MAX_ROWS) NH -= 2;
+        SetDlgValues (current_tab);
+      }
+
+      if (NV % 2)
+      {
+        NV++;
+        if (NV > MAX_ROWS) NV -= 2;
+        SetDlgValues (current_tab);
+      }
+      if (NH % 2 ) NH++;
+      if (NH < 2 ) NH = 2;
+      if (NH > MAX_ROWS) NH = MAX_ROWS;
+      if (NV % 2 ) NV++;
+      if (NV < 2 ) NV = 2;
+      if (NV > MAX_ROWS) NV = MAX_ROWS;
+
+      gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
+      GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
+      adj->lower = 2;
+      gtk_adjustment_changed (adj);
+      spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
+      adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
+      adj->lower = 2;
+      gtk_adjustment_changed (adj);
+    }
+    else
+    {
+      gtk_widget_set_sensitive (GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")), TRUE);
+
+      gpointer spin = g_object_get_data (G_OBJECT (g_pWnd), "nh");
+      GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
+      adj->lower = 1;
+      gtk_adjustment_changed (adj);
+      spin = g_object_get_data (G_OBJECT (g_pWnd), "nv");
+      adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));
+      adj->lower = 1;
+      gtk_adjustment_changed (adj);
+    }
+
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nh")), NH);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "nv")), NV);
+
+    break;
+
+  case BITMAP_TAB:
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")), gbmp.name);
+    sprintf(Text,"%g",gbmp.black_value);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")), Text);
+    sprintf(Text,"%g",gbmp.white_value);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")), Text);
+    break;
+
+  case FIXPOINTS_TAB:
+    break;
+
+  case TEXTURE_TAB:
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture1")), Texture[Game][0]);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture2")), Texture[Game][1]);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texture3")), Texture[Game][2]);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "tex_slant")),
+                               SlantAngle);
+    sprintf(Text,RForm,TexOffset[0]);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsetx")), Text);
+    sprintf(Text,RForm,TexOffset[1]);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texoffsety")), Text);
+    sprintf(Text,RForm,TexScale[0]);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscalex")), Text);
+    sprintf(Text,RForm,TexScale[1]);
+    gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "texscaley")), Text);
+    CHECK_WIDGET ("detail", UseDetail);
+
+    if (Game==QUAKE3)
+    {
+      ENABLE_WIDGET ("hint", FALSE);
+      AddHints=0;
+    }
+    else
+      ENABLE_WIDGET ("hint", TRUE);
+    CHECK_WIDGET ("hint", AddHints);
+
+    /*
+    if (Game==SIN)
+    {
+      // ArghRad doesn't currently support SiN
+      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
+      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
+      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
+      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
+      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
+      SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
+      SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
+    }
+    */
+
+    if(Game==QUAKE3)
+    {
+      /*
+      // ArghRad sun is inapplicable (so far)
+      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
+      EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
+      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
+      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
+      ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
+      // No ladders in Q3
+      EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);
+      ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);
+      SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pk3 file");
+      SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"PK3:");
+      */
+    }
+
+/*trix if(Game==HERETIC2)
+               {
+                       // ArghRad doesn't currently support Heretic2
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
+
+                       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use pak file");
+                       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Pak:");
+               } */
+    /*
+               if(Game==HALFLIFE)
+               {
+                       // A bunch of controls aren't applicable to HL
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), 0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE_BROWSE), SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE2_BROWSE),SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_TEXTURE3_BROWSE),SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_DETAIL),         SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_LADDER),         SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
+
+                       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use wad file");
+                       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Wad:");
+                       SetDlgItemText(hwndDisplay,DLG_HINT,"Hint brushes");
+               }
+
+               if(Game==GENESIS3D)
+               {
+                       // No Q2-type compilers support Genesis3D (including ArghRad)
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       0);
+                       EnableWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  0);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_TEXT),  SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2),       SW_HIDE);
+                       ShowWindow(GetDlgItem(hwndDisplay,DLG_ARGHRAD2_SPIN),  SW_HIDE);
+
+                       SetDlgItemText(hwndDisplay,DLG_TEX_USEPAK,"Use sin file");
+                       SetDlgItemText(hwndDisplay,DLG_TEX_PAK_TEXT,"Sin:");
+               }
+    */
+    break;
+  }
+  SetupControls ();
+}
+
+static void ReadDlgValues (int tab)
+{
+  //  char Text[256];
+  //  int i;
+
+  switch (tab)
+  {
+  case GENERAL_TAB:
+    gpointer spin;
+    Roughness  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "roughness"))));
+    WaveLength = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "wavelength"))));
+    Amplitude  = atof ( gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "amplitude"))));
+    spin = g_object_get_data (G_OBJECT (g_pWnd), "random");
+    RandomSeed = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
+    break;
+
+  case EXTENTS_TAB:
+               SP = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "sp"))));
+    NH = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nh"))));
+    NV = atoi (gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "nv"))));
+
+    if (Game == QUAKE3 && UsePatches != 0)
+    {
+      if (NH % 2 ) NH++;
+      if (NH < 2 ) NH = 2;
+      if (NH > MAX_ROWS) NH = MAX_ROWS;
+      if (NV % 2 ) NV++;
+      if (NV < 2 ) NV = 2;
+      if (NV > MAX_ROWS) NV = MAX_ROWS;
+    }
+    break;
+
+#if 0
+  case BITMAP_TAB:
+
+    if (WaveType == WAVE_BITMAP)
+    {
+      GetDlgItemText(hwnd,DLG_BMP_FILE,gbmp.name,sizeof(gbmp.name));
+      CheckValidDIB(hwnd);
+      GetDlgItemText(hwnd,DLG_BMP_BLACK,Text,sizeof(Text));
+      gbmp.black_value = atof(Text);
+      GetDlgItemText(hwnd,DLG_BMP_WHITE,Text,sizeof(Text));
+      gbmp.white_value = atof(Text);
+      UpdatePreview(TRUE);
+    }
+    break;
+
+  case FIXPOINTS_TAB:
+    GetDlgItemText(hwnd,DLG_FIX_VALUE,Text,sizeof(Text));
+    temp.fixed_value = atoi(Text);
+    GetDlgItemText(hwnd,DLG_FIX_RANGE,Text,sizeof(Text));
+    temp.range = atoi(Text);
+    GetDlgItemText(hwnd,DLG_FIX_RATE, Text,sizeof(Text));
+    temp.rate = atof(Text);
+    for(k=0; k<NumVerticesSelected; k++)
+    {
+      xyz[Vertex[k].i][Vertex[k].j].fixed_value = temp.fixed_value;
+      xyz[Vertex[k].i][Vertex[k].j].range       = temp.range;
+      xyz[Vertex[k].i][Vertex[k].j].rate        = temp.rate;
+    }
+    if(!OldPreview)
+    {
+      Preview = 0;
+      CheckDlgButton(ghwnd,DLG_PREVIEW,0);
+      SendMessage(ghwnd,WM_COMMAND,DLG_PREVIEW,0);
+    }
+    VertexMode = 0;
+    UpdatePreview(TRUE);
+    break;
+
+  case TEXTURE_TAB:
+    if(UsePak[Game])
+    {
+      i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETCURSEL, 0, 0 );
+      if(i == CB_ERR)
+        Texture[Game][0][0] = '\0';
+      else
+        SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST1, CB_GETLBTEXT, i,
+          (LPARAM)(LPCSTR)Texture[Game][0]);
+
+      i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETCURSEL, 0, 0 );
+      if(i == CB_ERR)
+        Texture[Game][1][0] = '\0';
+      else
+        SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST2, CB_GETLBTEXT, i,
+          (LPARAM)(LPCSTR)Texture[Game][1]);
+
+      i = SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETCURSEL, 0, 0 );
+      if(i == CB_ERR)
+        Texture[Game][2][0] = '\0';
+      else
+        SendDlgItemMessage( hwndDisplay, DLG_TEX_LIST3, CB_GETLBTEXT, i,
+          (LPARAM)(LPCSTR)Texture[Game][2]);
+    }
+    else
+    {
+      GetDlgItemText(hwndDisplay,DLG_TEXTURE, Texture[Game][0],sizeof(Texture[Game][0]));
+      GetDlgItemText(hwndDisplay,DLG_TEXTURE2,Texture[Game][1],sizeof(Texture[Game][1]));
+      GetDlgItemText(hwndDisplay,DLG_TEXTURE3,Texture[Game][2],sizeof(Texture[Game][2]));
+    }
+    GetDlgItemText(hwndDisplay,DLG_TEX_SLANT,Text,sizeof(Text));
+    SlantAngle = atoi(Text);
+    SlantAngle = max(0,min(SlantAngle,90));
+    GetDlgItemText(hwndDisplay,DLG_TEXOFFSETX,Text,sizeof(Text));
+    TexOffset[0] = atof(Text);
+    GetDlgItemText(hwndDisplay,DLG_TEXOFFSETY,Text,sizeof(Text));
+    TexOffset[1] = atof(Text);
+    GetDlgItemText(hwndDisplay,DLG_TEXSCALEX,Text,sizeof(Text));
+    TexScale[0] = atof(Text);
+    if(TexScale[0] == 0.) TexScale[0] = 1.0;
+    GetDlgItemText(hwndDisplay,DLG_TEXSCALEY,Text,sizeof(Text));
+    TexScale[1] = atof(Text);
+    if(TexScale[1] == 0.) TexScale[1] = 1.0;
+    GetDlgItemText(hwndDisplay,DLG_ARGHRAD2,Text,sizeof(Text));
+    ArghRad2 = atoi(Text);
+    break;
+#endif
+  }
+}
+
+// =============================================================================
+// main dialog callbacks
+
+static void switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)
+{
+  if (current_tab != page_num)
+  {
+    if (page_num == FIXPOINTS_TAB)
+    {
+      OldPreview = Preview;
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
+                                                                            "main_preview")), TRUE);
+      VertexMode = 1;
+      UpdatePreview (true);
+      NumVerticesSelected = 0;
+    }
+
+    if (current_tab == FIXPOINTS_TAB)
+    {
+      if (!OldPreview)
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (g_pWnd),
+                                                                              "main_preview")), FALSE);
+      VertexMode = 0;
+      UpdatePreview (true);
+      NumVerticesSelected = 0;
+    }
+
+    if (page_num == TEXTURE_TAB)
+    {
+      WasDetail = UseDetail;
+      if (AddHints)
+      {
+        UseDetail = 1;
+        ENABLE_WIDGET ("detail", FALSE);
+      }
+    }
+
+    ReadDlgValues (current_tab);
+    current_tab = page_num;
+    SetDlgValues (current_tab);
+  }
+}
+
+static gint main_close (GtkWidget *widget, gpointer data)
+{
+  gtk_widget_hide (g_pWnd);
+  gtk_widget_hide (g_pWndPreview);
+
+  return TRUE;
+}
+
+static void main_save (GtkWidget *widget, gpointer data)
+{
+  ReadDlgValues (current_tab);
+  SaveSetup (g_pWnd);
+}
+
+static void main_open (GtkWidget *widget, gpointer data)
+{
+  OpenSetup (g_pWnd, 0);
+  for (int i = 0; i < 5; i++)
+    SetDlgValues (i);
+  ShowPreview ();
+}
+
+static void main_defaults (GtkWidget *widget, gpointer data)
+{
+  OpenSetup (g_pWnd, 1);
+  for (int i = 0; i < 5; i++)
+    SetDlgValues (i);
+  ShowPreview ();
+}
+
+static void main_preview (GtkWidget *widget, gpointer data)
+{
+  Preview = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+  ShowPreview ();
+}
+
+// ^Fishman - Antializing for the preview window.
+static void main_antialiasing (GtkWidget *widget, gpointer data)
+{
+       Antialiasing = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+       UpdatePreview (true);
+}
+
+static void main_about (GtkWidget *widget, gpointer data)
+{
+  About (g_pWnd);
+}
+
+static void main_go (GtkWidget *widget, gpointer data)
+{
+  GtkWidget *notebook = GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "notebook"));
+  char Text[256];
+
+  ReadDlgValues (current_tab);
+  if (NH < 1 || NH > MAX_ROWS)
+  {
+    sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
+    g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION);
+    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
+    return;
+  }
+
+  if (NV < 1 || NV > MAX_ROWS)
+  {
+    sprintf (Text, "The number of divisions must be > 0 and no greater than %d.", MAX_ROWS);
+    g_FuncTable.m_pfnMessageBox (g_pWnd, Text, "GenSurf", MB_ICONEXCLAMATION);
+    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
+    return;
+  }
+
+  if (Hll >= Hur)
+  {
+    g_FuncTable.m_pfnMessageBox (g_pWnd, "The \"lower-left\" values must be less than "
+                                 "the corresponding \"upper-right\" values in "
+                                 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION);
+    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
+    return;
+  }
+
+  if (Vll >= Vur)
+  {
+    g_FuncTable.m_pfnMessageBox (g_pWnd,"The \"lower-left\" values must be less than "
+                                 "the corresponding \"upper-right\" values in "
+                                 "the \"Extent\" box.","GenSurf", MB_OK | MB_ICONEXCLAMATION);
+    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
+    return;
+  }
+
+  if (!strlen (Texture[Game][0]))
+  {
+    g_FuncTable.m_pfnMessageBox (g_pWnd, "You must supply a texture name.", "GenSurf", MB_ICONEXCLAMATION);
+    gtk_notebook_set_page (GTK_NOTEBOOK (notebook), EXTENTS_TAB);
+    return;
+  }
+
+/*  if (Decimate>0 && GimpHints!=0)
+  {
+    MessageBox(hwnd,"You've elected to use a decimated grid and gimp's non-detail hint brushes. "
+               "This combination usually produces bizarre visual errors in the game, "
+               "so GenSurf has turned off the hint brush option.",
+               "GenSurf",MB_ICONEXCLAMATION);
+    GimpHints = 0;
+  } */
+
+  gtk_widget_hide (g_pWnd);
+  if (g_pWndPreview)
+    gtk_widget_hide (g_pWndPreview);
+
+  GenerateMap();
+  WriteIniFile(gszIni);
+}
+
+// =============================================================================
+// general tab callbacks
+
+static void general_game (GtkToggleButton *widget, gpointer data)
+{
+  if (gtk_toggle_button_get_active (widget))
+  {
+    Game = GPOINTER_TO_INT (data);
+    UpdatePreview (TRUE);
+  }
+}
+
+static void general_plane (GtkToggleButton *widget, gpointer data)
+{
+  if (gtk_toggle_button_get_active (widget))
+  {
+    Plane = GPOINTER_TO_INT (data);
+    SetupControls ();
+    UpdatePreview (TRUE);
+  }
+}
+
+static void general_wave (GtkToggleButton *widget, gpointer data)
+{
+  if (gtk_toggle_button_get_active (widget))
+  {
+    WaveType = GPOINTER_TO_INT (data);
+    SetupControls ();
+    UpdatePreview (TRUE);
+  }
+}
+
+static void general_random (GtkAdjustment *adj, gpointer data)
+{
+  int nPos = (int)adj->value;
+
+  if (RandomSeed != nPos)
+  {
+    RandomSeed = nPos;
+    UpdatePreview (true);
+  }
+}
+
+// =============================================================================
+// extents tab callbacks
+
+static void extents_linearborder (GtkToggleButton *check, gpointer data)
+{
+  FixBorders = gtk_toggle_button_get_active (check);
+  UpdatePreview (true);
+}
+
+static void extents_use_patches (GtkToggleButton *check, gpointer data)
+{
+  if (Game != QUAKE3)
+    return;
+
+  UsePatches = gtk_toggle_button_get_active (check);
+  SetDlgValues (current_tab);
+  SetupControls ();
+  UpdatePreview (true);
+}
+
+static void extents_nhnv_spin (GtkAdjustment *adj, int *data)
+{
+  int nPos = (int)adj->value;
+
+  if (*data != nPos)
+  {
+    if (Game==QUAKE3 && UsePatches && (nPos % 2))
+    {
+      if (*data < nPos)
+        *data += 2;
+      else
+        *data -= 2;
+      gtk_adjustment_set_value (adj, *data);
+    }
+    else
+      *data = nPos;
+    UpdatePreview (true);
+  }
+}
+
+static void extents_decimate (GtkAdjustment *adj, gpointer data)
+{
+  int nPos = (int)adj->value;
+
+  Decimate = nPos;
+  UpdatePreview (true);
+}
+
+// Hydra : snap to grid begin
+/*static void extents_snaptogrid (GtkAdjustment *adj, gpointer data)
+{
+  int nPos = (int)adj->value;
+
+  SnapToGrid = nPos;
+  UpdatePreview (true);
+}*/
+
+// ^Fishman - Modified version of Hydra's snap to grid code.
+static void extents_snaptogrid_spin (GtkAdjustment *adj, int *data)
+{
+       int nPos = (int)adj->value;
+       SnapToGrid = nPos;
+       UpdatePreview (true);
+}
+
+// =============================================================================
+// bitmap tab callbacks
+
+static gint bitmap_file_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
+{
+  char filename[NAME_MAX];
+
+  strcpy (filename, gtk_entry_get_text (GTK_ENTRY(widget)));
+  if(strcmp (filename,gbmp.name))
+  {
+    if (gbmp.colors)
+    {
+      free(gbmp.colors);
+      gbmp.colors=NULL;
+    }
+    strcpy (gbmp.name,filename);
+    if (strlen(gbmp.name) )
+      OpenBitmap ();
+    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
+  }
+  return FALSE;
+}
+
+static void bitmap_browse (GtkWidget *widget, gpointer data)
+{
+  const char *filename;
+  char *ptr;
+
+  filename = g_FuncTable.m_pfnFileDialog (g_pWnd, TRUE, "Bitmap File", gbmp.defpath);
+
+  if (filename != NULL)
+  {
+    strcpy (gbmp.name, filename);
+
+    ptr = strrchr (filename, G_DIR_SEPARATOR);
+    if (ptr != NULL)
+    {
+      *(ptr+1) = '\0';
+      strcpy (gbmp.defpath, filename);
+    }
+
+    OpenBitmap ();
+    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
+  }
+}
+
+static void bitmap_reload (GtkWidget *widget, gpointer data)
+{
+  strcpy (gbmp.name, gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file"))));
+  if(strlen (gbmp.name) )
+  {
+    OpenBitmap ();
+    ENABLE_WIDGET ("go", (gbmp.colors != NULL ? TRUE : FALSE));
+  }
+  else
+    ENABLE_WIDGET ("go", FALSE );
+}
+
+// =============================================================================
+// fix points tab callbacks
+
+static gint fix_value_entryfocusout (GtkWidget* widget, GdkEventFocus *event, gpointer data)
+{
+  int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
+  char Text[32];
+
+  if (i < -65536 || i > 65536)
+  {
+    gdk_beep ();
+    g_FuncTable.m_pfnMessageBox (g_pWnd, "The value must be between -65536 and 65536, inclusive.",
+                                 "GenSurf", MB_OK | MB_ICONEXCLAMATION);
+    sprintf (Text, "%d", (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
+    gtk_entry_set_text (GTK_ENTRY(widget), Text);
+    gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (widget)), widget);
+  }
+  else if (i != xyz[Vertex[0].i][Vertex[0].j].fixed_value)
+  {
+    for(k=0; k<NumVerticesSelected; k++)
+      xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
+
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
+                               (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
+    UpdatePreview (true);
+  }
+  return FALSE;
+}
+
+static void fix_value_changed (GtkAdjustment *adj, gpointer data)
+{
+  int k, i = (int)adj->value;
+
+  if (xyz[Vertex[0].i][Vertex[0].j].fixed_value != i)
+  {
+    for(k=0; k<NumVerticesSelected; k++)
+      xyz[Vertex[k].i][Vertex[k].j].fixed_value = i;
+    UpdatePreview(true);
+  }
+}
+
+static gint fix_range_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
+{
+  int i = atoi (gtk_entry_get_text (GTK_ENTRY(widget))), k;
+
+  if (i != xyz[Vertex[0].i][Vertex[0].j].range)
+  {
+    for (k=0; k<NumVerticesSelected; k++)
+      xyz[Vertex[k].i][Vertex[k].j].range = i;
+    UpdatePreview (true);
+  }
+  return FALSE;
+}
+
+static gint fix_rate_entryfocusout (GtkWidget *widget, GdkEventFocus *event, gpointer data)
+{
+  double r = atof (gtk_entry_get_text (GTK_ENTRY(widget)));
+  int k;
+
+  if (r != xyz[Vertex[0].i][Vertex[0].j].rate)
+  {
+    for(k=0; k<NumVerticesSelected; k++)
+      xyz[Vertex[k].i][Vertex[k].j].rate = r;
+    UpdatePreview (true);
+  }
+  return FALSE;
+}
+
+static void fix_free (GtkWidget *widget, gpointer data)
+{
+  int k;
+
+  for (k=0; k<NumVerticesSelected; k++)
+    xyz[Vertex[k].i][Vertex[k].j].fixed = 0;
+  NumVerticesSelected = 0;
+  SetupControls ();
+  UpdatePreview (true);
+}
+
+static void fix_freeall (GtkWidget *widget, gpointer data)
+{
+  int i, j;
+
+  for (i=0; i<=NH; i++)
+  {
+    for(j=0; j<=NV; j++)
+      xyz[i][j].fixed = 0;
+  }
+  fix_free (NULL, data); // keep these together
+}
+
+void vertex_selected ()
+{
+  char Text[32];
+  int k;
+
+  SetupControls ();
+
+  switch(Plane)
+  {
+  case PLANE_XZ0:
+  case PLANE_XZ1:
+    for(k=0; k<NumVerticesSelected; k++)
+      xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[1];
+    break;
+  case PLANE_YZ0:
+  case PLANE_YZ1:
+    for(k=0; k<NumVerticesSelected; k++)
+      xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[0];
+    break;
+  default:
+    for(k=0; k<NumVerticesSelected; k++)
+      xyz[Vertex[k].i][Vertex[k].j].fixed_value = xyz[Vertex[0].i][Vertex[0].j].p[2];
+    break;
+  }
+
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
+                             (int)xyz[Vertex[0].i][Vertex[0].j].fixed_value);
+
+  sprintf(Text,"%d",(int)xyz[Vertex[0].i][Vertex[0].j].range);
+  gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")), Text);
+  sprintf(Text,"%.5g",xyz[Vertex[0].i][Vertex[0].j].rate);
+  gtk_entry_set_text (GTK_ENTRY (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")), Text);
+
+  for (k=0; k<NumVerticesSelected; k++)
+    xyz[Vertex[k].i][Vertex[k].j].fixed = 1;
+
+  UpdatePreview (true);
+}
+
+// =============================================================================
+// texture tab callbacks
+
+static void texture_detail (GtkToggleButton *check, gpointer data)
+{
+  UseDetail = gtk_toggle_button_get_active (check);
+  WasDetail = UseDetail;
+}
+
+static void texture_hint (GtkToggleButton *check, gpointer data)
+{
+  AddHints = gtk_toggle_button_get_active (check);
+  if (AddHints == 1)
+  {
+    UseDetail = 1;
+    ENABLE_WIDGET ("detail", FALSE);
+  }
+  else
+  {
+    UseDetail = WasDetail;
+    ENABLE_WIDGET ("detail", FALSE);
+  }
+  CHECK_WIDGET ("detail", UseDetail);
+}
+
+// ^Fishman - Add terrain key to func_group.
+static void texture_terrainent (GtkToggleButton *check, gpointer data)
+{
+       AddTerrainKey = gtk_toggle_button_get_active (check);
+}
+
+static void texture_set(int index, const char* name)
+{
+  strcpy(Texture[Game][index], name);
+}
+
+static gint texture_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
+{
+  texture_set(GPOINTER_TO_INT(data), gtk_entry_get_text(GTK_ENTRY(widget)));
+  return FALSE;
+}
+
+// =============================================================================
+// misc stuff
+
+static void UpdateVariable (GtkEntry *entry, GdkEventFocus *event, double *data)
+{
+  double x = atof (gtk_entry_get_text (entry));
+
+  if (x != *data)
+  {
+    *data = x;
+    UpdatePreview (true);
+  }
+}
+
+static gint doublevariable_entryfocusout(GtkWidget* widget, GdkEventFocus* event, gpointer data)
+{
+  UpdateVariable(GTK_ENTRY(widget), event, reinterpret_cast<double*>(data));
+  return FALSE;
+}
+
+// =============================================================================
+// create tooltips
+
+void create_tooltips ()
+{
+  tooltips = gtk_tooltips_new ();
+
+  // Main
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "go")),
+        "Accept all input and generate a surface in Q3Radiant",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "open")),
+        "Open a previously saved GenSurf settings file.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "save")),
+        "Save all settings to a file.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "defaults")),
+        "Restore default values from DEFAULTS.SRF. If this file does not exist, GenSurf "
+        "initializes all input parameters to reasonable values. You can create your own "
+        "default surface by setting all parameters to your liking, then saving a settings "
+        "file as DEFAULTS.SRF with the Save As button.",
+        "");
+
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_preview")),
+        "View a wire-frame representation of the surface",
+        "");
+
+       gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "main_antialiasing")),
+        "The lines in the preview window are antialiased for better quality",
+        ""); 
+
+  // General tab
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (wave_radios[0]),
+        "Builds a surface with alternating hills and valleys. Uses the general form Z=cos(X) "
+        "x sin(Y)",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (wave_radios[1]),
+        "Builds a surface with ridges parallel to the vertical axis.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (wave_radios[2]),
+        "Builds a surface with ridges parallel to the horizontal axis.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (wave_radios[3]),
+        "Builds a map from a bitmap image representing a contour plot. Click the \"Bitmap\" "
+        "tab to select the image. GenSurf only supports 256-color (8 bit) "
+        "bitmaps. GenSurf will work with any 256-color bitmap, but gray scale bitmaps are a bit "
+        "more intuitive.",
+        "" ); 
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (wave_radios[4]),
+        "Builds a random surface using the Plasma Cloud technique. Variance is controlled "
+        "by the Roughness input. To build a surface with completely random values not "
+        "dependent on neighboring vertices, use one of the other waveforms with 0 amplitude.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "wavelength")),
+        "Enter the wavelength (distance between crests). NOTE: Wavelengths equal to the grid "
+        "size or 2 times the grid size will result in 0 amplitudes. For best results, the "
+        "wavelength value should be at least 4 times the grid size (extents divided by the "
+        "number of divisions",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "amplitude")),
+        "Enter the height of hills/ridges.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "roughness")),
+        "Enter the roughness value (noise) for the surface. For fractal surfaces, this value "
+        "is used as a variance in the fractal calculations.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "random")),
+        "Seed value for the pseudo-random number generator.",
+        "");
+  // Extents tab
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmin")),
+        "Minimum horizontal coordinate of the surface, i.e. X for a surface parallel to "
+        "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
+        "the extents (maximum-minimum values) in a given direction should be evenly "
+        "divisible by the number of divisions in that direction.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "hmax")),
+        "Maximum horizontal coordinate of the surface, i.e. X for a surface parallel to "
+        "the XY or XZ planes, Y for a surface parallel to the YZ plane. For best results, "
+        "the extents (maximum-minimum values) in a given direction should be evenly "
+        "divisible by the number of divisions in that direction.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmin")),
+        "Minimum vertical coordinate of the surface, i.e. Y for a surface parallel to "
+        "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
+        "the extents (maximum-minimum values) in a given direction should be evenly "
+        "divisible by the number of divisions in that direction.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "vmax")),
+        "Maximum vertical coordinate of the surface, i.e. Y for a surface parallel to "
+        "the XY plane, Z for a surface parallel to the XZ or YZ planes. For best results, "
+        "the extents (maximum-minimum values) in a given direction should be evenly "
+        "divisible by the number of divisions in that direction.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nh")),
+        "Number of divisions in the horizontal direction. For best results, the extents "
+        "in a given direction should be evenly divisible by the number of divisions in "
+        "that direction.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "nv")),
+        "Number of divisions in the vertical direction. For best results, the extents "
+        "in a given direction should be evenly divisible by the number of divisions in "
+        "that direction.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "use_patches")),
+        "Produce one or more curved patches in the shape of your selected surface rather "
+        "than producing solid brushes. Depending on the size of your surface (and the "
+        "user's graphic detail settings, which you cannot control), curved surfaces will "
+        "be represented in the game by a very large number of polygons. Read the warnings "
+        "concerning curved surfaces on the GenSurf web page before using this feature.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "decimate")),
+        "Use the slider to control the number of vertices discarded by GenSurf. For many "
+        "surfaces, you can produce roughly the same shape surface with a high decimation "
+        "value. This will generally result in a map with lower polygon counts (and better "
+        "in-game performance). However, this feature should NOT be used for large terrain "
+        "surfaces in Q3",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z00")),
+        "Enter the height of the surface at the lower left corner. This value will likely "
+        "be modified unless \"Linear Borders\" is checked.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z01")),
+        "Enter the height of the surface at the upper left corner. This value will likely "
+        "be modified unless \"Linear Borders\" is checked.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z10")),
+        "Enter the height of the surface at the lower right corner. This value will likely "
+        "be modified unless \"Linear Borders\" is checked.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "z11")),
+        "Enter the height of the surface at the upper right corner. This value will likely "
+        "be modified unless \"Linear Borders\" is checked.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "linearborder")),
+        "Restrict the edges of the surface to a straight line. This will help match up "
+        "brush edges if you drop this surface into another map.",
+        "");
+  // Bitmap tab
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file")),
+        "Type the name of an 8-bit bitmap image file, or click Browse to select an image "
+        "from a list of those available on your system.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_file_browse")),
+        "Select a bitmap image file from a list of those available on your system.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_reload")),
+        "Reload the selected bitmap file after making changes in an external image editor.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_black")),
+        "Enter the value corresponding to color index 0 in the bitmap file. For gray scale "
+        "images, color 0 is normally black.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "bmp_white")),
+        "Enter the value corresponding to color index 255 in the bitmap file. For gray scale "
+        "images, color 255 is normally white.",
+        "");
+  // Fixpoints tab
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_value")),
+        "Enter a value for the selected vertex. This value will not be adjusted when applying "
+        "a waveform or roughness to the surface. Unlock this vertex (so that it will be "
+        "adjusted normally) by clicking \"Free\". This vertex will influence vertices within "
+        "the \"Range affected\" of this vertex.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_range")),
+        "Enter the range away from the selected vertex that other vertices will be affected. "
+        "Use 0 if you don't want other vertices to be influenced by the currently selected "
+        "one. Note: this box is disabled if you've chosen the fractal generator, as it uses "
+        "a completely different method for determining values.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_rate")),
+        "Enter a rate of change for the surface affected by the fixed value. 0 gives a smooth "
+        "sinusoidal curve, values less than 0 give progressively sharper spikes, and values "
+        "greater than 0 take on a square shape. Values less than -30 or greater than 30 are "
+        "set to -30 and 30, respectively. Note that this entry will have no effect unless "
+        "you also specify a \"range affected\".",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_free")),
+        "Click this to free (unlock the value of) the currently selected vertex.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "fix_freeall")),
+        "Click this to free (unlock the values of) all vertices.",
+        "");
+  // Texture tab
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture1")),
+        "Enter the name of the texture or shader used for the surface faces.",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture2")),
+        "Enter the name of the texture or shader used for faces other than the surface. Under "
+        "normal circumstances this should be \"common/caulk\"",
+        "");
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "texture3")),
+        "Enter the name of the texture or shader used for \"steep\" surface faces, where \"steep\" "
+        "is the angle specified below. If this entry is left blank or if the \"steep\" angle is 0, "
+        "all surface faces will use the texture specified by \"Surface\".",
+        "");
+
+  gtk_tooltips_set_tip(GTK_TOOLTIPS (tooltips),
+        GTK_WIDGET (g_object_get_data (G_OBJECT (g_pWnd), "detail")),
+        "Check this box to use the detail content property on the generated brushes. Compile "
+        "times will be considerably shorter if the detail property is used, though the surface "
+        "will not block visibility at all. If you use the detail property, you should make sure "
+        "that \"common/caulk\" is used for the non-surface faces, or the polygon count will be "
+        "much higher than necessary.",
+        "");
+}
+
+// =============================================================================
+// create main dialog
+
+GtkWidget* create_main_dialog ()
+{
+  GtkWidget *dlg, *vbox, *hbox, *hbox2, *button, *notebook, *frame, *table, *table2;
+  GtkWidget *check, *spin, *radio, *label, *entry, *scale;
+  GtkObject *adj;
+  GSList *group;
+  int i;
+  char *games[] = { "Quake 2", "Half-Life", "SiN", "Heretic 2", "Kingpin", "Genesis3D", "Quake 3 Arena" };
+  char *waveforms[] = { "Alternating hill/valley", "Cylindrical left-to-right", "Cylindrical top-to-bottom",
+                        "From bitmap", "Fractal" };
+  char *orientations[] = { "Ground surface", "Ceiling", "Wall facing 0", "Wall facing 90",
+                           "Wall facing 180","Wall facing 270" }; 
+
+  g_pWnd = dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (dlg), gszCaption);
+  g_signal_connect (G_OBJECT (dlg), "delete_event", G_CALLBACK (main_close), NULL);
+  //  g_signal_connect (G_OBJECT (dlg), "destroy", G_CALLBACK (gtk_widget_destroy), NULL);
+  gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pRadiantWnd));
+
+  hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (hbox);
+  gtk_container_add (GTK_CONTAINER (dlg), hbox);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
+
+  notebook = gtk_notebook_new ();
+  gtk_widget_show (notebook);
+  gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
+  g_signal_connect (G_OBJECT (notebook), "switch_page",
+                      G_CALLBACK (switch_page), NULL);
+  gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
+  g_object_set_data (G_OBJECT (dlg), "notebook", notebook);
+
+  table = gtk_table_new (2, 2, FALSE);
+  gtk_widget_show (table);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("General");
+  gtk_widget_show (label);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table, label);
+
+  frame = gtk_frame_new ("Game");
+  gtk_widget_show (frame);
+  gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+
+  vbox = gtk_vbox_new (TRUE, 5);
+  gtk_widget_show (vbox);
+  gtk_container_add (GTK_CONTAINER (frame), vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+  for (i = 0, group = NULL; i < NUMGAMES; i++)
+  {
+    radio = gtk_radio_button_new_with_label (group, games[i]);
+    gtk_widget_show (radio);
+    gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
+    group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
+    game_radios[i] = radio;
+    g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_game), GINT_TO_POINTER (i));
+  }
+
+  frame = gtk_frame_new ("Waveform");
+  gtk_widget_show (frame);
+  gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+
+  vbox = gtk_vbox_new (TRUE, 5);
+  gtk_widget_show (vbox);
+  gtk_container_add (GTK_CONTAINER (frame), vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+  for (i = 0, group = NULL; i < 5; i++)
+  {
+    radio = gtk_radio_button_new_with_label (group, waveforms[i]);
+    gtk_widget_show (radio);
+    gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
+    group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
+    wave_radios[i] = radio;
+    g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_wave), GINT_TO_POINTER (i));
+  }
+
+  frame = gtk_frame_new ("Orientation");
+  gtk_widget_show (frame);
+  gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+
+  vbox = gtk_vbox_new (TRUE, 5);
+  gtk_widget_show (vbox);
+  gtk_container_add (GTK_CONTAINER (frame), vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+  for (i = 0, group = NULL; i < 6; i++)
+  {
+    radio = gtk_radio_button_new_with_label (group, orientations[i]);
+    gtk_widget_show (radio);
+    gtk_box_pack_start (GTK_BOX (vbox), radio, TRUE, TRUE, 0);
+    group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
+    plane_radios[i] = radio;
+    g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (general_plane), GINT_TO_POINTER (i));
+  }
+
+  table2 = gtk_table_new (4, 2, FALSE);
+  gtk_widget_show (table2);
+  gtk_table_set_row_spacings (GTK_TABLE (table2), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table2), 5);
+  gtk_table_attach (GTK_TABLE (table), table2, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+
+  label = gtk_label_new ("Wavelength:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
+
+  label = gtk_label_new ("Max. amplitude:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
+
+  label = gtk_label_new ("Roughness:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
+
+  label = gtk_label_new ("Random seed:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "wavelength", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &WaveLength);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "amplitude", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Amplitude);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table2), entry, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "roughness", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Roughness);
+
+  adj = gtk_adjustment_new (1, 1, 32767, 1, 10, 10);
+  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (general_random), NULL);
+  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+  gtk_widget_show (spin);
+  gtk_table_attach (GTK_TABLE (table2), spin, 1, 2, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (spin, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "random", spin);
+
+  vbox = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+  label = gtk_label_new ("Extents");
+  gtk_widget_show (label);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+  hbox2 = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (hbox2);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
+
+  frame = gtk_frame_new ("Extents");
+  gtk_widget_show (frame);
+  gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
+
+  table = gtk_table_new (3, 4, FALSE);
+  gtk_widget_show (table);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+  gtk_container_add (GTK_CONTAINER (frame), table);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("X:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "hmin_text", label);
+
+  label = gtk_label_new ("X:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "hmax_text", label);
+
+  label = gtk_label_new ("Y:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "vmin_text", label);
+
+  label = gtk_label_new ("Y:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "vmax_text", label);
+
+  label = gtk_label_new ("Lower-left");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  label = gtk_label_new ("Upper-right");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "hmin", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hll);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "hmax", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Hur);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "vmin", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vll);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "vmax", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Vur);
+
+  frame = gtk_frame_new ("Divisions");
+  gtk_widget_show (frame);
+  gtk_box_pack_start (GTK_BOX (hbox2), frame, TRUE, TRUE, 0);
+
+  table = gtk_table_new (2, 2, FALSE);
+  gtk_widget_show (table);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+  gtk_container_add (GTK_CONTAINER (frame), table);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("X:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "nh_text", label);
+
+  label = gtk_label_new ("Y:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "nv_text", label);
+
+  adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
+  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NH);
+  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+  gtk_widget_show (spin);
+  gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (spin, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "nh", spin);
+
+  adj = gtk_adjustment_new (8, 1, MAX_ROWS, 1, 10, 10);
+  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_nhnv_spin), &NV);
+  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+  gtk_widget_show (spin);
+  gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (spin, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "nv", spin);
+
+  check = gtk_check_button_new_with_label ("Use Bezier patches");
+  gtk_widget_show (check);
+  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "use_patches", check);
+  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_use_patches), NULL);
+
+       // ^Fishman - Snap to grid, replaced scroll bar with a texbox.
+       label = gtk_label_new ("Snap to grid:");
+  gtk_widget_show (label);
+       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+  gtk_object_set_data (GTK_OBJECT (dlg), "snap_text", label);
+
+       adj = gtk_adjustment_new (8, 0, 256, 1, 10, 10);
+  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_snaptogrid_spin), &SP);
+  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+  gtk_widget_show (spin);
+       gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, TRUE, 0);
+  gtk_widget_set_usize (spin, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "sp", spin);
+       // ^Fishman - End of Snap to grid code.
+
+  hbox2 = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (hbox2);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 10);
+
+  label = gtk_label_new ("Decimate:");
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+
+  adj = gtk_adjustment_new (0, 0, 110, 1, 10, 10);
+  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (extents_decimate), NULL);
+  g_object_set_data (G_OBJECT (dlg), "decimate_adj", adj);
+  scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));
+  gtk_widget_show (scale);
+  gtk_box_pack_start (GTK_BOX (hbox2), scale, TRUE, TRUE, 0);
+  gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_RIGHT);
+  gtk_scale_set_digits (GTK_SCALE (scale), 0);
+  g_object_set_data (G_OBJECT (dlg), "decimate", scale);
+
+  frame = gtk_frame_new ("Corner values");
+  gtk_widget_show (frame);
+  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
+
+  table = gtk_table_new (3, 4, FALSE);
+  gtk_widget_show (table);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+  gtk_container_add (GTK_CONTAINER (frame), table);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("Upper-left:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  label = gtk_label_new ("Lower-left:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  label = gtk_label_new ("Upper-right:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  label = gtk_label_new ("Lower-right:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "z01", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z01);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "z00", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z00);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "z11", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z11);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "z10", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &Z10);
+
+  check = gtk_check_button_new_with_label ("Linear borders");
+  gtk_widget_show (check);
+  gtk_table_attach (GTK_TABLE (table), check, 0, 4, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "linearborder", check);
+  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (extents_linearborder), NULL);
+
+  vbox = gtk_vbox_new (FALSE, 10);
+  gtk_widget_show (vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+  label = gtk_label_new ("Bitmap");
+  gtk_widget_show (label);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+  label = gtk_label_new ("");
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "bmp_note", label);
+
+  table = gtk_table_new (2, 2, FALSE);
+  gtk_widget_show (table);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("Filename:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "bmp_text1", label);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "bmp_file", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (bitmap_file_entryfocusout), NULL);
+
+  hbox2 = gtk_hbox_new (TRUE, 5);
+  gtk_widget_show (hbox2);
+  gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
+                    (GtkAttachOptions) (0),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+
+  button = gtk_button_new_with_label ("Browse...");
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
+  gtk_widget_set_usize (button, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "bmp_file_browse", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_browse), NULL);
+
+  button = gtk_button_new_with_label ("Reload");
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);
+  gtk_widget_set_usize (button, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "bmp_reload", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (bitmap_reload), NULL);
+
+  table = gtk_table_new (2, 2, TRUE);
+  gtk_widget_show (table);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("Map color 0 to:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "bmp_text2", label);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
+
+  label = gtk_label_new ("Map color 255 to:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  g_object_set_data (G_OBJECT (dlg), "bmp_text3", label);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
+
+  hbox2 = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (hbox2);
+  gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "bmp_black", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.black_value);
+
+  hbox2 = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (hbox2);
+  gtk_table_attach (GTK_TABLE (table), hbox2, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL), 0, 0);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
+  gtk_widget_set_usize (entry, 50, -2);
+  g_object_set_data (G_OBJECT (dlg), "bmp_white", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (doublevariable_entryfocusout), &gbmp.white_value);
+
+  vbox = gtk_vbox_new (FALSE, 10);
+  gtk_widget_show (vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+  label = gtk_label_new ("Fix Points");
+  gtk_widget_show (label);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+  label = gtk_label_new ("Click on a vertex in the lower half of the preview window,\n"
+                         "then use the arrow keys or text box to assign a value.\n"
+                         "Use Ctrl+Click to select multiple vertices/toggle a\n"
+                         "selection. Use Shift+Click to select a range of vertices.\n\n"
+                         "Click \"Free\" to unlock a vertex. Vertices within \"Range\n"
+                         "affected\" will be influenced by this vertex.");
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+
+  table = gtk_table_new (3, 3, FALSE);
+  gtk_widget_show (table);
+  gtk_container_set_border_width (GTK_CONTAINER (table), 5);
+  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("Value:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  g_object_set_data (G_OBJECT (dlg), "fix_value_text", label);
+
+  label = gtk_label_new ("Range affected:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  g_object_set_data (G_OBJECT (dlg), "fix_range_text", label);
+
+  label = gtk_label_new ("Rate of change:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+  g_object_set_data (G_OBJECT (dlg), "fix_rate_text", label);
+
+  adj = gtk_adjustment_new (0, -65536, 65536, 1, 16, 16);
+  g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (fix_value_changed), NULL);
+  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+  gtk_widget_show (spin);
+  gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND),
+                    (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+  gtk_widget_set_usize (spin, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "fix_value", spin);
+  g_signal_connect (G_OBJECT (spin), "focus_out_event", G_CALLBACK (fix_value_entryfocusout), NULL);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "fix_range", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_range_entryfocusout), NULL);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "fix_rate", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK (fix_rate_entryfocusout), NULL);
+
+  button = gtk_button_new_with_label ("Free");
+  gtk_widget_show (button);
+  gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (button, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "fix_free", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_free), NULL);
+
+  button = gtk_button_new_with_label ("Free All");
+  gtk_widget_show (button);
+  gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (button, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "fix_freeall", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (fix_freeall), NULL);
+
+  vbox = gtk_vbox_new (FALSE, 10);
+  gtk_widget_show (vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
+
+  label = gtk_label_new ("Texture");
+  gtk_widget_show (label);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+       // ^Fishman - Modified to add more labels and textboxes.
+       table = gtk_table_new (5, 2, FALSE);
+  gtk_widget_show (table);
+  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("Surface:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+  label = gtk_label_new ("Other:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+  label = gtk_label_new ("Steep:");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "texture1", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (0));
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "texture2", entry);
+  g_signal_connect (G_OBJECT (entry), "focus_out_event", G_CALLBACK(texture_entryfocusout), GINT_TO_POINTER (1));
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "texture3", entry);
+
+  hbox2 = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (hbox2);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
+
+  label = gtk_label_new ("\"Steep\" angle:");
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+
+  adj = gtk_adjustment_new (60, 0, 90, 1, 10, 10);
+  spin = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
+  gtk_widget_show (spin);
+  gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "tex_slant", spin);
+
+  table = gtk_table_new (2, 4, TRUE);
+  gtk_widget_show (table);
+  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+  label = gtk_label_new ("Offset <h,v>");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  label = gtk_label_new ("Scale <h,v>");
+  gtk_widget_show (label);
+  gtk_table_attach (GTK_TABLE (table), label, 2, 4, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "texoffsetx", entry);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "texoffsety", entry);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "texscalex", entry);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND|GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+  gtk_widget_set_usize (entry, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "texscaley", entry);
+
+
+
+  check = gtk_check_button_new_with_label ("Use detail brushes");
+  gtk_widget_show (check);
+  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "detail", check);
+  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_detail), NULL);
+
+  check = gtk_check_button_new_with_label ("Detail hint brushes");
+  gtk_widget_show (check);
+  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "hint", check);
+  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_hint), NULL);
+
+       // ^Fishman - Add terrain key to func_group.
+       check = gtk_check_button_new_with_label ("Add terrain key");
+  gtk_widget_show (check);
+  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "terrain_ent", check);
+  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (texture_terrainent), NULL);
+
+  vbox = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (vbox);
+  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
+
+  button = gtk_button_new_with_label ("OK");
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
+  gtk_widget_set_usize (button, 60, -2);
+  g_object_set_data (G_OBJECT (dlg), "go", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_go), NULL);
+
+  label = gtk_label_new ("Settings:");
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+
+  button = gtk_button_new_with_label ("Open...");
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "open", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_open), NULL);
+
+  button = gtk_button_new_with_label ("Save as...");
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "save", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_save), NULL);
+
+  button = gtk_button_new_with_label ("Defaults");
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
+  g_object_set_data (G_OBJECT (dlg), "defaults", button);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_defaults), NULL);
+
+  button = gtk_button_new_with_label ("About...");
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
+  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (main_about), NULL);
+
+  check = gtk_check_button_new_with_label ("Preview");
+  gtk_widget_show (check);
+  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
+  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_preview), NULL);
+  g_object_set_data (G_OBJECT (dlg), "main_preview", check);
+
+       // ^Fishman - Antializing for the preview window.
+  check = gtk_check_button_new_with_label ("Antialised lines");
+  gtk_widget_show (check);
+  gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 0);
+       g_object_set_data (G_OBJECT (dlg), "main_antialiasing", check);
+  g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (main_antialiasing), NULL);
+
+  for (i = 0; i < 5; i++)
+    SetDlgValues (i);
+
+  CreateViewWindow ();
+
+  create_tooltips();
+
+  FirstPassComplete = 1;
+
+  return dlg;
+}
+
+
+#if 0
+
+HWND hwndDisplay = (HWND)NULL;
+HWND ghwndTab    = (HWND)NULL;
+int  iTab=0;
+RECT rcTab;
+FILE *ftex;
+
+char GenSurfURL[40] = {"http://tarot.telefragged.com/gensurf"};
+char GenSurfBoard[40]={"http://tarot.telefragged.com/board"};
+
+/*
+* AboutDlgProc - processes messages for the about dialog.
+*/
+
+qboolean CALLBACK AboutDlgProc( HWND hwnd, unsigned msg, UINT wparam, LONG lparam )
+{
+       char           szText[256];
+       DRAWITEMSTRUCT *dis;
+       HDC            hdc;
+       HPEN           hpen;
+       HWND           hwndURL;
+       RECT           rc;
+       SIZE           size;
+
+       lparam = lparam;                                        /* turn off warning */
+
+       switch( msg ) {
+       case WM_INITDIALOG:
+               strcpy(szText,"About " );
+               strcat(szText,gszCaption);
+               SetWindowText(hwnd,gszCaption);
+               SetDlgItemText(hwnd,DLG_ABOUT_APP,szText);
+               /*      Application icon: */
+               SendDlgItemMessage( hwnd, DLG_ABOUT_ICON,
+                       STM_SETICON, (WPARAM)(HICON)LoadIcon(ghInst,"GENSURF"),
+                       (LPARAM) NULL);
+
+               hwndURL = GetDlgItem(hwnd,DLG_ABOUT_URL);
+               hdc = GetDC(hwndURL);
+               GetTextExtentPoint(hdc,GenSurfURL,strlen(GenSurfURL),&size);
+               ReleaseDC(hwndURL,hdc);
+               GetWindowRect(hwndURL,&rc);
+               SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
+                       SWP_NOMOVE | SWP_NOZORDER);
+
+               hwndURL = GetDlgItem(hwnd,DLG_ABOUT_BOARD);
+               hdc = GetDC(hwndURL);
+               GetTextExtentPoint(hdc,GenSurfBoard,strlen(GenSurfBoard),&size);
+               ReleaseDC(hwndURL,hdc);
+               GetWindowRect(hwndURL,&rc);
+               SetWindowPos(hwndURL,(HWND)NULL,0,0,size.cx,size.cy+2,
+                       SWP_NOMOVE | SWP_NOZORDER);
+
+               return TRUE;
+
+       case WM_COMMAND:
+               switch(LOWORD(wparam))
+               {
+               case DLG_ABOUT_URL:
+                       HTTP(GenSurfURL);
+                       break;
+               case DLG_ABOUT_BOARD:
+                       HTTP(GenSurfBoard);
+                       break;
+               case IDOK:
+                       EndDialog(hwnd,1);
+                       return TRUE;
+               }
+               break;
+
+       case WM_DRAWITEM:
+               if(wparam == DLG_ABOUT_URL)
+               {
+                       dis = (LPDRAWITEMSTRUCT)lparam;
+                       SetTextColor(dis->hDC,RGB(0,0,255));
+                       TextOut(dis->hDC,0,0,GenSurfURL,strlen(GenSurfURL));
+                       GetWindowRect(dis->hwndItem,&rc);
+                       GetTextExtentPoint(dis->hDC,GenSurfURL,strlen(GenSurfURL),&size);
+                       hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
+                       SelectObject(dis->hDC,hpen);
+                       MoveToEx(dis->hDC,0,size.cy,NULL);
+                       LineTo(dis->hDC,size.cx,size.cy);
+                       SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
+                       DeleteObject(hpen);
+               }
+               else if(wparam==DLG_ABOUT_BOARD)
+               {
+                       dis = (LPDRAWITEMSTRUCT)lparam;
+                       SetTextColor(dis->hDC,RGB(0,0,255));
+                       TextOut(dis->hDC,0,0,GenSurfBoard,strlen(GenSurfBoard));
+                       GetWindowRect(dis->hwndItem,&rc);
+                       GetTextExtentPoint(dis->hDC,GenSurfBoard,strlen(GenSurfBoard),&size);
+                       hpen = CreatePen(PS_SOLID,0,RGB(0,0,255));
+                       SelectObject(dis->hDC,hpen);
+                       MoveToEx(dis->hDC,0,size.cy,NULL);
+                       LineTo(dis->hDC,size.cx,size.cy);
+                       SelectObject(dis->hDC,GetStockObject(BLACK_PEN));
+                       DeleteObject(hpen);
+               }
+               break;
+
+       case WM_CLOSE:
+               EndDialog(hwnd,1);
+               return TRUE;
+
+       default:
+               return FALSE;
+       }
+       return FALSE;
+       
+} /* AboutDlgProc */
+
+void About()
+{
+       if( DialogBox( ghInst,"About", ghwnd_main, (DLGPROC)AboutDlgProc ) < 0)
+       {
+               char Text[256];
+               sprintf(Text,"In About(), GetLastError()=0x%08x",GetLastError());
+               MessageBox(ghwnd_main,Text,"GenSurf",MB_ICONEXCLAMATION);
+       }
+}
+
+#endif