]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/mainframe.cpp
from nxn
[xonotic/netradiant.git] / radiant / mainframe.cpp
1 /*
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 //
23 // Main Window for Q3Radiant
24 //
25 // Leonardo Zide (leo@lokigames.com)
26 //
27
28 #include "stdafx.h"
29 #ifdef _WIN32
30 extern "C" {
31 #include <gdk/gdkwin32.h> 
32 #define COMPILE_MULTIMON_STUBS
33 #include <multimon.h>
34 }
35 #endif
36 #include <gtk/gtk.h>
37 #include <gdk/gdkkeysyms.h>
38 #include <gdk/gdkprivate.h>
39 #include <sys/stat.h>
40 #if defined (__linux__) || defined (__APPLE__)
41   #include <unistd.h>
42 #endif
43 #include "gtkmisc.h"
44 #include "groupdialog.h"
45 #include "patchdialog.h"
46 #include "filters.h"
47
48 // use this to verbose what happens with the beyboard
49 #ifdef _DEBUG
50 //  #define DBG_KBD
51 #endif
52
53 // globals
54 CString g_strAppPath;                   ///< holds the full path of the executable
55 CString g_strDTDPath;                   ///< path to the DTD files
56 /*!
57 see http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 for the two below
58 */
59 CString g_pidFile;                      ///< the global .pid file (only for global part of the startup)
60 CString g_pidGameFile;                  ///< the game-specific .pid file
61 CString g_strBitmapsPath;               // directory where the bitmaps are stored
62
63 /*!
64 points to the game tools directory, for instance
65 C:\Program Files\Quake III Arena\GtkRadiant
66 (or other games)
67 this is one of the main variables that are configured by the game selection on startup
68 <g_strGameToolsPath>/plugins
69 <g_strGameToolsPath>/modules
70 and also q3map, bspc
71 */
72 CString g_strGameToolsPath;             ///< this is set by g_PrefsDlg.mGamesDialog
73 CGameDescription *g_pGameDescription;   ///< shortcut to g_PrefsDlg.mGamesDialog.m_pCurrentDescription
74 CString g_strPluginsDir;                ///< name of plugins directory, always sub-directory of toolspath
75 CString g_strModulesDir;                ///< name of modules directory, always sub-directory of toolspath
76
77 /*!
78 directory for temp files
79 NOTE: on *nix this is were we check for .pid
80 */
81 CString g_strTempPath;
82 MainFrame* g_pParentWnd = NULL;         // used to precast to CMainFrame
83 PrefsDlg g_Preferences;                 // global prefs instance
84 PrefsDlg& g_PrefsDlg = g_Preferences;   // reference used throughout
85 int g_nUpdateBits = 0;                  // window update flags
86 bool g_bScreenUpdates = true;           // whether window painting is active, used in a few places
87                                         // to disable updates for speed reasons
88                                         // both of the above should be made members of CMainFrame
89 int g_bIgnoreCommands;                  // Used to ignore commands when checking menus/toolbars
90 GSList *g_BSPFrontendCommands;          // List of commands in the BSP menu
91
92 const int CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + MAX_TEXTUREDIRS - 1;
93 const int CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
94
95 extern bool g_bCrossHairs;
96 extern int g_argc;
97 extern char** g_argv;
98 extern PatchDialog g_PatchDialog;
99
100 GtkAccelGroup* global_accel;
101
102 void Select_Ungroup ();
103
104 // command mapping stuff
105 //
106 // m_strCommand is the command string
107 // m_nKey is the GDK_??? equivelant
108 // m_nModifiers are key states as follows
109 //  bit
110 //    1 - shift
111 //    2 - alt
112 //    4 - control
113 //    8 - press only
114 //
115 #define SPEED_MOVE      32
116 #define SPEED_TURN      22.5
117
118 // NOTE: the menu item field is REQUIRED, Gtk uses it to bind the keyboard shortcut
119 // - if you add a command here and you don't want a menu item, use the "hidden" menu
120 // - if you decide to add a menu item, check if it's not in the "hidden" menu already
121 SCommandInfo g_Commands[] =
122 {
123   {"CycleOutlineStyle", 'J', 0x00, ID_SELECTION_OUTLINESTYLE, "menu_selection_outlinestyle"},
124   {"CSGMerge", 'U', 0x04, ID_SELECTION_CSGMERGE, "menu_selection_csgmerge"},
125   {"CSGSubtract", 'U', 0x01, ID_SELECTION_CSGSUBTRACT, "menu_selection_csgsubstract"},
126   //  {"ViewGroups", 'G', 0x00, ID_VIEW_GROUPS, "menu_view_groups"}, (temporary disabled)
127   {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
128   {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
129   {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
130   {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
131   {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
132   {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
133   {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
134   {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
135   {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
136   {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
137   {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
138   {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
139   {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
140   {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
141   {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
142   {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
143   {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
144   {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
145   {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
146   {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
147   {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
148   {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
149   {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
150   {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
151   {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
152   {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
153   {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
154   {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
155   {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
156   {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
157   {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
158   {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
159   {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
160   {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
161   {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
162   {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
163   {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
164   {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
165   {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
166   {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
167   {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
168   {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
169   {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
170   {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
171   {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
172   {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
173   //  {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
174   {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
175   {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
176   {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
177   {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
178   {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
179   {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
180   {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
181   {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
182   {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
183   {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
184   {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
185   {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
186   {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
187   {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
188   {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
189   {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
190   {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
191   {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
192   {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
193   {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
194   {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
195   {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
196   {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
197   {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
198   {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
199   {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
200   {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
201   {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
202   {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
203   {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
204   {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
205   {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
206   {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
207   {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
208   //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
209   {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
210   {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
211   {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
212   {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
213   {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
214   {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
215   {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
216   {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
217   {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
218   {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
219   {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
220   {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
221   {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
222   {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
223   {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
224   {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
225   {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
226   {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
227   {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
228   {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
229   {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
230   {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
231   {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
232   {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
233   {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
234   {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
235   {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
236   {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
237   {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
238   {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
239   {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
240   {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
241   {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
242   {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
243   {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
244   {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
245   {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
246   {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
247   {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
248   {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
249   {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
250   {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
251   {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
252   {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
253   {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
254   {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
255   {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
256   {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
257   {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
258   {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
259   {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
260   {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
261   {"FilterCaulk", '6', RAD_ALT , ID_FILTER_CAULK, "menu_filter_caulk"},
262   {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
263   {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
264   {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
265   {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
266   {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
267   {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
268   {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
269   {"FilterStructural", 'D', RAD_CONTROL|RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
270   {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
271   {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
272   {"FilterTriggers", 'T', RAD_CONTROL|RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
273   {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
274   {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
275   {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
276 };
277
278 int g_nCommandCount = sizeof(g_Commands) / sizeof(SCommandInfo);
279
280 SKeyInfo g_Keys[] =
281 {
282   {"Space", GDK_space},
283   {"Backspace", GDK_BackSpace},
284   {"Escape", GDK_Escape},
285   {"End", GDK_End},
286   {"Insert", GDK_Insert},
287   {"Delete", GDK_Delete},
288   {"PageUp", GDK_Prior},
289   {"PageDown", GDK_Next},
290   {"Up", GDK_Up},
291   {"Down", GDK_Down},
292   {"Left", GDK_Left},
293   {"Right", GDK_Right},
294   {"F1", GDK_F1},
295   {"F2", GDK_F2},
296   {"F3", GDK_F3},
297   {"F4", GDK_F4},
298   {"F5", GDK_F5},
299   {"F6", GDK_F6},
300   {"F7", GDK_F7},
301   {"F8", GDK_F8},
302   {"F9", GDK_F9},
303   {"F10", GDK_F10},
304   {"F11", GDK_F11},
305   {"F12", GDK_F12},
306   {"Tab", GDK_Tab},
307   {"Return", GDK_Return},                           
308   {"Comma", GDK_comma},
309   {"Period", GDK_period},
310   {"Plus", GDK_KP_Add},
311   {"Multiply", GDK_multiply},
312   {"Subtract", GDK_KP_Subtract},
313   {"NumPad0", GDK_KP_0},
314   {"NumPad1", GDK_KP_1},
315   {"NumPad2", GDK_KP_2},
316   {"NumPad3", GDK_KP_3},
317   {"NumPad4", GDK_KP_4},
318   {"NumPad5", GDK_KP_5},
319   {"NumPad6", GDK_KP_6},
320   {"NumPad7", GDK_KP_7},
321   {"NumPad8", GDK_KP_8},
322   {"NumPad9", GDK_KP_9},
323   {"[", 219},
324   {"]", 221},
325   {"\\", 220},
326   {"Home", GDK_Home}
327 };
328
329 int g_nKeyCount = sizeof(g_Keys) / sizeof(SKeyInfo);
330
331 // =============================================================================
332 // global functions
333
334 void WINAPI Sys_UpdateWindows (int nBits)
335 {
336   g_nUpdateBits |= nBits;
337
338
339 // =============================================================================
340 // Static functions
341
342 // Gef: Separate handling for keyup events
343 void HandleKeyUp (GtkWidget *widget, gpointer data)
344 {
345   int id = GPOINTER_TO_INT (data);
346 #ifdef DBG_KBD
347   Sys_Printf("HandleKeyUp: %d\n", id);
348 #endif
349   
350   if(g_bIgnoreCommands)
351     return;
352   
353   switch (id)
354   {
355     case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (FALSE); break;
356     case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (FALSE); break;
357     case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (FALSE); break;
358     case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (FALSE); break;
359     case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (FALSE); break;
360     case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (FALSE); break;
361   }
362 }
363
364 gint HandleCommand (GtkWidget *widget, gpointer data)
365 {
366   int id = GPOINTER_TO_INT (data);
367 #ifdef DBG_KBD
368   Sys_Printf("HandleCommand %d\n", id);
369 #endif
370
371   if ( g_bIgnoreCommands ) {
372 #ifdef DBG_KBD
373     Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
374 #endif
375     return FALSE;
376   }
377
378   if (id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END) g_pParentWnd->OnTextureWad (id);
379   else if (id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END) g_pParentWnd->OnBspCommand (id);
380   else if (id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4) g_pParentWnd->OnMru (id);
381   else if (id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE)
382   {
383     if (GTK_CHECK_MENU_ITEM (widget)->active)
384       g_pParentWnd->OnViewNearest (id);
385   } else if (id >= ID_GRID_025 && id <= ID_GRID_256) g_pParentWnd->OnGrid (id);
386   else if (id >= ID_PLUGIN_START && id <= ID_PLUGIN_END)
387   {
388     char *str;
389     gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
390     g_pParentWnd->OnPlugIn (id, str);
391   } else if (id >= ID_ENTITY_START && id <= ID_ENTITY_END)
392   {
393     char *str;
394     gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
395     g_pParentWnd->ActiveXY()->OnEntityCreate (str);
396   }
397   else switch (id)
398     {
399     case ID_FILE_NEW: g_pParentWnd->OnFileNew (); break;
400     case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
401     case ID_FILE_OPEN: g_pParentWnd->OnFileOpen (); break;
402     case ID_FILE_SAVE: g_pParentWnd->OnFileSave (); break;
403     case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas (); break;
404     case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap (); break;
405     case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion (); break;
406     case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject (); break;
407     case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject (); break;
408     case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings (); break;
409     case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile (); break;
410     case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate (); break;
411     case ID_FILE_EXIT: g_pParentWnd->OnFileExit (); break;
412     case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap (); break;
413     case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo (); break;
414     case ID_EDIT_REDO: g_pParentWnd->OnEditRedo (); break;
415     case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush (); break;
416     case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush (); break;
417     case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera (); break;
418     case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete (); break;
419     case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo (); break;
420     case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo (); break;
421     case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts (); break;
422     case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab (); break;
423     case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab (); break;
424     case ID_PREFS: g_pParentWnd->OnPrefs (); break;
425     case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera (); break;
426     case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole (); break;
427     case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity (); break;
428     case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups (); break;
429     case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview (); break;
430     case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz (); break;
431     case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz (); break;
432     case ID_TOGGLEZ: g_pParentWnd->OnTogglez (); break;
433     case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter (); break;
434     case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor (); break;
435     case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor (); break;
436     case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview (); break;
437     case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview (); break;
438     case ID_VIEW_XY: g_pParentWnd->OnViewXy (); break;
439     case ID_VIEW_SIDE: g_pParentWnd->OnViewSide (); break;
440     case ID_VIEW_FRONT: g_pParentWnd->OnViewFront (); break;
441     case ID_VIEW_100: g_pParentWnd->OnView100 (); break;
442     case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin (); break;
443     case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout (); break;
444     case ID_VIEW_Z100: g_pParentWnd->OnViewZ100 (); break;
445     case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin (); break;
446     case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout (); break;
447     case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein (); break;
448     case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout (); break;
449     case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames (); break;
450     case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks (); break;
451     case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates (); break;
452     case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline (); break;
453     case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes (); break;
454     case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone (); break;
455     case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles (); break;
456     case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected (); break;
457     case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden (); break;
458     case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
459     case ID_VIEW_ENTITIESAS_WIREFRAME:
460     case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
461     case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
462     case ID_VIEW_ENTITIESAS_SKINNED:
463     case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
464       g_pParentWnd->OnEntitiesSetViewAs(id);
465       break;
466     case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping (); break;
467     case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting (); break;
468     case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges (); break;
469     case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies (); break;
470     case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone (); break;
471     case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect (); break;
472     case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx (); break;
473     case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy (); break;
474     case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz (); break;
475     case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex (); break;
476     case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey (); break;
477     case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez (); break;
478     case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation (); break;
479     case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale (); break;
480     case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow (); break;
481     case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract (); break;
482     case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge (); break;
483     case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline (); break;
484     case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle (); break;      
485     case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall (); break;
486     case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching (); break;
487     case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall (); break;
488     case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside (); break;
489     case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft (); break;
490     case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright (); break;
491     case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup (); break;
492     case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown (); break;
493     case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper (); break;
494     case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected (); break;
495     case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected (); break;
496     case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip (); break;
497     case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect (); break;
498     case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity (); break;
499     case ID_SELECTION_MERGE: Select_MergeEntity(); break;
500     case ID_SELECTION_SEPERATE: Select_Seperate(); break;
501     case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail (); break;
502     case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural (); break;
503     case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid (); break;
504     case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse (); break;
505     case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall (); break;
506     case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector (); break;
507     case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall (); break;
508     case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock (); break;
509     case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock (); break;
510     case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad (); break;
511     case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders (); break;
512     case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow (); break;
513     case ID_TEXTURES_TEXTUREWINDOWSCALE_200: 
514     case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
515     case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
516     case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
517     case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
518       g_pParentWnd->SetTextureScale (id);
519       break;
520     case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist (); break;
521     case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly (); break;
522     case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup (); break;
523     case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown (); break;
524     case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark (); break;
525     case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal (); break;
526     case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer (); break;
527     case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack (); break;
528     case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar (); break;  /* ydnar */
529     case ID_TEXTUREBK: g_pParentWnd->OnTexturebk (); break;
530     case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk (); break;
531     case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor (); break;
532     case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor (); break;
533     case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext (); break;
534     case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock (); break;
535     case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack (); break;
536     case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush (); break;
537     case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush (); break;
538     case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D (); break;
539     case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper (); break;
540     case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname (); break;
541     case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma (); break;
542     case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush (); break;
543     case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot (); break;
544     case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot (); break;
545     case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy (); break;
546     case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor (); break;
547     case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves (); break;
548     case ID_REGION_OFF: g_pParentWnd->OnRegionOff (); break;
549     case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy (); break;
550     case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush (); break;
551     case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush (); break;
552     case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection (); break;
553     case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided (); break;
554     case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided (); break;
555     case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided (); break;
556     case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided (); break;
557     case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided (); break;
558     case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided (); break;
559     case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided (); break;
560     case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided (); break;
561     case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone (); break;
562     case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere (); break;
563     case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube (); break;
564     case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube (); break;
565     case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube (); break;
566     case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare (); break;
567     case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap (); break;
568     case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel (); break;
569     case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel (); break;
570     case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap();break;
571     case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone (); break;
572     case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh (); break;
573     case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn (); break;
574     case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn (); break;
575     case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow (); break;
576     case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow (); break;
577     case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn (); break;
578     case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn (); break;
579     case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow (); break;
580     case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow (); break;
581     case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative (); break;
582     case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows (); break;
583     case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols (); break;
584     case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows (); break;
585     case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose (); break;
586     case ID_CURVE_CAP: g_pParentWnd->OnCurveCap (); break;
587     case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap (); break;
588     case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet (); break;
589     case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear (); break;
590     case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken (); break;
591     case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh (); break;
592     case ID_HELP: g_pParentWnd->OnHelp (); break;
593     case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
594     case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
595     case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist (); break;
596     case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout (); break;
597     case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel (); break;
598     case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals (); break;
599     case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk (); break;
600     case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural (); break;
601     case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips (); break;
602     case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips (); break;
603     case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails (); break;
604     case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities (); break;
605     case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips (); break;
606     case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights (); break;
607     case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids (); break;
608     case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels (); break;
609     case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches (); break;
610     case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent (); break;
611     case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers (); break;
612     case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld (); break;
613     case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths (); break;
614     case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals (); break;
615     case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid (); break;
616
617     case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection (); break;
618     case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange (); break;
619     case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup (); break;
620     case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera (); break;
621     case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate (); break;
622     case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate (); break;
623     case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale (); break;
624     case ID_SCALELOCKX: g_pParentWnd->OnScalelockx (); break;
625     case ID_SCALELOCKY: g_pParentWnd->OnScalelocky (); break;
626     case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz (); break;
627     case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve (); break;
628     case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox (); break;
629     case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe (); break;
630     case ID_PATCH_BEND: g_pParentWnd->OnPatchBend (); break;
631     case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld (); break;
632     case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown (); break;
633     case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName (); break;
634     case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup (); break;
635     case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove (); break;
636     case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities (); break;
637
638     case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit (); break;
639     case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture (); break;
640     case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector (); break;
641     case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX (); break;
642     case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY (); break;
643     case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn (); break;
644     case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow (); break;
645     case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn (); break;
646     case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow (); break;
647     case ID_PATCH_TAB: g_pParentWnd->OnPatchTab (); break;
648     case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (TRUE); break;
649     case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (TRUE); break;
650     case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (TRUE); break;
651     case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (TRUE); break;
652     case ID_CAMERA_UP: g_pParentWnd->OnCameraUp (); break;
653     case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown (); break;
654     case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup (); break;
655     case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown (); break;
656     case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (TRUE); break;
657     case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (TRUE); break;
658     case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle (); break;
659     case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole (); break;
660     case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair (); break;
661     case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit (); break;
662     case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock (); break;
663     case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter (); break;
664     case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup (); break;
665     case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown (); break;
666     case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft (); break;
667     case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright (); break;
668     case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup (); break;
669     case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown (); break;
670     case ID_GRID_PREV: g_pParentWnd->OnGridPrev (); break;
671     case ID_GRID_NEXT: g_pParentWnd->OnGridNext (); break;
672     case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft (); break;
673     case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight (); break;
674     case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown (); break;
675     case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup (); break;
676     case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint (); break;
677     case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint (); break;
678     case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize (); break;
679     case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid (); break;
680     case ID_SELECT_ALL: g_pParentWnd->OnSelectAll (); break;
681     case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert (); break;
682     }
683
684     return TRUE;
685 }
686
687 static gint timer (gpointer data)
688 {
689   MainFrame *wnd = (MainFrame*)data;
690   wnd->OnTimer ();
691   return TRUE;
692 }
693
694 static gint mainframe_delete (GtkWidget *widget, GdkEvent *event, gpointer data)
695 {
696   MainFrame *wnd = (MainFrame*)data;
697
698   wnd->OnDelete();
699
700   if (ConfirmModified())
701     return FALSE;
702
703   g_qeglobals_gui.d_edit = NULL;
704
705   return TRUE;
706 }
707
708 static void mainframe_destroy (GtkWidget *widget, gpointer data)
709 {
710   MainFrame *wnd = (MainFrame*)data;
711
712   // avoid saving prefs when the app is minimized
713   if (g_pParentWnd->IsSleeping())
714   {
715     Sys_Printf("Shutdown while sleeping, not saving prefs\n");
716     g_qeglobals.disable_ini = true;
717   }
718
719   // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
720   //   we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
721   g_PrefsDlg.SavePrefs ();
722   
723   wnd->OnDestroy ();
724   
725   // shutdown modules
726   // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
727   // and modules / plugins decide to save some stuff
728   g_pParentWnd->GetPlugInMgr().Shutdown();
729     
730   delete wnd;
731
732   QGL_Shutdown();
733   g_PrefsDlg.Destroy ();
734   g_dlgSurface.Destroy ();
735   g_dlgFind.Destroy ();
736   g_PatchDialog.Destroy ();
737
738   gtk_main_quit ();
739 }
740
741 static gint mainframe_keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)
742 {
743   unsigned int code = gdk_keyval_to_upper(event->keyval);
744
745   // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=924
746   if(code == GDK_ISO_Left_Tab) {
747     code = GDK_Tab;
748   }
749   
750 #ifdef DBG_KBD
751   Sys_Printf("key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK);
752 #endif
753
754   // BUG: http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=865
755   // return only if Texture Viewport  is in main window, otherwise if Tex viewport is in it's own window
756   // the Filter GtkEntry won't release focus
757   if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus(GTK_WINDOW(widget)) )
758     if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) )
759       return FALSE;
760
761 #ifdef DBG_KBD
762   Sys_Printf("mainframe_keypress processing into a command\n");
763 #endif
764   for (int i = 0; i < g_nCommandCount; i++)
765   {
766     if (g_Commands[i].m_nKey == code)    // find a match?
767     {
768       // check modifiers
769       unsigned int nState = 0;
770       if (Sys_AltDown ())
771         nState |= RAD_ALT;
772       if ((event->state & GDK_CONTROL_MASK) != 0)
773         nState |= RAD_CONTROL;
774       if ((event->state & GDK_SHIFT_MASK) != 0)
775         nState |= RAD_SHIFT;
776       if ((g_Commands[i].m_nModifiers & 0x7) == nState)
777       {
778         HandleCommand (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
779         gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
780         return FALSE;
781       }
782     }
783   }
784
785   return TRUE;
786 }
787
788 static gint mainframe_keyrelease (GtkWidget* widget, GdkEventKey* event, gpointer data)
789 {
790   unsigned int code = gdk_keyval_to_upper(event->keyval);
791   
792   if (gtk_accelerator_valid (event->keyval, (GdkModifierType)0))
793     return TRUE;
794   
795   for (int i = 0; i < g_nCommandCount; i++)
796   {
797     if (g_Commands[i].m_nKey == code)    // find a match?
798     {
799       if(!g_Commands[i].m_nModifiers)
800       {
801         // Gef: Only call the handler if it's a key that needs keyup events
802         switch (g_Commands[i].m_nCommand)
803         {
804           case ID_CAMERA_FORWARD:
805           case ID_CAMERA_BACK:
806           case ID_CAMERA_LEFT:
807           case ID_CAMERA_RIGHT:
808           case ID_CAMERA_STRAFELEFT:
809           case ID_CAMERA_STRAFERIGHT:
810           {
811             HandleKeyUp (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
812             gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_release_event");
813           }
814
815         }
816         return FALSE;
817       }
818     }
819   }
820
821   return TRUE;
822 }
823
824
825 // =============================================================================
826 // Window creation functions
827
828 void AddMenuItem (GtkWidget* item, unsigned int id)
829 {
830   for (int i = 0; i < g_nCommandCount; i++)
831     if (g_Commands[i].m_nCommand == id)
832     {
833       g_object_set_data (G_OBJECT (g_pParentWnd->m_pWidget), g_Commands[i].m_strMenu, item);
834       break;
835     }
836 }
837
838 void MainFrame::handle_help_command(int id)
839 {
840   OpenURL(mHelpURLs[id]->GetBuffer());
841 }
842
843 /*!
844 needed for hooking in Gtk+
845 */
846 void HandleHelpCommand (GtkWidget *widget, gpointer data)
847 {
848   int id = GPOINTER_TO_INT (data);
849   g_pParentWnd->handle_help_command(id);
850 }
851
852 void MainFrame::process_xlink (Str &FileName, char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel)
853 {
854   xmlDocPtr pDoc;
855   pDoc = xmlParseFile(FileName.GetBuffer());
856   if (pDoc)
857   {
858     Sys_Printf("Processing .xlink file '%s'\n", FileName.GetBuffer());
859     // create sub menu
860     GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic(menu, menu_name);
861     // start walking the nodes, find the 'links' one
862     xmlNodePtr pNode = pDoc->children;
863     while (pNode && strcmp((const char*)pNode->name, "links"))
864       pNode=pNode->next;
865     if (pNode)
866     {
867       pNode = pNode->children;
868       while(pNode)
869       {
870         if (!strcmp((const char*)pNode->name, "item"))
871         {
872           // process the URL
873           Str *url;
874           if (strstr((char *)xmlGetProp(pNode, (xmlChar *)"url"), "http://"))
875           {
876             // complete URL
877             url = new Str;
878             *url = (char *)xmlGetProp(pNode, (xmlChar *)"url");
879           }
880           else
881           {
882             // relative URL
883             url = new Str;
884             *url = base_url;
885             *url += (char *)xmlGetProp(pNode, (xmlChar *)"url");
886           }
887           mHelpURLs.push_back(url);
888           create_menu_item_with_mnemonic (menu_in_menu, (char *)xmlGetProp(pNode, (xmlChar *)"name"), GTK_SIGNAL_FUNC(HandleHelpCommand), mHelpURLs.size()-1);
889         }
890         pNode=pNode->next;
891       }
892     }
893     xmlFreeDoc(pDoc);
894   }
895   else
896   {
897     Sys_Printf("'%s' not found / parse failed\n", FileName.GetBuffer());
898   }
899 }
900
901 void MainFrame::create_game_help_menu (GtkWidget *menu, GtkAccelGroup *accel)
902 {
903   Str FileName;
904   list<CGameDescription *>::iterator iGame;
905
906   // start in the global dir
907   FileName = g_strAppPath;
908   FileName += "global.xlink";
909   process_xlink(FileName, "General", g_strAppPath.GetBuffer(), menu, accel);
910
911   for (iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++)
912   {
913     FileName = (*iGame)->mGameToolsPath;
914     FileName += "game.xlink";
915     process_xlink(FileName, (*iGame)->mGameName, (*iGame)->mGameToolsPath.GetBuffer(), menu, accel);
916   }
917 }
918
919 void MainFrame::create_main_menu (GtkWidget *window, GtkWidget *vbox)
920 {
921   GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
922   GtkAccelGroup *accel;
923
924   g_bIgnoreCommands++;
925   accel = gtk_accel_group_new ();
926   global_accel = accel;
927   gtk_window_add_accel_group (GTK_WINDOW (window), accel);
928
929   handle_box = gtk_handle_box_new ();  
930   gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
931   gtk_widget_show (handle_box);
932
933   menu_bar = gtk_menu_bar_new ();
934   gtk_container_add (GTK_CONTAINER (handle_box), menu_bar);
935   gtk_widget_show (menu_bar);
936
937   // File menu
938   menu = create_sub_menu_with_mnemonic (menu_bar, "_File");
939   if (g_PrefsDlg.m_bDetachableMenus)
940     menu_tearoff (menu);
941
942   create_menu_item_with_mnemonic (menu, "_New Map",
943                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEW);
944   menu_separator (menu);
945
946   //++timo temporary experimental stuff for sleep mode..
947   item = create_menu_item_with_mnemonic (menu, "_Sleep",
948                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SLEEP);
949   g_object_set_data (G_OBJECT (window), "menu_file_sleep", item );
950   menu_separator (menu);
951   // end experimental
952
953   item = create_menu_item_with_mnemonic (menu, "_Open...",
954                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_OPEN);
955   g_object_set_data (G_OBJECT (window), "menu_file_open", item);
956   create_menu_item_with_mnemonic (menu, "_Import...", // Hydra: give it it's proper name
957                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_IMPORTMAP);
958   item = create_menu_item_with_mnemonic (menu, "_Save",
959                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVE);
960   g_object_set_data (G_OBJECT (window), "menu_file_save", item);
961   create_menu_item_with_mnemonic (menu, "Save _as...",
962                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEAS);
963   create_menu_item_with_mnemonic (menu, "Save s_elected...",
964                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXPORTMAP);
965   menu_separator (menu);
966   item = create_menu_item_with_mnemonic (menu, "Save re_gion...",
967                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEREGION);
968   g_object_set_data (G_OBJECT (window), "menu_file_saveregion", item);
969   menu_separator (menu);
970   create_menu_item_with_mnemonic (menu, "New p_roject...",
971                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEWPROJECT);
972   create_menu_item_with_mnemonic (menu, "Load _project...",
973                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_LOADPROJECT);
974   create_menu_item_with_mnemonic (menu, "Pro_ject settings...",
975                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_PROJECTSETTINGS);
976   menu_separator (menu);
977   create_menu_item_with_mnemonic (menu, "_Pointfile...",
978                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_POINTFILE);
979   menu_separator (menu);
980   item = create_menu_item_with_mnemonic (menu, "Recent Files",
981                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT1);
982   g_object_set_data (G_OBJECT (item), "accel", accel);
983   gtk_widget_set_sensitive (item, FALSE);
984   MRU_AddWidget (item, 0);
985   item = create_menu_item_with_mnemonic (menu, "2",
986                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT2);
987   gtk_widget_hide (item);
988   MRU_AddWidget (item, 1);
989   item = create_menu_item_with_mnemonic (menu, "3",
990                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT3);
991   gtk_widget_hide (item);
992   MRU_AddWidget (item, 2);
993   item = create_menu_item_with_mnemonic (menu, "4",
994                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT4);
995   gtk_widget_hide (item);
996   MRU_AddWidget (item, 3);
997   menu_separator (menu);
998   create_menu_item_with_mnemonic (menu, "Check for GtkRadiant update (web)",
999     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_CHECKUPDATE);
1000   
1001   create_menu_item_with_mnemonic (menu, "E_xit",
1002                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXIT);
1003
1004   // Edit menu
1005   menu = create_sub_menu_with_mnemonic (menu_bar, "_Edit");
1006   if (g_PrefsDlg.m_bDetachableMenus)
1007     menu_tearoff (menu);
1008   item = create_menu_item_with_mnemonic (menu, "_Undo",
1009                            GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_UNDO);
1010   g_object_set_data (G_OBJECT (window), "menu_edit_undo", item);
1011   item = create_menu_item_with_mnemonic (menu, "_Redo",
1012                            GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_REDO);
1013   g_object_set_data (G_OBJECT (window), "menu_edit_redo", item);
1014   menu_separator (menu);
1015   item = create_menu_item_with_mnemonic (menu, "_Copy", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_COPYBRUSH);
1016   item = create_menu_item_with_mnemonic (menu, "_Paste", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSH);
1017   item = create_menu_item_with_mnemonic (menu, "P_aste To Camera", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSHTOCAMERA);
1018   item = create_menu_item_with_mnemonic (menu, "_Delete", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1019   g_object_set_data (G_OBJECT (window), "menu_selection_delete", item);
1020   menu_separator (menu);
1021   create_menu_item_with_mnemonic (menu, "Map Info...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_MAPINFO);
1022   create_menu_item_with_mnemonic (menu, "Entity Info...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_ENTITYINFO);
1023   menu_separator (menu);
1024   create_menu_item_with_mnemonic (menu, "Brush Scripts...", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_SCRIPTS);
1025   menu_separator (menu);
1026   create_menu_item_with_mnemonic (menu, "Load Pre_fab...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_LOADPREFAB);
1027   create_menu_item_with_mnemonic (menu, "Save Selection as Prefab...", GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_SAVEPREFAB);
1028   menu_separator (menu);
1029   create_menu_item_with_mnemonic (menu, "Preferences...", GTK_SIGNAL_FUNC (HandleCommand), ID_PREFS);
1030
1031   // View menu
1032   menu = create_sub_menu_with_mnemonic (menu_bar, "_View");
1033   if (g_PrefsDlg.m_bDetachableMenus)
1034     menu_tearoff (menu);
1035
1036   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Toggle");
1037   create_menu_item_with_mnemonic (menu_in_menu, "Camera View", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECAMERA);
1038   create_menu_item_with_mnemonic (menu_in_menu, "Console View", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECONSOLE);
1039   item = create_menu_item_with_mnemonic (menu_in_menu, "Entity View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITY);
1040   g_object_set_data (G_OBJECT (window), "menu_view_entity", item);
1041   //  create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1042   create_menu_item_with_mnemonic (menu_in_menu, "XY (Top)", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW);
1043   create_menu_item_with_mnemonic (menu_in_menu, "YZ (Side)", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_YZ);
1044   create_menu_item_with_mnemonic (menu_in_menu, "XZ (Front)", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_XZ);
1045   create_menu_item_with_mnemonic (menu_in_menu, "Z View", GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEZ);
1046   menu_separator (menu);
1047   item = create_menu_item_with_mnemonic (menu, "_Center", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTER);
1048   item = create_menu_item_with_mnemonic (menu, "_Center 2d", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTERVIEW);
1049   item = create_menu_item_with_mnemonic (menu, "_Up Floor", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_UPFLOOR);
1050   item = create_menu_item_with_mnemonic (menu, "_Down Floor", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_DOWNFLOOR);
1051   menu_separator (menu);
1052   item = create_menu_item_with_mnemonic (menu, "_Next (XY, YZ, XY)", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEXTVIEW);
1053   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Layout");
1054   create_menu_item_with_mnemonic (menu_in_menu, "XY (Top)", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_XY);
1055   create_menu_item_with_mnemonic (menu_in_menu, "YZ", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SIDE);
1056   create_menu_item_with_mnemonic (menu_in_menu, "XZ", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_FRONT);
1057   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Zoom");
1058   create_menu_item_with_mnemonic (menu_in_menu, "_XY 100%", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_100);
1059   item = create_menu_item_with_mnemonic (menu_in_menu, "XY Zoom _In", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMIN);
1060   item = create_menu_item_with_mnemonic (menu_in_menu, "XY Zoom _Out", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMOUT);
1061   menu_separator (menu_in_menu);
1062   create_menu_item_with_mnemonic (menu_in_menu, "_Z 100%", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_Z100);
1063   item = create_menu_item_with_mnemonic (menu_in_menu, "Z Zoo_m In", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMIN);
1064   g_object_set_data (G_OBJECT (window), "menu_view_zzoomin", item);
1065   item = create_menu_item_with_mnemonic (menu_in_menu, "Z Zoom O_ut", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMOUT);
1066   g_object_set_data (G_OBJECT (window), "menu_view_zzoomout", item);
1067   menu_separator (menu_in_menu);
1068   item = create_menu_item_with_mnemonic (menu_in_menu, "Cubic Clip Zoom In", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEIN);
1069   item = create_menu_item_with_mnemonic (menu_in_menu, "Cubic Clip Zoom Out", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEOUT);
1070   menu_separator (menu);
1071
1072   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Show");
1073   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show _Angles", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWANGLES, FALSE);
1074   g_object_set_data (G_OBJECT (window), "menu_view_showangles", item);
1075   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show _Names", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWNAMES, TRUE);
1076   g_object_set_data (G_OBJECT (window), "menu_view_shownames", item);
1077   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Blocks", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWBLOCKS, FALSE);
1078   g_object_set_data (G_OBJECT (window), "menu_view_showblocks", item);
1079   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show C_oordinates", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWCOORDINATES, TRUE);
1080   g_object_set_data (G_OBJECT (window), "menu_view_showcoordinates", item);
1081   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Window Outline", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWOUTLINE, TRUE);
1082   g_object_set_data (G_OBJECT (window), "menu_view_showoutline", item);
1083   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show ZBuffered Outline", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_NOOUTLINE, TRUE);
1084   g_object_set_data (G_OBJECT (window), "menu_selection_nooutline", item);
1085   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Axes", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWAXES, TRUE);
1086   g_object_set_data (G_OBJECT (window), "menu_view_showaxes", item);
1087   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Show Workzone", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWWORKZONE, FALSE);
1088   g_object_set_data (G_OBJECT (window), "menu_view_showworkzone", item);
1089
1090   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Filter");
1091   create_check_menu_item_with_mnemonic (menu_in_menu, "World", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_WORLD, FALSE);
1092   create_check_menu_item_with_mnemonic (menu_in_menu, "Entities", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_ENTITIES, FALSE);
1093   create_check_menu_item_with_mnemonic (menu_in_menu, "Areaportals", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_AREAPORTALS, FALSE);
1094   create_check_menu_item_with_mnemonic (menu_in_menu, "Translucent", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRANSLUCENT, FALSE);
1095   create_check_menu_item_with_mnemonic (menu_in_menu, "Liquids", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIQUIDS, FALSE);
1096   create_check_menu_item_with_mnemonic (menu_in_menu, "Caulk", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CAULK, FALSE);
1097   create_check_menu_item_with_mnemonic (menu_in_menu, "Clips", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLIPS, FALSE);
1098   create_check_menu_item_with_mnemonic (menu_in_menu, "Paths", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATHS, FALSE);
1099   create_check_menu_item_with_mnemonic (menu_in_menu, "Clusterportals", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLUSTERPORTALS, FALSE);
1100   create_check_menu_item_with_mnemonic (menu_in_menu, "Lights", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTS, FALSE);
1101   create_check_menu_item_with_mnemonic (menu_in_menu, "Structural", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_STRUCTURAL, FALSE);
1102   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Lightgrid", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTGRID, FALSE);
1103   g_object_set_data (G_OBJECT (window), "menu_filter_lightgrid", item);
1104   create_check_menu_item_with_mnemonic (menu_in_menu, "Patches", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATCHES, FALSE);
1105   create_check_menu_item_with_mnemonic (menu_in_menu, "Details", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_DETAILS, FALSE);
1106   create_check_menu_item_with_mnemonic (menu_in_menu, "Hints", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_HINTSSKIPS, FALSE);
1107   create_check_menu_item_with_mnemonic (menu_in_menu, "Models", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_MODELS, FALSE);
1108   create_check_menu_item_with_mnemonic (menu_in_menu, "Triggers", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRIGGERS, FALSE);
1109   create_check_menu_item_with_mnemonic (menu_in_menu, "Botclips", GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_BOTCLIPS, FALSE);
1110
1111   menu_separator (menu);
1112   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Hide/Show");
1113   create_menu_item_with_mnemonic (menu_in_menu, "Hide Selected",
1114                     GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_HIDESELECTED);
1115   create_menu_item_with_mnemonic (menu_in_menu, "Show Hidden",
1116                     GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_SHOWHIDDEN);
1117   menu_separator (menu);
1118   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Entities as");
1119   g_object_set_data (G_OBJECT (window), "view_entitiesas_menu", menu_in_menu);
1120   item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, "Bounding box",
1121                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE);
1122   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_boundingbox", item);
1123   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Wireframe",
1124                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE);
1125   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_wireframe", item);
1126   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Selected Wireframe",
1127                                  GTK_SIGNAL_FUNC (HandleCommand),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE);
1128   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedwireframe", item);
1129   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Selected Skinned",
1130                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE);
1131   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedskinned", item);
1132   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Skinned",
1133                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNED,FALSE);
1134   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinned", item);
1135   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Skinned and Boxed",
1136                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE);
1137   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinnedandboxed", item);
1138   menu_separator (menu);
1139   item = create_check_menu_item_with_mnemonic (menu, "Cubic Clipping",
1140                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBICCLIPPING, TRUE);
1141   g_object_set_data (G_OBJECT (window), "menu_view_cubicclipping", item);
1142   menu_separator (menu);
1143   item = create_check_menu_item_with_mnemonic (menu, "OpenGL Lighting",
1144                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_OPENGLLIGHTING, FALSE);
1145   g_object_set_data (G_OBJECT (window), "menu_view_opengllighting", item);
1146
1147   // Selection menu
1148   menu = create_sub_menu_with_mnemonic (menu_bar, "_Selection");
1149   if (g_PrefsDlg.m_bDetachableMenus)
1150     menu_tearoff (menu);
1151
1152   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Drag");
1153   create_menu_item_with_mnemonic (menu_in_menu, "Drag _Edges",
1154                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGEDGES);
1155   create_menu_item_with_mnemonic (menu_in_menu, "Drag _Vertices",
1156                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGVERTECIES);
1157   menu_separator (menu);
1158   create_menu_item_with_mnemonic (menu, "_Clone",
1159                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CLONE);
1160   item = create_menu_item_with_mnemonic (menu, "Deselect",
1161                            GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DESELECT);
1162   item = create_menu_item_with_mnemonic (menu, "Invert",
1163                            GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_INVERT);
1164 #ifndef QUAKE3
1165   create_menu_item_with_mnemonic (menu, "_Delete",
1166                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1167 #endif
1168   menu_separator (menu);
1169   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Flip");
1170   create_menu_item_with_mnemonic (menu_in_menu, "Flip _X",
1171                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPX);
1172   create_menu_item_with_mnemonic (menu_in_menu, "Flip _Y",
1173                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPY);
1174   create_menu_item_with_mnemonic (menu_in_menu, "Flip _Z",
1175                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPZ);
1176   menu_separator (menu);
1177   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Rotate");
1178   create_menu_item_with_mnemonic (menu_in_menu, "Rotate X",
1179                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEX);
1180   create_menu_item_with_mnemonic (menu_in_menu, "Rotate Y",
1181                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEY);
1182   create_menu_item_with_mnemonic (menu_in_menu, "Rotate Z",
1183                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEZ);
1184   create_menu_item_with_mnemonic (menu_in_menu, "Arbitrary rotation...",
1185                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_ARBITRARYROTATION);
1186   menu_separator (menu);
1187   create_menu_item_with_mnemonic (menu, "Scale...", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SCALE);
1188   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "CSG");
1189   create_menu_item_with_mnemonic (menu_in_menu, "Make _Hollow",
1190                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKEHOLLOW);
1191   create_menu_item_with_mnemonic (menu_in_menu, "CSG _Subtract",
1192                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGSUBTRACT);
1193   create_menu_item_with_mnemonic (menu_in_menu, "CSG _Merge",
1194                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGMERGE);
1195   menu_separator (menu);
1196   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Select");
1197   create_menu_item_with_mnemonic (menu_in_menu, "Select Complete _Tall",
1198                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTCOMPLETETALL);
1199   create_menu_item_with_mnemonic (menu_in_menu, "Select T_ouching",
1200                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTTOUCHING);
1201   create_menu_item_with_mnemonic (menu_in_menu, "Select _Partial Tall",
1202                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTPARTIALTALL);
1203   create_menu_item_with_mnemonic (menu_in_menu, "Select _Inside",
1204                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTINSIDE);
1205 #ifndef QUAKE3
1206   create_menu_item_with_mnemonic (menu_in_menu, "Nudge Left",
1207                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1208   create_menu_item_with_mnemonic (menu_in_menu, "Nudge Right",
1209                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1210   create_menu_item_with_mnemonic (menu_in_menu, "Nudge Up",
1211                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1212   create_menu_item_with_mnemonic (menu_in_menu, "Nudge Down",
1213                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1214 #endif
1215   menu_separator (menu);
1216   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Clipper");
1217   create_menu_item_with_mnemonic (menu_in_menu, "Toggle Clipper",
1218                     GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CLIPPER);
1219   menu_separator (menu_in_menu);
1220   create_menu_item_with_mnemonic (menu_in_menu, "Clip selection",
1221                     GTK_SIGNAL_FUNC (HandleCommand), ID_CLIP_SELECTED);
1222   create_menu_item_with_mnemonic (menu_in_menu, "Split selection",
1223                     GTK_SIGNAL_FUNC (HandleCommand), ID_SPLIT_SELECTED);
1224   create_menu_item_with_mnemonic (menu_in_menu, "Flip Clip orientation",
1225                     GTK_SIGNAL_FUNC (HandleCommand), ID_FLIP_CLIP);
1226   menu_separator (menu);
1227   create_menu_item_with_mnemonic (menu, "Connect entities",
1228                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CONNECT);
1229   create_menu_item_with_mnemonic (menu, "Ungroup entity",
1230                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_UNGROUPENTITY);
1231   create_menu_item_with_mnemonic (menu, "Make detail",
1232                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_DETAIL);
1233   create_menu_item_with_mnemonic (menu, "Make structural",
1234                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_STRUCTURAL);
1235
1236   // BSP menu
1237   menu = create_sub_menu_with_mnemonic (menu_bar, "_Bsp");
1238
1239   menu_separator (menu);
1240   g_object_set_data (G_OBJECT (window), "menu_bsp", menu);
1241
1242   // Grid menu
1243   menu = create_sub_menu_with_mnemonic (menu_bar, "_Grid");
1244   if (g_PrefsDlg.m_bDetachableMenus)
1245     menu_tearoff (menu);
1246
1247   item = create_radio_menu_item_with_mnemonic (menu, NULL, "Grid0.25",
1248                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_025, FALSE);
1249   g_object_set_data (G_OBJECT (window), "menu_grid_025", item);
1250   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid0.5",
1251                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_05, FALSE);
1252   g_object_set_data (G_OBJECT (window), "menu_grid_05", item);
1253   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid1",
1254                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_1, FALSE);
1255   g_object_set_data (G_OBJECT (window), "menu_grid_1", item);
1256   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid2",
1257                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_2, FALSE);
1258   g_object_set_data (G_OBJECT (window), "menu_grid_2", item);
1259   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid4",
1260                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_4, FALSE);
1261   g_object_set_data (G_OBJECT (window), "menu_grid_4", item);
1262   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid8",
1263                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_8, TRUE);
1264   g_object_set_data (G_OBJECT (window), "menu_grid_8", item);
1265   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid16",
1266                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_16, FALSE);
1267   g_object_set_data (G_OBJECT (window), "menu_grid_16", item);
1268   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid32",
1269                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_32, FALSE);
1270   g_object_set_data (G_OBJECT (window), "menu_grid_32", item);
1271   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid64",
1272                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_64, FALSE);
1273   g_object_set_data (G_OBJECT (window), "menu_grid_64", item);
1274   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid128",
1275                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_128, FALSE);
1276   g_object_set_data (G_OBJECT (window), "menu_grid_128", item);
1277   item = create_radio_menu_item_with_mnemonic (menu, item, "Grid256",
1278                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_256, FALSE);
1279   g_object_set_data (G_OBJECT (window), "menu_grid_256", item);
1280   menu_separator (menu);
1281   item = create_check_menu_item_with_mnemonic (menu, "Snap to grid",
1282                                  GTK_SIGNAL_FUNC (HandleCommand), ID_SNAPTOGRID, TRUE);
1283   g_object_set_data (G_OBJECT (window), "menu_snaptogrid", item);
1284
1285   // Textures menu
1286   menu = create_sub_menu_with_mnemonic (menu_bar, "_Textures");
1287   if (g_PrefsDlg.m_bDetachableMenus)
1288     menu_tearoff (menu);
1289
1290   item = create_check_menu_item_with_mnemonic (menu, "Show In _Use",
1291                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWINUSE, FALSE);
1292   g_object_set_data (G_OBJECT (window), "menu_textures_showinuse", item);
1293   item = create_check_menu_item_with_mnemonic (menu, "Show _All",
1294                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWALL, FALSE);
1295   g_object_set_data (G_OBJECT (window), "menu_textures_showall", item);
1296   menu_separator (menu);
1297   item = create_check_menu_item_with_mnemonic (menu, "Show shaders",
1298                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERS_SHOW, FALSE);
1299   g_object_set_data (G_OBJECT (window), "menu_textures_shaders_show", item);
1300   item = create_menu_item_with_mnemonic (menu, "Flush & Reload Shaders",
1301                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_RELOADSHADERS);
1302   g_object_set_data (G_OBJECT (window), "menu_textures_reloadshaders", item);
1303   item = create_menu_item_with_mnemonic (menu, "Load directory...",
1304                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOAD);
1305   g_object_set_data (G_OBJECT (window), "menu_textures_load", item);
1306   item = create_menu_item_with_mnemonic (menu, "Directory list...",
1307                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOADLIST);
1308   menu_separator (menu);
1309
1310   item = create_menu_item_with_mnemonic (menu, "_Surface Inspector",
1311                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_INSPECTOR);
1312   menu_separator (menu);
1313   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Render Quality");
1314   g_object_set_data (G_OBJECT (window), "render_quality_menu", menu_in_menu);
1315   item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, "_Wireframe",
1316                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_WIREFRAME, FALSE);
1317   g_object_set_data (G_OBJECT (window), "menu_textures_wireframe", item);
1318   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Flat shade",
1319                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_FLATSHADE, FALSE);
1320   g_object_set_data (G_OBJECT (window), "menu_textures_flatshade", item);
1321   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Nearest",
1322                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEAREST, FALSE);
1323   g_object_set_data (G_OBJECT (window), "menu_view_nearest", item);
1324   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "Nearest _Mipmap",
1325                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEARESTMIPMAP, FALSE);
1326   g_object_set_data (G_OBJECT (window), "menu_view_nearestmipmap", item);
1327   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Linear",
1328                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_LINEAR, FALSE);
1329   g_object_set_data (G_OBJECT (window), "menu_view_linear", item);
1330   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "_Bilinear",
1331                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEAR, FALSE);
1332   g_object_set_data (G_OBJECT (window), "menu_view_bilinear", item);
1333   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "B_ilinear Mipmap",
1334                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEARMIPMAP, FALSE);
1335   g_object_set_data (G_OBJECT (window), "menu_view_bilinearmipmap", item);
1336   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "T_rilinear",
1337                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TRILINEAR, FALSE);
1338   g_object_set_data (G_OBJECT (window), "menu_view_trilinear", item);
1339   create_menu_item_with_mnemonic (menu, "Find / Replace...",
1340                     GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURE_REPLACEALL);
1341
1342   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Texture Lock");
1343   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Moves",
1344                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_LOCK, TRUE);
1345   g_object_set_data (G_OBJECT (window), "menu_toggle_lock", item);
1346   item = create_check_menu_item_with_mnemonic (menu_in_menu, "Rotations",
1347                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_ROTATELOCK, TRUE);
1348   g_object_set_data (G_OBJECT (window), "menu_toggle_rotatelock", item);
1349   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Texture Window Scale");
1350   item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, "200%",
1351                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE);
1352   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_200", item);
1353   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "100%",
1354                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE);
1355   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_100", item);
1356   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "50%",
1357                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE);
1358   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_50", item);
1359   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "25%",
1360                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE);
1361   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_25", item);
1362   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, "10%",
1363                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE);
1364   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_10", item);
1365   item = menu_separator (menu);
1366   item = create_check_menu_item_with_mnemonic (menu, "shaderlist.txt only",
1367                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERLISTONLY, FALSE);
1368   g_object_set_data (G_OBJECT (window), "menu_textures_shaderlistonly", item);
1369   item = menu_separator (menu);
1370   g_object_set_data (G_OBJECT (window), "menu_textures_separator", item);
1371   g_object_set_data (G_OBJECT (window), "menu_textures", menu);
1372
1373   // Misc menu
1374   menu = create_sub_menu_with_mnemonic (menu_bar, "_Misc");
1375   if (g_PrefsDlg.m_bDetachableMenus)
1376     menu_tearoff (menu);
1377
1378   create_menu_item_with_mnemonic (menu, "_Benchmark", GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_BENCHMARK);
1379   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Colors");
1380   menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, "Themes");
1381   create_menu_item_with_mnemonic (menu_3, "QE4 Original", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETORIGINAL);
1382   create_menu_item_with_mnemonic (menu_3, "Q3Radiant Original", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETQER);
1383   create_menu_item_with_mnemonic (menu_3, "Black and Green", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETBLACK);
1384   create_menu_item_with_mnemonic (menu_3, "Maya/Max/Lightwave Emulation", GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETYDNAR);
1385
1386   menu_separator (menu_in_menu);
1387   create_menu_item_with_mnemonic (menu_in_menu, "_Texture Background...",
1388                     GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREBK);
1389   create_menu_item_with_mnemonic (menu_in_menu, "Grid Background...",
1390                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_XYBK);
1391   create_menu_item_with_mnemonic (menu_in_menu, "Grid Major...",
1392                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR);
1393   create_menu_item_with_mnemonic (menu_in_menu, "Grid Minor...",
1394                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR);
1395   create_menu_item_with_mnemonic (menu_in_menu, "Grid Major Small...",
1396                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR_ALT);
1397   create_menu_item_with_mnemonic (menu_in_menu, "Grid Minor Small...",
1398                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR_ALT);
1399   create_menu_item_with_mnemonic (menu_in_menu, "Grid Text...",
1400                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDTEXT);
1401   create_menu_item_with_mnemonic (menu_in_menu, "Grid Block...",
1402                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDBLOCK);
1403   create_menu_item_with_mnemonic (menu_in_menu, "Default Brush...",
1404                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_BRUSH);
1405   create_menu_item_with_mnemonic (menu_in_menu, "Camera Background...",
1406                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CAMERABACK);    
1407   create_menu_item_with_mnemonic (menu_in_menu, "Selected Brush...",
1408                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH);
1409   create_menu_item_with_mnemonic (menu_in_menu, "Selected Brush (Camera)...",
1410                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH3D);
1411   create_menu_item_with_mnemonic (menu_in_menu, "Clipper...",
1412                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CLIPPER);
1413   create_menu_item_with_mnemonic (menu_in_menu, "Active View name...",
1414                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_VIEWNAME);
1415
1416   create_menu_item_with_mnemonic (menu, "_Gamma...",
1417                     GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_GAMMA);
1418   create_menu_item_with_mnemonic (menu, "Find brush...",
1419                     GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_FINDBRUSH);
1420   item = create_menu_item_with_mnemonic (menu, "Next leak spot",
1421                            GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_NEXTLEAKSPOT);
1422   item = create_menu_item_with_mnemonic (menu, "Previous leak spot",
1423                            GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PREVIOUSLEAKSPOT);
1424   // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394
1425 //  create_menu_item_with_mnemonic (menu, "_Print XY View", GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PRINTXY);
1426   item = create_menu_item_with_mnemonic (menu, "_Select Entity Color...",
1427                            GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_SELECTENTITYCOLOR);
1428   g_object_set_data (G_OBJECT (window), "menu_misc_selectentitycolor", item);
1429
1430   // Region menu
1431   menu = create_sub_menu_with_mnemonic (menu_bar, "_Region");
1432   if (g_PrefsDlg.m_bDetachableMenus)
1433     menu_tearoff (menu);
1434
1435   create_menu_item_with_mnemonic (menu, "_Off",
1436                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_OFF);
1437   create_menu_item_with_mnemonic (menu, "_Set XY",
1438                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETXY);
1439   create_menu_item_with_mnemonic (menu, "Set _Tall Brush",
1440                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETTALLBRUSH);
1441   create_menu_item_with_mnemonic (menu, "Set _Brush",
1442                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETBRUSH);
1443   create_menu_item_with_mnemonic (menu, "Set Se_lected Brushes",
1444                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETSELECTION);
1445
1446   // Brush menu
1447   menu = create_sub_menu_with_mnemonic (menu_bar, "_Brush");
1448   if (g_PrefsDlg.m_bDetachableMenus)
1449     menu_tearoff (menu);
1450
1451   item = create_menu_item_with_mnemonic (menu, "3 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_3SIDED);
1452   item = create_menu_item_with_mnemonic (menu, "4 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_4SIDED);
1453   item = create_menu_item_with_mnemonic (menu, "5 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_5SIDED);
1454   item = create_menu_item_with_mnemonic (menu, "6 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_6SIDED);
1455   item = create_menu_item_with_mnemonic (menu, "7 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_7SIDED);
1456   item = create_menu_item_with_mnemonic (menu, "8 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_8SIDED);
1457   item = create_menu_item_with_mnemonic (menu, "9 sided", GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_9SIDED);
1458   menu_separator (menu);
1459   create_menu_item_with_mnemonic (menu, "Arbitrary sided...",
1460                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ARBITRARYSIDED);
1461   menu_separator (menu);
1462   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Primitives");
1463   create_menu_item_with_mnemonic (menu_in_menu, "Cone...",
1464                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_MAKECONE);
1465   create_menu_item_with_mnemonic (menu_in_menu, "Sphere...",
1466                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_PRIMITIVES_SPHERE);
1467
1468   // Curve menu
1469   if (!g_pGameDescription->mNoPatch)
1470   {
1471   menu = create_sub_menu_with_mnemonic (menu_bar, "_Curve");
1472   if (g_PrefsDlg.m_bDetachableMenus)
1473     menu_tearoff (menu);
1474
1475   create_menu_item_with_mnemonic (menu, "Cylinder", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHTUBE);
1476   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "More Cylinders");
1477   create_menu_item_with_mnemonic (menu_in_menu, "Dense Cylinder",
1478                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHDENSETUBE);
1479   create_menu_item_with_mnemonic (menu_in_menu, "Very Dense Cylinder",
1480                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHVERYDENSETUBE);
1481   create_menu_item_with_mnemonic (menu_in_menu, "Square Cylinder",
1482                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHSQUARE);
1483   menu_separator (menu);
1484   create_menu_item_with_mnemonic (menu, "End cap", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHENDCAP);
1485   create_menu_item_with_mnemonic (menu, "Bevel", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHBEVEL);
1486   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "More End caps, Bevels");
1487   create_menu_item_with_mnemonic (menu_in_menu, "Square Endcap",
1488                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL);
1489   create_menu_item_with_mnemonic (menu_in_menu, "Square Bevel",
1490                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP);
1491   menu_separator (menu);
1492   create_menu_item_with_mnemonic (menu, "Cone", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHCONE);
1493   item = create_menu_item_with_mnemonic (menu, "Sphere",
1494                            GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PRIMITIVES_SPHERE);
1495   gtk_widget_set_sensitive (item, FALSE);
1496   menu_separator (menu);
1497   item = create_menu_item_with_mnemonic (menu, "Simple Patch Mesh...",
1498                            GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_SIMPLEPATCHMESH);
1499   g_object_set_data (G_OBJECT (window), "menu_simplepatchmesh", item);
1500   menu_separator (menu);
1501   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Insert");
1502   create_menu_item_with_mnemonic (menu_in_menu, "Insert (2) Columns",
1503                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTCOLUMN);
1504   create_menu_item_with_mnemonic (menu_in_menu, "Add (2) Columns",
1505                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDCOLUMN);
1506   menu_separator (menu_in_menu);
1507   create_menu_item_with_mnemonic (menu_in_menu, "Insert (2) Rows",
1508                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTROW);
1509   create_menu_item_with_mnemonic (menu_in_menu, "Add (2) Rows",
1510                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDROW);
1511   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Delete");
1512   create_menu_item_with_mnemonic (menu_in_menu, "First (2) Columns",
1513                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTCOLUMN);
1514   create_menu_item_with_mnemonic (menu_in_menu, "Last (2) Columns",
1515                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTCOLUMN);
1516   menu_separator (menu_in_menu);
1517   create_menu_item_with_mnemonic (menu_in_menu, "First (2) Rows",
1518                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTROW);
1519   create_menu_item_with_mnemonic (menu_in_menu, "Last (2) Rows",
1520                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTROW);
1521   menu_separator (menu);
1522   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Matrix");
1523   create_menu_item_with_mnemonic (menu_in_menu, "Invert",
1524                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVE);
1525   menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, "Re-disperse");
1526   create_menu_item_with_mnemonic (menu_3, "Rows", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_ROWS);
1527   create_menu_item_with_mnemonic (menu_3, "Cols (Intermediate)", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS);
1528   create_menu_item_with_mnemonic (menu_3, "Rows (Intermediate)", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS);
1529   create_menu_item_with_mnemonic (menu_in_menu, "Transpose",
1530                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MATRIX_TRANSPOSE);
1531   menu_separator (menu);
1532   create_menu_item_with_mnemonic (menu, "Cap Selection",
1533                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CAP);
1534   create_menu_item_with_mnemonic (menu, "Cycle Cap Texture",
1535                         GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CYCLECAP);
1536   menu_separator (menu);
1537   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, "Overlay");
1538   create_menu_item_with_mnemonic (menu_in_menu, "Set",
1539                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_SET);
1540   create_menu_item_with_mnemonic (menu_in_menu, "Clear",
1541                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_CLEAR);
1542   menu_separator (menu);
1543   create_menu_item_with_mnemonic (menu, "Thicken...", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_THICKEN);
1544   }
1545   // Plugins menu
1546   menu = create_sub_menu_with_mnemonic (menu_bar, "_Plugins");
1547   if (g_PrefsDlg.m_bDetachableMenus)
1548     menu_tearoff (menu);
1549
1550   /*
1551   create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1552   */
1553   // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1554   item = menu_separator (menu);
1555   g_object_set_data (G_OBJECT (window), "menu_plugin_separator", item);
1556   g_object_set_data (G_OBJECT (window), "menu_plugin", menu);
1557
1558   // Help menu
1559   menu = create_sub_menu_with_mnemonic (menu_bar, "_Help");
1560   if (g_PrefsDlg.m_bDetachableMenus)
1561     menu_tearoff (menu);
1562
1563   item = create_menu_item_with_mnemonic (menu, "Manual",
1564                            GTK_SIGNAL_FUNC (HandleCommand), ID_HELP);
1565   gtk_widget_add_accelerator (item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1566
1567   // this creates all the per-game drop downs for the game pack helps
1568   // it will take care of hooking the Sys_OpenURL calls etc.
1569   create_game_help_menu(menu, accel);
1570
1571   // TTimo: this is in global.xlink now
1572   //create_menu_item_with_mnemonic (menu, "Links",
1573   //                  GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1574   create_menu_item_with_mnemonic (menu, "Bug report",
1575                     GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_BUGREPORT);
1576   create_menu_item_with_mnemonic (menu, "Shortcuts list",
1577                     GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_COMMANDLIST);
1578   create_menu_item_with_mnemonic (menu, "_About",
1579                     GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_ABOUT);
1580
1581
1582   // leo: Hidden menu to make the accelerators work,
1583   // this is a hack that needs to be changed later if someone has a better idea.
1584   // NOTE TTimo
1585   // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1586   menu = create_sub_menu_with_mnemonic (menu_bar, "Hidden");
1587   if (g_PrefsDlg.m_bDetachableMenus)
1588     menu_tearoff (menu);
1589
1590   gtk_widget_hide (gtk_menu_get_attach_widget (GTK_MENU (menu)));
1591
1592   create_menu_item_with_mnemonic (menu, "BendMode", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_BEND);
1593   create_menu_item_with_mnemonic (menu, "FitTexture", GTK_SIGNAL_FUNC (HandleCommand), IDC_BTN_FACEFIT);
1594   create_menu_item_with_mnemonic (menu, "ViewTextures", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TEXTURE);
1595   create_menu_item_with_mnemonic (menu, "PatchInspector", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_INSPECTOR);
1596   create_menu_item_with_mnemonic (menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREY);
1597   create_menu_item_with_mnemonic (menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREX);
1598   create_menu_item_with_mnemonic (menu, "IncPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTCOLUMN);
1599   create_menu_item_with_mnemonic (menu, "IncPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTROW);
1600   create_menu_item_with_mnemonic (menu, "DecPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETECOLUMN);
1601   create_menu_item_with_mnemonic (menu, "DecPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETEROW);
1602   create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1603   create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1604   create_menu_item_with_mnemonic (menu, "SelectNudgeDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1605   create_menu_item_with_mnemonic (menu, "CameraForward", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_FORWARD);
1606   create_menu_item_with_mnemonic (menu, "CameraBack", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_BACK);
1607   create_menu_item_with_mnemonic (menu, "CameraLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_LEFT);
1608   create_menu_item_with_mnemonic (menu, "CameraRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_RIGHT);
1609   create_menu_item_with_mnemonic (menu, "CameraUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_UP);
1610   create_menu_item_with_mnemonic (menu, "CameraDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_DOWN);
1611   create_menu_item_with_mnemonic (menu, "CameraAngleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEUP);
1612   create_menu_item_with_mnemonic (menu, "CameraAngleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEDOWN);
1613   create_menu_item_with_mnemonic (menu, "CameraStrafeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFERIGHT);
1614   create_menu_item_with_mnemonic (menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFELEFT);
1615   create_menu_item_with_mnemonic (menu, "ToggleGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_TOGGLE);
1616   create_menu_item_with_mnemonic (menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CROSSHAIR);
1617   create_menu_item_with_mnemonic (menu, "ToggleRealtime", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CAMERAUPDATE);
1618   create_menu_item_with_mnemonic (menu, "MouseRotate", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_MOUSEROTATE);
1619   create_menu_item_with_mnemonic (menu, "TexRotateClock", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECLOCK);
1620   create_menu_item_with_mnemonic (menu, "TexRotateCounter", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECOUNTER);
1621   create_menu_item_with_mnemonic (menu, "TexScaleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEUP);
1622   create_menu_item_with_mnemonic (menu, "TexScaleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEDOWN);
1623   create_menu_item_with_mnemonic (menu, "TexShiftLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTLEFT);
1624   create_menu_item_with_mnemonic (menu, "TexShiftRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTRIGHT);
1625   create_menu_item_with_mnemonic (menu, "TexShiftUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTUP);
1626   create_menu_item_with_mnemonic (menu, "TexShiftDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTDOWN);
1627   create_menu_item_with_mnemonic (menu, "GridDown", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_PREV);
1628   create_menu_item_with_mnemonic (menu, "GridUp", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_NEXT);
1629   create_menu_item_with_mnemonic (menu, "TexScaleLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALELEFT);
1630   create_menu_item_with_mnemonic (menu, "TexScaleRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALERIGHT);
1631   create_menu_item_with_mnemonic (menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEDOWN);
1632   create_menu_item_with_mnemonic (menu, "MoveSelectionUP", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEUP);
1633   create_menu_item_with_mnemonic (menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_PRINT);
1634   create_menu_item_with_mnemonic (menu, "ToggleSizePaint", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TOGGLESIZEPAINT);
1635   create_menu_item_with_mnemonic (menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1636   create_menu_item_with_mnemonic (menu, "SelectNudgeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1637   create_menu_item_with_mnemonic (menu, "SelectNudgeUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1638   create_menu_item_with_mnemonic (menu, "NaturalizePatch", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_NATURALIZE);
1639   create_menu_item_with_mnemonic (menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SNAPTOGRID);
1640   create_menu_item_with_mnemonic (menu, "SelectAllOfType", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_ALL);
1641   create_menu_item_with_mnemonic (menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_OUTLINESTYLE);
1642   create_menu_item_with_mnemonic (menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEUP);
1643   create_menu_item_with_mnemonic (menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEDOWN);
1644
1645   g_bIgnoreCommands--;
1646 }
1647
1648 void MainFrame::create_main_toolbar (GtkWidget *window, GtkWidget *vbox)
1649 {
1650   GtkWidget *handle_box, *toolbar, *w;
1651
1652   handle_box = gtk_handle_box_new ();
1653   gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1654   gtk_widget_show (handle_box);
1655   g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1656
1657   toolbar = gtk_toolbar_new ();
1658   gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1659   gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1660   //  gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1661   gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1662
1663   gtk_widget_show (toolbar);
1664
1665   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "Open", "Open an existing map", "",
1666                                new_pixmap (window, "file_open.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1667                                GINT_TO_POINTER (ID_FILE_OPEN));
1668   g_object_set_data (G_OBJECT (window), "tb_file_open", w);
1669   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "Save", "Save the active map", "",
1670                                new_pixmap (window, "file_save.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1671                                GINT_TO_POINTER (ID_FILE_SAVE));
1672   g_object_set_data (G_OBJECT (window), "tb_file_save", w);
1673   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1674   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "x-axis Flip", "",
1675                                new_pixmap (window, "brush_flipx.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1676                                GINT_TO_POINTER (ID_BRUSH_FLIPX));
1677   g_object_set_data (G_OBJECT (window), "tb_brush_flipx", w);
1678   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "x-axis Rotate", "",
1679                                new_pixmap (window, "brush_rotatex.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1680                                GINT_TO_POINTER (ID_BRUSH_ROTATEX));
1681   g_object_set_data (G_OBJECT (window), "tb_brush_rotatex", w);
1682   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "y-axis Flip", "",
1683                                new_pixmap (window, "brush_flipy.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1684                                GINT_TO_POINTER (ID_BRUSH_FLIPY));
1685   g_object_set_data (G_OBJECT (window), "tb_brush_flipy", w);
1686   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "y-axis Rotate", "",
1687                                new_pixmap (window, "brush_rotatey.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1688                                GINT_TO_POINTER (ID_BRUSH_ROTATEY));
1689   g_object_set_data (G_OBJECT (window), "tb_brush_rotatey", w);
1690   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "z-axis Flip", "",
1691                                new_pixmap (window, "brush_flipz.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1692                                GINT_TO_POINTER (ID_BRUSH_FLIPZ));
1693   g_object_set_data (G_OBJECT (window), "tb_brush_flipz", w);
1694   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "z-axis Rotate", "",
1695                                new_pixmap (window, "brush_rotatez.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1696                                GINT_TO_POINTER (ID_BRUSH_ROTATEZ));
1697   g_object_set_data (G_OBJECT (window), "tb_brush_rotatez", w);
1698   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1699
1700   if (g_PrefsDlg.m_bWideToolbar)
1701   {
1702     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Complete Tall", "",
1703                                  new_pixmap (window, "selection_selectcompletetall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1704                                  GINT_TO_POINTER (ID_SELECTION_SELECTCOMPLETETALL));
1705     g_object_set_data (G_OBJECT (window), "tb_selection_selectcompletetall", w);
1706     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Select Touching", "",
1707                                  new_pixmap (window, "selection_selecttouching.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1708                                  GINT_TO_POINTER (ID_SELECTION_SELECTTOUCHING));
1709     g_object_set_data (G_OBJECT (window), "tb_selection_selecttouching", w);
1710     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Select Partial Tall", "",
1711                                  new_pixmap (window, "selection_selectpartialtall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1712                                  GINT_TO_POINTER (ID_SELECTION_SELECTPARTIALTALL));
1713     g_object_set_data (G_OBJECT (window), "tb_selection_selectpartialtall", w);
1714     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Select Inside", "",
1715                                  new_pixmap (window, "selection_selectinside.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1716                                  GINT_TO_POINTER (ID_SELECTION_SELECTINSIDE));
1717     g_object_set_data (G_OBJECT (window), "tb_selection_selectinside", w);
1718   } else
1719   {
1720     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Selection", "",
1721                                  new_pixmap (window, "popup_selection.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1722                                  GINT_TO_POINTER (ID_POPUP_SELECTION));
1723     g_object_set_data (G_OBJECT (window), "tb_popup_selection", w);
1724   }
1725   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1726
1727   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "CSG Subtract", "",
1728                                new_pixmap (window, "selection_csgsubtract.bmp"),
1729                                GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGSUBTRACT));
1730   g_object_set_data (G_OBJECT (window), "tb_selection_csgsubtract", w);
1731
1732   if (g_PrefsDlg.m_bWideToolbar)
1733   {
1734     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "CSG Merge", "",
1735                                  new_pixmap (window, "selection_csgmerge.bmp"),
1736                                  GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGMERGE));
1737     g_object_set_data (G_OBJECT (window), "tb_selection_csgmerge", w);
1738   }
1739
1740   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Hollow", "",
1741                                new_pixmap (window, "selection_makehollow.bmp"),
1742                                GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_MAKEHOLLOW));
1743   g_object_set_data (G_OBJECT (window), "tb_selection_makehollow", w);
1744
1745   if (g_PrefsDlg.m_bWideToolbar)
1746   {
1747     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1748                                     "", "Clipper", "", new_pixmap (window, "view_clipper.bmp"),
1749                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1750     g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1751   }
1752
1753   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1754
1755   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Change views", "",
1756                                new_pixmap (window, "view_change.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1757                                GINT_TO_POINTER (ID_VIEW_CHANGE));
1758   g_object_set_data (G_OBJECT (window), "tb_view_change", w);
1759
1760   if (!g_PrefsDlg.m_bWideToolbar)
1761   {
1762     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1763   }
1764
1765   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Texture view mode", "",
1766                                new_pixmap (window, "textures_popup.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1767                                GINT_TO_POINTER (ID_TEXTURES_POPUP));
1768   g_object_set_data (G_OBJECT (window), "tb_textures_popup", w);
1769
1770   if (g_PrefsDlg.m_bWideToolbar)
1771   {
1772     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1773                                     "", "Cubic clip the camera view", "",
1774                                     new_pixmap (window, "view_cubicclipping.bmp"),
1775                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1776     g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1777   }
1778
1779   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1780
1781   if (!g_PrefsDlg.m_bWideToolbar)
1782   {
1783     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1784                                 "", "Camera preview", "", new_pixmap (window, "view_cameratoggle.bmp"),
1785                                 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CAMERATOGGLE));
1786     g_object_set_data (G_OBJECT (window), "tb_view_cameratoggle", w);
1787     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Update Camera", "",
1788                              new_pixmap (window, "view_cameraupdate.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1789                              GINT_TO_POINTER (ID_VIEW_CAMERAUPDATE));
1790     g_object_set_data (G_OBJECT (window), "tb_view_cameraupdate", w);
1791     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1792                                 "", "Cubic clip the camera view", "",
1793                                 new_pixmap (window, "view_cubicclipping.bmp"),
1794                                 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1795     g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1796     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1797     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1798                                     "", "Entity inspector", "", new_pixmap (window, "view_entity.bmp"),
1799                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_ENTITY));
1800     g_object_set_data (G_OBJECT (window), "tb_view_entity", w);
1801     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1802     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1803                                     "", "Clipper", "", new_pixmap (window, "view_clipper.bmp"),
1804                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1805     g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1806     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1807   }
1808
1809   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1810                               "", "Free Rotation", "", new_pixmap (window, "select_mouserotate.bmp"),
1811                               GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSEROTATE));
1812   g_object_set_data (G_OBJECT (window), "tb_select_mouserotate", w);
1813   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1814   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1815                               "", "Free Scaling", "", new_pixmap (window, "select_mousescale.bmp"),
1816                               GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSESCALE));
1817   g_object_set_data (G_OBJECT (window), "tb_select_mousescale", w);
1818   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1819                                   "", "Scale X", "", new_pixmap (window, "scalelockx.bmp"),
1820                                   GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKX));
1821   g_object_set_data (G_OBJECT (window), "tb_scalelockx", w);
1822   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1823                                   "", "Scale Y", "", new_pixmap (window, "scalelocky.bmp"),
1824                                   GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKY));
1825   g_object_set_data (G_OBJECT (window), "tb_scalelocky", w);
1826   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1827                                   "", "Scale Z", "", new_pixmap (window, "scalelockz.bmp"),
1828                                   GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKZ));
1829   g_object_set_data (G_OBJECT (window), "tb_scalelockz", w);
1830
1831   if (g_PrefsDlg.m_bWideToolbar)
1832   {
1833     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1834     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1835                              "", "Don't select model brushes", "",
1836                              new_pixmap (window, "dontselectmodel.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1837                              GINT_TO_POINTER (ID_DONTSELECTMODEL));
1838     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1839     g_object_set_data (G_OBJECT (window), "tb_dontselectmodel", w);
1840
1841     if (!g_pGameDescription->mNoPatch)
1842     {
1843       w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1844                              "", "Don't select curved brushes", "",
1845                              new_pixmap (window, "dontselectcurve.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1846                              GINT_TO_POINTER (ID_DONTSELECTCURVE));
1847       g_object_set_data (G_OBJECT (window), "tb_dontselectcurve", w);
1848     }
1849   }
1850
1851   // bug #292, patch toolbar option
1852   if (g_PrefsDlg.m_bPatchToolbar)
1853   {
1854     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1855                              "", "Show patch bounding box", "",
1856                              new_pixmap (window, "patch_showboundingbox.bmp"),
1857                              GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_SHOWBOUNDINGBOX));
1858     g_object_set_data (G_OBJECT (window), "tb_patch_showboundingbox", w);
1859     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1860                                     "", "Show patches as wireframes", "",
1861                                     new_pixmap (window, "patch_wireframe.bmp"),
1862                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_WIREFRAME));
1863     g_object_set_data (G_OBJECT (window), "tb_patch_wireframe", w);
1864     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1865                              "", "Patch Bend mode", "",
1866                              new_pixmap (window, "patch_bend.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1867                              GINT_TO_POINTER (ID_PATCH_BEND));
1868     g_object_set_data (G_OBJECT (window), "tb_patch_bend", w);
1869     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Put caps on the current patch", "",
1870                              new_pixmap (window, "curve_cap.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1871                              GINT_TO_POINTER (ID_CURVE_CAP));
1872     g_object_set_data (G_OBJECT (window), "tb_curve_cap", w);
1873     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1874                                  "", "Welds equal patch points during moves", "",
1875                                  new_pixmap (window, "patch_weld.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1876                                  GINT_TO_POINTER (ID_PATCH_WELD));
1877     g_object_set_data (G_OBJECT (window), "tb_patch_weld", w);
1878     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1879                              "", "Selects drill down rows and columns", "",
1880                              new_pixmap (window, "patch_drilldown.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1881                              GINT_TO_POINTER (ID_PATCH_DRILLDOWN));
1882     g_object_set_data (G_OBJECT (window), "tb_patch_drilldown", w);
1883   }
1884
1885   if (g_PrefsDlg.m_bWideToolbar)
1886   {
1887     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1888     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Show Entities as", "",
1889                              new_pixmap (window, "show_entities.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1890                              GINT_TO_POINTER (ID_SHOW_ENTITIES));
1891     g_object_set_data (G_OBJECT (window), "tb_show_entities", w);
1892   }
1893
1894   /*
1895   uh? that is OLD
1896 #ifndef QUAKE3
1897   w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1898   gtk_widget_hide (w);
1899   w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1900   gtk_widget_hide (w);
1901   w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1902   gtk_widget_hide (w);
1903   w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1904   gtk_widget_hide (w);
1905 #endif
1906   */
1907
1908   m_bCamPreview = true;
1909   g_nScaleHow = (SCALE_X | SCALE_Y | SCALE_Z);
1910 }
1911
1912 void MainFrame::create_plugin_toolbar (GtkWidget *window, GtkWidget *vbox)
1913 {
1914   GtkWidget *handle_box, *toolbar;
1915
1916   handle_box = gtk_handle_box_new ();
1917   gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1918   if (g_PrefsDlg.m_bPluginToolbar)
1919     gtk_widget_show (handle_box);
1920   g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1921
1922   toolbar = gtk_toolbar_new();
1923   gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1924   gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1925   //  gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1926   gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1927   g_object_set_data (G_OBJECT (window), "toolbar_plugin", toolbar);
1928   gtk_widget_show (toolbar);
1929 }
1930
1931 void MainFrame::create_main_statusbar (GtkWidget *window, GtkWidget *vbox)
1932 {
1933   GtkWidget *hbox, *hbox1;
1934   GtkWidget *frame;
1935   GtkWidget *label;
1936
1937   hbox = gtk_hbox_new (FALSE, 0);
1938   gtk_widget_show (hbox);
1939   gtk_widget_set_usize (hbox, -1, 24);
1940   gtk_container_border_width (GTK_CONTAINER (hbox), 1);
1941   gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 2);
1942
1943   frame = gtk_frame_new ((char*)NULL);
1944   gtk_widget_show (frame);
1945   gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
1946   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1947
1948   hbox1 = gtk_hbox_new (FALSE, 0);
1949   gtk_container_add (GTK_CONTAINER (frame), hbox1);
1950   gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
1951   gtk_widget_show (hbox1);
1952
1953   label = gtk_label_new (" Label ");
1954   gtk_widget_show (label);
1955   gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, TRUE, 0);
1956   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1957   gtk_misc_set_padding (GTK_MISC (label), 3, 0);
1958   m_pStatusLabel[0] = label;
1959
1960   for (int i = 1; i < 6; i++)
1961   {
1962     frame = gtk_frame_new ((char*)NULL);
1963     gtk_widget_show (frame);
1964     gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1965     gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1966
1967     label = gtk_label_new (" Label ");
1968     gtk_widget_show (label);
1969     gtk_container_add (GTK_CONTAINER (frame), label);
1970     m_pStatusLabel[i] = label;
1971   }
1972 }
1973
1974 guint s_idle_id;
1975 static gint mainframe_idle (gpointer user_data)
1976 {
1977   g_pParentWnd->RoutineProcessing ();
1978   return TRUE;
1979 }
1980
1981 static void Sys_Iconify (GtkWidget *w);
1982 static void Sys_Restore (GtkWidget *w);
1983
1984 inline void CHECK_RESTORE(GtkWidget* w)
1985 {
1986   if (g_object_get_data (G_OBJECT (w), "was_mapped") != NULL)
1987     gtk_widget_show (w);
1988 }
1989
1990
1991 // this is called when the window is restored from the iconified state
1992 static void mainframe_map (GtkWidget *widget)
1993 {
1994   if (g_pParentWnd->IsSleeping ())
1995     g_pParentWnd->OnSleep ();
1996
1997   if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
1998   {
1999     // restore previously visible windows
2000     CHECK_RESTORE (g_pParentWnd->GetCamWnd ()->m_pParent);
2001     if (g_PrefsDlg.m_bFloatingZ)
2002       CHECK_RESTORE (g_pParentWnd->GetZWnd ()->m_pParent);
2003     CHECK_RESTORE (g_pParentWnd->GetXYWnd ()->m_pParent);
2004     CHECK_RESTORE (g_pParentWnd->GetXZWnd ()->m_pParent);
2005     CHECK_RESTORE (g_pParentWnd->GetYZWnd ()->m_pParent);
2006     CHECK_RESTORE (g_pGroupDlg->m_pWidget);
2007   }
2008 }
2009
2010 inline void CHECK_MINIMIZE(GtkWidget* w)
2011 {
2012   g_object_set_data (G_OBJECT (w), "was_mapped", (void*)(GTK_WIDGET_VISIBLE (w) != 0));
2013   gtk_widget_hide (w);
2014 }
2015
2016 static void mainframe_unmap (GtkWidget *widget)
2017 {
2018
2019   if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
2020   {
2021     // minimize all other windows when the main window is minimized
2022     CHECK_MINIMIZE (g_pParentWnd->GetCamWnd ()->m_pParent);
2023     if (g_PrefsDlg.m_bFloatingZ)
2024       CHECK_MINIMIZE (g_pParentWnd->GetZWnd ()->m_pParent);
2025     CHECK_MINIMIZE (g_pParentWnd->GetXYWnd ()->m_pParent);
2026     CHECK_MINIMIZE (g_pParentWnd->GetXZWnd ()->m_pParent);
2027     CHECK_MINIMIZE (g_pParentWnd->GetYZWnd ()->m_pParent);
2028     CHECK_MINIMIZE (g_pGroupDlg->m_pWidget);
2029   }
2030 }
2031
2032 static GtkWidget* create_floating (MainFrame* mainframe)
2033 {
2034   GtkWidget *wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2035   //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2036     gtk_window_set_transient_for (GTK_WINDOW (wnd), GTK_WINDOW (mainframe->m_pWidget));
2037   gtk_widget_set_events (wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2038   gtk_signal_connect (GTK_OBJECT (wnd), "delete_event", GTK_SIGNAL_FUNC (widget_delete_hide), NULL);
2039   gtk_signal_connect (GTK_OBJECT (wnd), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2040   gtk_signal_connect (GTK_OBJECT (wnd), "key_press_event",
2041                       GTK_SIGNAL_FUNC (mainframe_keypress), mainframe);
2042   gtk_signal_connect (GTK_OBJECT (wnd), "key_release_event",
2043                       GTK_SIGNAL_FUNC (mainframe_keyrelease), mainframe);
2044   gtk_signal_connect (GTK_OBJECT (wnd), "map_event",
2045                       GTK_SIGNAL_FUNC (mainframe_map), mainframe);
2046
2047   gtk_window_set_default_size (GTK_WINDOW (wnd), 100, 100);
2048
2049 #ifdef DBG_WINDOWPOS
2050   Sys_Printf("create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd);
2051 #endif
2052
2053   return wnd;
2054 }
2055
2056 void console_populate_popup(GtkTextView* textview, GtkMenu* menu, gpointer user_data)
2057 {
2058   menu_separator(GTK_WIDGET(menu));
2059
2060   GtkWidget* item = gtk_menu_item_new_with_label ("Clear");
2061   gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (Sys_ClearPrintf), NULL);
2062   gtk_widget_show (item);
2063   gtk_menu_append (GTK_MENU (menu), item);
2064 }
2065
2066 void console_construct(GtkWidget* textview)
2067 {
2068   g_signal_connect(G_OBJECT(textview), "populate-popup", G_CALLBACK(console_populate_popup), NULL);
2069 }
2070
2071 extern MemStream g_Clipboard;
2072
2073 void Clipboard_CopyMap()
2074 {
2075   g_Clipboard.SetLength(0);
2076   Map_Export (&g_Clipboard, "xmap", false, true);
2077 }
2078
2079 void Clipboard_PasteMap()
2080 {
2081   if (g_Clipboard.GetLength() > 0)
2082   {
2083     g_Clipboard.Seek(0, SEEK_SET);
2084     Map_Import(&g_Clipboard, "xmap", true);
2085   }
2086 }
2087
2088 /*!
2089 Platform-independent GTK clipboard support.
2090 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2091 */
2092 #if defined (__linux__) || defined (__APPLE__)
2093
2094 enum
2095 {
2096   RADIANT_CLIPPINGS = 23,
2097 };
2098
2099 static const GtkTargetEntry clipboard_targets[] = {
2100   { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2101 };
2102
2103 static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner)
2104 {
2105   guchar *buffer;
2106   gint len;
2107   GdkAtom type = GDK_NONE;
2108
2109   len = g_Clipboard.GetLength();
2110
2111   if (!len)
2112   {
2113     buffer = NULL;
2114   } else
2115   {
2116     buffer = g_Clipboard.GetBuffer ();
2117   }
2118
2119   if(info == clipboard_targets[0].info)
2120   {
2121     type = gdk_atom_intern(clipboard_targets[0].target, FALSE);
2122   }
2123
2124   gtk_selection_data_set (selection_data, type, 8, buffer, len);
2125 }
2126
2127 static void clipboard_clear (GtkClipboard *clipboard, gpointer user_data_or_owner)
2128 {
2129 }
2130
2131 static void clipboard_received (GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data)
2132 {
2133   g_Clipboard.SetLength (0);
2134
2135   if (data->length < 0)
2136     Sys_FPrintf(SYS_ERR, "Error retrieving selection\n");
2137   else if(strcmp(gdk_atom_name(data->type), clipboard_targets[0].target) == 0)
2138     g_Clipboard.Write (data->data, data->length);
2139
2140   Clipboard_PasteMap();
2141 }
2142
2143 void clipboard_copy()
2144 {
2145   Clipboard_CopyMap();
2146
2147   GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2148
2149   gtk_clipboard_set_with_data (clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL);
2150 }
2151
2152 void clipboard_paste()
2153 {
2154   GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2155
2156   gtk_clipboard_request_contents (clipboard, gdk_atom_intern(clipboard_targets[0].target, FALSE), clipboard_received, NULL);
2157 }
2158
2159
2160 #elif defined(WIN32)
2161
2162 void clipboard_copy()
2163 {
2164   Clipboard_CopyMap();
2165
2166   bool bClipped = false;
2167   UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2168   if (nClipboard > 0)
2169   {
2170     if (::OpenClipboard(NULL))
2171     {
2172       EmptyClipboard();
2173                 long lSize = g_Clipboard.GetLength();
2174       HANDLE h = ::GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof(long));
2175       if (h != NULL)
2176       {
2177         unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2178                                 memcpy(cp, &lSize, sizeof(long));
2179                                 cp += sizeof(long);
2180         g_Clipboard.Seek(0, SEEK_SET);
2181         g_Clipboard.Read(cp, lSize);
2182         ::GlobalUnlock(h);
2183         ::SetClipboardData(nClipboard, h);
2184         ::CloseClipboard();
2185         bClipped = true;
2186       }
2187     }
2188   }
2189
2190   if (!bClipped)
2191   {
2192     Sys_Printf("Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n");
2193   }
2194 }
2195
2196 void clipboard_paste()
2197 {
2198   bool bPasted = false;
2199   UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2200   if (nClipboard > 0 && ::OpenClipboard(NULL))
2201   {
2202     if(IsClipboardFormatAvailable(nClipboard))
2203     {
2204       HANDLE h = ::GetClipboardData(nClipboard);
2205       if (h)
2206       {
2207         g_Clipboard.SetLength(0);
2208                           unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2209                           long lSize = 0;
2210                           memcpy(&lSize, cp, sizeof(long));
2211                           cp += sizeof(long);
2212         g_Clipboard.Write(cp, lSize);
2213         ::GlobalUnlock(h);
2214       }
2215     }
2216     ::CloseClipboard();
2217   }
2218
2219   Clipboard_PasteMap();
2220 }
2221
2222 #endif
2223
2224 void MainFrame::Copy()
2225 {
2226   clipboard_copy();
2227 }
2228
2229 void MainFrame::Paste()
2230 {
2231   clipboard_paste();
2232   UpdateSurfaceDialog();
2233 }
2234
2235
2236 #ifdef DBG_WINDOWPOS
2237 GtkWidget *watchit = NULL;
2238
2239 void CheckWatchit(char *msg)
2240 {
2241   static int width = 0;
2242   if ((watchit!=NULL) && (watchit->allocation.width != width))
2243   {
2244     Sys_Printf("CheckWatchit %s: %d\n", msg, watchit->allocation.width);
2245     width = watchit->allocation.width;
2246   }
2247 }
2248 #endif
2249
2250 #ifdef _WIN32
2251 BOOL CALLBACK m_pCountMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2252 {
2253   int *n = (int *) dwData;
2254
2255   (*n)++;
2256
2257   return TRUE;
2258 }
2259
2260 struct monitorInfo_s { 
2261   GdkRectangle *win_monitors;
2262   int i_win_mon;
2263 };
2264
2265 BOOL CALLBACK m_pEnumMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2266 {
2267   monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2268   GdkRectangle *monitor;
2269   MONITORINFOEX lpmi;
2270
2271   monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2272
2273   memset(&lpmi, 0, sizeof(MONITORINFOEX));
2274   lpmi.cbSize = sizeof(MONITORINFOEX);
2275
2276   GetMonitorInfo( hMonitor, &lpmi );
2277
2278   if( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2279     RECT rect;
2280
2281     SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0);
2282     monitor->x = rect.left;
2283     monitor->y = rect.top;
2284     monitor->width = rect.right - rect.left;
2285     monitor->height = rect.bottom - rect.top;
2286
2287     if (monitorInfo->i_win_mon != 0)
2288           {
2289             GdkRectangle temp = *monitor;
2290       *monitor = monitorInfo->win_monitors[0];
2291             monitorInfo->win_monitors[0] = temp;
2292           }
2293   } else {
2294     monitor->x = lpmi.rcMonitor.left;
2295     monitor->y = lpmi.rcMonitor.top;
2296     monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2297     monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2298   }
2299
2300   monitorInfo->i_win_mon++;
2301
2302   return TRUE;
2303 }
2304
2305 void PositionWindowOnPrimaryScreen(window_position_t& position)
2306 {
2307   const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2308
2309   if( position.x <= primaryMonitorRect.x + 6 )
2310     position.x = primaryMonitorRect.x + 6;
2311   else if( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 )
2312     position.x = primaryMonitorRect.x + 6;
2313
2314   if( position.y <= primaryMonitorRect.y + 6 )
2315     position.y = primaryMonitorRect.y + 6;
2316   else if( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 )
2317     position.y = primaryMonitorRect.y + 6;
2318
2319   if( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 )
2320     position.w = primaryMonitorRect.width - 18;
2321   if( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 )
2322     position.h = primaryMonitorRect.height - 18;
2323 }
2324 #endif
2325
2326 GtkWidget* create_framed_widget(GtkWidget* widget)
2327 {
2328   GtkWidget* frame = gtk_frame_new ((char*)NULL);
2329   gtk_widget_show (frame);
2330   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2331   gtk_container_add (GTK_CONTAINER (frame), widget);
2332   gtk_widget_show(widget);
2333   return frame;
2334 }
2335
2336 gboolean entry_focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2337 {
2338   gtk_window_remove_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2339   return FALSE;
2340 }
2341
2342 gboolean entry_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2343 {
2344   gtk_window_add_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2345   return FALSE;
2346 }
2347
2348 GtkWidget* create_framed_texwnd(TexWnd* texwnd)
2349 {
2350   GtkWidget* frame = gtk_frame_new ((char*)NULL);
2351   gtk_widget_show (frame);
2352   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2353
2354   GtkWidget* hbox = gtk_hbox_new (FALSE, 0);
2355   gtk_widget_show (hbox);
2356   gtk_container_add (GTK_CONTAINER (frame), hbox);
2357
2358   GtkWidget* w = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,1,1,1)));
2359   gtk_widget_show (w);
2360   gtk_box_pack_end (GTK_BOX (hbox), w, FALSE, TRUE, 0);
2361   g_qeglobals_gui.d_texture_scroll = w;
2362
2363   GtkWidget* texbox = gtk_vbox_new (FALSE, 0);
2364   gtk_widget_show (texbox);
2365   gtk_box_pack_start (GTK_BOX (hbox), texbox, TRUE, TRUE, 0);
2366
2367   w = gtk_entry_new ();
2368   gtk_box_pack_start (GTK_BOX (texbox), w, FALSE, FALSE, 0);
2369   texwnd->m_pFilter = w;
2370   g_signal_connect(G_OBJECT(w), "focus_in_event", G_CALLBACK(entry_focus_in), NULL);
2371   g_signal_connect(G_OBJECT(w), "focus_out_event", G_CALLBACK(entry_focus_out), NULL);
2372
2373   w = texwnd->GetWidget ();
2374   gtk_box_pack_start (GTK_BOX (texbox), w, TRUE, TRUE, 0);
2375   gtk_widget_show (w);
2376
2377   return frame;
2378 }
2379
2380 static ZWnd *create_floating_zwnd(MainFrame *mainframe)
2381 {
2382   ZWnd *pZWnd = new ZWnd ();
2383   GtkWidget* wnd = create_floating (mainframe);
2384
2385   gtk_window_set_title (GTK_WINDOW (wnd), "Z");
2386
2387   pZWnd->m_pParent = wnd;
2388
2389   {
2390     GtkWidget* frame = create_framed_widget(pZWnd->GetWidget());
2391     gtk_container_add (GTK_CONTAINER (wnd), frame);
2392   }
2393
2394   gtk_widget_realize (wnd);
2395
2396   // turn OFF minimize and maximize boxes. 
2397   // Must be *after* realize, or wnd->window is NULL
2398   // should do the right thing on *nix, need to verify.
2399   gdk_window_set_decorations ( wnd->window,
2400                                 GdkWMDecoration(GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2401   //TODO 50 by observation, will vary depending on decoration sizes
2402   {
2403     GdkGeometry geometry;
2404     geometry.min_width = 50;
2405     //we only care about width, but have to set this too, or get nasty bugs
2406     geometry.min_height = 10; 
2407     gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE);
2408   }
2409
2410 #ifdef _WIN32
2411   if( g_PrefsDlg.m_bStartOnPrimMon ) {
2412     PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2413   }
2414 #endif
2415   load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posZWnd);
2416
2417   if (g_PrefsDlg.m_bZVis)
2418     gtk_widget_show (wnd);
2419
2420   return pZWnd;
2421 }
2422
2423 static const int gutter = 12;
2424
2425 void MainFrame::Create ()
2426 {
2427   GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2428   m_pWidget = window;
2429   gtk_widget_set_events (window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2430   gtk_signal_connect (GTK_OBJECT (window), "delete_event",
2431                       GTK_SIGNAL_FUNC (mainframe_delete), this);
2432   gtk_signal_connect (GTK_OBJECT (window), "destroy",
2433                       GTK_SIGNAL_FUNC (mainframe_destroy), this);
2434   gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
2435                       GTK_SIGNAL_FUNC (mainframe_keypress), this);
2436   gtk_signal_connect (GTK_OBJECT (window), "key_release_event",
2437                       GTK_SIGNAL_FUNC (mainframe_keyrelease), this);
2438   gtk_signal_connect (GTK_OBJECT (window), "map_event",
2439                       GTK_SIGNAL_FUNC (mainframe_map), this);
2440   gtk_signal_connect (GTK_OBJECT (window), "unmap_event",
2441                       GTK_SIGNAL_FUNC (mainframe_unmap), this);
2442
2443   g_qeglobals_gui.d_main_window = window;
2444
2445 #ifdef _WIN32
2446   // calculate gdk offset
2447   int n_win_monitors = 0;
2448
2449   monitorInfo_s monitorInfo;
2450
2451   // detect multiple monitors
2452   EnumDisplayMonitors (NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>(&n_win_monitors));
2453
2454   monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2455   monitorInfo.i_win_mon = 0;
2456   EnumDisplayMonitors (NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>(&monitorInfo));
2457
2458   gdk_offset_x = G_MININT;
2459   gdk_offset_y = G_MININT;
2460
2461   // calculate offset
2462   for( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2463     gdk_offset_x = MAX (gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x);
2464     gdk_offset_y = MAX (gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y);
2465   }
2466
2467   Sys_Printf( "GDK's coordinate system is offset by %d over the x-axis and %d over the y-axis from Windows' coordinate system.\n", gdk_offset_x, gdk_offset_y );
2468
2469   if( g_PrefsDlg.m_bStartOnPrimMon )
2470   {
2471     // get gdk monitors
2472     GdkDisplay *display;
2473     GdkScreen *screen;
2474     gint n_gdk_monitors = 0;
2475     gint i_mon;
2476     GdkRectangle rect;
2477
2478     // detect multiple monitors
2479     display = gdk_display_get_default ();
2480     Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name (display), gdk_display_get_n_screens (display) );
2481
2482     screen = gdk_display_get_screen( display, 1 );
2483     n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2484       
2485     Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2486
2487     for( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2488       memset( &rect, 0, sizeof(rect) );
2489       gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2490       Sys_Printf( "  monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2491
2492       if( i_mon == 0 ) {
2493         memcpy( &primaryMonitorRect, &rect, sizeof(primaryMonitorRect) );
2494       }
2495     }
2496
2497     PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2498   }
2499   else {
2500     primaryMonitorRect.x = primaryMonitorRect.y = 0; 
2501     primaryMonitorRect.width = gdk_screen_width ();
2502     primaryMonitorRect.height = gdk_screen_height (); 
2503   }
2504
2505 #endif
2506
2507   load_window_pos(window, g_PrefsDlg.mWindowInfo.position);
2508
2509   GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
2510   gtk_container_add (GTK_CONTAINER (window), vbox);
2511   gtk_widget_show (vbox);
2512
2513   create_main_menu (window, vbox);
2514   MRU_Load ();
2515   create_main_toolbar (window, vbox);
2516   create_plugin_toolbar (window,vbox);
2517
2518   m_nCurrentStyle = g_PrefsDlg.m_nView;
2519
2520   g_pGroupDlg->Create ();
2521   OnPluginsRefresh();
2522
2523   CreateQEChildren();
2524
2525   gtk_widget_show (window);
2526
2527   // not needed on win32, it's in the .rc
2528 #ifndef _WIN32
2529   {
2530     GdkPixmap *pixmap;
2531     GdkBitmap *mask;
2532     load_pixmap ("icon.bmp", window, &pixmap, &mask);
2533     gdk_window_set_icon (window->window, NULL, pixmap, mask);
2534   }
2535 #endif
2536
2537   if (CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft)
2538   {
2539     {
2540       GtkWidget* vsplit = gtk_vpaned_new ();
2541       m_pSplits[0] = vsplit;
2542       gtk_box_pack_start (GTK_BOX (vbox), vsplit, TRUE, TRUE, 0);
2543       gtk_widget_show (vsplit);
2544
2545       {
2546         GtkWidget* hsplit = gtk_hpaned_new ();
2547         m_pSplits[2] = hsplit;
2548         gtk_paned_add1 (GTK_PANED (vsplit), hsplit);
2549         gtk_widget_show (hsplit);
2550
2551         {
2552           GtkWidget* hsplit2 = gtk_hpaned_new ();
2553           m_pSplits[3] = hsplit2;
2554           gtk_paned_add2 (GTK_PANED (hsplit), hsplit2);
2555           gtk_widget_show (hsplit2);
2556
2557           {
2558             GtkWidget* vsplit2 = gtk_vpaned_new ();
2559             m_pSplits[1] = vsplit2;
2560             if (CurrentStyle() == eRegular)
2561               gtk_paned_add2 (GTK_PANED (hsplit2), vsplit2);
2562             else
2563               gtk_paned_add1 (GTK_PANED (hsplit), vsplit2);
2564             gtk_widget_show (vsplit2);
2565
2566             // camera
2567             m_pCamWnd = new CamWnd ();
2568             {
2569               GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2570               gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2571             }
2572
2573             // xy
2574             m_pXYWnd = new XYWnd ();
2575             m_pXYWnd->SetViewType(XY);
2576             {
2577               GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget ());
2578               gtk_paned_add1 (GTK_PANED (hsplit2), frame);
2579             }
2580
2581             // z
2582             m_pZWnd = new ZWnd ();
2583             {
2584               GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget ());
2585               if (CurrentStyle() == eRegular)
2586                 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2587               else
2588                 gtk_paned_add2 (GTK_PANED (hsplit2), frame);
2589             }
2590
2591             // textures
2592             m_pTexWnd = new TexWnd ();
2593             {
2594               GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2595               gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2596             }
2597
2598             // console
2599             {
2600               GtkWidget* scr = gtk_scrolled_window_new (NULL, NULL);
2601               gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2602               gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
2603               gtk_widget_show (scr);
2604               gtk_paned_pack2 (GTK_PANED (vsplit), scr, FALSE, TRUE);
2605
2606               {
2607                 GtkWidget* text = gtk_text_view_new ();
2608                 gtk_widget_set_size_request(text, 0, -1); // allow shrinking
2609                 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
2610                 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), FALSE);
2611                 gtk_container_add (GTK_CONTAINER (scr), text);
2612                 gtk_widget_show (text);
2613                 g_qeglobals_gui.d_edit = text;
2614               }
2615             }
2616           }
2617         }
2618       }
2619     }
2620
2621     gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nXYHeight+28);
2622
2623     if (CurrentStyle() == eRegular)
2624     {
2625       gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nZWidth);
2626       gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2627     }
2628     else
2629     {
2630       gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nCamWidth);
2631       while (gtk_events_pending ())  gtk_main_iteration ();
2632       gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2633     }
2634
2635     while (gtk_events_pending ())  gtk_main_iteration ();
2636
2637     gtk_paned_set_position (GTK_PANED (m_pSplits[1]), g_PrefsDlg.mWindowInfo.nCamHeight);
2638   }
2639   else if (CurrentStyle() == eFloating)
2640   {
2641     {
2642       GtkWidget* wnd = create_floating (this);
2643       gtk_window_set_title (GTK_WINDOW (wnd), "Camera");
2644
2645 #ifdef _WIN32
2646       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2647         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2648       }
2649 #endif
2650       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posCamWnd);
2651
2652       gtk_widget_show (wnd);
2653
2654       m_pCamWnd = new CamWnd ();
2655
2656       {
2657         GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget ());
2658         gtk_container_add (GTK_CONTAINER (wnd), frame);
2659       }
2660
2661       m_pCamWnd->m_pParent = wnd;
2662     }
2663
2664     if (g_PrefsDlg.m_bFloatingZ)
2665     {
2666       m_pZWnd = create_floating_zwnd(this);
2667
2668       {
2669         GtkWidget* wnd = create_floating (this);
2670         gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2671
2672 #ifdef _WIN32
2673         if( g_PrefsDlg.m_bStartOnPrimMon ) {
2674           PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2675         }
2676 #endif
2677         load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2678
2679         m_pXYWnd = new XYWnd ();
2680         m_pXYWnd->SetViewType(XY);
2681
2682         {
2683           GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2684           gtk_container_add (GTK_CONTAINER (wnd), frame);
2685         }
2686
2687         m_pXYWnd->m_pParent = wnd;
2688
2689         gtk_widget_show (wnd);
2690       }
2691     }
2692     else
2693     {
2694       GtkWidget* wnd = create_floating (this);
2695       gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2696
2697 #ifdef _WIN32
2698       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2699         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2700       }
2701 #endif
2702       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2703
2704       m_pZWnd = new ZWnd ();
2705       m_pZWnd->m_pParent = wnd;
2706
2707       m_pXYWnd = new XYWnd ();
2708       m_pXYWnd->SetViewType(XY);
2709       m_pXYWnd->m_pParent = wnd;
2710
2711
2712       {
2713         GtkWidget* hsplit = gtk_hpaned_new ();
2714         m_pSplits[0] = hsplit;
2715         gtk_container_add (GTK_CONTAINER (wnd), hsplit);
2716         gtk_widget_show (hsplit);
2717
2718         {
2719           GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget());
2720           gtk_paned_add1 (GTK_PANED (hsplit), frame);
2721         }
2722         {
2723           GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2724           gtk_paned_add2 (GTK_PANED (hsplit), frame);
2725         }
2726       }
2727
2728       gtk_widget_show (wnd);
2729
2730       gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nZFloatWidth);
2731     }
2732
2733     {
2734       GtkWidget* wnd = create_floating (this);
2735       gtk_window_set_title (GTK_WINDOW (wnd), "XZ View");
2736
2737 #ifdef _WIN32
2738       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2739         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2740       }
2741 #endif
2742       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXZWnd);
2743
2744       m_pXZWnd = new XYWnd ();
2745       m_pXZWnd->m_pParent = wnd;
2746       m_pXZWnd->SetViewType(XZ);
2747
2748       {
2749         GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2750         gtk_container_add (GTK_CONTAINER (wnd), frame);
2751       }
2752
2753       if (g_PrefsDlg.m_bXZVis)
2754         gtk_widget_show (wnd);
2755     }
2756
2757     {
2758       GtkWidget* wnd = create_floating (this);
2759       gtk_window_set_title (GTK_WINDOW (wnd), "YZ View");
2760
2761 #ifdef _WIN32
2762       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2763         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2764       }
2765 #endif
2766       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posYZWnd);
2767
2768       m_pYZWnd = new XYWnd ();
2769       m_pYZWnd->m_pParent = wnd;
2770       m_pYZWnd->SetViewType(YZ);
2771
2772       {
2773         GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2774         gtk_container_add (GTK_CONTAINER (wnd), frame);
2775       }
2776
2777       if (g_PrefsDlg.m_bYZVis)
2778         gtk_widget_show (wnd);
2779     }
2780
2781     m_pTexWnd = new TexWnd ();
2782     {
2783       GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2784       m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2785
2786       {
2787         GtkWidget* w = gtk_label_new ("Textures");
2788         gtk_widget_show (w);
2789         gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2790       }
2791     }
2792
2793     g_pGroupDlg->Show ();
2794   }
2795   else // 4 way
2796   {
2797     {
2798       GtkWidget* hsplit = gtk_hpaned_new ();
2799       m_pSplits[0] = hsplit;
2800       gtk_box_pack_start (GTK_BOX (vbox), hsplit, TRUE, TRUE, 0);
2801       gtk_widget_show (hsplit);
2802
2803       {
2804         GtkWidget* vsplit1 = gtk_vpaned_new ();
2805         m_pSplits[1] = vsplit1;
2806         gtk_paned_add1 (GTK_PANED (hsplit), vsplit1);
2807         gtk_widget_show (vsplit1);
2808
2809         {
2810           GtkWidget* vsplit2 = gtk_vpaned_new ();
2811           m_pSplits[2] = vsplit2;
2812           gtk_paned_add2 (GTK_PANED (hsplit), vsplit2);
2813           gtk_widget_show (vsplit2);
2814
2815           m_pCamWnd = new CamWnd ();
2816           {
2817             GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2818             gtk_paned_add1 (GTK_PANED (vsplit1), frame);
2819           }
2820
2821           m_pXYWnd = new XYWnd ();
2822           m_pXYWnd->SetViewType(XY);
2823           {
2824             GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2825             gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2826           }
2827
2828           m_pYZWnd = new XYWnd ();
2829           m_pYZWnd->SetViewType(YZ);
2830           {
2831             GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2832             gtk_paned_add2 (GTK_PANED (vsplit1), frame);
2833           }
2834
2835           m_pXZWnd = new XYWnd ();
2836           m_pXZWnd->SetViewType(XZ);
2837           {
2838             GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2839             gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2840           }
2841         }
2842       }
2843     }
2844
2845     //    g_qeglobals_gui.d_edit = NULL;
2846
2847     {
2848       m_pTexWnd = new TexWnd ();
2849       GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2850
2851       {
2852         GtkWidget* w = gtk_label_new ("Textures");
2853         gtk_widget_show (w);
2854         gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2855       }
2856     }
2857
2858     m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2859 //    gtk_widget_realize (m_pTexWnd->GetWidget ());
2860     m_pZWnd = create_floating_zwnd(this);
2861
2862     while (gtk_events_pending ())
2863       gtk_main_iteration ();
2864
2865     {
2866       int x = GTK_PANED (m_pSplits[0])->max_position/2 - gutter;
2867       gtk_paned_set_position (GTK_PANED (m_pSplits[0]), x);
2868     }
2869
2870     {
2871       int y = GTK_PANED (m_pSplits[1])->max_position/2 - gutter;
2872       gtk_paned_set_position (GTK_PANED (m_pSplits[1]), y);
2873       gtk_paned_set_position (GTK_PANED (m_pSplits[2]), y);
2874     }
2875   }
2876
2877   if(g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED)
2878     gtk_window_maximize(GTK_WINDOW(window));
2879
2880   gtk_widget_show (window);
2881
2882   Texture_Init();
2883
2884   if (m_pXYWnd) // this is always true?
2885   {
2886     m_pXYWnd->SetActive(true);
2887   }
2888   m_bSplittersOK = true;
2889   Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu);
2890
2891   g_pParentWnd->OnEntitiesSetViewAs(0);
2892
2893 //  m_wndTextureBar.Create (vbox);
2894   create_main_statusbar (window, vbox);
2895
2896   LoadCommandMap();
2897   ShowMenuItemKeyBindings(window);
2898
2899   if (g_qeglobals_gui.d_edit != NULL)
2900     console_construct(g_qeglobals_gui.d_edit);
2901
2902   //  bool load_last = FALSE;
2903
2904   SetGridStatus();
2905   SetButtonMenuStates();
2906
2907   // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2908   GtkWidget *item;
2909   g_bIgnoreCommands++;
2910   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
2911   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
2912   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaderlistonly"));
2913   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
2914   g_bIgnoreCommands--;
2915
2916 //  if (g_PrefsDlg.m_bTextureBar)
2917 //    gtk_widget_show (m_wndTextureBar.m_pWidget);
2918
2919   SetActiveXY(m_pXYWnd);
2920
2921   s_idle_id = gtk_timeout_add (25, mainframe_idle, this);  
2922
2923   QGL_InitExtensions ();
2924
2925   if (g_PrefsDlg.mLocalPrefs.mbEmpty)
2926   {
2927     g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2928     g_PrefsDlg.SavePrefs();
2929   }
2930
2931   // remove the pid file
2932   remove (g_pidGameFile.GetBuffer ());  
2933
2934   Sys_Printf ("Entering message loop\n");
2935
2936   m_bDoLoop = true;
2937
2938   m_nTimer = gtk_timeout_add (1000, timer, this);
2939 }
2940
2941 // =============================================================================
2942 // MainFrame class
2943
2944 MainFrame::MainFrame()
2945 {
2946   m_bDoLoop = false;
2947   m_bSplittersOK = false;
2948   g_pParentWnd = this;
2949   m_pXYWnd = (XYWnd*)NULL;
2950   m_pCamWnd = NULL;
2951   m_pTexWnd = (TexWnd*)NULL;
2952   m_pZWnd = (ZWnd*)NULL;
2953   m_pYZWnd = (XYWnd*)NULL;
2954   m_pXZWnd = (XYWnd*)NULL;
2955   m_pActiveXY = (XYWnd*)NULL;
2956   m_bCamPreview = true;
2957   m_pWatchBSP = NULL;
2958   for (int n = 0; n < 6; n++)
2959     m_pStatusLabel[n] = NULL;
2960   m_bNeedStatusUpdate = false;
2961   m_nTimer = 0;
2962   m_bSleeping = false;
2963   Create ();
2964 }
2965
2966 MainFrame::~MainFrame()
2967 {
2968   while (g_BSPFrontendCommands)
2969   {
2970     free (g_BSPFrontendCommands->data);
2971     g_BSPFrontendCommands = g_slist_remove (g_BSPFrontendCommands, g_BSPFrontendCommands->data);
2972   }
2973 }
2974
2975 void MainFrame::ReleaseContexts ()
2976 {
2977   if (m_pXYWnd)
2978     m_pXYWnd->DestroyContext ();
2979   if (m_pYZWnd)
2980     m_pYZWnd->DestroyContext ();
2981   if (m_pXZWnd)
2982     m_pXZWnd->DestroyContext ();
2983   if (m_pCamWnd)
2984     m_pCamWnd->DestroyContext ();
2985   if (m_pTexWnd)
2986     m_pTexWnd->DestroyContext ();
2987   if (m_pZWnd)
2988     m_pZWnd->DestroyContext ();
2989 }
2990
2991 void MainFrame::CreateContexts ()
2992 {
2993   if (m_pCamWnd)
2994     m_pCamWnd->CreateContext ();
2995   if (m_pXYWnd)
2996     m_pXYWnd->CreateContext ();
2997   if (m_pYZWnd)
2998     m_pYZWnd->CreateContext ();
2999   if (m_pXZWnd)
3000     m_pXZWnd->CreateContext ();
3001   if (m_pTexWnd)
3002     m_pTexWnd->CreateContext ();
3003   if (m_pZWnd)
3004     m_pZWnd->CreateContext ();
3005 }
3006
3007 static void Sys_Iconify (GtkWidget *w)
3008 {
3009   // we might not have been realized yet
3010   if (w->window == NULL)
3011     return;
3012
3013   if (!GTK_WIDGET_MAPPED (w))
3014     return;
3015
3016 #if defined (__linux__) || defined (__APPLE__)
3017   Sys_FPrintf(SYS_WRN, "FIXME: Sys_Iconify\n");  
3018 #if 0  
3019   XWindowAttributes xattr;
3020   GdkWindowPrivate *Private;
3021
3022   Private = (GdkWindowPrivate*)w->window;
3023   g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (0));
3024
3025   if (!Private->destroyed)
3026   {
3027     xattr.map_state = IsUnmapped;
3028     XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3029
3030     if (xattr.map_state != IsUnmapped)
3031       g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (1));
3032
3033     XIconifyWindow (Private->xdisplay, Private->xwindow, 0);
3034   }
3035 #endif
3036 #endif
3037
3038 #ifdef _WIN32
3039   ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_MINIMIZE);
3040 #endif
3041 }
3042
3043 static void Sys_Restore (GtkWidget *w)
3044 {
3045   // we might not have been realized yet
3046   if (w->window == NULL)
3047     return;
3048
3049   if (!GTK_WIDGET_VISIBLE (w))
3050     return;
3051
3052 #if defined (__linux__) || defined (__APPLE__)
3053   Sys_FPrintf(SYS_WRN, "FIXME: Sys_Restore\n");
3054   #if 0
3055   XWindowAttributes xattr;
3056   GdkWindowPrivate *Private;
3057
3058   Private = (GdkWindowPrivate*)w->window;
3059
3060   xattr.map_state = IsUnmapped;
3061   XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3062
3063   if (xattr.map_state == IsUnmapped)
3064     XMapRaised (Private->xdisplay, Private->xwindow);
3065   #endif
3066 #endif
3067
3068 #ifdef _WIN32
3069   ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_RESTORE);
3070 #endif
3071 }
3072
3073 #ifdef _DEBUG
3074 //#define DBG_SLEEP
3075 #endif
3076
3077 void RefreshModelSkin (GSList **pModels, entitymodel_t *model)
3078 {
3079   //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3080   // so we avoid the fucked up ones, assuming they are at the end
3081   if (!model->strSkin)
3082   {
3083 #ifdef DBG_SLEEP
3084     Sys_Printf("Dropping model %p with empty skin in RefreshModelSkin\n", model);
3085 #endif
3086
3087     // and also keeping it so we have an actual count of empty models
3088     g_slist_append (*pModels, model);
3089     return;
3090   }
3091   // do we have this model already?
3092   if (g_slist_find (*pModels, model))
3093   {
3094 #ifdef DBG_SLEEP
3095
3096     // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3097     Sys_Printf("Already processed model: %p %s\n", model, ((GString *)model->strSkin)->str);
3098 #endif
3099     return;
3100   }
3101   model->nTextureBind = Texture_LoadSkin(((GString *)model->strSkin)->str, &model->nSkinWidth, &model->nSkinHeight );
3102   if (model->nTextureBind != -1)
3103     Sys_Printf("LOADED SKIN: %s\n", ((GString *)model->strSkin)->str );
3104   else
3105     Sys_Printf("Load skin failed: %s\n", ((GString *)model->strSkin)->str );
3106   *pModels = g_slist_append (*pModels, model);
3107 #ifdef DBG_SLEEP
3108   Sys_Printf("Processed model %p %s\n", model, ((GString *)model->strSkin)->str);
3109 #endif
3110 }
3111
3112 void MainFrame::OnSleep()
3113 {
3114   m_bSleeping ^= 1;
3115   if (m_bSleeping)
3116   {
3117     // useful when trying to debug crashes in the sleep code
3118     Sys_Printf("Going into sleep mode..\n");
3119
3120     Sys_Printf("Dispatching sleep msg...");
3121     DispatchRadiantMsg (RADIANT_SLEEP);
3122     Sys_Printf("Done.\n");
3123
3124     if (CurrentStyle() == eSplit)
3125       Sys_Iconify (m_pZWnd->m_pParent);
3126
3127     Sys_Iconify (m_pWidget);  
3128     Select_Deselect();
3129     QERApp_FreeShaders ();
3130     g_bScreenUpdates = false;
3131
3132     // release contexts
3133     Sys_Printf("Releasing contexts...");
3134     ReleaseContexts();
3135     Sys_Printf("Done.\n");
3136
3137     // free all the skins in the caches
3138     // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3139     g_lstSkinCache.RemoveAll();
3140   } else
3141   {
3142     Sys_Printf("Waking up\n");
3143     if (CurrentStyle() == eSplit)
3144       Sys_Restore (m_pZWnd->m_pParent);
3145
3146     Sys_Restore (m_pWidget);
3147
3148     // create contexts
3149     Sys_Printf("Creating contexts...");
3150     CreateContexts();
3151     Sys_Printf("Done.\n");
3152
3153     Sys_Printf("Making current on camera...");
3154     m_pCamWnd->MakeCurrent ();
3155     Sys_Printf("Done.\n");
3156
3157     Sys_Printf("Reloading shaders...");
3158     // reload the shader scripts and textures
3159     QERApp_ReloadShaders ();
3160     // current shader
3161     // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3162     Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
3163     Sys_Printf("Done.\n");
3164
3165     // rebuild the patches by setting the bDirty flag on them
3166     for (brush_t* b=active_brushes.next ; b != &active_brushes ; b=b->next)
3167     {
3168       if (b->patchBrush)
3169         b->pPatch->bDirty = true;
3170     }
3171
3172     Sys_Printf("Reloading skins...");
3173     // we have purged all the skins before going to sleep
3174     // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3175     // namely, all entitymodel_t
3176     // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3177     // (a single eclass_t can reference several entitymodel_t)
3178     // FIXME: and what's up with md3Class then? what is it used for?
3179 /*
3180     eclass_t *e;
3181     entity_t *ent;
3182     GSList *Models = NULL;
3183     for (ent = entities.next; ent != &entities; ent = ent->next)
3184     {
3185       // if it's a model with skin then the fixedsize flag must be on
3186       // only if there IS a model .. we are not trying to load
3187       if (ent->eclass->fixedsize)
3188       {
3189         if (ent->eclass->model)
3190         {
3191 #ifdef DBG_SLEEP
3192           if (ent->md3Class)
3193             Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3194 #endif
3195           entitymodel_t *model;
3196           for (model = ent->eclass->model; model; model=model->pNext)
3197             RefreshModelSkin (&Models, model);
3198         } else if (ent->md3Class)
3199         {
3200           entitymodel_t *model;
3201           for (model = ent->md3Class->model; model; model=model->pNext)
3202             RefreshModelSkin (&Models, model);
3203         }
3204 #ifdef DBG_SLEEP
3205         else
3206           Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3207 #endif
3208       }
3209     }
3210 #ifdef DBG_SLEEP
3211     for (e = g_md3Cache; e ; e = e->next)
3212     {
3213       entitymodel_t *model;
3214       for (model = e->model; model; model=model->pNext)
3215         if (!g_slist_find (Models, model))
3216         {
3217           Sys_Printf("model %p ", model);
3218           if (model->strSkin)
3219             Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3220           else
3221             Sys_Printf("not found in main loop (no skin)\n");
3222         }
3223     }
3224 #endif
3225     // clean the model list
3226     g_slist_free (Models);
3227 */
3228     Sys_Printf("Done.\n");
3229
3230     // bring back the GL font
3231     gtk_glwidget_create_font (m_pCamWnd->GetWidget ());
3232
3233     g_bScreenUpdates = true;
3234
3235     Sys_Printf("Dispatching wake msg...");
3236     DispatchRadiantMsg (RADIANT_WAKEUP);
3237     Sys_Printf("Done\n");
3238   }
3239 }
3240
3241 void WINAPI QERApp_Sleep()
3242 {
3243   g_pParentWnd->OnSleep();
3244 }
3245
3246 /*!
3247 NOTE TTimo
3248 the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3249 and not in OnDestroy because the info may be lost already?
3250 \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3251 */
3252 void MainFrame::OnDelete ()
3253 {
3254   save_window_pos(m_pWidget, g_PrefsDlg.mWindowInfo.position);
3255
3256   // surface inspector and patch inspector
3257   save_window_pos (g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd);
3258   save_window_pos (g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd);
3259
3260   // entity inspector / group dialog
3261   // NOTE TTimo do we have to save a different window depending on the view mode?
3262   save_window_pos (g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd);
3263
3264   if (g_PrefsDlg.m_bFloatingZ)
3265     save_window_pos (m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd);
3266   else
3267     g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED (m_pSplits[0])->child1_size;
3268
3269   if (CurrentStyle() == eFloating)
3270   {
3271     save_window_pos (m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd);
3272     save_window_pos (m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd);
3273     save_window_pos (m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd);
3274     save_window_pos (m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd);
3275   }
3276
3277   g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state(g_pParentWnd->m_pWidget->window);
3278 }
3279
3280 void MainFrame::OnDestroy ()
3281 {
3282   // shut down console output first
3283   // (we'll still get the info if we are running a log file anyway)
3284   g_qeglobals_gui.d_edit = NULL;
3285
3286 #ifdef _DEBUG
3287   Sys_Printf("MainFrame::OnDestroy\n");
3288 #endif
3289   if (s_idle_id)
3290     gtk_timeout_remove (s_idle_id);
3291   if (m_nTimer)
3292     gtk_timeout_remove (m_nTimer);
3293
3294   if (!g_qeglobals.disable_ini)
3295   {
3296     Sys_Printf("Start writing prefs\n");
3297     Sys_Printf("MRU_Save... ");
3298     MRU_Save ();
3299     Sys_Printf("OK\n");
3300
3301     gpointer w;
3302
3303     w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split1");
3304     g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED (w)->child1_size;
3305     w = g_object_get_data (G_OBJECT (g_pGroupDlg->m_pWidget), "split2");
3306     g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED (w)->child1_size;
3307
3308     if (!FloatingGroupDialog())
3309     {
3310       GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3311
3312       vsplit = m_pSplits[0];
3313       vsplit2 = m_pSplits[1];
3314       hsplit = m_pSplits[2];
3315       hsplit2 = m_pSplits[3];
3316
3317       g_PrefsDlg.mWindowInfo.nXYHeight  = GTK_PANED (vsplit)->child1_size;
3318       g_PrefsDlg.mWindowInfo.nXYWidth   = GTK_PANED (hsplit2)->child1_size;
3319
3320       if(CurrentStyle() == eRegular)
3321         g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED (hsplit)->child1_size;
3322       else
3323         g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED (hsplit)->child1_size;
3324
3325       g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED (vsplit2)->child1_size;
3326     } else
3327     {
3328       if (g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit)
3329       {
3330         if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
3331           g_PrefsDlg.m_bZVis = TRUE;
3332         else
3333           g_PrefsDlg.m_bZVis = FALSE;
3334       }
3335     }
3336     g_PrefsDlg.SavePrefs();
3337     Sys_Printf("Done prefs\n");
3338   }
3339
3340   // spog - this may be better in another place..
3341   // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3342   g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
3343
3344   delete m_pXYWnd; m_pXYWnd = NULL;
3345   delete m_pYZWnd; m_pYZWnd = NULL;
3346   delete m_pXZWnd; m_pXZWnd = NULL;
3347   delete m_pZWnd; m_pZWnd = NULL;
3348   delete m_pTexWnd; m_pTexWnd = NULL;
3349   delete m_pCamWnd; m_pCamWnd = NULL;
3350
3351   if (g_pGroupDlg->m_pWidget)
3352   {
3353     //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3354     gtk_widget_destroy (g_pGroupDlg->m_pWidget);
3355     g_pGroupDlg->m_pWidget = NULL;
3356   }
3357
3358   if (strcmpi(currentmap, "unnamed.map") != 0)
3359   {
3360     g_PrefsDlg.m_strLastMap = currentmap;
3361     g_PrefsDlg.SavePrefs ();
3362   }
3363   Sys_Printf("CleanUpEntities...");
3364   CleanUpEntities();
3365   Sys_Printf("Done.\n");
3366
3367   Sys_Printf("Releasing brushes...");
3368   while (active_brushes.next != &active_brushes)
3369     Brush_Free (active_brushes.next, false);
3370   while (selected_brushes.next != &selected_brushes)
3371     Brush_Free (selected_brushes.next, false);
3372   while (filtered_brushes.next != &filtered_brushes)
3373     Brush_Free (filtered_brushes.next, false);
3374   Sys_Printf("Done.\n");
3375
3376   Sys_Printf("Releasing entities...");
3377   while (entities.next != &entities)
3378     Entity_Free (entities.next);
3379   Sys_Printf("Done.\n");
3380
3381   epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3382   while (pEPair)
3383   {
3384     epair_t* pNextEPair = pEPair->next;
3385     free (pEPair->key);
3386     free (pEPair->value);
3387     free (pEPair);
3388     pEPair = pNextEPair;
3389   }
3390
3391   entity_t* pEntity = g_qeglobals.d_project_entity->next;
3392   while (pEntity != NULL && pEntity != g_qeglobals.d_project_entity)
3393   {
3394     entity_t* pNextEntity = pEntity->next;
3395     Entity_Free(pEntity);
3396     pEntity = pNextEntity;
3397   }
3398
3399   Sys_Printf("Freeing world entity...");
3400   if (world_entity)
3401     Entity_Free(world_entity);
3402   Sys_Printf("Done.\n");
3403
3404   Sys_Printf("Shutdown VFS...");
3405   vfsShutdown ();
3406   Sys_Printf("Done.\n");
3407
3408   Sys_Printf("FreeShaders...");
3409   QERApp_FreeShaders();
3410   Sys_Printf("Done.\n");
3411 }
3412
3413 // TTimo: now using profile.cpp code
3414 void MainFrame::LoadCommandMap()
3415 {
3416   FILE *f;
3417   CString strINI;
3418   bool bUserCmdList = false;
3419   int nLen;
3420   // verbose a little: count of user commands we recognized
3421   int iCount = 0;
3422   int iOverrideCount = 0;
3423   int j;
3424
3425
3426 #if defined (__linux__) || defined (__APPLE__)
3427   strINI = g_PrefsDlg.m_rc_path->str;
3428 #elif defined(WIN32)
3429   strINI = g_strGameToolsPath;
3430 #else
3431 #error "WTF are you compiling this on"
3432 #endif
3433   AddSlash (strINI);
3434   strINI += "shortcuts.ini";
3435
3436   f = fopen (strINI.GetBuffer(), "r");
3437   if (f != NULL)
3438   {
3439     fclose(f);
3440     // loop through all the commands
3441     for (int i = 0; i < g_nCommandCount; i++)
3442     {
3443       char value[1024];
3444       if (read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ))
3445       {
3446         if (!bUserCmdList)
3447         {
3448           Sys_Printf("Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3449           bUserCmdList = true;
3450         }
3451         CString strBuff;
3452         strBuff = value;
3453         strBuff.TrimLeft();
3454         strBuff.TrimRight();
3455         strBuff.MakeLower();
3456         int nSpecial = strBuff.Find("+alt");
3457         g_Commands[i].m_nModifiers = 0;
3458         if (nSpecial >= 0)
3459         {
3460           g_Commands[i].m_nModifiers |= RAD_ALT;
3461           FindReplace(strBuff, "+alt", "");
3462         }
3463         nSpecial = strBuff.Find("+ctrl");
3464         if (nSpecial >= 0)
3465         {
3466           g_Commands[i].m_nModifiers |= RAD_CONTROL;
3467           FindReplace(strBuff, "+ctrl", "");
3468         }
3469         nSpecial = strBuff.Find("+shift");
3470         if (nSpecial >= 0)
3471         {
3472           g_Commands[i].m_nModifiers |= RAD_SHIFT;
3473           FindReplace(strBuff, "+shift", "");
3474         }
3475         strBuff.TrimLeft();
3476         strBuff.TrimRight();
3477         strBuff.MakeUpper();
3478         // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3479         // based on length
3480         nLen = strBuff.GetLength();
3481         if (nLen == 1) // most often case.. deal with first
3482         {
3483           g_Commands[i].m_nKey = __toascii(strBuff.GetAt(0));
3484           iCount++;
3485         } else // special key
3486         {
3487           for (j = 0; j < g_nKeyCount; j++)
3488           {
3489             if (strBuff.CompareNoCase(g_Keys[j].m_strName) == 0)
3490             {
3491               g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3492               iCount++;
3493               break;
3494             }
3495           }
3496           if (j == g_nKeyCount)
3497           {
3498             Sys_Printf("WARNING: failed to parse user command %s\n", value);
3499             continue;
3500           }
3501         }
3502         // maybe this new shortcut is overriding another one
3503         // then we need to disable the other binded key
3504         for (j = 0; j < g_nCommandCount; j++)
3505         {
3506           if (j == i)
3507             continue;
3508           if (g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers)
3509           {
3510             // found!
3511             g_Commands[j].m_nKey = 0;
3512             // verbose
3513             iOverrideCount++;
3514             // it's the only one
3515             break;
3516           }
3517         }
3518       }
3519     }
3520     if (iOverrideCount)
3521       Sys_Printf("User's command list overrides %d default commands\n", iOverrideCount);
3522     Sys_Printf("Parsed %d custom shortcuts\n", iCount );
3523   }
3524   else
3525     Sys_Printf("Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer());
3526 }
3527
3528 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3529 // we also output the count of commands that are not binded .. dunno if it's much use ..
3530 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3531 void MainFrame::ShowMenuItemKeyBindings(GtkWidget* window)
3532 {
3533   //!\todo Find a better way to get the global accelerator group..
3534   GtkAccelGroup *accel = GTK_ACCEL_GROUP(gtk_accel_groups_from_object(G_OBJECT(window))->data);
3535   gpointer item;
3536   guint mods;
3537   int i;
3538   int iCount = 0;
3539
3540   for (i = 0; i < g_nCommandCount; i++)
3541   {
3542     if (g_Commands[i].m_nKey == 0)
3543     {
3544       iCount++;
3545       continue;
3546     }
3547
3548     item = g_object_get_data (G_OBJECT (m_pWidget), g_Commands[i].m_strMenu);
3549     if (item == NULL)
3550     {
3551       Sys_FPrintf (SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3552                    g_Commands[i].m_strCommand);
3553       continue;
3554     }
3555
3556     mods = 0;
3557     if (g_Commands[i].m_nModifiers)     // are there modifiers present?
3558     {
3559       if (g_Commands[i].m_nModifiers & RAD_SHIFT)
3560         mods |= GDK_SHIFT_MASK;
3561       if (g_Commands[i].m_nModifiers & RAD_ALT)
3562         mods |= GDK_MOD1_MASK;
3563       if (g_Commands[i].m_nModifiers & RAD_CONTROL)
3564         mods |= GDK_CONTROL_MASK;
3565     }
3566
3567     // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3568     if (gtk_accelerator_valid (g_Commands[i].m_nKey, (GdkModifierType)mods))
3569     {
3570 #ifdef DBG_KBD
3571       // NOTE TTimo this is the important place where all the shortcuts are binded
3572       Sys_Printf("Calling gtk_widget_add_accelerator on command: %s menu: %s key: %d mods: %d\n", g_Commands[i].m_strCommand, g_Commands[i].m_strMenu, g_Commands[i].m_nKey, mods);
3573 #endif
3574       gtk_widget_add_accelerator (GTK_WIDGET (item), "activate", accel, g_Commands[i].m_nKey,
3575                                   (GdkModifierType)mods, GTK_ACCEL_VISIBLE);
3576     } else
3577     {
3578       GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (GTK_BIN (item)->child);
3579       GString *gstring;
3580       gboolean had_mod;
3581
3582       g_free (accel_label->accel_string);
3583       accel_label->accel_string = NULL;
3584
3585       gstring = g_string_new (accel_label->accel_string);
3586       g_string_append (gstring, "   ");
3587
3588       had_mod = FALSE;
3589       if (mods & GDK_SHIFT_MASK)
3590       {
3591         g_string_append (gstring, "Shft");
3592         had_mod = TRUE;
3593       }
3594       if (mods & GDK_CONTROL_MASK)
3595       {
3596         if (had_mod)
3597           g_string_append (gstring, "+");
3598         g_string_append (gstring, "Ctl");
3599         had_mod = TRUE;
3600       }
3601       if (mods & GDK_MOD1_MASK)
3602       {
3603         if (had_mod)
3604           g_string_append (gstring, "+");
3605         g_string_append (gstring, "Alt");
3606         had_mod = TRUE;
3607       }
3608
3609       if (had_mod)
3610         g_string_append (gstring, "+");
3611       if (g_Commands[i].m_nKey < 0x80 || (g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff))
3612       {
3613         switch (g_Commands[i].m_nKey)
3614         {
3615         case ' ':
3616           g_string_append (gstring, "Space");
3617           break;
3618         case '\\':
3619           g_string_append (gstring, "Backslash");
3620           break;
3621         default:
3622           g_string_append_c (gstring, toupper (g_Commands[i].m_nKey));
3623           break;
3624         }
3625       } else
3626       {
3627         gchar *tmp;
3628
3629         tmp = gtk_accelerator_name (g_Commands[i].m_nKey, (GdkModifierType)0);
3630         if (tmp[0] != 0 && tmp[1] == 0)
3631           tmp[0] = toupper (tmp[0]);
3632         g_string_append (gstring, tmp);
3633         g_free (tmp);
3634       }
3635
3636       g_free (accel_label->accel_string);
3637       accel_label->accel_string = gstring->str;
3638       g_string_free (gstring, FALSE);
3639
3640       if (!accel_label->accel_string)
3641         accel_label->accel_string = g_strdup ("");
3642
3643       gtk_widget_queue_resize (GTK_WIDGET (accel_label));
3644     }
3645   }
3646
3647   if (iCount)
3648     Sys_Printf("%d commands not bound to a key\n", iCount);
3649 }
3650
3651 void MainFrame::CreateQEChildren()
3652 {
3653   // load the project file
3654   if (g_argc > 1)
3655   {
3656     Sys_Printf("loading project file from the command line: %s\n", g_argv[1]);
3657     if (!QE_LoadProject(g_argv[1]))
3658       Error("Unable to load project file %s\n", g_argv[1]);
3659   }
3660   else
3661   {
3662     const char* filename = NULL;
3663     char buf[PATH_MAX];
3664     const char *r;
3665     bool bTriedTemplate = false;
3666     
3667     if (g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION) {
3668       // we need to regenerate from template
3669       Sys_Printf("last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION);
3670       g_PrefsDlg.m_strLastProject = "";
3671     }
3672     
3673     r = g_PrefsDlg.m_strLastProject.GetBuffer();    
3674     
3675     while(r == NULL || *r == '\0' || access(r, R_OK) != 0 || !QE_LoadProject(r))
3676     {
3677       if(!bTriedTemplate)
3678       {
3679         // try default project location
3680         bTriedTemplate = true;
3681         // for all OSes, we look for the template in the base installation (no homepath here)
3682         strcpy(buf, g_pGameDescription->mEnginePath.GetBuffer());
3683         strcat(buf, g_pGameDescription->mBaseGame.GetBuffer());
3684         strcat(buf, "/scripts/");
3685         strcat(buf, PROJECT_TEMPLATE_NAME);
3686         r = buf;
3687       }
3688       else
3689       {
3690         gtk_MessageBox (NULL, "Failed to load project file.\nPlease enter a valid project file.", "Load Project");
3691
3692         filename = file_dialog (m_pWidget, TRUE, "Choose Project File", buf, "project");
3693         if (filename != NULL)
3694           r = filename;
3695         else
3696           Error("Cannot continue without loading a project...");
3697       }
3698     }
3699   }
3700
3701   QE_Init ();
3702 }
3703
3704 void MainFrame::OnTimer() 
3705 {
3706   GdkModifierType mask;
3707
3708   gdk_window_get_pointer (NULL, NULL, NULL, &mask);
3709
3710   if ((mask & (GDK_BUTTON1_MASK|GDK_BUTTON2_MASK|GDK_BUTTON3_MASK)) == 0)
3711   {
3712     QE_CountBrushesAndUpdateStatusBar();
3713     QE_CheckAutoSave();
3714   }
3715
3716   // see MainFrame::UpdateStatusText below
3717   if (m_bNeedStatusUpdate)
3718   {
3719     for (int n = 0; n < 6; n++)
3720     {
3721       if (m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL)
3722         gtk_label_set_text (GTK_LABEL (m_pStatusLabel[n]), m_strStatus[n]);
3723     }
3724     m_bNeedStatusUpdate = false;
3725   }
3726 }
3727
3728 void MainFrame::UpdateStatusText()
3729 {
3730   m_bNeedStatusUpdate = true;
3731 }
3732
3733 void MainFrame::SetStatusText(int nPane, const char* pText)
3734 {
3735   if (pText && nPane <= 5 && nPane >= 0)
3736   {
3737     m_strStatus[nPane] = pText;
3738     UpdateStatusText();
3739   }
3740 }
3741 void MainFrame::SetButtonMenuStates()
3742 {
3743   GtkWidget *item;
3744   g_bIgnoreCommands++;
3745
3746   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
3747   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_angles);
3748   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
3749   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_names);
3750   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
3751   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_coordinates);
3752   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
3753   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_outline);
3754   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
3755   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
3756   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
3757   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.d_savedinfo.show_axis);
3758   //item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3759   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3760                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) ? FALSE : TRUE);
3761   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3762   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3763                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3764   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3765   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3766                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);  
3767   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
3768   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3769                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD) != 0);
3770   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
3771   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3772                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT) != 0);
3773   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
3774   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3775                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS) != 0);
3776   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
3777   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3778                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT) != 0);
3779   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
3780   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3781                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS) != 0);
3782   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
3783   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3784                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK) != 0);
3785   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
3786   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3787                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP) != 0);
3788   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
3789   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3790                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP) != 0);    
3791   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
3792   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3793                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL) != 0);
3794   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
3795   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3796                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) != 0);
3797   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
3798   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3799                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS) != 0);
3800   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
3801   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3802                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID) != 0);
3803   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
3804   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3805                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS) != 0);
3806   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
3807   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3808                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES) != 0);
3809   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
3810   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3811                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS) != 0);
3812   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
3813   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3814                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS) != 0);
3815   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
3816   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3817                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS) != 0);
3818   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
3819   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
3820                                   (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS) != 0);
3821   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
3822   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bTextureLock) ? TRUE : FALSE);
3823   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
3824   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bRotateLock) ? TRUE : FALSE);
3825   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
3826   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3827   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
3828   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_PrefsDlg.m_bGLLighting) ? TRUE : FALSE);
3829   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
3830   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (!g_PrefsDlg.m_bNoClamp) ? TRUE : FALSE);
3831
3832   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
3833   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
3834   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
3835   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
3836
3837   if (!g_pGameDescription->mNoPatch)
3838   {
3839     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
3840     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
3841
3842     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
3843     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
3844     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
3845     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
3846     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
3847     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
3848   }
3849
3850   int id, n = g_PrefsDlg.m_nTextureScale;
3851   switch (n)
3852   {
3853   case 10 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3854   case 25 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3855   case 50 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3856   case 200 : id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3857   default : id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3858   }
3859   SetTextureScale (id);
3860
3861   // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3862 /*
3863   if (g_qeglobals.d_project_entity)
3864   {
3865     FillTextureMenu();      // redundant but i'll clean it up later.. yeah right.. 
3866     FillBSPMenu();
3867   }
3868   */
3869   g_bIgnoreCommands--;
3870 }
3871
3872 void MainFrame::UpdateWindows(int nBits)
3873 {
3874   if (!g_bScreenUpdates)
3875     return;
3876 #ifdef DBG_WINDOWPOS
3877   static int bean_count = 0;
3878   char bean_buf[100];
3879   sprintf(bean_buf,"UpdateWindows %d",bean_count);
3880   CheckWatchit(bean_buf);
3881   bean_count++;
3882 #endif
3883
3884   if (nBits & (W_XY | W_XY_OVERLAY))
3885   {
3886     if (m_pXYWnd)
3887       m_pXYWnd->RedrawWindow ();
3888     if (m_pXZWnd)
3889       m_pXZWnd->RedrawWindow ();
3890     if (m_pYZWnd)
3891       m_pYZWnd->RedrawWindow ();
3892   }
3893
3894   if (nBits & W_CAMERA || ((nBits & W_CAMERA_IFON) && m_bCamPreview))
3895   {
3896     if (m_pCamWnd)
3897       m_pCamWnd->RedrawWindow ();
3898   }
3899
3900   if (nBits & (W_Z | W_Z_OVERLAY))
3901   {
3902     if (m_pZWnd)
3903       m_pZWnd->RedrawWindow ();
3904   }
3905
3906   if (nBits & W_TEXTURE)
3907   {
3908     if (m_pTexWnd)
3909       m_pTexWnd->RedrawWindow ();
3910   }
3911 #ifdef DBG_WINDOWPOS
3912   sprintf(bean_buf,"%d (end UpdateWidows)",bean_count);
3913   CheckWatchit(bean_buf);
3914 #endif
3915 }
3916
3917 void MainFrame::RoutineProcessing()
3918 {
3919 #ifdef DBG_WINDOWPOS
3920   static int bean_count = 0;
3921   char bean_buf[100];
3922   sprintf(bean_buf,"RoutineProcessing %d",bean_count);
3923   CheckWatchit(bean_buf);
3924   bean_count++;
3925 #endif
3926
3927   if (m_bDoLoop)
3928   {
3929     double time = 0.0;
3930     double oldtime = 0.0;
3931     double delta= 0.0;
3932
3933 /*    // checking KeyState works right
3934     static short a1,a2;
3935     a2 = GetKeyState(VK_MENU);
3936     if (a1!=a2)
3937     {
3938       Sys_Printf("VK_MENU: %d\n",a2);
3939       a1 = a2;
3940     }
3941     static short b1,b2;
3942     b2 = GetKeyState(VK_UP);
3943     if (b1!=b2)
3944     {
3945       Sys_Printf("VK_UP: %d\n",b2);
3946       b1 = b2;
3947     } */
3948
3949     time = Sys_DoubleTime ();
3950     delta = time - oldtime;
3951     oldtime = time;
3952     if (delta > 0.2)
3953       delta = 0.2;
3954
3955     // update the BSP process watcher
3956     if (m_pWatchBSP)
3957       m_pWatchBSP->RoutineProcessing();
3958
3959     // run time dependant behavior
3960     if (m_pCamWnd)
3961       m_pCamWnd->Cam_MouseControl(delta);
3962
3963     if (g_nUpdateBits)
3964     {
3965       int nBits = g_nUpdateBits;      // this is done to keep this routine from being
3966       g_nUpdateBits = 0;              // re-entered due to the paint process.. only
3967       UpdateWindows(nBits);           // happens in rare cases but causes a stack overflow
3968     }
3969 /*
3970     // Enable/disable the menu items
3971     GtkWidget *item;
3972
3973     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3974     gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3975     if (!g_PrefsDlg.m_bWideToolbar)
3976     {
3977       item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3978       gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3979     }
3980     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3981     gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3982     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3983     gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3984     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3985     gtk_widget_set_sensitive (item, region_active);
3986     g_bIgnoreCommands++;
3987     // update the toolbar before displaying the menu:
3988     // show in use check box
3989     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3990     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3991     // show all check box
3992     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3993     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3994     g_bIgnoreCommands--;
3995     */
3996   }
3997 #ifdef DBG_WINDOWPOS
3998   sprintf(bean_buf,"%d (end RoutineProcessing)",bean_count);
3999   CheckWatchit(bean_buf);
4000 #endif
4001 }
4002
4003 void MainFrame::DoWatchBSP()
4004 {
4005   // network monitoring of the BSP process
4006   if (!m_pWatchBSP)
4007     m_pWatchBSP = new CWatchBSP();
4008 }
4009
4010 void MainFrame::CleanPlugInMenu()
4011 {
4012   GtkWidget *menu, *sep;
4013   GList *lst;
4014
4015   // delete everything after the separator
4016   menu = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin"));
4017   sep = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin_separator"));
4018   m_nNextPlugInID = ID_PLUGIN_START;
4019
4020   lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4021   while (lst->next)
4022   {
4023     gtk_container_remove (GTK_CONTAINER (menu), GTK_WIDGET (lst->next->data));
4024     lst = g_list_find (gtk_container_children (GTK_CONTAINER (menu)), sep);
4025   }
4026 }
4027
4028 void MainFrame::AddPlugInMenuItem(IPlugIn* pPlugIn)
4029 {
4030   GtkWidget *menu, *item, *parent;
4031   const char *menuText;
4032
4033   parent = gtk_menu_item_new_with_label (pPlugIn->getMenuName());
4034   gtk_widget_show (parent);
4035   gtk_container_add (GTK_CONTAINER (g_object_get_data (G_OBJECT (m_pWidget), "menu_plugin")), parent);
4036
4037   int nCount = pPlugIn->getCommandCount();
4038   if (nCount > 0)
4039   {
4040     menu = gtk_menu_new ();
4041     while (nCount > 0)
4042     {
4043       menuText = pPlugIn->getCommand(--nCount);
4044       if (menuText != NULL && strlen(menuText) > 0)
4045       {
4046         if (!strcmp(menuText, "-"))
4047         {
4048           item = gtk_menu_item_new ();
4049           gtk_widget_set_sensitive (item, FALSE);
4050         } else
4051         {
4052           item = gtk_menu_item_new_with_label (menuText);
4053           gtk_signal_connect (GTK_OBJECT (item), "activate",
4054                               GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (m_nNextPlugInID));
4055         }
4056         gtk_widget_show (item);
4057         gtk_container_add (GTK_CONTAINER (menu), item);
4058         pPlugIn->addMenuID(m_nNextPlugInID++);
4059       }
4060     }
4061     gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), menu);
4062   }
4063 }
4064
4065 void MainFrame::OnPlugIn(unsigned int nID, char* str)
4066 {
4067   m_PlugInMgr.Dispatch(nID, str);
4068 }
4069
4070 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype(IToolbarButton::EType type)
4071 {
4072   switch(type)
4073   {
4074   case IToolbarButton::eSpace:
4075     return GTK_TOOLBAR_CHILD_SPACE;
4076   case IToolbarButton::eButton:
4077     return GTK_TOOLBAR_CHILD_BUTTON;
4078   case IToolbarButton::eToggleButton:
4079     return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4080   case IToolbarButton::eRadioButton:
4081     return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4082   }
4083   Error("invalid toolbar button type");
4084   return (GtkToolbarChildType)0;
4085 }
4086
4087 void toolbar_insert(GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data)
4088 {
4089   GtkWidget *w, *pixmap;
4090   GdkPixmap *gdkpixmap;
4091   GdkBitmap *mask;
4092
4093   load_plugin_bitmap(image, (void **)&gdkpixmap, (void **)&mask);
4094   pixmap = gtk_pixmap_new (gdkpixmap, mask);
4095   gdk_pixmap_unref (gdkpixmap);
4096   gdk_pixmap_unref (mask);
4097   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), gtktoolbarchildtype_for_toolbarbuttontype(type), NULL, text, tooltip, "", GTK_WIDGET (pixmap), handler, data);
4098 }
4099
4100 void SignalToolbarButton(GtkWidget *widget, gpointer data)
4101 {
4102   const_cast<const IToolbarButton*>(reinterpret_cast<IToolbarButton*>(data))->activate();
4103 }
4104
4105 void MainFrame::AddPlugInToolbarButton(const IToolbarButton* button)
4106 {
4107   GtkWidget*const toolbar = GTK_WIDGET(g_object_get_data (G_OBJECT (m_pWidget), "toolbar_plugin"));    
4108   toolbar_insert(toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC(SignalToolbarButton), reinterpret_cast<gpointer>(const_cast<IToolbarButton*>(button)));
4109 }
4110
4111 void MainFrame::OnSelectionSelectNudgedown() 
4112 {
4113   NudgeSelection(3, g_qeglobals.d_gridsize);
4114 }
4115
4116 void MainFrame::OnSelectionSelectNudgeleft() 
4117 {
4118   NudgeSelection(0, g_qeglobals.d_gridsize);
4119 }
4120
4121 void MainFrame::OnSelectionSelectNudgeright() 
4122 {
4123   NudgeSelection(2, g_qeglobals.d_gridsize);
4124 }
4125
4126 void MainFrame::OnSelectionSelectNudgeup() 
4127 {
4128   NudgeSelection(1, g_qeglobals.d_gridsize);
4129 }
4130
4131 void MainFrame::NudgeSelection(int nDirection, float fAmount)
4132 {
4133   if (ActiveXY()->RotateMode())
4134   {
4135     int nAxis = 0;
4136     if (ActiveXY()->GetViewType() == XY)
4137     {
4138       nAxis = 2;
4139     } else
4140       if (g_pParentWnd->ActiveXY()->GetViewType() == XZ)
4141     {
4142       nAxis = 1;
4143       fAmount = -fAmount;
4144     }
4145
4146     if (nDirection == 2 || nDirection == 3)
4147     {
4148       fAmount = -fAmount;
4149     }
4150
4151     float fDeg = -fAmount;
4152     float fAdj = fAmount;
4153
4154     g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4155     CString strStatus;
4156     strStatus.Format("Rotation x:: %.1f  y:: %.1f  z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4157                      g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2]);
4158     g_pParentWnd->SetStatusText(2, strStatus);
4159     Select_RotateAxis(nAxis, fDeg, false, true);
4160     Sys_UpdateWindows (W_ALL);
4161   } else
4162     if (ActiveXY()->ScaleMode())
4163   {
4164     if (nDirection == 0 || nDirection == 3)
4165     {
4166       fAmount = -fAmount;
4167     }
4168     vec3_t v;
4169     v[0] = v[1] = v[2] = 1.0;
4170     if (fAmount > 0)
4171     {
4172       v[0] = 1.1f;
4173       v[1] = 1.1f;
4174       v[2] = 1.1f;
4175     } else
4176     {
4177       v[0] = 0.9f;
4178       v[1] = 0.9f;
4179       v[2] = 0.9f;
4180     }
4181
4182     Select_Scale((g_nScaleHow & SCALE_X) ? v[0] : 1.0,
4183                  (g_nScaleHow & SCALE_Y) ? v[1] : 1.0,
4184                  (g_nScaleHow & SCALE_Z) ? v[2] : 1.0);
4185     Sys_UpdateWindows (W_ALL);
4186   } else
4187   {
4188     // 0 - left, 1 - up, 2 - right, 3 - down
4189     int nDim;
4190     if (nDirection == 0)
4191     {
4192       nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4193       fAmount = -fAmount;
4194     } else if (nDirection == 1)
4195     {
4196       nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4197     } else if (nDirection == 2)
4198     {
4199       nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4200     } else
4201     {
4202       nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4203       fAmount = -fAmount;
4204     }
4205     Nudge(nDim, fAmount);
4206   }
4207 }
4208
4209 void MainFrame::Nudge(int nDim, float fNudge)
4210 {
4211   vec3_t vMove;
4212   vMove[0] = vMove[1] = vMove[2] = 0;
4213   vMove[nDim] = fNudge;
4214   
4215   if((g_qeglobals.d_select_mode == sel_vertex || 
4216       g_qeglobals.d_select_mode == sel_curvepoint) 
4217       && g_qeglobals.d_num_move_points) 
4218     Select_NudgePoint(vMove, true);
4219   else
4220     Select_Move(vMove, true);
4221   Sys_UpdateWindows (W_ALL);
4222 }
4223
4224 void MainFrame::SetGridStatus()
4225 {
4226   CString strStatus;
4227   char c1;
4228   char c2;
4229   c1 = (g_PrefsDlg.m_bTextureLock) ? 'M' : ' ';
4230   c2 = (g_PrefsDlg.m_bRotateLock) ? 'R' : ' ';
4231   strStatus.Format("G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4232                    g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2);
4233   SetStatusText(4, strStatus);
4234 }
4235
4236 void MainFrame::UpdatePatchToolbarButtons()
4237 {
4238   GtkWidget *item;
4239   g_bIgnoreCommands++;
4240   item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
4241   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
4242 //  item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4243 //  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4244   g_bIgnoreCommands--;
4245 }
4246
4247 // =============================================================================
4248 // Command handlers
4249
4250 void MainFrame::OnFileNew() 
4251 {
4252   if (ConfirmModified())
4253     Map_New ();
4254 }
4255
4256 void MainFrame::OnFileOpen() 
4257 {
4258   if (!ConfirmModified())
4259     return;
4260
4261   const char *str;
4262         char buf[NAME_MAX];
4263
4264   strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4265   strcat(buf, "maps/");
4266
4267   str = file_dialog (m_pWidget, TRUE, "Open Map", buf, MAP_MAJOR);
4268
4269   if (str != NULL)
4270   {
4271     strcpy(currentmap,str);
4272     MRU_AddFile (str);
4273     Map_LoadFile(str);
4274   }
4275 }
4276
4277 void MainFrame::OnFileImportmap() 
4278 {
4279   const char *str;
4280         char buf[NAME_MAX];
4281
4282   strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4283   strcat(buf, "maps/");
4284
4285   str = file_dialog (m_pWidget, TRUE, "Import Map", buf, MAP_MAJOR);
4286
4287   if (str != NULL)
4288   {
4289     Map_ImportFile(str);
4290   }
4291 }
4292
4293 void MainFrame::OnFileSave() 
4294 {
4295   if (!strcmp(currentmap, "unnamed.map"))
4296     OnFileSaveas();
4297   else
4298     Map_SaveFile (currentmap, false);
4299 }
4300
4301 void MainFrame::OnFileSaveas() 
4302 {
4303   const char* str;
4304         char buf[NAME_MAX];
4305   
4306   strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4307   strcat(buf, "maps/");
4308
4309   str = file_dialog (g_pParentWnd->m_pWidget, FALSE, "Save Map", buf, MAP_MAJOR);
4310     
4311   if (str != NULL)
4312   {
4313     strcpy (currentmap, str);
4314     MRU_AddFile (str);
4315     Map_SaveFile (str, false);  // ignore region
4316   }
4317 }
4318
4319 void MainFrame::OnFileExportmap() 
4320 {
4321   const char* str;
4322         char buf[NAME_MAX];
4323
4324   strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4325   strcat(buf, "maps/");
4326
4327   str = file_dialog (m_pWidget, FALSE, "Export Selection", buf, MAP_MAJOR);
4328
4329   if (str != NULL)
4330   {
4331     Map_SaveSelected (str);
4332   }
4333 }
4334
4335 void MainFrame::OnFileSaveregion() 
4336 {
4337   const char* str;
4338         char buf[NAME_MAX];
4339
4340   strcpy(buf, g_qeglobals.m_strHomeMaps.GetBuffer());
4341   strcat(buf, "maps/");
4342
4343   str = file_dialog (g_pParentWnd->m_pWidget, FALSE, "Export Region", buf, MAP_MAJOR);
4344     
4345   if (str != NULL)
4346   {
4347     Map_SaveFile (str, true);   // ignore region
4348   }
4349 }
4350
4351 void MainFrame::OnFileNewproject() 
4352 {
4353   char* name = DoNewProjectDlg ();
4354
4355   // create a new project:
4356   // create directories and grab current project, save it in new project tree in scripts/user.qe4
4357   // on linux we create under ~/.q3a, on win32 under strEnginePath
4358   // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4359   if ((name != NULL) && (strlen (name) > 0))
4360   {
4361     CString strNewBasePath;
4362
4363     // NOTE TTimo this would probably not work right on *nix
4364     strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4365     strNewBasePath += name;
4366     strNewBasePath += "/";
4367
4368     CString strProjToLoad;
4369     CString strMapToLoad;
4370     
4371     // if the dir exists, ask the user if they want to continue anyway
4372     if (Q_mkdir (strNewBasePath.GetBuffer(), 0755) != 0)
4373     {
4374       CString strMsg;
4375       strMsg.Format("The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer ());
4376       Sys_Printf(strMsg);
4377       if (gtk_MessageBox(m_pWidget, strMsg, "Error", MB_YESNO) != IDYES)
4378       {
4379         Sys_Printf("New Project cancelled, directory already exists for project\n");
4380         free (name);
4381         return;
4382       }
4383     }
4384     
4385     CString strDir;
4386     strDir = strNewBasePath;
4387     strDir += "maps/";
4388     Q_mkdir (strDir.GetBuffer(), 0755);
4389
4390     strDir = strNewBasePath;
4391     strDir += "textures/";
4392     Q_mkdir (strDir.GetBuffer(), 0755);
4393
4394     strDir = strNewBasePath;
4395     strDir += "scripts/";
4396     Q_mkdir (strDir.GetBuffer(), 0755);
4397
4398     // print a warning for total conversions, since setting the basepath when required files are
4399     // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4400     Sys_FPrintf(SYS_WRN, "*** Note: basepath unchanged\n");
4401     
4402     SetKeyValue( g_qeglobals.d_project_entity, "gamename", name);
4403     
4404     strDir = strNewBasePath; 
4405     strDir += "maps/autosave.map";
4406     SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4407     
4408     // state that this is a user project file, no templating
4409     SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4410     // create the project file
4411     strProjToLoad = strNewBasePath;
4412     strProjToLoad += "scripts/";
4413                 strProjToLoad += name;
4414                 strProjToLoad += ".";
4415                 strProjToLoad += PROJECT_FILETYPE;    
4416     QE_SaveProject(strProjToLoad.GetBuffer());
4417     free (name);
4418   }
4419 }
4420
4421 void MainFrame::OnFileLoadproject() 
4422 {
4423   if (ConfirmModified())
4424     ProjectDialog ();
4425 }
4426
4427 void MainFrame::OnFileProjectsettings() 
4428 {
4429   DoProjectSettings();
4430 }
4431
4432 void MainFrame::OnFilePointfile()
4433 {
4434   if (g_qeglobals.d_pointfile_display_list)
4435     Pointfile_Clear ();
4436   else
4437     Pointfile_Check ();
4438 }
4439
4440 void MainFrame::OnMru(unsigned int nID) 
4441 {
4442   if (ConfirmModified())
4443     MRU_Activate (nID - ID_FILE_RECENT1);
4444 }
4445
4446 void MainFrame::OnFileExit() 
4447 {
4448   if (ConfirmModified())
4449   {
4450     // stop printing during shutdown
4451     // NOTE: we should cleanly release GL contexts and stuff when exiting
4452
4453     OnDelete();
4454
4455     g_qeglobals_gui.d_edit = NULL;
4456     gtk_widget_destroy (m_pWidget);
4457   }
4458 }
4459
4460 void MainFrame::OnFileCheckUpdate()
4461
4462 {
4463   // build the URL
4464   Str URL;
4465   URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4466 #ifdef _WIN32
4467   URL += "&OS_dlup=1";
4468 #else
4469   URL += "&OS_dlup=2";  
4470 #endif
4471   URL += "&Version_dlup=" RADIANT_VERSION;
4472   g_PrefsDlg.mGamesDialog.AddPacksURL(URL);
4473   OpenURL(URL.GetBuffer());
4474 }
4475
4476 void MainFrame::OnEditUndo() 
4477 {
4478   Undo_Undo();
4479 }
4480
4481 void MainFrame::OnEditRedo() 
4482 {
4483   Undo_Redo();
4484 }
4485
4486 void MainFrame::OnEditCopybrush() 
4487 {
4488   Copy();
4489 }
4490
4491 void MainFrame::OnEditPastebrush() 
4492 {
4493   Select_Deselect();
4494
4495   Undo_Start("paste");
4496
4497   Paste();
4498
4499   Undo_EndBrushList(&selected_brushes);
4500   Undo_End();
4501 }
4502
4503 void MainFrame::OnEditPastebrushToCamera()
4504 {
4505   Select_Deselect();    
4506   if (ActiveXY())
4507   {
4508     vec3_t mid, camorigin, delta;
4509
4510     ActiveXY()->Paste();
4511
4512     // Work out the delta
4513     Select_GetMid( mid );
4514
4515         // Snap camera origin to grid
4516         VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4517         camorigin[0] = floor(camorigin[0] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4518         camorigin[1] = floor(camorigin[1] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4519         camorigin[2] = floor(camorigin[2] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;
4520
4521     VectorSubtract( camorigin, mid, delta );
4522
4523     // Move to camera
4524     Select_Move( delta, false );
4525
4526     Undo_Start("paste to camera");
4527     Undo_EndBrushList(&selected_brushes);
4528     Undo_End();
4529   }
4530 }
4531
4532 void MainFrame::OnSelectionDelete() 
4533 {
4534   brush_t *brush;
4535   //if (ActiveXY())
4536   //    ActiveXY()->UndoCopy();
4537   Undo_Start("delete");
4538   Undo_AddBrushList(&selected_brushes);
4539   //add all deleted entities to the undo
4540   for (brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next)
4541   {
4542     Undo_AddEntity(brush->owner);
4543   }
4544   // NOTE: Select_Delete does NOT delete entities
4545   Select_Delete();
4546   Undo_EndBrushList(&selected_brushes);
4547   Undo_End();
4548 }
4549
4550 void MainFrame::OnEditMapinfo() 
4551 {
4552   DoMapInfo ();
4553 }
4554
4555 void MainFrame::OnEditEntityinfo() 
4556 {
4557   DoEntityList ();
4558 }
4559
4560 void MainFrame::OnBrushScripts() 
4561 {
4562   DoScriptsDlg ();
4563 }
4564
4565 void MainFrame::OnEditLoadprefab() 
4566 {
4567   const char *filename;
4568   CString CurPath;
4569
4570   if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4571   {
4572     CurPath = g_PrefsDlg.m_strPrefabPath;
4573     AddSlash (CurPath);
4574   }
4575
4576   filename = file_dialog (m_pWidget, TRUE, "Import Prefab", CurPath.GetBuffer(), MAP_MAJOR);
4577
4578   if (filename != NULL)
4579   {
4580     Map_ImportFile(filename);
4581   }
4582 }
4583
4584 void MainFrame::OnEditSaveprefab() 
4585 {
4586   const char *filename;
4587   CString CurPath;
4588
4589   if (g_PrefsDlg.m_strPrefabPath.GetLength() > 0)
4590   {
4591     CurPath = g_PrefsDlg.m_strPrefabPath;
4592   } else
4593   {
4594     char tmp[PATH_MAX];
4595     getcwd (tmp, PATH_MAX);
4596     CurPath = tmp;
4597   }
4598   AddSlash (CurPath);
4599
4600   filename = file_dialog (m_pWidget, FALSE, "Export Prefab", CurPath.GetBuffer(), MAP_MAJOR);
4601   if (filename != NULL)
4602   {
4603     Map_SaveSelected(filename);
4604   }
4605 }
4606
4607 void MainFrame::OnPrefs() 
4608 {
4609   int nView = g_PrefsDlg.m_nView;
4610   bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4611   bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4612   int nShader = g_PrefsDlg.m_nShader;
4613   int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4614   int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4615   g_PrefsDlg.LoadPrefs();
4616   
4617   if (g_PrefsDlg.DoModal() == IDOK)
4618   {
4619     if ((g_PrefsDlg.m_nLatchedView != nView) ||
4620         (g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus) ||
4621         (g_PrefsDlg.m_bLatchedWideToolbar != bToolbar) ||
4622         (g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar) ||
4623         (g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar) ||
4624         (g_PrefsDlg.m_nLatchedShader != nShader) ||
4625         (g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality) 
4626         || (g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ)
4627         )
4628       gtk_MessageBox(m_pWidget, "You must restart Radiant for the changes to take effect.");
4629
4630     // if the view mode was switched to floating, set the Z window on by default
4631     // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4632     // (and we simply hope there will be a SavePrefs before we die)
4633     if ((g_PrefsDlg.m_nView != nView) && ((EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating))
4634     {
4635       g_PrefsDlg.m_bZVis = true;
4636     }
4637
4638     if (m_pTexWnd)
4639       m_pTexWnd->UpdatePrefs();
4640
4641     GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
4642     g_bIgnoreCommands++;
4643     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
4644                                     (!g_PrefsDlg.m_bNoClamp) ? TRUE : FALSE);
4645     g_bIgnoreCommands--;
4646   }
4647 }
4648
4649 void MainFrame::OnTogglecamera() 
4650 {
4651   if (CurrentStyle() == eFloating) // floating views
4652   {
4653     if (m_pCamWnd && m_pCamWnd->m_pParent)
4654     {
4655       if (GTK_WIDGET_VISIBLE (m_pCamWnd->m_pParent))
4656         widget_delete_hide (m_pCamWnd->m_pParent);
4657       else
4658         gtk_widget_show (m_pCamWnd->m_pParent);
4659     }
4660   } else
4661   {
4662     if (GTK_WIDGET_VISIBLE (m_pCamWnd->GetWidget ()))
4663       gtk_widget_hide (m_pCamWnd->GetWidget ());
4664     else
4665       gtk_widget_show (m_pCamWnd->GetWidget ());
4666   }
4667 }
4668
4669 void MainFrame::OnToggleconsole() 
4670 {
4671   if (FloatingGroupDialog()) // QE4 style
4672   {
4673     if (inspector_mode == W_CONSOLE)
4674     {
4675       if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4676         widget_delete_hide (g_qeglobals_gui.d_entity);
4677       else
4678         gtk_widget_show (g_qeglobals_gui.d_entity);
4679     } else
4680     {
4681       gtk_widget_show (g_qeglobals_gui.d_entity);
4682       SetInspectorMode(W_CONSOLE);
4683     }
4684   }
4685 }
4686
4687 // trigger the entity inspector on/off
4688 void MainFrame::OnViewEntity()
4689 {
4690   // make sure we're working with the current selection (bugzilla #436)
4691   if( ! GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4692     Select_Reselect();
4693   
4694   if (!FloatingGroupDialog())
4695   {
4696     if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_ENTITY)
4697       widget_delete_hide (g_qeglobals_gui.d_entity);
4698     else
4699     {
4700       gtk_widget_show (g_qeglobals_gui.d_entity);
4701       SetInspectorMode(W_ENTITY);
4702     }
4703   } else
4704   {
4705     if (inspector_mode == W_ENTITY)
4706     {
4707       if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4708         widget_delete_hide (g_qeglobals_gui.d_entity);
4709       else
4710         gtk_widget_show (g_qeglobals_gui.d_entity);
4711     } else
4712     {
4713       gtk_widget_show (g_qeglobals_gui.d_entity);
4714       SetInspectorMode(W_ENTITY);
4715     }
4716   }
4717 }
4718
4719 void MainFrame::OnViewGroups()
4720 {
4721   if (!FloatingGroupDialog())
4722   {
4723     if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity) && inspector_mode == W_GROUP)
4724       widget_delete_hide (g_qeglobals_gui.d_entity);
4725     else
4726     {
4727       gtk_widget_show (g_qeglobals_gui.d_entity);
4728       SetInspectorMode(W_GROUP);
4729     }
4730   } else
4731   {
4732     if (inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating)
4733     {
4734       if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
4735         widget_delete_hide (g_qeglobals_gui.d_entity);
4736       else
4737         gtk_widget_show (g_qeglobals_gui.d_entity);
4738     } else
4739     {
4740       gtk_widget_show (g_qeglobals_gui.d_entity);
4741       SetInspectorMode(W_GROUP);
4742     }
4743   }
4744 }
4745
4746 void MainFrame::OnToggleview() 
4747 {
4748   if (CurrentStyle() == eFloating) // QE4 style
4749   {
4750     if (m_pXYWnd && m_pXYWnd->m_pParent)
4751     {
4752       if (GTK_WIDGET_VISIBLE (m_pXYWnd->m_pParent))
4753         widget_delete_hide (m_pXYWnd->m_pParent);
4754       else
4755         gtk_widget_show (m_pXYWnd->m_pParent);
4756     }
4757   }
4758 }
4759
4760 void MainFrame::OnToggleviewXz() 
4761 {
4762   if (CurrentStyle() == eFloating) // QE4 style
4763   {
4764     if (m_pXZWnd && m_pXZWnd->m_pParent)
4765     {
4766       // get windowplacement doesn't actually save this so we will here
4767       g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE (m_pXZWnd->m_pParent);
4768       if (g_PrefsDlg.m_bXZVis)
4769         widget_delete_hide (m_pXZWnd->m_pParent);
4770       else
4771         gtk_widget_show (m_pXZWnd->m_pParent);
4772       g_PrefsDlg.m_bXZVis ^= 1;
4773       g_PrefsDlg.SavePrefs ();
4774     }
4775   }
4776 }
4777
4778 void MainFrame::OnToggleviewYz() 
4779 {
4780   if (CurrentStyle() == eFloating) // QE4 style
4781   {
4782     if (m_pYZWnd && m_pYZWnd->m_pParent)
4783     {
4784       g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE (m_pYZWnd->m_pParent);
4785       if (g_PrefsDlg.m_bYZVis)
4786         widget_delete_hide (m_pYZWnd->m_pParent);
4787       else
4788         gtk_widget_show (m_pYZWnd->m_pParent);
4789       g_PrefsDlg.m_bYZVis ^= 1;
4790       g_PrefsDlg.SavePrefs ();
4791     }
4792   }
4793 }
4794
4795 void MainFrame::OnTogglez() 
4796 {
4797   if ( g_pParentWnd->FloatingGroupDialog() ) // QE4 style
4798   {
4799     if (m_pZWnd && m_pZWnd->m_pParent)
4800     {
4801       if (GTK_WIDGET_VISIBLE (m_pZWnd->m_pParent))
4802         widget_delete_hide (m_pZWnd->m_pParent);
4803       else
4804         gtk_widget_show (m_pZWnd->m_pParent);
4805       g_PrefsDlg.m_bZVis ^= 1;
4806       g_PrefsDlg.SavePrefs ();
4807     }
4808   } else {
4809     Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4810   }
4811 }
4812
4813 void MainFrame::OnViewCenter() 
4814 {
4815   m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4816   m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor((m_pCamWnd->Camera()->angles[YAW]+11)/22.5);
4817   Sys_UpdateWindows (W_CAMERA | W_XY_OVERLAY);
4818 }
4819
4820 void MainFrame::OnViewUpfloor() 
4821 {
4822   m_pCamWnd->Cam_ChangeFloor (true);
4823 }
4824
4825 void MainFrame::OnViewDownfloor() 
4826 {
4827   m_pCamWnd->Cam_ChangeFloor (false);
4828 }
4829
4830 void MainFrame::OnViewCenterview()
4831 {
4832   if(CurrentStyle() == eSplit)
4833   {
4834     GetXYWnd()->PositionView();
4835     GetXZWnd()->PositionView();
4836     GetYZWnd()->PositionView();
4837     Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4838   }
4839   else {
4840     m_pXYWnd->PositionView();
4841     Sys_UpdateWindows (W_XY);
4842   }
4843 }
4844
4845 void MainFrame::OnViewNextview() 
4846 {
4847   if (CurrentStyle() == eSplit)
4848   {
4849     GetXYWnd()->PositionView();
4850     GetXZWnd()->PositionView();
4851     GetYZWnd()->PositionView();
4852     Sys_UpdateWindows (W_XY|W_XZ|W_YZ);
4853   }
4854   else {
4855     if (m_pXYWnd->GetViewType() == XY)
4856       m_pXYWnd->SetViewType(XZ);
4857     else
4858       if (m_pXYWnd->GetViewType() ==  XZ)
4859       m_pXYWnd->SetViewType(YZ);
4860     else
4861       m_pXYWnd->SetViewType(XY);
4862     m_pXYWnd->PositionView();
4863     Sys_UpdateWindows (W_XY);
4864   }
4865 }
4866
4867 void MainFrame::OnViewXy() 
4868 {
4869   if(!FloatingGroupDialog())
4870   {
4871     m_pXYWnd->SetViewType(XY);
4872     m_pXYWnd->PositionView();
4873   }
4874   Sys_UpdateWindows (W_XY);
4875 }
4876
4877 void MainFrame::OnViewSide() 
4878 {
4879   if (!FloatingGroupDialog())
4880   {
4881     m_pXYWnd->SetViewType(XZ);
4882     m_pXYWnd->PositionView();
4883   }
4884   Sys_UpdateWindows (W_XY);
4885 }
4886
4887 void MainFrame::OnViewFront() 
4888 {
4889   if (!FloatingGroupDialog())
4890   {
4891     m_pXYWnd->SetViewType(YZ);
4892     m_pXYWnd->PositionView();
4893   }
4894   Sys_UpdateWindows (W_XY);
4895 }
4896
4897 void MainFrame::OnView100() 
4898 {
4899   if (m_pXYWnd)
4900     m_pXYWnd->SetScale(1);
4901   if (m_pXZWnd)
4902     m_pXZWnd->SetScale(1);
4903   if (m_pYZWnd)
4904     m_pYZWnd->SetScale(1);
4905   Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4906 }
4907
4908 void MainFrame::OnViewZoomin() 
4909 {
4910   if (m_pXYWnd && m_pXYWnd->Active())
4911   {
4912     m_pXYWnd->SetScale(m_pXYWnd->Scale() * 5.0 / 4);
4913     if (m_pXYWnd->Scale() > 30)
4914       m_pXYWnd->SetScale(30);
4915   }
4916
4917   if (m_pXZWnd && m_pXZWnd->Active())
4918   {
4919     m_pXZWnd->SetScale(m_pXZWnd->Scale() * 5.0 / 4);
4920     if (m_pXZWnd->Scale() > 30)
4921       m_pXZWnd->SetScale(30);
4922   }
4923
4924   if (m_pYZWnd && m_pYZWnd->Active())
4925   {
4926     m_pYZWnd->SetScale(m_pYZWnd->Scale() * 5.0 / 4);
4927     if (m_pYZWnd->Scale() > 30)
4928       m_pYZWnd->SetScale(30);
4929   }
4930
4931   Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4932 }
4933
4934 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4935 //  we don't go below a zoom factor corresponding to 10% of the max world size
4936 //  (this has to be computed against the window size)
4937 void MainFrame::OnViewZoomout() 
4938 {
4939   float min_scale;
4940   if (m_pXYWnd && m_pXYWnd->Active())
4941   {
4942     m_pXYWnd->SetScale(m_pXYWnd->Scale() * 4.0 / 5);
4943     min_scale = MIN(m_pXYWnd->Width(),m_pXYWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4944     if (m_pXYWnd->Scale() < min_scale) m_pXYWnd->SetScale (min_scale);
4945   }
4946
4947   if (m_pXZWnd && m_pXZWnd->Active())
4948   {
4949     m_pXZWnd->SetScale(m_pXZWnd->Scale() * 4.0 / 5);
4950     min_scale = MIN(m_pXZWnd->Width(),m_pXZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4951     if (m_pXZWnd->Scale() < min_scale) m_pXZWnd->SetScale (min_scale);
4952   }
4953
4954   if (m_pYZWnd && m_pYZWnd->Active())
4955   {
4956     m_pYZWnd->SetScale(m_pYZWnd->Scale() * 4.0 / 5);
4957     min_scale = MIN(m_pYZWnd->Width(),m_pYZWnd->Height()) / ( 1.1 * (g_MaxWorldCoord-g_MinWorldCoord));
4958     if (m_pYZWnd->Scale() < min_scale) m_pYZWnd->SetScale (min_scale);
4959   }
4960   Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
4961 }
4962
4963 void MainFrame::OnViewZ100() 
4964 {
4965   z.scale = 1;
4966   Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4967 }
4968
4969 void MainFrame::OnViewZzoomin() 
4970 {
4971   z.scale *= 5.0/4;
4972   if (z.scale > 4)
4973     z.scale = 4;
4974   Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4975 }
4976
4977 void MainFrame::OnViewZzoomout() 
4978 {
4979   z.scale *= 4.0f/5;
4980   if (z.scale < 0.125)
4981     z.scale = 0.125;
4982   Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
4983 }
4984
4985 void MainFrame::OnViewCubein() 
4986 {
4987   g_PrefsDlg.m_nCubicScale--;
4988   if (g_PrefsDlg.m_nCubicScale < 1)
4989     g_PrefsDlg.m_nCubicScale = 1;
4990   g_PrefsDlg.SavePrefs ();
4991   Sys_UpdateWindows(W_CAMERA);
4992   SetGridStatus();
4993 }
4994
4995 void MainFrame::OnViewCubeout() 
4996 {
4997   g_PrefsDlg.m_nCubicScale++;
4998   if (g_PrefsDlg.m_nCubicScale > 22)
4999     g_PrefsDlg.m_nCubicScale = 22;
5000   g_PrefsDlg.SavePrefs ();
5001   Sys_UpdateWindows(W_CAMERA);
5002   SetGridStatus();
5003 }
5004
5005 void MainFrame::OnViewShownames() 
5006 {
5007   g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
5008   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_shownames"));
5009   g_bIgnoreCommands++;
5010   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5011                                   g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE);
5012   g_bIgnoreCommands--;
5013   Sys_UpdateWindows (W_XY);
5014 }
5015
5016 void MainFrame::OnViewShowAngles() 
5017 {
5018   g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
5019   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showangles"));
5020   g_bIgnoreCommands++;
5021   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5022                                   g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE);
5023   g_bIgnoreCommands--;
5024   Sys_UpdateWindows (W_XY);
5025 }
5026
5027 void MainFrame::OnViewShowblocks() 
5028 {
5029   g_qeglobals.show_blocks ^= 1;
5030   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showblocks"));
5031   g_bIgnoreCommands++;
5032   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_qeglobals.show_blocks ? TRUE : FALSE);
5033   g_bIgnoreCommands--;
5034   Sys_UpdateWindows (W_XY);
5035 }
5036
5037 void MainFrame::OnViewShowcoordinates() 
5038 {
5039   g_qeglobals.d_savedinfo.show_coordinates ^= 1;
5040   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showcoordinates"));
5041   g_bIgnoreCommands++;
5042   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5043                                   g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE);
5044   g_bIgnoreCommands--;
5045   Sys_UpdateWindows (W_XY|W_Z);
5046 }
5047
5048 void MainFrame::OnViewShowOutline()
5049 {
5050   g_qeglobals.d_savedinfo.show_outline ^= 1;
5051   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showoutline"));
5052   g_bIgnoreCommands++;
5053   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5054                                   g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE);
5055   g_bIgnoreCommands--;
5056   Sys_UpdateWindows (W_XY);
5057 }
5058
5059 void MainFrame::OnViewShowAxes()
5060 {
5061   g_qeglobals.d_savedinfo.show_axis ^= 1;
5062   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showaxes"));
5063   g_bIgnoreCommands++;
5064   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
5065                                   g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE);
5066   g_bIgnoreCommands--;
5067   Sys_UpdateWindows (W_XY);
5068 }
5069
5070 void MainFrame::OnViewShowWorkzone()
5071 {
5072   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showworkzone"));
5073   g_bIgnoreCommands++;
5074   if (g_qeglobals.d_show_work)
5075   {
5076     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
5077     g_qeglobals.d_show_work = false;
5078   } else
5079   {
5080     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5081     g_qeglobals.d_show_work = true;
5082   }
5083   g_bIgnoreCommands--;
5084   Sys_UpdateWindows (W_XY);
5085 }
5086
5087 void MainFrame::OnViewHideshowHideselected() 
5088 {
5089   Select_Hide();
5090   Select_Deselect();
5091 }
5092
5093 void MainFrame::OnViewHideshowShowhidden() 
5094 {
5095   Select_ShowAllHidden();
5096 }
5097
5098 /** 
5099 sets the view mode for the entities
5100 called upon LoadPrefs too
5101 NOTE TTimo previous implementation had a SavePrefs call 
5102   .. I don't think it is relevant, removed (the prefs are saved upon exit)
5103 NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5104   (otherwise we are always called following user action on the widget)
5105 */
5106 void MainFrame::OnEntitiesSetViewAs(int mode)
5107 {
5108   gpointer item = NULL;
5109   if (mode == 0)
5110   {
5111     switch (g_PrefsDlg.m_nEntityShowState)
5112     {
5113     case ENTITY_BOX:
5114       item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5115       break;
5116     case ENTITY_WIRE:
5117       item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5118       break;
5119     case ENTITY_SELECTED:
5120       item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5121       break;
5122     case ENTITY_SELECTED_SKIN:
5123       item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5124       break;
5125     case ENTITY_SKINNED:
5126       item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5127       break;
5128     case ENTITY_SKINNED_BOXED:
5129       item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5130       break;
5131     }
5132     g_bIgnoreCommands++;
5133     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5134     g_bIgnoreCommands--;
5135     return;
5136   }
5137
5138   switch (mode)
5139   {
5140   case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5141     g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5142     item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_boundingbox");
5143     break;
5144   case ID_VIEW_ENTITIESAS_WIREFRAME:
5145     g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5146     item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_wireframe");
5147     break;
5148   case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5149     g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5150     item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedwireframe");
5151     break;
5152   case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5153     g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5154     item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_selectedskinned");
5155     break;
5156   case ID_VIEW_ENTITIESAS_SKINNED:
5157     g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5158     item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinned");
5159     break;
5160   case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5161     g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5162     item = g_object_get_data (G_OBJECT (g_pParentWnd->m_pWidget), "menu_view_entitiesas_skinnedandboxed");
5163     break;
5164   default:
5165     Sys_FPrintf(SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n");
5166     return;
5167   }
5168
5169   if (!item)
5170   {
5171     Sys_FPrintf(SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n");
5172     return;
5173   }
5174
5175   g_bIgnoreCommands++;
5176   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5177   g_bIgnoreCommands--;
5178
5179   Sys_UpdateWindows(W_ALL);
5180 }
5181
5182 void MainFrame::OnViewCubicclipping() 
5183 {
5184   GtkWidget *w;
5185
5186   g_PrefsDlg.m_bCubicClipping ^= 1;
5187   g_bIgnoreCommands++;
5188   w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cubicclipping"));
5189   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5190   w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cubicclipping"));
5191   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE);
5192   g_bIgnoreCommands--;
5193   g_PrefsDlg.SavePrefs ();
5194   //Map_BuildBrushData ();
5195   Sys_UpdateWindows(W_CAMERA);
5196 }
5197
5198 void MainFrame::OnViewOpengllighting() 
5199 {
5200   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_opengllighting"));
5201   g_PrefsDlg.m_bGLLighting ^= 1;
5202   g_PrefsDlg.SavePrefs ();
5203   g_bIgnoreCommands++;
5204   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE);
5205   Sys_UpdateWindows (W_XY|W_CAMERA);
5206   g_bIgnoreCommands--;
5207 }
5208
5209 void MainFrame::OnSelectionDragedges() 
5210 {
5211   if (g_qeglobals.d_select_mode == sel_edge)
5212   {
5213     g_qeglobals.d_select_mode = sel_brush;
5214     Sys_UpdateWindows (W_ALL);
5215   } else
5216   {
5217     SetupVertexSelection ();
5218     if (g_qeglobals.d_numpoints)
5219       g_qeglobals.d_select_mode = sel_edge;
5220     Sys_UpdateWindows (W_ALL);
5221   }
5222 }
5223
5224 void MainFrame::OnSelectionDragvertecies() 
5225 {
5226   if (g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint)
5227   {
5228     g_qeglobals.d_select_mode = sel_brush;
5229     Sys_UpdateWindows (W_ALL);
5230   } else
5231   {
5232     //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5233     if (OnlyPatchesSelected())
5234     {
5235       Patch_EditPatch();
5236     } else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5237     {
5238       SetupVertexSelection ();
5239       if (g_qeglobals.d_numpoints)
5240         g_qeglobals.d_select_mode = sel_vertex;
5241     }
5242     Sys_UpdateWindows (W_ALL);
5243   }
5244 }
5245
5246 void MainFrame::OnSelectionClone() 
5247 {
5248   Select_Clone();
5249 }
5250
5251 // called when the escape key is used (either on the main window or on an inspector)
5252 void MainFrame::OnSelectionDeselect() 
5253 {
5254   if (g_bClipMode)
5255     OnViewClipper();
5256   else
5257     if (g_bRotateMode)
5258     OnSelectMouserotate();
5259   else
5260     if (g_bScaleMode)
5261     OnSelectMousescale();
5262   else
5263     if (g_bPathMode)
5264   {
5265     if (ActiveXY())
5266       ActiveXY()->KillPathMode();
5267   } else
5268   {
5269     if (g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0)
5270     {
5271       g_qeglobals.d_num_move_points = 0;
5272       Sys_UpdateWindows(W_ALL);
5273     } else
5274     {
5275       Select_Deselect ();
5276       SetStatusText(2, " ");
5277     }
5278   }
5279 }
5280
5281 void MainFrame::OnBrushFlipx() 
5282 {
5283   Undo_Start("flip X");
5284   Undo_AddBrushList(&selected_brushes);
5285
5286   Select_FlipAxis (0);
5287   // spog - this does not work - it's a rotate not a flip
5288   /*
5289   for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5290   {
5291     if(b->owner->eclass->fixedsize)
5292     {
5293       char buf[16];
5294       float a = FloatForKey(b->owner, "angle");
5295       a = div ((int)(180 - a), 180).rem;
5296       sprintf (buf, "%d", (int)a);
5297       SetKeyValue(b->owner, "angle", buf);
5298       Brush_Build(b,true,true,false,false); // don't filter
5299     }
5300   }
5301   */
5302   Undo_EndBrushList(&selected_brushes);
5303   Undo_End();
5304 }
5305
5306 void MainFrame::OnBrushFlipy() 
5307 {
5308   Undo_Start("flip Y");
5309   Undo_AddBrushList(&selected_brushes);
5310
5311   Select_FlipAxis (1);
5312   // spog - this does not work - it's a rotate not a flip
5313   /*
5314   for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5315   {
5316     if(b->owner->eclass->fixedsize)
5317     {
5318       float a = FloatForKey(b->owner, "angle");
5319       if (a == 0 || a == 180 || a == 360)
5320   continue;
5321       if ( a == 90 || a == 270)
5322       {
5323   a += 180;
5324       }
5325       else if (a > 270)
5326   a += 90;
5327       else if (a > 180)
5328   a -= 90;
5329       else if (a > 90)
5330   a += 90;
5331       else
5332   a -= 90;
5333       a = (int)a % 360;
5334       char buf[16];
5335       sprintf (buf, "%d", (int)a);
5336       SetKeyValue(b->owner, "angle", buf);
5337       Brush_Build(b,true,true,false,false); // don't filter
5338     }
5339   
5340   }
5341   */
5342   Undo_EndBrushList(&selected_brushes);
5343   Undo_End();
5344 }
5345
5346 void MainFrame::OnBrushFlipz() 
5347 {
5348   Undo_Start("flip Z");
5349   Undo_AddBrushList(&selected_brushes);
5350   Select_FlipAxis (2);
5351   Undo_EndBrushList(&selected_brushes);
5352   Undo_End();
5353 }
5354
5355 void MainFrame::OnBrushRotatex() 
5356 {
5357   Undo_Start("rotate X");
5358   Undo_AddBrushList(&selected_brushes);
5359   Select_RotateAxis (0, 90);
5360   Undo_EndBrushList(&selected_brushes);
5361   Undo_End();
5362 }
5363
5364 void MainFrame::OnBrushRotatey() 
5365 {
5366   Undo_Start("rotate Y");
5367   Undo_AddBrushList(&selected_brushes);
5368   Select_RotateAxis (1, 90);
5369   Undo_EndBrushList(&selected_brushes);
5370   Undo_End();
5371 }
5372
5373 void MainFrame::OnBrushRotatez() 
5374 {
5375   Undo_Start("rotate Z");
5376   Undo_AddBrushList(&selected_brushes);
5377   Select_RotateAxis (2, 90);
5378   Undo_EndBrushList(&selected_brushes);
5379   Undo_End();
5380 }
5381
5382 void MainFrame::OnSelectionArbitraryrotation() 
5383 {
5384   Undo_Start("arbitrary rotation");
5385   Undo_AddBrushList(&selected_brushes);
5386
5387   DoRotateDlg ();
5388
5389   Undo_EndBrushList(&selected_brushes);
5390   Undo_End();
5391 }
5392
5393 void MainFrame::OnSelectScale() 
5394 {
5395   Undo_Start("scale");
5396   Undo_AddBrushList(&selected_brushes);
5397   DoScaleDlg ();
5398   Undo_EndBrushList(&selected_brushes);
5399   Undo_End();
5400 }
5401
5402 void MainFrame::OnSelectionMakehollow() 
5403 {
5404   //if (ActiveXY())
5405   //    ActiveXY()->UndoCopy();
5406   Undo_Start("hollow");
5407   Undo_AddBrushList(&selected_brushes);
5408   CSG_MakeHollow ();
5409   Undo_EndBrushList(&selected_brushes);
5410   Undo_End();
5411 }
5412
5413 void MainFrame::OnSelectionCsgsubtract() 
5414 {
5415   Undo_Start("CSG subtract");
5416   CSG_Subtract();
5417   Undo_End();
5418 }
5419
5420 void MainFrame::OnSelectionCsgmerge()
5421 {
5422   Undo_Start("CSG merge");
5423   Undo_AddBrushList(&selected_brushes);
5424   CSG_Merge();
5425   Undo_EndBrushList(&selected_brushes);
5426   Undo_End();
5427 }
5428
5429 void MainFrame::OnSelectionNoOutline()
5430 {
5431   //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5432   g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) ^ OUTLINE_ZBUF;
5433   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5434   g_bIgnoreCommands++;
5435   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5436   g_bIgnoreCommands--;
5437   Sys_UpdateWindows (W_CAMERA);
5438 }
5439
5440 void MainFrame::OnSelectionOutlineStyle()
5441 {
5442   if ((g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF) && (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL))
5443     g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5444   else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL)
5445     g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5446   else if (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF)
5447     g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5448   else
5449     g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5450   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_selection_nooutline"));
5451   g_bIgnoreCommands++;
5452   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF));
5453   g_bIgnoreCommands--;
5454   Sys_UpdateWindows (W_CAMERA);
5455 }
5456
5457 void MainFrame::OnSelectionSelectcompletetall() 
5458 {
5459   if (ActiveXY())
5460     ActiveXY()->UndoCopy();
5461   Select_CompleteTall ();
5462 }
5463
5464 void MainFrame::OnSelectionSelecttouching() 
5465 {
5466   Select_Touching();
5467 }
5468
5469 void MainFrame::OnSelectionSelectpartialtall() 
5470 {
5471   Select_PartialTall();
5472 }
5473
5474 void MainFrame::OnSelectionSelectinside() 
5475 {
5476   Select_Inside ();
5477 }
5478
5479 void MainFrame::OnViewClipper() 
5480 {
5481   GtkWidget *w = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_clipper"));
5482   g_bIgnoreCommands++;
5483
5484   if (ActiveXY())
5485   {
5486     if (ActiveXY()->ClipMode())
5487     {
5488       ActiveXY()->SetClipMode(false);
5489       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), FALSE);
5490     } else
5491     {
5492       if (ActiveXY()->RotateMode())
5493         OnSelectMouserotate();
5494       ActiveXY()->SetClipMode(true);
5495       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
5496     }
5497   }
5498   g_bIgnoreCommands--;
5499 }
5500
5501 void MainFrame::OnClipSelected() 
5502 {
5503   if (m_pActiveXY && m_pActiveXY->ClipMode())
5504   {
5505     Undo_Start("clip selected");
5506     Undo_AddBrushList(&selected_brushes);
5507     m_pActiveXY->Clip();
5508     Undo_EndBrushList(&selected_brushes);
5509     Undo_End();
5510   } else
5511   {
5512     if (g_bPatchBendMode)
5513       Patch_BendHandleENTER();
5514 //    else if (g_bPatchBendMode)
5515 //      Patch_InsDelHandleENTER();
5516   }
5517 }
5518
5519 void MainFrame::OnSplitSelected() 
5520 {
5521   if (m_pActiveXY)
5522   {
5523     Undo_Start("split selected");
5524     Undo_AddBrushList(&selected_brushes);
5525     m_pActiveXY->SplitClip();
5526     Undo_EndBrushList(&selected_brushes);
5527     Undo_End();
5528   }
5529 }
5530
5531 void MainFrame::OnFlipClip() 
5532 {
5533   if (m_pActiveXY)
5534     m_pActiveXY->FlipClip();
5535 }
5536
5537 void MainFrame::OnSelectionConnect() 
5538 {
5539   Undo_Start("connect selected entities");
5540   Undo_AddBrushList(&selected_brushes);
5541   ConnectEntities();
5542   Undo_EndBrushList(&selected_brushes);
5543   Undo_End();
5544 }
5545
5546 void MainFrame::OnSelectionUngroupentity() 
5547 {
5548   Undo_Start("ungroup selected entities");
5549   Undo_AddBrushList(&selected_brushes);
5550   Select_Ungroup();
5551   Undo_EndBrushList(&selected_brushes);
5552   Undo_End();
5553 }
5554
5555 void MainFrame::OnSelectionMergeentity() 
5556 {
5557   Undo_Start("merge entity");
5558   Undo_AddBrushList(&selected_brushes);
5559   Select_MergeEntity();
5560   Undo_EndBrushList(&selected_brushes);
5561   Undo_End();
5562 }
5563
5564 void MainFrame::OnSelectionGroupworld() 
5565 {
5566   Undo_Start("group world");
5567   Undo_AddBrushList(&selected_brushes);
5568   Select_GroupEntity(world_entity);
5569   Undo_EndBrushList(&selected_brushes);
5570   Undo_End();
5571 }
5572
5573 void MainFrame::OnSelectionMakeDetail() 
5574 {
5575   Undo_Start("make detail");
5576   Undo_AddBrushList(&selected_brushes);
5577   Select_MakeDetail ();
5578   Undo_EndBrushList(&selected_brushes);
5579   Undo_End();
5580 }
5581
5582 void MainFrame::OnSelectionMakeStructural() 
5583 {
5584   Undo_Start("make structural");
5585   Undo_AddBrushList(&selected_brushes);
5586   Select_MakeStructural ();
5587   Undo_EndBrushList(&selected_brushes);
5588   Undo_End();
5589 }
5590
5591 void MainFrame::OnBspCommand (unsigned int nID) 
5592 {
5593   // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503
5594   // make sure we don't attempt to region compile a map with the camera outside the region
5595   if (region_active)
5596   {
5597     vec3_t vOrig;
5598     VectorSet(vOrig,
5599       (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5600       (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1], 
5601       (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2]);
5602     
5603     int i;
5604     for (i=0 ; i<3 ; i++)
5605     {
5606       if (vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i])
5607       {
5608         Sys_FPrintf(SYS_ERR, "The camera must be in the region to start a region compile.\n");
5609         return;
5610       }
5611     }
5612   }
5613
5614   // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5615   if (stricmp( currentmap, "unnamed.map") == 0)
5616   {
5617     OnFileSaveas();
5618   }
5619
5620   if (g_PrefsDlg.m_bSnapShots && (stricmp (currentmap, "unnamed.map") != 0))
5621     Map_Snapshot();
5622
5623   if (g_qeglobals.bBSPFrontendPlugin)
5624   {
5625     char *cmd = (char*)g_slist_nth_data (g_BSPFrontendCommands, nID-CMD_BSPCOMMAND);
5626     g_BSPFrontendTable.m_pfnDispatchBSPCommand (cmd);
5627   } else
5628   {
5629     RunBsp (bsp_commands[nID-CMD_BSPCOMMAND]);
5630   }
5631 }
5632
5633 void MainFrame::OnGrid (unsigned int nID) 
5634 {
5635   if (nID == ID_GRID_025)
5636   {
5637     g_qeglobals.d_gridsize = 0.25f;
5638     g_qeglobals.d_bSmallGrid = true;
5639   } else if (nID == ID_GRID_05)
5640   {
5641     g_qeglobals.d_gridsize = 0.5f;
5642     g_qeglobals.d_bSmallGrid = true;
5643   } else
5644   {
5645     switch (nID)
5646     {
5647     case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5648     case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5649     case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5650     case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5651     case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5652     case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5653     case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5654     case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5655     case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5656     }
5657     g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5658     g_qeglobals.d_bSmallGrid = false;
5659   }
5660
5661   SetGridStatus();
5662
5663   // SnapTToGrid option: need to check everywhere the grid size is changed
5664   // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5665   if (g_PrefsDlg.m_bSnapTToGrid)
5666     DoSnapTToGrid();
5667
5668   Sys_UpdateWindows (W_XY|W_Z);
5669 }
5670
5671 void MainFrame::OnSnaptogrid() 
5672 {
5673   g_PrefsDlg.m_bNoClamp ^= 1;
5674   g_PrefsDlg.SavePrefs ();
5675
5676   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_snaptogrid"));
5677   g_bIgnoreCommands++;
5678   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bNoClamp ? FALSE : TRUE);
5679   g_bIgnoreCommands--;
5680 }
5681
5682 void MainFrame::OnTexturesShowinuse() 
5683 {
5684   Sys_BeginWait ();
5685   Texture_ShowInuse ();
5686 #ifdef _DEBUG
5687   if (!g_bShowAllShaders)
5688     Sys_Printf("Already showing only in-use textures.\n");
5689 #endif
5690   Sys_UpdateWindows( W_TEXTURE );
5691   Sys_EndWait ();
5692 }
5693
5694 void MainFrame::OnTexturesShowall() 
5695 {
5696   Texture_ShowAll();
5697 }
5698
5699 // do some triggering on/off, if the inspector is already up then hide it
5700 void MainFrame::OnTexturesInspector() 
5701 {
5702   ToggleSurface();
5703 }
5704
5705 void MainFrame::OnViewNearest(unsigned int nID) 
5706 {
5707   Texture_SetMode(nID);
5708 }
5709
5710 void MainFrame::OnTextureReplaceall() 
5711 {
5712   FindTextureDialog::show();
5713 }
5714
5715 void MainFrame::OnToggleLock() 
5716 {
5717   g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5718
5719   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_lock"));
5720   g_bIgnoreCommands++;
5721   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE);
5722   g_bIgnoreCommands--;
5723   g_PrefsDlg.SavePrefs ();
5724   SetGridStatus();
5725 }
5726
5727 void MainFrame::OnToggleRotatelock() 
5728 {
5729   g_PrefsDlg.m_bRotateLock ^= 1;
5730
5731   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_toggle_rotatelock"));
5732   g_bIgnoreCommands++;
5733   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE);
5734   g_bIgnoreCommands--;
5735   g_PrefsDlg.SavePrefs ();
5736   SetGridStatus();
5737 }
5738
5739 // use a dialog for direct selection of a texture menu
5740 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5741 void MainFrame::OnTexturesLoad() 
5742 {
5743   char def_path[NAME_MAX];
5744
5745         // FIXME
5746         // check if that works with fs_game (I suspect some more design is needed)
5747         // see how this is done in 1.2?
5748         // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=507
5749   strcpy (def_path, g_pGameDescription->mEnginePath.GetBuffer());
5750   strcat (def_path, g_pGameDescription->mBaseGame.GetBuffer());
5751   strcat (def_path, "/");
5752
5753   char *dir = dir_dialog (m_pWidget, "Load textures from path", def_path);
5754
5755   if (dir != NULL)
5756   {
5757     // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5758     Sys_Printf("user select: '%s'\n", dir);
5759     // remove a potential trailing slash?
5760     if (dir[strlen(dir)-1]=='/' || dir[strlen(dir)-1]=='\\')
5761       dir[strlen(dir)-1] = '\0';
5762     char *pouic = MAX(strrchr(dir, '/'),strrchr(dir, '\\'));
5763     if (pouic)
5764     {
5765       strcpy(texture_directory, pouic+1);
5766       Sys_Printf("Loading '%s'\n", texture_directory);
5767       Texture_ShowDirectory();
5768     }
5769     else
5770       Sys_FPrintf(SYS_WRN, "Failed to extract the directory\n");
5771     g_free(dir);
5772   }
5773   else
5774     Sys_FPrintf(SYS_WRN, "texture load dialog cancelled\n");
5775 }
5776
5777 void MainFrame::OnTexturesReloadshaders() 
5778 {
5779   Sys_BeginWait ();
5780   QERApp_ReloadShaders();
5781   // current shader
5782   // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5783   Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
5784   Sys_UpdateWindows (W_ALL);
5785   Sys_EndWait();
5786 }
5787
5788 void MainFrame::OnTexturesShadersShow() 
5789 {
5790   g_PrefsDlg.m_bShowShaders ^= 1;
5791   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
5792   g_bIgnoreCommands++;
5793   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
5794   g_bIgnoreCommands--;
5795   Sys_UpdateWindows(W_TEXTURE);
5796 }
5797
5798 void MainFrame::SetTextureScale(int id)
5799 {
5800   GtkWidget *item;
5801
5802   switch (id)
5803   {
5804   case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5805     g_PrefsDlg.m_nTextureScale = 10;
5806     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_10"));
5807     break;
5808   case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5809     g_PrefsDlg.m_nTextureScale = 25;
5810     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_25"));
5811     break;
5812   case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5813     g_PrefsDlg.m_nTextureScale = 50;
5814     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_50"));
5815     break;
5816   case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5817     g_PrefsDlg.m_nTextureScale = 200;
5818     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_200"));
5819     break;
5820   default:
5821     g_PrefsDlg.m_nTextureScale = 100;
5822     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_texturewindowscale_100"));
5823     break;
5824   }
5825
5826   g_bIgnoreCommands++;
5827   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
5828   g_bIgnoreCommands--;
5829
5830   Texture_ResetPosition();
5831 }
5832
5833 void MainFrame::OnTexturewindowScaleup() 
5834 {
5835   switch(g_PrefsDlg.m_nTextureScale) {
5836   // 200, all the way in, don't do anything
5837   case 100:
5838     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_200);
5839     break;
5840   case 50:
5841     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5842     break;
5843   case 25:
5844     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5845     break;
5846   case 10:
5847     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5848     break;
5849   }
5850 }
5851
5852 void MainFrame::OnTexturewindowScaledown() 
5853 {
5854   switch(g_PrefsDlg.m_nTextureScale) {
5855   case 200:
5856     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5857     break;
5858   case 100:
5859     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5860     break;
5861   case 50:
5862     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5863     break;
5864   case 25:
5865     SetTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_10);
5866     break;
5867   // 10, all the way out, don't do anything
5868   }
5869 }
5870
5871 void MainFrame::OnTexturesLoadlist() 
5872 {
5873   DoTextureListDlg ();
5874 }
5875
5876 void MainFrame::OnTexturesShaderlistonly() 
5877 {
5878   g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5879   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget),"menu_textures_shaderlistonly"));
5880   g_bIgnoreCommands++;
5881   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
5882   g_bIgnoreCommands--;
5883   FillTextureMenu();
5884 }
5885
5886 void MainFrame::OnTextureWad(unsigned int nID) 
5887 {
5888   Sys_BeginWait ();
5889   Texture_ShowDirectory (nID);
5890   Sys_UpdateWindows (W_ALL);
5891   Sys_EndWait ();
5892 }
5893
5894 void MainFrame::OnMiscBenchmark() 
5895 {
5896   m_pCamWnd->BenchMark();
5897 }
5898
5899 void MainFrame::OnColorSetoriginal() 
5900 {
5901   for (int i=0 ; i<3 ; i++)
5902   {
5903     g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5904     g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5905     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5906     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5907     g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5908   }
5909
5910   //djbob
5911   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5912   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5913   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5914
5915   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5916   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5917   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5918   //-djbob
5919
5920   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5921   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5922   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5923
5924   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5925   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5926   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5927
5928   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5929   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5930   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5931
5932   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5933   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5934   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5935
5936   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5937   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5938   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5939
5940   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5941   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5942   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5943
5944   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5945   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5946   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5947
5948   Sys_UpdateWindows (W_ALL);
5949 }
5950
5951 void MainFrame::OnColorSetqer() 
5952 {
5953   for (int i=0 ; i<3 ; i++)
5954   {
5955     g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5956     g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5957     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5958     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5959     g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5960   }
5961
5962   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5963   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5964   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5965
5966   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5967   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5968   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5969
5970   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5971   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5972   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5973
5974   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5975   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5976   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5977
5978   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5979   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5980   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5981
5982   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5983   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5984   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5985
5986   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5987   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5988   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5989
5990   Sys_UpdateWindows (W_ALL);
5991 }
5992
5993 void MainFrame::OnColorSetblack() 
5994 {
5995   for (int i=0 ; i<3 ; i++)
5996   {
5997     g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5998     g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5999     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
6000     g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6001   }
6002
6003   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
6004   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
6005   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
6006
6007   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
6008   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
6009   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6010
6011   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
6012   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
6013   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
6014
6015   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6016   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6017   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6018
6019   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6020   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6021   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6022
6023   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
6024   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
6025   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
6026
6027   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
6028   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
6029   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
6030
6031   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6032   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6033   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6034
6035   Sys_UpdateWindows (W_ALL);
6036 }
6037
6038 /* ydnar: to emulate maya/max/lightwave color schemes */
6039 void MainFrame::OnColorSetydnar() 
6040 {
6041   for (int i=0 ; i<3 ; i++)
6042   {
6043     g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6044     g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
6045     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
6046     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
6047     g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6048   }
6049
6050   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
6051   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
6052   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6053
6054   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
6055   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
6056   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
6057
6058   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6059   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6060   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6061
6062   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6063   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6064   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6065
6066   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
6067   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
6068   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6069
6070   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6071   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6072   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6073
6074   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6075   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6076   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6077
6078   Sys_UpdateWindows (W_ALL);
6079 }
6080
6081 void MainFrame::OnTexturebk() 
6082 {
6083   DoColor(COLOR_TEXTUREBACK);
6084   Sys_UpdateWindows (W_ALL);
6085 }
6086
6087 void MainFrame::OnColorsXybk() 
6088 {
6089   DoColor(COLOR_GRIDBACK);
6090   Sys_UpdateWindows (W_ALL);
6091 }
6092
6093 void MainFrame::OnColorsMajor() 
6094 {
6095   DoColor(COLOR_GRIDMAJOR);
6096   Sys_UpdateWindows (W_ALL);
6097 }
6098
6099 void MainFrame::OnColorsMinor() 
6100 {
6101   DoColor(COLOR_GRIDMINOR);
6102   Sys_UpdateWindows (W_ALL);
6103 }
6104
6105 void MainFrame::OnColorsMajor_Alt() 
6106 {
6107   DoColor(COLOR_GRIDMAJOR_ALT);
6108   Sys_UpdateWindows (W_ALL);
6109 }
6110
6111 void MainFrame::OnColorsMinor_Alt() 
6112 {
6113   DoColor(COLOR_GRIDMINOR_ALT);
6114   Sys_UpdateWindows (W_ALL);
6115 }
6116
6117 void MainFrame::OnColorsGridtext() 
6118 {
6119   DoColor(COLOR_GRIDTEXT);
6120   Sys_UpdateWindows (W_ALL);
6121 }
6122
6123 void MainFrame::OnColorsGridblock() 
6124 {
6125   DoColor(COLOR_GRIDBLOCK);
6126   Sys_UpdateWindows (W_ALL);
6127 }
6128
6129 void MainFrame::OnColorsCameraBack() 
6130 {
6131   DoColor(COLOR_CAMERABACK);
6132   Sys_UpdateWindows (W_ALL);
6133 }
6134
6135 void MainFrame::OnColorsBrush() 
6136 {
6137   DoColor(COLOR_BRUSHES);
6138   Sys_UpdateWindows (W_ALL);
6139 }
6140
6141 void MainFrame::OnColorsSelectedbrush() 
6142 {
6143   DoColor(COLOR_SELBRUSHES);
6144   Sys_UpdateWindows (W_ALL);
6145 }
6146
6147 void MainFrame::OnColorsSelectedbrush3D() 
6148 {
6149   DoColor(COLOR_SELBRUSHES3D);
6150   Sys_UpdateWindows (W_ALL);
6151 }
6152
6153 void MainFrame::OnColorsClipper() 
6154 {
6155   DoColor(COLOR_CLIPPER);
6156   Sys_UpdateWindows (W_ALL);
6157 }
6158
6159 void MainFrame::OnColorsViewname() 
6160 {
6161   DoColor(COLOR_VIEWNAME);
6162   Sys_UpdateWindows (W_ALL);
6163 }
6164
6165 void MainFrame::OnMiscGamma() 
6166 {
6167   float fSave = g_qeglobals.d_savedinfo.fGamma;
6168   DoGamma();
6169   if (fSave != g_qeglobals.d_savedinfo.fGamma)
6170   {
6171     gtk_MessageBox(m_pWidget, "You must restart Radiant for Gamma settings to take effect.");
6172   }
6173 }
6174 void MainFrame::OnMiscFindbrush() 
6175 {
6176   DoFind();
6177 }
6178
6179 void MainFrame::OnMiscNextleakspot() 
6180 {
6181   Pointfile_Next();
6182 }
6183
6184 void MainFrame::OnMiscPreviousleakspot() 
6185 {
6186   Pointfile_Prev();
6187 }
6188
6189 void MainFrame::OnMiscPrintxy() 
6190 {
6191 //  WXY_Print();
6192 }
6193
6194 void MainFrame::OnMiscSelectentitycolor() 
6195 {
6196   if (edit_entity)
6197   {
6198     CString strColor = ValueForKey(edit_entity, "_color");
6199     if (strColor.GetLength() > 0)
6200     {
6201       float fR, fG, fB;
6202       int n = sscanf(strColor,"%f %f %f", &fR, &fG, &fB);
6203       if (n == 3)
6204       {
6205         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6206         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6207         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6208       }
6209     }
6210
6211     if (inspector_mode == W_ENTITY && (DoColor(COLOR_ENTITY)))
6212     {
6213       char buffer[100];
6214       sprintf(buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6215               g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6216               g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2]);
6217
6218       gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntValueField]), buffer);
6219       gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntKeyField]), "_color");
6220       AddProp();
6221       //DK - SOF change to get color to entity quickly
6222       //--::SetWindowText( hwndEnt[EntValueField], buffer );
6223       //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6224       //--AddProp();
6225     }
6226     Sys_UpdateWindows( W_ALL );
6227   }
6228 }
6229
6230 void MainFrame::OnConvertcurves() 
6231 {
6232 #if 0
6233   Select_Deselect();
6234   for (brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
6235   {
6236     if (pb->curveBrush)
6237     {
6238       for (face_t* f = pb->brush_faces ; f ; f=f->next)
6239       {
6240         if (f->texdef.contents & CONTENTS_LADDER)
6241         {
6242           f->texdef.contents &= ~CONTENTS_LADDER;
6243           f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6244         }
6245       }
6246     }
6247   }
6248   Map_BuildBrushData();
6249 #endif
6250 }
6251
6252 void MainFrame::OnRegionOff() 
6253 {
6254   Map_RegionOff ();
6255 }
6256
6257 void MainFrame::OnRegionSetxy() 
6258 {
6259   Map_RegionXY ();
6260 }
6261
6262 void MainFrame::OnRegionSettallbrush() 
6263 {
6264   Map_RegionTallBrush ();
6265 }
6266
6267 void MainFrame::OnRegionSetbrush() 
6268 {
6269   Map_RegionBrush ();
6270 }
6271
6272 void MainFrame::OnRegionSetselection() 
6273 {
6274   Map_RegionSelectedBrushes ();
6275 }
6276
6277 void MainFrame::OnBrush3sided() 
6278 {
6279   Undo_Start("3 sided");
6280   Undo_AddBrushList(&selected_brushes);
6281   Brush_MakeSided(3);
6282   Undo_EndBrushList(&selected_brushes);
6283   Undo_End();
6284 }
6285
6286 void MainFrame::OnBrush4sided() 
6287 {
6288   Undo_Start("4 sided");
6289   Undo_AddBrushList(&selected_brushes);
6290   Brush_MakeSided(4);
6291   Undo_EndBrushList(&selected_brushes);
6292   Undo_End();
6293 }
6294
6295 void MainFrame::OnBrush5sided() 
6296 {
6297   Undo_Start("5 sided");
6298   Undo_AddBrushList(&selected_brushes);
6299   Brush_MakeSided(5);
6300   Undo_EndBrushList(&selected_brushes);
6301   Undo_End();
6302 }
6303
6304 void MainFrame::OnBrush6sided() 
6305 {
6306   Undo_Start("6 sided");
6307   Undo_AddBrushList(&selected_brushes);
6308   Brush_MakeSided(6);
6309   Undo_EndBrushList(&selected_brushes);
6310   Undo_End();
6311 }
6312
6313 void MainFrame::OnBrush7sided() 
6314 {
6315   Undo_Start("7 sided");
6316   Undo_AddBrushList(&selected_brushes);
6317   Brush_MakeSided(7);
6318   Undo_EndBrushList(&selected_brushes);
6319   Undo_End();
6320 }
6321
6322 void MainFrame::OnBrush8sided() 
6323 {
6324   Undo_Start("8 sided");
6325   Undo_AddBrushList(&selected_brushes);
6326   Brush_MakeSided(8);
6327   Undo_EndBrushList(&selected_brushes);
6328   Undo_End();
6329 }
6330
6331 void MainFrame::OnBrush9sided() 
6332 {
6333   Undo_Start("9 sided");
6334   Undo_AddBrushList(&selected_brushes);
6335   Brush_MakeSided(9);
6336   Undo_EndBrushList(&selected_brushes);
6337   Undo_End();
6338 }
6339
6340 void MainFrame::OnBrushArbitrarysided() 
6341 {
6342   Undo_Start("arbitrary sided");
6343   Undo_AddBrushList(&selected_brushes);
6344   DoSides();
6345   Undo_EndBrushList(&selected_brushes);
6346   Undo_End();
6347 }
6348
6349 void MainFrame::OnBrushMakecone() 
6350 {
6351   Undo_Start("make cone");
6352   Undo_AddBrushList(&selected_brushes);
6353   DoSides(true);
6354   Undo_EndBrushList(&selected_brushes);
6355   Undo_End();
6356 }
6357
6358 void MainFrame::OnBrushPrimitivesSphere() 
6359 {
6360   Undo_Start("make sphere");
6361   Undo_AddBrushList(&selected_brushes);
6362
6363   DoSides(false, true);
6364
6365   Undo_EndBrushList(&selected_brushes);
6366   Undo_End();
6367 }
6368
6369 void MainFrame::OnCurvePatchtube() 
6370 {
6371   Undo_Start("make curve cylinder");
6372   Undo_AddBrushList(&selected_brushes);
6373   Patch_BrushToMesh(false);
6374   Sys_UpdateWindows (W_ALL);
6375   Undo_EndBrushList(&selected_brushes);
6376   Undo_End();
6377 }
6378
6379 void MainFrame::OnCurvePatchdensetube() 
6380 {
6381   Undo_Start("dense cylinder");
6382   Undo_AddBrushList(&selected_brushes);
6383
6384   Patch_BrushToMesh(false);
6385   OnCurveInsertAddrow();
6386   Sys_UpdateWindows (W_ALL);
6387
6388   Undo_EndBrushList(&selected_brushes);
6389   Undo_End();
6390 }
6391
6392 void MainFrame::OnCurvePatchverydensetube() 
6393 {
6394   Undo_Start("very dense cylinder");
6395   Undo_AddBrushList(&selected_brushes);
6396
6397   Patch_BrushToMesh(false);
6398   OnCurveInsertAddrow();
6399   OnCurveInsertInsertrow();
6400   OnCurveInsertAddrow();
6401   Sys_UpdateWindows (W_ALL);
6402
6403   Undo_EndBrushList(&selected_brushes);
6404   Undo_End();
6405 }
6406
6407 void MainFrame::OnCurvePatchsquare() 
6408 {
6409   Undo_Start("square cylinder");
6410   Undo_AddBrushList(&selected_brushes);
6411
6412   Patch_BrushToMesh(false, false, false, true);
6413   Sys_UpdateWindows (W_ALL);
6414
6415   Undo_EndBrushList(&selected_brushes);
6416   Undo_End();
6417 }
6418
6419 void MainFrame::OnCurvePatchendcap() 
6420 {
6421   Undo_Start("make end cap");
6422   Undo_AddBrushList(&selected_brushes);
6423   Patch_BrushToMesh(false, false, true);
6424   Sys_UpdateWindows (W_ALL);
6425   Undo_EndBrushList(&selected_brushes);
6426   Undo_End();
6427 }
6428
6429 void MainFrame::OnCurvePatchbevel() 
6430 {
6431   Undo_Start("make bevel");
6432   Undo_AddBrushList(&selected_brushes);
6433   Patch_BrushToMesh(false, true, false);
6434   Sys_UpdateWindows (W_ALL);
6435   Undo_EndBrushList(&selected_brushes);
6436   Undo_End();
6437 }
6438
6439 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel() 
6440 {
6441   Undo_Start("square bevel");
6442   Undo_AddBrushList(&selected_brushes);
6443
6444   Patch_BrushToMesh(false, true, false, true);
6445   Sys_UpdateWindows (W_ALL);
6446
6447   Undo_EndBrushList(&selected_brushes);
6448   Undo_End();
6449 }
6450
6451 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap() 
6452 {
6453   Undo_Start("square endcap");
6454   Undo_AddBrushList(&selected_brushes);
6455
6456   Patch_BrushToMesh(false, false, true, true);
6457   Sys_UpdateWindows (W_ALL);
6458
6459   Undo_EndBrushList(&selected_brushes);
6460   Undo_End();
6461 }
6462
6463 void MainFrame::OnCurvePatchcone() 
6464 {
6465   Undo_Start("make curve cone");
6466   Undo_AddBrushList(&selected_brushes);
6467   Patch_BrushToMesh(true);
6468   Sys_UpdateWindows (W_ALL);
6469   Undo_EndBrushList(&selected_brushes);
6470   Undo_End();
6471 }
6472
6473 void MainFrame::OnCurveSimplepatchmesh() 
6474 {
6475   Undo_Start("make simpe patch mesh");
6476   Undo_AddBrushList(&selected_brushes);
6477   DoNewPatchDlg ();
6478   Undo_EndBrushList(&selected_brushes);
6479   Undo_End();
6480 }
6481
6482 void MainFrame::OnCurveInsertInsertcolumn() 
6483 {
6484   Undo_Start("insert (2) columns");
6485   Undo_AddBrushList(&selected_brushes);
6486   Patch_AdjustSelected(true, true, false);
6487   Sys_UpdateWindows(W_ALL);
6488   Undo_EndBrushList(&selected_brushes);
6489   Undo_End();
6490 }
6491
6492 void MainFrame::OnCurveInsertAddcolumn() 
6493 {
6494   Undo_Start("add (2) columns");
6495   Undo_AddBrushList(&selected_brushes);
6496   Patch_AdjustSelected(true, true, true);
6497   Sys_UpdateWindows(W_ALL);
6498   Undo_EndBrushList(&selected_brushes);
6499   Undo_End();
6500 }
6501
6502 void MainFrame::OnCurveInsertInsertrow() 
6503 {
6504   Undo_Start("insert (2) rows");
6505   Undo_AddBrushList(&selected_brushes);
6506   Patch_AdjustSelected(true, false, false);
6507   Sys_UpdateWindows(W_ALL);
6508   Undo_EndBrushList(&selected_brushes);
6509   Undo_End();
6510 }
6511
6512 void MainFrame::OnCurveInsertAddrow() 
6513 {
6514   Undo_Start("add (2) rows");
6515   Undo_AddBrushList(&selected_brushes);
6516   Patch_AdjustSelected(true, false, true);
6517   Sys_UpdateWindows(W_ALL);
6518   Undo_EndBrushList(&selected_brushes);
6519   Undo_End();
6520 }
6521
6522 void MainFrame::OnCurveDeleteFirstcolumn() 
6523 {
6524   Undo_Start("delete first (2) columns");
6525   Undo_AddBrushList(&selected_brushes);
6526   Patch_AdjustSelected(false, true, true);
6527   Sys_UpdateWindows(W_ALL);
6528   Undo_EndBrushList(&selected_brushes);
6529   Undo_End();
6530 }
6531
6532 void MainFrame::OnCurveDeleteLastcolumn() 
6533 {
6534   Undo_Start("delete last (2) columns");
6535   Undo_AddBrushList(&selected_brushes);
6536   Patch_AdjustSelected(false, true, false);
6537   Sys_UpdateWindows(W_ALL);
6538   Undo_EndBrushList(&selected_brushes);
6539   Undo_End();
6540 }
6541
6542 void MainFrame::OnCurveDeleteFirstrow() 
6543 {
6544   Undo_Start("delete first (2) rows");
6545   Undo_AddBrushList(&selected_brushes);
6546   Patch_AdjustSelected(false, false, true);
6547   Sys_UpdateWindows(W_ALL);
6548   Undo_EndBrushList(&selected_brushes);
6549   Undo_End();
6550 }
6551
6552 void MainFrame::OnCurveDeleteLastrow() 
6553 {
6554   Undo_Start("delete last (2) rows");
6555   Undo_AddBrushList(&selected_brushes);
6556   Patch_AdjustSelected(false, false, false);
6557   Sys_UpdateWindows(W_ALL);
6558   Undo_EndBrushList(&selected_brushes);
6559   Undo_End();
6560 }
6561
6562 void MainFrame::OnCurveNegative() 
6563 {
6564   Patch_ToggleInverted();
6565   //Sys_UpdateWindows(W_ALL);
6566 }
6567
6568 void MainFrame::OnCurveRedisperseRows() 
6569 {
6570   Undo_Start("redisperse rows");
6571   Undo_AddBrushList(&selected_brushes);
6572   Patch_DisperseRows();
6573   Sys_UpdateWindows (W_ALL);
6574   Undo_EndBrushList(&selected_brushes);
6575   Undo_End();
6576 }
6577
6578 void MainFrame::OnCurveRedisperseIntermediateCols() 
6579 {
6580   Undo_Start("redisperse im cols");
6581   Undo_AddBrushList(&selected_brushes);
6582   Patch_DisperseIntermediateColumns();
6583   Sys_UpdateWindows (W_ALL);
6584   Undo_EndBrushList(&selected_brushes);
6585   Undo_End();
6586 }
6587
6588 void MainFrame::OnCurveRedisperseIntermediateRows() 
6589 {
6590   Undo_Start("redisperse im rows");
6591   Undo_AddBrushList(&selected_brushes);
6592   Patch_DisperseIntermediateRows();
6593   Sys_UpdateWindows (W_ALL);
6594   Undo_EndBrushList(&selected_brushes);
6595   Undo_End();
6596 }
6597
6598 void MainFrame::OnCurveMatrixTranspose() 
6599 {
6600   Patch_Transpose();
6601   Sys_UpdateWindows (W_ALL);
6602 }
6603
6604 void MainFrame::OnCurveCap() 
6605 {
6606   Patch_CapCurrent();
6607   Sys_UpdateWindows (W_ALL);
6608 }
6609
6610 void MainFrame::OnCurveCyclecap() 
6611 {
6612   Patch_CycleCapSelected();
6613   Sys_UpdateWindows (W_ALL);
6614 }
6615
6616 void MainFrame::OnCurveOverlaySet() 
6617 {
6618   Patch_SetOverlays();
6619   Sys_UpdateWindows(W_ALL);
6620 }
6621
6622 void MainFrame::OnCurveOverlayClear() 
6623 {
6624   Patch_ClearOverlays();
6625   Sys_UpdateWindows(W_ALL);
6626 }
6627
6628 void MainFrame::OnCurveThicken() 
6629 {
6630   Undo_Start("curve thicken");
6631   Undo_AddBrushList(&selected_brushes);
6632   DoThickenDlg ();
6633   Undo_EndBrushList(&selected_brushes);
6634   Undo_End();
6635 }
6636
6637 /*!
6638 this can no longer be trigger manually from the menu
6639 happens only once at startup
6640 */
6641 void MainFrame::OnPluginsRefresh() 
6642 {
6643   CleanPlugInMenu();
6644   m_PlugInMgr.Init();
6645 }
6646
6647 // open the Q3Rad manual
6648 void MainFrame::OnHelp() 
6649 {
6650   // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6651   Str help;
6652   help = g_strAppPath;
6653   help += "Q3Rad_Manual/index.htm";
6654   OpenURL(help.GetBuffer());
6655 }
6656
6657 // FIXME: we'll go towards a unified help thing soon
6658 void MainFrame::OnHelpLinks() 
6659 {
6660   Str link;
6661   link = g_strAppPath;
6662   link += "links.htm";
6663   OpenURL(link.GetBuffer());
6664 }
6665
6666 void MainFrame::OnHelpBugreport() 
6667 {
6668   OpenURL("http://www.qeradiant.com/faq/fom-serve/cache/138.html");
6669 }
6670
6671 void MainFrame::OnHelpCommandlist() 
6672 {
6673   DoCommandListDlg ();
6674 }
6675
6676 void MainFrame::OnHelpAbout() 
6677 {
6678   DoAbout();
6679 }
6680
6681 void MainFrame::OnPopupSelection() 
6682 {
6683   GtkWidget *menu, *item;
6684   char *labels[] = { "Select Complete Tall", "Select Touching", "Select Partial Tall", "Select Inside"};
6685   int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6686     ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6687
6688   menu = gtk_menu_new ();
6689
6690   for (int i = 0; i < 4; i++)
6691   {
6692     item = gtk_menu_item_new_with_label (labels[i]);
6693     gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (HandleCommand),
6694                         GINT_TO_POINTER (ids[i]));
6695     gtk_widget_show (item);
6696     gtk_menu_append (GTK_MENU (menu), item);
6697   }
6698
6699   gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6700 }
6701
6702 void MainFrame::OnViewChange() 
6703 {
6704   OnViewNextview();
6705   //HandlePopup(this, IDR_POPUP_VIEW); 
6706 }
6707
6708 void MainFrame::OnTexturesPopup() 
6709 {
6710   gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "render_quality_menu");
6711   gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6712 }
6713
6714 void MainFrame::ToggleCamera()
6715 {
6716   if (m_bCamPreview)
6717     m_bCamPreview = false;
6718   else
6719     m_bCamPreview = true;
6720 }
6721
6722 void MainFrame::OnViewCameraupdate() 
6723 {
6724   Sys_UpdateWindows(W_CAMERA);
6725 }
6726
6727 void MainFrame::OnSelectMouserotate() 
6728 {
6729   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mouserotate"));
6730   g_bIgnoreCommands++;
6731
6732   if (ActiveXY())
6733   {
6734     if (ActiveXY()->ClipMode())
6735       OnViewClipper();
6736     if (ActiveXY()->RotateMode())
6737     {
6738       // SetRotateMode(false) always works
6739       ActiveXY()->SetRotateMode(false);
6740       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6741     } else
6742     {
6743       // may not work if no brush selected, see return value
6744       if (ActiveXY()->SetRotateMode(true))
6745         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6746       else
6747         // if MFC called, we need to set back to FALSE ourselves
6748         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6749     }
6750   }
6751   g_bIgnoreCommands--;
6752 }
6753
6754 void MainFrame::OnSelectMousescale() 
6755 {
6756   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mousescale"));
6757   g_bIgnoreCommands++;
6758
6759   if (ActiveXY())
6760   {
6761     if (ActiveXY()->ClipMode())
6762       OnViewClipper();
6763     if (ActiveXY()->RotateMode())
6764     {
6765       // SetRotateMode(false) always works
6766       ActiveXY()->SetRotateMode(false);
6767       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6768     }
6769     if (ActiveXY()->ScaleMode())
6770     {
6771       ActiveXY()->SetScaleMode(false);
6772       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6773     } else
6774     {
6775       ActiveXY()->SetScaleMode(true);
6776       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6777     }
6778   }
6779   g_bIgnoreCommands--;
6780 }
6781
6782 void MainFrame::OnScalelockx() 
6783 {
6784   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockx"));
6785   g_bIgnoreCommands++;
6786
6787   if (g_nScaleHow & SCALE_X)
6788   {
6789     g_nScaleHow ^= SCALE_X;
6790     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6791   } else
6792   {
6793     g_nScaleHow |= SCALE_X;
6794     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6795   }
6796   g_bIgnoreCommands--;
6797 }
6798
6799 void MainFrame::OnScalelocky() 
6800 {
6801   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelocky"));
6802   g_bIgnoreCommands++;
6803
6804   if (g_nScaleHow & SCALE_Y)
6805   {
6806     g_nScaleHow ^= SCALE_Y;
6807     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6808   } else
6809   {
6810     g_nScaleHow |= SCALE_Y;
6811     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6812   }
6813   g_bIgnoreCommands--;
6814 }
6815
6816 void MainFrame::OnScalelockz() 
6817 {
6818   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockz"));
6819   g_bIgnoreCommands++;
6820
6821   if (g_nScaleHow & SCALE_Z)
6822   {
6823     g_nScaleHow ^= SCALE_Z;
6824     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6825   } else
6826   {
6827     g_nScaleHow |= SCALE_Z;
6828     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6829   }
6830   g_bIgnoreCommands--;
6831 }
6832
6833 void MainFrame::OnDontselectcurve() 
6834 {
6835   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
6836   g_bIgnoreCommands++;
6837   g_PrefsDlg.m_bSelectCurves ^= 1;
6838   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
6839   g_bIgnoreCommands--;
6840 }
6841
6842 void MainFrame::OnPatchToggleBox()
6843 {
6844   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
6845   g_bIgnoreCommands++;
6846   g_bPatchShowBounds ^= 1;
6847   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
6848   g_bIgnoreCommands--;
6849   Sys_UpdateWindows(W_ALL);
6850 }
6851
6852 void MainFrame::OnPatchWireframe() 
6853 {
6854   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_wireframe"));
6855   g_bIgnoreCommands++;
6856   g_bPatchWireFrame ^= 1;
6857   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWireFrame) ? TRUE : FALSE);
6858   g_bIgnoreCommands--;
6859   Sys_UpdateWindows(W_ALL);
6860 }
6861
6862 void MainFrame::OnPatchBend() 
6863 {
6864   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
6865   g_bIgnoreCommands++;
6866   Patch_BendToggle();
6867   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
6868   g_bIgnoreCommands--;
6869   Sys_UpdateWindows(W_ALL);
6870 }
6871
6872 void MainFrame::OnPatchWeld() 
6873 {
6874   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
6875   g_bIgnoreCommands++;
6876   g_bPatchWeld ^= 1;
6877   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
6878   g_bIgnoreCommands--;
6879   Sys_UpdateWindows(W_ALL);
6880 }
6881
6882 void MainFrame::OnPatchDrilldown() 
6883 {
6884   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
6885   g_bIgnoreCommands++;
6886   g_bPatchDrillDown ^= 1;
6887   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
6888   g_bIgnoreCommands--;
6889   Sys_UpdateWindows(W_ALL);
6890 }
6891
6892 void MainFrame::OnShowEntities() 
6893 {
6894   gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "view_entitiesas_menu"); // use pointer to existing menu object
6895   gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6896 }
6897
6898 void MainFrame::OnDropGroupName() 
6899 {
6900   /*
6901   char* name = DoNameDlg ("Name Selection");
6902
6903   if (name != NULL)
6904   {
6905     Select_Name (name);
6906     Sys_UpdateWindows (W_ALL);
6907     free (name);
6908   }
6909   */
6910 }
6911
6912 void MainFrame::OnDropGroupNewgroup() 
6913 {
6914
6915 }
6916
6917 void MainFrame::OnDropGroupRemove() 
6918 {
6919   /*
6920   Select_AddToGroup("World");
6921   Sys_UpdateWindows (W_ALL);
6922   */
6923 }
6924
6925 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6926 void MainFrame::OnFaceFit()
6927 {
6928   SurfaceDlgFitAll();
6929 }
6930
6931 void MainFrame::OnDontselectmodel() 
6932 {
6933   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
6934   g_bIgnoreCommands++;
6935   g_PrefsDlg.m_bSelectModels ^= 1;
6936   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
6937   g_bIgnoreCommands--;
6938 }
6939
6940 void MainFrame::OnViewTexture() 
6941 {
6942   if (FloatingGroupDialog()) // QE4 style
6943   {
6944     if (inspector_mode == W_TEXTURE)
6945     {
6946       if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
6947         widget_delete_hide (g_qeglobals_gui.d_entity);
6948       else
6949         gtk_widget_show (g_qeglobals_gui.d_entity);
6950     } else
6951     {
6952       gtk_widget_show (g_qeglobals_gui.d_entity);
6953       SetInspectorMode (W_TEXTURE);
6954     }
6955   }
6956 }
6957
6958 void MainFrame::OnPatchInspector()
6959 {
6960   TogglePatchInspector();
6961 }
6962
6963 void MainFrame::OnCurveNegativeTextureX() 
6964 {
6965   Patch_InvertTexture(false);
6966   //Sys_UpdateWindows(W_ALL);
6967 }
6968
6969 void MainFrame::OnCurveNegativeTextureY() 
6970 {
6971   Patch_InvertTexture(true);
6972   //Sys_UpdateWindows(W_ALL);
6973 }
6974
6975 void MainFrame::OnCurveInsertcolumn()
6976 {
6977   if (&selected_brushes == selected_brushes.next)
6978     return;
6979   Undo_Start("insert colum");
6980   Undo_AddBrushList(&selected_brushes);
6981   //Patch_AdjustSelectedRowCols(0, 2);
6982   Patch_AdjustSelected(true, true, true);
6983   Sys_UpdateWindows(W_ALL);
6984   Undo_EndBrushList(&selected_brushes);
6985   Undo_End();
6986 }
6987
6988 void MainFrame::OnCurveInsertrow()
6989 {
6990   if (&selected_brushes == selected_brushes.next)
6991     return;
6992   Undo_Start("insert row");
6993   Undo_AddBrushList(&selected_brushes);
6994   //Patch_AdjustSelectedRowCols(2, 0);
6995   Patch_AdjustSelected(true, false, true);
6996   Sys_UpdateWindows(W_ALL);
6997   Undo_EndBrushList(&selected_brushes);
6998   Undo_End();
6999 }
7000
7001 void MainFrame::OnCurveDeletecolumn() 
7002 {
7003   if (&selected_brushes == selected_brushes.next)
7004     return;
7005   Undo_Start("delete column");
7006   Undo_AddBrushList(&selected_brushes);
7007   Patch_AdjustSelected(false, true, true);
7008   Sys_UpdateWindows(W_ALL);
7009   Undo_EndBrushList(&selected_brushes);
7010   Undo_End();
7011 }
7012
7013 void MainFrame::OnCurveDeleterow() 
7014 {
7015   if (&selected_brushes == selected_brushes.next)
7016     return;
7017   Undo_Start("delete row");
7018   Undo_AddBrushList(&selected_brushes);
7019   Patch_AdjustSelected(false, false, true);
7020   Sys_UpdateWindows(W_ALL);
7021   Undo_EndBrushList(&selected_brushes);
7022   Undo_End();
7023 }
7024
7025 void MainFrame::OnPatchTab() 
7026 {
7027   if (g_bPatchBendMode)
7028     Patch_BendHandleTAB();
7029 //  else if (g_bPatchInsertMode)
7030 //    Patch_InsDelHandleTAB();
7031   else
7032   {
7033     // check to see if the selected brush is part of a func group
7034     // if it is, deselect everything and reselect the next brush 
7035     // in the group
7036     brush_t *b2, *b = selected_brushes.next;
7037     entity_t * e;
7038     if (b != &selected_brushes)
7039     {
7040       if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7041       {
7042         e = b->owner;
7043         Select_Deselect();
7044         for (b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext)
7045         {
7046           if (b == b2)
7047           {
7048             b2 = b2->onext;
7049             break;
7050           }
7051         }
7052         if (b2 == &e->brushes)
7053           b2 = b2->onext;
7054
7055         Select_Brush(b2, false);
7056         Sys_UpdateWindows(W_ALL);
7057       }
7058     }
7059   }
7060 }
7061
7062 void MainFrame::OnCameraForward(bool keydown) 
7063 {
7064   if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7065   {
7066     if(keydown)
7067     {
7068       VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7069       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7070       Sys_UpdateWindows (nUpdate);
7071     }
7072   }
7073   else {
7074     if (keydown)
7075       m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
7076     else
7077       m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
7078   }
7079 }
7080
7081 void MainFrame::OnCameraBack(bool keydown) 
7082 {
7083   if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7084   {
7085     if(keydown)
7086     {
7087       VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7088       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7089       Sys_UpdateWindows (nUpdate);
7090     }
7091   }
7092   else {
7093     if (keydown)
7094       m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
7095     else
7096       m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
7097   }
7098 }
7099
7100 void MainFrame::OnCameraLeft(bool keydown) 
7101 {
7102   if (m_pCamWnd)
7103   {
7104     if (m_pCamWnd->m_bFreeMove)
7105     {
7106       OnCameraStrafeleft(keydown);
7107       return;
7108     }
7109   }
7110
7111   if (g_PrefsDlg.m_bCamDiscrete)
7112   {
7113     if(keydown)
7114     {
7115       m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
7116       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7117       Sys_UpdateWindows (nUpdate);
7118     }
7119   }
7120   else {
7121     if (keydown)
7122       m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
7123     else
7124       m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
7125   }
7126 }
7127
7128 void MainFrame::OnCameraRight(bool keydown) 
7129 {
7130   if (m_pCamWnd)
7131   {
7132     if (m_pCamWnd->m_bFreeMove)
7133     {
7134       OnCameraStraferight(keydown);
7135       return;
7136     }
7137   }
7138
7139   if (g_PrefsDlg.m_bCamDiscrete)
7140   {
7141     if(keydown)
7142     {
7143       m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
7144       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7145       Sys_UpdateWindows (nUpdate);
7146     }
7147   }
7148   else {
7149     if (keydown)
7150       m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
7151     else
7152       m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
7153   }
7154 }
7155
7156 void MainFrame::OnCameraUp() 
7157 {
7158   m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
7159   int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7160   Sys_UpdateWindows (nUpdate);
7161 }
7162
7163 void MainFrame::OnCameraDown() 
7164 {
7165   m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
7166   int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7167   Sys_UpdateWindows (nUpdate);
7168 }
7169
7170 void MainFrame::OnCameraAngleup() 
7171 {
7172   m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
7173   if (m_pCamWnd->Camera()->angles[0] > 85)
7174     m_pCamWnd->Camera()->angles[0] = 85;
7175   Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7176 }
7177
7178 void MainFrame::OnCameraAngledown() 
7179 {
7180   m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
7181   if (m_pCamWnd->Camera()->angles[0] < -85)
7182     m_pCamWnd->Camera()->angles[0] = -85;
7183   Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7184 }
7185
7186 void MainFrame::OnCameraStrafeleft(bool keydown) 
7187 {
7188   // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7189   if (m_pCamWnd)
7190   {
7191     if (!m_pCamWnd->m_bFreeMove)
7192     {
7193       if(keydown)
7194       {
7195         VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7196         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7197         Sys_UpdateWindows (nUpdate);
7198       }
7199       return;
7200     }
7201   }
7202
7203   if (keydown)
7204     m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
7205   else
7206     m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7207 }
7208
7209 void MainFrame::OnCameraStraferight(bool keydown) 
7210 {
7211   // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7212   if (m_pCamWnd)
7213   {
7214     if (!m_pCamWnd->m_bFreeMove)
7215     {
7216       if(keydown)
7217       {
7218         VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7219         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7220         Sys_UpdateWindows (nUpdate);
7221       }
7222       return;
7223     }
7224   }
7225
7226   if (keydown)
7227     m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7228   else
7229     m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7230 }
7231
7232 void MainFrame::OnGridToggle() 
7233 {
7234   g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7235   Sys_UpdateWindows (W_XY|W_Z);
7236 }
7237
7238 void MainFrame::OnViewCrosshair() 
7239 {
7240   g_bCrossHairs ^= 1; 
7241   Sys_UpdateWindows (W_XY);
7242 }
7243
7244 void MainFrame::OnSelectionTextureRotateclock() 
7245 {
7246   Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
7247 }
7248
7249 void MainFrame::OnSelectionTextureRotatecounter() 
7250 {
7251   Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
7252 }
7253
7254 void MainFrame::OnSelectionTextureScaleup() 
7255 {
7256   Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7257 }
7258
7259 void MainFrame::OnSelectionTextureScaledown() 
7260 {
7261   Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7262 }
7263
7264 void MainFrame::OnSelectionTextureScaleLeft() 
7265 {
7266   Select_ScaleTexture(-g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7267 }
7268
7269 void MainFrame::OnSelectionTextureScaleRight() 
7270 {
7271   Select_ScaleTexture(g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7272 }
7273
7274 void MainFrame::OnSelectionTextureShiftleft() 
7275 {
7276   Select_ShiftTexture((int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7277 }
7278
7279 void MainFrame::OnSelectionTextureShiftright() 
7280 {
7281   Select_ShiftTexture((int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7282 }
7283
7284 void MainFrame::OnSelectionTextureShiftup() 
7285 {
7286   Select_ShiftTexture(0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7287 }
7288
7289 void MainFrame::OnSelectionTextureShiftdown() 
7290 {
7291   Select_ShiftTexture(0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7292 }
7293
7294 void MainFrame::OnGridPrev() 
7295 {
7296   GtkWidget *item;
7297   if (g_qeglobals.d_gridsize == 1)
7298   {
7299     g_qeglobals.d_gridsize = 0.5;
7300     g_qeglobals.d_bSmallGrid = true;
7301     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7302   } else if (g_qeglobals.d_gridsize == 0.5)
7303   {
7304     g_qeglobals.d_gridsize = 0.25;
7305     g_qeglobals.d_bSmallGrid = true;
7306     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_025"));
7307   } else if (g_qeglobals.d_gridsize > 1)
7308   {
7309     g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7310     g_qeglobals.d_bSmallGrid = false;
7311
7312     switch ((int)g_qeglobals.d_gridsize)
7313     {
7314     case  1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7315     case  2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7316     case  4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7317     case  8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7318     case  16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7319     case  32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7320     case  64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7321     case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7322     case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7323     }
7324
7325   } else
7326     return;
7327
7328   // SnapTToGrid option: need to check everywhere the grid size is changed
7329   // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7330   if (g_PrefsDlg.m_bSnapTToGrid)
7331     DoSnapTToGrid();
7332
7333   SetGridStatus();
7334   g_bIgnoreCommands++;
7335   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7336   g_bIgnoreCommands--;
7337
7338   Sys_UpdateWindows(W_XY | W_Z);
7339 }
7340
7341 void MainFrame::OnGridNext() 
7342 {
7343   GtkWidget *item;
7344   if (g_qeglobals.d_gridsize == 0.25)
7345   {
7346     g_qeglobals.d_gridsize = 0.5;
7347     g_qeglobals.d_bSmallGrid = true;
7348     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7349   } else if (g_qeglobals.d_gridsize == 0.5)
7350   {
7351     g_qeglobals.d_gridsize = 1;
7352     g_qeglobals.d_bSmallGrid = false;
7353     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1"));
7354   } else if (g_qeglobals.d_gridsize < 256)
7355   {
7356     g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7357     g_qeglobals.d_bSmallGrid = false;
7358
7359     switch ((int)g_qeglobals.d_gridsize)
7360     {
7361     case  1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7362     case  2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7363     case  4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7364     case  8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7365     case  16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7366     case  32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7367     case  64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7368     case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7369     case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7370     }
7371
7372   } else
7373     return;
7374
7375   // SnapTToGrid option: need to check everywhere the grid size is changed
7376   // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7377   if (g_PrefsDlg.m_bSnapTToGrid)
7378     DoSnapTToGrid();
7379
7380   SetGridStatus();
7381   g_bIgnoreCommands++;
7382   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7383   g_bIgnoreCommands--;
7384
7385   Sys_UpdateWindows(W_XY | W_Z);
7386 }
7387
7388 void MainFrame::OnSelectionMovedown() 
7389 {
7390   if (&selected_brushes == selected_brushes.next)
7391     return;
7392   Undo_Start("move down");
7393   Undo_AddBrushList(&selected_brushes);
7394
7395   vec3_t vAmt;
7396   vAmt[0] = vAmt[1] = 0.0;
7397   vAmt[2] = -g_qeglobals.d_gridsize;
7398   Select_Move (vAmt);
7399   Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7400
7401   Undo_EndBrushList(&selected_brushes);
7402   Undo_End();
7403 }
7404
7405 void MainFrame::OnSelectionMoveup() 
7406 {
7407   if (&selected_brushes == selected_brushes.next)
7408     return;
7409   Undo_Start("move up");
7410   Undo_AddBrushList(&selected_brushes);
7411
7412   vec3_t vAmt;
7413   vAmt[0] = vAmt[1] = 0.0;
7414   vAmt[2] = g_qeglobals.d_gridsize;
7415   Select_Move (vAmt);
7416   Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7417
7418   Undo_EndBrushList(&selected_brushes);
7419   Undo_End();
7420 }
7421
7422 void MainFrame::OnSelectionPrint() 
7423 {
7424   for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
7425     Brush_Print(b);
7426 }
7427
7428 void MainFrame::OnSelectionTogglesizepaint() 
7429 {
7430   g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7431   Sys_UpdateWindows(W_XY);
7432 }
7433
7434 void MainFrame::OnPatchNaturalize()
7435 {
7436   Patch_NaturalizeSelected();
7437   Sys_UpdateWindows (W_ALL);
7438 }
7439
7440 void MainFrame::OnSnapToGrid()
7441 {
7442   if (&selected_brushes == selected_brushes.next)
7443     return;
7444   Undo_Start("snap selection to grid");
7445   Undo_AddBrushList(&selected_brushes);
7446   //Select_SnapToGrid();
7447   for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
7448   {
7449     if (pb->patchBrush)
7450       Patch_SnapToGrid(pb->pPatch);
7451     else
7452       Brush_SnapToGrid(pb);
7453   }
7454   Sys_UpdateWindows (W_ALL);
7455   Undo_EndBrushList(&selected_brushes);
7456   Undo_End();
7457 }
7458
7459 void MainFrame::OnSelectAll()
7460 {
7461   Select_AllOfType();
7462 }
7463
7464 void MainFrame::OnSelectionInvert()
7465 {
7466   Select_Invert();
7467   Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
7468 }
7469
7470
7471 void PerformFiltering ()
7472 {
7473   brush_t *brush;
7474
7475   // spog - deletes old filters list and creates new one when
7476   // g_qeglobals.d_savedinfo.exclude is updated
7477   g_qeglobals.d_savedinfo.filters = FilterListDelete(g_qeglobals.d_savedinfo.filters);
7478   g_qeglobals.d_savedinfo.filters = FilterUpdate(g_qeglobals.d_savedinfo.filters);
7479
7480   for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7481     brush->bFiltered = FilterBrush( brush );
7482
7483   for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7484     brush->bFiltered = FilterBrush( brush );
7485 }
7486
7487 void MainFrame::OnFilterAreaportals() 
7488 {
7489   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
7490   g_bIgnoreCommands++;
7491   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS) & EXCLUDE_AREAPORTALS)
7492     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7493   else
7494     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7495   g_bIgnoreCommands--;
7496   PerformFiltering();
7497   Sys_UpdateWindows (W_XY|W_CAMERA);
7498 }
7499
7500 void MainFrame::OnFilterCaulk() 
7501 {
7502   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
7503   g_bIgnoreCommands++;
7504   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK)
7505     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7506   else
7507     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7508   g_bIgnoreCommands--;
7509   PerformFiltering();
7510   Sys_UpdateWindows (W_XY|W_CAMERA);
7511 }
7512
7513 void MainFrame::OnFilterClips() 
7514 {
7515   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
7516   g_bIgnoreCommands++;
7517   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP)
7518     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7519   else
7520     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7521   g_bIgnoreCommands--;
7522   PerformFiltering();
7523   Sys_UpdateWindows (W_XY|W_CAMERA);
7524 }
7525
7526 void MainFrame::OnFilterBotClips()
7527 {
7528   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
7529   g_bIgnoreCommands++;
7530   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP) & EXCLUDE_BOTCLIP)
7531     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7532   else
7533     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7534   g_bIgnoreCommands--;
7535   PerformFiltering();
7536   Sys_UpdateWindows (W_XY|W_CAMERA);
7537 }
7538
7539 void MainFrame::OnFilterStructural() 
7540 {
7541   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
7542   g_bIgnoreCommands++;
7543   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL) & EXCLUDE_STRUCTURAL)
7544     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7545   else
7546     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7547   g_bIgnoreCommands--;
7548   PerformFiltering();
7549   Sys_UpdateWindows (W_XY|W_CAMERA);
7550 }
7551
7552 void MainFrame::OnFilterDetails() 
7553 {
7554   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
7555   g_bIgnoreCommands++;
7556   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS) & EXCLUDE_DETAILS)
7557     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7558   else
7559     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7560   g_bIgnoreCommands--;
7561   PerformFiltering();
7562   Sys_UpdateWindows (W_XY|W_CAMERA);
7563 }
7564
7565 void MainFrame::OnFilterEntities() 
7566 {
7567   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
7568   g_bIgnoreCommands++;
7569   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT)
7570     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7571   else
7572     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7573   g_bIgnoreCommands--;
7574   PerformFiltering();
7575   Sys_UpdateWindows (W_XY|W_CAMERA);
7576 }
7577
7578 void MainFrame::OnFilterHintsskips() 
7579 {
7580   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
7581   g_bIgnoreCommands++;
7582   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS) & EXCLUDE_HINTSSKIPS)
7583     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7584   else
7585     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7586   g_bIgnoreCommands--;
7587   PerformFiltering();
7588   Sys_UpdateWindows (W_XY|W_CAMERA);
7589 }
7590
7591 void MainFrame::OnFilterLights() 
7592 {
7593   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
7594   g_bIgnoreCommands++;
7595   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS)
7596     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7597   else
7598     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7599   g_bIgnoreCommands--;
7600   PerformFiltering();
7601   Sys_UpdateWindows (W_XY|W_CAMERA);
7602 }
7603
7604 void MainFrame::OnFilterLiquids() 
7605 {
7606   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
7607   g_bIgnoreCommands++;
7608   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS) & EXCLUDE_LIQUIDS)
7609     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7610   else
7611     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7612   g_bIgnoreCommands--;
7613   PerformFiltering();
7614   Sys_UpdateWindows (W_XY|W_CAMERA);
7615 }
7616
7617 void MainFrame::OnFilterModels() 
7618 {
7619   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
7620   g_bIgnoreCommands++;
7621   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS) & EXCLUDE_MODELS)
7622     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7623   else
7624     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7625   g_bIgnoreCommands--;
7626   PerformFiltering();
7627   Sys_UpdateWindows (W_XY|W_CAMERA);
7628 }
7629
7630 void MainFrame::OnFilterPatches() 
7631 {
7632   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
7633   g_bIgnoreCommands++;
7634   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES)
7635     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7636   else
7637     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7638   g_bIgnoreCommands--;
7639   PerformFiltering();
7640   Sys_UpdateWindows (W_XY|W_CAMERA);
7641 }
7642
7643 void MainFrame::OnFilterPaths() 
7644 {
7645   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
7646   g_bIgnoreCommands++;
7647   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS)
7648     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7649   else
7650     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7651   g_bIgnoreCommands--;
7652   PerformFiltering();
7653   Sys_UpdateWindows (W_XY|W_CAMERA);
7654 }
7655
7656 void MainFrame::OnFilterClusterportals() 
7657 {
7658   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
7659   g_bIgnoreCommands++;
7660   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS) & EXCLUDE_CLUSTERPORTALS)
7661     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7662   else
7663     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7664   g_bIgnoreCommands--;
7665   PerformFiltering();
7666   Sys_UpdateWindows (W_XY|W_CAMERA);
7667 }
7668
7669 void MainFrame::OnFilterLightgrid()
7670 {
7671   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
7672   g_bIgnoreCommands++;
7673   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID) & EXCLUDE_LIGHTGRID)
7674     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7675   else
7676     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7677   g_bIgnoreCommands--;
7678   PerformFiltering();
7679   Sys_UpdateWindows (W_XY|W_CAMERA);
7680 }
7681
7682 void MainFrame::OnFilterTranslucent() 
7683 {
7684   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
7685   g_bIgnoreCommands++;
7686   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT) & EXCLUDE_TRANSLUCENT)
7687     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7688   else
7689     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7690   g_bIgnoreCommands--;
7691   PerformFiltering();
7692   Sys_UpdateWindows (W_XY|W_CAMERA);
7693 }
7694
7695 void MainFrame::OnFilterTriggers() 
7696 {
7697   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
7698   g_bIgnoreCommands++;
7699   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS)
7700     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7701   else
7702     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7703   g_bIgnoreCommands--;
7704   PerformFiltering();
7705   Sys_UpdateWindows (W_XY|W_CAMERA);
7706 }
7707
7708 void MainFrame::OnFilterWorld() 
7709 {
7710   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
7711   g_bIgnoreCommands++;
7712   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD)
7713     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7714   else
7715     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7716   g_bIgnoreCommands--;
7717   PerformFiltering();
7718   Sys_UpdateWindows (W_XY|W_CAMERA);
7719 }
7720
7721
7722
7723
7724
7725
7726
7727
7728 // =============================================================================
7729 // leo: Unused functions, not called anywhere from the code (need to check)
7730
7731 void MainFrame::OnViewConsole() 
7732 {
7733   if (FloatingGroupDialog()) // QE4 style
7734   {
7735     if (inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating) // are we in console mode already?
7736     {
7737       if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
7738         widget_delete_hide (g_qeglobals_gui.d_entity);
7739       else
7740         gtk_widget_show (g_qeglobals_gui.d_entity);
7741     } else
7742     {
7743       gtk_widget_show (g_qeglobals_gui.d_entity);
7744       SetInspectorMode(W_CONSOLE);
7745     }
7746   }
7747 }
7748
7749 void MainFrame::OnCurveFreeze()
7750 {
7751   Patch_Freeze();
7752 }
7753
7754 void MainFrame::OnCurveUnFreeze()
7755 {
7756   Patch_UnFreeze(false);
7757 }
7758
7759 void MainFrame::OnCurveUnFreezeAll()
7760 {
7761   Patch_UnFreeze(true);
7762 }
7763
7764 void MainFrame::OnSelectReselect()
7765 {
7766   Select_Reselect();
7767 }
7768
7769 void MainFrame::OnSelectionTextureFit()
7770 {
7771   // TODO: Add your command handler code here
7772 }
7773
7774 void MainFrame::OnPatchEnter()
7775 {
7776
7777 }
7778
7779 void MainFrame::OnDropGroupAddtoWorld() 
7780 {
7781   /*
7782   Select_AddToGroup("World");
7783   Sys_UpdateWindows (W_ALL);
7784   */
7785 }