]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/mainframe.cpp
- Updated Windows build doc, very slight revision. Changed 37 targets to 38.
[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   {"SelectFuncGroup", 'G', 0x00, ID_SELECT_FUNC_GROUP, "menu_select_func_group"},
126   {"HideSelected", 'H', 0x00, ID_VIEW_HIDESHOW_HIDESELECTED, "menu_view_hideshow_hideselected"},
127   {"ShowHidden", 'H', 0x01, ID_VIEW_HIDESHOW_SHOWHIDDEN, "menu_view_hideshow_showhidden"},
128   {"BendMode", 'B', 0x00, ID_PATCH_BEND, "menu_patch_bend"},
129   {"FitTexture", 'B', 0x01, IDC_BTN_FACEFIT, "menu_idc_btn_facefit"},
130   {"ViewTextures", 'T', 0, ID_VIEW_TEXTURE, "menu_view_texture"},
131   {"ThickenPatch", 'T', 0x04, ID_CURVE_THICKEN, "menu_curve_thicken"},
132   {"MakeOverlayPatch", 'Y', 0, ID_CURVE_OVERLAY_SET, "menu_curve_overlay_set"},
133   {"ClearPatchOverlays", 'L', 0x04, ID_CURVE_OVERLAY_CLEAR, "menu_curve_overlay_clear"},
134   {"SurfaceInspector", 'S', 0, ID_TEXTURES_INSPECTOR, "menu_textures_inspector"},
135   {"PatchInspector", 'S', 0x01, ID_PATCH_INSPECTOR, "menu_patch_inspector"},
136   {"RedisperseRows", 'E', 0x04, ID_CURVE_REDISPERSE_ROWS, "menu_curve_redisperse_rows"},
137   {"RedisperseIntermediateCols", 'E', 0x05, ID_CURVE_REDISPERSE_INTERMEDIATE_COLS, "menu_curve_redisperse_cols"},
138   {"InvertCurveTextureX", 'I', 0x05, ID_CURVE_NEGATIVETEXTUREY, "menu_curve_negativetexturey"},
139   {"InvertCurveTextureY", 'I', 0x01, ID_CURVE_NEGATIVETEXTUREX, "menu_curve_negativetexturex"},
140   {"InvertCurve", 'I', 0x04, ID_CURVE_NEGATIVE, "menu_curve_negative"},
141   {"IncPatchColumn", GDK_KP_Add, 0x05, ID_CURVE_INSERTCOLUMN, "menu_curve_insertcolumn"},
142   {"IncPatchRow", GDK_KP_Add, 0x04, ID_CURVE_INSERTROW, "menu_curve_insertrow"},
143   {"DecPatchColumn", GDK_KP_Subtract, 0x05, ID_CURVE_DELETECOLUMN, "menu_curve_deletecolumn"},
144   {"DecPatchRow", GDK_KP_Subtract, 0x04, ID_CURVE_DELETEROW, "menu_curve_deleterow"},
145   {"Patch TAB", GDK_Tab, 0x00, ID_PATCH_TAB, "menu_patch_tab"},
146   {"Patch TAB", GDK_Tab, 0x01, ID_PATCH_TAB, "menu_patch_tab"},
147   {"SelectNudgeDown", GDK_Down, 0x02, ID_SELECTION_SELECT_NUDGEDOWN, "menu_selection_select_nudgedown"},
148   {"EntityColor",'K', 0, ID_MISC_SELECTENTITYCOLOR, "menu_misc_select_entitycolor"},
149   {"CameraForward", GDK_Up, 0, ID_CAMERA_FORWARD, "menu_camera_forward"},
150   {"CameraBack", GDK_Down, 0, ID_CAMERA_BACK, "menu_camera_back"},
151   {"CameraLeft", GDK_Left, 0, ID_CAMERA_LEFT, "menu_camera_left"},
152   {"CameraRight", GDK_Right, 0, ID_CAMERA_RIGHT, "menu_camera_right"},
153   {"CameraUp", 'D', 0, ID_CAMERA_UP, "menu_camera_up"},
154   {"CameraDown", 'C', 0, ID_CAMERA_DOWN, "menu_camera_down"},
155   {"CameraAngleUp", 'A', 0, ID_CAMERA_ANGLEUP, "menu_camera_angleup"},
156   {"CameraAngleDown", 'Z', 0, ID_CAMERA_ANGLEDOWN, "menu_camera_angledown"},
157   {"CameraStrafeRight", GDK_period, 0, ID_CAMERA_STRAFERIGHT, "menu_camera_straferight"},
158   {"CameraStrafeLeft", GDK_comma, 0, ID_CAMERA_STRAFELEFT, "menu_camera_strafeleft"},
159   {"ToggleGrid", '0', 0, ID_GRID_TOGGLE, "menu_grid_toggle"},
160   {"SetGrid1", '1', 0, ID_GRID_1, "menu_grid_1"},
161   {"SetGrid2", '2', 0, ID_GRID_2, "menu_grid_2"},
162   {"SetGrid4", '3', 0, ID_GRID_4, "menu_grid_4"},
163   {"SetGrid8", '4', 0, ID_GRID_8, "menu_grid_8"},
164   {"SetGrid16", '5', 0, ID_GRID_16, "menu_grid_16"},
165   {"SetGrid32", '6', 0, ID_GRID_32, "menu_grid_32"},
166   {"SetGrid64", '7', 0, ID_GRID_64, "menu_grid_64"},
167   {"SetGrid128", '8', 0, ID_GRID_128, "menu_grid_128"},
168   {"SetGrid256", '9', 0, ID_GRID_256, "menu_grid_256"},
169   {"DragEdges", 'E', 0, ID_SELECTION_DRAGEDGES, "menu_selection_dragedges"},
170   {"DragVertices", 'V', 0, ID_SELECTION_DRAGVERTECIES, "menu_selection_dragvertecies"},
171   {"ViewEntityInfo", 'N', 0, ID_VIEW_ENTITY, "menu_view_entity"},
172   //  {"ViewConsole", 'O', 0, ID_VIEW_CONSOLE, "menu_0,"},
173   {"CloneSelection", GDK_space, 0, ID_SELECTION_CLONE, "menu_selection_clone"},
174   {"DeleteSelection", GDK_BackSpace, 0, ID_SELECTION_DELETE, "menu_selection_delete"},
175   {"UnSelectSelection", GDK_Escape, 0, ID_SELECTION_DESELECT, "menu_selection_deselect"},
176   {"CenterView", GDK_End, 0, ID_VIEW_CENTER, "menu_view_center"},
177   {"ZoomOut", GDK_Insert, 0, ID_VIEW_ZOOMOUT, "menu_view_zoomout"},
178   {"ZoomIn", GDK_Delete, 0, ID_VIEW_ZOOMIN, "menu_view_zoomin"},
179   {"UpFloor", GDK_Prior, 0, ID_VIEW_UPFLOOR, "menu_view_upfloor"},
180   {"DownFloor", GDK_Next, 0, ID_VIEW_DOWNFLOOR, "menu_view_downfloor"},
181   {"ToggleClipper", 'X', 0, ID_VIEW_CLIPPER, "menu_view_clipper"},
182   {"ToggleCrosshairs", 'X', 0x01, ID_VIEW_CROSSHAIR, "menu_view_crosshair"},
183   {"TogTexLock", 'T', 0x01, ID_TOGGLE_LOCK, "menu_toggle_lock"},
184   {"TogTexRotLock", 'R', 0x01, ID_TOGGLE_ROTATELOCK, "menu_toggle_rotatelock"},
185   {"ToggleRealtime", 'R', 0x04, ID_VIEW_CAMERAUPDATE, "menu_view_cameraupdate"},
186   {"EntityList", 'L', 0, ID_EDIT_ENTITYINFO, "menu_edit_entityinfo"},
187   {"Preferences", 'P', 0, ID_PREFS, "menu_prefs"},
188   {"ToggleCamera", 'C', 0x05, ID_TOGGLECAMERA, "menu_togglecamera"},
189   {"ToggleConsole", 'O', 0, ID_TOGGLECONSOLE, "menu_toggleconsole"},
190   {"ToggleView", 'V', 0x05, ID_TOGGLEVIEW, "menu_toggleview"},
191   {"ToggleZ", 'Z', 0x05, ID_TOGGLEZ, "menu_togglez"},
192   {"ConnectSelection", 'K', 0x04, ID_SELECTION_CONNECT, "menu_selection_connect"},
193   {"Brush3Sided", '3', 0x04, ID_BRUSH_3SIDED, "menu_brush_3sided"},
194   {"Brush4Sided", '4', 0x04, ID_BRUSH_4SIDED, "menu_brush_4sided"},
195   {"Brush5Sided", '5', 0x04, ID_BRUSH_5SIDED, "menu_brush_5sided"},
196   {"Brush6Sided", '6', 0x04, ID_BRUSH_6SIDED, "menu_brush_6sided"},
197   {"Brush7Sided", '7', 0x04, ID_BRUSH_7SIDED, "menu_brush_7sided"},
198   {"Brush8Sided", '8', 0x04, ID_BRUSH_8SIDED, "menu_brush_8sided"},
199   {"Brush9Sided", '9', 0x04, ID_BRUSH_9SIDED, "menu_brush_9sided"},
200   {"MatrixTranspose", 'M', 0x05, ID_CURVE_MATRIX_TRANSPOSE, "menu_curve_matrix_transpose"},
201   {"MakeDetail", 'M', 0x04, ID_SELECTION_MAKE_DETAIL, "menu_selection_make_detail"},
202   {"MapInfo", 'M', 0, ID_EDIT_MAPINFO, "menu_edit_mapinfo"},
203   {"NextLeakSpot", 'K', 0x05, ID_MISC_NEXTLEAKSPOT, "menu_misc_nextleakspot"},
204   {"PrevLeakSpot", 'L', 0x05, ID_MISC_PREVIOUSLEAKSPOT, "menu_misc_previousleakspot"},
205   {"FileOpen", 'O', 0x04, ID_FILE_OPEN, "menu_file_open"},
206   {"FileSave", 'S', 0x04, ID_FILE_SAVE, "menu_file_save"},
207   //% {"Exit", 'X', 0x04, ID_FILE_EXIT, "menu_file_exit"}, // ydnar: Ctrl+X should be cut
208   {"CenterXYView", GDK_Tab, 0x05, ID_VIEW_CENTERVIEW, "menu_view_centerview"},
209   {"NextView", GDK_Tab, 0x04, ID_VIEW_NEXTVIEW, "menu_view_nextview"},
210   {"ClipSelected", GDK_Return, 0x00, ID_CLIP_SELECTED, "menu_clip_selected"},
211   {"SplitSelected", GDK_Return, 0x01, ID_SPLIT_SELECTED, "menu_split_selected"},
212   {"FlipClip", GDK_Return, 0x04, ID_FLIP_CLIP, "menu_flip_clip"},
213   {"MouseRotate", 'R', 0x00, ID_SELECT_MOUSEROTATE, "menu_select_mouserotate"},
214   {"Copy", 'C', 0x04, ID_EDIT_COPYBRUSH, "menu_edit_copybrush"},
215   {"Paste", 'V', 0x04, ID_EDIT_PASTEBRUSH, "menu_edit_pastebrush"},
216   {"PasteToCamera", 'V', RAD_ALT, ID_EDIT_PASTEBRUSHTOCAMERA, "menu_edit_pastebrushtocamera"},
217   {"Undo", 'Z', 0x04, ID_EDIT_UNDO, "menu_edit_undo"},
218   {"Redo", 'Y', 0x04, ID_EDIT_REDO, "menu_edit_redo"},
219   {"ZZoomOut", GDK_Insert, 0x04, ID_VIEW_ZZOOMOUT, "menu_view_zzoomout"},
220   {"ZZoomIn", GDK_Delete, 0x04, ID_VIEW_ZZOOMIN, "menu_view_zzoomin"},
221   {"TexRotateClock", GDK_Next, 0x01, ID_SELECTION_TEXTURE_ROTATECLOCK, "menu_selection_texture_rotateclock"},
222   {"TexRotateCounter", GDK_Prior, 0x01, ID_SELECTION_TEXTURE_ROTATECOUNTER, "menu_selection_texture_rotatecounter"},
223   {"TexScaleUp", GDK_Up, 0x04, ID_SELECTION_TEXTURE_SCALEUP, "menu_selection_texture_scaleup"},
224   {"TexScaleDown", GDK_Down, 0x04, ID_SELECTION_TEXTURE_SCALEDOWN, "menu_selection_texture_scaledown"},
225   {"TexShiftLeft", GDK_Left, 0x01, ID_SELECTION_TEXTURE_SHIFTLEFT, "menu_selection_texture_shiftleft"},
226   {"TexShiftRight", GDK_Right, 0x01, ID_SELECTION_TEXTURE_SHIFTRIGHT, "menu_selection_texture_shiftright"},
227   {"TexShiftUp", GDK_Up, 0x01, ID_SELECTION_TEXTURE_SHIFTUP, "menu_selection_texture_shiftup"},
228   {"TexShiftDown", GDK_Down, 0x01, ID_SELECTION_TEXTURE_SHIFTDOWN, "menu_selection_texture_shiftdown"},
229   {"GridDown", '[', 0x00, ID_GRID_PREV, "menu_grid_prev"},
230   {"GridUp", ']', 0x00, ID_GRID_NEXT, "menu_grid_next"},
231   {"TexScaleLeft", GDK_Left, 0x04, ID_SELECTION_TEXTURE_SCALELEFT, "menu_selection_texture_scaleleft"},
232   {"TexScaleRight", GDK_Right, 0x04, ID_SELECTION_TEXTURE_SCALERIGHT, "menu_selection_texture_scaleright"},
233   {"CubicClipZoomOut", ']', 0x04, ID_VIEW_CUBEOUT, "menu_view_cubeout"},
234   {"CubicClipZoomIn", '[', 0x04, ID_VIEW_CUBEIN, "menu_view_cubein"},
235   {"ToggleCubicClip", '\\', 0x04, ID_VIEW_CUBICCLIPPING, "menu_view_cubicclipping"},
236   {"MoveSelectionDOWN", GDK_KP_Subtract, 0x00, ID_SELECTION_MOVEDOWN, "menu_selection_movedown"},
237   {"MoveSelectionUP", GDK_KP_Add, 0x00, ID_SELECTION_MOVEUP, "menu_selection_moveup"},
238   {"DumpSelectedBrush", 'D', 0x01, ID_SELECTION_PRINT, "menu_selection_print"},
239   {"ToggleSizePaint", 'Q', 0x00, ID_SELECTION_TOGGLESIZEPAINT, "menu_selection_togglesizepaint"},
240   {"SelectNudgeLeft", GDK_Left, 0x02, ID_SELECTION_SELECT_NUDGELEFT, "menu_selection_select_nudgeleft"},
241   {"SelectNudgeRight", GDK_Right, 0x02, ID_SELECTION_SELECT_NUDGERIGHT, "menu_selection_select_nudgeright"},
242   {"SelectNudgeUp", GDK_Up, 0x02, ID_SELECTION_SELECT_NUDGEUP, "menu_selection_select_nudgeup"},
243   {"CycleCapTexturePatch", 'N', 0x05, ID_CURVE_CYCLECAP, "menu_curve_cyclecap"},
244   {"NaturalizePatch", 'N', 0x04, ID_PATCH_NATURALIZE, "menu_patch_naturalize"},
245   {"SnapToGrid", 'G', 0x04, ID_SELECT_SNAPTOGRID, "menu_select_snaptogrid"},
246   {"ShowAllTextures", 'A', 0x04, ID_TEXTURES_SHOWALL, "menu_textures_showall"},
247   {"SelectAllOfType", 'A', 0x01, ID_SELECT_ALL, "menu_select_all"},
248   {"CapCurrentCurve", 'C', 0x01, ID_CURVE_CAP, "menu_curve_cap"},
249   {"MakeStructural", 'S', 0x05, ID_SELECTION_MAKE_STRUCTURAL, "menu_selection_make_structural"},
250   {"RegionSetSelection", 'R', 0x05, ID_REGION_SETSELECTION, "menu_region_setselection"},
251   {"ShowInUse", 'U', 0, ID_TEXTURES_SHOWINUSE, "menu_textures_showinuse"},
252   {"InvertSelection", 'I', 0, ID_SELECTION_INVERT, "menu_selection_invert"},
253   {"Sleep", 'P', 0x05, ID_FILE_SLEEP, "menu_file_sleep"},
254   {"SimplePatchMesh", 'P', 0x01, ID_CURVE_SIMPLEPATCHMESH, "menu_simplepatchmesh"},
255   {"FilterWorldBrushes", '1', RAD_ALT, ID_FILTER_WORLD, "menu_filter_world"},
256   {"FilterEntities", '2', RAD_ALT, ID_FILTER_ENTITIES, "menu_filter_entities"},
257   {"FilterAreaportals", '3', RAD_ALT, ID_FILTER_AREAPORTALS, "menu_filter_areaportals"},
258   {"FilterTranslucent", '4', RAD_ALT, ID_FILTER_TRANSLUCENT, "menu_filter_translucent"},
259   {"FilterLiquids", '5', RAD_ALT, ID_FILTER_LIQUIDS, "menu_filter_liquids"},
260   {"FilterCaulk", '6', RAD_ALT , ID_FILTER_CAULK, "menu_filter_caulk"},
261   {"FilterClips", '7', RAD_ALT, ID_FILTER_CLIPS, "menu_filter_clips"},
262   {"FilterBotClips", 'M', RAD_ALT, ID_FILTER_BOTCLIPS, "menu_filter_botclips"},
263   {"FilterPaths", '8', RAD_ALT, ID_FILTER_PATHS, "menu_filter_paths"},
264   {"FilterClusterportals", '9', RAD_ALT, ID_FILTER_CLUSTERPORTALS, "menu_filter_clusterportals"},
265   {"FilterLights", '0', RAD_ALT, ID_FILTER_LIGHTS, "menu_filter_lights"},
266   {"FilterPatches", 'P', RAD_CONTROL, ID_FILTER_PATCHES, "menu_filter_patches"},
267   {"FilterDetails", 'D', RAD_CONTROL, ID_FILTER_DETAILS, "menu_filter_details"},
268   {"FilterStructural", 'D', RAD_CONTROL|RAD_SHIFT, ID_FILTER_STRUCTURAL, "menu_filter_structural"},
269   {"FilterHintsSkips", 'H', RAD_CONTROL, ID_FILTER_HINTSSKIPS, "menu_filter_hintsskips"},
270   {"FilterModels", 'M', RAD_SHIFT, ID_FILTER_MODELS, "menu_filter_models"},
271   {"FilterTriggers", 'T', RAD_CONTROL|RAD_SHIFT, ID_FILTER_TRIGGERS, "menu_filter_triggers"},
272   {"LoadPointfile", 'L', RAD_SHIFT, ID_FILE_POINTFILE, "menu_load_pointfile"},
273   {"TextureWindowScaledown", GDK_Insert, RAD_ALT, ID_TEXTUREWINDOW_SCALEDOWN, "menu_texturewindow_scaledown"},
274   {"TextureWindowScaleup", GDK_Delete, RAD_ALT, ID_TEXTUREWINDOW_SCALEUP, "menu_texturewindow_scaleup"},
275 };
276
277 int g_nCommandCount = sizeof(g_Commands) / sizeof(SCommandInfo);
278
279 SKeyInfo g_Keys[] =
280 {
281   {"Space", GDK_space},
282   {"Backspace", GDK_BackSpace},
283   {"Escape", GDK_Escape},
284   {"End", GDK_End},
285   {"Insert", GDK_Insert},
286   {"Delete", GDK_Delete},
287   {"PageUp", GDK_Prior},
288   {"PageDown", GDK_Next},
289   {"Up", GDK_Up},
290   {"Down", GDK_Down},
291   {"Left", GDK_Left},
292   {"Right", GDK_Right},
293   {"F1", GDK_F1},
294   {"F2", GDK_F2},
295   {"F3", GDK_F3},
296   {"F4", GDK_F4},
297   {"F5", GDK_F5},
298   {"F6", GDK_F6},
299   {"F7", GDK_F7},
300   {"F8", GDK_F8},
301   {"F9", GDK_F9},
302   {"F10", GDK_F10},
303   {"F11", GDK_F11},
304   {"F12", GDK_F12},
305   {"Tab", GDK_Tab},
306   {"Return", GDK_Return},
307   {"Comma", GDK_comma},
308   {"Period", GDK_period},
309   {"Plus", GDK_KP_Add},
310   {"Multiply", GDK_multiply},
311   {"Subtract", GDK_KP_Subtract},
312   {"NumPad0", GDK_KP_0},
313   {"NumPad1", GDK_KP_1},
314   {"NumPad2", GDK_KP_2},
315   {"NumPad3", GDK_KP_3},
316   {"NumPad4", GDK_KP_4},
317   {"NumPad5", GDK_KP_5},
318   {"NumPad6", GDK_KP_6},
319   {"NumPad7", GDK_KP_7},
320   {"NumPad8", GDK_KP_8},
321   {"NumPad9", GDK_KP_9},
322   {"[", 219},
323   {"]", 221},
324   {"\\", 220},
325   {"Home", GDK_Home}
326 };
327
328 int g_nKeyCount = sizeof(g_Keys) / sizeof(SKeyInfo);
329
330 // =============================================================================
331 // global functions
332
333 void WINAPI Sys_UpdateWindows (int nBits)
334 {
335   g_nUpdateBits |= nBits;
336 }
337
338 // =============================================================================
339 // Static functions
340
341 // Gef: Separate handling for keyup events
342 void HandleKeyUp (GtkWidget *widget, gpointer data)
343 {
344   int id = GPOINTER_TO_INT (data);
345 #ifdef DBG_KBD
346   Sys_Printf("HandleKeyUp: %d\n", id);
347 #endif
348
349   if(g_bIgnoreCommands)
350     return;
351
352   switch (id)
353   {
354     case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (FALSE); break;
355     case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (FALSE); break;
356     case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (FALSE); break;
357     case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (FALSE); break;
358     case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (FALSE); break;
359     case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (FALSE); break;
360   }
361 }
362
363 gint HandleCommand (GtkWidget *widget, gpointer data)
364 {
365   int id = GPOINTER_TO_INT (data);
366 #ifdef DBG_KBD
367   Sys_Printf("HandleCommand %d\n", id);
368 #endif
369
370   if ( g_bIgnoreCommands ) {
371 #ifdef DBG_KBD
372     Sys_Printf( "g_bIgnoreCommands %d, returning FALSE\n", g_bIgnoreCommands );
373 #endif
374     return FALSE;
375   }
376
377   if (id >= CMD_TEXTUREWAD && id <= CMD_TEXTUREWAD_END) g_pParentWnd->OnTextureWad (id);
378   else if (id >= CMD_BSPCOMMAND && id <= CMD_BSPCOMMAND_END) g_pParentWnd->OnBspCommand (id);
379   else if (id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4) g_pParentWnd->OnMru (id);
380   else if (id >= ID_VIEW_NEAREST && id <= ID_TEXTURES_FLATSHADE)
381   {
382     if (GTK_CHECK_MENU_ITEM (widget)->active)
383       g_pParentWnd->OnViewNearest (id);
384   } else if (id >= ID_GRID_025 && id <= ID_GRID_256) g_pParentWnd->OnGrid (id);
385   else if (id >= ID_PLUGIN_START && id <= ID_PLUGIN_END)
386   {
387     char *str;
388     gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
389     g_pParentWnd->OnPlugIn (id, str);
390   } else if (id >= ID_ENTITY_START && id <= ID_ENTITY_END)
391   {
392     char *str;
393     gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str);
394     g_pParentWnd->ActiveXY()->OnEntityCreate (str);
395   }
396   else switch (id)
397     {
398     case ID_FILE_NEW: g_pParentWnd->OnFileNew (); break;
399     case ID_FILE_SLEEP: g_pParentWnd->OnSleep(); break;
400     case ID_FILE_OPEN: g_pParentWnd->OnFileOpen (); break;
401     case ID_FILE_SAVE: g_pParentWnd->OnFileSave (); break;
402     case ID_FILE_SAVEAS: g_pParentWnd->OnFileSaveas (); break;
403     case ID_FILE_EXPORTMAP: g_pParentWnd->OnFileExportmap (); break;
404     case ID_FILE_SAVEREGION: g_pParentWnd->OnFileSaveregion (); break;
405     case ID_FILE_NEWPROJECT: g_pParentWnd->OnFileNewproject (); break;
406     case ID_FILE_LOADPROJECT: g_pParentWnd->OnFileLoadproject (); break;
407     case ID_FILE_PROJECTSETTINGS: g_pParentWnd->OnFileProjectsettings (); break;
408     case ID_FILE_POINTFILE: g_pParentWnd->OnFilePointfile (); break;
409     case ID_FILE_CHECKUPDATE: g_pParentWnd->OnFileCheckUpdate (); break;
410     case ID_FILE_EXIT: g_pParentWnd->OnFileExit (); break;
411     case ID_FILE_IMPORTMAP: g_pParentWnd->OnFileImportmap (); break;
412     case ID_EDIT_UNDO: g_pParentWnd->OnEditUndo (); break;
413     case ID_EDIT_REDO: g_pParentWnd->OnEditRedo (); break;
414     case ID_EDIT_COPYBRUSH: g_pParentWnd->OnEditCopybrush (); break;
415     case ID_EDIT_PASTEBRUSH: g_pParentWnd->OnEditPastebrush (); break;
416     case ID_EDIT_PASTEBRUSHTOCAMERA: g_pParentWnd->OnEditPastebrushToCamera (); break;
417     case ID_SELECTION_DELETE: g_pParentWnd->OnSelectionDelete (); break;
418     case ID_EDIT_MAPINFO: g_pParentWnd->OnEditMapinfo (); break;
419     case ID_EDIT_ENTITYINFO: g_pParentWnd->OnEditEntityinfo (); break;
420     case ID_BRUSH_SCRIPTS: g_pParentWnd->OnBrushScripts (); break;
421     case ID_EDIT_LOADPREFAB: g_pParentWnd->OnEditLoadprefab (); break;
422     case ID_EDIT_SAVEPREFAB: g_pParentWnd->OnEditSaveprefab (); break;
423     case ID_PREFS: g_pParentWnd->OnPrefs (); break;
424     case ID_TOGGLECAMERA: g_pParentWnd->OnTogglecamera (); break;
425     case ID_TOGGLECONSOLE: g_pParentWnd->OnToggleconsole (); break;
426     case ID_VIEW_ENTITY: g_pParentWnd->OnViewEntity (); break;
427     case ID_VIEW_GROUPS: g_pParentWnd->OnViewGroups (); break;
428         case ID_SELECT_FUNC_GROUP: g_pParentWnd->OnSelectFuncGroup(); break;
429     case ID_TOGGLEVIEW: g_pParentWnd->OnToggleview (); break;
430     case ID_TOGGLEVIEW_YZ: g_pParentWnd->OnToggleviewYz (); break;
431     case ID_TOGGLEVIEW_XZ: g_pParentWnd->OnToggleviewXz (); break;
432     case ID_TOGGLEZ: g_pParentWnd->OnTogglez (); break;
433     case ID_VIEW_CENTER: g_pParentWnd->OnViewCenter (); break;
434     case ID_VIEW_UPFLOOR: g_pParentWnd->OnViewUpfloor (); break;
435     case ID_VIEW_DOWNFLOOR: g_pParentWnd->OnViewDownfloor (); break;
436     case ID_VIEW_CENTERVIEW: g_pParentWnd->OnViewCenterview (); break;
437     case ID_VIEW_NEXTVIEW: g_pParentWnd->OnViewNextview (); break;
438     case ID_VIEW_XY: g_pParentWnd->OnViewXy (); break;
439     case ID_VIEW_SIDE: g_pParentWnd->OnViewSide (); break;
440     case ID_VIEW_FRONT: g_pParentWnd->OnViewFront (); break;
441     case ID_VIEW_100: g_pParentWnd->OnView100 (); break;
442     case ID_VIEW_ZOOMIN: g_pParentWnd->OnViewZoomin (); break;
443     case ID_VIEW_ZOOMOUT: g_pParentWnd->OnViewZoomout (); break;
444     case ID_VIEW_Z100: g_pParentWnd->OnViewZ100 (); break;
445     case ID_VIEW_ZZOOMIN: g_pParentWnd->OnViewZzoomin (); break;
446     case ID_VIEW_ZZOOMOUT: g_pParentWnd->OnViewZzoomout (); break;
447     case ID_VIEW_CUBEIN: g_pParentWnd->OnViewCubein (); break;
448     case ID_VIEW_CUBEOUT: g_pParentWnd->OnViewCubeout (); break;
449     case ID_VIEW_SHOWNAMES: g_pParentWnd->OnViewShownames (); break;
450     case ID_VIEW_SHOWBLOCKS: g_pParentWnd->OnViewShowblocks (); break;
451     case ID_VIEW_SHOWCOORDINATES: g_pParentWnd->OnViewShowcoordinates (); break;
452     case ID_VIEW_SHOWOUTLINE: g_pParentWnd->OnViewShowOutline (); break;
453     case ID_VIEW_SHOWAXES: g_pParentWnd->OnViewShowAxes (); break;
454     case ID_VIEW_SHOWWORKZONE: g_pParentWnd->OnViewShowWorkzone (); break;
455     case ID_VIEW_SHOWANGLES: g_pParentWnd->OnViewShowAngles (); break;
456     case ID_VIEW_HIDESHOW_HIDESELECTED: g_pParentWnd->OnViewHideshowHideselected (); break;
457     case ID_VIEW_HIDESHOW_SHOWHIDDEN: g_pParentWnd->OnViewHideshowShowhidden (); break;
458     case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
459     case ID_VIEW_ENTITIESAS_WIREFRAME:
460     case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
461     case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
462     case ID_VIEW_ENTITIESAS_SKINNED:
463     case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
464       g_pParentWnd->OnEntitiesSetViewAs(id);
465       break;
466     case ID_VIEW_CUBICCLIPPING: g_pParentWnd->OnViewCubicclipping (); break;
467     case ID_VIEW_OPENGLLIGHTING: g_pParentWnd->OnViewOpengllighting (); break;
468     case ID_SELECTION_DRAGEDGES: g_pParentWnd->OnSelectionDragedges (); break;
469     case ID_SELECTION_DRAGVERTECIES: g_pParentWnd->OnSelectionDragvertecies (); break;
470     case ID_SELECTION_CLONE: g_pParentWnd->OnSelectionClone (); break;
471     case ID_SELECTION_DESELECT: g_pParentWnd->OnSelectionDeselect (); break;
472     case ID_BRUSH_FLIPX: g_pParentWnd->OnBrushFlipx (); break;
473     case ID_BRUSH_FLIPY: g_pParentWnd->OnBrushFlipy (); break;
474     case ID_BRUSH_FLIPZ: g_pParentWnd->OnBrushFlipz (); break;
475     case ID_BRUSH_ROTATEX: g_pParentWnd->OnBrushRotatex (); break;
476     case ID_BRUSH_ROTATEY: g_pParentWnd->OnBrushRotatey (); break;
477     case ID_BRUSH_ROTATEZ: g_pParentWnd->OnBrushRotatez (); break;
478     case ID_SELECTION_ARBITRARYROTATION: g_pParentWnd->OnSelectionArbitraryrotation (); break;
479     case ID_SELECT_SCALE: g_pParentWnd->OnSelectScale (); break;
480     case ID_SELECTION_MAKEHOLLOW: g_pParentWnd->OnSelectionMakehollow (); break;
481     case ID_SELECTION_CSGSUBTRACT: g_pParentWnd->OnSelectionCsgsubtract (); break;
482     case ID_SELECTION_CSGMERGE: g_pParentWnd->OnSelectionCsgmerge (); break;
483     case ID_SELECTION_NOOUTLINE: g_pParentWnd->OnSelectionNoOutline (); break;
484     case ID_SELECTION_OUTLINESTYLE: g_pParentWnd->OnSelectionOutlineStyle (); break;
485     case ID_SELECTION_SELECTCOMPLETETALL: g_pParentWnd->OnSelectionSelectcompletetall (); break;
486     case ID_SELECTION_SELECTTOUCHING: g_pParentWnd->OnSelectionSelecttouching (); break;
487     case ID_SELECTION_SELECTPARTIALTALL: g_pParentWnd->OnSelectionSelectpartialtall (); break;
488     case ID_SELECTION_SELECTINSIDE: g_pParentWnd->OnSelectionSelectinside (); break;
489     case ID_SELECTION_SELECT_NUDGELEFT: g_pParentWnd->OnSelectionSelectNudgeleft (); break;
490     case ID_SELECTION_SELECT_NUDGERIGHT: g_pParentWnd->OnSelectionSelectNudgeright (); break;
491     case ID_SELECTION_SELECT_NUDGEUP: g_pParentWnd->OnSelectionSelectNudgeup (); break;
492     case ID_SELECTION_SELECT_NUDGEDOWN: g_pParentWnd->OnSelectionSelectNudgedown (); break;
493     case ID_VIEW_CLIPPER: g_pParentWnd->OnViewClipper (); break;
494     case ID_CLIP_SELECTED: g_pParentWnd->OnClipSelected (); break;
495     case ID_SPLIT_SELECTED: g_pParentWnd->OnSplitSelected (); break;
496     case ID_FLIP_CLIP: g_pParentWnd->OnFlipClip (); break;
497     case ID_SELECTION_CONNECT: g_pParentWnd->OnSelectionConnect (); break;
498     case ID_SELECTION_UNGROUPENTITY: g_pParentWnd->OnSelectionUngroupentity (); break;
499     case ID_SELECTION_MERGE: Select_MergeEntity(); break;
500     case ID_SELECTION_SEPERATE: Select_Seperate(); break;
501     case ID_SELECTION_MAKE_DETAIL: g_pParentWnd->OnSelectionMakeDetail (); break;
502     case ID_SELECTION_MAKE_STRUCTURAL: g_pParentWnd->OnSelectionMakeStructural (); break;
503     case ID_SNAPTOGRID: g_pParentWnd->OnSnaptogrid (); break;
504     case ID_TEXTURES_SHOWINUSE: g_pParentWnd->OnTexturesShowinuse (); break;
505     case ID_TEXTURES_SHOWALL: g_pParentWnd->OnTexturesShowall (); break;
506     case ID_TEXTURES_INSPECTOR: g_pParentWnd->OnTexturesInspector (); break;
507     case ID_TEXTURE_REPLACEALL: g_pParentWnd->OnTextureReplaceall (); break;
508     case ID_TOGGLE_LOCK: g_pParentWnd->OnToggleLock (); break;
509     case ID_TOGGLE_ROTATELOCK: g_pParentWnd->OnToggleRotatelock (); break;
510     case ID_TEXTURES_LOAD: g_pParentWnd->OnTexturesLoad (); break;
511     case ID_TEXTURES_RELOADSHADERS: g_pParentWnd->OnTexturesReloadshaders (); break;
512     case ID_TEXTURES_SHADERS_SHOW: g_pParentWnd->OnTexturesShadersShow (); break;
513     case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
514     case ID_TEXTURES_TEXTUREWINDOWSCALE_100:
515     case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
516     case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
517     case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
518       g_pParentWnd->SetTextureScale (id);
519       break;
520     case ID_TEXTURES_LOADLIST: g_pParentWnd->OnTexturesLoadlist (); break;
521     case ID_TEXTURES_SHADERLISTONLY: g_pParentWnd->OnTexturesShaderlistonly (); break;
522     case ID_TEXTUREWINDOW_SCALEUP: g_pParentWnd->OnTexturewindowScaleup (); break;
523     case ID_TEXTUREWINDOW_SCALEDOWN: g_pParentWnd->OnTexturewindowScaledown (); break;
524     case ID_MISC_BENCHMARK: g_pParentWnd->OnMiscBenchmark (); break;
525     case ID_COLOR_SETORIGINAL: g_pParentWnd->OnColorSetoriginal (); break;
526     case ID_COLOR_SETQER: g_pParentWnd->OnColorSetqer (); break;
527     case ID_COLOR_SETBLACK: g_pParentWnd->OnColorSetblack (); break;
528     case ID_COLOR_SETYDNAR: g_pParentWnd->OnColorSetydnar (); break;  /* ydnar */
529     case ID_TEXTUREBK: g_pParentWnd->OnTexturebk (); break;
530     case ID_COLORS_XYBK: g_pParentWnd->OnColorsXybk (); break;
531     case ID_COLORS_MAJOR: g_pParentWnd->OnColorsMajor (); break;
532     case ID_COLORS_MINOR: g_pParentWnd->OnColorsMinor (); break;
533     case ID_COLORS_GRIDTEXT: g_pParentWnd->OnColorsGridtext (); break;
534     case ID_COLORS_GRIDBLOCK: g_pParentWnd->OnColorsGridblock (); break;
535     case ID_COLORS_CAMERABACK: g_pParentWnd->OnColorsCameraBack (); break;
536     case ID_COLORS_BRUSH: g_pParentWnd->OnColorsBrush (); break;
537     case ID_COLORS_SELECTEDBRUSH: g_pParentWnd->OnColorsSelectedbrush (); break;
538     case ID_COLORS_SELECTEDBRUSH3D: g_pParentWnd->OnColorsSelectedbrush3D (); break;
539     case ID_COLORS_CLIPPER: g_pParentWnd->OnColorsClipper (); break;
540     case ID_COLORS_VIEWNAME: g_pParentWnd->OnColorsViewname (); break;
541     case ID_MISC_GAMMA: g_pParentWnd->OnMiscGamma (); break;
542     case ID_MISC_FINDBRUSH: g_pParentWnd->OnMiscFindbrush (); break;
543     case ID_MISC_NEXTLEAKSPOT: g_pParentWnd->OnMiscNextleakspot (); break;
544     case ID_MISC_PREVIOUSLEAKSPOT: g_pParentWnd->OnMiscPreviousleakspot (); break;
545     case ID_MISC_PRINTXY: g_pParentWnd->OnMiscPrintxy (); break;
546     case ID_MISC_SELECTENTITYCOLOR: g_pParentWnd->OnMiscSelectentitycolor (); break;
547     case ID_CONVERTCURVES: g_pParentWnd->OnConvertcurves (); break;
548     case ID_REGION_OFF: g_pParentWnd->OnRegionOff (); break;
549     case ID_REGION_SETXY: g_pParentWnd->OnRegionSetxy (); break;
550     case ID_REGION_SETTALLBRUSH: g_pParentWnd->OnRegionSettallbrush (); break;
551     case ID_REGION_SETBRUSH: g_pParentWnd->OnRegionSetbrush (); break;
552     case ID_REGION_SETSELECTION: g_pParentWnd->OnRegionSetselection (); break;
553     case ID_BRUSH_3SIDED: g_pParentWnd->OnBrush3sided (); break;
554     case ID_BRUSH_4SIDED: g_pParentWnd->OnBrush4sided (); break;
555     case ID_BRUSH_5SIDED: g_pParentWnd->OnBrush5sided (); break;
556     case ID_BRUSH_6SIDED: g_pParentWnd->OnBrush6sided (); break;
557     case ID_BRUSH_7SIDED: g_pParentWnd->OnBrush7sided (); break;
558     case ID_BRUSH_8SIDED: g_pParentWnd->OnBrush8sided (); break;
559     case ID_BRUSH_9SIDED: g_pParentWnd->OnBrush9sided (); break;
560     case ID_BRUSH_ARBITRARYSIDED: g_pParentWnd->OnBrushArbitrarysided (); break;
561     case ID_BRUSH_MAKECONE: g_pParentWnd->OnBrushMakecone (); break;
562     case ID_BRUSH_PRIMITIVES_SPHERE: g_pParentWnd->OnBrushPrimitivesSphere (); break;
563     case ID_CURVE_PATCHTUBE: g_pParentWnd->OnCurvePatchtube (); break;
564     case ID_CURVE_PATCHDENSETUBE: g_pParentWnd->OnCurvePatchdensetube (); break;
565     case ID_CURVE_PATCHVERYDENSETUBE: g_pParentWnd->OnCurvePatchverydensetube (); break;
566     case ID_CURVE_PATCHSQUARE: g_pParentWnd->OnCurvePatchsquare (); break;
567     case ID_CURVE_PATCHENDCAP: g_pParentWnd->OnCurvePatchendcap (); break;
568     case ID_CURVE_PATCHBEVEL: g_pParentWnd->OnCurvePatchbevel (); break;
569     case ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL: g_pParentWnd->OnCurveMoreendcapsbevelsSquarebevel (); break;
570     case ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP: g_pParentWnd->OnCurveMoreendcapsbevelsSquareendcap();break;
571     case ID_CURVE_PATCHCONE: g_pParentWnd->OnCurvePatchcone (); break;
572     case ID_CURVE_SIMPLEPATCHMESH: g_pParentWnd->OnCurveSimplepatchmesh (); break;
573     case ID_CURVE_INSERT_INSERTCOLUMN: g_pParentWnd->OnCurveInsertInsertcolumn (); break;
574     case ID_CURVE_INSERT_ADDCOLUMN: g_pParentWnd->OnCurveInsertAddcolumn (); break;
575     case ID_CURVE_INSERT_INSERTROW: g_pParentWnd->OnCurveInsertInsertrow (); break;
576     case ID_CURVE_INSERT_ADDROW: g_pParentWnd->OnCurveInsertAddrow (); break;
577     case ID_CURVE_DELETE_FIRSTCOLUMN: g_pParentWnd->OnCurveDeleteFirstcolumn (); break;
578     case ID_CURVE_DELETE_LASTCOLUMN: g_pParentWnd->OnCurveDeleteLastcolumn (); break;
579     case ID_CURVE_DELETE_FIRSTROW: g_pParentWnd->OnCurveDeleteFirstrow (); break;
580     case ID_CURVE_DELETE_LASTROW: g_pParentWnd->OnCurveDeleteLastrow (); break;
581     case ID_CURVE_NEGATIVE: g_pParentWnd->OnCurveNegative (); break;
582     case ID_CURVE_REDISPERSE_ROWS: g_pParentWnd->OnCurveRedisperseRows (); break;
583     case ID_CURVE_REDISPERSE_INTERMEDIATE_COLS: g_pParentWnd->OnCurveRedisperseIntermediateCols (); break;
584     case ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS: g_pParentWnd->OnCurveRedisperseIntermediateRows (); break;
585     case ID_CURVE_MATRIX_TRANSPOSE: g_pParentWnd->OnCurveMatrixTranspose (); break;
586     case ID_CURVE_CAP: g_pParentWnd->OnCurveCap (); break;
587     case ID_CURVE_CYCLECAP: g_pParentWnd->OnCurveCyclecap (); break;
588     case ID_CURVE_OVERLAY_SET: g_pParentWnd->OnCurveOverlaySet (); break;
589     case ID_CURVE_OVERLAY_CLEAR: g_pParentWnd->OnCurveOverlayClear (); break;
590     case ID_CURVE_THICKEN: g_pParentWnd->OnCurveThicken (); break;
591     case ID_PLUGINS_REFRESH: g_pParentWnd->OnPluginsRefresh (); break;
592     case ID_HELP: g_pParentWnd->OnHelp (); break;
593     case ID_HELP_LINKS: g_pParentWnd->OnHelpLinks(); break;
594     case ID_HELP_BUGREPORT: g_pParentWnd->OnHelpBugreport(); break;
595     case ID_HELP_COMMANDLIST: g_pParentWnd->OnHelpCommandlist (); break;
596     case ID_HELP_ABOUT: g_pParentWnd->OnHelpAbout (); break;
597     case ID_DONTSELECTMODEL: g_pParentWnd->OnDontselectmodel (); break;
598     case ID_FILTER_AREAPORTALS: g_pParentWnd->OnFilterAreaportals (); break;
599     case ID_FILTER_CAULK: g_pParentWnd->OnFilterCaulk (); break;
600     case ID_FILTER_STRUCTURAL: g_pParentWnd->OnFilterStructural (); break;
601     case ID_FILTER_CLIPS: g_pParentWnd->OnFilterClips (); break;
602     case ID_FILTER_BOTCLIPS: g_pParentWnd->OnFilterBotClips (); break;
603     case ID_FILTER_DETAILS: g_pParentWnd->OnFilterDetails (); break;
604     case ID_FILTER_ENTITIES: g_pParentWnd->OnFilterEntities (); break;
605     case ID_FILTER_HINTSSKIPS: g_pParentWnd->OnFilterHintsskips (); break;
606     case ID_FILTER_LIGHTS: g_pParentWnd->OnFilterLights (); break;
607     case ID_FILTER_LIQUIDS: g_pParentWnd->OnFilterLiquids (); break;
608     case ID_FILTER_MODELS: g_pParentWnd->OnFilterModels (); break;
609     case ID_FILTER_PATCHES: g_pParentWnd->OnFilterPatches (); break;
610     case ID_FILTER_TRANSLUCENT: g_pParentWnd->OnFilterTranslucent (); break;
611     case ID_FILTER_TRIGGERS: g_pParentWnd->OnFilterTriggers (); break;
612     case ID_FILTER_WORLD: g_pParentWnd->OnFilterWorld (); break;
613     case ID_FILTER_PATHS: g_pParentWnd->OnFilterPaths (); break;
614     case ID_FILTER_CLUSTERPORTALS: g_pParentWnd->OnFilterClusterportals (); break;
615     case ID_FILTER_LIGHTGRID: g_pParentWnd->OnFilterLightgrid (); break;
616
617     case ID_POPUP_SELECTION: g_pParentWnd->OnPopupSelection (); break;
618     case ID_VIEW_CHANGE: g_pParentWnd->OnViewChange (); break;
619     case ID_TEXTURES_POPUP: g_pParentWnd->OnTexturesPopup (); break;
620     case ID_VIEW_CAMERATOGGLE: g_pParentWnd->ToggleCamera (); break;
621     case ID_VIEW_CAMERAUPDATE: g_pParentWnd->OnViewCameraupdate (); break;
622     case ID_SELECT_MOUSEROTATE: g_pParentWnd->OnSelectMouserotate (); break;
623     case ID_SELECT_MOUSESCALE: g_pParentWnd->OnSelectMousescale (); break;
624     case ID_SCALELOCKX: g_pParentWnd->OnScalelockx (); break;
625     case ID_SCALELOCKY: g_pParentWnd->OnScalelocky (); break;
626     case ID_SCALELOCKZ: g_pParentWnd->OnScalelockz (); break;
627     case ID_DONTSELECTCURVE: g_pParentWnd->OnDontselectcurve (); break;
628     case ID_PATCH_SHOWBOUNDINGBOX: g_pParentWnd->OnPatchToggleBox (); break;
629     case ID_PATCH_WIREFRAME: g_pParentWnd->OnPatchWireframe (); break;
630     case ID_PATCH_BEND: g_pParentWnd->OnPatchBend (); break;
631     case ID_PATCH_WELD: g_pParentWnd->OnPatchWeld (); break;
632     case ID_PATCH_DRILLDOWN: g_pParentWnd->OnPatchDrilldown (); break;
633     case ID_DROP_GROUP_NAME: g_pParentWnd->OnDropGroupName (); break;
634     case ID_DROP_GROUP_NEWGROUP: g_pParentWnd->OnDropGroupNewgroup (); break;
635     case ID_DROP_GROUP_REMOVE: g_pParentWnd->OnDropGroupRemove (); break;
636     case ID_SHOW_ENTITIES: g_pParentWnd->OnShowEntities (); break;
637
638     case IDC_BTN_FACEFIT: g_pParentWnd->OnFaceFit (); break;
639     case ID_VIEW_TEXTURE: g_pParentWnd->OnViewTexture (); break;
640     case ID_PATCH_INSPECTOR: g_pParentWnd->OnPatchInspector (); break;
641     case ID_CURVE_NEGATIVETEXTUREX: g_pParentWnd->OnCurveNegativeTextureX (); break;
642     case ID_CURVE_NEGATIVETEXTUREY: g_pParentWnd->OnCurveNegativeTextureY (); break;
643     case ID_CURVE_INSERTCOLUMN: g_pParentWnd->OnCurveInsertcolumn (); break;
644     case ID_CURVE_INSERTROW: g_pParentWnd->OnCurveInsertrow (); break;
645     case ID_CURVE_DELETECOLUMN: g_pParentWnd->OnCurveDeletecolumn (); break;
646     case ID_CURVE_DELETEROW: g_pParentWnd->OnCurveDeleterow (); break;
647     case ID_PATCH_TAB: g_pParentWnd->OnPatchTab (); break;
648     case ID_CAMERA_FORWARD: g_pParentWnd->OnCameraForward (TRUE); break;
649     case ID_CAMERA_BACK: g_pParentWnd->OnCameraBack (TRUE); break;
650     case ID_CAMERA_LEFT: g_pParentWnd->OnCameraLeft (TRUE); break;
651     case ID_CAMERA_RIGHT: g_pParentWnd->OnCameraRight (TRUE); break;
652     case ID_CAMERA_UP: g_pParentWnd->OnCameraUp (); break;
653     case ID_CAMERA_DOWN: g_pParentWnd->OnCameraDown (); break;
654     case ID_CAMERA_ANGLEUP: g_pParentWnd->OnCameraAngleup (); break;
655     case ID_CAMERA_ANGLEDOWN: g_pParentWnd->OnCameraAngledown (); break;
656     case ID_CAMERA_STRAFELEFT: g_pParentWnd->OnCameraStrafeleft (TRUE); break;
657     case ID_CAMERA_STRAFERIGHT: g_pParentWnd->OnCameraStraferight (TRUE); break;
658     case ID_GRID_TOGGLE: g_pParentWnd->OnGridToggle (); break;
659     case ID_VIEW_CONSOLE: g_pParentWnd->OnViewConsole (); break;
660     case ID_VIEW_CROSSHAIR: g_pParentWnd->OnViewCrosshair (); break;
661     case ID_SELECTION_TEXTURE_FIT: g_pParentWnd->OnSelectionTextureFit (); break;
662     case ID_SELECTION_TEXTURE_ROTATECLOCK: g_pParentWnd->OnSelectionTextureRotateclock (); break;
663     case ID_SELECTION_TEXTURE_ROTATECOUNTER: g_pParentWnd->OnSelectionTextureRotatecounter (); break;
664     case ID_SELECTION_TEXTURE_SCALEUP: g_pParentWnd->OnSelectionTextureScaleup (); break;
665     case ID_SELECTION_TEXTURE_SCALEDOWN: g_pParentWnd->OnSelectionTextureScaledown (); break;
666     case ID_SELECTION_TEXTURE_SHIFTLEFT: g_pParentWnd->OnSelectionTextureShiftleft (); break;
667     case ID_SELECTION_TEXTURE_SHIFTRIGHT: g_pParentWnd->OnSelectionTextureShiftright (); break;
668     case ID_SELECTION_TEXTURE_SHIFTUP: g_pParentWnd->OnSelectionTextureShiftup (); break;
669     case ID_SELECTION_TEXTURE_SHIFTDOWN: g_pParentWnd->OnSelectionTextureShiftdown (); break;
670     case ID_GRID_PREV: g_pParentWnd->OnGridPrev (); break;
671     case ID_GRID_NEXT: g_pParentWnd->OnGridNext (); break;
672     case ID_SELECTION_TEXTURE_SCALELEFT: g_pParentWnd->OnSelectionTextureScaleLeft (); break;
673     case ID_SELECTION_TEXTURE_SCALERIGHT: g_pParentWnd->OnSelectionTextureScaleRight (); break;
674     case ID_SELECTION_MOVEDOWN: g_pParentWnd->OnSelectionMovedown (); break;
675     case ID_SELECTION_MOVEUP: g_pParentWnd->OnSelectionMoveup (); break;
676     case ID_SELECTION_PRINT: g_pParentWnd->OnSelectionPrint (); break;
677     case ID_SELECTION_TOGGLESIZEPAINT: g_pParentWnd->OnSelectionTogglesizepaint (); break;
678     case ID_PATCH_NATURALIZE: g_pParentWnd->OnPatchNaturalize (); break;
679     case ID_SELECT_SNAPTOGRID: g_pParentWnd->OnSnapToGrid (); break;
680     case ID_SELECT_ALL: g_pParentWnd->OnSelectAll (); break;
681     case ID_SELECTION_INVERT: g_pParentWnd->OnSelectionInvert (); break;
682     }
683
684     return TRUE;
685 }
686
687 static gint timer (gpointer data)
688 {
689   MainFrame *wnd = (MainFrame*)data;
690   wnd->OnTimer ();
691   return TRUE;
692 }
693
694 static gint mainframe_delete (GtkWidget *widget, GdkEvent *event, gpointer data)
695 {
696   MainFrame *wnd = (MainFrame*)data;
697
698   wnd->OnDelete();
699
700   if (ConfirmModified())
701     return FALSE;
702
703   g_qeglobals_gui.d_edit = NULL;
704
705   return TRUE;
706 }
707
708 static void mainframe_destroy (GtkWidget *widget, gpointer data)
709 {
710   MainFrame *wnd = (MainFrame*)data;
711
712   // avoid saving prefs when the app is minimized
713   if (g_pParentWnd->IsSleeping())
714   {
715     Sys_Printf("Shutdown while sleeping, not saving prefs\n");
716     g_qeglobals.disable_ini = true;
717   }
718
719   // NOTE TTimo this is very clumsy, in MainFrame::OnDestroy we might call SavePrefs again
720   //   we will do more stuff in OnDestroy for window position saving too, so I guess this call is still relevant?
721   g_PrefsDlg.SavePrefs ();
722
723   wnd->OnDestroy ();
724
725   // shutdown modules
726   // NOTE: I've decided to do this before SavePrefs in case we broadcast some shutdown info
727   // and modules / plugins decide to save some stuff
728   g_pParentWnd->GetPlugInMgr().Shutdown();
729
730   delete wnd;
731
732   QGL_Shutdown();
733   g_PrefsDlg.Destroy ();
734   g_dlgSurface.Destroy ();
735   g_dlgFind.Destroy ();
736   g_PatchDialog.Destroy ();
737
738   gtk_main_quit ();
739 }
740
741 static gint mainframe_keypress (GtkWidget* widget, GdkEventKey* event, gpointer data)
742 {
743   unsigned int code = gdk_keyval_to_upper(event->keyval);
744
745   if(code == GDK_ISO_Left_Tab) {
746     code = GDK_Tab;
747   }
748
749 #ifdef DBG_KBD
750   Sys_Printf("key: %d (keyval: %d) (ctrl: %d)\n", code, event->keyval, event->state & GDK_CONTROL_MASK);
751 #endif
752
753   // return only if Texture Viewport  is in main window, otherwise if Tex viewport is in it's own window
754   // the Filter GtkEntry won't release focus
755   if ( g_pParentWnd->GetTexWnd()->m_pFilter == gtk_window_get_focus(GTK_WINDOW(widget)) )
756     if ( gtk_widget_is_focus( g_pParentWnd->GetTexWnd()->m_pFilter ) )
757       return FALSE;
758
759 #ifdef DBG_KBD
760   Sys_Printf("mainframe_keypress processing into a command\n");
761 #endif
762   for (int i = 0; i < g_nCommandCount; i++)
763   {
764     if (g_Commands[i].m_nKey == code)    // find a match?
765     {
766       // check modifiers
767       unsigned int nState = 0;
768       if (Sys_AltDown ())
769         nState |= RAD_ALT;
770       if ((event->state & GDK_CONTROL_MASK) != 0)
771         nState |= RAD_CONTROL;
772       if ((event->state & GDK_SHIFT_MASK) != 0)
773         nState |= RAD_SHIFT;
774       if ((g_Commands[i].m_nModifiers & 0x7) == nState)
775       {
776         HandleCommand (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
777         gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
778         return FALSE;
779       }
780     }
781   }
782
783   return TRUE;
784 }
785
786 static gint mainframe_keyrelease (GtkWidget* widget, GdkEventKey* event, gpointer data)
787 {
788   unsigned int code = gdk_keyval_to_upper(event->keyval);
789
790   if (gtk_accelerator_valid (event->keyval, (GdkModifierType)0))
791     return TRUE;
792
793   for (int i = 0; i < g_nCommandCount; i++)
794   {
795     if (g_Commands[i].m_nKey == code)    // find a match?
796     {
797       if(!g_Commands[i].m_nModifiers)
798       {
799         // Gef: Only call the handler if it's a key that needs keyup events
800         switch (g_Commands[i].m_nCommand)
801         {
802           case ID_CAMERA_FORWARD:
803           case ID_CAMERA_BACK:
804           case ID_CAMERA_LEFT:
805           case ID_CAMERA_RIGHT:
806           case ID_CAMERA_STRAFELEFT:
807           case ID_CAMERA_STRAFERIGHT:
808           {
809             HandleKeyUp (NULL, GINT_TO_POINTER (g_Commands[i].m_nCommand));
810             gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_release_event");
811           }
812
813         }
814         return FALSE;
815       }
816     }
817   }
818
819   return TRUE;
820 }
821
822
823 // =============================================================================
824 // Window creation functions
825
826 void AddMenuItem (GtkWidget* item, unsigned int id)
827 {
828   for (int i = 0; i < g_nCommandCount; i++)
829     if (g_Commands[i].m_nCommand == id)
830     {
831       g_object_set_data (G_OBJECT (g_pParentWnd->m_pWidget), g_Commands[i].m_strMenu, item);
832       break;
833     }
834 }
835
836 void MainFrame::handle_help_command(int id)
837 {
838   OpenURL(mHelpURLs[id]->GetBuffer());
839 }
840
841 /*!
842 needed for hooking in Gtk+
843 */
844 void HandleHelpCommand (GtkWidget *widget, gpointer data)
845 {
846   int id = GPOINTER_TO_INT (data);
847   g_pParentWnd->handle_help_command(id);
848 }
849
850 void MainFrame::process_xlink (Str &FileName, const char *menu_name, const char *base_url, GtkWidget *menu, GtkAccelGroup *accel)
851 {
852   xmlDocPtr pDoc;
853   pDoc = xmlParseFile(FileName.GetBuffer());
854   if (pDoc)
855   {
856     Sys_Printf("Processing .xlink file '%s'\n", FileName.GetBuffer());
857     // create sub menu
858     GtkWidget* menu_in_menu = create_menu_in_menu_with_mnemonic(menu, menu_name);
859     // start walking the nodes, find the 'links' one
860     xmlNodePtr pNode = pDoc->children;
861     while (pNode && strcmp((const char*)pNode->name, "links"))
862       pNode=pNode->next;
863     if (pNode)
864     {
865       pNode = pNode->children;
866       while(pNode)
867       {
868         if (!strcmp((const char*)pNode->name, "item"))
869         {
870           // process the URL
871           Str *url;
872           if (strstr((char *)xmlGetProp(pNode, (xmlChar *)"url"), "http://"))
873           {
874             // complete URL
875             url = new Str;
876             *url = (char *)xmlGetProp(pNode, (xmlChar *)"url");
877           }
878           else
879           {
880             // relative URL
881             url = new Str;
882             *url = base_url;
883             *url += (char *)xmlGetProp(pNode, (xmlChar *)"url");
884           }
885           mHelpURLs.push_back(url);
886           create_menu_item_with_mnemonic (menu_in_menu, (char *)xmlGetProp(pNode, (xmlChar *)"name"), GTK_SIGNAL_FUNC(HandleHelpCommand), mHelpURLs.size()-1);
887         }
888         pNode=pNode->next;
889       }
890     }
891     xmlFreeDoc(pDoc);
892   }
893   else
894   {
895     Sys_Printf("'%s' not found / parse failed\n", FileName.GetBuffer());
896   }
897 }
898
899 void MainFrame::create_game_help_menu (GtkWidget *menu, GtkAccelGroup *accel)
900 {
901   Str FileName;
902   list<CGameDescription *>::iterator iGame;
903
904   // start in the global dir
905   FileName = g_strAppPath;
906   FileName += "global.xlink";
907   process_xlink(FileName, "General", g_strAppPath.GetBuffer(), menu, accel);
908
909   for (iGame = g_PrefsDlg.mGamesDialog.mGames.begin(); iGame != g_PrefsDlg.mGamesDialog.mGames.end(); iGame++)
910   {
911     FileName = (*iGame)->mGameToolsPath;
912     FileName += "game.xlink";
913     process_xlink(FileName, (*iGame)->mGameName, (*iGame)->mGameToolsPath.GetBuffer(), menu, accel);
914   }
915 }
916
917 void MainFrame::create_main_menu (GtkWidget *window, GtkWidget *vbox)
918 {
919   GtkWidget *handle_box, *menu_bar, *menu, *menu_in_menu, *menu_3, *item;
920   GtkAccelGroup *accel;
921
922   g_bIgnoreCommands++;
923   accel = gtk_accel_group_new ();
924   global_accel = accel;
925   gtk_window_add_accel_group (GTK_WINDOW (window), accel);
926
927   handle_box = gtk_handle_box_new ();
928   gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
929   gtk_widget_show (handle_box);
930
931   menu_bar = gtk_menu_bar_new ();
932   gtk_container_add (GTK_CONTAINER (handle_box), menu_bar);
933   gtk_widget_show (menu_bar);
934
935   // File menu
936   menu = create_sub_menu_with_mnemonic (menu_bar, _("_File"));
937   if (g_PrefsDlg.m_bDetachableMenus)
938     menu_tearoff (menu);
939
940   create_menu_item_with_mnemonic (menu, _("_New Map"),
941                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEW);
942   menu_separator (menu);
943
944   //++timo temporary experimental stuff for sleep mode..
945   item = create_menu_item_with_mnemonic (menu, _("_Sleep"),
946                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SLEEP);
947   g_object_set_data (G_OBJECT (window), "menu_file_sleep", item );
948   menu_separator (menu);
949   // end experimental
950
951   item = create_menu_item_with_mnemonic (menu, _("_Open..."),
952                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_OPEN);
953   g_object_set_data (G_OBJECT (window), "menu_file_open", item);
954   create_menu_item_with_mnemonic (menu, _("_Import..."), // Hydra: give it it's proper name
955                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_IMPORTMAP);
956   item = create_menu_item_with_mnemonic (menu, _("_Save"),
957                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVE);
958   g_object_set_data (G_OBJECT (window), "menu_file_save", item);
959   create_menu_item_with_mnemonic (menu, _("Save _as..."),
960                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEAS);
961   create_menu_item_with_mnemonic (menu, _("Save s_elected..."),
962                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXPORTMAP);
963   menu_separator (menu);
964   item = create_menu_item_with_mnemonic (menu, _("Save re_gion..."),
965                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_SAVEREGION);
966   g_object_set_data (G_OBJECT (window), "menu_file_saveregion", item);
967   menu_separator (menu);
968   create_menu_item_with_mnemonic (menu, _("New p_roject..."),
969                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_NEWPROJECT);
970   create_menu_item_with_mnemonic (menu, _("Load _project..."),
971                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_LOADPROJECT);
972   create_menu_item_with_mnemonic (menu, _("Pro_ject settings..."),
973                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_PROJECTSETTINGS);
974   menu_separator (menu);
975   create_menu_item_with_mnemonic (menu, _("_Pointfile..."),
976                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_POINTFILE);
977   menu_separator (menu);
978   item = create_menu_item_with_mnemonic (menu, _("Recent Files"),
979                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT1);
980   g_object_set_data (G_OBJECT (item), "accel", accel);
981   gtk_widget_set_sensitive (item, FALSE);
982   MRU_AddWidget (item, 0);
983   item = create_menu_item_with_mnemonic (menu, "2",
984                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT2);
985   gtk_widget_hide (item);
986   MRU_AddWidget (item, 1);
987   item = create_menu_item_with_mnemonic (menu, "3",
988                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT3);
989   gtk_widget_hide (item);
990   MRU_AddWidget (item, 2);
991   item = create_menu_item_with_mnemonic (menu, "4",
992                            GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_RECENT4);
993   gtk_widget_hide (item);
994   MRU_AddWidget (item, 3);
995   menu_separator (menu);
996   item = create_menu_item_with_mnemonic (menu, _("Check for GtkRadiant update (web)"),
997     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_CHECKUPDATE);
998   // disable, the functionality is no longer available
999   gtk_widget_set_sensitive( item, FALSE );
1000
1001   create_menu_item_with_mnemonic (menu, _("E_xit"),
1002                     GTK_SIGNAL_FUNC (HandleCommand), ID_FILE_EXIT);
1003
1004   // Edit menu
1005   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Edit"));
1006   if (g_PrefsDlg.m_bDetachableMenus)
1007     menu_tearoff (menu);
1008   item = create_menu_item_with_mnemonic (menu, _("_Undo"),
1009                            GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_UNDO);
1010   g_object_set_data (G_OBJECT (window), "menu_edit_undo", item);
1011   item = create_menu_item_with_mnemonic (menu, _("_Redo"),
1012                            GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_REDO);
1013   g_object_set_data (G_OBJECT (window), "menu_edit_redo", item);
1014   menu_separator (menu);
1015   item = create_menu_item_with_mnemonic (menu, _("_Copy"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_COPYBRUSH);
1016   item = create_menu_item_with_mnemonic (menu, _("_Paste"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSH);
1017   item = create_menu_item_with_mnemonic (menu, _("P_aste To Camera"), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_PASTEBRUSHTOCAMERA);
1018   item = create_menu_item_with_mnemonic (menu, _("_Delete"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1019   g_object_set_data (G_OBJECT (window), "menu_selection_delete", item);
1020   menu_separator (menu);
1021   create_menu_item_with_mnemonic (menu, _("Map Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_MAPINFO);
1022   create_menu_item_with_mnemonic (menu, _("Entity Info..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_ENTITYINFO);
1023   menu_separator (menu);
1024   create_menu_item_with_mnemonic (menu, _("Brush Scripts..."), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_SCRIPTS);
1025   menu_separator (menu);
1026   create_menu_item_with_mnemonic (menu, _("Load Pre_fab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_LOADPREFAB);
1027   create_menu_item_with_mnemonic (menu, _("Save Selection as Prefab..."), GTK_SIGNAL_FUNC (HandleCommand), ID_EDIT_SAVEPREFAB);
1028   menu_separator (menu);
1029   create_menu_item_with_mnemonic (menu, _("Preferences..."), GTK_SIGNAL_FUNC (HandleCommand), ID_PREFS);
1030
1031   // View menu
1032   menu = create_sub_menu_with_mnemonic (menu_bar, _("_View"));
1033   if (g_PrefsDlg.m_bDetachableMenus)
1034     menu_tearoff (menu);
1035
1036   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Toggle"));
1037   create_menu_item_with_mnemonic (menu_in_menu, _("Camera View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECAMERA);
1038   create_menu_item_with_mnemonic (menu_in_menu, _("Console View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLECONSOLE);
1039   item = create_menu_item_with_mnemonic (menu_in_menu, _("Entity View"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITY);
1040   g_object_set_data (G_OBJECT (window), "menu_view_entity", item);
1041   //  create_menu_item_with_mnemonic (menu_in_menu, "Groups View", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_GROUPS);
1042   create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW);
1043   create_menu_item_with_mnemonic (menu_in_menu, _("YZ (Side)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_YZ);
1044   create_menu_item_with_mnemonic (menu_in_menu, _("XZ (Front)"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEVIEW_XZ);
1045   create_menu_item_with_mnemonic (menu_in_menu, _("Z View"), GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLEZ);
1046   menu_separator (menu);
1047   item = create_menu_item_with_mnemonic (menu, _("_Center"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTER);
1048   item = create_menu_item_with_mnemonic (menu, _("_Center 2d"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CENTERVIEW);
1049   item = create_menu_item_with_mnemonic (menu, _("_Up Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_UPFLOOR);
1050   item = create_menu_item_with_mnemonic (menu, _("_Down Floor"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_DOWNFLOOR);
1051   menu_separator (menu);
1052   item = create_menu_item_with_mnemonic (menu, _("_Next (XY, YZ, XY)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEXTVIEW);
1053   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Layout"));
1054   create_menu_item_with_mnemonic (menu_in_menu, _("XY (Top)"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_XY);
1055   create_menu_item_with_mnemonic (menu_in_menu, _("YZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SIDE);
1056   create_menu_item_with_mnemonic (menu_in_menu, _("XZ"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_FRONT);
1057   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Zoom"));
1058   create_menu_item_with_mnemonic (menu_in_menu, _("_XY 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_100);
1059   item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMIN);
1060   item = create_menu_item_with_mnemonic (menu_in_menu, _("XY Zoom _Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZOOMOUT);
1061   menu_separator (menu_in_menu);
1062   create_menu_item_with_mnemonic (menu_in_menu, _("_Z 100%"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_Z100);
1063   item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoo_m In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMIN);
1064   g_object_set_data (G_OBJECT (window), "menu_view_zzoomin", item);
1065   item = create_menu_item_with_mnemonic (menu_in_menu, _("Z Zoom O_ut"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ZZOOMOUT);
1066   g_object_set_data (G_OBJECT (window), "menu_view_zzoomout", item);
1067   menu_separator (menu_in_menu);
1068   item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom In"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEIN);
1069   item = create_menu_item_with_mnemonic (menu_in_menu, _("Cubic Clip Zoom Out"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBEOUT);
1070   menu_separator (menu);
1071
1072   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Show"));
1073   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Angles"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWANGLES, FALSE);
1074   g_object_set_data (G_OBJECT (window), "menu_view_showangles", item);
1075   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show _Names"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWNAMES, TRUE);
1076   g_object_set_data (G_OBJECT (window), "menu_view_shownames", item);
1077   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Blocks"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWBLOCKS, FALSE);
1078   g_object_set_data (G_OBJECT (window), "menu_view_showblocks", item);
1079   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show C_oordinates"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWCOORDINATES, TRUE);
1080   g_object_set_data (G_OBJECT (window), "menu_view_showcoordinates", item);
1081   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Window Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWOUTLINE, TRUE);
1082   g_object_set_data (G_OBJECT (window), "menu_view_showoutline", item);
1083   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show ZBuffered Outline"), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_NOOUTLINE, TRUE);
1084   g_object_set_data (G_OBJECT (window), "menu_selection_nooutline", item);
1085   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Axes"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWAXES, TRUE);
1086   g_object_set_data (G_OBJECT (window), "menu_view_showaxes", item);
1087   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Show Workzone"), GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_SHOWWORKZONE, FALSE);
1088   g_object_set_data (G_OBJECT (window), "menu_view_showworkzone", item);
1089
1090   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Filter"));
1091   create_check_menu_item_with_mnemonic (menu_in_menu, _("World"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_WORLD, FALSE);
1092   create_check_menu_item_with_mnemonic (menu_in_menu, _("Entities"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_ENTITIES, FALSE);
1093   create_check_menu_item_with_mnemonic (menu_in_menu, _("Areaportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_AREAPORTALS, FALSE);
1094   create_check_menu_item_with_mnemonic (menu_in_menu, _("Translucent"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRANSLUCENT, FALSE);
1095   create_check_menu_item_with_mnemonic (menu_in_menu, _("Liquids"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIQUIDS, FALSE);
1096   create_check_menu_item_with_mnemonic (menu_in_menu, _("Caulk"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CAULK, FALSE);
1097   create_check_menu_item_with_mnemonic (menu_in_menu, _("Clips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLIPS, FALSE);
1098   create_check_menu_item_with_mnemonic (menu_in_menu, _("Paths"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATHS, FALSE);
1099   create_check_menu_item_with_mnemonic (menu_in_menu, _("Clusterportals"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_CLUSTERPORTALS, FALSE);
1100   create_check_menu_item_with_mnemonic (menu_in_menu, _("Lights"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTS, FALSE);
1101   create_check_menu_item_with_mnemonic (menu_in_menu, _("Structural"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_STRUCTURAL, FALSE);
1102   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Lightgrid"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_LIGHTGRID, FALSE);
1103   g_object_set_data (G_OBJECT (window), "menu_filter_lightgrid", item);
1104   create_check_menu_item_with_mnemonic (menu_in_menu, _("Patches"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_PATCHES, FALSE);
1105   create_check_menu_item_with_mnemonic (menu_in_menu, _("Details"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_DETAILS, FALSE);
1106   create_check_menu_item_with_mnemonic (menu_in_menu, _("Hints"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_HINTSSKIPS, FALSE);
1107   create_check_menu_item_with_mnemonic (menu_in_menu, _("Models"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_MODELS, FALSE);
1108   create_check_menu_item_with_mnemonic (menu_in_menu, _("Triggers"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_TRIGGERS, FALSE);
1109   create_check_menu_item_with_mnemonic (menu_in_menu, _("Botclips"), GTK_SIGNAL_FUNC (HandleCommand), ID_FILTER_BOTCLIPS, FALSE);
1110
1111   menu_separator (menu);
1112   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Hide/Show"));
1113   create_menu_item_with_mnemonic (menu_in_menu, _("Hide Selected"),
1114                     GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_HIDESELECTED);
1115   create_menu_item_with_mnemonic (menu_in_menu, _("Show Hidden"),
1116                     GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_HIDESHOW_SHOWHIDDEN);
1117   menu_separator (menu);
1118   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Entities as"));
1119   g_object_set_data (G_OBJECT (window), "view_entitiesas_menu", menu_in_menu);
1120   item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("Bounding box"),
1121                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_BOUNDINGBOX,FALSE);
1122   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_boundingbox", item);
1123   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Wireframe"),
1124                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_WIREFRAME,FALSE);
1125   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_wireframe", item);
1126   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Wireframe"),
1127                                  GTK_SIGNAL_FUNC (HandleCommand),ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME,FALSE);
1128   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedwireframe", item);
1129   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Selected Skinned"),
1130                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SELECTEDSKINNED,FALSE);
1131   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_selectedskinned", item);
1132   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned"),
1133                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNED,FALSE);
1134   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinned", item);
1135   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Skinned and Boxed"),
1136                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_ENTITIESAS_SKINNEDANDBOXED,FALSE);
1137   g_object_set_data (G_OBJECT (window), "menu_view_entitiesas_skinnedandboxed", item);
1138   menu_separator (menu);
1139   item = create_check_menu_item_with_mnemonic (menu, _("Cubic Clipping"),
1140                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CUBICCLIPPING, TRUE);
1141   g_object_set_data (G_OBJECT (window), "menu_view_cubicclipping", item);
1142   menu_separator (menu);
1143   item = create_check_menu_item_with_mnemonic (menu, _("OpenGL Lighting"),
1144                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_OPENGLLIGHTING, FALSE);
1145   g_object_set_data (G_OBJECT (window), "menu_view_opengllighting", item);
1146
1147   // Selection menu
1148   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Selection"));
1149   if (g_PrefsDlg.m_bDetachableMenus)
1150     menu_tearoff (menu);
1151
1152   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Drag"));
1153   create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Edges"),
1154                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGEDGES);
1155   create_menu_item_with_mnemonic (menu_in_menu, _("Drag _Vertices"),
1156                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DRAGVERTECIES);
1157   menu_separator (menu);
1158   create_menu_item_with_mnemonic (menu, _("_Clone"),
1159                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CLONE);
1160   item = create_menu_item_with_mnemonic (menu, _("Deselect"),
1161                            GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DESELECT);
1162   item = create_menu_item_with_mnemonic (menu, _("Invert"),
1163                            GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_INVERT);
1164 #ifndef QUAKE3
1165   create_menu_item_with_mnemonic (menu, _("_Delete"),
1166                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_DELETE);
1167 #endif
1168   menu_separator (menu);
1169   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Flip"));
1170   create_menu_item_with_mnemonic (menu_in_menu, _("Flip _X"),
1171                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPX);
1172   create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Y"),
1173                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPY);
1174   create_menu_item_with_mnemonic (menu_in_menu, _("Flip _Z"),
1175                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_FLIPZ);
1176   menu_separator (menu);
1177   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Rotate"));
1178   create_menu_item_with_mnemonic (menu_in_menu, _("Rotate X"),
1179                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEX);
1180   create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Y"),
1181                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEY);
1182   create_menu_item_with_mnemonic (menu_in_menu, _("Rotate Z"),
1183                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ROTATEZ);
1184   create_menu_item_with_mnemonic (menu_in_menu, _("Arbitrary rotation..."),
1185                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_ARBITRARYROTATION);
1186   menu_separator (menu);
1187   create_menu_item_with_mnemonic (menu, _("Scale..."), GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SCALE);
1188   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("CSG"));
1189   create_menu_item_with_mnemonic (menu_in_menu, _("Make _Hollow"),
1190                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKEHOLLOW);
1191   create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Subtract"),
1192                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGSUBTRACT);
1193   create_menu_item_with_mnemonic (menu_in_menu, _("CSG _Merge"),
1194                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CSGMERGE);
1195   menu_separator (menu);
1196   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Select"));
1197   create_menu_item_with_mnemonic (menu_in_menu, _("Select Complete _Tall"),
1198                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTCOMPLETETALL);
1199   create_menu_item_with_mnemonic (menu_in_menu, _("Select T_ouching"),
1200                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTTOUCHING);
1201   create_menu_item_with_mnemonic (menu_in_menu, _("Select _Partial Tall"),
1202                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTPARTIALTALL);
1203   create_menu_item_with_mnemonic (menu_in_menu, _("Select _Inside"),
1204                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECTINSIDE);
1205   create_menu_item_with_mnemonic (menu_in_menu, "Select Func _Group", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_FUNC_GROUP);
1206 #ifndef QUAKE3
1207   create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Left"),
1208                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1209   create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Right"),
1210                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1211   create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Up"),
1212                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1213   create_menu_item_with_mnemonic (menu_in_menu, _("Nudge Down"),
1214                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1215 #endif
1216   menu_separator (menu);
1217   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Clipper"));
1218   create_menu_item_with_mnemonic (menu_in_menu, _("Toggle Clipper"),
1219                     GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CLIPPER);
1220   menu_separator (menu_in_menu);
1221   create_menu_item_with_mnemonic (menu_in_menu, _("Clip selection"),
1222                     GTK_SIGNAL_FUNC (HandleCommand), ID_CLIP_SELECTED);
1223   create_menu_item_with_mnemonic (menu_in_menu, _("Split selection"),
1224                     GTK_SIGNAL_FUNC (HandleCommand), ID_SPLIT_SELECTED);
1225   create_menu_item_with_mnemonic (menu_in_menu, _("Flip Clip orientation"),
1226                     GTK_SIGNAL_FUNC (HandleCommand), ID_FLIP_CLIP);
1227   menu_separator (menu);
1228   create_menu_item_with_mnemonic (menu, _("Connect entities"),
1229                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_CONNECT);
1230   create_menu_item_with_mnemonic (menu, _("Ungroup entity"),
1231                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_UNGROUPENTITY);
1232   create_menu_item_with_mnemonic (menu, _("Make detail"),
1233                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_DETAIL);
1234   create_menu_item_with_mnemonic (menu, _("Make structural"),
1235                     GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MAKE_STRUCTURAL);
1236
1237   // BSP menu
1238   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Bsp"));
1239
1240   menu_separator (menu);
1241   g_object_set_data (G_OBJECT (window), "menu_bsp", menu);
1242
1243   // Grid menu
1244   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Grid"));
1245   if (g_PrefsDlg.m_bDetachableMenus)
1246     menu_tearoff (menu);
1247
1248   item = create_radio_menu_item_with_mnemonic (menu, NULL, _("Grid0.25"),
1249                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_025, FALSE);
1250   g_object_set_data (G_OBJECT (window), "menu_grid_025", item);
1251   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid0.5"),
1252                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_05, FALSE);
1253   g_object_set_data (G_OBJECT (window), "menu_grid_05", item);
1254   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid1"),
1255                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_1, FALSE);
1256   g_object_set_data (G_OBJECT (window), "menu_grid_1", item);
1257   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid2"),
1258                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_2, FALSE);
1259   g_object_set_data (G_OBJECT (window), "menu_grid_2", item);
1260   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid4"),
1261                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_4, FALSE);
1262   g_object_set_data (G_OBJECT (window), "menu_grid_4", item);
1263   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid8"),
1264                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_8, TRUE);
1265   g_object_set_data (G_OBJECT (window), "menu_grid_8", item);
1266   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid16"),
1267                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_16, FALSE);
1268   g_object_set_data (G_OBJECT (window), "menu_grid_16", item);
1269   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid32"),
1270                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_32, FALSE);
1271   g_object_set_data (G_OBJECT (window), "menu_grid_32", item);
1272   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid64"),
1273                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_64, FALSE);
1274   g_object_set_data (G_OBJECT (window), "menu_grid_64", item);
1275   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid128"),
1276                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_128, FALSE);
1277   g_object_set_data (G_OBJECT (window), "menu_grid_128", item);
1278   item = create_radio_menu_item_with_mnemonic (menu, item, _("Grid256"),
1279                                  GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_256, FALSE);
1280   g_object_set_data (G_OBJECT (window), "menu_grid_256", item);
1281   menu_separator (menu);
1282   item = create_check_menu_item_with_mnemonic (menu, _("Snap to grid"),
1283                                  GTK_SIGNAL_FUNC (HandleCommand), ID_SNAPTOGRID, TRUE);
1284   g_object_set_data (G_OBJECT (window), "menu_snaptogrid", item);
1285
1286   // Textures menu
1287   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Textures"));
1288   if (g_PrefsDlg.m_bDetachableMenus)
1289     menu_tearoff (menu);
1290
1291   item = create_check_menu_item_with_mnemonic (menu, _("Show In _Use"),
1292                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWINUSE, FALSE);
1293   g_object_set_data (G_OBJECT (window), "menu_textures_showinuse", item);
1294   item = create_check_menu_item_with_mnemonic (menu, _("Show _All"),
1295                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHOWALL, FALSE);
1296   g_object_set_data (G_OBJECT (window), "menu_textures_showall", item);
1297   menu_separator (menu);
1298   item = create_check_menu_item_with_mnemonic (menu, _("Show shaders"),
1299                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERS_SHOW, FALSE);
1300   g_object_set_data (G_OBJECT (window), "menu_textures_shaders_show", item);
1301   item = create_menu_item_with_mnemonic (menu, _("Flush & Reload Shaders"),
1302                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_RELOADSHADERS);
1303   g_object_set_data (G_OBJECT (window), "menu_textures_reloadshaders", item);
1304   item = create_menu_item_with_mnemonic (menu, _("Load directory..."),
1305                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOAD);
1306   g_object_set_data (G_OBJECT (window), "menu_textures_load", item);
1307   item = create_menu_item_with_mnemonic (menu, _("Directory list..."),
1308                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_LOADLIST);
1309   menu_separator (menu);
1310
1311   item = create_menu_item_with_mnemonic (menu, _("_Surface Inspector"),
1312                            GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_INSPECTOR);
1313   menu_separator (menu);
1314   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Render Quality"));
1315   g_object_set_data (G_OBJECT (window), "render_quality_menu", menu_in_menu);
1316   item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("_Wireframe"),
1317                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_WIREFRAME, FALSE);
1318   g_object_set_data (G_OBJECT (window), "menu_textures_wireframe", item);
1319   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Flat shade"),
1320                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_FLATSHADE, FALSE);
1321   g_object_set_data (G_OBJECT (window), "menu_textures_flatshade", item);
1322   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Nearest"),
1323                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEAREST, FALSE);
1324   g_object_set_data (G_OBJECT (window), "menu_view_nearest", item);
1325   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("Nearest _Mipmap"),
1326                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_NEARESTMIPMAP, FALSE);
1327   g_object_set_data (G_OBJECT (window), "menu_view_nearestmipmap", item);
1328   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Linear"),
1329                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_LINEAR, FALSE);
1330   g_object_set_data (G_OBJECT (window), "menu_view_linear", item);
1331   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("_Bilinear"),
1332                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEAR, FALSE);
1333   g_object_set_data (G_OBJECT (window), "menu_view_bilinear", item);
1334   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("B_ilinear Mipmap"),
1335                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_BILINEARMIPMAP, FALSE);
1336   g_object_set_data (G_OBJECT (window), "menu_view_bilinearmipmap", item);
1337   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("T_rilinear"),
1338                                  GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TRILINEAR, FALSE);
1339   g_object_set_data (G_OBJECT (window), "menu_view_trilinear", item);
1340   create_menu_item_with_mnemonic (menu, _("Find / Replace..."),
1341                     GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURE_REPLACEALL);
1342
1343   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Lock"));
1344   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Moves"),
1345                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_LOCK, TRUE);
1346   g_object_set_data (G_OBJECT (window), "menu_toggle_lock", item);
1347   item = create_check_menu_item_with_mnemonic (menu_in_menu, _("Rotations"),
1348                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TOGGLE_ROTATELOCK, TRUE);
1349   g_object_set_data (G_OBJECT (window), "menu_toggle_rotatelock", item);
1350   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Texture Window Scale"));
1351   item = create_radio_menu_item_with_mnemonic (menu_in_menu, NULL, _("200%"),
1352                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_200, FALSE);
1353   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_200", item);
1354   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("100%"),
1355                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_100, FALSE);
1356   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_100", item);
1357   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("50%"),
1358                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_50, FALSE);
1359   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_50", item);
1360   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("25%"),
1361                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_25, FALSE);
1362   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_25", item);
1363   item = create_radio_menu_item_with_mnemonic (menu_in_menu, item, _("10%"),
1364                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_TEXTUREWINDOWSCALE_10, FALSE);
1365   g_object_set_data (G_OBJECT (window), "menu_textures_texturewindowscale_10", item);
1366   item = menu_separator (menu);
1367   item = create_check_menu_item_with_mnemonic (menu, _("shaderlist.txt only"),
1368                                  GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTURES_SHADERLISTONLY, FALSE);
1369   g_object_set_data (G_OBJECT (window), "menu_textures_shaderlistonly", item);
1370   item = menu_separator (menu);
1371   g_object_set_data (G_OBJECT (window), "menu_textures_separator", item);
1372   g_object_set_data (G_OBJECT (window), "menu_textures", menu);
1373
1374   // Misc menu
1375   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Misc"));
1376   if (g_PrefsDlg.m_bDetachableMenus)
1377     menu_tearoff (menu);
1378
1379   create_menu_item_with_mnemonic (menu, _("_Benchmark"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_BENCHMARK);
1380   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Colors"));
1381   menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Themes"));
1382   create_menu_item_with_mnemonic (menu_3, _("QE4 Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETORIGINAL);
1383   create_menu_item_with_mnemonic (menu_3, _("Q3Radiant Original"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETQER);
1384   create_menu_item_with_mnemonic (menu_3, _("Black and Green"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETBLACK);
1385   create_menu_item_with_mnemonic (menu_3, _("Maya/Max/Lightwave Emulation"), GTK_SIGNAL_FUNC (HandleCommand), ID_COLOR_SETYDNAR);
1386
1387   menu_separator (menu_in_menu);
1388   create_menu_item_with_mnemonic (menu_in_menu, _("_Texture Background..."),
1389                     GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREBK);
1390   create_menu_item_with_mnemonic (menu_in_menu, _("Grid Background..."),
1391                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_XYBK);
1392   create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major..."),
1393                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR);
1394   create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor..."),
1395                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR);
1396   create_menu_item_with_mnemonic (menu_in_menu, _("Grid Major Small..."),
1397                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MAJOR_ALT);
1398   create_menu_item_with_mnemonic (menu_in_menu, _("Grid Minor Small..."),
1399                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_MINOR_ALT);
1400   create_menu_item_with_mnemonic (menu_in_menu, _("Grid Text..."),
1401                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDTEXT);
1402   create_menu_item_with_mnemonic (menu_in_menu, _("Grid Block..."),
1403                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_GRIDBLOCK);
1404   create_menu_item_with_mnemonic (menu_in_menu, _("Default Brush..."),
1405                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_BRUSH);
1406   create_menu_item_with_mnemonic (menu_in_menu, _("Camera Background..."),
1407                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CAMERABACK);
1408   create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush..."),
1409                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH);
1410   create_menu_item_with_mnemonic (menu_in_menu, _("Selected Brush (Camera)..."),
1411                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_SELECTEDBRUSH3D);
1412   create_menu_item_with_mnemonic (menu_in_menu, _("Clipper..."),
1413                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_CLIPPER);
1414   create_menu_item_with_mnemonic (menu_in_menu, _("Active View name..."),
1415                     GTK_SIGNAL_FUNC (HandleCommand), ID_COLORS_VIEWNAME);
1416
1417   create_menu_item_with_mnemonic (menu, _("_Gamma..."),
1418                     GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_GAMMA);
1419   create_menu_item_with_mnemonic (menu, _("Find brush..."),
1420                     GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_FINDBRUSH);
1421   item = create_menu_item_with_mnemonic (menu, _("Next leak spot"),
1422                            GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_NEXTLEAKSPOT);
1423   item = create_menu_item_with_mnemonic (menu, _("Previous leak spot"),
1424                            GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PREVIOUSLEAKSPOT);
1425   create_menu_item_with_mnemonic (menu, _("_Print XY View"), GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_PRINTXY);
1426   item = create_menu_item_with_mnemonic (menu, _("_Select Entity Color..."),
1427                            GTK_SIGNAL_FUNC (HandleCommand), ID_MISC_SELECTENTITYCOLOR);
1428   g_object_set_data (G_OBJECT (window), "menu_misc_selectentitycolor", item);
1429
1430   // Region menu
1431   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Region"));
1432   if (g_PrefsDlg.m_bDetachableMenus)
1433     menu_tearoff (menu);
1434
1435   create_menu_item_with_mnemonic (menu, _("_Off"),
1436                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_OFF);
1437   create_menu_item_with_mnemonic (menu, _("_Set XY"),
1438                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETXY);
1439   create_menu_item_with_mnemonic (menu, _("Set _Tall Brush"),
1440                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETTALLBRUSH);
1441   create_menu_item_with_mnemonic (menu, _("Set _Brush"),
1442                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETBRUSH);
1443   create_menu_item_with_mnemonic (menu, _("Set Se_lected Brushes"),
1444                     GTK_SIGNAL_FUNC (HandleCommand), ID_REGION_SETSELECTION);
1445
1446   // Brush menu
1447   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Brush"));
1448   if (g_PrefsDlg.m_bDetachableMenus)
1449     menu_tearoff (menu);
1450
1451   item = create_menu_item_with_mnemonic (menu, _("3 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_3SIDED);
1452   item = create_menu_item_with_mnemonic (menu, _("4 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_4SIDED);
1453   item = create_menu_item_with_mnemonic (menu, _("5 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_5SIDED);
1454   item = create_menu_item_with_mnemonic (menu, _("6 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_6SIDED);
1455   item = create_menu_item_with_mnemonic (menu, _("7 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_7SIDED);
1456   item = create_menu_item_with_mnemonic (menu, _("8 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_8SIDED);
1457   item = create_menu_item_with_mnemonic (menu, _("9 sided"), GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_9SIDED);
1458   menu_separator (menu);
1459   create_menu_item_with_mnemonic (menu, _("Arbitrary sided..."),
1460                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_ARBITRARYSIDED);
1461   menu_separator (menu);
1462   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Primitives"));
1463   create_menu_item_with_mnemonic (menu_in_menu, _("Cone..."),
1464                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_MAKECONE);
1465   create_menu_item_with_mnemonic (menu_in_menu, _("Sphere..."),
1466                     GTK_SIGNAL_FUNC (HandleCommand), ID_BRUSH_PRIMITIVES_SPHERE);
1467
1468   // Curve menu
1469   if (!g_pGameDescription->mNoPatch)
1470   {
1471   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Curve"));
1472   if (g_PrefsDlg.m_bDetachableMenus)
1473     menu_tearoff (menu);
1474
1475   create_menu_item_with_mnemonic (menu, _("Cylinder"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHTUBE);
1476   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More Cylinders"));
1477   create_menu_item_with_mnemonic (menu_in_menu, _("Dense Cylinder"),
1478                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHDENSETUBE);
1479   create_menu_item_with_mnemonic (menu_in_menu, _("Very Dense Cylinder"),
1480                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHVERYDENSETUBE);
1481   create_menu_item_with_mnemonic (menu_in_menu, _("Square Cylinder"),
1482                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHSQUARE);
1483   menu_separator (menu);
1484   create_menu_item_with_mnemonic (menu, _("End cap"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHENDCAP);
1485   create_menu_item_with_mnemonic (menu, _("Bevel"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHBEVEL);
1486   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("More End caps, Bevels"));
1487   create_menu_item_with_mnemonic (menu_in_menu, _("Square Endcap"),
1488                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL);
1489   create_menu_item_with_mnemonic (menu_in_menu, _("Square Bevel"),
1490                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP);
1491   menu_separator (menu);
1492   create_menu_item_with_mnemonic (menu, _("Cone"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PATCHCONE);
1493   item = create_menu_item_with_mnemonic (menu, _("Sphere"),
1494                            GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_PRIMITIVES_SPHERE);
1495   gtk_widget_set_sensitive (item, FALSE);
1496   menu_separator (menu);
1497   item = create_menu_item_with_mnemonic (menu, _("Simple Patch Mesh..."),
1498                            GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_SIMPLEPATCHMESH);
1499   g_object_set_data (G_OBJECT (window), "menu_simplepatchmesh", item);
1500   menu_separator (menu);
1501   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Insert"));
1502   create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Columns"),
1503                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTCOLUMN);
1504   create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Columns"),
1505                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDCOLUMN);
1506   menu_separator (menu_in_menu);
1507   create_menu_item_with_mnemonic (menu_in_menu, _("Insert (2) Rows"),
1508                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_INSERTROW);
1509   create_menu_item_with_mnemonic (menu_in_menu, _("Add (2) Rows"),
1510                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERT_ADDROW);
1511   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Delete"));
1512   create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Columns"),
1513                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTCOLUMN);
1514   create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Columns"),
1515                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTCOLUMN);
1516   menu_separator (menu_in_menu);
1517   create_menu_item_with_mnemonic (menu_in_menu, _("First (2) Rows"),
1518                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_FIRSTROW);
1519   create_menu_item_with_mnemonic (menu_in_menu, _("Last (2) Rows"),
1520                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETE_LASTROW);
1521   menu_separator (menu);
1522   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Matrix"));
1523   create_menu_item_with_mnemonic (menu_in_menu, _("Invert"),
1524                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVE);
1525   menu_3 = create_menu_in_menu_with_mnemonic (menu_in_menu, _("Re-disperse"));
1526   create_menu_item_with_mnemonic (menu_3, _("Rows"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_ROWS);
1527   create_menu_item_with_mnemonic (menu_3, _("Cols (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_COLS);
1528   create_menu_item_with_mnemonic (menu_3, _("Rows (Intermediate)"), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_REDISPERSE_INTERMEDIATE_ROWS);
1529   create_menu_item_with_mnemonic (menu_in_menu, _("Transpose"),
1530                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_MATRIX_TRANSPOSE);
1531   menu_separator (menu);
1532   create_menu_item_with_mnemonic (menu, _("Cap Selection"),
1533                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CAP);
1534   create_menu_item_with_mnemonic (menu, _("Cycle Cap Texture"),
1535                         GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_CYCLECAP);
1536   menu_separator (menu);
1537   menu_in_menu = create_menu_in_menu_with_mnemonic (menu, _("Overlay"));
1538   create_menu_item_with_mnemonic (menu_in_menu, _("Set"),
1539                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_SET);
1540   create_menu_item_with_mnemonic (menu_in_menu, _("Clear"),
1541                     GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_OVERLAY_CLEAR);
1542   menu_separator (menu);
1543   create_menu_item_with_mnemonic (menu, _("Thicken..."), GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_THICKEN);
1544   }
1545   // Plugins menu
1546   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Plugins"));
1547   if (g_PrefsDlg.m_bDetachableMenus)
1548     menu_tearoff (menu);
1549
1550   /*
1551   create_menu_item_with_mnemonic (menu, "Refresh", GTK_SIGNAL_FUNC (HandleCommand), ID_PLUGINS_REFRESH);
1552   */
1553   // NOTE: the seperator is used when doing a refresh of the list, everything past the seperator is removed
1554   item = menu_separator (menu);
1555   g_object_set_data (G_OBJECT (window), "menu_plugin_separator", item);
1556   g_object_set_data (G_OBJECT (window), "menu_plugin", menu);
1557
1558   // Help menu
1559   menu = create_sub_menu_with_mnemonic (menu_bar, _("_Help"));
1560   if (g_PrefsDlg.m_bDetachableMenus)
1561     menu_tearoff (menu);
1562
1563   item = create_menu_item_with_mnemonic (menu, _("Manual"),
1564                            GTK_SIGNAL_FUNC (HandleCommand), ID_HELP);
1565   gtk_widget_add_accelerator (item, "activate", accel, GDK_F1, (GdkModifierType)0, GTK_ACCEL_VISIBLE);
1566
1567   // this creates all the per-game drop downs for the game pack helps
1568   // it will take care of hooking the Sys_OpenURL calls etc.
1569   create_game_help_menu(menu, accel);
1570
1571   // TTimo: this is in global.xlink now
1572   //create_menu_item_with_mnemonic (menu, "Links",
1573   //                  GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_LINKS);
1574   create_menu_item_with_mnemonic (menu, _("Bug report"),
1575                     GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_BUGREPORT);
1576   create_menu_item_with_mnemonic (menu, _("Shortcuts list"),
1577                     GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_COMMANDLIST);
1578   create_menu_item_with_mnemonic (menu, _("_About"),
1579                     GTK_SIGNAL_FUNC (HandleCommand), ID_HELP_ABOUT);
1580
1581
1582   // leo: Hidden menu to make the accelerators work,
1583   // this is a hack that needs to be changed later if someone has a better idea.
1584   // NOTE TTimo
1585   // maybe the better idea would be NOT to use any such accelerator scheme and do all key listening and interpret ourselves
1586   menu = create_sub_menu_with_mnemonic (menu_bar, "Hidden");
1587   if (g_PrefsDlg.m_bDetachableMenus)
1588     menu_tearoff (menu);
1589
1590   gtk_widget_hide (gtk_menu_get_attach_widget (GTK_MENU (menu)));
1591
1592   create_menu_item_with_mnemonic (menu, "BendMode", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_BEND);
1593   create_menu_item_with_mnemonic (menu, "FitTexture", GTK_SIGNAL_FUNC (HandleCommand), IDC_BTN_FACEFIT);
1594   create_menu_item_with_mnemonic (menu, "ViewTextures", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_TEXTURE);
1595   create_menu_item_with_mnemonic (menu, "PatchInspector", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_INSPECTOR);
1596   create_menu_item_with_mnemonic (menu, "InvertCurveTextureX", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREY);
1597   create_menu_item_with_mnemonic (menu, "InvertCurveTextureY", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_NEGATIVETEXTUREX);
1598   create_menu_item_with_mnemonic (menu, "IncPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTCOLUMN);
1599   create_menu_item_with_mnemonic (menu, "IncPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_INSERTROW);
1600   create_menu_item_with_mnemonic (menu, "DecPatchColumn", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETECOLUMN);
1601   create_menu_item_with_mnemonic (menu, "DecPatchRow", GTK_SIGNAL_FUNC (HandleCommand), ID_CURVE_DELETEROW);
1602   create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1603   create_menu_item_with_mnemonic (menu, "Patch TAB", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_TAB);
1604   create_menu_item_with_mnemonic (menu, "SelectNudgeDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEDOWN);
1605   create_menu_item_with_mnemonic (menu, "CameraForward", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_FORWARD);
1606   create_menu_item_with_mnemonic (menu, "CameraBack", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_BACK);
1607   create_menu_item_with_mnemonic (menu, "CameraLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_LEFT);
1608   create_menu_item_with_mnemonic (menu, "CameraRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_RIGHT);
1609   create_menu_item_with_mnemonic (menu, "CameraUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_UP);
1610   create_menu_item_with_mnemonic (menu, "CameraDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_DOWN);
1611   create_menu_item_with_mnemonic (menu, "CameraAngleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEUP);
1612   create_menu_item_with_mnemonic (menu, "CameraAngleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_ANGLEDOWN);
1613   create_menu_item_with_mnemonic (menu, "CameraStrafeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFERIGHT);
1614   create_menu_item_with_mnemonic (menu, "CameraStrafeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_CAMERA_STRAFELEFT);
1615   create_menu_item_with_mnemonic (menu, "ToggleGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_TOGGLE);
1616   create_menu_item_with_mnemonic (menu, "ToggleCrosshairs", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CROSSHAIR);
1617   create_menu_item_with_mnemonic (menu, "ToggleRealtime", GTK_SIGNAL_FUNC (HandleCommand), ID_VIEW_CAMERAUPDATE);
1618   create_menu_item_with_mnemonic (menu, "MouseRotate", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_MOUSEROTATE);
1619   create_menu_item_with_mnemonic (menu, "TexRotateClock", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECLOCK);
1620   create_menu_item_with_mnemonic (menu, "TexRotateCounter", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_ROTATECOUNTER);
1621   create_menu_item_with_mnemonic (menu, "TexScaleUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEUP);
1622   create_menu_item_with_mnemonic (menu, "TexScaleDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALEDOWN);
1623   create_menu_item_with_mnemonic (menu, "TexShiftLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTLEFT);
1624   create_menu_item_with_mnemonic (menu, "TexShiftRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTRIGHT);
1625   create_menu_item_with_mnemonic (menu, "TexShiftUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTUP);
1626   create_menu_item_with_mnemonic (menu, "TexShiftDown", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SHIFTDOWN);
1627   create_menu_item_with_mnemonic (menu, "GridDown", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_PREV);
1628   create_menu_item_with_mnemonic (menu, "GridUp", GTK_SIGNAL_FUNC (HandleCommand), ID_GRID_NEXT);
1629   create_menu_item_with_mnemonic (menu, "TexScaleLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALELEFT);
1630   create_menu_item_with_mnemonic (menu, "TexScaleRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TEXTURE_SCALERIGHT);
1631   create_menu_item_with_mnemonic (menu, "MoveSelectionDOWN", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEDOWN);
1632   create_menu_item_with_mnemonic (menu, "MoveSelectionUP", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_MOVEUP);
1633   create_menu_item_with_mnemonic (menu, "DumpSelectedBrush", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_PRINT);
1634   create_menu_item_with_mnemonic (menu, "ToggleSizePaint", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_TOGGLESIZEPAINT);
1635   create_menu_item_with_mnemonic (menu, "SelectNudgeLeft", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGELEFT);
1636   create_menu_item_with_mnemonic (menu, "SelectNudgeRight", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGERIGHT);
1637   create_menu_item_with_mnemonic (menu, "SelectNudgeUp", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_SELECT_NUDGEUP);
1638   create_menu_item_with_mnemonic (menu, "NaturalizePatch", GTK_SIGNAL_FUNC (HandleCommand), ID_PATCH_NATURALIZE);
1639   create_menu_item_with_mnemonic (menu, "SnapPatchToGrid", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_SNAPTOGRID);
1640   create_menu_item_with_mnemonic (menu, "SelectAllOfType", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECT_ALL);
1641   create_menu_item_with_mnemonic (menu, "CycleOutlineStyle", GTK_SIGNAL_FUNC (HandleCommand), ID_SELECTION_OUTLINESTYLE);
1642   create_menu_item_with_mnemonic (menu, "TextureWindowScaleup", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEUP);
1643   create_menu_item_with_mnemonic (menu, "TextureWindowScaledown", GTK_SIGNAL_FUNC (HandleCommand), ID_TEXTUREWINDOW_SCALEDOWN);
1644
1645   g_bIgnoreCommands--;
1646 }
1647
1648 void MainFrame::create_main_toolbar (GtkWidget *window, GtkWidget *vbox)
1649 {
1650   GtkWidget *handle_box, *toolbar, *w;
1651
1652   handle_box = gtk_handle_box_new ();
1653   gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1654   gtk_widget_show (handle_box);
1655   g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1656
1657   toolbar = gtk_toolbar_new ();
1658   gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1659   gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1660   //  gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1661   gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1662
1663   gtk_widget_show (toolbar);
1664
1665   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Open"), _("Open an existing map"), "",
1666                                new_pixmap (window, "file_open.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1667                                GINT_TO_POINTER (ID_FILE_OPEN));
1668   g_object_set_data (G_OBJECT (window), "tb_file_open", w);
1669   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), _("Save"), _("Save the active map"), "",
1670                                new_pixmap (window, "file_save.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1671                                GINT_TO_POINTER (ID_FILE_SAVE));
1672   g_object_set_data (G_OBJECT (window), "tb_file_save", w);
1673   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1674   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Flip"), "",
1675                                new_pixmap (window, "brush_flipx.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1676                                GINT_TO_POINTER (ID_BRUSH_FLIPX));
1677   g_object_set_data (G_OBJECT (window), "tb_brush_flipx", w);
1678   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("x-axis Rotate"), "",
1679                                new_pixmap (window, "brush_rotatex.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1680                                GINT_TO_POINTER (ID_BRUSH_ROTATEX));
1681   g_object_set_data (G_OBJECT (window), "tb_brush_rotatex", w);
1682   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Flip"), "",
1683                                new_pixmap (window, "brush_flipy.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1684                                GINT_TO_POINTER (ID_BRUSH_FLIPY));
1685   g_object_set_data (G_OBJECT (window), "tb_brush_flipy", w);
1686   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("y-axis Rotate"), "",
1687                                new_pixmap (window, "brush_rotatey.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1688                                GINT_TO_POINTER (ID_BRUSH_ROTATEY));
1689   g_object_set_data (G_OBJECT (window), "tb_brush_rotatey", w);
1690   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Flip"), "",
1691                                new_pixmap (window, "brush_flipz.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1692                                GINT_TO_POINTER (ID_BRUSH_FLIPZ));
1693   g_object_set_data (G_OBJECT (window), "tb_brush_flipz", w);
1694   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("z-axis Rotate"), "",
1695                                new_pixmap (window, "brush_rotatez.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1696                                GINT_TO_POINTER (ID_BRUSH_ROTATEZ));
1697   g_object_set_data (G_OBJECT (window), "tb_brush_rotatez", w);
1698   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1699
1700   if (g_PrefsDlg.m_bWideToolbar)
1701   {
1702     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Complete Tall"), "",
1703                                  new_pixmap (window, "selection_selectcompletetall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1704                                  GINT_TO_POINTER (ID_SELECTION_SELECTCOMPLETETALL));
1705     g_object_set_data (G_OBJECT (window), "tb_selection_selectcompletetall", w);
1706     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Touching"), "",
1707                                  new_pixmap (window, "selection_selecttouching.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1708                                  GINT_TO_POINTER (ID_SELECTION_SELECTTOUCHING));
1709     g_object_set_data (G_OBJECT (window), "tb_selection_selecttouching", w);
1710     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Partial Tall"), "",
1711                                  new_pixmap (window, "selection_selectpartialtall.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1712                                  GINT_TO_POINTER (ID_SELECTION_SELECTPARTIALTALL));
1713     g_object_set_data (G_OBJECT (window), "tb_selection_selectpartialtall", w);
1714     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Select Inside"), "",
1715                                  new_pixmap (window, "selection_selectinside.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1716                                  GINT_TO_POINTER (ID_SELECTION_SELECTINSIDE));
1717     g_object_set_data (G_OBJECT (window), "tb_selection_selectinside", w);
1718   } else
1719   {
1720     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Selection"), "",
1721                                  new_pixmap (window, "popup_selection.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1722                                  GINT_TO_POINTER (ID_POPUP_SELECTION));
1723     g_object_set_data (G_OBJECT (window), "tb_popup_selection", w);
1724   }
1725   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1726
1727   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Subtract"), "",
1728                                new_pixmap (window, "selection_csgsubtract.bmp"),
1729                                GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGSUBTRACT));
1730   g_object_set_data (G_OBJECT (window), "tb_selection_csgsubtract", w);
1731
1732   if (g_PrefsDlg.m_bWideToolbar)
1733   {
1734     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("CSG Merge"), "",
1735                                  new_pixmap (window, "selection_csgmerge.bmp"),
1736                                  GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_CSGMERGE));
1737     g_object_set_data (G_OBJECT (window), "tb_selection_csgmerge", w);
1738   }
1739
1740   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Hollow"), "",
1741                                new_pixmap (window, "selection_makehollow.bmp"),
1742                                GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECTION_MAKEHOLLOW));
1743   g_object_set_data (G_OBJECT (window), "tb_selection_makehollow", w);
1744
1745   if (g_PrefsDlg.m_bWideToolbar)
1746   {
1747     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1748                                     "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1749                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1750     g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1751   }
1752
1753   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1754
1755   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Change views"), "",
1756                                new_pixmap (window, "view_change.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1757                                GINT_TO_POINTER (ID_VIEW_CHANGE));
1758   g_object_set_data (G_OBJECT (window), "tb_view_change", w);
1759
1760   if (!g_PrefsDlg.m_bWideToolbar)
1761   {
1762     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1763   }
1764
1765   w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Texture view mode"), "",
1766                                new_pixmap (window, "textures_popup.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1767                                GINT_TO_POINTER (ID_TEXTURES_POPUP));
1768   g_object_set_data (G_OBJECT (window), "tb_textures_popup", w);
1769
1770   if (g_PrefsDlg.m_bWideToolbar)
1771   {
1772     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1773                                     "", _("Cubic clip the camera view"), "",
1774                                     new_pixmap (window, "view_cubicclipping.bmp"),
1775                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1776     g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1777   }
1778
1779   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1780
1781   if (!g_PrefsDlg.m_bWideToolbar)
1782   {
1783     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1784                                 "", _("Camera preview"), "", new_pixmap (window, "view_cameratoggle.bmp"),
1785                                 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CAMERATOGGLE));
1786     g_object_set_data (G_OBJECT (window), "tb_view_cameratoggle", w);
1787     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", "Update Camera", "",
1788                              new_pixmap (window, "view_cameraupdate.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1789                              GINT_TO_POINTER (ID_VIEW_CAMERAUPDATE));
1790     g_object_set_data (G_OBJECT (window), "tb_view_cameraupdate", w);
1791     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1792                                 "", _("Cubic clip the camera view"), "",
1793                                 new_pixmap (window, "view_cubicclipping.bmp"),
1794                                 GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CUBICCLIPPING));
1795     g_object_set_data (G_OBJECT (window), "tb_view_cubicclipping", w);
1796     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1797     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1798                                     "", _("Entity inspector"), "", new_pixmap (window, "view_entity.bmp"),
1799                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_ENTITY));
1800     g_object_set_data (G_OBJECT (window), "tb_view_entity", w);
1801     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1802     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1803                                     "", _("Clipper"), "", new_pixmap (window, "view_clipper.bmp"),
1804                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_VIEW_CLIPPER));
1805     g_object_set_data (G_OBJECT (window), "tb_view_clipper", w);
1806     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1807   }
1808
1809   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1810                               "", _("Free Rotation"), "", new_pixmap (window, "select_mouserotate.bmp"),
1811                               GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSEROTATE));
1812   g_object_set_data (G_OBJECT (window), "tb_select_mouserotate", w);
1813   gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1814   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1815                               "", _("Free Scaling"), "", new_pixmap (window, "select_mousescale.bmp"),
1816                               GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SELECT_MOUSESCALE));
1817   g_object_set_data (G_OBJECT (window), "tb_select_mousescale", w);
1818   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1819                                   "", _("Scale X"), "", new_pixmap (window, "scalelockx.bmp"),
1820                                   GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKX));
1821   g_object_set_data (G_OBJECT (window), "tb_scalelockx", w);
1822   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1823                                   "", _("Scale Y"), "", new_pixmap (window, "scalelocky.bmp"),
1824                                   GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKY));
1825   g_object_set_data (G_OBJECT (window), "tb_scalelocky", w);
1826   w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1827                                   "", _("Scale Z"), "", new_pixmap (window, "scalelockz.bmp"),
1828                                   GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_SCALELOCKZ));
1829   g_object_set_data (G_OBJECT (window), "tb_scalelockz", w);
1830
1831   if (g_PrefsDlg.m_bWideToolbar)
1832   {
1833     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1834     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1835                              "", _("Don't select model brushes"), "",
1836                              new_pixmap (window, "dontselectmodel.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1837                              GINT_TO_POINTER (ID_DONTSELECTMODEL));
1838     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1839     g_object_set_data (G_OBJECT (window), "tb_dontselectmodel", w);
1840
1841     if (!g_pGameDescription->mNoPatch)
1842     {
1843       w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1844                              "", _("Don't select curved brushes"), "",
1845                              new_pixmap (window, "dontselectcurve.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1846                              GINT_TO_POINTER (ID_DONTSELECTCURVE));
1847       g_object_set_data (G_OBJECT (window), "tb_dontselectcurve", w);
1848     }
1849   }
1850
1851   // bug #292, patch toolbar option
1852   if (g_PrefsDlg.m_bPatchToolbar)
1853   {
1854     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1855                              "", _("Show patch bounding box"), "",
1856                              new_pixmap (window, "patch_showboundingbox.bmp"),
1857                              GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_SHOWBOUNDINGBOX));
1858     g_object_set_data (G_OBJECT (window), "tb_patch_showboundingbox", w);
1859     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1860                                     "", _("Show patches as wireframes"), "",
1861                                     new_pixmap (window, "patch_wireframe.bmp"),
1862                                     GTK_SIGNAL_FUNC (HandleCommand), GINT_TO_POINTER (ID_PATCH_WIREFRAME));
1863     g_object_set_data (G_OBJECT (window), "tb_patch_wireframe", w);
1864     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1865                              "", _("Patch Bend mode"), "",
1866                              new_pixmap (window, "patch_bend.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1867                              GINT_TO_POINTER (ID_PATCH_BEND));
1868     g_object_set_data (G_OBJECT (window), "tb_patch_bend", w);
1869     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Put caps on the current patch"), "",
1870                              new_pixmap (window, "curve_cap.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1871                              GINT_TO_POINTER (ID_CURVE_CAP));
1872     g_object_set_data (G_OBJECT (window), "tb_curve_cap", w);
1873     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1874                                  "", _("Welds equal patch points during moves"), "",
1875                                  new_pixmap (window, "patch_weld.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1876                                  GINT_TO_POINTER (ID_PATCH_WELD));
1877     g_object_set_data (G_OBJECT (window), "tb_patch_weld", w);
1878     w = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
1879                              "", _("Selects drill down rows and columns"), "",
1880                              new_pixmap (window, "patch_drilldown.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1881                              GINT_TO_POINTER (ID_PATCH_DRILLDOWN));
1882     g_object_set_data (G_OBJECT (window), "tb_patch_drilldown", w);
1883   }
1884
1885   if (g_PrefsDlg.m_bWideToolbar)
1886   {
1887     gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
1888     w = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), "", _("Show Entities as"), "",
1889                              new_pixmap (window, "show_entities.bmp"), GTK_SIGNAL_FUNC (HandleCommand),
1890                              GINT_TO_POINTER (ID_SHOW_ENTITIES));
1891     g_object_set_data (G_OBJECT (window), "tb_show_entities", w);
1892   }
1893
1894   /*
1895   uh? that is OLD
1896 #ifndef QUAKE3
1897   w = g_object_get_data (G_OBJECT (window), "tb_dontselectcurve");
1898   gtk_widget_hide (w);
1899   w = g_object_get_data (G_OBJECT (window), "tb_patch_showboundingbox");
1900   gtk_widget_hide (w);
1901   w = g_object_get_data (G_OBJECT (window), "tb_patch_weld");
1902   gtk_widget_hide (w);
1903   w = g_object_get_data (G_OBJECT (window), "tb_patch_wireframe");
1904   gtk_widget_hide (w);
1905 #endif
1906   */
1907
1908   m_bCamPreview = true;
1909   g_nScaleHow = (SCALE_X | SCALE_Y | SCALE_Z);
1910 }
1911
1912 void MainFrame::create_plugin_toolbar (GtkWidget *window, GtkWidget *vbox)
1913 {
1914   GtkWidget *handle_box, *toolbar;
1915
1916   handle_box = gtk_handle_box_new ();
1917   gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
1918   if (g_PrefsDlg.m_bPluginToolbar)
1919     gtk_widget_show (handle_box);
1920   g_object_set_data (G_OBJECT (window), "tb_handle_box", handle_box);
1921
1922   toolbar = gtk_toolbar_new();
1923   gtk_toolbar_set_orientation (GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1924   gtk_toolbar_set_style (GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
1925   //  gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
1926   gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1927   g_object_set_data (G_OBJECT (window), "toolbar_plugin", toolbar);
1928   gtk_widget_show (toolbar);
1929 }
1930
1931 void MainFrame::create_main_statusbar (GtkWidget *window, GtkWidget *vbox)
1932 {
1933   GtkWidget *hbox, *hbox1;
1934   GtkWidget *frame;
1935   GtkWidget *label;
1936
1937   hbox = gtk_hbox_new (FALSE, 0);
1938   gtk_widget_show (hbox);
1939   gtk_widget_set_usize (hbox, -1, 24);
1940   gtk_container_border_width (GTK_CONTAINER (hbox), 1);
1941   gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 2);
1942
1943   frame = gtk_frame_new ((char*)NULL);
1944   gtk_widget_show (frame);
1945   gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
1946   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1947
1948   hbox1 = gtk_hbox_new (FALSE, 0);
1949   gtk_container_add (GTK_CONTAINER (frame), hbox1);
1950   gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
1951   gtk_widget_show (hbox1);
1952
1953   label = gtk_label_new (_(" Label "));
1954   gtk_widget_show (label);
1955   gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, TRUE, 0);
1956   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1957   gtk_misc_set_padding (GTK_MISC (label), 3, 0);
1958   m_pStatusLabel[0] = label;
1959
1960   for (int i = 1; i < 6; i++)
1961   {
1962     frame = gtk_frame_new ((char*)NULL);
1963     gtk_widget_show (frame);
1964     gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1965     gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
1966
1967     label = gtk_label_new (_(" Label "));
1968     gtk_widget_show (label);
1969     gtk_container_add (GTK_CONTAINER (frame), label);
1970     m_pStatusLabel[i] = label;
1971   }
1972 }
1973
1974 guint s_idle_id;
1975 static gint mainframe_idle (gpointer user_data)
1976 {
1977   g_pParentWnd->RoutineProcessing ();
1978   return TRUE;
1979 }
1980
1981 static void Sys_Iconify (GtkWidget *w);
1982 static void Sys_Restore (GtkWidget *w);
1983
1984 inline void CHECK_RESTORE(GtkWidget* w)
1985 {
1986   if (g_object_get_data (G_OBJECT (w), "was_mapped") != NULL)
1987     gtk_widget_show (w);
1988 }
1989
1990
1991 // this is called when the window is restored from the iconified state
1992 static void mainframe_map (GtkWidget *widget)
1993 {
1994   if (g_pParentWnd->IsSleeping ())
1995     g_pParentWnd->OnSleep ();
1996
1997   if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
1998   {
1999     // restore previously visible windows
2000     CHECK_RESTORE (g_pParentWnd->GetCamWnd ()->m_pParent);
2001     if (g_PrefsDlg.m_bFloatingZ)
2002       CHECK_RESTORE (g_pParentWnd->GetZWnd ()->m_pParent);
2003     CHECK_RESTORE (g_pParentWnd->GetXYWnd ()->m_pParent);
2004     CHECK_RESTORE (g_pParentWnd->GetXZWnd ()->m_pParent);
2005     CHECK_RESTORE (g_pParentWnd->GetYZWnd ()->m_pParent);
2006     CHECK_RESTORE (g_pGroupDlg->m_pWidget);
2007   }
2008 }
2009
2010 inline void CHECK_MINIMIZE(GtkWidget* w)
2011 {
2012   g_object_set_data (G_OBJECT (w), "was_mapped", (void*)(GTK_WIDGET_VISIBLE (w) != 0));
2013   gtk_widget_hide (w);
2014 }
2015
2016 static void mainframe_unmap (GtkWidget *widget)
2017 {
2018
2019   if ((g_pParentWnd->CurrentStyle() == MainFrame::eFloating) && (widget == g_pParentWnd->m_pWidget))
2020   {
2021     // minimize all other windows when the main window is minimized
2022     CHECK_MINIMIZE (g_pParentWnd->GetCamWnd ()->m_pParent);
2023     if (g_PrefsDlg.m_bFloatingZ)
2024       CHECK_MINIMIZE (g_pParentWnd->GetZWnd ()->m_pParent);
2025     CHECK_MINIMIZE (g_pParentWnd->GetXYWnd ()->m_pParent);
2026     CHECK_MINIMIZE (g_pParentWnd->GetXZWnd ()->m_pParent);
2027     CHECK_MINIMIZE (g_pParentWnd->GetYZWnd ()->m_pParent);
2028     CHECK_MINIMIZE (g_pGroupDlg->m_pWidget);
2029   }
2030 }
2031
2032 static GtkWidget* create_floating (MainFrame* mainframe)
2033 {
2034   GtkWidget *wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2035   //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2036     gtk_window_set_transient_for (GTK_WINDOW (wnd), GTK_WINDOW (mainframe->m_pWidget));
2037   gtk_widget_set_events (wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2038   gtk_signal_connect (GTK_OBJECT (wnd), "delete_event", GTK_SIGNAL_FUNC (widget_delete_hide), NULL);
2039   gtk_signal_connect (GTK_OBJECT (wnd), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
2040   gtk_signal_connect (GTK_OBJECT (wnd), "key_press_event",
2041                       GTK_SIGNAL_FUNC (mainframe_keypress), mainframe);
2042   gtk_signal_connect (GTK_OBJECT (wnd), "key_release_event",
2043                       GTK_SIGNAL_FUNC (mainframe_keyrelease), mainframe);
2044   gtk_signal_connect (GTK_OBJECT (wnd), "map_event",
2045                       GTK_SIGNAL_FUNC (mainframe_map), mainframe);
2046
2047   gtk_window_set_default_size (GTK_WINDOW (wnd), 100, 100);
2048
2049 #ifdef DBG_WINDOWPOS
2050   Sys_Printf("create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd);
2051 #endif
2052
2053   return wnd;
2054 }
2055
2056 void console_populate_popup(GtkTextView* textview, GtkMenu* menu, gpointer user_data)
2057 {
2058   menu_separator(GTK_WIDGET(menu));
2059
2060   GtkWidget* item = gtk_menu_item_new_with_label (_("Clear"));
2061   gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (Sys_ClearPrintf), NULL);
2062   gtk_widget_show (item);
2063   gtk_menu_append (GTK_MENU (menu), item);
2064 }
2065
2066 void console_construct(GtkWidget* textview)
2067 {
2068   g_signal_connect(G_OBJECT(textview), "populate-popup", G_CALLBACK(console_populate_popup), NULL);
2069 }
2070
2071 extern MemStream g_Clipboard;
2072
2073 void Clipboard_CopyMap()
2074 {
2075   g_Clipboard.SetLength(0);
2076   Map_Export (&g_Clipboard, "xmap", false, true);
2077 }
2078
2079 void Clipboard_PasteMap()
2080 {
2081   if (g_Clipboard.GetLength() > 0)
2082   {
2083     g_Clipboard.Seek(0, SEEK_SET);
2084     Map_Import(&g_Clipboard, "xmap", true);
2085   }
2086 }
2087
2088 /*!
2089 Platform-independent GTK clipboard support.
2090 \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2091 */
2092 #if defined (__linux__) || defined (__APPLE__)
2093
2094 enum
2095 {
2096   RADIANT_CLIPPINGS = 23,
2097 };
2098
2099 static const GtkTargetEntry clipboard_targets[] = {
2100   { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2101 };
2102
2103 static void clipboard_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner)
2104 {
2105   guchar *buffer;
2106   gint len;
2107   GdkAtom type = GDK_NONE;
2108
2109   len = g_Clipboard.GetLength();
2110
2111   if (!len)
2112   {
2113     buffer = NULL;
2114   } else
2115   {
2116     buffer = g_Clipboard.GetBuffer ();
2117   }
2118
2119   if(info == clipboard_targets[0].info)
2120   {
2121     type = gdk_atom_intern(clipboard_targets[0].target, FALSE);
2122   }
2123
2124   gtk_selection_data_set (selection_data, type, 8, buffer, len);
2125 }
2126
2127 static void clipboard_clear (GtkClipboard *clipboard, gpointer user_data_or_owner)
2128 {
2129 }
2130
2131 static void clipboard_received (GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data)
2132 {
2133   g_Clipboard.SetLength (0);
2134
2135   if (data->length < 0)
2136     Sys_FPrintf(SYS_ERR, "Error retrieving selection\n");
2137   else if(strcmp(gdk_atom_name(data->type), clipboard_targets[0].target) == 0)
2138     g_Clipboard.Write (data->data, data->length);
2139
2140   Clipboard_PasteMap();
2141 }
2142
2143 void clipboard_copy()
2144 {
2145   Clipboard_CopyMap();
2146
2147   GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2148
2149   gtk_clipboard_set_with_data (clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL);
2150 }
2151
2152 void clipboard_paste()
2153 {
2154   GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
2155
2156   gtk_clipboard_request_contents (clipboard, gdk_atom_intern(clipboard_targets[0].target, FALSE), clipboard_received, NULL);
2157 }
2158
2159
2160 #elif defined(WIN32)
2161
2162 void clipboard_copy()
2163 {
2164   Clipboard_CopyMap();
2165
2166   bool bClipped = false;
2167   UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2168   if (nClipboard > 0)
2169   {
2170     if (::OpenClipboard(NULL))
2171     {
2172       EmptyClipboard();
2173                 long lSize = g_Clipboard.GetLength();
2174       HANDLE h = ::GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof(long));
2175       if (h != NULL)
2176       {
2177         unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2178                                 memcpy(cp, &lSize, sizeof(long));
2179                                 cp += sizeof(long);
2180         g_Clipboard.Seek(0, SEEK_SET);
2181         g_Clipboard.Read(cp, lSize);
2182         ::GlobalUnlock(h);
2183         ::SetClipboardData(nClipboard, h);
2184         ::CloseClipboard();
2185         bClipped = true;
2186       }
2187     }
2188   }
2189
2190   if (!bClipped)
2191   {
2192     Sys_Printf("Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n");
2193   }
2194 }
2195
2196 void clipboard_paste()
2197 {
2198   bool bPasted = false;
2199   UINT nClipboard = ::RegisterClipboardFormat("RadiantClippings");
2200   if (nClipboard > 0 && ::OpenClipboard(NULL))
2201   {
2202     if(IsClipboardFormatAvailable(nClipboard))
2203     {
2204       HANDLE h = ::GetClipboardData(nClipboard);
2205       if (h)
2206       {
2207         g_Clipboard.SetLength(0);
2208                           unsigned char *cp = reinterpret_cast<unsigned char*>(::GlobalLock(h));
2209                           long lSize = 0;
2210                           memcpy(&lSize, cp, sizeof(long));
2211                           cp += sizeof(long);
2212         g_Clipboard.Write(cp, lSize);
2213         ::GlobalUnlock(h);
2214       }
2215     }
2216     ::CloseClipboard();
2217   }
2218
2219   Clipboard_PasteMap();
2220 }
2221
2222 #endif
2223
2224 void MainFrame::Copy()
2225 {
2226   clipboard_copy();
2227 }
2228
2229 void MainFrame::Paste()
2230 {
2231   clipboard_paste();
2232   UpdateSurfaceDialog();
2233 }
2234
2235
2236 #ifdef DBG_WINDOWPOS
2237 GtkWidget *watchit = NULL;
2238
2239 void CheckWatchit(char *msg)
2240 {
2241   static int width = 0;
2242   if ((watchit!=NULL) && (watchit->allocation.width != width))
2243   {
2244     Sys_Printf("CheckWatchit %s: %d\n", msg, watchit->allocation.width);
2245     width = watchit->allocation.width;
2246   }
2247 }
2248 #endif
2249
2250 #ifdef _WIN32
2251 BOOL CALLBACK m_pCountMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2252 {
2253   int *n = (int *) dwData;
2254
2255   (*n)++;
2256
2257   return TRUE;
2258 }
2259
2260 struct monitorInfo_s {
2261   GdkRectangle *win_monitors;
2262   int i_win_mon;
2263 };
2264
2265 BOOL CALLBACK m_pEnumMonitor (HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
2266 {
2267   monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2268   GdkRectangle *monitor;
2269   MONITORINFOEX lpmi;
2270
2271   monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2272
2273   memset(&lpmi, 0, sizeof(MONITORINFOEX));
2274   lpmi.cbSize = sizeof(MONITORINFOEX);
2275
2276   GetMonitorInfo( hMonitor, &lpmi );
2277
2278   if( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2279     RECT rect;
2280
2281     SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0);
2282     monitor->x = rect.left;
2283     monitor->y = rect.top;
2284     monitor->width = rect.right - rect.left;
2285     monitor->height = rect.bottom - rect.top;
2286
2287     if (monitorInfo->i_win_mon != 0)
2288           {
2289             GdkRectangle temp = *monitor;
2290       *monitor = monitorInfo->win_monitors[0];
2291             monitorInfo->win_monitors[0] = temp;
2292           }
2293   } else {
2294     monitor->x = lpmi.rcMonitor.left;
2295     monitor->y = lpmi.rcMonitor.top;
2296     monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2297     monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2298   }
2299
2300   monitorInfo->i_win_mon++;
2301
2302   return TRUE;
2303 }
2304
2305 void PositionWindowOnPrimaryScreen(window_position_t& position)
2306 {
2307   const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2308
2309   if( position.x <= primaryMonitorRect.x + 6 )
2310     position.x = primaryMonitorRect.x + 6;
2311   else if( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 )
2312     position.x = primaryMonitorRect.x + 6;
2313
2314   if( position.y <= primaryMonitorRect.y + 6 )
2315     position.y = primaryMonitorRect.y + 6;
2316   else if( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 )
2317     position.y = primaryMonitorRect.y + 6;
2318
2319   if( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 )
2320     position.w = primaryMonitorRect.width - 18;
2321   if( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 )
2322     position.h = primaryMonitorRect.height - 18;
2323 }
2324 #endif
2325
2326 GtkWidget* create_framed_widget(GtkWidget* widget)
2327 {
2328   GtkWidget* frame = gtk_frame_new ((char*)NULL);
2329   gtk_widget_show (frame);
2330   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2331   gtk_container_add (GTK_CONTAINER (frame), widget);
2332   gtk_widget_show(widget);
2333   return frame;
2334 }
2335
2336 gboolean entry_focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2337 {
2338   gtk_window_remove_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2339   return FALSE;
2340 }
2341
2342 gboolean entry_focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
2343 {
2344   gtk_window_add_accel_group (GTK_WINDOW (g_pParentWnd->m_pWidget), global_accel);
2345   return FALSE;
2346 }
2347
2348 GtkWidget* create_framed_texwnd(TexWnd* texwnd)
2349 {
2350   GtkWidget* frame = gtk_frame_new ((char*)NULL);
2351   gtk_widget_show (frame);
2352   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
2353
2354   GtkWidget* hbox = gtk_hbox_new (FALSE, 0);
2355   gtk_widget_show (hbox);
2356   gtk_container_add (GTK_CONTAINER (frame), hbox);
2357
2358   GtkWidget* w = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,1,1,1)));
2359   gtk_widget_show (w);
2360   gtk_box_pack_end (GTK_BOX (hbox), w, FALSE, TRUE, 0);
2361   g_qeglobals_gui.d_texture_scroll = w;
2362
2363   GtkWidget* texbox = gtk_vbox_new (FALSE, 0);
2364   gtk_widget_show (texbox);
2365   gtk_box_pack_start (GTK_BOX (hbox), texbox, TRUE, TRUE, 0);
2366
2367   w = gtk_entry_new ();
2368   gtk_box_pack_start (GTK_BOX (texbox), w, FALSE, FALSE, 0);
2369   texwnd->m_pFilter = w;
2370   g_signal_connect(G_OBJECT(w), "focus_in_event", G_CALLBACK(entry_focus_in), NULL);
2371   g_signal_connect(G_OBJECT(w), "focus_out_event", G_CALLBACK(entry_focus_out), NULL);
2372
2373   w = texwnd->GetWidget ();
2374   gtk_box_pack_start (GTK_BOX (texbox), w, TRUE, TRUE, 0);
2375   gtk_widget_show (w);
2376
2377   return frame;
2378 }
2379
2380 static ZWnd *create_floating_zwnd(MainFrame *mainframe)
2381 {
2382   ZWnd *pZWnd = new ZWnd ();
2383   GtkWidget* wnd = create_floating (mainframe);
2384
2385   gtk_window_set_title (GTK_WINDOW (wnd), "Z");
2386
2387   pZWnd->m_pParent = wnd;
2388
2389   {
2390     GtkWidget* frame = create_framed_widget(pZWnd->GetWidget());
2391     gtk_container_add (GTK_CONTAINER (wnd), frame);
2392   }
2393
2394   gtk_widget_realize (wnd);
2395
2396   // turn OFF minimize and maximize boxes.
2397   // Must be *after* realize, or wnd->window is NULL
2398   // should do the right thing on *nix, need to verify.
2399   gdk_window_set_decorations ( wnd->window,
2400                                 GdkWMDecoration(GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2401   //TODO 50 by observation, will vary depending on decoration sizes
2402   {
2403     GdkGeometry geometry;
2404     geometry.min_width = 50;
2405     //we only care about width, but have to set this too, or get nasty bugs
2406     geometry.min_height = 10;
2407     gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE);
2408   }
2409
2410 #ifdef _WIN32
2411   if( g_PrefsDlg.m_bStartOnPrimMon ) {
2412     PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2413   }
2414 #endif
2415   load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posZWnd);
2416
2417   if (g_PrefsDlg.m_bZVis)
2418     gtk_widget_show (wnd);
2419
2420   return pZWnd;
2421 }
2422
2423 static const int gutter = 12;
2424
2425 void MainFrame::Create ()
2426 {
2427   GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2428   m_pWidget = window;
2429   gtk_widget_set_events (window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
2430   gtk_signal_connect (GTK_OBJECT (window), "delete_event",
2431                       GTK_SIGNAL_FUNC (mainframe_delete), this);
2432   gtk_signal_connect (GTK_OBJECT (window), "destroy",
2433                       GTK_SIGNAL_FUNC (mainframe_destroy), this);
2434   gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
2435                       GTK_SIGNAL_FUNC (mainframe_keypress), this);
2436   gtk_signal_connect (GTK_OBJECT (window), "key_release_event",
2437                       GTK_SIGNAL_FUNC (mainframe_keyrelease), this);
2438   gtk_signal_connect (GTK_OBJECT (window), "map_event",
2439                       GTK_SIGNAL_FUNC (mainframe_map), this);
2440   gtk_signal_connect (GTK_OBJECT (window), "unmap_event",
2441                       GTK_SIGNAL_FUNC (mainframe_unmap), this);
2442
2443   g_qeglobals_gui.d_main_window = window;
2444
2445 #ifdef _WIN32
2446   // calculate gdk offset
2447   int n_win_monitors = 0;
2448
2449   monitorInfo_s monitorInfo;
2450
2451   // detect multiple monitors
2452   EnumDisplayMonitors (NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>(&n_win_monitors));
2453
2454   monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2455   monitorInfo.i_win_mon = 0;
2456   EnumDisplayMonitors (NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>(&monitorInfo));
2457
2458   gdk_offset_x = G_MININT;
2459   gdk_offset_y = G_MININT;
2460
2461   // calculate offset
2462   for( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2463     gdk_offset_x = MAX (gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x);
2464     gdk_offset_y = MAX (gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y);
2465   }
2466
2467   Sys_Printf( "GDK's coordinate system is offset by %d over the x-axis and %d over the y-axis from Windows' coordinate system.\n", gdk_offset_x, gdk_offset_y );
2468
2469   if( g_PrefsDlg.m_bStartOnPrimMon )
2470   {
2471     // get gdk monitors
2472     GdkDisplay *display;
2473     GdkScreen *screen;
2474     gint n_gdk_monitors = 0;
2475     gint i_mon;
2476     GdkRectangle rect;
2477
2478     // detect multiple monitors
2479     display = gdk_display_get_default ();
2480     Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name (display), gdk_display_get_n_screens (display) );
2481
2482     screen = gdk_display_get_screen( display, 1 );
2483     n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2484
2485     Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2486
2487     for( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2488       memset( &rect, 0, sizeof(rect) );
2489       gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2490       Sys_Printf( "  monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2491
2492       if( i_mon == 0 ) {
2493         memcpy( &primaryMonitorRect, &rect, sizeof(primaryMonitorRect) );
2494       }
2495     }
2496
2497     PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2498   }
2499   else {
2500     primaryMonitorRect.x = primaryMonitorRect.y = 0;
2501     primaryMonitorRect.width = gdk_screen_width ();
2502     primaryMonitorRect.height = gdk_screen_height ();
2503   }
2504
2505 #endif
2506
2507   load_window_pos(window, g_PrefsDlg.mWindowInfo.position);
2508
2509   GtkWidget* vbox = gtk_vbox_new (FALSE, 0);
2510   gtk_container_add (GTK_CONTAINER (window), vbox);
2511   gtk_widget_show (vbox);
2512
2513   create_main_menu (window, vbox);
2514   MRU_Load ();
2515   create_main_toolbar (window, vbox);
2516   create_plugin_toolbar (window,vbox);
2517
2518   m_nCurrentStyle = g_PrefsDlg.m_nView;
2519
2520   g_pGroupDlg->Create ();
2521   OnPluginsRefresh();
2522
2523   CreateQEChildren();
2524
2525   gtk_widget_show (window);
2526
2527   // not needed on win32, it's in the .rc
2528 #ifndef _WIN32
2529   {
2530     GdkPixmap *pixmap;
2531     GdkBitmap *mask;
2532     load_pixmap ("icon.bmp", window, &pixmap, &mask);
2533     gdk_window_set_icon (window->window, NULL, pixmap, mask);
2534   }
2535 #endif
2536
2537   if (CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft)
2538   {
2539     {
2540       GtkWidget* vsplit = gtk_vpaned_new ();
2541       m_pSplits[0] = vsplit;
2542       gtk_box_pack_start (GTK_BOX (vbox), vsplit, TRUE, TRUE, 0);
2543       gtk_widget_show (vsplit);
2544
2545       {
2546         GtkWidget* hsplit = gtk_hpaned_new ();
2547         m_pSplits[2] = hsplit;
2548         gtk_paned_add1 (GTK_PANED (vsplit), hsplit);
2549         gtk_widget_show (hsplit);
2550
2551         {
2552           GtkWidget* hsplit2 = gtk_hpaned_new ();
2553           m_pSplits[3] = hsplit2;
2554           gtk_paned_add2 (GTK_PANED (hsplit), hsplit2);
2555           gtk_widget_show (hsplit2);
2556
2557           {
2558             GtkWidget* vsplit2 = gtk_vpaned_new ();
2559             m_pSplits[1] = vsplit2;
2560             if (CurrentStyle() == eRegular)
2561               gtk_paned_add2 (GTK_PANED (hsplit2), vsplit2);
2562             else
2563               gtk_paned_add1 (GTK_PANED (hsplit), vsplit2);
2564             gtk_widget_show (vsplit2);
2565
2566             // camera
2567             m_pCamWnd = new CamWnd ();
2568             {
2569               GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2570               gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2571             }
2572
2573             // xy
2574             m_pXYWnd = new XYWnd ();
2575             m_pXYWnd->SetViewType(XY);
2576             {
2577               GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget ());
2578               gtk_paned_add1 (GTK_PANED (hsplit2), frame);
2579             }
2580
2581             // z
2582             m_pZWnd = new ZWnd ();
2583             {
2584               GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget ());
2585               if (CurrentStyle() == eRegular)
2586                 gtk_paned_add1 (GTK_PANED (hsplit), frame);
2587               else
2588                 gtk_paned_add2 (GTK_PANED (hsplit2), frame);
2589             }
2590
2591             // textures
2592             m_pTexWnd = new TexWnd ();
2593             {
2594               GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2595               gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2596             }
2597
2598             // console
2599             {
2600               GtkWidget* scr = gtk_scrolled_window_new (NULL, NULL);
2601               gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scr), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2602               gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scr), GTK_SHADOW_IN);
2603               gtk_widget_show (scr);
2604               gtk_paned_pack2 (GTK_PANED (vsplit), scr, FALSE, TRUE);
2605
2606               {
2607                 GtkWidget* text = gtk_text_view_new ();
2608                 gtk_widget_set_size_request(text, 0, -1); // allow shrinking
2609                 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
2610                 gtk_text_view_set_editable (GTK_TEXT_VIEW(text), FALSE);
2611                 gtk_container_add (GTK_CONTAINER (scr), text);
2612                 gtk_widget_show (text);
2613                 g_qeglobals_gui.d_edit = text;
2614               }
2615             }
2616           }
2617         }
2618       }
2619     }
2620
2621     gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nXYHeight+28);
2622
2623     if (CurrentStyle() == eRegular)
2624     {
2625       gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nZWidth);
2626       gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2627     }
2628     else
2629     {
2630       gtk_paned_set_position (GTK_PANED (m_pSplits[2]), g_PrefsDlg.mWindowInfo.nCamWidth);
2631       while (gtk_events_pending ())  gtk_main_iteration ();
2632       gtk_paned_set_position (GTK_PANED (m_pSplits[3]), g_PrefsDlg.mWindowInfo.nXYWidth);
2633     }
2634
2635     while (gtk_events_pending ())  gtk_main_iteration ();
2636
2637     gtk_paned_set_position (GTK_PANED (m_pSplits[1]), g_PrefsDlg.mWindowInfo.nCamHeight);
2638   }
2639   else if (CurrentStyle() == eFloating)
2640   {
2641     {
2642       GtkWidget* wnd = create_floating (this);
2643       gtk_window_set_title (GTK_WINDOW (wnd), "Camera");
2644
2645 #ifdef _WIN32
2646       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2647         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2648       }
2649 #endif
2650       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posCamWnd);
2651
2652       gtk_widget_show (wnd);
2653
2654       m_pCamWnd = new CamWnd ();
2655
2656       {
2657         GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget ());
2658         gtk_container_add (GTK_CONTAINER (wnd), frame);
2659       }
2660
2661       m_pCamWnd->m_pParent = wnd;
2662     }
2663
2664     if (g_PrefsDlg.m_bFloatingZ)
2665     {
2666       m_pZWnd = create_floating_zwnd(this);
2667
2668       {
2669         GtkWidget* wnd = create_floating (this);
2670         gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2671
2672 #ifdef _WIN32
2673         if( g_PrefsDlg.m_bStartOnPrimMon ) {
2674           PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2675         }
2676 #endif
2677         load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2678
2679         m_pXYWnd = new XYWnd ();
2680         m_pXYWnd->SetViewType(XY);
2681
2682         {
2683           GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2684           gtk_container_add (GTK_CONTAINER (wnd), frame);
2685         }
2686
2687         m_pXYWnd->m_pParent = wnd;
2688
2689         gtk_widget_show (wnd);
2690       }
2691     }
2692     else
2693     {
2694       GtkWidget* wnd = create_floating (this);
2695       gtk_window_set_title (GTK_WINDOW (wnd), "XY View");
2696
2697 #ifdef _WIN32
2698       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2699         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2700       }
2701 #endif
2702       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXYWnd);
2703
2704       m_pZWnd = new ZWnd ();
2705       m_pZWnd->m_pParent = wnd;
2706
2707       m_pXYWnd = new XYWnd ();
2708       m_pXYWnd->SetViewType(XY);
2709       m_pXYWnd->m_pParent = wnd;
2710
2711
2712       {
2713         GtkWidget* hsplit = gtk_hpaned_new ();
2714         m_pSplits[0] = hsplit;
2715         gtk_container_add (GTK_CONTAINER (wnd), hsplit);
2716         gtk_widget_show (hsplit);
2717
2718         {
2719           GtkWidget* frame = create_framed_widget(m_pZWnd->GetWidget());
2720           gtk_paned_add1 (GTK_PANED (hsplit), frame);
2721         }
2722         {
2723           GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2724           gtk_paned_add2 (GTK_PANED (hsplit), frame);
2725         }
2726       }
2727
2728       gtk_widget_show (wnd);
2729
2730       gtk_paned_set_position (GTK_PANED (m_pSplits[0]), g_PrefsDlg.mWindowInfo.nZFloatWidth);
2731     }
2732
2733     {
2734       GtkWidget* wnd = create_floating (this);
2735       gtk_window_set_title (GTK_WINDOW (wnd), _("XZ View"));
2736
2737 #ifdef _WIN32
2738       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2739         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2740       }
2741 #endif
2742       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posXZWnd);
2743
2744       m_pXZWnd = new XYWnd ();
2745       m_pXZWnd->m_pParent = wnd;
2746       m_pXZWnd->SetViewType(XZ);
2747
2748       {
2749         GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2750         gtk_container_add (GTK_CONTAINER (wnd), frame);
2751       }
2752
2753       if (g_PrefsDlg.m_bXZVis)
2754         gtk_widget_show (wnd);
2755     }
2756
2757     {
2758       GtkWidget* wnd = create_floating (this);
2759       gtk_window_set_title (GTK_WINDOW (wnd), _("YZ View"));
2760
2761 #ifdef _WIN32
2762       if( g_PrefsDlg.m_bStartOnPrimMon ) {
2763         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2764       }
2765 #endif
2766       load_window_pos (wnd, g_PrefsDlg.mWindowInfo.posYZWnd);
2767
2768       m_pYZWnd = new XYWnd ();
2769       m_pYZWnd->m_pParent = wnd;
2770       m_pYZWnd->SetViewType(YZ);
2771
2772       {
2773         GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2774         gtk_container_add (GTK_CONTAINER (wnd), frame);
2775       }
2776
2777       if (g_PrefsDlg.m_bYZVis)
2778         gtk_widget_show (wnd);
2779     }
2780
2781     m_pTexWnd = new TexWnd ();
2782     {
2783       GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2784       m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2785
2786       {
2787         GtkWidget* w = gtk_label_new (_("Textures"));
2788         gtk_widget_show (w);
2789         gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2790       }
2791     }
2792
2793     g_pGroupDlg->Show ();
2794   }
2795   else // 4 way
2796   {
2797     {
2798       GtkWidget* hsplit = gtk_hpaned_new ();
2799       m_pSplits[0] = hsplit;
2800       gtk_box_pack_start (GTK_BOX (vbox), hsplit, TRUE, TRUE, 0);
2801       gtk_widget_show (hsplit);
2802
2803       {
2804         GtkWidget* vsplit1 = gtk_vpaned_new ();
2805         m_pSplits[1] = vsplit1;
2806         gtk_paned_add1 (GTK_PANED (hsplit), vsplit1);
2807         gtk_widget_show (vsplit1);
2808
2809         {
2810           GtkWidget* vsplit2 = gtk_vpaned_new ();
2811           m_pSplits[2] = vsplit2;
2812           gtk_paned_add2 (GTK_PANED (hsplit), vsplit2);
2813           gtk_widget_show (vsplit2);
2814
2815           m_pCamWnd = new CamWnd ();
2816           {
2817             GtkWidget* frame = create_framed_widget(m_pCamWnd->GetWidget());
2818             gtk_paned_add1 (GTK_PANED (vsplit1), frame);
2819           }
2820
2821           m_pXYWnd = new XYWnd ();
2822           m_pXYWnd->SetViewType(XY);
2823           {
2824             GtkWidget* frame = create_framed_widget(m_pXYWnd->GetWidget());
2825             gtk_paned_add1 (GTK_PANED (vsplit2), frame);
2826           }
2827
2828           m_pYZWnd = new XYWnd ();
2829           m_pYZWnd->SetViewType(YZ);
2830           {
2831             GtkWidget* frame = create_framed_widget(m_pYZWnd->GetWidget());
2832             gtk_paned_add2 (GTK_PANED (vsplit1), frame);
2833           }
2834
2835           m_pXZWnd = new XYWnd ();
2836           m_pXZWnd->SetViewType(XZ);
2837           {
2838             GtkWidget* frame = create_framed_widget(m_pXZWnd->GetWidget());
2839             gtk_paned_add2 (GTK_PANED (vsplit2), frame);
2840           }
2841         }
2842       }
2843     }
2844
2845     //    g_qeglobals_gui.d_edit = NULL;
2846
2847     {
2848       m_pTexWnd = new TexWnd ();
2849       GtkWidget* frame = create_framed_texwnd(m_pTexWnd);
2850
2851       {
2852         GtkWidget* w = gtk_label_new (_("Textures"));
2853         gtk_widget_show (w);
2854         gtk_notebook_insert_page (GTK_NOTEBOOK (g_pGroupDlg->m_pNotebook), frame, w, 1);
2855       }
2856     }
2857
2858     m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2859 //    gtk_widget_realize (m_pTexWnd->GetWidget ());
2860     m_pZWnd = create_floating_zwnd(this);
2861
2862     while (gtk_events_pending ())
2863       gtk_main_iteration ();
2864
2865     {
2866       int x = GTK_PANED (m_pSplits[0])->max_position/2 - gutter;
2867       gtk_paned_set_position (GTK_PANED (m_pSplits[0]), x);
2868     }
2869
2870     {
2871       int y = GTK_PANED (m_pSplits[1])->max_position/2 - gutter;
2872       gtk_paned_set_position (GTK_PANED (m_pSplits[1]), y);
2873       gtk_paned_set_position (GTK_PANED (m_pSplits[2]), y);
2874     }
2875   }
2876
2877   if(g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED)
2878     gtk_window_maximize(GTK_WINDOW(window));
2879
2880   gtk_widget_show (window);
2881
2882   Texture_Init();
2883
2884   if (m_pXYWnd) // this is always true?
2885   {
2886     m_pXYWnd->SetActive(true);
2887   }
2888   m_bSplittersOK = true;
2889   Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu);
2890
2891   g_pParentWnd->OnEntitiesSetViewAs(0);
2892
2893 //  m_wndTextureBar.Create (vbox);
2894   create_main_statusbar (window, vbox);
2895
2896   LoadCommandMap();
2897   ShowMenuItemKeyBindings(window);
2898
2899   if (g_qeglobals_gui.d_edit != NULL)
2900     console_construct(g_qeglobals_gui.d_edit);
2901
2902   //  bool load_last = FALSE;
2903
2904   SetGridStatus();
2905   SetButtonMenuStates();
2906
2907   // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2908   GtkWidget *item;
2909   g_bIgnoreCommands++;
2910   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaders_show"));
2911   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE);
2912   item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_shaderlistonly"));
2913   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE);
2914   g_bIgnoreCommands--;
2915
2916 //  if (g_PrefsDlg.m_bTextureBar)
2917 //    gtk_widget_show (m_wndTextureBar.m_pWidget);
2918
2919   SetActiveXY(m_pXYWnd);
2920
2921   s_idle_id = gtk_timeout_add (25, mainframe_idle, this);
2922
2923   QGL_InitExtensions ();
2924
2925   if (g_PrefsDlg.mLocalPrefs.mbEmpty)
2926   {
2927     g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2928     g_PrefsDlg.SavePrefs();
2929   }
2930
2931   // remove the pid file
2932   remove (g_pidGameFile.GetBuffer ());
2933
2934   Sys_Printf ("Entering message loop\n");
2935
2936   m_bDoLoop = true;
2937
2938   m_nTimer = gtk_timeout_add (1000, timer, this);
2939 }
2940
2941 // =============================================================================
2942 // MainFrame class
2943
2944 MainFrame::MainFrame()
2945 {
2946   m_bDoLoop = false;
2947   m_bSplittersOK = false;
2948   g_pParentWnd = this;
2949   m_pXYWnd = (XYWnd*)NULL;
2950   m_pCamWnd = NULL;
2951   m_pTexWnd = (TexWnd*)NULL;
2952   m_pZWnd = (ZWnd*)NULL;
2953   m_pYZWnd = (XYWnd*)NULL;
2954   m_pXZWnd = (XYWnd*)NULL;
2955   m_pActiveXY = (XYWnd*)NULL;
2956   m_bCamPreview = true;
2957   m_pWatchBSP = NULL;
2958   for (int n = 0; n < 6; n++)
2959     m_pStatusLabel[n] = NULL;
2960   m_bNeedStatusUpdate = false;
2961   m_nTimer = 0;
2962   m_bSleeping = false;
2963   Create ();
2964 }
2965
2966 MainFrame::~MainFrame()
2967 {
2968   while (g_BSPFrontendCommands)
2969   {
2970     free (g_BSPFrontendCommands->data);
2971     g_BSPFrontendCommands = g_slist_remove (g_BSPFrontendCommands, g_BSPFrontendCommands->data);
2972   }
2973 }
2974
2975 void MainFrame::ReleaseContexts ()
2976 {
2977   if (m_pXYWnd)
2978     m_pXYWnd->DestroyContext ();
2979   if (m_pYZWnd)
2980     m_pYZWnd->DestroyContext ();
2981   if (m_pXZWnd)
2982     m_pXZWnd->DestroyContext ();
2983   if (m_pCamWnd)
2984     m_pCamWnd->DestroyContext ();
2985   if (m_pTexWnd)
2986     m_pTexWnd->DestroyContext ();
2987   if (m_pZWnd)
2988     m_pZWnd->DestroyContext ();
2989 }
2990
2991 void MainFrame::CreateContexts ()
2992 {
2993   if (m_pCamWnd)
2994     m_pCamWnd->CreateContext ();
2995   if (m_pXYWnd)
2996     m_pXYWnd->CreateContext ();
2997   if (m_pYZWnd)
2998     m_pYZWnd->CreateContext ();
2999   if (m_pXZWnd)
3000     m_pXZWnd->CreateContext ();
3001   if (m_pTexWnd)
3002     m_pTexWnd->CreateContext ();
3003   if (m_pZWnd)
3004     m_pZWnd->CreateContext ();
3005 }
3006
3007 static void Sys_Iconify (GtkWidget *w)
3008 {
3009   // we might not have been realized yet
3010   if (w->window == NULL)
3011     return;
3012
3013   if (!GTK_WIDGET_MAPPED (w))
3014     return;
3015
3016 #if defined (__linux__) || defined (__APPLE__)
3017   Sys_FPrintf(SYS_WRN, "FIXME: Sys_Iconify\n");
3018 #if 0
3019   XWindowAttributes xattr;
3020   GdkWindowPrivate *Private;
3021
3022   Private = (GdkWindowPrivate*)w->window;
3023   g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (0));
3024
3025   if (!Private->destroyed)
3026   {
3027     xattr.map_state = IsUnmapped;
3028     XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3029
3030     if (xattr.map_state != IsUnmapped)
3031       g_object_set_data (G_OBJECT (w), "was_mapped", GINT_TO_POINTER (1));
3032
3033     XIconifyWindow (Private->xdisplay, Private->xwindow, 0);
3034   }
3035 #endif
3036 #endif
3037
3038 #ifdef _WIN32
3039   ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_MINIMIZE);
3040 #endif
3041 }
3042
3043 static void Sys_Restore (GtkWidget *w)
3044 {
3045   // we might not have been realized yet
3046   if (w->window == NULL)
3047     return;
3048
3049   if (!GTK_WIDGET_VISIBLE (w))
3050     return;
3051
3052 #if defined (__linux__) || defined (__APPLE__)
3053   Sys_FPrintf(SYS_WRN, "FIXME: Sys_Restore\n");
3054   #if 0
3055   XWindowAttributes xattr;
3056   GdkWindowPrivate *Private;
3057
3058   Private = (GdkWindowPrivate*)w->window;
3059
3060   xattr.map_state = IsUnmapped;
3061   XGetWindowAttributes(Private->xdisplay, Private->xwindow, &xattr);
3062
3063   if (xattr.map_state == IsUnmapped)
3064     XMapRaised (Private->xdisplay, Private->xwindow);
3065   #endif
3066 #endif
3067
3068 #ifdef _WIN32
3069   ShowWindow ((HWND)GDK_WINDOW_HWND (w->window), SW_RESTORE);
3070 #endif
3071 }
3072
3073 #ifdef _DEBUG
3074 //#define DBG_SLEEP
3075 #endif
3076
3077 void RefreshModelSkin (GSList **pModels, entitymodel_t *model)
3078 {
3079   //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3080   // so we avoid the fucked up ones, assuming they are at the end
3081   if (!model->strSkin)
3082   {
3083 #ifdef DBG_SLEEP
3084     Sys_Printf("Dropping model %p with empty skin in RefreshModelSkin\n", model);
3085 #endif
3086
3087     // and also keeping it so we have an actual count of empty models
3088     g_slist_append (*pModels, model);
3089     return;
3090   }
3091   // do we have this model already?
3092   if (g_slist_find (*pModels, model))
3093   {
3094 #ifdef DBG_SLEEP
3095
3096     // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3097     Sys_Printf("Already processed model: %p %s\n", model, ((GString *)model->strSkin)->str);
3098 #endif
3099     return;
3100   }
3101   model->nTextureBind = Texture_LoadSkin(((GString *)model->strSkin)->str, &model->nSkinWidth, &model->nSkinHeight );
3102   if (model->nTextureBind != -1)
3103     Sys_Printf("LOADED SKIN: %s\n", ((GString *)model->strSkin)->str );
3104   else
3105     Sys_Printf("Load skin failed: %s\n", ((GString *)model->strSkin)->str );
3106   *pModels = g_slist_append (*pModels, model);
3107 #ifdef DBG_SLEEP
3108   Sys_Printf("Processed model %p %s\n", model, ((GString *)model->strSkin)->str);
3109 #endif
3110 }
3111
3112 void MainFrame::OnSleep()
3113 {
3114   m_bSleeping ^= 1;
3115   if (m_bSleeping)
3116   {
3117     // useful when trying to debug crashes in the sleep code
3118     Sys_Printf("Going into sleep mode..\n");
3119
3120     Sys_Printf("Dispatching sleep msg...");
3121     DispatchRadiantMsg (RADIANT_SLEEP);
3122     Sys_Printf("Done.\n");
3123
3124     if (CurrentStyle() == eSplit)
3125       Sys_Iconify (m_pZWnd->m_pParent);
3126
3127     Sys_Iconify (m_pWidget);
3128     Select_Deselect();
3129     QERApp_FreeShaders ();
3130     g_bScreenUpdates = false;
3131
3132     // release contexts
3133     Sys_Printf("Releasing contexts...");
3134     ReleaseContexts();
3135     Sys_Printf("Done.\n");
3136
3137     // free all the skins in the caches
3138     // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3139     g_lstSkinCache.RemoveAll();
3140   } else
3141   {
3142     Sys_Printf("Waking up\n");
3143     if (CurrentStyle() == eSplit)
3144       Sys_Restore (m_pZWnd->m_pParent);
3145
3146     Sys_Restore (m_pWidget);
3147
3148     // create contexts
3149     Sys_Printf("Creating contexts...");
3150     CreateContexts();
3151     Sys_Printf("Done.\n");
3152
3153     Sys_Printf("Making current on camera...");
3154     m_pCamWnd->MakeCurrent ();
3155     Sys_Printf("Done.\n");
3156
3157     Sys_Printf("Reloading shaders...");
3158     // reload the shader scripts and textures
3159     QERApp_ReloadShaders ();
3160     // current shader
3161     // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3162     Texture_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false);
3163     Sys_Printf("Done.\n");
3164
3165     // rebuild the patches by setting the bDirty flag on them
3166     for (brush_t* b=active_brushes.next ; b != &active_brushes ; b=b->next)
3167     {
3168       if (b->patchBrush)
3169         b->pPatch->bDirty = true;
3170     }
3171
3172     Sys_Printf("Reloading skins...");
3173     // we have purged all the skins before going to sleep
3174     // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3175     // namely, all entitymodel_t
3176     // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3177     // (a single eclass_t can reference several entitymodel_t)
3178     // FIXME: and what's up with md3Class then? what is it used for?
3179 /*
3180     eclass_t *e;
3181     entity_t *ent;
3182     GSList *Models = NULL;
3183     for (ent = entities.next; ent != &entities; ent = ent->next)
3184     {
3185       // if it's a model with skin then the fixedsize flag must be on
3186       // only if there IS a model .. we are not trying to load
3187       if (ent->eclass->fixedsize)
3188       {
3189         if (ent->eclass->model)
3190         {
3191 #ifdef DBG_SLEEP
3192           if (ent->md3Class)
3193             Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3194 #endif
3195           entitymodel_t *model;
3196           for (model = ent->eclass->model; model; model=model->pNext)
3197             RefreshModelSkin (&Models, model);
3198         } else if (ent->md3Class)
3199         {
3200           entitymodel_t *model;
3201           for (model = ent->md3Class->model; model; model=model->pNext)
3202             RefreshModelSkin (&Models, model);
3203         }
3204 #ifdef DBG_SLEEP
3205         else
3206           Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3207 #endif
3208       }
3209     }
3210 #ifdef DBG_SLEEP
3211     for (e = g_md3Cache; e ; e = e->next)
3212     {
3213       entitymodel_t *model;
3214       for (model = e->model; model; model=model->pNext)
3215         if (!g_slist_find (Models, model))
3216         {
3217           Sys_Printf("model %p ", model);
3218           if (model->strSkin)
3219             Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3220           else
3221             Sys_Printf("not found in main loop (no skin)\n");
3222         }
3223     }
3224 #endif
3225     // clean the model list
3226     g_slist_free (Models);
3227 */
3228     Sys_Printf("Done.\n");
3229
3230     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_bSnap) ? 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_bSnap) ? 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_bSnap ^= 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_bSnap ? TRUE : FALSE);
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   g_PrefsDlg.SavePrefs();
5964   Sys_UpdateWindows (W_ALL);
5965 }
5966
5967 void MainFrame::OnColorSetqer()
5968 {
5969   for (int i=0 ; i<3 ; i++)
5970   {
5971     g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5972     g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5973     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5974     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5975     g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5976   }
5977
5978   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5979   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5980   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5981
5982   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5983   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5984   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5985
5986   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5987   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5988   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5989
5990   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5991   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5992   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5993
5994   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5995   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5996   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5997
5998   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5999   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6000   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6001
6002   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6003   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6004   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6005
6006   g_PrefsDlg.SavePrefs();
6007   Sys_UpdateWindows (W_ALL);
6008 }
6009
6010 void MainFrame::OnColorSetblack()
6011 {
6012   for (int i=0 ; i<3 ; i++)
6013   {
6014     g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6015     g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
6016     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
6017     g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6018   }
6019
6020   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
6021   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
6022   g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
6023
6024   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
6025   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
6026   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6027
6028   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
6029   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
6030   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
6031
6032   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6033   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6034   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6035
6036   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6037   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6038   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6039
6040   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
6041   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
6042   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
6043
6044   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
6045   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
6046   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
6047
6048   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6049   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6050   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6051
6052   g_PrefsDlg.SavePrefs();
6053   Sys_UpdateWindows (W_ALL);
6054 }
6055
6056 /* ydnar: to emulate maya/max/lightwave color schemes */
6057 void MainFrame::OnColorSetydnar()
6058 {
6059   for (int i=0 ; i<3 ; i++)
6060   {
6061     g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
6062     g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
6063     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
6064     g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
6065     g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
6066   }
6067
6068   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
6069   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
6070   g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
6071
6072   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
6073   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
6074   g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
6075
6076   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
6077   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
6078   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
6079
6080   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
6081   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
6082   g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
6083
6084   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
6085   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
6086   g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
6087
6088   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
6089   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
6090   g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
6091
6092   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
6093   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
6094   g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
6095
6096   g_PrefsDlg.SavePrefs();
6097   Sys_UpdateWindows (W_ALL);
6098 }
6099
6100 void MainFrame::OnTexturebk()
6101 {
6102   DoColor(COLOR_TEXTUREBACK);
6103   Sys_UpdateWindows (W_ALL);
6104 }
6105
6106 void MainFrame::OnColorsXybk()
6107 {
6108   DoColor(COLOR_GRIDBACK);
6109   Sys_UpdateWindows (W_ALL);
6110 }
6111
6112 void MainFrame::OnColorsMajor()
6113 {
6114   DoColor(COLOR_GRIDMAJOR);
6115   Sys_UpdateWindows (W_ALL);
6116 }
6117
6118 void MainFrame::OnColorsMinor()
6119 {
6120   DoColor(COLOR_GRIDMINOR);
6121   Sys_UpdateWindows (W_ALL);
6122 }
6123
6124 void MainFrame::OnColorsMajor_Alt()
6125 {
6126   DoColor(COLOR_GRIDMAJOR_ALT);
6127   Sys_UpdateWindows (W_ALL);
6128 }
6129
6130 void MainFrame::OnColorsMinor_Alt()
6131 {
6132   DoColor(COLOR_GRIDMINOR_ALT);
6133   Sys_UpdateWindows (W_ALL);
6134 }
6135
6136 void MainFrame::OnColorsGridtext()
6137 {
6138   DoColor(COLOR_GRIDTEXT);
6139   Sys_UpdateWindows (W_ALL);
6140 }
6141
6142 void MainFrame::OnColorsGridblock()
6143 {
6144   DoColor(COLOR_GRIDBLOCK);
6145   Sys_UpdateWindows (W_ALL);
6146 }
6147
6148 void MainFrame::OnColorsCameraBack()
6149 {
6150   DoColor(COLOR_CAMERABACK);
6151   Sys_UpdateWindows (W_ALL);
6152 }
6153
6154 void MainFrame::OnColorsBrush()
6155 {
6156   DoColor(COLOR_BRUSHES);
6157   Sys_UpdateWindows (W_ALL);
6158 }
6159
6160 void MainFrame::OnColorsSelectedbrush()
6161 {
6162   DoColor(COLOR_SELBRUSHES);
6163   Sys_UpdateWindows (W_ALL);
6164 }
6165
6166 void MainFrame::OnColorsSelectedbrush3D()
6167 {
6168   DoColor(COLOR_SELBRUSHES3D);
6169   Sys_UpdateWindows (W_ALL);
6170 }
6171
6172 void MainFrame::OnColorsClipper()
6173 {
6174   DoColor(COLOR_CLIPPER);
6175   Sys_UpdateWindows (W_ALL);
6176 }
6177
6178 void MainFrame::OnColorsViewname()
6179 {
6180   DoColor(COLOR_VIEWNAME);
6181   Sys_UpdateWindows (W_ALL);
6182 }
6183
6184 void MainFrame::OnMiscGamma()
6185 {
6186   float fSave = g_qeglobals.d_savedinfo.fGamma;
6187   DoGamma();
6188   if (fSave != g_qeglobals.d_savedinfo.fGamma)
6189   {
6190     gtk_MessageBox(m_pWidget, _("You must restart Radiant for Gamma settings to take effect."));
6191   }
6192 }
6193 void MainFrame::OnMiscFindbrush()
6194 {
6195   DoFind();
6196 }
6197
6198 void MainFrame::OnMiscNextleakspot()
6199 {
6200   Pointfile_Next();
6201 }
6202
6203 void MainFrame::OnMiscPreviousleakspot()
6204 {
6205   Pointfile_Prev();
6206 }
6207
6208 void MainFrame::OnMiscPrintxy()
6209 {
6210   WXY_Print();
6211 }
6212
6213 void MainFrame::OnMiscSelectentitycolor()
6214 {
6215   if (edit_entity)
6216   {
6217     CString strColor = ValueForKey(edit_entity, "_color");
6218     if (strColor.GetLength() > 0)
6219     {
6220       float fR, fG, fB;
6221       int n = sscanf(strColor,"%f %f %f", &fR, &fG, &fB);
6222       if (n == 3)
6223       {
6224         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6225         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6226         g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6227       }
6228     }
6229
6230     if (inspector_mode == W_ENTITY && (DoColor(COLOR_ENTITY)))
6231     {
6232       char buffer[100];
6233       sprintf(buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6234               g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6235               g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2]);
6236
6237       gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntValueField]), buffer);
6238       gtk_entry_set_text (GTK_ENTRY (EntWidgets[EntKeyField]), "_color");
6239       AddProp();
6240       //DK - SOF change to get color to entity quickly
6241       //--::SetWindowText( hwndEnt[EntValueField], buffer );
6242       //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6243       //--AddProp();
6244     }
6245     Sys_UpdateWindows( W_ALL );
6246   }
6247 }
6248
6249 void MainFrame::OnConvertcurves()
6250 {
6251 #if 0
6252   Select_Deselect();
6253   for (brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next)
6254   {
6255     if (pb->curveBrush)
6256     {
6257       for (face_t* f = pb->brush_faces ; f ; f=f->next)
6258       {
6259         if (f->texdef.contents & CONTENTS_LADDER)
6260         {
6261           f->texdef.contents &= ~CONTENTS_LADDER;
6262           f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6263         }
6264       }
6265     }
6266   }
6267   Map_BuildBrushData();
6268 #endif
6269 }
6270
6271 void MainFrame::OnRegionOff()
6272 {
6273   Map_RegionOff ();
6274 }
6275
6276 void MainFrame::OnRegionSetxy()
6277 {
6278   Map_RegionXY ();
6279 }
6280
6281 void MainFrame::OnRegionSettallbrush()
6282 {
6283   Map_RegionTallBrush ();
6284 }
6285
6286 void MainFrame::OnRegionSetbrush()
6287 {
6288   Map_RegionBrush ();
6289 }
6290
6291 void MainFrame::OnRegionSetselection()
6292 {
6293   Map_RegionSelectedBrushes ();
6294 }
6295
6296 void MainFrame::OnBrush3sided()
6297 {
6298   Undo_Start("3 sided");
6299   Undo_AddBrushList(&selected_brushes);
6300   Brush_MakeSided(3);
6301   Undo_EndBrushList(&selected_brushes);
6302   Undo_End();
6303 }
6304
6305 void MainFrame::OnBrush4sided()
6306 {
6307   Undo_Start("4 sided");
6308   Undo_AddBrushList(&selected_brushes);
6309   Brush_MakeSided(4);
6310   Undo_EndBrushList(&selected_brushes);
6311   Undo_End();
6312 }
6313
6314 void MainFrame::OnBrush5sided()
6315 {
6316   Undo_Start("5 sided");
6317   Undo_AddBrushList(&selected_brushes);
6318   Brush_MakeSided(5);
6319   Undo_EndBrushList(&selected_brushes);
6320   Undo_End();
6321 }
6322
6323 void MainFrame::OnBrush6sided()
6324 {
6325   Undo_Start("6 sided");
6326   Undo_AddBrushList(&selected_brushes);
6327   Brush_MakeSided(6);
6328   Undo_EndBrushList(&selected_brushes);
6329   Undo_End();
6330 }
6331
6332 void MainFrame::OnBrush7sided()
6333 {
6334   Undo_Start("7 sided");
6335   Undo_AddBrushList(&selected_brushes);
6336   Brush_MakeSided(7);
6337   Undo_EndBrushList(&selected_brushes);
6338   Undo_End();
6339 }
6340
6341 void MainFrame::OnBrush8sided()
6342 {
6343   Undo_Start("8 sided");
6344   Undo_AddBrushList(&selected_brushes);
6345   Brush_MakeSided(8);
6346   Undo_EndBrushList(&selected_brushes);
6347   Undo_End();
6348 }
6349
6350 void MainFrame::OnBrush9sided()
6351 {
6352   Undo_Start("9 sided");
6353   Undo_AddBrushList(&selected_brushes);
6354   Brush_MakeSided(9);
6355   Undo_EndBrushList(&selected_brushes);
6356   Undo_End();
6357 }
6358
6359 void MainFrame::OnBrushArbitrarysided()
6360 {
6361   Undo_Start("arbitrary sided");
6362   Undo_AddBrushList(&selected_brushes);
6363   DoSides();
6364   Undo_EndBrushList(&selected_brushes);
6365   Undo_End();
6366 }
6367
6368 void MainFrame::OnBrushMakecone()
6369 {
6370   Undo_Start("make cone");
6371   Undo_AddBrushList(&selected_brushes);
6372   DoSides(true);
6373   Undo_EndBrushList(&selected_brushes);
6374   Undo_End();
6375 }
6376
6377 void MainFrame::OnBrushPrimitivesSphere()
6378 {
6379   Undo_Start("make sphere");
6380   Undo_AddBrushList(&selected_brushes);
6381
6382   DoSides(false, true);
6383
6384   Undo_EndBrushList(&selected_brushes);
6385   Undo_End();
6386 }
6387
6388 void MainFrame::OnCurvePatchtube()
6389 {
6390   Undo_Start("make curve cylinder");
6391   Undo_AddBrushList(&selected_brushes);
6392   Patch_BrushToMesh(false);
6393   Sys_UpdateWindows (W_ALL);
6394   Undo_EndBrushList(&selected_brushes);
6395   Undo_End();
6396 }
6397
6398 void MainFrame::OnCurvePatchdensetube()
6399 {
6400   Undo_Start("dense cylinder");
6401   Undo_AddBrushList(&selected_brushes);
6402
6403   Patch_BrushToMesh(false);
6404   OnCurveInsertAddrow();
6405   Sys_UpdateWindows (W_ALL);
6406
6407   Undo_EndBrushList(&selected_brushes);
6408   Undo_End();
6409 }
6410
6411 void MainFrame::OnCurvePatchverydensetube()
6412 {
6413   Undo_Start("very dense cylinder");
6414   Undo_AddBrushList(&selected_brushes);
6415
6416   Patch_BrushToMesh(false);
6417   OnCurveInsertAddrow();
6418   OnCurveInsertInsertrow();
6419   OnCurveInsertAddrow();
6420   Sys_UpdateWindows (W_ALL);
6421
6422   Undo_EndBrushList(&selected_brushes);
6423   Undo_End();
6424 }
6425
6426 void MainFrame::OnCurvePatchsquare()
6427 {
6428   Undo_Start("square cylinder");
6429   Undo_AddBrushList(&selected_brushes);
6430
6431   Patch_BrushToMesh(false, false, false, true);
6432   Sys_UpdateWindows (W_ALL);
6433
6434   Undo_EndBrushList(&selected_brushes);
6435   Undo_End();
6436 }
6437
6438 void MainFrame::OnCurvePatchendcap()
6439 {
6440   Undo_Start("make end cap");
6441   Undo_AddBrushList(&selected_brushes);
6442   Patch_BrushToMesh(false, false, true);
6443   Sys_UpdateWindows (W_ALL);
6444   Undo_EndBrushList(&selected_brushes);
6445   Undo_End();
6446 }
6447
6448 void MainFrame::OnCurvePatchbevel()
6449 {
6450   Undo_Start("make bevel");
6451   Undo_AddBrushList(&selected_brushes);
6452   Patch_BrushToMesh(false, true, false);
6453   Sys_UpdateWindows (W_ALL);
6454   Undo_EndBrushList(&selected_brushes);
6455   Undo_End();
6456 }
6457
6458 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel()
6459 {
6460   Undo_Start("square bevel");
6461   Undo_AddBrushList(&selected_brushes);
6462
6463   Patch_BrushToMesh(false, true, false, true);
6464   Sys_UpdateWindows (W_ALL);
6465
6466   Undo_EndBrushList(&selected_brushes);
6467   Undo_End();
6468 }
6469
6470 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap()
6471 {
6472   Undo_Start("square endcap");
6473   Undo_AddBrushList(&selected_brushes);
6474
6475   Patch_BrushToMesh(false, false, true, true);
6476   Sys_UpdateWindows (W_ALL);
6477
6478   Undo_EndBrushList(&selected_brushes);
6479   Undo_End();
6480 }
6481
6482 void MainFrame::OnCurvePatchcone()
6483 {
6484   Undo_Start("make curve cone");
6485   Undo_AddBrushList(&selected_brushes);
6486   Patch_BrushToMesh(true);
6487   Sys_UpdateWindows (W_ALL);
6488   Undo_EndBrushList(&selected_brushes);
6489   Undo_End();
6490 }
6491
6492 void MainFrame::OnCurveSimplepatchmesh()
6493 {
6494   Undo_Start("make simpe patch mesh");
6495   Undo_AddBrushList(&selected_brushes);
6496   DoNewPatchDlg ();
6497   Undo_EndBrushList(&selected_brushes);
6498   Undo_End();
6499 }
6500
6501 void MainFrame::OnCurveInsertInsertcolumn()
6502 {
6503   Undo_Start("insert (2) columns");
6504   Undo_AddBrushList(&selected_brushes);
6505   Patch_AdjustSelected(true, true, false);
6506   Sys_UpdateWindows(W_ALL);
6507   Undo_EndBrushList(&selected_brushes);
6508   Undo_End();
6509 }
6510
6511 void MainFrame::OnCurveInsertAddcolumn()
6512 {
6513   Undo_Start("add (2) columns");
6514   Undo_AddBrushList(&selected_brushes);
6515   Patch_AdjustSelected(true, true, true);
6516   Sys_UpdateWindows(W_ALL);
6517   Undo_EndBrushList(&selected_brushes);
6518   Undo_End();
6519 }
6520
6521 void MainFrame::OnCurveInsertInsertrow()
6522 {
6523   Undo_Start("insert (2) rows");
6524   Undo_AddBrushList(&selected_brushes);
6525   Patch_AdjustSelected(true, false, false);
6526   Sys_UpdateWindows(W_ALL);
6527   Undo_EndBrushList(&selected_brushes);
6528   Undo_End();
6529 }
6530
6531 void MainFrame::OnCurveInsertAddrow()
6532 {
6533   Undo_Start("add (2) rows");
6534   Undo_AddBrushList(&selected_brushes);
6535   Patch_AdjustSelected(true, false, true);
6536   Sys_UpdateWindows(W_ALL);
6537   Undo_EndBrushList(&selected_brushes);
6538   Undo_End();
6539 }
6540
6541 void MainFrame::OnCurveDeleteFirstcolumn()
6542 {
6543   Undo_Start("delete first (2) columns");
6544   Undo_AddBrushList(&selected_brushes);
6545   Patch_AdjustSelected(false, true, true);
6546   Sys_UpdateWindows(W_ALL);
6547   Undo_EndBrushList(&selected_brushes);
6548   Undo_End();
6549 }
6550
6551 void MainFrame::OnCurveDeleteLastcolumn()
6552 {
6553   Undo_Start("delete last (2) columns");
6554   Undo_AddBrushList(&selected_brushes);
6555   Patch_AdjustSelected(false, true, false);
6556   Sys_UpdateWindows(W_ALL);
6557   Undo_EndBrushList(&selected_brushes);
6558   Undo_End();
6559 }
6560
6561 void MainFrame::OnCurveDeleteFirstrow()
6562 {
6563   Undo_Start("delete first (2) rows");
6564   Undo_AddBrushList(&selected_brushes);
6565   Patch_AdjustSelected(false, false, true);
6566   Sys_UpdateWindows(W_ALL);
6567   Undo_EndBrushList(&selected_brushes);
6568   Undo_End();
6569 }
6570
6571 void MainFrame::OnCurveDeleteLastrow()
6572 {
6573   Undo_Start("delete last (2) rows");
6574   Undo_AddBrushList(&selected_brushes);
6575   Patch_AdjustSelected(false, false, false);
6576   Sys_UpdateWindows(W_ALL);
6577   Undo_EndBrushList(&selected_brushes);
6578   Undo_End();
6579 }
6580
6581 void MainFrame::OnCurveNegative()
6582 {
6583   Patch_ToggleInverted();
6584   //Sys_UpdateWindows(W_ALL);
6585 }
6586
6587 void MainFrame::OnCurveRedisperseRows()
6588 {
6589   Undo_Start("redisperse rows");
6590   Undo_AddBrushList(&selected_brushes);
6591   Patch_DisperseRows();
6592   Sys_UpdateWindows (W_ALL);
6593   Undo_EndBrushList(&selected_brushes);
6594   Undo_End();
6595 }
6596
6597 void MainFrame::OnCurveRedisperseIntermediateCols()
6598 {
6599   Undo_Start("redisperse im cols");
6600   Undo_AddBrushList(&selected_brushes);
6601   Patch_DisperseIntermediateColumns();
6602   Sys_UpdateWindows (W_ALL);
6603   Undo_EndBrushList(&selected_brushes);
6604   Undo_End();
6605 }
6606
6607 void MainFrame::OnCurveRedisperseIntermediateRows()
6608 {
6609   Undo_Start("redisperse im rows");
6610   Undo_AddBrushList(&selected_brushes);
6611   Patch_DisperseIntermediateRows();
6612   Sys_UpdateWindows (W_ALL);
6613   Undo_EndBrushList(&selected_brushes);
6614   Undo_End();
6615 }
6616
6617 void MainFrame::OnCurveMatrixTranspose()
6618 {
6619   Patch_Transpose();
6620   Sys_UpdateWindows (W_ALL);
6621 }
6622
6623 void MainFrame::OnCurveCap()
6624 {
6625   Patch_CapCurrent();
6626   Sys_UpdateWindows (W_ALL);
6627 }
6628
6629 void MainFrame::OnCurveCyclecap()
6630 {
6631   Patch_CycleCapSelected();
6632   Sys_UpdateWindows (W_ALL);
6633 }
6634
6635 void MainFrame::OnCurveOverlaySet()
6636 {
6637   Patch_SetOverlays();
6638   Sys_UpdateWindows(W_ALL);
6639 }
6640
6641 void MainFrame::OnCurveOverlayClear()
6642 {
6643   Patch_ClearOverlays();
6644   Sys_UpdateWindows(W_ALL);
6645 }
6646
6647 void MainFrame::OnCurveThicken()
6648 {
6649   Undo_Start("curve thicken");
6650   Undo_AddBrushList(&selected_brushes);
6651   DoThickenDlg ();
6652   Undo_EndBrushList(&selected_brushes);
6653   Undo_End();
6654 }
6655
6656 /*!
6657 this can no longer be trigger manually from the menu
6658 happens only once at startup
6659 */
6660 void MainFrame::OnPluginsRefresh()
6661 {
6662   CleanPlugInMenu();
6663   m_PlugInMgr.Init();
6664 }
6665
6666 // open the Q3Rad manual
6667 void MainFrame::OnHelp()
6668 {
6669   // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6670   Str help;
6671   help = g_strAppPath;
6672   help += "Q3Rad_Manual/index.htm";
6673   OpenURL(help.GetBuffer());
6674 }
6675
6676 // FIXME: we'll go towards a unified help thing soon
6677 void MainFrame::OnHelpLinks()
6678 {
6679   Str link;
6680   link = g_strAppPath;
6681   link += "links.htm";
6682   OpenURL(link.GetBuffer());
6683 }
6684
6685 void MainFrame::OnHelpBugreport()
6686 {
6687   OpenURL("http://www.qeradiant.com/faq/fom-serve/cache/138.html");
6688 }
6689
6690 void MainFrame::OnHelpCommandlist()
6691 {
6692   DoCommandListDlg ();
6693 }
6694
6695 void MainFrame::OnHelpAbout()
6696 {
6697   DoAbout();
6698 }
6699
6700 void MainFrame::OnPopupSelection()
6701 {
6702   GtkWidget *menu, *item;
6703   const gchar *labels[] = { _("Select Complete Tall"), _("Select Touching"), _("Select Partial Tall"), _("Select Inside")};
6704   int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6705     ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6706
6707   menu = gtk_menu_new ();
6708
6709   for (int i = 0; i < 4; i++)
6710   {
6711     item = gtk_menu_item_new_with_label (labels[i]);
6712     gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (HandleCommand),
6713                         GINT_TO_POINTER (ids[i]));
6714     gtk_widget_show (item);
6715     gtk_menu_append (GTK_MENU (menu), item);
6716   }
6717
6718   gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6719 }
6720
6721 void MainFrame::OnViewChange()
6722 {
6723   OnViewNextview();
6724   //HandlePopup(this, IDR_POPUP_VIEW);
6725 }
6726
6727 void MainFrame::OnTexturesPopup()
6728 {
6729   gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "render_quality_menu");
6730   gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6731 }
6732
6733 void MainFrame::ToggleCamera()
6734 {
6735   if (m_bCamPreview)
6736     m_bCamPreview = false;
6737   else
6738     m_bCamPreview = true;
6739 }
6740
6741 void MainFrame::OnViewCameraupdate()
6742 {
6743   Sys_UpdateWindows(W_CAMERA);
6744 }
6745
6746 void MainFrame::OnSelectMouserotate()
6747 {
6748   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mouserotate"));
6749   g_bIgnoreCommands++;
6750
6751   if (ActiveXY())
6752   {
6753     if (ActiveXY()->ClipMode())
6754       OnViewClipper();
6755     if (ActiveXY()->RotateMode())
6756     {
6757       // SetRotateMode(false) always works
6758       ActiveXY()->SetRotateMode(false);
6759       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6760     } else
6761     {
6762       // may not work if no brush selected, see return value
6763       if (ActiveXY()->SetRotateMode(true))
6764         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6765       else
6766         // if MFC called, we need to set back to FALSE ourselves
6767         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6768     }
6769   }
6770   g_bIgnoreCommands--;
6771 }
6772
6773 void MainFrame::OnSelectMousescale()
6774 {
6775   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_select_mousescale"));
6776   g_bIgnoreCommands++;
6777
6778   if (ActiveXY())
6779   {
6780     if (ActiveXY()->ClipMode())
6781       OnViewClipper();
6782     if (ActiveXY()->RotateMode())
6783     {
6784       // SetRotateMode(false) always works
6785       ActiveXY()->SetRotateMode(false);
6786       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6787     }
6788     if (ActiveXY()->ScaleMode())
6789     {
6790       ActiveXY()->SetScaleMode(false);
6791       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6792     } else
6793     {
6794       ActiveXY()->SetScaleMode(true);
6795       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6796     }
6797   }
6798   g_bIgnoreCommands--;
6799 }
6800
6801 void MainFrame::OnScalelockx()
6802 {
6803   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockx"));
6804   g_bIgnoreCommands++;
6805
6806   if (g_nScaleHow & SCALE_X)
6807   {
6808     g_nScaleHow ^= SCALE_X;
6809     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6810   } else
6811   {
6812     g_nScaleHow |= SCALE_X;
6813     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6814   }
6815   g_bIgnoreCommands--;
6816 }
6817
6818 void MainFrame::OnScalelocky()
6819 {
6820   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelocky"));
6821   g_bIgnoreCommands++;
6822
6823   if (g_nScaleHow & SCALE_Y)
6824   {
6825     g_nScaleHow ^= SCALE_Y;
6826     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6827   } else
6828   {
6829     g_nScaleHow |= SCALE_Y;
6830     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6831   }
6832   g_bIgnoreCommands--;
6833 }
6834
6835 void MainFrame::OnScalelockz()
6836 {
6837   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_scalelockz"));
6838   g_bIgnoreCommands++;
6839
6840   if (g_nScaleHow & SCALE_Z)
6841   {
6842     g_nScaleHow ^= SCALE_Z;
6843     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), FALSE);
6844   } else
6845   {
6846     g_nScaleHow |= SCALE_Z;
6847     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), TRUE);
6848   }
6849   g_bIgnoreCommands--;
6850 }
6851
6852 void MainFrame::OnDontselectcurve()
6853 {
6854   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectcurve"));
6855   g_bIgnoreCommands++;
6856   g_PrefsDlg.m_bSelectCurves ^= 1;
6857   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectCurves) ? FALSE : TRUE);
6858   g_bIgnoreCommands--;
6859 }
6860
6861 void MainFrame::OnPatchToggleBox()
6862 {
6863   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_showboundingbox"));
6864   g_bIgnoreCommands++;
6865   g_bPatchShowBounds ^= 1;
6866   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchShowBounds) ? TRUE : FALSE);
6867   g_bIgnoreCommands--;
6868   Sys_UpdateWindows(W_ALL);
6869 }
6870
6871 void MainFrame::OnPatchWireframe()
6872 {
6873   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_wireframe"));
6874   g_bIgnoreCommands++;
6875   g_bPatchWireFrame ^= 1;
6876   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWireFrame) ? TRUE : FALSE);
6877   g_bIgnoreCommands--;
6878   Sys_UpdateWindows(W_ALL);
6879 }
6880
6881 void MainFrame::OnPatchBend()
6882 {
6883   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_bend"));
6884   g_bIgnoreCommands++;
6885   Patch_BendToggle();
6886   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchBendMode) ? TRUE : FALSE);
6887   g_bIgnoreCommands--;
6888   Sys_UpdateWindows(W_ALL);
6889 }
6890
6891 void MainFrame::OnPatchWeld()
6892 {
6893   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_weld"));
6894   g_bIgnoreCommands++;
6895   g_bPatchWeld ^= 1;
6896   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchWeld) ? TRUE : FALSE);
6897   g_bIgnoreCommands--;
6898   Sys_UpdateWindows(W_ALL);
6899 }
6900
6901 void MainFrame::OnPatchDrilldown()
6902 {
6903   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_drilldown"));
6904   g_bIgnoreCommands++;
6905   g_bPatchDrillDown ^= 1;
6906   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchDrillDown) ? TRUE : FALSE);
6907   g_bIgnoreCommands--;
6908   Sys_UpdateWindows(W_ALL);
6909 }
6910
6911 void MainFrame::OnShowEntities()
6912 {
6913   gpointer item = g_object_get_data (G_OBJECT (m_pWidget), "view_entitiesas_menu"); // use pointer to existing menu object
6914   gtk_menu_popup (GTK_MENU (item), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
6915 }
6916
6917 void MainFrame::OnDropGroupName()
6918 {
6919   /*
6920   char* name = DoNameDlg ("Name Selection");
6921
6922   if (name != NULL)
6923   {
6924     Select_Name (name);
6925     Sys_UpdateWindows (W_ALL);
6926     free (name);
6927   }
6928   */
6929 }
6930
6931 void MainFrame::OnDropGroupNewgroup()
6932 {
6933
6934 }
6935
6936 void MainFrame::OnDropGroupRemove()
6937 {
6938   /*
6939   Select_AddToGroup("World");
6940   Sys_UpdateWindows (W_ALL);
6941   */
6942 }
6943
6944 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6945 void MainFrame::OnFaceFit()
6946 {
6947   SurfaceDlgFitAll();
6948 }
6949
6950 void MainFrame::OnDontselectmodel()
6951 {
6952   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_dontselectmodel"));
6953   g_bIgnoreCommands++;
6954   g_PrefsDlg.m_bSelectModels ^= 1;
6955   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_PrefsDlg.m_bSelectModels) ? FALSE : TRUE);
6956   g_bIgnoreCommands--;
6957 }
6958
6959 void MainFrame::OnViewTexture()
6960 {
6961   if (FloatingGroupDialog()) // QE4 style
6962   {
6963     if (inspector_mode == W_TEXTURE)
6964     {
6965       if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
6966         widget_delete_hide (g_qeglobals_gui.d_entity);
6967       else
6968         gtk_widget_show (g_qeglobals_gui.d_entity);
6969     } else
6970     {
6971       gtk_widget_show (g_qeglobals_gui.d_entity);
6972       SetInspectorMode (W_TEXTURE);
6973     }
6974   }
6975 }
6976
6977 void MainFrame::OnPatchInspector()
6978 {
6979   TogglePatchInspector();
6980 }
6981
6982 void MainFrame::OnCurveNegativeTextureX()
6983 {
6984   Patch_InvertTexture(false);
6985   //Sys_UpdateWindows(W_ALL);
6986 }
6987
6988 void MainFrame::OnCurveNegativeTextureY()
6989 {
6990   Patch_InvertTexture(true);
6991   //Sys_UpdateWindows(W_ALL);
6992 }
6993
6994 void MainFrame::OnCurveInsertcolumn()
6995 {
6996   if (&selected_brushes == selected_brushes.next)
6997     return;
6998   Undo_Start("insert colum");
6999   Undo_AddBrushList(&selected_brushes);
7000   //Patch_AdjustSelectedRowCols(0, 2);
7001   Patch_AdjustSelected(true, true, true);
7002   Sys_UpdateWindows(W_ALL);
7003   Undo_EndBrushList(&selected_brushes);
7004   Undo_End();
7005 }
7006
7007 void MainFrame::OnCurveInsertrow()
7008 {
7009   if (&selected_brushes == selected_brushes.next)
7010     return;
7011   Undo_Start("insert row");
7012   Undo_AddBrushList(&selected_brushes);
7013   //Patch_AdjustSelectedRowCols(2, 0);
7014   Patch_AdjustSelected(true, false, true);
7015   Sys_UpdateWindows(W_ALL);
7016   Undo_EndBrushList(&selected_brushes);
7017   Undo_End();
7018 }
7019
7020 void MainFrame::OnCurveDeletecolumn()
7021 {
7022   if (&selected_brushes == selected_brushes.next)
7023     return;
7024   Undo_Start("delete column");
7025   Undo_AddBrushList(&selected_brushes);
7026   Patch_AdjustSelected(false, true, true);
7027   Sys_UpdateWindows(W_ALL);
7028   Undo_EndBrushList(&selected_brushes);
7029   Undo_End();
7030 }
7031
7032 void MainFrame::OnCurveDeleterow()
7033 {
7034   if (&selected_brushes == selected_brushes.next)
7035     return;
7036   Undo_Start("delete row");
7037   Undo_AddBrushList(&selected_brushes);
7038   Patch_AdjustSelected(false, false, true);
7039   Sys_UpdateWindows(W_ALL);
7040   Undo_EndBrushList(&selected_brushes);
7041   Undo_End();
7042 }
7043
7044 void MainFrame::OnPatchTab()
7045 {
7046   if (g_bPatchBendMode)
7047     Patch_BendHandleTAB();
7048 //  else if (g_bPatchInsertMode)
7049 //    Patch_InsDelHandleTAB();
7050   else
7051   {
7052     // check to see if the selected brush is part of a func group
7053     // if it is, deselect everything and reselect the next brush
7054     // in the group
7055     brush_t *b2, *b = selected_brushes.next;
7056     entity_t * e;
7057     if (b != &selected_brushes)
7058     {
7059       if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7060       {
7061         e = b->owner;
7062         Select_Deselect();
7063         for (b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext)
7064         {
7065           if (b == b2)
7066           {
7067             b2 = b2->onext;
7068             break;
7069           }
7070         }
7071         if (b2 == &e->brushes)
7072           b2 = b2->onext;
7073
7074         Select_Brush(b2, false);
7075         Sys_UpdateWindows(W_ALL);
7076       }
7077     }
7078   }
7079 }
7080
7081 void MainFrame::OnSelectFuncGroup() 
7082 {
7083         // check to see if the selected brush is part of a func group
7084         // if it is, deselect everything and reselect the next brush 
7085         // in the group
7086         brush_t *b = selected_brushes.next;
7087         entity_t * e;
7088         if (b != &selected_brushes)
7089         {
7090                 if (strcmpi(b->owner->eclass->name, "worldspawn") != 0)
7091                 {
7092                         e = b->owner;
7093                         Select_SelectGroup(e);
7094                 }
7095         }
7096 }
7097
7098 void MainFrame::OnCameraForward(bool keydown) 
7099 {
7100   if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7101   {
7102     if(keydown)
7103     {
7104       VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7105       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7106       Sys_UpdateWindows (nUpdate);
7107     }
7108   }
7109   else {
7110     if (keydown)
7111       m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
7112     else
7113       m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
7114   }
7115 }
7116
7117 void MainFrame::OnCameraBack(bool keydown)
7118 {
7119   if (g_PrefsDlg.m_bCamDiscrete && (m_pCamWnd && !m_pCamWnd->m_bFreeMove) )
7120   {
7121     if(keydown)
7122     {
7123       VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin);
7124       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7125       Sys_UpdateWindows (nUpdate);
7126     }
7127   }
7128   else {
7129     if (keydown)
7130       m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
7131     else
7132       m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
7133   }
7134 }
7135
7136 void MainFrame::OnCameraLeft(bool keydown)
7137 {
7138   if (m_pCamWnd)
7139   {
7140     if (m_pCamWnd->m_bFreeMove)
7141     {
7142       OnCameraStrafeleft(keydown);
7143       return;
7144     }
7145   }
7146
7147   if (g_PrefsDlg.m_bCamDiscrete)
7148   {
7149     if(keydown)
7150     {
7151       m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
7152       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7153       Sys_UpdateWindows (nUpdate);
7154     }
7155   }
7156   else {
7157     if (keydown)
7158       m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
7159     else
7160       m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
7161   }
7162 }
7163
7164 void MainFrame::OnCameraRight(bool keydown)
7165 {
7166   if (m_pCamWnd)
7167   {
7168     if (m_pCamWnd->m_bFreeMove)
7169     {
7170       OnCameraStraferight(keydown);
7171       return;
7172     }
7173   }
7174
7175   if (g_PrefsDlg.m_bCamDiscrete)
7176   {
7177     if(keydown)
7178     {
7179       m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
7180       int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7181       Sys_UpdateWindows (nUpdate);
7182     }
7183   }
7184   else {
7185     if (keydown)
7186       m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
7187     else
7188       m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
7189   }
7190 }
7191
7192 void MainFrame::OnCameraUp()
7193 {
7194   m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
7195   int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7196   Sys_UpdateWindows (nUpdate);
7197 }
7198
7199 void MainFrame::OnCameraDown()
7200 {
7201   m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
7202   int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY | W_Z) : (W_CAMERA);
7203   Sys_UpdateWindows (nUpdate);
7204 }
7205
7206 void MainFrame::OnCameraAngleup()
7207 {
7208   m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
7209   if (m_pCamWnd->Camera()->angles[0] > 85)
7210     m_pCamWnd->Camera()->angles[0] = 85;
7211   Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7212 }
7213
7214 void MainFrame::OnCameraAngledown()
7215 {
7216   m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
7217   if (m_pCamWnd->Camera()->angles[0] < -85)
7218     m_pCamWnd->Camera()->angles[0] = -85;
7219   Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
7220 }
7221
7222 void MainFrame::OnCameraStrafeleft(bool keydown)
7223 {
7224   // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7225   if (m_pCamWnd)
7226   {
7227     if (!m_pCamWnd->m_bFreeMove)
7228     {
7229       if(keydown)
7230       {
7231         VectorMA (m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7232         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7233         Sys_UpdateWindows (nUpdate);
7234       }
7235       return;
7236     }
7237   }
7238
7239   if (keydown)
7240     m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
7241   else
7242     m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
7243 }
7244
7245 void MainFrame::OnCameraStraferight(bool keydown)
7246 {
7247   // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7248   if (m_pCamWnd)
7249   {
7250     if (!m_pCamWnd->m_bFreeMove)
7251     {
7252       if(keydown)
7253       {
7254         VectorMA (m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin);
7255         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
7256         Sys_UpdateWindows (nUpdate);
7257       }
7258       return;
7259     }
7260   }
7261
7262   if (keydown)
7263     m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7264   else
7265     m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7266 }
7267
7268 void MainFrame::OnGridToggle()
7269 {
7270   g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7271   Sys_UpdateWindows (W_XY|W_Z);
7272 }
7273
7274 void MainFrame::OnViewCrosshair()
7275 {
7276   g_bCrossHairs ^= 1;
7277   Sys_UpdateWindows (W_XY);
7278 }
7279
7280 void MainFrame::OnSelectionTextureRotateclock()
7281 {
7282   Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
7283 }
7284
7285 void MainFrame::OnSelectionTextureRotatecounter()
7286 {
7287   Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
7288 }
7289
7290 void MainFrame::OnSelectionTextureScaleup()
7291 {
7292   Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7293 }
7294
7295 void MainFrame::OnSelectionTextureScaledown()
7296 {
7297   Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1]);
7298 }
7299
7300 void MainFrame::OnSelectionTextureScaleLeft()
7301 {
7302   Select_ScaleTexture(-g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7303 }
7304
7305 void MainFrame::OnSelectionTextureScaleRight()
7306 {
7307   Select_ScaleTexture(g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0);
7308 }
7309
7310 void MainFrame::OnSelectionTextureShiftleft()
7311 {
7312   Select_ShiftTexture((int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7313 }
7314
7315 void MainFrame::OnSelectionTextureShiftright()
7316 {
7317   Select_ShiftTexture((int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0);
7318 }
7319
7320 void MainFrame::OnSelectionTextureShiftup()
7321 {
7322   Select_ShiftTexture(0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7323 }
7324
7325 void MainFrame::OnSelectionTextureShiftdown()
7326 {
7327   Select_ShiftTexture(0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1]);
7328 }
7329
7330 void MainFrame::OnGridPrev()
7331 {
7332   GtkWidget *item;
7333   if (g_qeglobals.d_gridsize == 1)
7334   {
7335     g_qeglobals.d_gridsize = 0.5;
7336     g_qeglobals.d_bSmallGrid = true;
7337     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7338   } else if (g_qeglobals.d_gridsize == 0.5)
7339   {
7340     g_qeglobals.d_gridsize = 0.25;
7341     g_qeglobals.d_bSmallGrid = true;
7342     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_025"));
7343   } else if (g_qeglobals.d_gridsize > 1)
7344   {
7345     g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7346     g_qeglobals.d_bSmallGrid = false;
7347
7348     switch ((int)g_qeglobals.d_gridsize)
7349     {
7350     case  1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7351     case  2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7352     case  4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7353     case  8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7354     case  16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7355     case  32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7356     case  64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7357     case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7358     case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7359     }
7360
7361   } else
7362     return;
7363
7364   // SnapTToGrid option: need to check everywhere the grid size is changed
7365   // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7366   if (g_PrefsDlg.m_bSnapTToGrid)
7367     DoSnapTToGrid();
7368
7369   SetGridStatus();
7370   g_bIgnoreCommands++;
7371   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7372   g_bIgnoreCommands--;
7373
7374   Sys_UpdateWindows(W_XY | W_Z);
7375 }
7376
7377 void MainFrame::OnGridNext()
7378 {
7379   GtkWidget *item;
7380   if (g_qeglobals.d_gridsize == 0.25)
7381   {
7382     g_qeglobals.d_gridsize = 0.5;
7383     g_qeglobals.d_bSmallGrid = true;
7384     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_05"));
7385   } else if (g_qeglobals.d_gridsize == 0.5)
7386   {
7387     g_qeglobals.d_gridsize = 1;
7388     g_qeglobals.d_bSmallGrid = false;
7389     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1"));
7390   } else if (g_qeglobals.d_gridsize < 256)
7391   {
7392     g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7393     g_qeglobals.d_bSmallGrid = false;
7394
7395     switch ((int)g_qeglobals.d_gridsize)
7396     {
7397     case  1: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_1")); break;
7398     case  2: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_2")); break;
7399     case  4: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_4")); break;
7400     case  8: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_8")); break;
7401     case  16: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_16")); break;
7402     case  32: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_32")); break;
7403     case  64: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_64")); break;
7404     case 128: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_128")); break;
7405     case 256: item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_grid_256")); break;
7406         default:  item = NULL;
7407     }
7408
7409   } else
7410     return;
7411
7412   // SnapTToGrid option: need to check everywhere the grid size is changed
7413   // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7414   if (g_PrefsDlg.m_bSnapTToGrid)
7415     DoSnapTToGrid();
7416
7417   SetGridStatus();
7418   g_bIgnoreCommands++;
7419   gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7420   g_bIgnoreCommands--;
7421
7422   Sys_UpdateWindows(W_XY | W_Z);
7423 }
7424
7425 void MainFrame::OnSelectionMovedown()
7426 {
7427   if (&selected_brushes == selected_brushes.next)
7428     return;
7429   Undo_Start("move down");
7430   Undo_AddBrushList(&selected_brushes);
7431
7432   vec3_t vAmt;
7433   vAmt[0] = vAmt[1] = 0.0;
7434   vAmt[2] = -g_qeglobals.d_gridsize;
7435   Select_Move (vAmt);
7436   Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7437
7438   Undo_EndBrushList(&selected_brushes);
7439   Undo_End();
7440 }
7441
7442 void MainFrame::OnSelectionMoveup()
7443 {
7444   if (&selected_brushes == selected_brushes.next)
7445     return;
7446   Undo_Start("move up");
7447   Undo_AddBrushList(&selected_brushes);
7448
7449   vec3_t vAmt;
7450   vAmt[0] = vAmt[1] = 0.0;
7451   vAmt[2] = g_qeglobals.d_gridsize;
7452   Select_Move (vAmt);
7453   Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
7454
7455   Undo_EndBrushList(&selected_brushes);
7456   Undo_End();
7457 }
7458
7459 void MainFrame::OnSelectionPrint()
7460 {
7461   for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
7462     Brush_Print(b);
7463 }
7464
7465 void MainFrame::OnSelectionTogglesizepaint()
7466 {
7467   g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7468   Sys_UpdateWindows(W_XY);
7469 }
7470
7471 void MainFrame::OnPatchNaturalize()
7472 {
7473   Patch_NaturalizeSelected();
7474   Sys_UpdateWindows (W_ALL);
7475 }
7476
7477 void MainFrame::OnSnapToGrid()
7478 {
7479   if (&selected_brushes == selected_brushes.next)
7480     return;
7481   Undo_Start("snap selection to grid");
7482   Undo_AddBrushList(&selected_brushes);
7483   //Select_SnapToGrid();
7484   for (brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next)
7485   {
7486     if (pb->patchBrush)
7487       Patch_SnapToGrid(pb->pPatch);
7488     else
7489       Brush_SnapToGrid(pb);
7490   }
7491   Sys_UpdateWindows (W_ALL);
7492   Undo_EndBrushList(&selected_brushes);
7493   Undo_End();
7494 }
7495
7496 void MainFrame::OnSelectAll()
7497 {
7498   Select_AllOfType();
7499 }
7500
7501 void MainFrame::OnSelectionInvert()
7502 {
7503   Select_Invert();
7504   Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
7505 }
7506
7507
7508 void PerformFiltering ()
7509 {
7510   brush_t *brush;
7511
7512   FilterUpdateBase();
7513
7514   for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7515     brush->bFiltered = FilterBrush( brush );
7516
7517   for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7518     brush->bFiltered = FilterBrush( brush );
7519 }
7520
7521 void MainFrame::OnFilterAreaportals()
7522 {
7523   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_areaportals"));
7524   g_bIgnoreCommands++;
7525   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS) & EXCLUDE_AREAPORTALS)
7526     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7527   else
7528     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7529   g_bIgnoreCommands--;
7530   PerformFiltering();
7531   Sys_UpdateWindows (W_XY|W_CAMERA);
7532 }
7533
7534 void MainFrame::OnFilterCaulk()
7535 {
7536   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_caulk"));
7537   g_bIgnoreCommands++;
7538   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK)
7539     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7540   else
7541     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7542   g_bIgnoreCommands--;
7543   PerformFiltering();
7544   Sys_UpdateWindows (W_XY|W_CAMERA);
7545 }
7546
7547 void MainFrame::OnFilterClips()
7548 {
7549   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clips"));
7550   g_bIgnoreCommands++;
7551   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP)
7552     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7553   else
7554     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7555   g_bIgnoreCommands--;
7556   PerformFiltering();
7557   Sys_UpdateWindows (W_XY|W_CAMERA);
7558 }
7559
7560 void MainFrame::OnFilterBotClips()
7561 {
7562   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_botclips"));
7563   g_bIgnoreCommands++;
7564   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP) & EXCLUDE_BOTCLIP)
7565     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7566   else
7567     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7568   g_bIgnoreCommands--;
7569   PerformFiltering();
7570   Sys_UpdateWindows (W_XY|W_CAMERA);
7571 }
7572
7573 void MainFrame::OnFilterStructural()
7574 {
7575   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_structural"));
7576   g_bIgnoreCommands++;
7577   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL) & EXCLUDE_STRUCTURAL)
7578     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7579   else
7580     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7581   g_bIgnoreCommands--;
7582   PerformFiltering();
7583   Sys_UpdateWindows (W_XY|W_CAMERA);
7584 }
7585
7586 void MainFrame::OnFilterDetails()
7587 {
7588   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_details"));
7589   g_bIgnoreCommands++;
7590   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS) & EXCLUDE_DETAILS)
7591     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7592   else
7593     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7594   g_bIgnoreCommands--;
7595   PerformFiltering();
7596   Sys_UpdateWindows (W_XY|W_CAMERA);
7597 }
7598
7599 void MainFrame::OnFilterEntities()
7600 {
7601   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_entities"));
7602   g_bIgnoreCommands++;
7603   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT)
7604     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7605   else
7606     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7607   g_bIgnoreCommands--;
7608   PerformFiltering();
7609   Sys_UpdateWindows (W_XY|W_CAMERA);
7610 }
7611
7612 void MainFrame::OnFilterHintsskips()
7613 {
7614   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_hintsskips"));
7615   g_bIgnoreCommands++;
7616   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS) & EXCLUDE_HINTSSKIPS)
7617     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7618   else
7619     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7620   g_bIgnoreCommands--;
7621   PerformFiltering();
7622   Sys_UpdateWindows (W_XY|W_CAMERA);
7623 }
7624
7625 void MainFrame::OnFilterLights()
7626 {
7627   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lights"));
7628   g_bIgnoreCommands++;
7629   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS)
7630     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7631   else
7632     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7633   g_bIgnoreCommands--;
7634   PerformFiltering();
7635   Sys_UpdateWindows (W_XY|W_CAMERA);
7636 }
7637
7638 void MainFrame::OnFilterLiquids()
7639 {
7640   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_liquids"));
7641   g_bIgnoreCommands++;
7642   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS) & EXCLUDE_LIQUIDS)
7643     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7644   else
7645     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7646   g_bIgnoreCommands--;
7647   PerformFiltering();
7648   Sys_UpdateWindows (W_XY|W_CAMERA);
7649 }
7650
7651 void MainFrame::OnFilterModels()
7652 {
7653   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_models"));
7654   g_bIgnoreCommands++;
7655   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS) & EXCLUDE_MODELS)
7656     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7657   else
7658     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7659   g_bIgnoreCommands--;
7660   PerformFiltering();
7661   Sys_UpdateWindows (W_XY|W_CAMERA);
7662 }
7663
7664 void MainFrame::OnFilterPatches()
7665 {
7666   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_patches"));
7667   g_bIgnoreCommands++;
7668   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES)
7669     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7670   else
7671     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7672   g_bIgnoreCommands--;
7673   PerformFiltering();
7674   Sys_UpdateWindows (W_XY|W_CAMERA);
7675 }
7676
7677 void MainFrame::OnFilterPaths()
7678 {
7679   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_paths"));
7680   g_bIgnoreCommands++;
7681   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS)
7682     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7683   else
7684     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7685   g_bIgnoreCommands--;
7686   PerformFiltering();
7687   Sys_UpdateWindows (W_XY|W_CAMERA);
7688 }
7689
7690 void MainFrame::OnFilterClusterportals()
7691 {
7692   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_clusterportals"));
7693   g_bIgnoreCommands++;
7694   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS) & EXCLUDE_CLUSTERPORTALS)
7695     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7696   else
7697     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7698   g_bIgnoreCommands--;
7699   PerformFiltering();
7700   Sys_UpdateWindows (W_XY|W_CAMERA);
7701 }
7702
7703 void MainFrame::OnFilterLightgrid()
7704 {
7705   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_lightgrid"));
7706   g_bIgnoreCommands++;
7707   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID) & EXCLUDE_LIGHTGRID)
7708     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7709   else
7710     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7711   g_bIgnoreCommands--;
7712   PerformFiltering();
7713   Sys_UpdateWindows (W_XY|W_CAMERA);
7714 }
7715
7716 void MainFrame::OnFilterTranslucent()
7717 {
7718   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_translucent"));
7719   g_bIgnoreCommands++;
7720   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT) & EXCLUDE_TRANSLUCENT)
7721     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7722   else
7723     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7724   g_bIgnoreCommands--;
7725   PerformFiltering();
7726   Sys_UpdateWindows (W_XY|W_CAMERA);
7727 }
7728
7729 void MainFrame::OnFilterTriggers()
7730 {
7731   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_triggers"));
7732   g_bIgnoreCommands++;
7733   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS)
7734     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7735   else
7736     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7737   g_bIgnoreCommands--;
7738   PerformFiltering();
7739   Sys_UpdateWindows (W_XY|W_CAMERA);
7740 }
7741
7742 void MainFrame::OnFilterWorld()
7743 {
7744   GtkWidget *item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_filter_world"));
7745   g_bIgnoreCommands++;
7746   if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD)
7747     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
7748   else
7749     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), FALSE);
7750   g_bIgnoreCommands--;
7751   PerformFiltering();
7752   Sys_UpdateWindows (W_XY|W_CAMERA);
7753 }
7754
7755
7756
7757
7758
7759
7760
7761
7762 // =============================================================================
7763 // leo: Unused functions, not called anywhere from the code (need to check)
7764
7765 void MainFrame::OnViewConsole()
7766 {
7767   if (FloatingGroupDialog()) // QE4 style
7768   {
7769     if (inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating) // are we in console mode already?
7770     {
7771       if (GTK_WIDGET_VISIBLE (g_qeglobals_gui.d_entity))
7772         widget_delete_hide (g_qeglobals_gui.d_entity);
7773       else
7774         gtk_widget_show (g_qeglobals_gui.d_entity);
7775     } else
7776     {
7777       gtk_widget_show (g_qeglobals_gui.d_entity);
7778       SetInspectorMode(W_CONSOLE);
7779     }
7780   }
7781 }
7782
7783 void MainFrame::OnCurveFreeze()
7784 {
7785   Patch_Freeze();
7786 }
7787
7788 void MainFrame::OnCurveUnFreeze()
7789 {
7790   Patch_UnFreeze(false);
7791 }
7792
7793 void MainFrame::OnCurveUnFreezeAll()
7794 {
7795   Patch_UnFreeze(true);
7796 }
7797
7798 void MainFrame::OnSelectReselect()
7799 {
7800   Select_Reselect();
7801 }
7802
7803 void MainFrame::OnSelectionTextureFit()
7804 {
7805   // TODO: Add your command handler code here
7806 }
7807
7808 void MainFrame::OnPatchEnter()
7809 {
7810
7811 }
7812
7813 void MainFrame::OnDropGroupAddtoWorld()
7814 {
7815   /*
7816   Select_AddToGroup("World");
7817   Sys_UpdateWindows (W_ALL);
7818   */
7819 }