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