]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/gtkdlgs.cpp
GTK: wrap gtk_widget_set_size_request
[xonotic/netradiant.git] / radiant / gtkdlgs.cpp
index b75b02d14f945c49628652b829f8588221bf46a1..8338c2031e63af34ebce560e0716c76ed40de7a1 100644 (file)
-/*\r
-Copyright (c) 2001, Loki software, inc.\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without modification, \r
-are permitted provided that the following conditions are met:\r
-\r
-Redistributions of source code must retain the above copyright notice, this list \r
-of conditions and the following disclaimer.\r
-\r
-Redistributions in binary form must reproduce the above copyright notice, this\r
-list of conditions and the following disclaimer in the documentation and/or\r
-other materials provided with the distribution.\r
-\r
-Neither the name of Loki software nor the names of its contributors may be used \r
-to endorse or promote products derived from this software without specific prior \r
-written permission. \r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' \r
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \r
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY \r
-DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; \r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS \r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
-*/\r
-\r
-//\r
-// Some small dialogs that don't need much\r
-//\r
-// Leonardo Zide (leo@lokigames.com)\r
-//\r
-\r
-#include "stdafx.h"\r
-#include <gdk/gdkkeysyms.h>\r
-#include <gtk/gtk.h>\r
-\r
-#ifdef _WIN32\r
-#include <gdk/gdkwin32.h>\r
-#endif\r
-\r
-#ifdef _WIN32\r
-#include <shellapi.h>\r
-#endif\r
-\r
-// =============================================================================\r
-// Color selection dialog\r
-\r
-qboolean DoColor (int iIndex)\r
-{\r
-  static bool bColorOpen = false;\r
-   \r
-  if(bColorOpen)\r
-  {\r
-    Sys_FPrintf(SYS_WRN, "DoColor dialog is already open\n");\r
-    return false;\r
-  }\r
-\r
-  bColorOpen = true;  \r
-   \r
-  if (color_dialog (g_pParentWnd->m_pWidget, g_qeglobals.d_savedinfo.colors[iIndex]))\r
-  {\r
-    /* \r
-    ** scale colors so that at least one component is at 1.0F \r
-    ** if this is meant to select an entity color\r
-    */\r
-    if (iIndex == COLOR_ENTITY)\r
-    {\r
-      float largest = 0.0F;\r
-\r
-      if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )\r
-       largest = g_qeglobals.d_savedinfo.colors[iIndex][0];\r
-      if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )\r
-       largest = g_qeglobals.d_savedinfo.colors[iIndex][1];\r
-      if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )\r
-       largest = g_qeglobals.d_savedinfo.colors[iIndex][2];\r
-\r
-      if ( largest == 0.0F )\r
-      {\r
-       g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;\r
-       g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;\r
-       g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;\r
-      }\r
-      else\r
-      {\r
-       float scaler = 1.0F / largest;\r
-\r
-       g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;\r
-       g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;\r
-       g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;\r
-      }\r
-    }\r
-\r
-    Sys_UpdateWindows (W_ALL);\r
-    bColorOpen = false;\r
-    return true;\r
-  }\r
-  else {\r
-    bColorOpen = false;\r
-    return false;\r
-  }\r
-}\r
-\r
-// =============================================================================\r
-// Project settings dialog\r
-\r
-static void UpdateBSPCommandList (GtkWidget *dialog);\r
-\r
-static void DoProjectAddEdit (bool edit, GtkWidget *parent)\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *label, *table, *button;\r
-  GtkWidget *cmd, *text;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  if (edit)\r
-    gtk_window_set_title (GTK_WINDOW (dlg), "Edit Command");\r
-  else\r
-    gtk_window_set_title (GTK_WINDOW (dlg), "Add Command");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  table = gtk_table_new (2, 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 ("Menu text");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-  label = gtk_label_new ("Command");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-  text = gtk_entry_new ();\r
-  g_object_set_data (G_OBJECT (dlg), "text", text);\r
-  gtk_widget_show (text);\r
-  gtk_table_attach (GTK_TABLE (table), text, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_widget_set_usize (text, 300, -2);\r
-\r
-  cmd = gtk_entry_new ();\r
-  g_object_set_data (G_OBJECT (dlg), "cmd", cmd);\r
-  gtk_widget_show (cmd);\r
-  gtk_table_attach (GTK_TABLE (table), cmd, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_widget_set_usize (cmd, 300, -2);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
-  button = gtk_button_new_with_label ("OK");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  if (edit)\r
-  {\r
-    GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(parent), "view"));\r
-    GtkTreeSelection* selection = gtk_tree_view_get_selection(view);\r
-    GtkTreeIter iter;\r
-    GtkTreeModel* model;\r
-    if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
-    {\r
-      char* key;\r
-      gtk_tree_model_get(model, &iter, 0, &key, -1);\r
-      const char* value = ValueForKey (g_qeglobals.d_project_entity, key);\r
-      gtk_entry_set_text (GTK_ENTRY (text), key);\r
-      gtk_entry_set_text (GTK_ENTRY (cmd), value);\r
-      g_free(key);\r
-    }\r
-  }\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    const char* key = gtk_entry_get_text (GTK_ENTRY (text));\r
-    const char* value = gtk_entry_get_text (GTK_ENTRY (cmd));\r
-\r
-    if (strlen (key) <= 0 || strlen (value) <= 0)\r
-    {\r
-      Sys_Printf ("Command not added\n");\r
-    }\r
-    else\r
-    {\r
-      if (edit)\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, key, value);\r
-        FillBSPMenu ();\r
-      }\r
-      else\r
-      {\r
-             if (key[0] == 'b' && key[1] == 's' && key[2] == 'p')\r
-             {\r
-               SetKeyValue (g_qeglobals.d_project_entity, key, value);\r
-               FillBSPMenu ();\r
-             }\r
-             else\r
-               Sys_Printf ("BSP commands must be preceded by \"bsp\"");\r
-      }\r
-\r
-      UpdateBSPCommandList (parent);\r
-    }\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-static void UpdateBSPCommandList (GtkWidget *dialog)\r
-{\r
-  GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT(dialog), "bsp_commands"));\r
-\r
-  gtk_list_store_clear(store);\r
-\r
-  for(epair_t* ep = g_qeglobals.d_project_entity->epairs; ep != NULL; ep = ep->next)\r
-  {\r
-    if(ep->key[0] == 'b' && ep->key[1] == 's' && ep->key[2] == 'p')\r
-    {\r
-      GtkTreeIter iter;\r
-      gtk_list_store_append(store, &iter);\r
-      gtk_list_store_set(store, &iter, 0, ep->key, -1);\r
-    }\r
-  }\r
-}\r
-\r
-static void project_add (GtkWidget *widget, gpointer data)\r
-{\r
-  GtkWidget *dlg = GTK_WIDGET (data);\r
-  DoProjectAddEdit (false, dlg);\r
-  UpdateBSPCommandList (dlg);\r
-}\r
-\r
-static void project_change (GtkWidget *widget, gpointer data)\r
-{\r
-  GtkWidget *dlg = GTK_WIDGET (data);\r
-  DoProjectAddEdit (true, dlg);\r
-  UpdateBSPCommandList (dlg);\r
-}\r
-\r
-static void project_remove (GtkWidget *widget, gpointer data)\r
-{\r
-  GtkWidget* project = GTK_WIDGET(data);\r
-\r
-  GtkTreeView* view = GTK_TREE_VIEW (g_object_get_data (G_OBJECT(project), "view"));\r
-  GtkTreeSelection* selection = gtk_tree_view_get_selection(view);\r
-  GtkTreeIter iter;\r
-  GtkTreeModel* model;\r
-  if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
-  {\r
-    char* key;\r
-    gtk_tree_model_get(model, &iter, 0, &key, -1);\r
-    DeleteKey (g_qeglobals.d_project_entity, key);\r
-    g_free(key);\r
-\r
-    char* index = gtk_tree_model_get_string_from_iter(model, &iter);\r
-    Sys_Printf ("Selected %s\n", index);\r
-    g_free(index);\r
-\r
-    UpdateBSPCommandList(project);\r
-    FillBSPMenu();\r
-  }\r
-}\r
-\r
-static const char* sQ3ComboItem = "Quake III Arena";\r
-static const char* sTAComboItem = "Quake III: Team Arena";\r
-static const char* sModComboItem = "Custom Quake III modification";\r
-static const char* sWolfComboItem = "Return To Castle Wolfenstein";\r
-static const char* sWolfModComboItem = "Custom RTCW modification";\r
-static const char* sHLComboItem = "Half-life";\r
-static const char* sHLModComboItem = "Custom Half-life modification";\r
-\r
-static const char* sWolfSPCombo = "Single Player mapping mode";\r
-static const char* sWolfMPCombo = "Multiplayer mapping mode";\r
-\r
-// Arnout\r
-// HARD-CODED ET HACK\r
-static const char* sETComboItem = "Wolfenstein: Enemy Territory";\r
-static const char* sETModComboItem = "Custom ET modification";\r
-\r
-// RIANT\r
-// HARD-CODED JK2 HACK\r
-static const char* sJK2ComboItem = "Jedi Knight II Outcast";\r
-static const char* sJK2ModComboItem = "Custom JK2 modification";\r
-static const char* sJK2SPCombo = "Single Player mapping mode";\r
-static const char* sJK2MPCombo = "Multiplayer mapping mode";\r
-\r
-// TTimo\r
-// HARD-CODED JA HACK\r
-static const char* sJAComboItem = "Jedi Knight Jedi Academy";\r
-static const char* sJAModComboItem = "Custom JA modification";\r
-static const char* sJASPCombo = "Single Player mapping mode";\r
-static const char* sJAMPCombo = "Multiplayer mapping mode";\r
-\r
-// RIANT\r
-// HARD-CODED STVEF2 HACK\r
-static const char* sSTVEFComboItem = "Star Trek Voyager : Elite Force";\r
-static const char* sSTVEFModComboItem = "Custom Elite Force modification";\r
-static const char* sSTVEFSPCombo = "Single Player mapping mode";\r
-static const char* sSTVEFMPCombo = "Holo Match mapping mode";\r
-\r
-// RIANT\r
-// HARD-CODED SOF2 HACK\r
-static const char* sSOF2ComboItem = "Soldier of Fortune II - Double Helix";\r
-static const char* sSOF2ModComboItem = "Custom Sof2 modification";\r
-static const char* sSOF2SPCombo = "Single Player mapping mode";\r
-static const char* sSOF2MPCombo = "Multiplayer mapping mode";\r
-\r
-static GtkWidget* game_select; // GTK_COMBO\r
-static GtkEntry* fsgame_entry;\r
-\r
-gint OnSelchangeComboWhatgame (GtkWidget *widget, GdkEvent* event, gpointer data)\r
-{\r
-  const char *dir = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(game_select)->entry));\r
-  // HACK: Wolf\r
-  if (g_pGameDescription->mGameFile == "wolf.game")\r
-  {\r
-    if (!strcmp(dir,sWolfComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-\r
-  }\r
-  // HACK: ET\r
-  else if (g_pGameDescription->mGameFile == "et.game")\r
-  {\r
-    if (!strcmp(dir,sETComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-\r
-  }\r
-  else if (g_pGameDescription->mGameFile == "hl.game")\r
-  {\r
-    if (!strcmp(dir,sHLComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-\r
-  }\r
-  // RIANT\r
-  // HACK: JK2\r
-  else if (g_pGameDescription->mGameFile == "jk2.game")\r
-  {\r
-    if (!strcmp(dir,sJK2ComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-  }\r
-  // TTimo\r
-  // HACK: JA\r
-  else if (g_pGameDescription->mGameFile == "ja.game")\r
-  {\r
-    if (!strcmp(dir,sJAComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-  }\r
-  // RIANT\r
-  // HACK: STVEF\r
-  else if (g_pGameDescription->mGameFile == "stvef.game")\r
-  {\r
-    if (!strcmp(dir,sSTVEFComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-  }\r
-  // RIANT\r
-  // HACK: SOF2\r
-  else if (g_pGameDescription->mGameFile == "sof2.game")\r
-  {\r
-    if (!strcmp(dir,sSOF2ComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-  }\r
-  // QUAKE 3\r
-  else\r
-  {\r
-    if (!strcmp(dir,sQ3ComboItem))\r
-    {\r
-      // disable the fs_game text entry\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else if (!strcmp(dir,sTAComboItem))\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "missionpack");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), false);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (fsgame_entry, "");\r
-      gtk_widget_set_sensitive(GTK_WIDGET(fsgame_entry), true);\r
-    }\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
-void DoProjectSettings ()\r
-{\r
-  GtkWidget *project;\r
-  GtkWidget *frame, *label, *vbox, *table1, *table2, *button;\r
-  GtkWidget *brush;\r
-  GtkWidget *scr;\r
-  GtkWidget *base, *game;\r
-  GtkWidget *gamemode_combo;\r
-  GList *combo_list = (GList*)NULL;\r
-\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  project = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (project), "Project Settings");\r
-  gtk_signal_connect (GTK_OBJECT (project), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (project), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (project), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (project), "ret", &ret);\r
-  gtk_window_set_default_size (GTK_WINDOW (project), 550, 400);\r
-\r
-  table1 = gtk_table_new (3, 2, FALSE);\r
-  gtk_widget_show (table1);\r
-  gtk_container_add (GTK_CONTAINER (project), table1);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table1), 5);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table1), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table1), 5);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_table_attach (GTK_TABLE (table1), vbox, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  button = gtk_button_new_with_label ("Add...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (project_add), project);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Change...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (project_change), project);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Remove");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (project_remove), project);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  frame = gtk_frame_new ("Misc settings");\r
-  gtk_widget_show (frame);\r
-  gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  brush = gtk_check_button_new_with_label ("Use brush primitives in MAP files (NOTE: experimental feature,\n"\r
-                                          "required by the texture tools plugin)");\r
-  gtk_widget_show (brush);\r
-  gtk_container_add (GTK_CONTAINER (frame), brush);\r
-  gtk_container_set_border_width (GTK_CONTAINER (brush), 5);\r
-\r
-  frame = gtk_frame_new ("Menu commands");\r
-  gtk_widget_show (frame);\r
-  gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);\r
-\r
-  scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_container_add (GTK_CONTAINER (frame), scr);\r
-  gtk_container_set_border_width (GTK_CONTAINER (scr), 5);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
-\r
-  {\r
-    GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);\r
-\r
-    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);\r
-\r
-    GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-    GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
-    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-\r
-    GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view));\r
-    gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);\r
-\r
-    gtk_widget_show(view);\r
-\r
-    g_object_set_data(G_OBJECT (project), "view", view);\r
-    g_object_set_data(G_OBJECT (project), "bsp_commands", store);\r
-    gtk_container_add(GTK_CONTAINER (scr), view);\r
-    \r
-    g_object_unref(G_OBJECT(store));\r
-  }\r
-\r
-  frame = gtk_frame_new ("Project settings");\r
-  gtk_widget_show (frame);\r
-  gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (GTK_FILL), 0, 0);\r
-\r
-  // HACK: hardcoded game stuff\r
-  if (g_pGameDescription->mGameFile == "wolf.game" ||\r
-    g_pGameDescription->mGameFile == "et.game" ||\r
-    g_pGameDescription->mGameFile == "jk2.game" || \r
-    g_pGameDescription->mGameFile == "stvef.game" ||\r
-    g_pGameDescription->mGameFile == "sof2.game" ||\r
-    g_pGameDescription->mGameFile == "ja.game" )\r
-  {\r
-    table2 = gtk_table_new (9, 2, FALSE);\r
-  }\r
-  else\r
-  {\r
-    table2 = gtk_table_new (8, 2, FALSE);\r
-  }\r
-  gtk_widget_show (table2);\r
-  gtk_container_add (GTK_CONTAINER (frame), table2);\r
-  gtk_container_set_border_width (GTK_CONTAINER (table2), 5);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table2), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table2), 5);\r
-\r
-  /*\r
-  fill in the game selection combo\r
-  HACK: hardcoded Q3/Wolf/HL switch\r
-  \todo that stuff would be faster to write with implementation of property bags and associated code to edit\r
-  */\r
-  if (g_pGameDescription->mGameFile == "wolf.game")\r
-  {\r
-    combo_list = g_list_append (combo_list, (void *)sWolfComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sWolfModComboItem);\r
-  }\r
-  else if (g_pGameDescription->mGameFile == "et.game")\r
-  {\r
-    combo_list = g_list_append (combo_list, (void *)sETComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sETModComboItem);\r
-  }\r
-  else if (g_pGameDescription->mGameFile == "hl.game")\r
-  {\r
-    combo_list = g_list_append (combo_list, (void *)sHLComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sHLModComboItem);\r
-  }\r
-  // RIANT\r
-  // JK2 HACK\r
-  else if (g_pGameDescription->mGameFile == "jk2.game")\r
-  {\r
-    combo_list = g_list_append (combo_list, (void *)sJK2ComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sJK2ModComboItem);\r
-  }\r
-  // TTimo\r
-  // JA HACK\r
-  else if (g_pGameDescription->mGameFile == "ja.game")\r
-  {\r
-    combo_list = g_list_append (combo_list, (void *)sJAComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sJAModComboItem);\r
-  }\r
-  // RIANT\r
-  // STVEF HACK\r
-  else if (g_pGameDescription->mGameFile == "stvef.game")\r
-  {\r
-    combo_list = g_list_append (combo_list, (void *)sSTVEFComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sSTVEFModComboItem);\r
-  }\r
-  // RIANT\r
-  // SOF2 HACK A LA JK2 A LA WOLF\r
-  else if (g_pGameDescription->mGameFile == "sof2.game")\r
-  {\r
-    combo_list = g_list_append (combo_list, (void *)sSOF2ComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sSOF2ModComboItem);\r
-  }\r
-  else\r
-  {\r
-    // Q3 or default\r
-    combo_list = g_list_append (combo_list, (void *)sQ3ComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sTAComboItem);\r
-    combo_list = g_list_append (combo_list, (void *)sModComboItem);\r
-  }\r
-\r
-  game_select = gtk_combo_new ();\r
-  gtk_combo_set_popdown_strings (GTK_COMBO (game_select), combo_list);\r
-  gtk_widget_show (game_select);\r
-  gtk_table_attach (GTK_TABLE (table2), game_select, 1, 2, 6, 7,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  gtk_signal_connect (GTK_OBJECT(GTK_COMBO (game_select)->entry), "changed",\r
-    GTK_SIGNAL_FUNC (OnSelchangeComboWhatgame), NULL);\r
-\r
-  g_list_free (combo_list);\r
-  gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (game_select)->entry), FALSE);\r
-\r
-  game = gtk_entry_new();\r
-  fsgame_entry = GTK_ENTRY(game);\r
-  gtk_widget_show(game);\r
-  gtk_table_attach(GTK_TABLE(table2), game, 1, 2, 7, 8,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  \r
-  /*\r
-  wolf specific: select MP or SP mode\r
-  */\r
-  if (g_pGameDescription->mGameFile == "wolf.game")\r
-  {\r
-    combo_list = NULL;\r
-    combo_list = g_list_append (combo_list, (void *)sWolfSPCombo);\r
-    combo_list = g_list_append (combo_list, (void *)sWolfMPCombo);\r
-    \r
-    gamemode_combo = gtk_combo_new ();\r
-    gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
-    gtk_widget_show(gamemode_combo);\r
-    gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
-      (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-\r
-    g_list_free (combo_list);\r
-    combo_list = NULL;\r
-\r
-    label = gtk_label_new ("Mapping mode");\r
-    gtk_widget_show (label);\r
-    gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
-      (GtkAttachOptions) (GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-    gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  }\r
-\r
-  // RIANT\r
-  // JK2 HACK\r
-  if (g_pGameDescription->mGameFile == "jk2.game")\r
-  {\r
-    combo_list = NULL;\r
-    combo_list = g_list_append (combo_list, (void *)sJK2SPCombo);\r
-    combo_list = g_list_append (combo_list, (void *)sJK2MPCombo);\r
-    \r
-    gamemode_combo = gtk_combo_new ();\r
-    gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
-    gtk_widget_show(gamemode_combo);\r
-    gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
-      (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-\r
-    g_list_free (combo_list);\r
-    combo_list = NULL;\r
-\r
-    label = gtk_label_new ("Mapping mode");\r
-    gtk_widget_show (label);\r
-    gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
-      (GtkAttachOptions) (GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-    gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  }\r
-  // TTimo\r
-  // JA HACK\r
-  if (g_pGameDescription->mGameFile == "ja.game")\r
-  {\r
-    combo_list = NULL;\r
-    combo_list = g_list_append (combo_list, (void *)sJASPCombo);\r
-    combo_list = g_list_append (combo_list, (void *)sJAMPCombo);\r
-    \r
-    gamemode_combo = gtk_combo_new ();\r
-    gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
-    gtk_widget_show(gamemode_combo);\r
-    gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
-      (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-\r
-    g_list_free (combo_list);\r
-    combo_list = NULL;\r
-\r
-    label = gtk_label_new ("Mapping mode");\r
-    gtk_widget_show (label);\r
-    gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
-      (GtkAttachOptions) (GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-    gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  }\r
-  // RIANT\r
-  // STVEF HACK\r
-  if (g_pGameDescription->mGameFile == "stvef.game")\r
-  {\r
-    combo_list = NULL;\r
-    combo_list = g_list_append (combo_list, (void *)sSTVEFSPCombo);\r
-    combo_list = g_list_append (combo_list, (void *)sSTVEFMPCombo);\r
-    \r
-    gamemode_combo = gtk_combo_new ();\r
-    gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
-    gtk_widget_show(gamemode_combo);\r
-    gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
-      (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-\r
-    g_list_free (combo_list);\r
-    combo_list = NULL;\r
-\r
-    label = gtk_label_new ("Mapping mode");\r
-    gtk_widget_show (label);\r
-    gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
-      (GtkAttachOptions) (GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-    gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  }\r
-  // RIANT\r
-  // SOF2 HACK\r
-  if (g_pGameDescription->mGameFile == "sof2.game")\r
-  {\r
-    combo_list = NULL;\r
-    combo_list = g_list_append (combo_list, (void *)sSOF2SPCombo);\r
-    combo_list = g_list_append (combo_list, (void *)sSOF2MPCombo);\r
-    \r
-    gamemode_combo = gtk_combo_new ();\r
-    gtk_combo_set_popdown_strings (GTK_COMBO (gamemode_combo), combo_list);\r
-    gtk_widget_show(gamemode_combo);\r
-    gtk_table_attach (GTK_TABLE (table2), gamemode_combo, 1, 2, 8, 9,\r
-      (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-\r
-    g_list_free (combo_list);\r
-    combo_list = NULL;\r
-\r
-    label = gtk_label_new ("Mapping mode");\r
-    gtk_widget_show (label);\r
-    gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 8, 9,\r
-      (GtkAttachOptions) (GTK_FILL),\r
-      (GtkAttachOptions) (0), 0, 0);\r
-    gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  }\r
-\r
-  /*\r
-  the usual stuff\r
-  */\r
-\r
-  base = gtk_entry_new ();\r
-  g_object_set_data (G_OBJECT (project), "base", base);\r
-  gtk_widget_show (base);\r
-  gtk_table_attach (GTK_TABLE (table2), base, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-\r
-  label = gtk_label_new ("basepath");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-\r
-  label = gtk_label_new ("Select mod");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 6, 7,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-  label = gtk_label_new ("fs_game");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table2), label, 0, 1, 7, 8,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-\r
-  // Initialize fields\r
-  gtk_entry_set_text (GTK_ENTRY (base), ValueForKey (g_qeglobals.d_project_entity, "basepath"));\r
-  UpdateBSPCommandList (project);\r
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (brush), (g_qeglobals.m_bBrushPrimitMode) ? TRUE : FALSE);\r
-\r
-  // initialise the fs_game selection from the project settings into the dialog\r
-  const char *dir = ValueForKey (g_qeglobals.d_project_entity, "gamename");\r
-  // HACK: hardcoded wolf stuff\r
-  if (g_pGameDescription->mGameFile == "wolf.game")\r
-  {\r
-    if ((strlen(dir) == 0) || !stricmp(dir,"main"))\r
-    {\r
-      // no fs_game set, we are running stock Quake III Arena editing\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sWolfModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-  // HACK: hardcoded et stuff\r
-  if (g_pGameDescription->mGameFile == "et.game")\r
-  {\r
-    if ((strlen(dir) == 0) || !stricmp(dir,"etmain"))\r
-    {\r
-      // no fs_game set, we are running stock Quake III Arena editing\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sETModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-  // HACK: hardcoded half-life stuff\r
-  else if (g_pGameDescription->mGameFile == "hl.game")\r
-  {\r
-    if ((strlen(dir) == 0) || !stricmp(dir,"valve"))\r
-    {\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sHLModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-  // RIANT\r
-  // JK2 HACK\r
-  else if (g_pGameDescription->mGameFile == "jk2.game")\r
-  {\r
-    if ((strlen(dir) == 0) || !stricmp(dir,"base"))\r
-    {\r
-      // no fs_game set, we are running stock Quake III Arena editing\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJK2ModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-  // TTimo\r
-  // JA HACK\r
-  else if (g_pGameDescription->mGameFile == "ja.game")\r
-  {\r
-    if ((strlen(dir) == 0) || !stricmp(dir,"base"))\r
-    {\r
-      // no fs_game set, we are running stock editing\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sJAModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-  // RIANT\r
-  // STVEF2 HACK\r
-  else if (g_pGameDescription->mGameFile == "stvef.game")\r
-  {\r
-    if ((strlen(dir) == 0) || !stricmp(dir,"baseEf"))\r
-    {\r
-      // no fs_game set, we are running stock Quake III Arena editing\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSTVEFModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-  // RIANT\r
-  // SOF2 HACK\r
-  else if (g_pGameDescription->mGameFile == "sof2.game")\r
-  {\r
-    if ((strlen(dir) == 0) || !stricmp(dir,"base"))\r
-    {\r
-      // no fs_game set, we are running stock Quake III Arena editing\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sSOF2ModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-  else\r
-  {\r
-    if ((strlen(dir) == 0) || !strcmp(dir,"baseq3"))\r
-    {\r
-      // no fs_game set, we are running stock Quake III Arena editing\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sQ3ComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else if (!strcmp(dir,"missionpack"))\r
-    {\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sTAComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), "missionpack");\r
-      gtk_widget_set_sensitive(game, false);\r
-    }\r
-    else\r
-    {\r
-      // this is a custom mod\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (game_select)->entry), sModComboItem);\r
-      gtk_entry_set_text (GTK_ENTRY (game), dir);\r
-      gtk_widget_set_sensitive(game, true);\r
-    }\r
-  }\r
-\r
-  // HACK: hardcoded wolf stuff\r
-  if (g_pGameDescription->mGameFile == "wolf.game")\r
-  {\r
-    const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
-    if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
-    {\r
-      // nothing set yet, or single player\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfSPCombo);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sWolfMPCombo);\r
-    }\r
-  }\r
-\r
-  // JK2 HACK\r
-  else if (g_pGameDescription->mGameFile == "jk2.game")\r
-  {\r
-    const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
-    if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
-    {\r
-      // nothing set yet, or single player\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2SPCombo);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJK2MPCombo);\r
-    }\r
-  }\r
-  // JA HACK\r
-  else if (g_pGameDescription->mGameFile == "ja.game")\r
-  {\r
-    const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
-    if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
-    {\r
-      // nothing set yet, or single player\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJASPCombo);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sJAMPCombo);\r
-    }\r
-  }\r
-  // STVEF HACK\r
-  else if (g_pGameDescription->mGameFile == "stvef.game")\r
-  {\r
-    const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
-    if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
-    {\r
-      // nothing set yet, or single player\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFSPCombo);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSTVEFMPCombo);\r
-    }\r
-  }\r
-  // SOF2 HACK\r
-  else if (g_pGameDescription->mGameFile == "sof2.game")\r
-  {\r
-    const char *gamemode = ValueForKey (g_qeglobals.d_project_entity, "gamemode");\r
-    if ((strlen(gamemode) == 0) || !strcmp(gamemode,"sp"))\r
-    {\r
-      // nothing set yet, or single player\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2SPCombo);\r
-    }\r
-    else\r
-    {\r
-      gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (gamemode_combo)->entry), sSOF2MPCombo);\r
-    }\r
-  }\r
-\r
-  gtk_grab_add (project);\r
-  gtk_widget_show (project);\r
-\r
-  g_pGameDescription->Dump();\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    char buf[1024];\r
-    const char *r;\r
-    char *w;\r
-               \r
-    // convert path to unix format\r
-    for(r = gtk_entry_get_text (GTK_ENTRY (base)), w=buf; *r != '\0'; r++, w++)\r
-      *w = (*r == '\\') ? '/' : *r;\r
-    // add last slash\r
-    if(w != buf && *(w-1) != '/') *(w++) = '/';\r
-    // terminate string\r
-    *w = '\0';\r
-    SetKeyValue (g_qeglobals.d_project_entity, "basepath", buf);\r
-\r
-    dir = gtk_entry_get_text (GTK_ENTRY (game));\r
-    // Hack: hard coded wolf stuff\r
-    if (g_pGameDescription->mGameFile == "wolf.game")\r
-    {\r
-      if (!strlen(dir) || !stricmp(dir,"main"))\r
-      {\r
-        DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
-      }\r
-    }\r
-    // Hack: hard coded ET stuff\r
-    else if (g_pGameDescription->mGameFile == "et.game")\r
-    {\r
-      if (!strlen(dir) || !stricmp(dir,"etmain"))\r
-      {\r
-        DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
-      }\r
-    }\r
-    // Hack: hard coded Half-life stuff\r
-    else if (g_pGameDescription->mGameFile == "hl.game")\r
-    {\r
-      if (!strlen(dir) || !stricmp(dir,"valve"))\r
-      {\r
-        DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
-      }\r
-    }\r
-    else if (g_pGameDescription->mGameFile == "jk2.game" || g_pGameDescription->mGameFile == "ja.game")\r
-    {\r
-      if (!strlen(dir) || !stricmp(dir,"base"))\r
-      {\r
-        DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
-      }\r
-    }\r
-    // RIANT\r
-    // STVEF HACK\r
-    else if (g_pGameDescription->mGameFile == "stvef.game")\r
-    {\r
-      if (!strlen(dir) || !stricmp(dir,"baseEf"))\r
-      {\r
-        DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
-      }\r
-    }\r
-    else\r
-    {\r
-      if (!strlen(dir) || !strcmp(dir,"baseq3"))\r
-      {\r
-        DeleteKey (g_qeglobals.d_project_entity, "gamename");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamename", dir);\r
-      }\r
-    }\r
-    \r
-    // HACK: hardcoded wolf stuff\r
-    if (g_pGameDescription->mGameFile == "wolf.game")\r
-    {\r
-      // read from gamemode_combo\r
-      const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
-      if (!strlen(gamemode) || !strcmp(gamemode, sWolfSPCombo))\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
-      }\r
-    }\r
-\r
-    // RIANT\r
-    // JK2 HACK\r
-    if (g_pGameDescription->mGameFile == "jk2.game")\r
-    {\r
-      // read from gamemode_combo\r
-      const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
-      if (!strlen(gamemode) || !strcmp(gamemode, sJK2SPCombo))\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
-      }\r
-    }\r
-    // TTimo\r
-    // JA HACK\r
-    if (g_pGameDescription->mGameFile == "ja.game")\r
-    {\r
-      // read from gamemode_combo\r
-      const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
-      if (!strlen(gamemode) || !strcmp(gamemode, sJASPCombo))\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
-      }\r
-    }\r
-    \r
-    // RIANT\r
-    // STVEF HACK\r
-    if (g_pGameDescription->mGameFile == "stvef.game")\r
-    {\r
-      // read from gamemode_combo\r
-      const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
-      if (!strlen(gamemode) || !strcmp(gamemode, sSTVEFSPCombo))\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
-      }\r
-    }\r
-\r
-    g_qeglobals.m_strHomeMaps = g_qeglobals.m_strHomeGame;\r
-    const char* str = ValueForKey(g_qeglobals.d_project_entity, "gamename");\r
-    if(str[0] == '\0') str = g_pGameDescription->mBaseGame.GetBuffer();\r
-    g_qeglobals.m_strHomeMaps += str;\r
-    g_qeglobals.m_strHomeMaps += '/';\r
-\r
-    // RIANT\r
-    // SOF2 HACK\r
-    if (g_pGameDescription->mGameFile == "sof2.game")\r
-    {\r
-      // read from gamemode_combo\r
-      const char *gamemode = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(gamemode_combo)->entry));\r
-      if (!strlen(gamemode) || !strcmp(gamemode, sSOF2SPCombo))\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "sp");\r
-      }\r
-      else\r
-      {\r
-        SetKeyValue (g_qeglobals.d_project_entity, "gamemode", "mp");\r
-      }\r
-    }\r
-\r
-    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (brush)))\r
-      g_qeglobals.m_bBrushPrimitMode = TRUE;\r
-    else\r
-      g_qeglobals.m_bBrushPrimitMode = FALSE;\r
-\r
-    SetKeyValue(g_qeglobals.d_project_entity, "brush_primit", (g_qeglobals.m_bBrushPrimitMode ? "1" : "0" ));\r
-\r
-//    QE_CheckProjectEntity();\r
-\r
-    QE_SaveProject( g_PrefsDlg.m_strLastProject.GetBuffer() );\r
-  }\r
-\r
-  gtk_grab_remove (project);\r
-  gtk_widget_destroy (project);\r
-}\r
-\r
-// =============================================================================\r
-// MapInfo dialog\r
-\r
-void DoMapInfo ()\r
-{\r
-  static GtkWidget *dlg;\r
-  GtkWidget *vbox, *vbox2, *hbox, *table, *button, *label, *scr;\r
-  GtkWidget *brushes_entry, *entities_entry, *net_entry;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  if (dlg != NULL)\r
-    return;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-\r
-  load_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);\r
-\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Map Info");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
-  table = gtk_table_new (3, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
-\r
-  brushes_entry = gtk_entry_new ();\r
-  gtk_widget_show (brushes_entry);\r
-  gtk_table_attach (GTK_TABLE (table), brushes_entry, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_entry_set_editable (GTK_ENTRY (brushes_entry), FALSE);\r
-\r
-  entities_entry = gtk_entry_new ();\r
-  gtk_widget_show (entities_entry);\r
-  gtk_table_attach (GTK_TABLE (table), entities_entry, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_entry_set_editable (GTK_ENTRY (entities_entry), FALSE);\r
-\r
-  net_entry = gtk_entry_new ();\r
-  gtk_widget_show (net_entry);\r
-  gtk_table_attach (GTK_TABLE (table), net_entry, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_entry_set_editable (GTK_ENTRY (net_entry), FALSE);\r
-\r
-  label = gtk_label_new ("Total Brushes");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ("Total Entities");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ("Net brush count\n(non entity)");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  vbox2 = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox2);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);\r
-\r
-  button = gtk_button_new_with_label ("Close");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  label = gtk_label_new ("Entity breakdown");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);\r
-  gtk_container_set_border_width (GTK_CONTAINER (scr), 5);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
-  GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);\r
-\r
-  {\r
-    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-    gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(view), TRUE);\r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Entity", renderer, "text", 0, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-      gtk_tree_view_column_set_sort_column_id(column, 0);\r
-    }\r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Count", renderer, "text", 1, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-      gtk_tree_view_column_set_sort_column_id(column, 1);\r
-    }\r
-\r
-    gtk_widget_show(view);\r
-\r
-    gtk_container_add(GTK_CONTAINER (scr), view);\r
-  }\r
-\r
-  // Initialize fields\r
-  int TotalBrushes = 0, TotalEntities = 0, Net = 0;\r
-\r
-  for (brush_t* pBrush = active_brushes.next; pBrush != &active_brushes; pBrush = pBrush->next)\r
-  {\r
-    TotalBrushes++;\r
-    if (pBrush->owner == world_entity)\r
-      Net++;\r
-  }\r
-\r
-  typedef struct\r
-  {\r
-    const char *name;\r
-    int count;\r
-  } map_t;\r
-\r
-  GSList *l, *entitymap = NULL;\r
-  map_t *entry;\r
-\r
-  for (entity_t* pEntity = entities.next; pEntity != &entities; pEntity=pEntity->next)\r
-  {\r
-    TotalEntities++;\r
-    bool add = true;\r
-\r
-    for (l = entitymap; l; l = g_slist_next (l))\r
-    {\r
-      entry = (map_t*)l->data;\r
-\r
-      if (strcmp (entry->name, pEntity->eclass->name) == 0)\r
-      {\r
-             entry->count++;\r
-             add = false;\r
-             break;\r
-      }\r
-    }\r
-\r
-    if (add)\r
-    {\r
-      entry = (map_t*)qmalloc (sizeof (map_t));\r
-      entry->name = pEntity->eclass->name;\r
-      entry->count = 1;\r
-      entitymap = g_slist_append (entitymap, entry);\r
-    }\r
-  }\r
-\r
-  while (entitymap)\r
-  {\r
-    entry = (map_t*)entitymap->data;\r
-    char tmp[16];\r
-    sprintf (tmp, "%d", entry->count);\r
-    GtkTreeIter iter;\r
-    gtk_list_store_append(GTK_LIST_STORE(store), &iter);\r
-    gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, entry->name, 1, tmp, -1);\r
-    free (entry);\r
-    entitymap = g_slist_remove (entitymap, entry);\r
-  }\r
-\r
-  g_object_unref(G_OBJECT(store));\r
-\r
-  char tmp[16];\r
-  sprintf (tmp, "%d", TotalBrushes);\r
-  gtk_entry_set_text (GTK_ENTRY (brushes_entry), tmp);\r
-  sprintf (tmp, "%d", TotalEntities);\r
-  gtk_entry_set_text (GTK_ENTRY (entities_entry), tmp);\r
-  sprintf (tmp, "%d", Net);\r
-  gtk_entry_set_text (GTK_ENTRY (net_entry), tmp);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  // save before exit\r
-  save_window_pos(dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-  dlg = NULL;\r
-}\r
-\r
-// =============================================================================\r
-// Entity List dialog\r
-\r
-static void entitylist_select (GtkWidget *widget, gpointer data)\r
-{\r
-  GtkTreeView* view = GTK_TREE_VIEW(g_object_get_data (G_OBJECT (data), "entities"));\r
-\r
-  GtkTreeSelection* selection = gtk_tree_view_get_selection(view);\r
-\r
-  GtkTreeModel* model;\r
-  GtkTreeIter selected;\r
-  if(gtk_tree_selection_get_selected(selection, &model, &selected))\r
-  {\r
-    entity_t* pEntity;\r
-    gtk_tree_model_get(model, &selected, 1, &pEntity, -1);\r
-\r
-    if (pEntity)\r
-    {\r
-      for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)\r
-      {\r
-             Select_Deselect ();\r
-             Select_Brush (pEntity->brushes.onext);\r
-             Sys_UpdateWindows(W_ALL);\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-static gint entitylist_click (GtkWidget *widget, GdkEventButton *event, gpointer data)\r
-{\r
-  if (event->type == GDK_2BUTTON_PRESS)\r
-  {\r
-    entitylist_select (NULL, data);\r
-    return TRUE;\r
-  }\r
-  return FALSE;\r
-}\r
-\r
-static void entitylist_selection_changed(GtkTreeSelection* selection, gpointer data)\r
-{\r
-  GtkListStore* store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (data), "keyvalues"));\r
-\r
-  gtk_list_store_clear(store);\r
-\r
-  GtkTreeModel* model;\r
-  GtkTreeIter selected;\r
-  if(gtk_tree_selection_get_selected(selection, &model, &selected))\r
-  {\r
-    entity_t* pEntity;\r
-    gtk_tree_model_get(model, &selected, 1, &pEntity, -1);\r
-\r
-    if (pEntity)\r
-    {\r
-      for (epair_t* pEpair = pEntity->epairs; pEpair; pEpair = pEpair->next)\r
-      {\r
-        GtkTreeIter appended;\r
-        gtk_list_store_append(store, &appended);\r
-        gtk_list_store_set(store, &appended, 0, pEpair->key, 1, pEpair->value, -1);\r
-      }\r
-    }\r
-  }\r
-}\r
-\r
-void DoEntityList ()\r
-{\r
-  static GtkWidget *dlg;\r
-  GtkWidget *vbox, *hbox, *hbox2, *button, *scr;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  if (dlg != NULL)\r
-    return;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-\r
-  load_window_pos (dlg, g_PrefsDlg.mWindowInfo.posEntityInfoWnd);\r
-\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Entities");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  hbox = gtk_hbox_new (TRUE, 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
-  scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
-  {\r
-    GtkTreeStore* store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);\r
-\r
-    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-    g_signal_connect(G_OBJECT(view), "button_press_event", G_CALLBACK(entitylist_click), dlg);\r
-    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);\r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-    }\r
-\r
-    {\r
-      GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));\r
-      g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(entitylist_selection_changed), dlg);\r
-    }\r
-\r
-    gtk_widget_show(view);\r
-\r
-    gtk_container_add(GTK_CONTAINER (scr), view);\r
-    g_object_set_data (G_OBJECT (dlg), "entities", view);\r
-\r
-    {\r
-      {\r
-        GtkTreeIter child;\r
-        gtk_tree_store_append(store, &child, NULL);\r
-        gtk_tree_store_set(store, &child, 0, world_entity->eclass->name, 1, world_entity, -1);\r
-      }\r
-\r
-      GSList *l, *entitymap = NULL;\r
-      typedef struct\r
-      {\r
-        GtkTreeIter node;\r
-        const char *name;\r
-      } map_t;\r
-      map_t *entry;\r
-\r
-      for (entity_t* pEntity=entities.next; pEntity != &entities; pEntity=pEntity->next)\r
-      {\r
-        GtkTreeIter parent;\r
-        bool found = false;\r
-\r
-        for (l = entitymap; l; l = g_slist_next (l))\r
-        {\r
-          entry = (map_t*)l->data;\r
-\r
-          if (strcmp (entry->name, pEntity->eclass->name) == 0)\r
-          {\r
-                 parent = entry->node;\r
-                 found = true;\r
-                 break;\r
-          }\r
-        }\r
-\r
-        if (!found)\r
-        {\r
-          gtk_tree_store_append(store, &parent, NULL);\r
-          gtk_tree_store_set(store, &parent, 0, pEntity->eclass->name, 1, NULL, -1);\r
-\r
-          entry = (map_t*)malloc (sizeof(map_t));\r
-          entitymap = g_slist_append (entitymap, entry);\r
-          entry->name = pEntity->eclass->name;\r
-          entry->node = parent;\r
-        }\r
-\r
-        GtkTreeIter child;\r
-        gtk_tree_store_append(store, &child, &parent);\r
-        gtk_tree_store_set(store, &child, 0, pEntity->eclass->name, 1, pEntity, -1);\r
-      }\r
-\r
-      while (entitymap)\r
-      {\r
-        free (entitymap->data);\r
-        entitymap = g_slist_remove (entitymap, entitymap->data);\r
-      }\r
-    }\r
-    \r
-    g_object_unref(G_OBJECT(store));\r
-  }\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
-  scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
-  {\r
-    GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);\r
-\r
-    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 0, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-    }\r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Value", renderer, "text", 1, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-    }\r
-\r
-    gtk_widget_show(view);\r
-\r
-    g_object_set_data(G_OBJECT(dlg), "keyvalues", store);\r
-    gtk_container_add(GTK_CONTAINER (scr), view);\r
-    \r
-    g_object_unref(G_OBJECT(store));\r
-  }\r
-\r
-  hbox2 = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox2);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox2, TRUE, TRUE, 0);\r
-  \r
-  button = gtk_button_new_with_label ("Select");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (entitylist_select), dlg);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Close");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_end (GTK_BOX (hbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  save_window_pos (dlg, g_PrefsDlg.mWindowInfo.posMapInfoWnd);\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-\r
-  dlg = NULL;\r
-}\r
-\r
-// =============================================================================\r
-// Rotate dialog\r
-\r
-static void rotatedlg_apply (GtkWidget *widget, gpointer data)\r
-{\r
-  GtkSpinButton *spin;\r
-  float f;\r
-\r
-  spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "x"));\r
-  f = gtk_spin_button_get_value_as_float (spin);\r
-  if (f != 0.0)\r
-    Select_RotateAxis(0,f);\r
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f); // reset to 0 on Apply\r
-  \r
-  spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "y"));\r
-  f = gtk_spin_button_get_value_as_float (spin);\r
-  if (f != 0.0)\r
-    Select_RotateAxis(1,f);\r
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);\r
-  \r
-  spin = GTK_SPIN_BUTTON (g_object_get_data (G_OBJECT (data), "z"));\r
-  f = gtk_spin_button_get_value_as_float (spin);\r
-  if (f != 0.0)\r
-    Select_RotateAxis(2,f);\r
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0.0f);\r
-}\r
-\r
-void DoRotateDlg ()\r
-{\r
-  GtkWidget *dlg, *hbox, *vbox, *table, *label, *button;\r
-  GtkWidget *x, *y, *z;\r
-  GtkObject *adj;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary rotation");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  table = gtk_table_new (3, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, 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 ("  X  ");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (0),\r
-                    (GtkAttachOptions) (0), 0, 0);\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) (0),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
\r
-  label = gtk_label_new ("  Z  ");\r
-\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (0),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
\r
-  adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);\r
-  x = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "x", x);\r
-  gtk_widget_show (x);\r
-  gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_widget_set_usize (x, 60, -2);\r
-  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (x), TRUE);\r
\r
-  adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);\r
-  y = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "y", y);\r
-  gtk_widget_show (y);\r
-  gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (y), TRUE);\r
\r
-  adj = gtk_adjustment_new (0, -359, 359, 1, 10, 10);\r
-  z = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);\r
-  g_object_set_data (G_OBJECT (dlg), "z", z);\r
-  gtk_widget_show (z);\r
-  gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (z), TRUE);\r
\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
\r
-  button = gtk_button_new_with_label ("Apply");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (rotatedlg_apply), dlg);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-    rotatedlg_apply (button, dlg);\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Gamma dialog\r
-\r
-void DoGamma ()\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Gamma");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);\r
-\r
-  label = gtk_label_new ("0.0 is brightest\n1.0 is darkest");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
-\r
-  label = gtk_label_new ("You must restart for the\nsettings to take effect");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
-  // Initialize dialog\r
-  char buf[16];\r
-  sprintf (buf, "%1.1f", g_qeglobals.d_savedinfo.fGamma);\r
-  gtk_entry_set_text (GTK_ENTRY (entry), buf);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-    g_qeglobals.d_savedinfo.fGamma = g_strtod (gtk_entry_get_text (GTK_ENTRY (entry)), NULL);\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Find Brush Dialog\r
-\r
-// helper function to walk through the active brushes only and drop the regioned out ones\r
-bool WalkRegionBrush (brush_t **b, entity_t *e)\r
-{\r
-  brush_t *b2;\r
-  do\r
-  {\r
-    for(b2=active_brushes.next ; b2 != &active_brushes ; b2=b2->next)\r
-    {\r
-      if (b2==*b)\r
-        break; // this is an active brush\r
-    }\r
-    if (b2==&active_brushes)\r
-    {\r
-      // this is a regioned out brush\r
-      *b = (*b)->onext;\r
-      if (*b == &e->brushes)\r
-      {\r
-        Sys_Status ("No such brush", 0);\r
-        return false;\r
-      }\r
-    }\r
-  } while (b2==&active_brushes);\r
-  return true;\r
-}\r
-\r
-void SelectBrush (int entitynum, int brushnum)\r
-{\r
-  entity_t *e;\r
-  brush_t *b;\r
-  int i;\r
-\r
-  // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503\r
-  // making this work when regioning is on too\r
-\r
-  if (entitynum == 0)\r
-    e = world_entity;\r
-  else\r
-  {\r
-    e = entities.next;\r
-    while (--entitynum)\r
-    {\r
-      e = e->next;\r
-      if (e == &entities)\r
-      {\r
-        Sys_Status ("No such entity", 0);\r
-        return;\r
-      }\r
-      if (region_active)\r
-      {\r
-        // we need to make sure we walk to the next 'active' entity to have a valid --entitynum\r
-        // that is, find a brush that belongs to this entity in the active brushes\r
-        do\r
-        {\r
-          for (b = active_brushes.next ; b != &active_brushes ; b=b->next)\r
-          {\r
-            if (b->owner == e)\r
-              break; // this is an active entity\r
-          }\r
-          if (b==&active_brushes)\r
-          {\r
-            // this is a regioned out entity\r
-            e = e->next;        \r
-            // don't walk past the end either\r
-            if (e == &entities)\r
-            {\r
-              Sys_Status ("No such entity", 0);\r
-              return;\r
-            }\r
-          }\r
-        } while(b==&active_brushes);\r
-      }\r
-    }\r
-  }\r
-\r
-  b = e->brushes.onext;\r
-  if (b == &e->brushes)\r
-  {\r
-    Sys_Status ("No such brush", 0);\r
-    return;\r
-  }\r
-  if (region_active)\r
-  {\r
-    if (!WalkRegionBrush(&b, e))\r
-      return;\r
-  }\r
-\r
-  while (brushnum--)\r
-  {\r
-    b = b->onext;\r
-    if (b == &e->brushes)\r
-    {\r
-      Sys_Status ("No such brush", 0);\r
-      return;\r
-    }\r
-    if (region_active)\r
-    {\r
-      if (!WalkRegionBrush(&b, e))\r
-        return;\r
-    }\r
-  }\r
-\r
-  Brush_RemoveFromList (b);\r
-  Brush_AddToList (b, &selected_brushes);\r
-\r
-  Sys_UpdateWindows (W_ALL);\r
-  for (i = 0; i < 3; i++)\r
-  {\r
-    if (g_pParentWnd->GetXYWnd())\r
-      g_pParentWnd->GetXYWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;\r
-\r
-    if (g_pParentWnd->GetXZWnd())\r
-      g_pParentWnd->GetXZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;\r
-    \r
-    if (g_pParentWnd->GetYZWnd())\r
-      g_pParentWnd->GetYZWnd()->GetOrigin()[i] = (b->mins[i] + b->maxs[i])/2;\r
-  }\r
-\r
-  Sys_Status ("Selected", 0);\r
-}\r
-\r
-static void GetSelectionIndex (int *ent, int *brush)\r
-{\r
-  brush_t *b, *b2;\r
-  entity_t *entity;\r
-\r
-  *ent = *brush = 0;\r
-\r
-  b = selected_brushes.next;\r
-  if (b == &selected_brushes)\r
-    return;\r
-\r
-  // find entity\r
-  if (b->owner != world_entity)\r
-  {\r
-    (*ent)++;\r
-    for (entity = entities.next; entity != &entities; entity=entity->next, (*ent)++)\r
-      ;\r
-  }\r
-\r
-  // find brush\r
-  for (b2=b->owner->brushes.onext; b2 != b && b2 != &b->owner->brushes; b2=b2->onext, (*brush)++)\r
-    ;\r
-}\r
-\r
-void DoFind ()\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *table, *label, *button, *entity, *brush;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Find Brush");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  table = gtk_table_new (2, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, 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 ("Entity number");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (0),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  label = gtk_label_new ("Brush number");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (0),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  entity = gtk_entry_new ();\r
-  gtk_widget_show (entity);\r
-  gtk_table_attach (GTK_TABLE (table), entity, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  brush = gtk_entry_new ();\r
-  gtk_widget_show (brush);\r
-  gtk_table_attach (GTK_TABLE (table), brush, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
-  button = gtk_button_new_with_label ("OK");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
-  // Initialize dialog\r
-  char buf[16];\r
-  int ent, br;\r
-\r
-  GetSelectionIndex (&ent, &br);\r
-  sprintf (buf, "%i", ent);\r
-  gtk_entry_set_text (GTK_ENTRY (entity), buf);\r
-  sprintf (buf, "%i", br);\r
-  gtk_entry_set_text (GTK_ENTRY (brush), buf);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    const char *entstr = gtk_entry_get_text (GTK_ENTRY (entity));\r
-    const char *brushstr = gtk_entry_get_text (GTK_ENTRY (brush));\r
-    SelectBrush (atoi(entstr), atoi(brushstr));\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Arbitrary Sides dialog\r
-\r
-void DoSides (bool bCone, bool bSphere, bool bTorus)\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *button, *label, *entry;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Arbitrary sides");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  label = gtk_label_new ("Sides:");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);\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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    const char *str = gtk_entry_get_text (GTK_ENTRY (entry));\r
-\r
-    if (bCone)\r
-      Brush_MakeSidedCone(atoi(str));\r
-    else if (bSphere)\r
-      Brush_MakeSidedSphere(atoi(str));\r
-    else\r
-      Brush_MakeSided (atoi(str));\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// New Patch dialog\r
-\r
-void DoNewPatchDlg ()\r
-{\r
-  GtkWidget *dlg, *hbox, *table, *vbox, *label, *button, *combo;\r
-  GtkWidget *width, *height;\r
-  GList *combo_list = (GList*)NULL;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Patch density");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  table = gtk_table_new (2, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, 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 ("Width:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ("Height:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  combo_list = g_list_append (combo_list, (void *)"3");\r
-  combo_list = g_list_append (combo_list, (void *)"5");\r
-  combo_list = g_list_append (combo_list, (void *)"7");\r
-  combo_list = g_list_append (combo_list, (void *)"9");\r
-  combo_list = g_list_append (combo_list, (void *)"11");\r
-  combo_list = g_list_append (combo_list, (void *)"13");\r
-  combo_list = g_list_append (combo_list, (void *)"15");\r
-\r
-  combo = gtk_combo_new ();\r
-  width = GTK_COMBO (combo)->entry;\r
-  gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);\r
-  gtk_widget_show (combo);\r
-  gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  combo = gtk_combo_new ();\r
-  height = GTK_COMBO (combo)->entry;\r
-  gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);\r
-  gtk_widget_show (combo);\r
-  gtk_table_attach (GTK_TABLE (table), combo, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
-  // Initialize dialog\r
-  g_list_free (combo_list);\r
-  gtk_entry_set_text (GTK_ENTRY (width), "3");\r
-  gtk_entry_set_editable (GTK_ENTRY (width), FALSE);\r
-  gtk_entry_set_text (GTK_ENTRY (height), "3");\r
-  gtk_entry_set_editable (GTK_ENTRY (height), FALSE);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    const char* w = gtk_entry_get_text (GTK_ENTRY (width));\r
-    const char* h = gtk_entry_get_text (GTK_ENTRY (height));\r
-\r
-    Patch_GenericMesh(atoi (w), atoi (h), g_pParentWnd->ActiveXY ()->GetViewType ());\r
-    Sys_UpdateWindows (W_ALL);\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// New Patch dialog\r
-\r
-void DoScaleDlg ()\r
-{\r
-  GtkWidget *dlg, *hbox, *table, *vbox, *label, *button;\r
-  GtkWidget *x, *y, *z;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Scale");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  table = gtk_table_new (3, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, 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 ("X:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\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) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ("Z:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  x = gtk_entry_new ();\r
-  gtk_widget_show (x);\r
-  gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  y = gtk_entry_new ();\r
-  gtk_widget_show (y);\r
-  gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  z = gtk_entry_new ();\r
-  gtk_widget_show (z);\r
-  gtk_table_attach (GTK_TABLE (table), z, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
-  // Initialize dialog\r
-  gtk_entry_set_text (GTK_ENTRY (x), "1.0");\r
-  gtk_entry_set_text (GTK_ENTRY (y), "1.0");\r
-  gtk_entry_set_text (GTK_ENTRY (z), "1.0");\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    float sx, sy, sz;\r
-    sx = atof (gtk_entry_get_text (GTK_ENTRY (x)));\r
-    sy = atof (gtk_entry_get_text (GTK_ENTRY (y)));\r
-    sz = atof (gtk_entry_get_text (GTK_ENTRY (z)));\r
-\r
-    if (sx > 0 && sy > 0 && sz > 0)\r
-    {\r
-      Select_Scale(sx, sy, sz);\r
-      Sys_UpdateWindows (W_ALL);\r
-    }\r
-    else\r
-      Sys_Printf("Warning.. Tried to scale by a zero value.");\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Thicken Patch dialog\r
-\r
-void DoThickenDlg ()\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *vbox2, *button, *label;\r
-  GtkWidget *amount, *seams, *group;\r
-  int loop = 1, ret = IDCANCEL;\r
-  static qboolean bGroupResult = true;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Thicken Patch");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
-  label = gtk_label_new ("This produces a set of patches\n"\r
-                        "that contains the original patch along with the\n"\r
-                        "'thick' patch and an optimal set of seam patches.");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
-  vbox2 = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox2);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);\r
-\r
-  button = gtk_button_new_with_label ("OK");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
-  label = gtk_label_new ("Amount:");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
-  amount = gtk_entry_new ();\r
-  gtk_widget_show (amount);\r
-  gtk_box_pack_start (GTK_BOX (hbox), amount, FALSE, FALSE, 0);\r
-\r
-  seams = gtk_check_button_new_with_label ("Seams");\r
-  gtk_widget_show (seams);\r
-  gtk_box_pack_start (GTK_BOX (hbox), seams, FALSE, FALSE, 0);\r
-  \r
-  // bGroupResult\r
-  group = gtk_check_button_new_with_label("Result to func_group");\r
-  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(group), bGroupResult);\r
-  gtk_box_pack_start(GTK_BOX(vbox), group, FALSE, FALSE, 0);\r
-  gtk_widget_show(group);\r
-  \r
-\r
-  // Initialize dialog\r
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (seams), TRUE);\r
-  gtk_entry_set_text (GTK_ENTRY (amount), "8");\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group)))\r
-      bGroupResult = true;\r
-    else\r
-      bGroupResult = false;\r
-    Patch_Thicken (atoi (gtk_entry_get_text (GTK_ENTRY (amount))),\r
-                  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (seams)), bGroupResult);\r
-    Sys_UpdateWindows (W_ALL);\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// About dialog (no program is complete without one)\r
-\r
-void about_button_changelog (GtkWidget *widget, gpointer data)\r
-{\r
-  Str log;\r
-  log = g_strAppPath;\r
-  log += "changelog.txt";\r
-  OpenURL(log.GetBuffer());\r
-}\r
-\r
-void about_button_credits (GtkWidget *widget, gpointer data)\r
-{\r
-  Str cred;\r
-  cred = g_strAppPath;\r
-  cred += "credits.html";\r
-  OpenURL(cred.GetBuffer());\r
-}\r
-\r
-void DoAbout ()\r
-{\r
-  GtkWidget *dlg, *vbox, *vbox2, *hbox, *frame, *table, *label, *pixmap, *button, *sc_extensions, *text_extensions;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "About GtkRadiant");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 10);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
-  vbox2 = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox2);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, FALSE, 0);\r
-\r
-  frame = gtk_frame_new ((char*)NULL);\r
-  gtk_widget_show (frame);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 0);\r
-  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);\r
-\r
-  pixmap = new_pixmap (g_pParentWnd->m_pWidget, "logo.bmp");\r
-  gtk_widget_show (pixmap);\r
-  gtk_container_add (GTK_CONTAINER (frame), pixmap);\r
-\r
-  label = gtk_label_new ("GtkRadiant " RADIANT_VERSION "\n"\r
-    __DATE__ "\n\n"\r
-    RADIANT_ABOUTMSG "\n\n"\r
-    "By qeradiant.com\n\n"\r
-    "This product contains software technology\n"\r
-    "from id Software, Inc. ('id Technology').\n"\r
-    "id Technology 2000 id Software,Inc.\n\n"\r
-    "GtkRadiant is unsupported, however\n"\r
-    "you may report your problems at\n"\r
-    "http://zerowing.idsoftware.com/bugzilla"\r
-  );\r
-                         \r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
-  vbox2 = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox2);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);\r
-\r
-  button = gtk_button_new_with_label ("OK");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-\r
-  button = gtk_button_new_with_label ("Credits");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (about_button_credits), NULL);\r
-\r
-  button = gtk_button_new_with_label ("Changelog");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (about_button_changelog), NULL);\r
-\r
-  frame = gtk_frame_new ("OpenGL Properties");\r
-  gtk_widget_show (frame);\r
-  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);\r
-\r
-  table = gtk_table_new (3, 2, FALSE);\r
-  gtk_widget_show (table);\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
-  gtk_container_set_border_width (GTK_CONTAINER (table), 5);\r
\r
-  label = gtk_label_new ("Vendor:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ("Version:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ("Renderer:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ((char*)qglGetString (GL_VENDOR));\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ((char*)qglGetString (GL_VERSION));\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ((char*)qglGetString (GL_RENDERER));\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  frame = gtk_frame_new ("OpenGL Extensions");\r
-  gtk_widget_show (frame);\r
-  gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_container_add (GTK_CONTAINER (frame), hbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);\r
-\r
-  sc_extensions = gtk_scrolled_window_new(NULL, NULL);\r
-  gtk_box_pack_start(GTK_BOX(hbox), sc_extensions, TRUE, TRUE, 0);\r
-  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_extensions), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sc_extensions), GTK_SHADOW_IN);\r
-  gtk_widget_show(sc_extensions);\r
-       \r
-  text_extensions = gtk_text_view_new();\r
-  gtk_text_view_set_editable(GTK_TEXT_VIEW(text_extensions), FALSE);\r
-  gtk_container_add (GTK_CONTAINER (sc_extensions), text_extensions);\r
-  GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_extensions));\r
-  gtk_text_buffer_set_text(buffer, (char *)qglGetString(GL_EXTENSIONS), -1);\r
-  gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_extensions), GTK_WRAP_WORD);;\r
-  gtk_widget_show(text_extensions);    \r
-       \r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Command List dialog \r
-\r
-void DoCommandListDlg ()\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *scr, *button;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Mapped Commands");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-  gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);\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
-  scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
-  {\r
-    GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);\r
-\r
-    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Command", renderer, "text", 0, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-    }\r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Key", renderer, "text", 1, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-    }\r
-\r
-    gtk_widget_show(view);\r
-    gtk_container_add(GTK_CONTAINER (scr), view);\r
-\r
-    {\r
-      // Initialize dialog\r
-      CString path;\r
-      path = g_strTempPath;\r
-      path += "commandlist.txt";\r
-\r
-      GSList *cmds = NULL;\r
-      int n;\r
-\r
-      for (n = 0; n < g_nCommandCount; n++)\r
-        cmds = g_slist_append (cmds, g_Commands[n].m_strCommand);\r
-      cmds = g_slist_sort (cmds, (gint (*)(const void *, const void *))strcmp);\r
-\r
-      Sys_Printf("Writing the command list to %s", path.GetBuffer() );\r
-      FILE* fileout = fopen (path.GetBuffer (), "wt");\r
-\r
-      while (cmds)\r
-      {\r
-        for (n = 0; n < g_nCommandCount; n++)\r
-          if (cmds->data == g_Commands[n].m_strCommand)\r
-           break;\r
-\r
-        char c = g_Commands[n].m_nKey;\r
-        CString strLine, strMod(""), strKeys (c);\r
-\r
-        for (int k = 0; k < g_nKeyCount; k++)\r
-        {\r
-          if (g_Keys[k].m_nVKKey == g_Commands[n].m_nKey)\r
-          {\r
-            strKeys = g_Keys[k].m_strName;\r
-            break;\r
-          }\r
-        }\r
-\r
-        if (g_Commands[n].m_nModifiers & RAD_SHIFT)\r
-          strMod = "Shift";\r
-        if (g_Commands[n].m_nModifiers & RAD_ALT)\r
-          strMod += (strMod.GetLength() > 0) ? " + Alt" : "Alt";\r
-        if (g_Commands[n].m_nModifiers & RAD_CONTROL)\r
-          strMod += (strMod.GetLength() > 0) ? " + Control" : "Control";\r
-        if (strMod.GetLength() > 0)\r
-          strMod += " + ";\r
-        strMod += strKeys;\r
-\r
-        {\r
-          GtkTreeIter iter;\r
-          gtk_list_store_append(store, &iter);\r
-          gtk_list_store_set(store, &iter, 0, g_Commands[n].m_strCommand, 1, strMod.GetBuffer (), -1);\r
-        }\r
\r
-        if (fileout != NULL)\r
-        {\r
-          strLine.Format("%-25s %s\r\n", g_Commands[n].m_strCommand, strMod.GetBuffer ());\r
-          fputs (strLine.GetBuffer (), fileout);\r
-        }\r
-\r
-        cmds = g_slist_remove (cmds, cmds->data);\r
-      }\r
-\r
-      if (fileout != NULL)\r
-        fclose (fileout);\r
-    }\r
-    \r
-    g_object_unref(G_OBJECT(store));\r
-  }\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
-  button = gtk_button_new_with_label ("Close");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Texture List dialog \r
-\r
-void DoTextureListDlg ()\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *scr, *button;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Textures");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-  gtk_window_set_default_size (GTK_WINDOW (dlg), 400, 400);\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
-  scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
-  GtkWidget* texture_list;\r
-\r
-  {\r
-    GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);\r
-\r
-    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); \r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-    }\r
-\r
-    gtk_widget_show(view);\r
-    gtk_container_add(GTK_CONTAINER (scr), view);\r
-\r
-    {\r
-      // Initialize dialog\r
-      GSList *textures = (GSList*)NULL;\r
-      FillTextureMenu(&textures);\r
-      while (textures != NULL)\r
-      {\r
-        {\r
-          GtkTreeIter iter;\r
-          gtk_list_store_append(store, &iter);\r
-          gtk_list_store_set(store, &iter, 0, (gchar*)textures->data, -1);\r
-        }\r
-        free (textures->data);\r
-        textures = g_slist_remove (textures, textures->data);\r
-      }\r
-    }\r
-    \r
-    g_object_unref(G_OBJECT(store));\r
-\r
-    texture_list = view;\r
-  }\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
-  button = gtk_button_new_with_label ("Load");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Close");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(texture_list));\r
-\r
-    GtkTreeModel* model;\r
-    GtkTreeIter iter;\r
-    if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
-    {\r
-      GtkTreePath* path = gtk_tree_model_get_path(model, &iter);\r
-      if(gtk_tree_path_get_depth(path) == 1)\r
-        Texture_ShowDirectory(gtk_tree_path_get_indices(path)[0] + CMD_TEXTUREWAD);\r
-      gtk_tree_path_free(path);\r
-    }\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-// Cap dialog \r
-\r
-int DoCapDlg (int *type, bool *b_GroupResult)\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *table, *pixmap, *button, *group_toggle, *radio_vbox;\r
-  GtkWidget *bevel, *endcap, *ibevel, *iendcap;\r
-  GSList *group = (GSList*)NULL;\r
-       int loop = 1, ret = IDCANCEL;\r
-       \r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Cap");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  // Gef: Added a vbox to contain the toggle buttons\r
-  radio_vbox = gtk_vbox_new(FALSE, 4);\r
-  gtk_container_add(GTK_CONTAINER(hbox), radio_vbox);\r
-  gtk_widget_show(radio_vbox);\r
-               \r
-  table = gtk_table_new (4, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (radio_vbox), table, TRUE, TRUE, 0);\r
-  gtk_table_set_row_spacings (GTK_TABLE (table), 5);\r
-  gtk_table_set_col_spacings (GTK_TABLE (table), 5);\r
\r
-  pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_bevel.bmp");\r
-  gtk_widget_show (pixmap);\r
-  gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_endcap.bmp");\r
-  gtk_widget_show (pixmap);\r
-  gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_ibevel.bmp");\r
-  gtk_widget_show (pixmap);\r
-  gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  pixmap = new_pixmap (g_pParentWnd->m_pWidget, "cap_iendcap.bmp");\r
-  gtk_widget_show (pixmap);\r
-  gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 3, 4,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  bevel = gtk_radio_button_new_with_label (group, "Bevel");\r
-  gtk_widget_show (bevel);\r
-  gtk_table_attach (GTK_TABLE (table), bevel, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  group = gtk_radio_button_group (GTK_RADIO_BUTTON (bevel));\r
-\r
-  endcap = gtk_radio_button_new_with_label (group, "Endcap");\r
-  gtk_widget_show (endcap);\r
-  gtk_table_attach (GTK_TABLE (table), endcap, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  group = gtk_radio_button_group (GTK_RADIO_BUTTON (endcap));\r
-\r
-  ibevel = gtk_radio_button_new_with_label (group, "Inverted Bevel");\r
-  gtk_widget_show (ibevel);\r
-  gtk_table_attach (GTK_TABLE (table), ibevel, 1, 2, 2, 3,\r
-                    (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  group = gtk_radio_button_group (GTK_RADIO_BUTTON (ibevel));\r
-\r
-  iendcap = gtk_radio_button_new_with_label (group, "Inverted Endcap");\r
-  gtk_widget_show (iendcap);\r
-  gtk_table_attach (GTK_TABLE (table), iendcap, 1, 2, 3, 4,\r
-                    (GtkAttachOptions) (GTK_FILL | GTK_EXPAND),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  group = gtk_radio_button_group (GTK_RADIO_BUTTON (iendcap));\r
-\r
-  // Gef: added radio toggle for func_grouping capped patches\r
-  group_toggle = gtk_check_button_new_with_label("Result to func_group");\r
-  gtk_container_add(GTK_CONTAINER(radio_vbox), group_toggle);\r
-  gtk_widget_show(group_toggle);\r
-       \r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  // Gef: Set the state of the func_group toggle\r
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (group_toggle), *b_GroupResult);\r
-       \r
-  // Initialize dialog\r
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bevel), TRUE);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (bevel)))\r
-      *type = BEVEL; //*type = CapDialog::BEVEL;\r
-    else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (endcap)))\r
-      *type = ENDCAP; //*type = CapDialog::ENDCAP;\r
-    else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ibevel)))\r
-      *type = IBEVEL; // *type = CapDialog::IBEVEL;\r
-    else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (iendcap)))\r
-      *type = IENDCAP; // *type = CapDialog::IENDCAP;\r
-\r
-    // Gef: Added toggle for optional cap func_grouping\r
-    *b_GroupResult = (bool *)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group_toggle));\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-\r
-  return ret;\r
-}\r
-\r
-// =============================================================================\r
-// Scripts dialog \r
-\r
-void DoScriptsDlg ()\r
-{\r
-  GtkWidget *dlg, *vbox, *vbox2, *hbox, *label, *button, *scr;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Available Scripts - Not Implemented Yet");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  label = gtk_label_new ("WARNING: BrushScripting is in a highly experimental state and is\n"\r
-                        "far from complete. If you attempt to use them it is VERY LIKELY\n"\r
-                        "that Radiant will crash. Save your work before attempting to\n"\r
-                        "make use of any scripting features.");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);\r
-\r
-  scr = gtk_scrolled_window_new ((GtkAdjustment*)NULL, (GtkAdjustment*)NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_box_pack_start (GTK_BOX (hbox), scr, TRUE, TRUE, 0);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scr), GTK_SHADOW_IN);\r
-\r
-  GtkWidget* scripts_list;\r
-\r
-  {\r
-    GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING);\r
-\r
-    GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));\r
-    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); \r
-\r
-    {\r
-      GtkCellRenderer* renderer = gtk_cell_renderer_text_new();\r
-      GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("", renderer, "text", 0, NULL);\r
-      gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);\r
-    }\r
-\r
-    gtk_widget_show(view);\r
-    gtk_container_add(GTK_CONTAINER (scr), view);\r
-\r
-    {\r
-      // Initialize dialog\r
-      CString strINI;\r
-      strINI = g_strGameToolsPath;\r
-      strINI += "/scripts.ini";\r
-      FILE *f;\r
-\r
-      f = fopen (strINI.GetBuffer(), "rt");\r
-      if (f != NULL)\r
-      {\r
-        char line[1024], *ptr;\r
-\r
-        // read section names\r
-        while (fgets (line, 1024, f) != 0)\r
-        {\r
-          if (line[0] != '[')\r
-           continue;\r
-\r
-          ptr = strchr (line, ']');\r
-          *ptr = '\0';\r
-\r
-          {\r
-            GtkTreeIter iter;\r
-            gtk_list_store_append(store, &iter);\r
-            gtk_list_store_set(store, &iter, 0, line, -1);\r
-          }\r
-        }\r
-        fclose (f);\r
-      }\r
-    }\r
-    \r
-    g_object_unref(G_OBJECT(store));\r
-\r
-    scripts_list = view;\r
-  }\r
-\r
-  vbox2 = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox2);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);\r
-\r
-  button = gtk_button_new_with_label ("Run");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("New...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_widget_set_sensitive (button, FALSE);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Edit...");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_widget_set_sensitive (button, FALSE);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Close");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_end (GTK_BOX (vbox2), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(scripts_list));\r
-\r
-    GtkTreeModel* model;\r
-    GtkTreeIter iter;\r
-    if(gtk_tree_selection_get_selected(selection, &model, &iter))\r
-    {\r
-      char* script;\r
-      gtk_tree_model_get(model, &iter, 0, &script, -1);\r
-      RunScriptByName(script, true);\r
-      g_free(script);\r
-    }\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-}\r
-\r
-// =============================================================================\r
-//  dialog \r
-\r
-int DoBSInputDlg (const char *fields[5], float values[5])\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *label, *button;\r
-  GtkWidget *entries[5];\r
-  int i, loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "BrushScript Input");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
-  // Create entries and initialize them\r
-  for (i = 0; i < 5; i++)\r
-  {\r
-    if (strlen (fields[i]) == 0)\r
-      continue;\r
-\r
-    label = gtk_label_new (fields[i]);\r
-    gtk_widget_show (label);\r
-    gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
-    gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
-    gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
-    entries[i] = gtk_entry_new ();\r
-    gtk_widget_show (entries[i]);\r
-    gtk_box_pack_start (GTK_BOX (vbox), entries[i], TRUE, TRUE, 0);\r
-\r
-    char buf[32];\r
-    sprintf (buf, "%f", values[i]);\r
-    gtk_entry_set_text (GTK_ENTRY (entries[i]), buf);\r
-  }\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  for (i = 0; i < 5; i++)\r
-  {\r
-    if (strlen (fields[i]) == 0)\r
-      continue;\r
-\r
-    values[i] = atof (gtk_entry_get_text (GTK_ENTRY (entries[i])));\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-\r
-  return ret;\r
-}\r
-\r
-// =============================================================================\r
-// TextureLayout dialog \r
-\r
-int DoTextureLayout (float *fx, float *fy)\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *table, *label, *button;\r
-  GtkWidget *x, *y;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Patch texture layout");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
-  label = gtk_label_new ("Texture will be fit across the patch based\n"\r
-                        "on the x and y values given. Values of 1x1\n"\r
-                        "will \"fit\" the texture. 2x2 will repeat\n"\r
-                        "it twice, etc.");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
-  table = gtk_table_new (2, 2, FALSE);\r
-  gtk_widget_show (table);\r
-  gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, 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 ("Texture x:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  label = gtk_label_new ("Texture y:");\r
-  gtk_widget_show (label);\r
-  gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,\r
-                    (GtkAttachOptions) (GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  x = gtk_entry_new ();\r
-  gtk_widget_show (x);\r
-  gtk_table_attach (GTK_TABLE (table), x, 1, 2, 0, 1,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  y = gtk_entry_new ();\r
-  gtk_widget_show (y);\r
-  gtk_table_attach (GTK_TABLE (table), y, 1, 2, 1, 2,\r
-                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
-                    (GtkAttachOptions) (0), 0, 0);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  // Initialize\r
-  gtk_entry_set_text (GTK_ENTRY (x), "4.0");\r
-  gtk_entry_set_text (GTK_ENTRY (y), "4.0");\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-  {\r
-    *fx = atof (gtk_entry_get_text (GTK_ENTRY (x)));\r
-    *fy = atof (gtk_entry_get_text (GTK_ENTRY (y)));\r
-  }\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-\r
-  return ret;\r
-}\r
-\r
-// =============================================================================\r
-// Name dialog \r
-\r
-char* DoNameDlg (const char* title)\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;\r
-  int loop = 1, ret = IDCANCEL;\r
-  char *str;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), title);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\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
-  label = gtk_label_new ("Name:");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-    str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));\r
-  else\r
-    str = NULL;\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-\r
-  return str;\r
-}\r
-\r
-// =============================================================================\r
-// NewProject dialog \r
-\r
-char* DoNewProjectDlg ()\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry, *check;\r
-  int loop = 1, ret = IDCANCEL;\r
-  char *str;\r
-\r
-  // start by a warning message\r
-  // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=459\r
-  CString msg;\r
-  msg = "Are you sure you want a new project?\n";\r
-  msg += "Please note that creating a new project is not the prefered way to setup GtkRadiant for mod editing.\n";\r
-  msg += "Check http://www.qeradiant.com/faq/index.cgi?file=220 for more information";\r
-  if (gtk_MessageBox(NULL, msg.GetBuffer(), "Confirm", MB_YESNO, "http://www.qeradiant.com/faq/index.cgi?file=220" ) == IDNO)\r
-  {\r
-    return NULL;\r
-  }\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "New Project");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 10);\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
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);\r
-\r
-  label = gtk_label_new ("This will create a new directory beneath your\n"\r
-                        "game path based on the project name you give.");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-\r
-  label = gtk_label_new ("Project name:");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);\r
-  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
-  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);\r
-\r
-  check = gtk_check_button_new_with_label ("Include game dll files");\r
-  gtk_widget_show (check);\r
-  gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0);\r
-  gtk_widget_set_sensitive (check, FALSE);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-    str = strdup (gtk_entry_get_text (GTK_ENTRY (entry)));\r
-  else\r
-    str = NULL;\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-\r
-  return str;\r
-}\r
-\r
-// =============================================================================\r
-// Text Editor dialog \r
-\r
-// master window widget\r
-static GtkWidget *text_editor = NULL;\r
-static GtkWidget *text_widget; // slave, text widget from the gtk editor\r
-\r
-static gint editor_delete (GtkWidget *widget, gpointer data)\r
-{\r
-  if (gtk_MessageBox (widget, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)\r
-    return TRUE;\r
-\r
-  gtk_widget_hide (text_editor);\r
-\r
-  return TRUE;\r
-}\r
-\r
-static void editor_save (GtkWidget *widget, gpointer data)\r
-{\r
-  FILE *f = fopen ((char*)g_object_get_data (G_OBJECT (data), "filename"), "w");\r
-  gpointer text = g_object_get_data (G_OBJECT (data), "text");\r
-\r
-  if (f == NULL)\r
-  {\r
-    gtk_MessageBox (GTK_WIDGET(data), "Error saving file !");\r
-    return;\r
-  }\r
-\r
-  char *str = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1);\r
-  fwrite (str, 1, strlen (str), f);\r
-  fclose (f);\r
-}\r
-\r
-static void editor_close (GtkWidget *widget, gpointer data)\r
-{\r
-  if (gtk_MessageBox (text_editor, "Close the shader editor ?", "Radiant", MB_YESNO) == IDNO)\r
-    return;\r
-\r
-  gtk_widget_hide (text_editor);\r
-}\r
-\r
-// several attempts\r
-// http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355\r
-#if 0\r
-#ifdef _WIN32\r
-\r
-HWND FindEditWindow()\r
-{\r
-  return FindWindow("TFormEditPadLite", NULL);\r
-}\r
-\r
-HWND FindEditWindow()\r
-{\r
-  HWND hwnd = FindWindow("TFormEditPadLite", NULL);\r
-  if (hwnd)\r
-  {\r
-    hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
-    if (hwnd)\r
-    {\r
-      hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
-      if (hwnd)\r
-      {\r
-        hwnd = FindWindowEx(hwnd, NULL, "TEditPadEditor", NULL);\r
-        if (hwnd)\r
-        {\r
-          hwnd = FindWindowEx(hwnd, NULL, "TWinControlProxy", NULL);\r
-          return hwnd;\r
-        }\r
-      }\r
-    }\r
-  }\r
-  return NULL;\r
-}\r
-\r
-HWND FindEditWindow()\r
-{\r
-  HWND hwnd = FindWindow("TFormEditPadLite", NULL);\r
-  if (hwnd)\r
-  {\r
-    hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
-    if (hwnd)\r
-    {\r
-      hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
-      if (hwnd)\r
-      {\r
-        hwnd = FindWindowEx(hwnd, NULL, "TPanel", NULL);\r
-        if (hwnd)\r
-        {\r
-          hwnd = FindWindowEx(hwnd, NULL, "TFrameSearchReplace", NULL);\r
-          if (hwnd)\r
-          {\r
-            hwnd = FindWindowEx(hwnd, NULL, "TJGStringEditorControl", NULL);\r
-            return hwnd;\r
-          }\r
-        }\r
-      }\r
-    }\r
-  }\r
-  return NULL;\r
-}\r
-\r
-HWND FindEditWindow()\r
-{\r
-  HWND hwnd = FindWindow("TEditPadForm", NULL);\r
-  HWND hwndEdit = NULL;\r
-  if (hwnd != NULL)\r
-  {\r
-    HWND hwndTab = FindWindowEx(hwnd, NULL, "TTabControl", NULL);\r
-    if (hwndTab != NULL)\r
-    {\r
-      hwndEdit = FindWindowEx(hwndTab, NULL, "TRicherEdit", NULL);\r
-    }\r
-  }\r
-  return hwndEdit;\r
-}\r
-#endif\r
-#endif // #if 0\r
-\r
-static void CreateGtkTextEditor ()\r
-{\r
-  GtkWidget *dlg;\r
-  GtkWidget *vbox, *hbox, *button, *scr, *text;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (editor_delete), NULL);\r
-  gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 300);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_container_add (GTK_CONTAINER (dlg), vbox);\r
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);\r
-\r
-  scr = gtk_scrolled_window_new (NULL, NULL);\r
-  gtk_widget_show (scr);\r
-  gtk_box_pack_start (GTK_BOX (vbox), scr, TRUE, TRUE, 0);\r
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);\r
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);\r
-\r
-  text = gtk_text_view_new();\r
-  gtk_container_add (GTK_CONTAINER (scr), text);\r
-  gtk_widget_show (text);\r
-  g_object_set_data (G_OBJECT (dlg), "text", text);\r
-  gtk_text_view_set_editable (GTK_TEXT_VIEW(text), TRUE);\r
-\r
-  hbox = gtk_hbox_new (FALSE, 5);\r
-  gtk_widget_show (hbox);\r
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);\r
-\r
-  button = gtk_button_new_with_label ("Close");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (editor_close), dlg);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Save");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (editor_save), dlg);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  text_editor = dlg;\r
-  text_widget = text;\r
-}\r
-\r
-static void DoGtkTextEditor (const char* filename, guint cursorpos)\r
-{\r
-  if (!text_editor)\r
-    CreateGtkTextEditor(); // build it the first time we need it\r
-\r
-  // Load file\r
-  FILE *f = fopen (filename, "r");\r
-\r
-  if (f == NULL)\r
-  {\r
-    Sys_Printf("Unable to load file %s in shader editor.\n", filename);\r
-    gtk_widget_hide (text_editor);\r
-  }\r
-  else\r
-  {\r
-    fseek (f, 0, SEEK_END);\r
-    int len = ftell (f);\r
-    void *buf = qmalloc (len);\r
-    void *old_filename;\r
-\r
-    rewind (f);\r
-    fread (buf, 1, len, f);\r
-\r
-    gtk_window_set_title (GTK_WINDOW (text_editor), filename);\r
-\r
-    GtkTextBuffer* text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget));\r
-    gtk_text_buffer_set_text(text_buffer, (char*)buf, len);\r
-\r
-    old_filename = g_object_get_data (G_OBJECT (text_editor), "filename");\r
-    if (old_filename)\r
-      free(old_filename);\r
-    g_object_set_data (G_OBJECT (text_editor), "filename", strdup (filename));\r
-\r
-    // trying to show later\r
-    gtk_widget_show (text_editor);\r
-\r
-#ifdef _WIN32\r
-    while (gtk_events_pending ())\r
-      gtk_main_iteration ();\r
-#endif\r
-\r
-    // only move the cursor if it's not exceeding the size..\r
-    // NOTE: this is erroneous, cursorpos is the offset in bytes, not in characters\r
-    // len is the max size in bytes, not in characters either, but the character count is below that limit..\r
-    // thinking .. the difference between character count and byte count would be only because of CR/LF?\r
-    {\r
-      GtkTextIter text_iter;\r
-      // character offset, not byte offset\r
-      gtk_text_buffer_get_iter_at_offset(text_buffer, &text_iter, cursorpos);\r
-      gtk_text_buffer_place_cursor(text_buffer, &text_iter);\r
-    }\r
-\r
-#ifdef _WIN32\r
-    gtk_widget_queue_draw(text_widget);\r
-#endif\r
-\r
-    free (buf);\r
-    fclose (f);\r
-  }\r
-}\r
-\r
-void DoTextEditor (const char* filename, int cursorpos)\r
-{\r
-  CString strEditCommand;\r
-#ifdef _WIN32\r
-  if (g_PrefsDlg.m_bUseWin32Editor)\r
-  {\r
-    Sys_Printf("opening file '%s' (line %d info ignored)\n", filename);\r
-    ShellExecute((HWND)GDK_WINDOW_HWND (g_pParentWnd->m_pWidget->window), "open", filename, NULL, NULL, SW_SHOW );\r
-    return;\r
-  }\r
-#else\r
-  // check if a custom editor is set\r
-  if((g_PrefsDlg.m_bUseCustomEditor) && (g_PrefsDlg.m_strEditorCommand.GetLength() > 0))\r
-  {\r
-    strEditCommand = g_PrefsDlg.m_strEditorCommand;\r
-    strEditCommand += " \"";\r
-    strEditCommand += filename;\r
-    strEditCommand += "\"";\r
-    \r
-    Sys_Printf("Launching: %s\n", strEditCommand.GetBuffer());\r
-    // note: linux does not return false if the command failed so it will assume success\r
-    if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)\r
-    {\r
-      Sys_FPrintf(SYS_WRN, "Warning: Failed to execute %s, using default\n", strEditCommand.GetBuffer());\r
-    }\r
-    else\r
-    {\r
-      // the command (appeared) to run successfully, no need to do anything more\r
-      return;\r
-    }\r
-  }\r
-#endif\r
-  \r
-  DoGtkTextEditor (filename, cursorpos);\r
-\r
-  // old win32 code with EditPad bindings, broken\r
-  // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=355\r
-#if 0\r
-  strEditCommand = g_strAppPath.GetBuffer();\r
-  strEditCommand += "editpad.exe";\r
-  strEditCommand += " \"";\r
-  strEditCommand += filename;\r
-  strEditCommand += "\"";\r
-  if (Q_Exec(NULL, (char *)strEditCommand.GetBuffer(), NULL, true) == false)\r
-  {\r
-    Sys_FPrintf(SYS_WRN, "WARNING: Gtk shader editor is not fully functional on windows in general and unstable on win98 in particular.\n");\r
-    Sys_FPrintf(SYS_WRN, "  you can use EditPad instead (install it in Radiant's directory): http://www.qeradiant.com/?data=files&files_dir=18\n");\r
-    DoGtkTextEditor (filename, cursorpos);\r
-  }\r
-  else\r
-  {\r
-    // TTimo: we used to call Delay here, to continue processing messages. But it seems to induce a lot of instabilities.\r
-    // so now the user will simply have to wait.\r
-    Sleep( 1500 );\r
-\r
-       // now grab the edit window and scroll to the shader we want to edit\r
-    HWND hwndEdit = FindEditWindow();\r
-\r
-    if (hwndEdit != NULL)\r
-      PostMessage(hwndEdit, EM_SETSEL, cursorpos, cursorpos);\r
-    else\r
-      Sys_Printf("Unable to load shader editor.\n");\r
-  }\r
-#endif\r
-}\r
-\r
-// =============================================================================\r
-// Light Intensity dialog \r
-\r
-int DoLightIntensityDlg (int *intensity)\r
-{\r
-  GtkWidget *dlg, *vbox, *hbox, *label, *button, *entry;\r
-  int loop = 1, ret = IDCANCEL;\r
-\r
-  dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
-  gtk_window_set_title (GTK_WINDOW (dlg), "Light intensity");\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",\r
-                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);\r
-  gtk_signal_connect (GTK_OBJECT (dlg), "destroy",\r
-                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
-  g_object_set_data (G_OBJECT (dlg), "loop", &loop);\r
-  g_object_set_data (G_OBJECT (dlg), "ret", &ret);\r
-\r
-  GtkAccelGroup *accel_group = gtk_accel_group_new ();\r
-  gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);\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
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);\r
-\r
-  label = gtk_label_new ("ESC for default, ENTER to validate");\r
-  gtk_widget_show (label);\r
-  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);\r
-\r
-  entry = gtk_entry_new ();\r
-  gtk_widget_show (entry);\r
-  gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);\r
-\r
-  vbox = gtk_vbox_new (FALSE, 5);\r
-  gtk_widget_show (vbox);\r
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 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, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));\r
-  gtk_widget_add_accelerator (button, "clicked", accel_group,\r
-                              GDK_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  button = gtk_button_new_with_label ("Cancel");\r
-  gtk_widget_show (button);\r
-  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);\r
-  gtk_signal_connect (GTK_OBJECT (button), "clicked",\r
-                     GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));\r
-  gtk_widget_add_accelerator (button, "clicked", accel_group,\r
-                              GDK_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE);\r
-  gtk_widget_set_usize (button, 60, -2);\r
-\r
-  char buf[16];\r
-  sprintf (buf, "%d", *intensity);\r
-  gtk_entry_set_text (GTK_ENTRY (entry), buf);\r
-\r
-  gtk_grab_add (dlg);\r
-  gtk_widget_show (dlg);\r
-\r
-  while (loop)\r
-    gtk_main_iteration ();\r
-\r
-  if (ret == IDOK)\r
-    *intensity = atoi (gtk_entry_get_text (GTK_ENTRY (entry)));\r
-\r
-  gtk_grab_remove (dlg);\r
-  gtk_widget_destroy (dlg);\r
-\r
-  return ret;\r
-}\r
+/*
+   Copyright (c) 2001, Loki software, inc.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without modification,
+   are permitted provided that the following conditions are met:
+
+   Redistributions of source code must retain the above copyright notice, this list
+   of conditions and the following disclaimer.
+
+   Redistributions in binary form must reproduce the above copyright notice, this
+   list of conditions and the following disclaimer in the documentation and/or
+   other materials provided with the distribution.
+
+   Neither the name of Loki software nor the names of its contributors may be used
+   to endorse or promote products derived from this software without specific prior
+   written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+   DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//
+// Some small dialogs that don't need much
+//
+// Leonardo Zide (leo@lokigames.com)
+//
+
+#include "gtkdlgs.h"
+#include "globaldefs.h"
+
+#include <gtk/gtk.h>
+
+#include "debugging/debugging.h"
+#include "version.h"
+#include "aboutmsg.h"
+
+#include "igl.h"
+#include "iscenegraph.h"
+#include "iselection.h"
+
+#include <gdk/gdkkeysyms.h>
+#include <uilib/uilib.h>
+
+#include "os/path.h"
+#include "math/aabb.h"
+#include "container/array.h"
+#include "generic/static.h"
+#include "stream/stringstream.h"
+#include "convert.h"
+#include "gtkutil/messagebox.h"
+#include "gtkutil/image.h"
+
+#include "gtkmisc.h"
+#include "brushmanip.h"
+#include "build.h"
+#include "qe3.h"
+#include "texwindow.h"
+#include "xywindow.h"
+#include "mainframe.h"
+#include "preferences.h"
+#include "url.h"
+#include "cmdlib.h"
+
+
+
+// =============================================================================
+// Project settings dialog
+
+class GameComboConfiguration
+{
+public:
+const char* basegame_dir;
+const char* basegame;
+const char* known_dir;
+const char* known;
+const char* custom;
+
+GameComboConfiguration() :
+       basegame_dir( g_pGameDescription->getRequiredKeyValue( "basegame" ) ),
+       basegame( g_pGameDescription->getRequiredKeyValue( "basegamename" ) ),
+       known_dir( g_pGameDescription->getKeyValue( "knowngame" ) ),
+       known( g_pGameDescription->getKeyValue( "knowngamename" ) ),
+       custom( g_pGameDescription->getRequiredKeyValue( "unknowngamename" ) ){
+}
+};
+
+typedef LazyStatic<GameComboConfiguration> LazyStaticGameComboConfiguration;
+
+inline GameComboConfiguration& globalGameComboConfiguration(){
+       return LazyStaticGameComboConfiguration::instance();
+}
+
+
+struct gamecombo_t
+{
+       gamecombo_t( int _game, const char* _fs_game, bool _sensitive )
+               : game( _game ), fs_game( _fs_game ), sensitive( _sensitive )
+       {}
+       int game;
+       const char* fs_game;
+       bool sensitive;
+};
+
+gamecombo_t gamecombo_for_dir( const char* dir ){
+       if ( string_equal( dir, globalGameComboConfiguration().basegame_dir ) ) {
+               return gamecombo_t( 0, "", false );
+       }
+       else if ( string_equal( dir, globalGameComboConfiguration().known_dir ) ) {
+               return gamecombo_t( 1, dir, false );
+       }
+       else
+       {
+               return gamecombo_t( string_empty( globalGameComboConfiguration().known_dir ) ? 1 : 2, dir, true );
+       }
+}
+
+gamecombo_t gamecombo_for_gamename( const char* gamename ){
+       if ( ( strlen( gamename ) == 0 ) || !strcmp( gamename, globalGameComboConfiguration().basegame ) ) {
+               return gamecombo_t( 0, "", false );
+       }
+       else if ( !strcmp( gamename, globalGameComboConfiguration().known ) ) {
+               return gamecombo_t( 1, globalGameComboConfiguration().known_dir, false );
+       }
+       else
+       {
+               return gamecombo_t( string_empty( globalGameComboConfiguration().known_dir ) ? 1 : 2, "", true );
+       }
+}
+
+inline void path_copy_clean( char* destination, const char* source ){
+       char* i = destination;
+
+       while ( *source != '\0' )
+       {
+               *i++ = ( *source == '\\' ) ? '/' : *source;
+               ++source;
+       }
+
+       if ( i != destination && *( i - 1 ) != '/' ) {
+               *( i++ ) = '/';
+       }
+
+       *i = '\0';
+}
+
+
+struct GameCombo
+{
+       ui::ComboBoxText game_select{ui::null};
+       ui::Entry fsgame_entry{ui::null};
+};
+
+gboolean OnSelchangeComboWhatgame( ui::Widget widget, GameCombo* combo ){
+       const char *gamename;
+       {
+               GtkTreeIter iter;
+               gtk_combo_box_get_active_iter( combo->game_select, &iter );
+               gtk_tree_model_get( gtk_combo_box_get_model( combo->game_select ), &iter, 0, (gpointer*)&gamename, -1 );
+       }
+
+       gamecombo_t gamecombo = gamecombo_for_gamename( gamename );
+
+       combo->fsgame_entry.text( gamecombo.fs_game );
+       gtk_widget_set_sensitive( combo->fsgame_entry , gamecombo.sensitive );
+
+       return FALSE;
+}
+
+class MappingMode
+{
+public:
+bool do_mapping_mode;
+const char* sp_mapping_mode;
+const char* mp_mapping_mode;
+
+MappingMode() :
+       do_mapping_mode( !string_empty( g_pGameDescription->getKeyValue( "show_gamemode" ) ) ),
+       sp_mapping_mode( "Single Player mapping mode" ),
+       mp_mapping_mode( "Multiplayer mapping mode" ){
+}
+};
+
+typedef LazyStatic<MappingMode> LazyStaticMappingMode;
+
+inline MappingMode& globalMappingMode(){
+       return LazyStaticMappingMode::instance();
+}
+
+class ProjectSettingsDialog
+{
+public:
+GameCombo game_combo;
+GtkComboBox* gamemode_combo;
+};
+
+ui::Window ProjectSettingsDialog_construct( ProjectSettingsDialog& dialog, ModalDialog& modal ){
+       auto window = MainFrame_getWindow().create_dialog_window("Project Settings", G_CALLBACK(dialog_delete_callback ), &modal );
+
+       {
+               auto table1 = create_dialog_table( 1, 2, 4, 4, 4 );
+               window.add(table1);
+               {
+            auto vbox = create_dialog_vbox( 4 );
+            table1.attach(vbox, {1, 2, 0, 1}, {GTK_FILL, GTK_FILL});
+                       {
+                auto button = create_dialog_button( "OK", G_CALLBACK( dialog_button_ok ), &modal );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                       }
+                       {
+                auto button = create_dialog_button( "Cancel", G_CALLBACK( dialog_button_cancel ), &modal );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                       }
+               }
+               {
+                       auto frame = create_dialog_frame( "Project settings" );
+            table1.attach(frame, {0, 1, 0, 1}, {GTK_EXPAND | GTK_FILL, GTK_FILL});
+                       {
+                               auto table2 = create_dialog_table( ( globalMappingMode().do_mapping_mode ) ? 4 : 3, 2, 4, 4, 4 );
+                               frame.add(table2);
+
+                               {
+                                       auto label = ui::Label( "Select mod" );
+                                       label.show();
+                    table2.attach(label, {0, 1, 0, 1}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
+                               }
+                               {
+                                       dialog.game_combo.game_select = ui::ComboBoxText(ui::New);
+
+                                       gtk_combo_box_text_append_text( dialog.game_combo.game_select, globalGameComboConfiguration().basegame );
+                                       if ( globalGameComboConfiguration().known[0] != '\0' ) {
+                                               gtk_combo_box_text_append_text( dialog.game_combo.game_select, globalGameComboConfiguration().known );
+                                       }
+                                       gtk_combo_box_text_append_text( dialog.game_combo.game_select, globalGameComboConfiguration().custom );
+
+                                       dialog.game_combo.game_select.show();
+                    table2.attach(dialog.game_combo.game_select, {1, 2, 0, 1}, {GTK_EXPAND | GTK_FILL, 0});
+
+                                       dialog.game_combo.game_select.connect( "changed", G_CALLBACK( OnSelchangeComboWhatgame ), &dialog.game_combo );
+                               }
+
+                               {
+                                       auto label = ui::Label( "fs_game" );
+                                       label.show();
+                    table2.attach(label, {0, 1, 1, 2}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
+                               }
+                               {
+                                       auto entry = ui::Entry(ui::New);
+                                       entry.show();
+                    table2.attach(entry, {1, 2, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
+
+                                       dialog.game_combo.fsgame_entry = entry;
+                               }
+
+                               if ( globalMappingMode().do_mapping_mode ) {
+                                       auto label = ui::Label( "Mapping mode" );
+                                       label.show();
+                    table2.attach(label, {0, 1, 3, 4}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
+
+                                       auto combo = ui::ComboBoxText(ui::New);
+                                       gtk_combo_box_text_append_text( combo, globalMappingMode().sp_mapping_mode );
+                                       gtk_combo_box_text_append_text( combo, globalMappingMode().mp_mapping_mode );
+
+                                       combo.show();
+                    table2.attach(combo, {1, 2, 3, 4}, {GTK_EXPAND | GTK_FILL, 0});
+
+                                       dialog.gamemode_combo = combo;
+                               }
+                       }
+               }
+       }
+
+       // initialise the fs_game selection from the project settings into the dialog
+       const char* dir = gamename_get();
+       gamecombo_t gamecombo = gamecombo_for_dir( dir );
+
+       gtk_combo_box_set_active( dialog.game_combo.game_select, gamecombo.game );
+       dialog.game_combo.fsgame_entry.text( gamecombo.fs_game );
+       gtk_widget_set_sensitive( dialog.game_combo.fsgame_entry , gamecombo.sensitive );
+
+       if ( globalMappingMode().do_mapping_mode ) {
+               const char *gamemode = gamemode_get();
+               if ( string_empty( gamemode ) || string_equal( gamemode, "sp" ) ) {
+                       gtk_combo_box_set_active( dialog.gamemode_combo, 0 );
+               }
+               else
+               {
+                       gtk_combo_box_set_active( dialog.gamemode_combo, 1 );
+               }
+       }
+
+       return window;
+}
+
+void ProjectSettingsDialog_ok( ProjectSettingsDialog& dialog ){
+       const char* dir = gtk_entry_get_text( dialog.game_combo.fsgame_entry );
+
+       const char* new_gamename = path_equal( dir, globalGameComboConfiguration().basegame_dir )
+                                                          ? ""
+                                                          : dir;
+
+       if ( !path_equal( new_gamename, gamename_get() ) ) {
+               ScopeDisableScreenUpdates disableScreenUpdates( "Processing...", "Changing Game Name" );
+
+               EnginePath_Unrealise();
+
+               gamename_set( new_gamename );
+
+               EnginePath_Realise();
+       }
+
+       if ( globalMappingMode().do_mapping_mode ) {
+               // read from gamemode_combo
+               int active = gtk_combo_box_get_active( dialog.gamemode_combo );
+               if ( active == -1 || active == 0 ) {
+                       gamemode_set( "sp" );
+               }
+               else
+               {
+                       gamemode_set( "mp" );
+               }
+       }
+}
+
+void DoProjectSettings(){
+       if ( ConfirmModified( "Edit Project Settings" ) ) {
+               ModalDialog modal;
+               ProjectSettingsDialog dialog;
+
+               ui::Window window = ProjectSettingsDialog_construct( dialog, modal );
+
+               if ( modal_dialog_show( window, modal ) == eIDOK ) {
+                       ProjectSettingsDialog_ok( dialog );
+               }
+
+               window.destroy();
+       }
+}
+
+// =============================================================================
+// Arbitrary Sides dialog
+
+void DoSides( int type, int axis ){
+       ModalDialog dialog;
+       GtkEntry* sides_entry;
+
+       auto window = MainFrame_getWindow().create_dialog_window("Arbitrary sides", G_CALLBACK(dialog_delete_callback ), &dialog );
+
+       auto accel = ui::AccelGroup(ui::New);
+       window.add_accel_group( accel );
+
+       {
+               auto hbox = create_dialog_hbox( 4, 4 );
+               window.add(hbox);
+               {
+                       auto label = ui::Label( "Sides:" );
+                       label.show();
+                       hbox.pack_start( label, FALSE, FALSE, 0 );
+               }
+               {
+                       auto entry = ui::Entry(ui::New);
+                       entry.show();
+                       hbox.pack_start( entry, FALSE, FALSE, 0 );
+                       sides_entry = entry;
+                       gtk_widget_grab_focus( entry  );
+               }
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, TRUE, TRUE, 0 );
+                       {
+                               auto button = create_dialog_button( "OK", G_CALLBACK( dialog_button_ok ), &dialog );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               widget_make_default( button );
+                               gtk_widget_add_accelerator( button , "clicked", accel, GDK_KEY_Return, (GdkModifierType)0, (GtkAccelFlags)0 );
+                       }
+                       {
+                auto button = create_dialog_button( "Cancel", G_CALLBACK( dialog_button_cancel ), &dialog );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               gtk_widget_add_accelerator( button , "clicked", accel, GDK_KEY_Escape, (GdkModifierType)0, (GtkAccelFlags)0 );
+                       }
+               }
+       }
+
+       if ( modal_dialog_show( window, dialog ) == eIDOK ) {
+               const char *str = gtk_entry_get_text( sides_entry );
+
+               Scene_BrushConstructPrefab( GlobalSceneGraph(), (EBrushPrefab)type, atoi( str ), TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ) );
+       }
+
+       window.destroy();
+}
+
+// =============================================================================
+// About dialog (no program is complete without one)
+
+void about_button_changelog( ui::Widget widget, gpointer data ){
+       StringOutputStream log( 256 );
+       log << "https://gitlab.com/xonotic/netradiant/commits/master";
+       OpenURL( log.c_str() );
+}
+
+void about_button_credits( ui::Widget widget, gpointer data ){
+       StringOutputStream cred( 256 );
+       cred << "https://gitlab.com/xonotic/netradiant/graphs/master";
+       OpenURL( cred.c_str() );
+}
+
+void about_button_issues( GtkWidget *widget, gpointer data ){
+       StringOutputStream cred( 256 );
+       cred << "https://gitlab.com/xonotic/netradiant/issues";
+       OpenURL( cred.c_str() );
+}
+
+void DoAbout(){
+       ModalDialog dialog;
+       ModalDialogButton ok_button( dialog, eIDOK );
+
+       auto window = MainFrame_getWindow().create_modal_dialog_window("About NetRadiant", dialog );
+
+       {
+               auto vbox = create_dialog_vbox( 4, 4 );
+               window.add(vbox);
+
+               {
+            auto hbox = create_dialog_hbox( 4 );
+                       vbox.pack_start( hbox, FALSE, TRUE, 0 );
+
+                       {
+                auto vbox2 = create_dialog_vbox( 4 );
+                               hbox.pack_start( vbox2, TRUE, FALSE, 0 );
+                               {
+                                       auto frame = create_dialog_frame( 0, ui::Shadow::IN );
+                                       vbox2.pack_start( frame, FALSE, FALSE, 0 );
+                                       {
+                                               auto image = new_local_image( "logo.png" );
+                                               image.show();
+                                               frame.add(image);
+                                       }
+                               }
+                       }
+
+                       {
+                               char const *label_text = "NetRadiant " RADIANT_VERSION "\n"
+                                                                               __DATE__ "\n\n"
+                                        RADIANT_ABOUTMSG "\n\n"
+                                                                               "This program is free software\n"
+                                                                               "licensed under the GNU GPL.\n\n"
+                                                                               "NetRadiant is unsupported, however\n"
+                                                                               "you may report your problems at\n"
+                                                                               "https://gitlab.com/xonotic/netradiant/issues";
+
+                               auto label = ui::Label( label_text );
+
+                               label.show();
+                               hbox.pack_start( label, FALSE, FALSE, 0 );
+                               gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
+                               gtk_label_set_justify( label, GTK_JUSTIFY_LEFT );
+                       }
+
+                       {
+                auto vbox2 = create_dialog_vbox( 4 );
+                               hbox.pack_start( vbox2, FALSE, TRUE, 0 );
+                               {
+                    auto button = create_modal_dialog_button( "OK", ok_button );
+                                       vbox2.pack_start( button, FALSE, FALSE, 0 );
+                               }
+                               {
+                    auto button = create_dialog_button( "Credits", G_CALLBACK( about_button_credits ), 0 );
+                                       vbox2.pack_start( button, FALSE, FALSE, 0 );
+                               }
+                               {
+                    auto button = create_dialog_button( "Changes", G_CALLBACK( about_button_changelog ), 0 );
+                                       vbox2.pack_start( button, FALSE, FALSE, 0 );
+                               }
+                               {
+                    auto button = create_dialog_button( "Issues", G_CALLBACK( about_button_issues ), 0 );
+                                       vbox2.pack_start( button, FALSE, FALSE, 0 );
+                               }
+                       }
+               }
+               {
+                       auto frame = create_dialog_frame( "OpenGL Properties" );
+                       vbox.pack_start( frame, FALSE, FALSE, 0 );
+                       {
+                               auto table = create_dialog_table( 3, 2, 4, 4, 4 );
+                               frame.add(table);
+                               {
+                                       auto label = ui::Label( "Vendor:" );
+                                       label.show();
+                    table.attach(label, {0, 1, 0, 1}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                               {
+                                       auto label = ui::Label( "Version:" );
+                                       label.show();
+                    table.attach(label, {0, 1, 1, 2}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                               {
+                                       auto label = ui::Label( "Renderer:" );
+                                       label.show();
+                    table.attach(label, {0, 1, 2, 3}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                               {
+                                       auto label = ui::Label( reinterpret_cast<const char*>( glGetString( GL_VENDOR ) ) );
+                                       label.show();
+                    table.attach(label, {1, 2, 0, 1}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                               {
+                                       auto label = ui::Label( reinterpret_cast<const char*>( glGetString( GL_VERSION ) ) );
+                                       label.show();
+                    table.attach(label, {1, 2, 1, 2}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                               {
+                                       auto label = ui::Label( reinterpret_cast<const char*>( glGetString( GL_RENDERER ) ) );
+                                       label.show();
+                    table.attach(label, {1, 2, 2, 3}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                       }
+                       {
+                               auto frame = create_dialog_frame( "OpenGL Extensions" );
+                               vbox.pack_start( frame, TRUE, TRUE, 0 );
+                               {
+                                       auto sc_extensions = create_scrolled_window( ui::Policy::AUTOMATIC, ui::Policy::ALWAYS, 4 );
+                                       frame.add(sc_extensions);
+                                       {
+                                               auto text_extensions = ui::TextView(ui::New);
+                                               gtk_text_view_set_editable( text_extensions, FALSE );
+                                               sc_extensions.add(text_extensions);
+                                               text_extensions.text(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)));
+                                               gtk_text_view_set_wrap_mode( text_extensions, GTK_WRAP_WORD );
+                                               text_extensions.show();
+                                       }
+                               }
+                       }
+               }
+       }
+
+       modal_dialog_show( window, dialog );
+
+       window.destroy();
+}
+
+// =============================================================================
+// TextureLayout dialog
+
+// Last used texture scale values
+static float last_used_texture_layout_scale_x = 4.0;
+static float last_used_texture_layout_scale_y = 4.0;
+
+EMessageBoxReturn DoTextureLayout( float *fx, float *fy ){
+       ModalDialog dialog;
+       ModalDialogButton ok_button( dialog, eIDOK );
+       ModalDialogButton cancel_button( dialog, eIDCANCEL );
+       ui::Entry x{ui::null};
+       ui::Entry y{ui::null};
+
+       auto window = MainFrame_getWindow().create_modal_dialog_window("Patch texture layout", dialog );
+
+       auto accel = ui::AccelGroup(ui::New);
+       window.add_accel_group( accel );
+
+       {
+               auto hbox = create_dialog_hbox( 4, 4 );
+               window.add(hbox);
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, TRUE, TRUE, 0 );
+                       {
+                               auto label = ui::Label( "Texture will be fit across the patch based\n"
+                                                                                                                       "on the x and y values given. Values of 1x1\n"
+                                                                                                                       "will \"fit\" the texture. 2x2 will repeat\n"
+                                                                                                                       "it twice, etc." );
+                               label.show();
+                               vbox.pack_start( label, TRUE, TRUE, 0 );
+                               gtk_label_set_justify( label, GTK_JUSTIFY_LEFT );
+                       }
+                       {
+                               auto table = create_dialog_table( 2, 2, 4, 4 );
+                               table.show();
+                               vbox.pack_start( table, TRUE, TRUE, 0 );
+                               {
+                                       auto label = ui::Label( "Texture x:" );
+                                       label.show();
+                    table.attach(label, {0, 1, 0, 1}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                               {
+                                       auto label = ui::Label( "Texture y:" );
+                                       label.show();
+                    table.attach(label, {0, 1, 1, 2}, {GTK_FILL, 0});
+                                       gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+                               }
+                               {
+                                       auto entry = ui::Entry(ui::New);
+                                       entry.show();
+                    table.attach(entry, {1, 2, 0, 1}, {GTK_EXPAND | GTK_FILL, 0});
+
+                                       x = entry;
+                               }
+                               {
+                                       auto entry = ui::Entry(ui::New);
+                                       entry.show();
+                    table.attach(entry, {1, 2, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
+
+                                       y = entry;
+                               }
+                       }
+               }
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, FALSE, FALSE, 0 );
+                       {
+                               auto button = create_modal_dialog_button( "OK", ok_button );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               widget_make_default( button );
+                               gtk_widget_add_accelerator( button , "clicked", accel, GDK_KEY_Return, (GdkModifierType)0, (GtkAccelFlags)0 );
+                       }
+                       {
+                auto button = create_modal_dialog_button( "Cancel", cancel_button );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               gtk_widget_add_accelerator( button , "clicked", accel, GDK_KEY_Escape, (GdkModifierType)0, (GtkAccelFlags)0 );
+                       }
+               }
+       }
+       
+       // Initialize with last used values
+       char buf[16];
+       
+       sprintf( buf, "%f", last_used_texture_layout_scale_x );
+       x.text( buf );
+       
+       sprintf( buf, "%f", last_used_texture_layout_scale_y );
+       y.text( buf );
+
+       // Set focus after intializing the values
+       gtk_widget_grab_focus( x  );
+
+       EMessageBoxReturn ret = modal_dialog_show( window, dialog );
+       if ( ret == eIDOK ) {
+               *fx = static_cast<float>( atof( gtk_entry_get_text( x ) ) );
+               *fy = static_cast<float>( atof( gtk_entry_get_text( y ) ) );
+       
+               // Remember last used values
+               last_used_texture_layout_scale_x = *fx;
+               last_used_texture_layout_scale_y = *fy;
+       }
+
+       window.destroy();
+
+       return ret;
+}
+
+// =============================================================================
+// Text Editor dialog
+
+// master window widget
+static ui::Window text_editor{ui::null};
+static ui::Widget text_widget{ui::null}; // slave, text widget from the gtk editor
+
+static gint editor_delete( ui::Widget widget, gpointer data ){
+       if ( widget.window().alert( "Close the shader editor ?", "Radiant", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::NO ) {
+               return TRUE;
+       }
+
+       text_editor.hide();
+
+       return TRUE;
+}
+
+static void editor_save( ui::Widget widget, gpointer data ){
+       FILE *f = fopen( (char*)g_object_get_data( G_OBJECT( data ), "filename" ), "w" );
+       gpointer text = g_object_get_data( G_OBJECT( data ), "text" );
+
+       if ( f == 0 ) {
+               ui::Widget::from(data).window().alert( "Error saving file !" );
+               return;
+       }
+
+       char *str = gtk_editable_get_chars( GTK_EDITABLE( text ), 0, -1 );
+       fwrite( str, 1, strlen( str ), f );
+       fclose( f );
+}
+
+static void editor_close( ui::Widget widget, gpointer data ){
+       if ( text_editor.window().alert( "Close the shader editor ?", "Radiant", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::NO ) {
+               return;
+       }
+
+       text_editor.hide();
+}
+
+static void CreateGtkTextEditor(){
+       auto dlg = ui::Window( ui::window_type::TOP );
+
+       dlg.connect( "delete_event",
+                                         G_CALLBACK( editor_delete ), 0 );
+       gtk_window_set_default_size( dlg, 600, 300 );
+
+       auto vbox = ui::VBox( FALSE, 5 );
+       vbox.show();
+       dlg.add(vbox);
+       gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+
+       auto scr = ui::ScrolledWindow(ui::New);
+       scr.show();
+       vbox.pack_start( scr, TRUE, TRUE, 0 );
+       gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
+       gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
+
+       auto text = ui::TextView(ui::New);
+       scr.add(text);
+       text.show();
+       g_object_set_data( G_OBJECT( dlg ), "text", (gpointer) text );
+       gtk_text_view_set_editable( text, TRUE );
+
+       auto hbox = ui::HBox( FALSE, 5 );
+       hbox.show();
+       vbox.pack_start( hbox, FALSE, TRUE, 0 );
+
+       auto button = ui::Button( "Close" );
+       button.show();
+       hbox.pack_end(button, FALSE, FALSE, 0);
+       button.connect( "clicked",
+                                         G_CALLBACK( editor_close ), dlg );
+       button.dimensions(60, -1);
+
+       button = ui::Button( "Save" );
+       button.show();
+       hbox.pack_end(button, FALSE, FALSE, 0);
+       button.connect( "clicked",
+                                         G_CALLBACK( editor_save ), dlg );
+       button.dimensions(60, -1);
+
+       text_editor = dlg;
+       text_widget = text;
+}
+
+static void DoGtkTextEditor( const char* filename, guint cursorpos ){
+       if ( !text_editor ) {
+               CreateGtkTextEditor(); // build it the first time we need it
+
+       }
+       // Load file
+       FILE *f = fopen( filename, "r" );
+
+       if ( f == 0 ) {
+               globalOutputStream() << "Unable to load file " << filename << " in shader editor.\n";
+               text_editor.hide();
+       }
+       else
+       {
+               fseek( f, 0, SEEK_END );
+               int len = ftell( f );
+               void *buf = malloc( len );
+               void *old_filename;
+
+               rewind( f );
+               fread( buf, 1, len, f );
+
+               gtk_window_set_title( text_editor, filename );
+
+               GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(ui::TextView::from(text_widget));
+               gtk_text_buffer_set_text( text_buffer, (char*)buf, len );
+
+               old_filename = g_object_get_data( G_OBJECT( text_editor ), "filename" );
+               if ( old_filename ) {
+                       free( old_filename );
+               }
+               g_object_set_data( G_OBJECT( text_editor ), "filename", strdup( filename ) );
+
+               // trying to show later
+               text_editor.show();
+
+#if GDEF_OS_WINDOWS
+               ui::process();
+#endif
+
+               // only move the cursor if it's not exceeding the size..
+               // NOTE: this is erroneous, cursorpos is the offset in bytes, not in characters
+               // len is the max size in bytes, not in characters either, but the character count is below that limit..
+               // thinking .. the difference between character count and byte count would be only because of CR/LF?
+               {
+                       GtkTextIter text_iter;
+                       // character offset, not byte offset
+                       gtk_text_buffer_get_iter_at_offset( text_buffer, &text_iter, cursorpos );
+                       gtk_text_buffer_place_cursor( text_buffer, &text_iter );
+               }
+
+#if GDEF_OS_WINDOWS
+               gtk_widget_queue_draw( text_widget );
+#endif
+
+               free( buf );
+               fclose( f );
+       }
+}
+
+// =============================================================================
+// Light Intensity dialog
+
+EMessageBoxReturn DoLightIntensityDlg( int *intensity ){
+       ModalDialog dialog;
+       ui::Entry intensity_entry{ui::null};
+       ModalDialogButton ok_button( dialog, eIDOK );
+       ModalDialogButton cancel_button( dialog, eIDCANCEL );
+
+       ui::Window window = MainFrame_getWindow().create_modal_dialog_window("Light intensity", dialog, -1, -1 );
+
+       auto accel_group = ui::AccelGroup(ui::New);
+       window.add_accel_group( accel_group );
+
+       {
+               auto hbox = create_dialog_hbox( 4, 4 );
+               window.add(hbox);
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, TRUE, TRUE, 0 );
+                       {
+                               auto label = ui::Label( "ESC for default, ENTER to validate" );
+                               label.show();
+                               vbox.pack_start( label, FALSE, FALSE, 0 );
+                       }
+                       {
+                               auto entry = ui::Entry(ui::New);
+                               entry.show();
+                               vbox.pack_start( entry, TRUE, TRUE, 0 );
+
+                               gtk_widget_grab_focus( entry  );
+
+                               intensity_entry = entry;
+                       }
+               }
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, FALSE, FALSE, 0 );
+
+                       {
+                               auto button = create_modal_dialog_button( "OK", ok_button );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               widget_make_default( button );
+                               gtk_widget_add_accelerator( button , "clicked", accel_group, GDK_KEY_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
+                       }
+                       {
+                auto button = create_modal_dialog_button( "Cancel", cancel_button );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               gtk_widget_add_accelerator( button , "clicked", accel_group, GDK_KEY_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
+                       }
+               }
+       }
+
+       char buf[16];
+       sprintf( buf, "%d", *intensity );
+       intensity_entry.text(buf);
+
+       EMessageBoxReturn ret = modal_dialog_show( window, dialog );
+       if ( ret == eIDOK ) {
+               *intensity = atoi( gtk_entry_get_text( intensity_entry ) );
+       }
+
+       window.destroy();
+
+       return ret;
+}
+
+// =============================================================================
+// Add new shader tag dialog
+
+EMessageBoxReturn DoShaderTagDlg( CopiedString* tag, const char* title ){
+       ModalDialog dialog;
+       GtkEntry* textentry;
+       ModalDialogButton ok_button( dialog, eIDOK );
+       ModalDialogButton cancel_button( dialog, eIDCANCEL );
+
+       auto window = MainFrame_getWindow().create_modal_dialog_window(title, dialog, -1, -1 );
+
+       auto accel_group = ui::AccelGroup(ui::New);
+       window.add_accel_group( accel_group );
+
+       {
+               auto hbox = create_dialog_hbox( 4, 4 );
+               window.add(hbox);
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, TRUE, TRUE, 0 );
+                       {
+                               //GtkLabel* label = GTK_LABEL(gtk_label_new("Enter one ore more tags separated by spaces"));
+                               auto label = ui::Label( "ESC to cancel, ENTER to validate" );
+                               label.show();
+                               vbox.pack_start( label, FALSE, FALSE, 0 );
+                       }
+                       {
+                               auto entry = ui::Entry(ui::New);
+                               entry.show();
+                               vbox.pack_start( entry, TRUE, TRUE, 0 );
+
+                               gtk_widget_grab_focus( entry  );
+
+                               textentry = entry;
+                       }
+               }
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, FALSE, FALSE, 0 );
+
+                       {
+                               auto button = create_modal_dialog_button( "OK", ok_button );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               widget_make_default( button );
+                               gtk_widget_add_accelerator( button , "clicked", accel_group, GDK_KEY_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
+                       }
+                       {
+                auto button = create_modal_dialog_button( "Cancel", cancel_button );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               gtk_widget_add_accelerator( button , "clicked", accel_group, GDK_KEY_Escape, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
+                       }
+               }
+       }
+
+       EMessageBoxReturn ret = modal_dialog_show( window, dialog );
+       if ( ret == eIDOK ) {
+               *tag = gtk_entry_get_text( textentry );
+       }
+
+       window.destroy();
+
+       return ret;
+}
+
+EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, const char* title ){
+       ModalDialog dialog;
+       ModalDialogButton ok_button( dialog, eIDOK );
+
+       auto window = MainFrame_getWindow().create_modal_dialog_window(title, dialog, -1, -1 );
+
+       auto accel_group = ui::AccelGroup(ui::New);
+       window.add_accel_group( accel_group );
+
+       {
+               auto hbox = create_dialog_hbox( 4, 4 );
+               window.add(hbox);
+               {
+            auto vbox = create_dialog_vbox( 4 );
+                       hbox.pack_start( vbox, FALSE, FALSE, 0 );
+                       {
+                               auto label = ui::Label( "The selected shader" );
+                               label.show();
+                               vbox.pack_start( label, FALSE, FALSE, 0 );
+                       }
+                       {
+                               auto label = ui::Label( name );
+                               label.show();
+                               vbox.pack_start( label, FALSE, FALSE, 0 );
+                       }
+                       {
+                               auto label = ui::Label( "is located in file" );
+                               label.show();
+                               vbox.pack_start( label, FALSE, FALSE, 0 );
+                       }
+                       {
+                               auto label = ui::Label( filename );
+                               label.show();
+                               vbox.pack_start( label, FALSE, FALSE, 0 );
+                       }
+                       {
+                               auto button = create_modal_dialog_button( "OK", ok_button );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
+                               widget_make_default( button );
+                               gtk_widget_add_accelerator( button , "clicked", accel_group, GDK_KEY_Return, (GdkModifierType)0, GTK_ACCEL_VISIBLE );
+                       }
+               }
+       }
+
+       EMessageBoxReturn ret = modal_dialog_show( window, dialog );
+
+       window.destroy();
+
+       return ret;
+}
+
+
+
+#if GDEF_OS_WINDOWS
+#include <gdk/gdkwin32.h>
+#endif
+
+#if GDEF_OS_WINDOWS
+// use the file associations to open files instead of builtin Gtk editor
+bool g_TextEditor_useWin32Editor = true;
+#else
+// custom shader editor
+bool g_TextEditor_useCustomEditor = false;
+CopiedString g_TextEditor_editorCommand( "" );
+#endif
+
+void DoTextEditor( const char* filename, int cursorpos ){
+#if GDEF_OS_WINDOWS
+       if ( g_TextEditor_useWin32Editor ) {
+               globalOutputStream() << "opening file '" << filename << "' (line " << cursorpos << " info ignored)\n";
+               ShellExecute( (HWND)GDK_WINDOW_HWND( gtk_widget_get_window( MainFrame_getWindow() ) ), "open", filename, 0, 0, SW_SHOW );
+               return;
+       }
+#else
+       // check if a custom editor is set
+       if ( g_TextEditor_useCustomEditor && !g_TextEditor_editorCommand.empty() ) {
+               StringOutputStream strEditCommand( 256 );
+               strEditCommand << g_TextEditor_editorCommand.c_str() << " \"" << filename << "\"";
+
+               globalOutputStream() << "Launching: " << strEditCommand.c_str() << "\n";
+               // note: linux does not return false if the command failed so it will assume success
+               if ( Q_Exec( 0, const_cast<char*>( strEditCommand.c_str() ), 0, true, false ) == false ) {
+                       globalOutputStream() << "Failed to execute " << strEditCommand.c_str() << ", using default\n";
+               }
+               else
+               {
+                       // the command (appeared) to run successfully, no need to do anything more
+                       return;
+               }
+       }
+#endif
+
+       DoGtkTextEditor( filename, cursorpos );
+}