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