]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/mainframe.cpp
Merge pull request #49 from mrwonko/FloatingWindowWorkaround
[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 void MainFrame::CreateQEChildren(){
3625         // load the project file
3626         if ( g_argc > 1 ) {
3627                 Sys_Printf( "loading project file from the command line: %s\n", g_argv[1] );
3628                 if ( !QE_LoadProject( g_argv[1] ) ) {
3629                         Error( "Unable to load project file %s\n", g_argv[1] );
3630                 }
3631         }
3632         else
3633         {
3634                 const char* filename = NULL;
3635                 char buf[PATH_MAX];
3636                 const char *r;
3637                 bool bTriedTemplate = false;
3638
3639                 if ( g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION ) {
3640                         // we need to regenerate from template
3641                         Sys_Printf( "last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION );
3642                         g_PrefsDlg.m_strLastProject = "";
3643                 }
3644
3645                 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3646
3647                 while ( r == NULL || *r == '\0' || access( r, R_OK ) != 0 || !QE_LoadProject( r ) )
3648                 {
3649                         if ( !bTriedTemplate ) {
3650                                 // try default project location
3651                                 bTriedTemplate = true;
3652                                 // for all OSes, we look for the template in the base installation (no homepath here)
3653                                 strcpy( buf, g_pGameDescription->mEnginePath.GetBuffer() );
3654                                 strcat( buf, g_pGameDescription->mBaseGame.GetBuffer() );
3655                                 strcat( buf, "/scripts/" );
3656                                 strcat( buf, PROJECT_TEMPLATE_NAME );
3657                                 r = buf;
3658                         }
3659                         else
3660                         {
3661                                 gtk_MessageBox( NULL, _( "Failed to load project file.\nPlease enter a valid project file." ), _( "Load Project" ) );
3662
3663                                 filename = file_dialog( m_pWidget, TRUE, _( "Choose Project File" ), buf, "project" );
3664                                 if ( filename != NULL ) {
3665                                         r = filename;
3666                                 }
3667                                 else{
3668                                         Error( "Cannot continue without loading a project..." );
3669                                 }
3670                         }
3671                 }
3672         }
3673
3674         QE_Init();
3675 }
3676
3677 void MainFrame::OnTimer(){
3678         GdkModifierType mask;
3679
3680         gdk_window_get_pointer( NULL, NULL, NULL, &mask );
3681
3682         if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) {
3683                 QE_CountBrushesAndUpdateStatusBar();
3684                 QE_CheckAutoSave();
3685         }
3686
3687         // see MainFrame::UpdateStatusText below
3688         if ( m_bNeedStatusUpdate ) {
3689                 for ( int n = 0; n < 6; n++ )
3690                 {
3691                         if ( m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL ) {
3692                                 gtk_label_set_text( GTK_LABEL( m_pStatusLabel[n] ), m_strStatus[n] );
3693                         }
3694                 }
3695                 m_bNeedStatusUpdate = false;
3696         }
3697 }
3698
3699 void MainFrame::UpdateStatusText(){
3700         m_bNeedStatusUpdate = true;
3701 }
3702
3703 void MainFrame::SetStatusText( int nPane, const char* pText ){
3704         if ( pText && nPane <= 5 && nPane >= 0 ) {
3705                 m_strStatus[nPane] = pText;
3706                 UpdateStatusText();
3707         }
3708 }
3709 void MainFrame::SetButtonMenuStates(){
3710         GtkWidget *item;
3711         g_bIgnoreCommands++;
3712
3713         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
3714         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_angles );
3715         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
3716         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_names );
3717         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
3718         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_coordinates );
3719         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
3720         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_outline );
3721         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
3722         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
3723         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
3724         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_axis );
3725         //item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3726         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3727                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) ? FALSE : TRUE );
3728         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3729         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3730                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3731         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3732         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3733                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3734         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
3735         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3736                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD ) != 0 );
3737         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
3738         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3739                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT ) != 0 );
3740         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
3741         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3742                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS ) != 0 );
3743         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
3744         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3745                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT ) != 0 );
3746         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
3747         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3748                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS ) != 0 );
3749         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
3750         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3751                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) != 0 );
3752         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
3753         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3754                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP ) != 0 );
3755         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
3756         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3757                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP ) != 0 );
3758         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
3759         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3760                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL ) != 0 );
3761         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
3762         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3763                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) != 0 );
3764         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3765         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3766                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3767         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3768         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3769                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3770         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
3771         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3772                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS ) != 0 );
3773         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
3774         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3775                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES ) != 0 );
3776         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
3777         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3778                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS ) != 0 );
3779         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
3780         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3781                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS ) != 0 );
3782         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
3783         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3784                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS ) != 0 );
3785         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
3786         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3787                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS ) != 0 );
3788         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
3789         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bTextureLock ) ? TRUE : FALSE );
3790         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
3791         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bRotateLock ) ? TRUE : FALSE );
3792         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
3793         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3794         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
3795         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bGLLighting ) ? TRUE : FALSE );
3796         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
3797         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
3798
3799         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
3800         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3801         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
3802         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
3803
3804         if ( !g_pGameDescription->mNoPatch ) {
3805                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
3806                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
3807
3808                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
3809                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
3810                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
3811                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
3812                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
3813                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
3814         }
3815
3816         int id, n = g_PrefsDlg.m_nTextureScale;
3817         switch ( n )
3818         {
3819         case 10: id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3820         case 25: id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3821         case 50: id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3822         case 200: id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3823         default: id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3824         }
3825         SetTextureScale( id );
3826
3827         // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3828 /*
3829    if (g_qeglobals.d_project_entity)
3830    {
3831     FillTextureMenu();      // redundant but i'll clean it up later.. yeah right..
3832     FillBSPMenu();
3833    }
3834  */
3835         g_bIgnoreCommands--;
3836 }
3837
3838 void MainFrame::UpdateWindows( int nBits ){
3839         if ( !g_bScreenUpdates ) {
3840                 return;
3841         }
3842 #ifdef DBG_WINDOWPOS
3843         static int bean_count = 0;
3844         char bean_buf[100];
3845         sprintf( bean_buf,"UpdateWindows %d",bean_count );
3846         CheckWatchit( bean_buf );
3847         bean_count++;
3848 #endif
3849
3850         if ( nBits & ( W_XY | W_XY_OVERLAY ) ) {
3851                 if ( m_pXYWnd ) {
3852                         m_pXYWnd->RedrawWindow();
3853                 }
3854                 if ( m_pXZWnd ) {
3855                         m_pXZWnd->RedrawWindow();
3856                 }
3857                 if ( m_pYZWnd ) {
3858                         m_pYZWnd->RedrawWindow();
3859                 }
3860         }
3861
3862         if ( nBits & W_CAMERA || ( ( nBits & W_CAMERA_IFON ) && m_bCamPreview ) ) {
3863                 if ( m_pCamWnd ) {
3864                         m_pCamWnd->RedrawWindow();
3865                 }
3866         }
3867
3868         if ( nBits & ( W_Z | W_Z_OVERLAY ) ) {
3869                 if ( m_pZWnd ) {
3870                         m_pZWnd->RedrawWindow();
3871                 }
3872         }
3873
3874         if ( nBits & W_TEXTURE ) {
3875                 if ( m_pTexWnd ) {
3876                         m_pTexWnd->RedrawWindow();
3877                 }
3878         }
3879 #ifdef DBG_WINDOWPOS
3880         sprintf( bean_buf,"%d (end UpdateWidows)",bean_count );
3881         CheckWatchit( bean_buf );
3882 #endif
3883 }
3884
3885 void MainFrame::RoutineProcessing(){
3886 #ifdef DBG_WINDOWPOS
3887         static int bean_count = 0;
3888         char bean_buf[100];
3889         sprintf( bean_buf,"RoutineProcessing %d",bean_count );
3890         CheckWatchit( bean_buf );
3891         bean_count++;
3892 #endif
3893
3894         if ( m_bDoLoop ) {
3895                 double time = 0.0;
3896                 double oldtime = 0.0;
3897                 double delta = 0.0;
3898
3899 /*    // checking KeyState works right
3900     static short a1,a2;
3901     a2 = GetKeyState(VK_MENU);
3902     if (a1!=a2)
3903     {
3904       Sys_Printf("VK_MENU: %d\n",a2);
3905       a1 = a2;
3906     }
3907     static short b1,b2;
3908     b2 = GetKeyState(VK_UP);
3909     if (b1!=b2)
3910     {
3911       Sys_Printf("VK_UP: %d\n",b2);
3912       b1 = b2;
3913     } */
3914
3915                 time = Sys_DoubleTime();
3916                 delta = time - oldtime;
3917                 oldtime = time;
3918                 if ( delta > 0.2 ) {
3919                         delta = 0.2;
3920                 }
3921
3922                 // update the BSP process watcher
3923                 if ( m_pWatchBSP ) {
3924                         m_pWatchBSP->RoutineProcessing();
3925                 }
3926
3927                 // run time dependant behavior
3928                 if ( m_pCamWnd ) {
3929                         m_pCamWnd->Cam_MouseControl( delta );
3930                 }
3931
3932                 if ( g_nUpdateBits ) {
3933                         int nBits = g_nUpdateBits; // this is done to keep this routine from being
3934                         g_nUpdateBits = 0;        // re-entered due to the paint process.. only
3935                         UpdateWindows( nBits );   // happens in rare cases but causes a stack overflow
3936                 }
3937 /*
3938     // Enable/disable the menu items
3939     GtkWidget *item;
3940
3941     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3942     gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3943     if (!g_PrefsDlg.m_bWideToolbar)
3944     {
3945       item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3946       gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3947     }
3948     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3949     gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3950     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3951     gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3952     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3953     gtk_widget_set_sensitive (item, region_active);
3954     g_bIgnoreCommands++;
3955     // update the toolbar before displaying the menu:
3956     // show in use check box
3957     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3958     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3959     // show all check box
3960     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3961     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3962     g_bIgnoreCommands--;
3963  */
3964         }
3965 #ifdef DBG_WINDOWPOS
3966         sprintf( bean_buf,"%d (end RoutineProcessing)",bean_count );
3967         CheckWatchit( bean_buf );
3968 #endif
3969 }
3970
3971 void MainFrame::DoWatchBSP(){
3972         // network monitoring of the BSP process
3973         if ( !m_pWatchBSP ) {
3974                 m_pWatchBSP = new CWatchBSP();
3975         }
3976 }
3977
3978 void MainFrame::CleanPlugInMenu(){
3979         GtkWidget *menu, *sep;
3980         GList *lst;
3981
3982         // delete everything after the separator
3983         menu = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) );
3984         sep = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin_separator" ) );
3985         m_nNextPlugInID = ID_PLUGIN_START;
3986
3987         lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3988         while ( lst->next )
3989         {
3990                 gtk_container_remove( GTK_CONTAINER( menu ), GTK_WIDGET( lst->next->data ) );
3991                 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3992         }
3993 }
3994
3995 void MainFrame::AddPlugInMenuItem( IPlugIn* pPlugIn ){
3996         GtkWidget *menu, *item, *parent;
3997         const char *menuText;
3998
3999         parent = gtk_menu_item_new_with_label( pPlugIn->getMenuName() );
4000         gtk_widget_show( parent );
4001         gtk_container_add( GTK_CONTAINER( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) ), parent );
4002
4003         int nCount = pPlugIn->getCommandCount();
4004         if ( nCount > 0 ) {
4005                 menu = gtk_menu_new();
4006                 while ( nCount > 0 )
4007                 {
4008                         menuText = pPlugIn->getCommand( --nCount );
4009                         if ( menuText != NULL && strlen( menuText ) > 0 ) {
4010                                 if ( !strcmp( menuText, "-" ) ) {
4011                                         item = gtk_menu_item_new();
4012                                         gtk_widget_set_sensitive( item, FALSE );
4013                                 }
4014                                 else
4015                                 {
4016                                         item = gtk_menu_item_new_with_label( menuText );
4017                                         gtk_signal_connect( GTK_OBJECT( item ), "activate",
4018                                                                                 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( m_nNextPlugInID ) );
4019                                 }
4020                                 gtk_widget_show( item );
4021                                 gtk_container_add( GTK_CONTAINER( menu ), item );
4022                                 pPlugIn->addMenuID( m_nNextPlugInID++ );
4023                         }
4024                 }
4025                 gtk_menu_item_set_submenu( GTK_MENU_ITEM( parent ), menu );
4026         }
4027 }
4028
4029 void MainFrame::OnPlugIn( unsigned int nID, char* str ){
4030         m_PlugInMgr.Dispatch( nID, str );
4031 }
4032
4033 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype( IToolbarButton::EType type ){
4034         switch ( type )
4035         {
4036         case IToolbarButton::eSpace:
4037                 return GTK_TOOLBAR_CHILD_SPACE;
4038         case IToolbarButton::eButton:
4039                 return GTK_TOOLBAR_CHILD_BUTTON;
4040         case IToolbarButton::eToggleButton:
4041                 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4042         case IToolbarButton::eRadioButton:
4043                 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4044         }
4045         Error( "invalid toolbar button type" );
4046         return (GtkToolbarChildType)0;
4047 }
4048
4049 void toolbar_insert( GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data ){
4050         GtkWidget *w, *pixmap;
4051         GdkPixmap *gdkpixmap;
4052         GdkBitmap *mask;
4053
4054         load_plugin_bitmap( image, (void **)&gdkpixmap, (void **)&mask );
4055         pixmap = gtk_pixmap_new( gdkpixmap, mask );
4056         gdk_pixmap_unref( gdkpixmap );
4057         gdk_pixmap_unref( mask );
4058         w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), gtktoolbarchildtype_for_toolbarbuttontype( type ), NULL, text, tooltip, "", GTK_WIDGET( pixmap ), handler, data );
4059 }
4060
4061 void SignalToolbarButton( GtkWidget *widget, gpointer data ){
4062         const_cast<const IToolbarButton*>( reinterpret_cast<IToolbarButton*>( data ) )->activate();
4063 }
4064
4065 void MainFrame::AddPlugInToolbarButton( const IToolbarButton* button ){
4066         GtkWidget*const toolbar = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "toolbar_plugin" ) );
4067         toolbar_insert( toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC( SignalToolbarButton ), reinterpret_cast<gpointer>( const_cast<IToolbarButton*>( button ) ) );
4068 }
4069
4070 void MainFrame::OnSelectionSelectNudgedown(){
4071         NudgeSelection( 3, g_qeglobals.d_gridsize );
4072 }
4073
4074 void MainFrame::OnSelectionSelectNudgeleft(){
4075         NudgeSelection( 0, g_qeglobals.d_gridsize );
4076 }
4077
4078 void MainFrame::OnSelectionSelectNudgeright(){
4079         NudgeSelection( 2, g_qeglobals.d_gridsize );
4080 }
4081
4082 void MainFrame::OnSelectionSelectNudgeup(){
4083         NudgeSelection( 1, g_qeglobals.d_gridsize );
4084 }
4085
4086 void MainFrame::NudgeSelection( int nDirection, float fAmount ){
4087         if ( ActiveXY()->RotateMode() ) {
4088                 int nAxis = 0;
4089                 if ( ActiveXY()->GetViewType() == XY ) {
4090                         nAxis = 2;
4091                 }
4092                 else
4093                 if ( g_pParentWnd->ActiveXY()->GetViewType() == XZ ) {
4094                         nAxis = 1;
4095                         fAmount = -fAmount;
4096                 }
4097
4098                 if ( nDirection == 2 || nDirection == 3 ) {
4099                         fAmount = -fAmount;
4100                 }
4101
4102                 float fDeg = -fAmount;
4103                 float fAdj = fAmount;
4104
4105                 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4106                 CString strStatus;
4107                 strStatus.Format( "Rotation x:: %.1f  y:: %.1f  z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4108                                                   g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2] );
4109                 g_pParentWnd->SetStatusText( 2, strStatus );
4110                 Select_RotateAxis( nAxis, fDeg, false, true );
4111                 Sys_UpdateWindows( W_ALL );
4112         }
4113         else
4114         if ( ActiveXY()->ScaleMode() ) {
4115                 if ( nDirection == 0 || nDirection == 3 ) {
4116                         fAmount = -fAmount;
4117                 }
4118                 vec3_t v;
4119                 v[0] = v[1] = v[2] = 1.0;
4120                 if ( fAmount > 0 ) {
4121                         v[0] = 1.1f;
4122                         v[1] = 1.1f;
4123                         v[2] = 1.1f;
4124                 }
4125                 else
4126                 {
4127                         v[0] = 0.9f;
4128                         v[1] = 0.9f;
4129                         v[2] = 0.9f;
4130                 }
4131
4132                 Select_Scale( ( g_nScaleHow & SCALE_X ) ? v[0] : 1.0,
4133                                           ( g_nScaleHow & SCALE_Y ) ? v[1] : 1.0,
4134                                           ( g_nScaleHow & SCALE_Z ) ? v[2] : 1.0 );
4135                 Sys_UpdateWindows( W_ALL );
4136         }
4137         else
4138         {
4139                 // 0 - left, 1 - up, 2 - right, 3 - down
4140                 int nDim;
4141                 if ( nDirection == 0 ) {
4142                         nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4143                         fAmount = -fAmount;
4144                 }
4145                 else if ( nDirection == 1 ) {
4146                         nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4147                 }
4148                 else if ( nDirection == 2 ) {
4149                         nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4150                 }
4151                 else
4152                 {
4153                         nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4154                         fAmount = -fAmount;
4155                 }
4156                 Nudge( nDim, fAmount );
4157         }
4158 }
4159
4160 void MainFrame::Nudge( int nDim, float fNudge ){
4161         vec3_t vMove;
4162         vMove[0] = vMove[1] = vMove[2] = 0;
4163         vMove[nDim] = fNudge;
4164
4165         if ( ( g_qeglobals.d_select_mode == sel_vertex ||
4166                    g_qeglobals.d_select_mode == sel_curvepoint )
4167                  && g_qeglobals.d_num_move_points ) {
4168                 Select_NudgePoint( vMove, true );
4169         }
4170         else{
4171                 Select_Move( vMove, true );
4172         }
4173         Sys_UpdateWindows( W_ALL );
4174 }
4175
4176 void MainFrame::SetGridStatus(){
4177         CString strStatus;
4178         char c1;
4179         char c2;
4180         c1 = ( g_PrefsDlg.m_bTextureLock ) ? 'M' : ' ';
4181         c2 = ( g_PrefsDlg.m_bRotateLock ) ? 'R' : ' ';
4182         strStatus.Format( "G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4183                                           g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2 );
4184         SetStatusText( 4, strStatus );
4185 }
4186
4187 void MainFrame::UpdatePatchToolbarButtons(){
4188         GtkWidget *item;
4189         g_bIgnoreCommands++;
4190         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
4191         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
4192 //  item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4193 //  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4194         g_bIgnoreCommands--;
4195 }
4196
4197 // =============================================================================
4198 // Command handlers
4199
4200 void MainFrame::OnFileNew(){
4201         if ( ConfirmModified() ) {
4202                 Map_New();
4203         }
4204 }
4205
4206 void MainFrame::OnFileOpen(){
4207         if ( !ConfirmModified() ) {
4208                 return;
4209         }
4210
4211         const char *str;
4212         char buf[NAME_MAX];
4213
4214         if ( !g_pGameDescription->noMapsInHome ) {
4215                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4216                 strcat( buf, "maps/" );
4217         }
4218         else {
4219                 buf[0] = '\0';
4220         }
4221
4222         str = file_dialog( m_pWidget, TRUE, _( "Open Map" ), buf, MAP_MAJOR, "maps/" );
4223
4224         if ( str != NULL ) {
4225                 strcpy( currentmap,str );
4226                 MRU_AddFile( str );
4227                 Map_LoadFile( str );
4228         }
4229 }
4230
4231 void MainFrame::OnFileImportmap(){
4232         const char *str;
4233         char buf[NAME_MAX];
4234
4235         if ( !g_pGameDescription->noMapsInHome ) {
4236                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4237                 strcat( buf, "maps/" );
4238         }
4239         else {
4240                 buf[0] = '\0';
4241         }
4242
4243         str = file_dialog( m_pWidget, TRUE, _( "Import Map" ), buf, MAP_MAJOR, "maps/" );
4244
4245         if ( str != NULL ) {
4246                 Map_ImportFile( str );
4247         }
4248 }
4249
4250 void MainFrame::OnFileSave(){
4251         if ( !strcmp( currentmap, "unnamed.map" ) ) {
4252                 OnFileSaveas();
4253         }
4254         else{
4255                 Map_SaveFile( currentmap, false );
4256         }
4257 }
4258
4259 void MainFrame::OnFileSaveas(){
4260         const char* str;
4261         char buf[NAME_MAX];
4262
4263         if ( !g_pGameDescription->noMapsInHome ) {
4264                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4265                 strcat( buf, "maps/" );
4266         }
4267         else {
4268                 buf[0] = '\0';
4269         }
4270
4271         str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Save Map" ), buf, MAP_MAJOR, "maps/" );
4272
4273         if ( str != NULL ) {
4274                 strcpy( currentmap, str );
4275                 MRU_AddFile( str );
4276                 Map_SaveFile( str, false ); // ignore region
4277         }
4278 }
4279
4280 void MainFrame::OnFileExportmap(){
4281         const char* str;
4282         char buf[NAME_MAX];
4283
4284         if ( !g_pGameDescription->noMapsInHome ) {
4285                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4286                 strcat( buf, "maps/" );
4287         }
4288         else {
4289                 buf[0] = '\0';
4290         }
4291
4292         str = file_dialog( m_pWidget, FALSE, _( "Export Selection" ), buf, MAP_MAJOR, "maps/" );
4293
4294         if ( str != NULL ) {
4295                 Map_SaveSelected( str );
4296         }
4297 }
4298
4299 void MainFrame::OnFileSaveregion(){
4300         const char* str;
4301         char buf[NAME_MAX];
4302
4303         if ( !g_pGameDescription->noMapsInHome ) {
4304                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4305                 strcat( buf, "maps/" );
4306         }
4307         else {
4308                 buf[0] = '\0';
4309         }
4310
4311         str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Export Region" ), buf, MAP_MAJOR, "maps/" );
4312
4313         if ( str != NULL ) {
4314                 Map_SaveFile( str, true ); // ignore region
4315         }
4316 }
4317
4318 void MainFrame::OnFileNewproject(){
4319         char* name = DoNewProjectDlg();
4320
4321         // create a new project:
4322         // create directories and grab current project, save it in new project tree in scripts/user.qe4
4323         // on linux we create under ~/.q3a, on win32 under strEnginePath
4324         // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4325         if ( ( name != NULL ) && ( strlen( name ) > 0 ) ) {
4326                 CString strNewBasePath;
4327
4328                 // NOTE TTimo this would probably not work right on *nix
4329                 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4330                 strNewBasePath += name;
4331                 strNewBasePath += "/";
4332
4333                 CString strProjToLoad;
4334                 CString strMapToLoad;
4335
4336                 // if the dir exists, ask the user if they want to continue anyway
4337                 if ( Q_mkdir( strNewBasePath.GetBuffer(), 0755 ) != 0 ) {
4338                         CString strMsg;
4339                         strMsg.Format( "The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer() );
4340                         Sys_Printf( strMsg );
4341                         if ( gtk_MessageBox( m_pWidget, _( strMsg ), _( "Error" ), MB_YESNO ) != IDYES ) {
4342                                 Sys_Printf( "New Project cancelled, directory already exists for project\n" );
4343                                 free( name );
4344                                 return;
4345                         }
4346                 }
4347
4348                 CString strDir;
4349                 strDir = strNewBasePath;
4350                 strDir += "maps/";
4351                 Q_mkdir( strDir.GetBuffer(), 0755 );
4352
4353                 strDir = strNewBasePath;
4354                 strDir += "textures/";
4355                 Q_mkdir( strDir.GetBuffer(), 0755 );
4356
4357                 strDir = strNewBasePath;
4358                 strDir += "scripts/";
4359                 Q_mkdir( strDir.GetBuffer(), 0755 );
4360
4361                 // print a warning for total conversions, since setting the basepath when required files are
4362                 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4363                 Sys_FPrintf( SYS_WRN, "*** Note: basepath unchanged\n" );
4364
4365                 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name );
4366
4367                 strDir = strNewBasePath;
4368                 strDir += "maps/autosave.map";
4369                 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4370
4371                 // state that this is a user project file, no templating
4372                 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4373                 // create the project file
4374                 strProjToLoad = strNewBasePath;
4375                 strProjToLoad += "scripts/";
4376                 strProjToLoad += name;
4377                 strProjToLoad += ".";
4378                 strProjToLoad += PROJECT_FILETYPE;
4379                 QE_SaveProject( strProjToLoad.GetBuffer() );
4380                 free( name );
4381         }
4382 }
4383
4384 void MainFrame::OnFileLoadproject(){
4385         if ( ConfirmModified() ) {
4386                 ProjectDialog();
4387         }
4388 }
4389
4390 void MainFrame::OnFileProjectsettings(){
4391         DoProjectSettings();
4392 }
4393
4394 void MainFrame::OnFilePointfile(){
4395         if ( g_qeglobals.d_pointfile_display_list ) {
4396                 Pointfile_Clear();
4397         }
4398         else{
4399                 Pointfile_Check();
4400         }
4401 }
4402
4403 void MainFrame::OnMru( unsigned int nID ){
4404         if ( ConfirmModified() ) {
4405                 MRU_Activate( nID - ID_FILE_RECENT1 );
4406         }
4407 }
4408
4409 void MainFrame::OnFileExit(){
4410         if ( ConfirmModified() ) {
4411                 // stop printing during shutdown
4412                 // NOTE: we should cleanly release GL contexts and stuff when exiting
4413
4414                 OnDelete();
4415
4416                 g_qeglobals_gui.d_edit = NULL;
4417                 gtk_widget_destroy( m_pWidget );
4418         }
4419 }
4420
4421 void MainFrame::OnFileCheckUpdate(){
4422         // build the URL
4423         Str URL;
4424         URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4425 #ifdef _WIN32
4426         URL += "&OS_dlup=1";
4427 #else
4428         URL += "&OS_dlup=2";
4429 #endif
4430         URL += "&Version_dlup=" RADIANT_VERSION;
4431         g_PrefsDlg.mGamesDialog.AddPacksURL( URL );
4432         OpenURL( URL.GetBuffer() );
4433 }
4434
4435 void MainFrame::OnEditUndo(){
4436         Undo_Undo();
4437 }
4438
4439 void MainFrame::OnEditRedo(){
4440         Undo_Redo();
4441 }
4442
4443 void MainFrame::OnEditCopybrush(){
4444         Copy();
4445 }
4446
4447 void MainFrame::OnEditPastebrush(){
4448         Select_Deselect();
4449
4450         Undo_Start( "paste" );
4451
4452         Paste();
4453
4454         Undo_EndBrushList( &selected_brushes );
4455         Undo_End();
4456 }
4457
4458 void MainFrame::OnEditPastebrushToCamera(){
4459         Select_Deselect();
4460         if ( ActiveXY() ) {
4461                 vec3_t mid, camorigin, delta;
4462
4463                 ActiveXY()->Paste();
4464
4465                 // Work out the delta
4466                 Select_GetMid( mid );
4467
4468                 // Snap camera origin to grid
4469                 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4470                 camorigin[0] = floor( camorigin[0] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4471                 camorigin[1] = floor( camorigin[1] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4472                 camorigin[2] = floor( camorigin[2] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4473
4474                 VectorSubtract( camorigin, mid, delta );
4475
4476                 // Move to camera
4477                 Select_Move( delta, false );
4478
4479                 Undo_Start( "paste to camera" );
4480                 Undo_EndBrushList( &selected_brushes );
4481                 Undo_End();
4482         }
4483 }
4484
4485 void MainFrame::OnSelectionDelete(){
4486         brush_t *brush;
4487         //if (ActiveXY())
4488         //      ActiveXY()->UndoCopy();
4489         Undo_Start( "delete" );
4490         Undo_AddBrushList( &selected_brushes );
4491         //add all deleted entities to the undo
4492         for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
4493         {
4494                 Undo_AddEntity( brush->owner );
4495         }
4496         // NOTE: Select_Delete does NOT delete entities
4497         Select_Delete();
4498         Undo_EndBrushList( &selected_brushes );
4499         Undo_End();
4500 }
4501
4502 void MainFrame::OnEditMapinfo(){
4503         DoMapInfo();
4504 }
4505
4506 void MainFrame::OnEditEntityinfo(){
4507         DoEntityList();
4508 }
4509
4510 void MainFrame::OnBrushScripts(){
4511         DoScriptsDlg();
4512 }
4513
4514 void MainFrame::OnEditLoadprefab(){
4515         const char *filename;
4516         CString CurPath;
4517
4518         if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4519                 CurPath = g_PrefsDlg.m_strPrefabPath;
4520                 AddSlash( CurPath );
4521         }
4522
4523         filename = file_dialog( m_pWidget, TRUE, _( "Import Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4524
4525         if ( filename != NULL ) {
4526                 Map_ImportFile( filename );
4527         }
4528 }
4529
4530 void MainFrame::OnEditSaveprefab(){
4531         const char *filename;
4532         CString CurPath;
4533
4534         if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4535                 CurPath = g_PrefsDlg.m_strPrefabPath;
4536         }
4537         else
4538         {
4539                 char tmp[PATH_MAX];
4540                 getcwd( tmp, PATH_MAX );
4541                 CurPath = tmp;
4542         }
4543         AddSlash( CurPath );
4544
4545         filename = file_dialog( m_pWidget, FALSE, _( "Export Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4546         if ( filename != NULL ) {
4547                 Map_SaveSelected( filename );
4548         }
4549 }
4550
4551 void MainFrame::OnPrefs(){
4552         int nView = g_PrefsDlg.m_nView;
4553         bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4554         bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4555         int nShader = g_PrefsDlg.m_nShader;
4556         int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4557 //  int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4558         g_PrefsDlg.LoadPrefs();
4559
4560         if ( g_PrefsDlg.DoModal() == IDOK ) {
4561                 if ( ( g_PrefsDlg.m_nLatchedView != nView ) ||
4562                          ( g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus ) ||
4563                          ( g_PrefsDlg.m_bLatchedWideToolbar != bToolbar ) ||
4564                          ( g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar ) ||
4565                          ( g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar ) ||
4566                          ( g_PrefsDlg.m_nLatchedShader != nShader ) ||
4567                          ( g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality )
4568                          || ( g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ )
4569                          ) {
4570                         gtk_MessageBox( m_pWidget, _( "You must restart Radiant for the changes to take effect." ) );
4571                 }
4572
4573                 // if the view mode was switched to floating, set the Z window on by default
4574                 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4575                 // (and we simply hope there will be a SavePrefs before we die)
4576                 if ( ( g_PrefsDlg.m_nView != nView ) && ( (EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating ) ) {
4577                         g_PrefsDlg.m_bZVis = true;
4578                 }
4579
4580                 if ( m_pTexWnd ) {
4581                         m_pTexWnd->UpdatePrefs();
4582                 }
4583
4584                 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
4585                 g_bIgnoreCommands++;
4586                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4587                                                                                 ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
4588                 g_bIgnoreCommands--;
4589         }
4590 }
4591
4592 void MainFrame::OnTogglecamera(){
4593         if ( CurrentStyle() == eFloating ) { // floating views
4594                 if ( m_pCamWnd && m_pCamWnd->m_pParent ) {
4595                         if ( GTK_WIDGET_VISIBLE( m_pCamWnd->m_pParent ) ) {
4596                                 widget_delete_hide( m_pCamWnd->m_pParent );
4597                         }
4598                         else{
4599                                 gtk_widget_show( m_pCamWnd->m_pParent );
4600                         }
4601                 }
4602         }
4603         else
4604         {
4605                 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->GetWidget() ) ) {
4606                         gtk_widget_hide( m_pCamWnd->GetWidget() );
4607                 }
4608                 else{
4609                         gtk_widget_show( m_pCamWnd->GetWidget() );
4610                 }
4611         }
4612 }
4613
4614 void MainFrame::OnToggleconsole(){
4615         if ( FloatingGroupDialog() ) { // QE4 style
4616                 if ( inspector_mode == W_CONSOLE ) {
4617                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4618                                 widget_delete_hide( g_qeglobals_gui.d_entity );
4619                         }
4620                         else{
4621                                 gtk_widget_show( g_qeglobals_gui.d_entity );
4622                         }
4623                 }
4624                 else
4625                 {
4626                         gtk_widget_show( g_qeglobals_gui.d_entity );
4627                         SetInspectorMode( W_CONSOLE );
4628                 }
4629         }
4630 }
4631
4632 // trigger the entity inspector on/off
4633 void MainFrame::OnViewEntity(){
4634         // make sure we're working with the current selection (bugzilla #436)
4635         if ( !GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4636                 Select_Reselect();
4637         }
4638
4639         if ( !FloatingGroupDialog() ) {
4640                 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_ENTITY ) {
4641                         widget_delete_hide( g_qeglobals_gui.d_entity );
4642                 }
4643                 else
4644                 {
4645                         gtk_widget_show( g_qeglobals_gui.d_entity );
4646                         SetInspectorMode( W_ENTITY );
4647                 }
4648         }
4649         else
4650         {
4651                 if ( inspector_mode == W_ENTITY ) {
4652                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4653                                 widget_delete_hide( g_qeglobals_gui.d_entity );
4654                         }
4655                         else{
4656                                 gtk_widget_show( g_qeglobals_gui.d_entity );
4657                         }
4658                 }
4659                 else
4660                 {
4661                         gtk_widget_show( g_qeglobals_gui.d_entity );
4662                         SetInspectorMode( W_ENTITY );
4663                 }
4664         }
4665 }
4666
4667 void MainFrame::OnViewGroups(){
4668         if ( !FloatingGroupDialog() ) {
4669                 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_GROUP ) {
4670                         widget_delete_hide( g_qeglobals_gui.d_entity );
4671                 }
4672                 else
4673                 {
4674                         gtk_widget_show( g_qeglobals_gui.d_entity );
4675                         SetInspectorMode( W_GROUP );
4676                 }
4677         }
4678         else
4679         {
4680                 if ( inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating ) {
4681                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4682                                 widget_delete_hide( g_qeglobals_gui.d_entity );
4683                         }
4684                         else{
4685                                 gtk_widget_show( g_qeglobals_gui.d_entity );
4686                         }
4687                 }
4688                 else
4689                 {
4690                         gtk_widget_show( g_qeglobals_gui.d_entity );
4691                         SetInspectorMode( W_GROUP );
4692                 }
4693         }
4694 }
4695
4696 void MainFrame::OnToggleview(){
4697         if ( CurrentStyle() == eFloating ) { // QE4 style
4698                 if ( m_pXYWnd && m_pXYWnd->m_pParent ) {
4699                         if ( GTK_WIDGET_VISIBLE( m_pXYWnd->m_pParent ) ) {
4700                                 widget_delete_hide( m_pXYWnd->m_pParent );
4701                         }
4702                         else{
4703                                 gtk_widget_show( m_pXYWnd->m_pParent );
4704                         }
4705                 }
4706         }
4707 }
4708
4709 void MainFrame::OnToggleviewXz(){
4710         if ( CurrentStyle() == eFloating ) { // QE4 style
4711                 if ( m_pXZWnd && m_pXZWnd->m_pParent ) {
4712                         // get windowplacement doesn't actually save this so we will here
4713                         g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE( m_pXZWnd->m_pParent );
4714                         if ( g_PrefsDlg.m_bXZVis ) {
4715                                 widget_delete_hide( m_pXZWnd->m_pParent );
4716                         }
4717                         else{
4718                                 gtk_widget_show( m_pXZWnd->m_pParent );
4719                         }
4720                         g_PrefsDlg.m_bXZVis ^= 1;
4721                         g_PrefsDlg.SavePrefs();
4722                 }
4723         }
4724 }
4725
4726 void MainFrame::OnToggleviewYz(){
4727         if ( CurrentStyle() == eFloating ) { // QE4 style
4728                 if ( m_pYZWnd && m_pYZWnd->m_pParent ) {
4729                         g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE( m_pYZWnd->m_pParent );
4730                         if ( g_PrefsDlg.m_bYZVis ) {
4731                                 widget_delete_hide( m_pYZWnd->m_pParent );
4732                         }
4733                         else{
4734                                 gtk_widget_show( m_pYZWnd->m_pParent );
4735                         }
4736                         g_PrefsDlg.m_bYZVis ^= 1;
4737                         g_PrefsDlg.SavePrefs();
4738                 }
4739         }
4740 }
4741
4742 void MainFrame::OnTogglez(){
4743         if ( g_pParentWnd->FloatingGroupDialog() ) { // QE4 style
4744                 if ( m_pZWnd && m_pZWnd->m_pParent ) {
4745                         if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
4746                                 widget_delete_hide( m_pZWnd->m_pParent );
4747                         }
4748                         else{
4749                                 gtk_widget_show( m_pZWnd->m_pParent );
4750                         }
4751                         g_PrefsDlg.m_bZVis ^= 1;
4752                         g_PrefsDlg.SavePrefs();
4753                 }
4754         }
4755         else {
4756                 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4757         }
4758 }
4759
4760 void MainFrame::OnViewCenter(){
4761         m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4762         m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor( ( m_pCamWnd->Camera()->angles[YAW] + 11 ) / 22.5 );
4763         Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
4764 }
4765
4766 void MainFrame::OnViewUpfloor(){
4767         m_pCamWnd->Cam_ChangeFloor( true );
4768 }
4769
4770 void MainFrame::OnViewDownfloor(){
4771         m_pCamWnd->Cam_ChangeFloor( false );
4772 }
4773
4774 void MainFrame::OnViewCenterview(){
4775         if ( CurrentStyle() == eSplit ) {
4776                 GetXYWnd()->PositionView();
4777                 GetXZWnd()->PositionView();
4778                 GetYZWnd()->PositionView();
4779                 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4780         }
4781         else {
4782                 m_pXYWnd->PositionView();
4783                 Sys_UpdateWindows( W_XY );
4784         }
4785 }
4786
4787 void MainFrame::OnViewNextview(){
4788         if ( CurrentStyle() == eSplit ) {
4789                 GetXYWnd()->PositionView();
4790                 GetXZWnd()->PositionView();
4791                 GetYZWnd()->PositionView();
4792                 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4793         }
4794         else {
4795                 if ( m_pXYWnd->GetViewType() == XY ) {
4796                         m_pXYWnd->SetViewType( XZ );
4797                 }
4798                 else
4799                 if ( m_pXYWnd->GetViewType() ==  XZ ) {
4800                         m_pXYWnd->SetViewType( YZ );
4801                 }
4802                 else{
4803                         m_pXYWnd->SetViewType( XY );
4804                 }
4805                 m_pXYWnd->PositionView();
4806                 Sys_UpdateWindows( W_XY );
4807         }
4808 }
4809
4810 void MainFrame::OnViewXy(){
4811         if ( !FloatingGroupDialog() ) {
4812                 m_pXYWnd->SetViewType( XY );
4813                 m_pXYWnd->PositionView();
4814         }
4815         Sys_UpdateWindows( W_XY );
4816 }
4817
4818 void MainFrame::OnViewSide(){
4819         if ( !FloatingGroupDialog() ) {
4820                 m_pXYWnd->SetViewType( XZ );
4821                 m_pXYWnd->PositionView();
4822         }
4823         Sys_UpdateWindows( W_XY );
4824 }
4825
4826 void MainFrame::OnViewFront(){
4827         if ( !FloatingGroupDialog() ) {
4828                 m_pXYWnd->SetViewType( YZ );
4829                 m_pXYWnd->PositionView();
4830         }
4831         Sys_UpdateWindows( W_XY );
4832 }
4833
4834 void MainFrame::OnView100(){
4835         if ( m_pXYWnd ) {
4836                 m_pXYWnd->SetScale( 1 );
4837         }
4838         if ( m_pXZWnd ) {
4839                 m_pXZWnd->SetScale( 1 );
4840         }
4841         if ( m_pYZWnd ) {
4842                 m_pYZWnd->SetScale( 1 );
4843         }
4844         Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4845 }
4846
4847 void MainFrame::OnViewZoomin(){
4848         if ( m_pXYWnd && m_pXYWnd->Active() ) {
4849                 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 5.0 / 4 );
4850                 if ( m_pXYWnd->Scale() > 30 ) {
4851                         m_pXYWnd->SetScale( 30 );
4852                 }
4853         }
4854
4855         if ( m_pXZWnd && m_pXZWnd->Active() ) {
4856                 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 5.0 / 4 );
4857                 if ( m_pXZWnd->Scale() > 30 ) {
4858                         m_pXZWnd->SetScale( 30 );
4859                 }
4860         }
4861
4862         if ( m_pYZWnd && m_pYZWnd->Active() ) {
4863                 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 5.0 / 4 );
4864                 if ( m_pYZWnd->Scale() > 30 ) {
4865                         m_pYZWnd->SetScale( 30 );
4866                 }
4867         }
4868
4869         Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4870 }
4871
4872 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4873 //  we don't go below a zoom factor corresponding to 10% of the max world size
4874 //  (this has to be computed against the window size)
4875 void MainFrame::OnViewZoomout(){
4876         float min_scale;
4877         if ( m_pXYWnd && m_pXYWnd->Active() ) {
4878                 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 4.0 / 5 );
4879                 min_scale = MIN( m_pXYWnd->Width(),m_pXYWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4880                 if ( m_pXYWnd->Scale() < min_scale ) {
4881                         m_pXYWnd->SetScale( min_scale );
4882                 }
4883         }
4884
4885         if ( m_pXZWnd && m_pXZWnd->Active() ) {
4886                 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 4.0 / 5 );
4887                 min_scale = MIN( m_pXZWnd->Width(),m_pXZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4888                 if ( m_pXZWnd->Scale() < min_scale ) {
4889                         m_pXZWnd->SetScale( min_scale );
4890                 }
4891         }
4892
4893         if ( m_pYZWnd && m_pYZWnd->Active() ) {
4894                 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 4.0 / 5 );
4895                 min_scale = MIN( m_pYZWnd->Width(),m_pYZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4896                 if ( m_pYZWnd->Scale() < min_scale ) {
4897                         m_pYZWnd->SetScale( min_scale );
4898                 }
4899         }
4900         Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4901 }
4902
4903 void MainFrame::OnViewZ100(){
4904         z.scale = 1;
4905         Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4906 }
4907
4908 void MainFrame::OnViewZzoomin(){
4909         z.scale *= 5.0 / 4;
4910         if ( z.scale > 4 ) {
4911                 z.scale = 4;
4912         }
4913         Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4914 }
4915
4916 void MainFrame::OnViewZzoomout(){
4917         z.scale *= 4.0f / 5;
4918         if ( z.scale < 0.125 ) {
4919                 z.scale = 0.125;
4920         }
4921         Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4922 }
4923
4924 void MainFrame::OnViewCubein(){
4925         g_PrefsDlg.m_nCubicScale--;
4926         if ( g_PrefsDlg.m_nCubicScale < 1 ) {
4927                 g_PrefsDlg.m_nCubicScale = 1;
4928         }
4929         g_PrefsDlg.SavePrefs();
4930         Sys_UpdateWindows( W_CAMERA );
4931         SetGridStatus();
4932 }
4933
4934 void MainFrame::OnViewCubeout(){
4935         g_PrefsDlg.m_nCubicScale++;
4936         if ( g_PrefsDlg.m_nCubicScale > 22 ) {
4937                 g_PrefsDlg.m_nCubicScale = 22;
4938         }
4939         g_PrefsDlg.SavePrefs();
4940         Sys_UpdateWindows( W_CAMERA );
4941         SetGridStatus();
4942 }
4943
4944 void MainFrame::OnViewShownames(){
4945         g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
4946         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
4947         g_bIgnoreCommands++;
4948         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4949                                                                         g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE );
4950         g_bIgnoreCommands--;
4951         Sys_UpdateWindows( W_XY );
4952 }
4953
4954 void MainFrame::OnViewShowAngles(){
4955         g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
4956         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
4957         g_bIgnoreCommands++;
4958         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4959                                                                         g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE );
4960         g_bIgnoreCommands--;
4961         Sys_UpdateWindows( W_XY );
4962 }
4963
4964 void MainFrame::OnViewShowblocks(){
4965         g_qeglobals.show_blocks ^= 1;
4966         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showblocks" ) );
4967         g_bIgnoreCommands++;
4968         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.show_blocks ? TRUE : FALSE );
4969         g_bIgnoreCommands--;
4970         Sys_UpdateWindows( W_XY );
4971 }
4972
4973 void MainFrame::OnViewShowcoordinates(){
4974         g_qeglobals.d_savedinfo.show_coordinates ^= 1;
4975         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
4976         g_bIgnoreCommands++;
4977         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4978                                                                         g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE );
4979         g_bIgnoreCommands--;
4980         Sys_UpdateWindows( W_XY | W_Z );
4981 }
4982
4983 void MainFrame::OnViewShowOutline(){
4984         g_qeglobals.d_savedinfo.show_outline ^= 1;
4985         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
4986         g_bIgnoreCommands++;
4987         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4988                                                                         g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE );
4989         g_bIgnoreCommands--;
4990         Sys_UpdateWindows( W_XY );
4991 }
4992
4993 void MainFrame::OnViewShowAxes(){
4994         g_qeglobals.d_savedinfo.show_axis ^= 1;
4995         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
4996         g_bIgnoreCommands++;
4997         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4998                                                                         g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE );
4999         g_bIgnoreCommands--;
5000         Sys_UpdateWindows( W_XY );
5001 }
5002
5003 void MainFrame::OnViewShowWorkzone(){
5004         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showworkzone" ) );
5005         g_bIgnoreCommands++;
5006         if ( g_qeglobals.d_show_work ) {
5007                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
5008                 g_qeglobals.d_show_work = false;
5009         }
5010         else
5011         {
5012                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5013                 g_qeglobals.d_show_work = true;
5014         }
5015         g_bIgnoreCommands--;
5016         Sys_UpdateWindows( W_XY );
5017 }
5018
5019 void MainFrame::OnViewHideshowHideselected(){
5020         Select_Hide();
5021         Select_Deselect();
5022 }
5023
5024 void MainFrame::OnViewHideshowShowhidden(){
5025         Select_ShowAllHidden();
5026 }
5027
5028 /**
5029    sets the view mode for the entities
5030    called upon LoadPrefs too
5031    NOTE TTimo previous implementation had a SavePrefs call
5032    .. I don't think it is relevant, removed (the prefs are saved upon exit)
5033    NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5034    (otherwise we are always called following user action on the widget)
5035  */
5036 void MainFrame::OnEntitiesSetViewAs( int mode ){
5037         gpointer item = NULL;
5038         if ( mode == 0 ) {
5039                 switch ( g_PrefsDlg.m_nEntityShowState )
5040                 {
5041                 case ENTITY_BOX:
5042                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5043                         break;
5044                 case ENTITY_WIRE:
5045                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5046                         break;
5047                 case ENTITY_SELECTED:
5048                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5049                         break;
5050                 case ENTITY_SELECTED_SKIN:
5051                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5052                         break;
5053                 case ENTITY_SKINNED:
5054                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5055                         break;
5056                 case ENTITY_SKINNED_BOXED:
5057                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5058                         break;
5059                 }
5060                 g_bIgnoreCommands++;
5061                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5062                 g_bIgnoreCommands--;
5063                 return;
5064         }
5065
5066         switch ( mode )
5067         {
5068         case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5069                 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5070                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5071                 break;
5072         case ID_VIEW_ENTITIESAS_WIREFRAME:
5073                 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5074                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5075                 break;
5076         case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5077                 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5078                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5079                 break;
5080         case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5081                 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5082                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5083                 break;
5084         case ID_VIEW_ENTITIESAS_SKINNED:
5085                 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5086                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5087                 break;
5088         case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5089                 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5090                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5091                 break;
5092         default:
5093                 Sys_FPrintf( SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n" );
5094                 return;
5095         }
5096
5097         if ( !item ) {
5098                 Sys_FPrintf( SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n" );
5099                 return;
5100         }
5101
5102         g_bIgnoreCommands++;
5103         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5104         g_bIgnoreCommands--;
5105
5106         Sys_UpdateWindows( W_ALL );
5107 }
5108
5109 void MainFrame::OnViewCubicclipping(){
5110         GtkWidget *w;
5111
5112         g_PrefsDlg.m_bCubicClipping ^= 1;
5113         g_bIgnoreCommands++;
5114         w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
5115         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5116         w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
5117         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5118         g_bIgnoreCommands--;
5119         g_PrefsDlg.SavePrefs();
5120         //Map_BuildBrushData ();
5121         Sys_UpdateWindows( W_CAMERA );
5122 }
5123
5124 void MainFrame::OnViewOpengllighting(){
5125         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
5126         g_PrefsDlg.m_bGLLighting ^= 1;
5127         g_PrefsDlg.SavePrefs();
5128         g_bIgnoreCommands++;
5129         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE );
5130         Sys_UpdateWindows( W_XY | W_CAMERA );
5131         g_bIgnoreCommands--;
5132 }
5133
5134 void MainFrame::OnSelectionDragedges(){
5135         if ( g_qeglobals.d_select_mode == sel_edge ) {
5136                 g_qeglobals.d_select_mode = sel_brush;
5137                 Sys_UpdateWindows( W_ALL );
5138         }
5139         else
5140         {
5141                 SetupVertexSelection();
5142                 if ( g_qeglobals.d_numpoints ) {
5143                         g_qeglobals.d_select_mode = sel_edge;
5144                 }
5145                 Sys_UpdateWindows( W_ALL );
5146         }
5147 }
5148
5149 void MainFrame::OnSelectionDragvertecies(){
5150         if ( g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint ) {
5151                 g_qeglobals.d_select_mode = sel_brush;
5152                 Sys_UpdateWindows( W_ALL );
5153         }
5154         else
5155         {
5156                 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5157                 if ( OnlyPatchesSelected() ) {
5158                         Patch_EditPatch();
5159                 }
5160                 else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5161                 {
5162                         SetupVertexSelection();
5163                         if ( g_qeglobals.d_numpoints ) {
5164                                 g_qeglobals.d_select_mode = sel_vertex;
5165                         }
5166                 }
5167                 Sys_UpdateWindows( W_ALL );
5168         }
5169 }
5170
5171 void MainFrame::OnSelectionClone(){
5172         Select_Clone();
5173 }
5174
5175 // called when the escape key is used (either on the main window or on an inspector)
5176 void MainFrame::OnSelectionDeselect(){
5177         if ( g_bClipMode ) {
5178                 OnViewClipper();
5179         }
5180         else
5181         if ( g_bRotateMode ) {
5182                 OnSelectMouserotate();
5183         }
5184         else
5185         if ( g_bScaleMode ) {
5186                 OnSelectMousescale();
5187         }
5188         else
5189         if ( g_bPathMode ) {
5190                 if ( ActiveXY() ) {
5191                         ActiveXY()->KillPathMode();
5192                 }
5193         }
5194         else
5195         {
5196                 if ( g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0 ) {
5197                         g_qeglobals.d_num_move_points = 0;
5198                         Sys_UpdateWindows( W_ALL );
5199                 }
5200                 else
5201                 {
5202                         Select_Deselect();
5203                         SetStatusText( 2, " " );
5204                 }
5205         }
5206 }
5207
5208 void MainFrame::OnBrushFlipx(){
5209         Undo_Start( "flip X" );
5210         Undo_AddBrushList( &selected_brushes );
5211
5212         Select_FlipAxis( 0 );
5213         // spog - this does not work - it's a rotate not a flip
5214         /*
5215            for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5216            {
5217            if(b->owner->eclass->fixedsize)
5218            {
5219             char buf[16];
5220             float a = FloatForKey(b->owner, "angle");
5221             a = div ((int)(180 - a), 180).rem;
5222             sprintf (buf, "%d", (int)a);
5223             SetKeyValue(b->owner, "angle", buf);
5224             Brush_Build(b,true,true,false,false); // don't filter
5225            }
5226            }
5227          */
5228         Undo_EndBrushList( &selected_brushes );
5229         Undo_End();
5230 }
5231
5232 void MainFrame::OnBrushFlipy(){
5233         Undo_Start( "flip Y" );
5234         Undo_AddBrushList( &selected_brushes );
5235
5236         Select_FlipAxis( 1 );
5237         // spog - this does not work - it's a rotate not a flip
5238         /*
5239            for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5240            {
5241            if(b->owner->eclass->fixedsize)
5242            {
5243             float a = FloatForKey(b->owner, "angle");
5244             if (a == 0 || a == 180 || a == 360)
5245            continue;
5246             if ( a == 90 || a == 270)
5247             {
5248            a += 180;
5249             }
5250             else if (a > 270)
5251            a += 90;
5252             else if (a > 180)
5253            a -= 90;
5254             else if (a > 90)
5255            a += 90;
5256             else
5257            a -= 90;
5258             a = (int)a % 360;
5259             char buf[16];
5260             sprintf (buf, "%d", (int)a);
5261             SetKeyValue(b->owner, "angle", buf);
5262             Brush_Build(b,true,true,false,false); // don't filter
5263            }
5264
5265            }
5266          */
5267         Undo_EndBrushList( &selected_brushes );
5268         Undo_End();
5269 }
5270
5271 void MainFrame::OnBrushFlipz(){
5272         Undo_Start( "flip Z" );
5273         Undo_AddBrushList( &selected_brushes );
5274         Select_FlipAxis( 2 );
5275         Undo_EndBrushList( &selected_brushes );
5276         Undo_End();
5277 }
5278
5279 void MainFrame::OnBrushRotatex(){
5280         Undo_Start( "rotate X" );
5281         Undo_AddBrushList( &selected_brushes );
5282         Select_RotateAxis( 0, 90 );
5283         Undo_EndBrushList( &selected_brushes );
5284         Undo_End();
5285 }
5286
5287 void MainFrame::OnBrushRotatey(){
5288         Undo_Start( "rotate Y" );
5289         Undo_AddBrushList( &selected_brushes );
5290         Select_RotateAxis( 1, 90 );
5291         Undo_EndBrushList( &selected_brushes );
5292         Undo_End();
5293 }
5294
5295 void MainFrame::OnBrushRotatez(){
5296         Undo_Start( "rotate Z" );
5297         Undo_AddBrushList( &selected_brushes );
5298         Select_RotateAxis( 2, 90 );
5299         Undo_EndBrushList( &selected_brushes );
5300         Undo_End();
5301 }
5302
5303 void MainFrame::OnSelectionArbitraryrotation(){
5304         Undo_Start( "arbitrary rotation" );
5305         Undo_AddBrushList( &selected_brushes );
5306
5307         DoRotateDlg();
5308
5309         Undo_EndBrushList( &selected_brushes );
5310         Undo_End();
5311 }
5312
5313 void MainFrame::OnSelectScale(){
5314         Undo_Start( "scale" );
5315         Undo_AddBrushList( &selected_brushes );
5316         DoScaleDlg();
5317         Undo_EndBrushList( &selected_brushes );
5318         Undo_End();
5319 }
5320
5321 void MainFrame::OnSelectionMakehollow(){
5322         //if (ActiveXY())
5323         //      ActiveXY()->UndoCopy();
5324         Undo_Start( "hollow" );
5325         Undo_AddBrushList( &selected_brushes );
5326         CSG_MakeHollow();
5327         Undo_EndBrushList( &selected_brushes );
5328         Undo_End();
5329 }
5330
5331 void MainFrame::OnSelectionCsgsubtract(){
5332         Undo_Start( "CSG subtract" );
5333         CSG_Subtract();
5334         Undo_End();
5335 }
5336
5337 void MainFrame::OnSelectionCsgmerge(){
5338         Undo_Start( "CSG merge" );
5339         Undo_AddBrushList( &selected_brushes );
5340         CSG_Merge();
5341         Undo_EndBrushList( &selected_brushes );
5342         Undo_End();
5343 }
5344
5345 void MainFrame::OnSelectionNoOutline(){
5346         //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5347         g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) ^ OUTLINE_ZBUF;
5348         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5349         g_bIgnoreCommands++;
5350         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5351         g_bIgnoreCommands--;
5352         Sys_UpdateWindows( W_CAMERA );
5353 }
5354
5355 void MainFrame::OnSelectionOutlineStyle(){
5356         if ( ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) && ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) ) {
5357                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5358         }
5359         else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) {
5360                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5361         }
5362         else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) {
5363                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5364         }
5365         else{
5366                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5367         }
5368         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5369         g_bIgnoreCommands++;
5370         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5371         g_bIgnoreCommands--;
5372         Sys_UpdateWindows( W_CAMERA );
5373 }
5374
5375 void MainFrame::OnSelectionSelectcompletetall(){
5376         if ( ActiveXY() ) {
5377                 ActiveXY()->UndoCopy();
5378         }
5379         Select_CompleteTall();
5380 }
5381
5382 void MainFrame::OnSelectionSelecttouching(){
5383         Select_Touching();
5384 }
5385
5386 void MainFrame::OnSelectionSelectpartialtall(){
5387         Select_PartialTall();
5388 }
5389
5390 void MainFrame::OnSelectionSelectinside(){
5391         Select_Inside();
5392 }
5393
5394 void MainFrame::OnViewClipper(){
5395         GtkWidget *w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_clipper" ) );
5396         g_bIgnoreCommands++;
5397
5398         if ( ActiveXY() ) {
5399                 if ( ActiveXY()->ClipMode() ) {
5400                         ActiveXY()->SetClipMode( false );
5401                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), FALSE );
5402                 }
5403                 else
5404                 {
5405                         if ( ActiveXY()->RotateMode() ) {
5406                                 OnSelectMouserotate();
5407                         }
5408                         ActiveXY()->SetClipMode( true );
5409                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), TRUE );
5410                 }
5411         }
5412         g_bIgnoreCommands--;
5413 }
5414
5415 void MainFrame::OnClipSelected(){
5416         if ( m_pActiveXY && m_pActiveXY->ClipMode() ) {
5417                 Undo_Start( "clip selected" );
5418                 Undo_AddBrushList( &selected_brushes );
5419                 m_pActiveXY->Clip();
5420                 Undo_EndBrushList( &selected_brushes );
5421                 Undo_End();
5422         }
5423         else
5424         {
5425                 if ( g_bPatchBendMode ) {
5426                         Patch_BendHandleENTER();
5427                 }
5428 //    else if (g_bPatchBendMode)
5429 //      Patch_InsDelHandleENTER();
5430         }
5431 }
5432
5433 void MainFrame::OnSplitSelected(){
5434         if ( m_pActiveXY ) {
5435                 Undo_Start( "split selected" );
5436                 Undo_AddBrushList( &selected_brushes );
5437                 m_pActiveXY->SplitClip();
5438                 Undo_EndBrushList( &selected_brushes );
5439                 Undo_End();
5440         }
5441 }
5442
5443 void MainFrame::OnFlipClip(){
5444         if ( m_pActiveXY ) {
5445                 m_pActiveXY->FlipClip();
5446         }
5447 }
5448
5449 void MainFrame::OnSelectionConnect(){
5450         Undo_Start( "connect selected entities" );
5451         Undo_AddBrushList( &selected_brushes );
5452         ConnectEntities();
5453         Undo_EndBrushList( &selected_brushes );
5454         Undo_End();
5455 }
5456
5457 void MainFrame::OnSelectionUngroupentity(){
5458         Undo_Start( "ungroup selected entities" );
5459         Undo_AddBrushList( &selected_brushes );
5460         Select_Ungroup();
5461         Undo_EndBrushList( &selected_brushes );
5462         Undo_End();
5463 }
5464
5465 void MainFrame::OnSelectionMergeentity(){
5466         Undo_Start( "merge entity" );
5467         Undo_AddBrushList( &selected_brushes );
5468         Select_MergeEntity();
5469         Undo_EndBrushList( &selected_brushes );
5470         Undo_End();
5471 }
5472
5473 void MainFrame::OnSelectionGroupworld(){
5474         Undo_Start( "group world" );
5475         Undo_AddBrushList( &selected_brushes );
5476         Select_GroupEntity( world_entity );
5477         Undo_EndBrushList( &selected_brushes );
5478         Undo_End();
5479 }
5480
5481 void MainFrame::OnSelectionMakeDetail(){
5482         Undo_Start( "make detail" );
5483         Undo_AddBrushList( &selected_brushes );
5484         Select_MakeDetail();
5485         Undo_EndBrushList( &selected_brushes );
5486         Undo_End();
5487 }
5488
5489 void MainFrame::OnSelectionMakeStructural(){
5490         Undo_Start( "make structural" );
5491         Undo_AddBrushList( &selected_brushes );
5492         Select_MakeStructural();
5493         Undo_EndBrushList( &selected_brushes );
5494         Undo_End();
5495 }
5496
5497 void MainFrame::OnBspCommand( unsigned int nID ){
5498         // make sure we don't attempt to region compile a map with the camera outside the region
5499         if ( region_active ) {
5500                 vec3_t vOrig;
5501                 VectorSet( vOrig,
5502                                    (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5503                                    (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5504                                    (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2] );
5505
5506                 int i;
5507                 for ( i = 0 ; i < 3 ; i++ )
5508                 {
5509                         if ( vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i] ) {
5510                                 Sys_FPrintf( SYS_ERR, "The camera must be in the region to start a region compile.\n" );
5511                                 return;
5512                         }
5513                 }
5514         }
5515
5516         // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5517         if ( stricmp( currentmap, "unnamed.map" ) == 0 ) {
5518                 OnFileSaveas();
5519         }
5520
5521         if ( g_PrefsDlg.m_bSnapShots && ( stricmp( currentmap, "unnamed.map" ) != 0 ) ) {
5522                 Map_Snapshot();
5523         }
5524
5525         if ( g_qeglobals.bBSPFrontendPlugin ) {
5526                 char *cmd = (char*)g_slist_nth_data( g_BSPFrontendCommands, nID - CMD_BSPCOMMAND );
5527                 g_BSPFrontendTable.m_pfnDispatchBSPCommand( cmd );
5528         }
5529         else
5530         {
5531                 RunBsp( bsp_commands[nID - CMD_BSPCOMMAND] );
5532         }
5533 }
5534
5535 void MainFrame::OnGrid( unsigned int nID ){
5536         if ( nID == ID_GRID_025 ) {
5537                 g_qeglobals.d_gridsize = 0.25f;
5538                 g_qeglobals.d_bSmallGrid = true;
5539         }
5540         else if ( nID == ID_GRID_05 ) {
5541                 g_qeglobals.d_gridsize = 0.5f;
5542                 g_qeglobals.d_bSmallGrid = true;
5543         }
5544         else
5545         {
5546                 switch ( nID )
5547                 {
5548                 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5549                 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5550                 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5551                 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5552                 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5553                 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5554                 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5555                 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5556                 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5557                 }
5558                 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5559                 g_qeglobals.d_bSmallGrid = false;
5560         }
5561
5562         SetGridStatus();
5563
5564         // SnapTToGrid option: need to check everywhere the grid size is changed
5565         // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5566         if ( g_PrefsDlg.m_bSnapTToGrid ) {
5567                 DoSnapTToGrid();
5568         }
5569
5570         Sys_UpdateWindows( W_XY | W_Z );
5571 }
5572
5573 void MainFrame::OnSnaptogrid(){
5574         g_PrefsDlg.m_bSnap ^= 1;
5575         g_PrefsDlg.SavePrefs();
5576
5577         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
5578         g_bIgnoreCommands++;
5579         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bSnap ? TRUE : FALSE );
5580         g_bIgnoreCommands--;
5581 }
5582
5583 void MainFrame::OnTexturesShowinuse(){
5584         Sys_BeginWait();
5585         Texture_ShowInuse();
5586 #ifdef _DEBUG
5587         if ( !g_bShowAllShaders ) {
5588                 Sys_Printf( "Already showing only in-use textures.\n" );
5589         }
5590 #endif
5591         Sys_UpdateWindows( W_TEXTURE );
5592         Sys_EndWait();
5593 }
5594
5595 void MainFrame::OnTexturesShowall(){
5596         Texture_ShowAll();
5597 }
5598
5599 // do some triggering on/off, if the inspector is already up then hide it
5600 void MainFrame::OnTexturesInspector(){
5601         ToggleSurface();
5602 }
5603
5604 void MainFrame::OnViewNearest( unsigned int nID ){
5605         Texture_SetMode( nID );
5606 }
5607
5608 void MainFrame::OnTextureReplaceall(){
5609         FindTextureDialog::show();
5610 }
5611
5612 void MainFrame::OnToggleLock(){
5613         g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5614
5615         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
5616         g_bIgnoreCommands++;
5617         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE );
5618         g_bIgnoreCommands--;
5619         g_PrefsDlg.SavePrefs();
5620         SetGridStatus();
5621 }
5622
5623 void MainFrame::OnToggleRotatelock(){
5624         g_PrefsDlg.m_bRotateLock ^= 1;
5625
5626         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
5627         g_bIgnoreCommands++;
5628         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE );
5629         g_bIgnoreCommands--;
5630         g_PrefsDlg.SavePrefs();
5631         SetGridStatus();
5632 }
5633
5634 // use a dialog for direct selection of a texture menu
5635 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5636 void MainFrame::OnTexturesLoad(){
5637         char def_path[NAME_MAX];
5638
5639         // FIXME
5640         // check if that works with fs_game (I suspect some more design is needed)
5641         // see how this is done in 1.2?
5642         strcpy( def_path, g_pGameDescription->mEnginePath.GetBuffer() );
5643         strcat( def_path, g_pGameDescription->mBaseGame.GetBuffer() );
5644         strcat( def_path, "/" );
5645
5646         char *dir = dir_dialog( m_pWidget, _( "Load textures from path" ), def_path );
5647
5648         if ( dir != NULL ) {
5649                 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5650                 Sys_Printf( "user select: '%s'\n", dir );
5651                 // remove a potential trailing slash?
5652                 if ( dir[strlen( dir ) - 1] == '/' || dir[strlen( dir ) - 1] == '\\' ) {
5653                         dir[strlen( dir ) - 1] = '\0';
5654                 }
5655                 char *pouic = MAX( strrchr( dir, '/' ),strrchr( dir, '\\' ) );
5656                 if ( pouic ) {
5657                         strcpy( texture_directory, pouic + 1 );
5658                         Sys_Printf( "Loading '%s'\n", texture_directory );
5659                         Texture_ShowDirectory();
5660                 }
5661                 else{
5662                         Sys_FPrintf( SYS_WRN, "Failed to extract the directory\n" );
5663                 }
5664                 g_free( dir );
5665         }
5666         else{
5667                 Sys_FPrintf( SYS_WRN, "texture load dialog cancelled\n" );
5668         }
5669 }
5670
5671 void MainFrame::OnTexturesReloadshaders(){
5672         Sys_BeginWait();
5673         QERApp_ReloadShaders();
5674         // current shader
5675         // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5676         Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
5677         Sys_UpdateWindows( W_ALL );
5678         Sys_EndWait();
5679 }
5680
5681 void MainFrame::OnTexturesShadersShow(){
5682         g_PrefsDlg.m_bShowShaders ^= 1;
5683         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
5684         g_bIgnoreCommands++;
5685         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
5686         g_bIgnoreCommands--;
5687         Sys_UpdateWindows( W_TEXTURE );
5688 }
5689
5690 void MainFrame::SetTextureScale( int id ){
5691         GtkWidget *item;
5692
5693         switch ( id )
5694         {
5695         case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5696                 g_PrefsDlg.m_nTextureScale = 10;
5697                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_10" ) );
5698                 break;
5699         case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5700                 g_PrefsDlg.m_nTextureScale = 25;
5701                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_25" ) );
5702                 break;
5703         case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5704                 g_PrefsDlg.m_nTextureScale = 50;
5705                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_50" ) );
5706                 break;
5707         case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5708                 g_PrefsDlg.m_nTextureScale = 200;
5709                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_200" ) );
5710                 break;
5711         default:
5712                 g_PrefsDlg.m_nTextureScale = 100;
5713                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_100" ) );
5714                 break;
5715         }
5716
5717         g_bIgnoreCommands++;
5718         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5719         g_bIgnoreCommands--;
5720
5721         Texture_ResetPosition();
5722 }
5723
5724 void MainFrame::OnTexturewindowScaleup(){
5725         switch ( g_PrefsDlg.m_nTextureScale ) {
5726         // 200, all the way in, don't do anything
5727         case 100:
5728                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_200 );
5729                 break;
5730         case 50:
5731                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5732                 break;
5733         case 25:
5734                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5735                 break;
5736         case 10:
5737                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5738                 break;
5739         }
5740 }
5741
5742 void MainFrame::OnTexturewindowScaledown(){
5743         switch ( g_PrefsDlg.m_nTextureScale ) {
5744         case 200:
5745                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5746                 break;
5747         case 100:
5748                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5749                 break;
5750         case 50:
5751                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5752                 break;
5753         case 25:
5754                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_10 );
5755                 break;
5756                 // 10, all the way out, don't do anything
5757         }
5758 }
5759
5760 void MainFrame::OnTexturesLoadlist(){
5761         DoTextureListDlg();
5762 }
5763
5764 void MainFrame::OnTexturesShaderlistonly(){
5765         g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5766         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ),"menu_textures_shaderlistonly" ) );
5767         g_bIgnoreCommands++;
5768         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
5769         g_bIgnoreCommands--;
5770         FillTextureMenu();
5771 }
5772
5773 void MainFrame::OnTextureWad( unsigned int nID ){
5774         Sys_BeginWait();
5775         Texture_ShowDirectory( nID );
5776         Sys_UpdateWindows( W_ALL );
5777         Sys_EndWait();
5778 }
5779
5780 void MainFrame::OnMiscBenchmark(){
5781         m_pCamWnd->BenchMark();
5782 }
5783
5784 void MainFrame::OnColorSetoriginal(){
5785         for ( int i = 0 ; i < 3 ; i++ )
5786         {
5787                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5788                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5789                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5790                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5791                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5792         }
5793
5794         //djbob
5795         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5796         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5797         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5798
5799         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5800         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5801         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5802         //-djbob
5803
5804         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5805         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5806         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5807
5808         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5809         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5810         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5811
5812         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5813         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5814         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5815
5816         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5817         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5818         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5819
5820         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5821         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5822         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5823
5824         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5825         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5826         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5827
5828         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5829         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5830         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5831
5832         g_PrefsDlg.SavePrefs();
5833         Sys_UpdateWindows( W_ALL );
5834 }
5835
5836 void MainFrame::OnColorSetqer(){
5837         for ( int i = 0 ; i < 3 ; i++ )
5838         {
5839                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5840                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5841                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5842                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5843                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5844         }
5845
5846         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5847         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5848         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5849
5850         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5851         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5852         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5853
5854         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5855         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5856         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5857
5858         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5859         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5860         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5861
5862         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5863         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5864         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5865
5866         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5867         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5868         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5869
5870         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5871         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5872         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5873
5874         g_PrefsDlg.SavePrefs();
5875         Sys_UpdateWindows( W_ALL );
5876 }
5877
5878 void MainFrame::OnColorSetblack(){
5879         for ( int i = 0 ; i < 3 ; i++ )
5880         {
5881                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5882                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5883                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
5884                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5885         }
5886
5887         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
5888         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
5889         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
5890
5891         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5892         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5893         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5894
5895         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
5896         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
5897         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
5898
5899         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5900         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5901         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5902
5903         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5904         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5905         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5906
5907         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
5908         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
5909         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
5910
5911         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
5912         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
5913         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
5914
5915         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5916         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5917         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5918
5919         g_PrefsDlg.SavePrefs();
5920         Sys_UpdateWindows( W_ALL );
5921 }
5922
5923 /* ydnar: to emulate maya/max/lightwave color schemes */
5924 void MainFrame::OnColorSetydnar(){
5925         for ( int i = 0 ; i < 3 ; i++ )
5926         {
5927                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5928                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
5929                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
5930                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
5931                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5932         }
5933
5934         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
5935         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
5936         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5937
5938         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5939         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5940         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5941
5942         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5943         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5944         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5945
5946         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5947         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5948         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5949
5950         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5951         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5952         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5953
5954         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5955         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5956         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5957
5958         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5959         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5960         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5961
5962         g_PrefsDlg.SavePrefs();
5963         Sys_UpdateWindows( W_ALL );
5964 }
5965
5966 void MainFrame::OnTexturebk(){
5967         DoColor( COLOR_TEXTUREBACK );
5968         Sys_UpdateWindows( W_ALL );
5969 }
5970
5971 void MainFrame::OnColorsXybk(){
5972         DoColor( COLOR_GRIDBACK );
5973         Sys_UpdateWindows( W_ALL );
5974 }
5975
5976 void MainFrame::OnColorsMajor(){
5977         DoColor( COLOR_GRIDMAJOR );
5978         Sys_UpdateWindows( W_ALL );
5979 }
5980
5981 void MainFrame::OnColorsMinor(){
5982         DoColor( COLOR_GRIDMINOR );
5983         Sys_UpdateWindows( W_ALL );
5984 }
5985
5986 void MainFrame::OnColorsMajor_Alt(){
5987         DoColor( COLOR_GRIDMAJOR_ALT );
5988         Sys_UpdateWindows( W_ALL );
5989 }
5990
5991 void MainFrame::OnColorsMinor_Alt(){
5992         DoColor( COLOR_GRIDMINOR_ALT );
5993         Sys_UpdateWindows( W_ALL );
5994 }
5995
5996 void MainFrame::OnColorsGridtext(){
5997         DoColor( COLOR_GRIDTEXT );
5998         Sys_UpdateWindows( W_ALL );
5999 }
6000
6001 void MainFrame::OnColorsGridblock(){
6002         DoColor( COLOR_GRIDBLOCK );
6003         Sys_UpdateWindows( W_ALL );
6004 }
6005
6006 void MainFrame::OnColorsCameraBack(){
6007         DoColor( COLOR_CAMERABACK );
6008         Sys_UpdateWindows( W_ALL );
6009 }
6010
6011 void MainFrame::OnColorsBrush(){
6012         DoColor( COLOR_BRUSHES );
6013         Sys_UpdateWindows( W_ALL );
6014 }
6015
6016 void MainFrame::OnColorsSelectedbrush(){
6017         DoColor( COLOR_SELBRUSHES );
6018         Sys_UpdateWindows( W_ALL );
6019 }
6020
6021 void MainFrame::OnColorsSelectedbrush3D(){
6022         DoColor( COLOR_SELBRUSHES3D );
6023         Sys_UpdateWindows( W_ALL );
6024 }
6025
6026 void MainFrame::OnColorsClipper(){
6027         DoColor( COLOR_CLIPPER );
6028         Sys_UpdateWindows( W_ALL );
6029 }
6030
6031 void MainFrame::OnColorsViewname(){
6032         DoColor( COLOR_VIEWNAME );
6033         Sys_UpdateWindows( W_ALL );
6034 }
6035
6036 void MainFrame::OnMiscGamma(){
6037         float fSave = g_qeglobals.d_savedinfo.fGamma;
6038         DoGamma();
6039         if ( fSave != g_qeglobals.d_savedinfo.fGamma ) {
6040                 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for Gamma settings to take effect." ) );
6041         }
6042 }
6043 void MainFrame::OnMiscFindbrush(){
6044         DoFind();
6045 }
6046
6047 void MainFrame::OnMiscNextleakspot(){
6048         Pointfile_Next();
6049 }
6050
6051 void MainFrame::OnMiscPreviousleakspot(){
6052         Pointfile_Prev();
6053 }
6054
6055 void MainFrame::OnMiscPrintxy(){
6056         WXY_Print();
6057 }
6058
6059 void MainFrame::OnMiscSelectentitycolor(){
6060         if ( edit_entity ) {
6061                 CString strColor = ValueForKey( edit_entity, "_color" );
6062                 if ( strColor.GetLength() > 0 ) {
6063                         float fR, fG, fB;
6064                         int n = sscanf( strColor,"%f %f %f", &fR, &fG, &fB );
6065                         if ( n == 3 ) {
6066                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6067                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6068                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6069                         }
6070                 }
6071
6072                 if ( inspector_mode == W_ENTITY && ( DoColor( COLOR_ENTITY ) ) ) {
6073                         char buffer[100];
6074                         sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6075                                          g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6076                                          g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
6077
6078                         gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntValueField] ), buffer );
6079                         gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntKeyField] ), "_color" );
6080                         AddProp();
6081                         //DK - SOF change to get color to entity quickly
6082                         //--::SetWindowText( hwndEnt[EntValueField], buffer );
6083                         //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6084                         //--AddProp();
6085                 }
6086                 Sys_UpdateWindows( W_ALL );
6087         }
6088 }
6089
6090 void MainFrame::OnConvertcurves(){
6091 #if 0
6092         Select_Deselect();
6093         for ( brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next )
6094         {
6095                 if ( pb->curveBrush ) {
6096                         for ( face_t* f = pb->brush_faces ; f ; f = f->next )
6097                         {
6098                                 if ( f->texdef.contents & CONTENTS_LADDER ) {
6099                                         f->texdef.contents &= ~CONTENTS_LADDER;
6100                                         f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6101                                 }
6102                         }
6103                 }
6104         }
6105         Map_BuildBrushData();
6106 #endif
6107 }
6108
6109 void MainFrame::OnRegionOff(){
6110         Map_RegionOff();
6111 }
6112
6113 void MainFrame::OnRegionSetxy(){
6114         Map_RegionXY();
6115 }
6116
6117 void MainFrame::OnRegionSettallbrush(){
6118         Map_RegionTallBrush();
6119 }
6120
6121 void MainFrame::OnRegionSetbrush(){
6122         Map_RegionBrush();
6123 }
6124
6125 void MainFrame::OnRegionSetselection(){
6126         Map_RegionSelectedBrushes();
6127 }
6128
6129 void MainFrame::OnBrush3sided(){
6130         Undo_Start( "3 sided" );
6131         Undo_AddBrushList( &selected_brushes );
6132         Brush_MakeSided( 3 );
6133         Undo_EndBrushList( &selected_brushes );
6134         Undo_End();
6135 }
6136
6137 void MainFrame::OnBrush4sided(){
6138         Undo_Start( "4 sided" );
6139         Undo_AddBrushList( &selected_brushes );
6140         Brush_MakeSided( 4 );
6141         Undo_EndBrushList( &selected_brushes );
6142         Undo_End();
6143 }
6144
6145 void MainFrame::OnBrush5sided(){
6146         Undo_Start( "5 sided" );
6147         Undo_AddBrushList( &selected_brushes );
6148         Brush_MakeSided( 5 );
6149         Undo_EndBrushList( &selected_brushes );
6150         Undo_End();
6151 }
6152
6153 void MainFrame::OnBrush6sided(){
6154         Undo_Start( "6 sided" );
6155         Undo_AddBrushList( &selected_brushes );
6156         Brush_MakeSided( 6 );
6157         Undo_EndBrushList( &selected_brushes );
6158         Undo_End();
6159 }
6160
6161 void MainFrame::OnBrush7sided(){
6162         Undo_Start( "7 sided" );
6163         Undo_AddBrushList( &selected_brushes );
6164         Brush_MakeSided( 7 );
6165         Undo_EndBrushList( &selected_brushes );
6166         Undo_End();
6167 }
6168
6169 void MainFrame::OnBrush8sided(){
6170         Undo_Start( "8 sided" );
6171         Undo_AddBrushList( &selected_brushes );
6172         Brush_MakeSided( 8 );
6173         Undo_EndBrushList( &selected_brushes );
6174         Undo_End();
6175 }
6176
6177 void MainFrame::OnBrush9sided(){
6178         Undo_Start( "9 sided" );
6179         Undo_AddBrushList( &selected_brushes );
6180         Brush_MakeSided( 9 );
6181         Undo_EndBrushList( &selected_brushes );
6182         Undo_End();
6183 }
6184
6185 void MainFrame::OnBrushArbitrarysided(){
6186         Undo_Start( "arbitrary sided" );
6187         Undo_AddBrushList( &selected_brushes );
6188         DoSides();
6189         Undo_EndBrushList( &selected_brushes );
6190         Undo_End();
6191 }
6192
6193 void MainFrame::OnBrushMakecone(){
6194         Undo_Start( "make cone" );
6195         Undo_AddBrushList( &selected_brushes );
6196         DoSides( true );
6197         Undo_EndBrushList( &selected_brushes );
6198         Undo_End();
6199 }
6200
6201 void MainFrame::OnBrushPrimitivesSphere(){
6202         Undo_Start( "make sphere" );
6203         Undo_AddBrushList( &selected_brushes );
6204
6205         DoSides( false, true );
6206
6207         Undo_EndBrushList( &selected_brushes );
6208         Undo_End();
6209 }
6210
6211 void MainFrame::OnCurvePatchtube(){
6212         Undo_Start( "make curve cylinder" );
6213         Undo_AddBrushList( &selected_brushes );
6214         Patch_BrushToMesh( false );
6215         Sys_UpdateWindows( W_ALL );
6216         Undo_EndBrushList( &selected_brushes );
6217         Undo_End();
6218 }
6219
6220 void MainFrame::OnCurvePatchdensetube(){
6221         Undo_Start( "dense cylinder" );
6222         Undo_AddBrushList( &selected_brushes );
6223
6224         Patch_BrushToMesh( false );
6225         OnCurveInsertAddrow();
6226         Sys_UpdateWindows( W_ALL );
6227
6228         Undo_EndBrushList( &selected_brushes );
6229         Undo_End();
6230 }
6231
6232 void MainFrame::OnCurvePatchverydensetube(){
6233         Undo_Start( "very dense cylinder" );
6234         Undo_AddBrushList( &selected_brushes );
6235
6236         Patch_BrushToMesh( false );
6237         OnCurveInsertAddrow();
6238         OnCurveInsertInsertrow();
6239         OnCurveInsertAddrow();
6240         Sys_UpdateWindows( W_ALL );
6241
6242         Undo_EndBrushList( &selected_brushes );
6243         Undo_End();
6244 }
6245
6246 void MainFrame::OnCurvePatchsquare(){
6247         Undo_Start( "square cylinder" );
6248         Undo_AddBrushList( &selected_brushes );
6249
6250         Patch_BrushToMesh( false, false, false, true );
6251         Sys_UpdateWindows( W_ALL );
6252
6253         Undo_EndBrushList( &selected_brushes );
6254         Undo_End();
6255 }
6256
6257 void MainFrame::OnCurvePatchendcap(){
6258         Undo_Start( "make end cap" );
6259         Undo_AddBrushList( &selected_brushes );
6260         Patch_BrushToMesh( false, false, true );
6261         Sys_UpdateWindows( W_ALL );
6262         Undo_EndBrushList( &selected_brushes );
6263         Undo_End();
6264 }
6265
6266 void MainFrame::OnCurvePatchbevel(){
6267         Undo_Start( "make bevel" );
6268         Undo_AddBrushList( &selected_brushes );
6269         Patch_BrushToMesh( false, true, false );
6270         Sys_UpdateWindows( W_ALL );
6271         Undo_EndBrushList( &selected_brushes );
6272         Undo_End();
6273 }
6274
6275 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel(){
6276         Undo_Start( "square bevel" );
6277         Undo_AddBrushList( &selected_brushes );
6278
6279         Patch_BrushToMesh( false, true, false, true );
6280         Sys_UpdateWindows( W_ALL );
6281
6282         Undo_EndBrushList( &selected_brushes );
6283         Undo_End();
6284 }
6285
6286 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap(){
6287         Undo_Start( "square endcap" );
6288         Undo_AddBrushList( &selected_brushes );
6289
6290         Patch_BrushToMesh( false, false, true, true );
6291         Sys_UpdateWindows( W_ALL );
6292
6293         Undo_EndBrushList( &selected_brushes );
6294         Undo_End();
6295 }
6296
6297 void MainFrame::OnCurvePatchcone(){
6298         Undo_Start( "make curve cone" );
6299         Undo_AddBrushList( &selected_brushes );
6300         Patch_BrushToMesh( true );
6301         Sys_UpdateWindows( W_ALL );
6302         Undo_EndBrushList( &selected_brushes );
6303         Undo_End();
6304 }
6305
6306 void MainFrame::OnCurveSimplepatchmesh(){
6307         Undo_Start( "make simpe patch mesh" );
6308         Undo_AddBrushList( &selected_brushes );
6309         DoNewPatchDlg();
6310         Undo_EndBrushList( &selected_brushes );
6311         Undo_End();
6312 }
6313
6314 void MainFrame::OnCurveInsertInsertcolumn(){
6315         Undo_Start( "insert (2) columns" );
6316         Undo_AddBrushList( &selected_brushes );
6317         Patch_AdjustSelected( true, true, false );
6318         Sys_UpdateWindows( W_ALL );
6319         Undo_EndBrushList( &selected_brushes );
6320         Undo_End();
6321 }
6322
6323 void MainFrame::OnCurveInsertAddcolumn(){
6324         Undo_Start( "add (2) columns" );
6325         Undo_AddBrushList( &selected_brushes );
6326         Patch_AdjustSelected( true, true, true );
6327         Sys_UpdateWindows( W_ALL );
6328         Undo_EndBrushList( &selected_brushes );
6329         Undo_End();
6330 }
6331
6332 void MainFrame::OnCurveInsertInsertrow(){
6333         Undo_Start( "insert (2) rows" );
6334         Undo_AddBrushList( &selected_brushes );
6335         Patch_AdjustSelected( true, false, false );
6336         Sys_UpdateWindows( W_ALL );
6337         Undo_EndBrushList( &selected_brushes );
6338         Undo_End();
6339 }
6340
6341 void MainFrame::OnCurveInsertAddrow(){
6342         Undo_Start( "add (2) rows" );
6343         Undo_AddBrushList( &selected_brushes );
6344         Patch_AdjustSelected( true, false, true );
6345         Sys_UpdateWindows( W_ALL );
6346         Undo_EndBrushList( &selected_brushes );
6347         Undo_End();
6348 }
6349
6350 void MainFrame::OnCurveDeleteFirstcolumn(){
6351         Undo_Start( "delete first (2) columns" );
6352         Undo_AddBrushList( &selected_brushes );
6353         Patch_AdjustSelected( false, true, true );
6354         Sys_UpdateWindows( W_ALL );
6355         Undo_EndBrushList( &selected_brushes );
6356         Undo_End();
6357 }
6358
6359 void MainFrame::OnCurveDeleteLastcolumn(){
6360         Undo_Start( "delete last (2) columns" );
6361         Undo_AddBrushList( &selected_brushes );
6362         Patch_AdjustSelected( false, true, false );
6363         Sys_UpdateWindows( W_ALL );
6364         Undo_EndBrushList( &selected_brushes );
6365         Undo_End();
6366 }
6367
6368 void MainFrame::OnCurveDeleteFirstrow(){
6369         Undo_Start( "delete first (2) rows" );
6370         Undo_AddBrushList( &selected_brushes );
6371         Patch_AdjustSelected( false, false, true );
6372         Sys_UpdateWindows( W_ALL );
6373         Undo_EndBrushList( &selected_brushes );
6374         Undo_End();
6375 }
6376
6377 void MainFrame::OnCurveDeleteLastrow(){
6378         Undo_Start( "delete last (2) rows" );
6379         Undo_AddBrushList( &selected_brushes );
6380         Patch_AdjustSelected( false, false, false );
6381         Sys_UpdateWindows( W_ALL );
6382         Undo_EndBrushList( &selected_brushes );
6383         Undo_End();
6384 }
6385
6386 void MainFrame::OnCurveNegative(){
6387         Patch_ToggleInverted();
6388         //Sys_UpdateWindows(W_ALL);
6389 }
6390
6391 void MainFrame::OnCurveRedisperseRows(){
6392         Undo_Start( "redisperse rows" );
6393         Undo_AddBrushList( &selected_brushes );
6394         Patch_DisperseRows();
6395         Sys_UpdateWindows( W_ALL );
6396         Undo_EndBrushList( &selected_brushes );
6397         Undo_End();
6398 }
6399
6400 void MainFrame::OnCurveRedisperseIntermediateCols(){
6401         Undo_Start( "redisperse im cols" );
6402         Undo_AddBrushList( &selected_brushes );
6403         Patch_DisperseIntermediateColumns();
6404         Sys_UpdateWindows( W_ALL );
6405         Undo_EndBrushList( &selected_brushes );
6406         Undo_End();
6407 }
6408
6409 void MainFrame::OnCurveRedisperseIntermediateRows(){
6410         Undo_Start( "redisperse im rows" );
6411         Undo_AddBrushList( &selected_brushes );
6412         Patch_DisperseIntermediateRows();
6413         Sys_UpdateWindows( W_ALL );
6414         Undo_EndBrushList( &selected_brushes );
6415         Undo_End();
6416 }
6417
6418 void MainFrame::OnCurveMatrixTranspose(){
6419         Patch_Transpose();
6420         Sys_UpdateWindows( W_ALL );
6421 }
6422
6423 void MainFrame::OnCurveCap(){
6424         Patch_CapCurrent();
6425         Sys_UpdateWindows( W_ALL );
6426 }
6427
6428 void MainFrame::OnCurveCyclecap(){
6429         Patch_CycleCapSelected();
6430         Sys_UpdateWindows( W_ALL );
6431 }
6432
6433 void MainFrame::OnCurveOverlaySet(){
6434         Patch_SetOverlays();
6435         Sys_UpdateWindows( W_ALL );
6436 }
6437
6438 void MainFrame::OnCurveOverlayClear(){
6439         Patch_ClearOverlays();
6440         Sys_UpdateWindows( W_ALL );
6441 }
6442
6443 void MainFrame::OnCurveThicken(){
6444         Undo_Start( "curve thicken" );
6445         Undo_AddBrushList( &selected_brushes );
6446         DoThickenDlg();
6447         Undo_EndBrushList( &selected_brushes );
6448         Undo_End();
6449 }
6450
6451 /*!
6452    this can no longer be trigger manually from the menu
6453    happens only once at startup
6454  */
6455 void MainFrame::OnPluginsRefresh(){
6456         CleanPlugInMenu();
6457         m_PlugInMgr.Init();
6458 }
6459
6460 // open the Q3Rad manual
6461 void MainFrame::OnHelp(){
6462         // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6463         Str help;
6464         help = g_strAppPath;
6465         help += "Q3Rad_Manual/index.htm";
6466         OpenURL( help.GetBuffer() );
6467 }
6468
6469 // FIXME: we'll go towards a unified help thing soon
6470 void MainFrame::OnHelpLinks(){
6471         Str link;
6472         link = g_strAppPath;
6473         link += "links.htm";
6474         OpenURL( link.GetBuffer() );
6475 }
6476
6477 void MainFrame::OnHelpBugreport(){
6478         OpenURL( "http://www.qeradiant.com/faq/fom-serve/cache/138.html" );
6479 }
6480
6481 void MainFrame::OnHelpCommandlist(){
6482         DoCommandListDlg();
6483 }
6484
6485 void MainFrame::OnHelpAbout(){
6486         DoAbout();
6487 }
6488
6489 void MainFrame::OnPopupSelection(){
6490         GtkWidget *menu, *item;
6491         const gchar *labels[] = { _( "Select Complete Tall" ), _( "Select Touching" ), _( "Select Partial Tall" ), _( "Select Inside" )};
6492         int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6493                                   ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6494
6495         menu = gtk_menu_new();
6496
6497         for ( int i = 0; i < 4; i++ )
6498         {
6499                 item = gtk_menu_item_new_with_label( labels[i] );
6500                 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( HandleCommand ),
6501                                                         GINT_TO_POINTER( ids[i] ) );
6502                 gtk_widget_show( item );
6503                 gtk_menu_append( GTK_MENU( menu ), item );
6504         }
6505
6506         gtk_menu_popup( GTK_MENU( menu ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6507 }
6508
6509 void MainFrame::OnViewChange(){
6510         OnViewNextview();
6511         //HandlePopup(this, IDR_POPUP_VIEW);
6512 }
6513
6514 void MainFrame::OnTexturesPopup(){
6515         gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "render_quality_menu" );
6516         gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6517 }
6518
6519 void MainFrame::ToggleCamera(){
6520         if ( m_bCamPreview ) {
6521                 m_bCamPreview = false;
6522         }
6523         else{
6524                 m_bCamPreview = true;
6525         }
6526 }
6527
6528 void MainFrame::OnViewCameraupdate(){
6529         Sys_UpdateWindows( W_CAMERA );
6530 }
6531
6532 void MainFrame::OnSelectMouserotate(){
6533         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mouserotate" ) );
6534         g_bIgnoreCommands++;
6535
6536         if ( ActiveXY() ) {
6537                 if ( ActiveXY()->ClipMode() ) {
6538                         OnViewClipper();
6539                 }
6540                 if ( ActiveXY()->RotateMode() ) {
6541                         // SetRotateMode(false) always works
6542                         ActiveXY()->SetRotateMode( false );
6543                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6544                 }
6545                 else
6546                 {
6547                         // may not work if no brush selected, see return value
6548                         if ( ActiveXY()->SetRotateMode( true ) ) {
6549                                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6550                         }
6551                         else{
6552                                 // if MFC called, we need to set back to FALSE ourselves
6553                                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6554                         }
6555                 }
6556         }
6557         g_bIgnoreCommands--;
6558 }
6559
6560 void MainFrame::OnSelectMousescale(){
6561         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mousescale" ) );
6562         g_bIgnoreCommands++;
6563
6564         if ( ActiveXY() ) {
6565                 if ( ActiveXY()->ClipMode() ) {
6566                         OnViewClipper();
6567                 }
6568                 if ( ActiveXY()->RotateMode() ) {
6569                         // SetRotateMode(false) always works
6570                         ActiveXY()->SetRotateMode( false );
6571                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6572                 }
6573                 if ( ActiveXY()->ScaleMode() ) {
6574                         ActiveXY()->SetScaleMode( false );
6575                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6576                 }
6577                 else
6578                 {
6579                         ActiveXY()->SetScaleMode( true );
6580                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6581                 }
6582         }
6583         g_bIgnoreCommands--;
6584 }
6585
6586 void MainFrame::OnScalelockx(){
6587         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockx" ) );
6588         g_bIgnoreCommands++;
6589
6590         if ( g_nScaleHow & SCALE_X ) {
6591                 g_nScaleHow ^= SCALE_X;
6592                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6593         }
6594         else
6595         {
6596                 g_nScaleHow |= SCALE_X;
6597                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6598         }
6599         g_bIgnoreCommands--;
6600 }
6601
6602 void MainFrame::OnScalelocky(){
6603         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelocky" ) );
6604         g_bIgnoreCommands++;
6605
6606         if ( g_nScaleHow & SCALE_Y ) {
6607                 g_nScaleHow ^= SCALE_Y;
6608                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6609         }
6610         else
6611         {
6612                 g_nScaleHow |= SCALE_Y;
6613                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6614         }
6615         g_bIgnoreCommands--;
6616 }
6617
6618 void MainFrame::OnScalelockz(){
6619         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockz" ) );
6620         g_bIgnoreCommands++;
6621
6622         if ( g_nScaleHow & SCALE_Z ) {
6623                 g_nScaleHow ^= SCALE_Z;
6624                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6625         }
6626         else
6627         {
6628                 g_nScaleHow |= SCALE_Z;
6629                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6630         }
6631         g_bIgnoreCommands--;
6632 }
6633
6634 void MainFrame::OnDontselectcurve(){
6635         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
6636         g_bIgnoreCommands++;
6637         g_PrefsDlg.m_bSelectCurves ^= 1;
6638         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
6639         g_bIgnoreCommands--;
6640 }
6641
6642 void MainFrame::OnPatchToggleBox(){
6643         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
6644         g_bIgnoreCommands++;
6645         g_bPatchShowBounds ^= 1;
6646         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
6647         g_bIgnoreCommands--;
6648         Sys_UpdateWindows( W_ALL );
6649 }
6650
6651 void MainFrame::OnPatchWireframe(){
6652         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_wireframe" ) );
6653         g_bIgnoreCommands++;
6654         g_bPatchWireFrame ^= 1;
6655         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWireFrame ) ? TRUE : FALSE );
6656         g_bIgnoreCommands--;
6657         Sys_UpdateWindows( W_ALL );
6658 }
6659
6660 void MainFrame::OnPatchBend(){
6661         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
6662         g_bIgnoreCommands++;
6663         Patch_BendToggle();
6664         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
6665         g_bIgnoreCommands--;
6666         Sys_UpdateWindows( W_ALL );
6667 }
6668
6669 void MainFrame::OnPatchWeld(){
6670         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
6671         g_bIgnoreCommands++;
6672         g_bPatchWeld ^= 1;
6673         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
6674         g_bIgnoreCommands--;
6675         Sys_UpdateWindows( W_ALL );
6676 }
6677
6678 void MainFrame::OnPatchDrilldown(){
6679         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
6680         g_bIgnoreCommands++;
6681         g_bPatchDrillDown ^= 1;
6682         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
6683         g_bIgnoreCommands--;
6684         Sys_UpdateWindows( W_ALL );
6685 }
6686
6687 void MainFrame::OnShowEntities(){
6688         gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "view_entitiesas_menu" ); // use pointer to existing menu object
6689         gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6690 }
6691
6692 void MainFrame::OnDropGroupName(){
6693         /*
6694            char* name = DoNameDlg ("Name Selection");
6695
6696            if (name != NULL)
6697            {
6698            Select_Name (name);
6699            Sys_UpdateWindows (W_ALL);
6700            free (name);
6701            }
6702          */
6703 }
6704
6705 void MainFrame::OnDropGroupNewgroup(){
6706
6707 }
6708
6709 void MainFrame::OnDropGroupRemove(){
6710         /*
6711            Select_AddToGroup("World");
6712            Sys_UpdateWindows (W_ALL);
6713          */
6714 }
6715
6716 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6717 void MainFrame::OnFaceFit(){
6718         SurfaceDlgFitAll();
6719 }
6720
6721 void MainFrame::OnDontselectmodel(){
6722         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
6723         g_bIgnoreCommands++;
6724         g_PrefsDlg.m_bSelectModels ^= 1;
6725         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
6726         g_bIgnoreCommands--;
6727 }
6728
6729 void MainFrame::OnViewTexture(){
6730         if ( FloatingGroupDialog() ) { // QE4 style
6731                 if ( inspector_mode == W_TEXTURE ) {
6732                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
6733                                 widget_delete_hide( g_qeglobals_gui.d_entity );
6734                         }
6735                         else{
6736                                 gtk_widget_show( g_qeglobals_gui.d_entity );
6737                         }
6738                 }
6739                 else
6740                 {
6741                         gtk_widget_show( g_qeglobals_gui.d_entity );
6742                         SetInspectorMode( W_TEXTURE );
6743                 }
6744         }
6745 }
6746
6747 void MainFrame::OnPatchInspector(){
6748         TogglePatchInspector();
6749 }
6750
6751 void MainFrame::OnCurveNegativeTextureX(){
6752         Patch_InvertTexture( false );
6753         //Sys_UpdateWindows(W_ALL);
6754 }
6755
6756 void MainFrame::OnCurveNegativeTextureY(){
6757         Patch_InvertTexture( true );
6758         //Sys_UpdateWindows(W_ALL);
6759 }
6760
6761 void MainFrame::OnCurveInsertcolumn(){
6762         if ( &selected_brushes == selected_brushes.next ) {
6763                 return;
6764         }
6765         Undo_Start( "insert colum" );
6766         Undo_AddBrushList( &selected_brushes );
6767         //Patch_AdjustSelectedRowCols(0, 2);
6768         Patch_AdjustSelected( true, true, true );
6769         Sys_UpdateWindows( W_ALL );
6770         Undo_EndBrushList( &selected_brushes );
6771         Undo_End();
6772 }
6773
6774 void MainFrame::OnCurveInsertrow(){
6775         if ( &selected_brushes == selected_brushes.next ) {
6776                 return;
6777         }
6778         Undo_Start( "insert row" );
6779         Undo_AddBrushList( &selected_brushes );
6780         //Patch_AdjustSelectedRowCols(2, 0);
6781         Patch_AdjustSelected( true, false, true );
6782         Sys_UpdateWindows( W_ALL );
6783         Undo_EndBrushList( &selected_brushes );
6784         Undo_End();
6785 }
6786
6787 void MainFrame::OnCurveDeletecolumn(){
6788         if ( &selected_brushes == selected_brushes.next ) {
6789                 return;
6790         }
6791         Undo_Start( "delete column" );
6792         Undo_AddBrushList( &selected_brushes );
6793         Patch_AdjustSelected( false, true, true );
6794         Sys_UpdateWindows( W_ALL );
6795         Undo_EndBrushList( &selected_brushes );
6796         Undo_End();
6797 }
6798
6799 void MainFrame::OnCurveDeleterow(){
6800         if ( &selected_brushes == selected_brushes.next ) {
6801                 return;
6802         }
6803         Undo_Start( "delete row" );
6804         Undo_AddBrushList( &selected_brushes );
6805         Patch_AdjustSelected( false, false, true );
6806         Sys_UpdateWindows( W_ALL );
6807         Undo_EndBrushList( &selected_brushes );
6808         Undo_End();
6809 }
6810
6811 void MainFrame::OnPatchTab(){
6812         if ( g_bPatchBendMode ) {
6813                 Patch_BendHandleTAB();
6814         }
6815 //  else if (g_bPatchInsertMode)
6816 //    Patch_InsDelHandleTAB();
6817         else
6818         {
6819                 // check to see if the selected brush is part of a func group
6820                 // if it is, deselect everything and reselect the next brush
6821                 // in the group
6822                 brush_t *b2, *b = selected_brushes.next;
6823                 entity_t * e;
6824                 if ( b != &selected_brushes ) {
6825                         if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6826                                 e = b->owner;
6827                                 Select_Deselect();
6828                                 for ( b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext )
6829                                 {
6830                                         if ( b == b2 ) {
6831                                                 b2 = b2->onext;
6832                                                 break;
6833                                         }
6834                                 }
6835                                 if ( b2 == &e->brushes ) {
6836                                         b2 = b2->onext;
6837                                 }
6838
6839                                 Select_Brush( b2, false );
6840                                 Sys_UpdateWindows( W_ALL );
6841                         }
6842                 }
6843         }
6844 }
6845
6846 void MainFrame::OnSelectFuncGroup(){
6847         // check to see if the selected brush is part of a func group
6848         // if it is, deselect everything and reselect the next brush
6849         // in the group
6850         brush_t *b = selected_brushes.next;
6851         entity_t * e;
6852         if ( b != &selected_brushes ) {
6853                 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6854                         e = b->owner;
6855                         Select_SelectGroup( e );
6856                 }
6857         }
6858 }
6859
6860 void MainFrame::OnCameraForward( bool keydown ){
6861         if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6862                 if ( keydown ) {
6863                         VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6864                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6865                         Sys_UpdateWindows( nUpdate );
6866                 }
6867         }
6868         else {
6869                 if ( keydown ) {
6870                         m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
6871                 }
6872                 else{
6873                         m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
6874                 }
6875         }
6876 }
6877
6878 void MainFrame::OnCameraBack( bool keydown ){
6879         if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6880                 if ( keydown ) {
6881                         VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6882                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6883                         Sys_UpdateWindows( nUpdate );
6884                 }
6885         }
6886         else {
6887                 if ( keydown ) {
6888                         m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
6889                 }
6890                 else{
6891                         m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
6892                 }
6893         }
6894 }
6895
6896 void MainFrame::OnCameraLeft( bool keydown ){
6897         if ( m_pCamWnd ) {
6898                 if ( m_pCamWnd->m_bFreeMove ) {
6899                         OnCameraStrafeleft( keydown );
6900                         return;
6901                 }
6902         }
6903
6904         if ( g_PrefsDlg.m_bCamDiscrete ) {
6905                 if ( keydown ) {
6906                         m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
6907                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6908                         Sys_UpdateWindows( nUpdate );
6909                 }
6910         }
6911         else {
6912                 if ( keydown ) {
6913                         m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
6914                 }
6915                 else{
6916                         m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
6917                 }
6918         }
6919 }
6920
6921 void MainFrame::OnCameraRight( bool keydown ){
6922         if ( m_pCamWnd ) {
6923                 if ( m_pCamWnd->m_bFreeMove ) {
6924                         OnCameraStraferight( keydown );
6925                         return;
6926                 }
6927         }
6928
6929         if ( g_PrefsDlg.m_bCamDiscrete ) {
6930                 if ( keydown ) {
6931                         m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
6932                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6933                         Sys_UpdateWindows( nUpdate );
6934                 }
6935         }
6936         else {
6937                 if ( keydown ) {
6938                         m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
6939                 }
6940                 else{
6941                         m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
6942                 }
6943         }
6944 }
6945
6946 void MainFrame::OnCameraUp(){
6947         m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
6948         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6949         Sys_UpdateWindows( nUpdate );
6950 }
6951
6952 void MainFrame::OnCameraDown(){
6953         m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
6954         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6955         Sys_UpdateWindows( nUpdate );
6956 }
6957
6958 void MainFrame::OnCameraAngleup(){
6959         m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
6960         if ( m_pCamWnd->Camera()->angles[0] > 85 ) {
6961                 m_pCamWnd->Camera()->angles[0] = 85;
6962         }
6963         Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6964 }
6965
6966 void MainFrame::OnCameraAngledown(){
6967         m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
6968         if ( m_pCamWnd->Camera()->angles[0] < -85 ) {
6969                 m_pCamWnd->Camera()->angles[0] = -85;
6970         }
6971         Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6972 }
6973
6974 void MainFrame::OnCameraStrafeleft( bool keydown ){
6975         // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6976         if ( m_pCamWnd ) {
6977                 if ( !m_pCamWnd->m_bFreeMove ) {
6978                         if ( keydown ) {
6979                                 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
6980                                 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6981                                 Sys_UpdateWindows( nUpdate );
6982                         }
6983                         return;
6984                 }
6985         }
6986
6987         if ( keydown ) {
6988                 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
6989         }
6990         else{
6991                 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
6992         }
6993 }
6994
6995 void MainFrame::OnCameraStraferight( bool keydown ){
6996         // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6997         if ( m_pCamWnd ) {
6998                 if ( !m_pCamWnd->m_bFreeMove ) {
6999                         if ( keydown ) {
7000                                 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
7001                                 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
7002                                 Sys_UpdateWindows( nUpdate );
7003                         }
7004                         return;
7005                 }
7006         }
7007
7008         if ( keydown ) {
7009                 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7010         }
7011         else{
7012                 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7013         }
7014 }
7015
7016 void MainFrame::OnGridToggle(){
7017         g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7018         Sys_UpdateWindows( W_XY | W_Z );
7019 }
7020
7021 void MainFrame::OnViewCrosshair(){
7022         g_bCrossHairs ^= 1;
7023         Sys_UpdateWindows( W_XY );
7024 }
7025
7026 void MainFrame::OnSelectionTextureRotateclock(){
7027         Select_RotateTexture( abs( g_PrefsDlg.m_nRotation ) );
7028 }
7029
7030 void MainFrame::OnSelectionTextureRotatecounter(){
7031         Select_RotateTexture( -abs( g_PrefsDlg.m_nRotation ) );
7032 }
7033
7034 void MainFrame::OnSelectionTextureScaleup(){
7035         Select_ScaleTexture( 0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7036 }
7037
7038 void MainFrame::OnSelectionTextureScaledown(){
7039         Select_ScaleTexture( 0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7040 }
7041
7042 void MainFrame::OnSelectionTextureScaleLeft(){
7043         Select_ScaleTexture( -g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7044 }
7045
7046 void MainFrame::OnSelectionTextureScaleRight(){
7047         Select_ScaleTexture( g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7048 }
7049
7050 void MainFrame::OnSelectionTextureShiftleft(){
7051         Select_ShiftTexture( (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7052 }
7053
7054 void MainFrame::OnSelectionTextureShiftright(){
7055         Select_ShiftTexture( (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7056 }
7057
7058 void MainFrame::OnSelectionTextureShiftup(){
7059         Select_ShiftTexture( 0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7060 }
7061
7062 void MainFrame::OnSelectionTextureShiftdown(){
7063         Select_ShiftTexture( 0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7064 }
7065
7066 void MainFrame::OnGridPrev(){
7067         GtkWidget *item;
7068         if ( g_qeglobals.d_gridsize == 1 ) {
7069                 g_qeglobals.d_gridsize = 0.5;
7070                 g_qeglobals.d_bSmallGrid = true;
7071                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7072         }
7073         else if ( g_qeglobals.d_gridsize == 0.5 ) {
7074                 g_qeglobals.d_gridsize = 0.25;
7075                 g_qeglobals.d_bSmallGrid = true;
7076                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_025" ) );
7077         }
7078         else if ( g_qeglobals.d_gridsize > 1 ) {
7079                 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7080                 g_qeglobals.d_bSmallGrid = false;
7081
7082                 switch ( (int)g_qeglobals.d_gridsize )
7083                 {
7084                 case  1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7085                 case  2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7086                 case  4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7087                 case  8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7088                 case  16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7089                 case  32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7090                 case  64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7091                 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7092                 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7093                 }
7094
7095         }
7096         else{
7097                 return;
7098         }
7099
7100         // SnapTToGrid option: need to check everywhere the grid size is changed
7101         // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7102         if ( g_PrefsDlg.m_bSnapTToGrid ) {
7103                 DoSnapTToGrid();
7104         }
7105
7106         SetGridStatus();
7107         g_bIgnoreCommands++;
7108         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7109         g_bIgnoreCommands--;
7110
7111         Sys_UpdateWindows( W_XY | W_Z );
7112 }
7113
7114 void MainFrame::OnGridNext(){
7115         GtkWidget *item;
7116         if ( g_qeglobals.d_gridsize == 0.25 ) {
7117                 g_qeglobals.d_gridsize = 0.5;
7118                 g_qeglobals.d_bSmallGrid = true;
7119                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7120         }
7121         else if ( g_qeglobals.d_gridsize == 0.5 ) {
7122                 g_qeglobals.d_gridsize = 1;
7123                 g_qeglobals.d_bSmallGrid = false;
7124                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) );
7125         }
7126         else if ( g_qeglobals.d_gridsize < 256 ) {
7127                 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7128                 g_qeglobals.d_bSmallGrid = false;
7129
7130                 switch ( (int)g_qeglobals.d_gridsize )
7131                 {
7132                 case  1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7133                 case  2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7134                 case  4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7135                 case  8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7136                 case  16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7137                 case  32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7138                 case  64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7139                 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7140                 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7141                 default:  item = NULL;
7142                 }
7143
7144         }
7145         else{
7146                 return;
7147         }
7148
7149         // SnapTToGrid option: need to check everywhere the grid size is changed
7150         // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7151         if ( g_PrefsDlg.m_bSnapTToGrid ) {
7152                 DoSnapTToGrid();
7153         }
7154
7155         SetGridStatus();
7156         g_bIgnoreCommands++;
7157         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7158         g_bIgnoreCommands--;
7159
7160         Sys_UpdateWindows( W_XY | W_Z );
7161 }
7162
7163 void MainFrame::OnSelectionMovedown(){
7164         if ( &selected_brushes == selected_brushes.next ) {
7165                 return;
7166         }
7167         Undo_Start( "move down" );
7168         Undo_AddBrushList( &selected_brushes );
7169
7170         vec3_t vAmt;
7171         vAmt[0] = vAmt[1] = 0.0;
7172         vAmt[2] = -g_qeglobals.d_gridsize;
7173         Select_Move( vAmt );
7174         Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7175
7176         Undo_EndBrushList( &selected_brushes );
7177         Undo_End();
7178 }
7179
7180 void MainFrame::OnSelectionMoveup(){
7181         if ( &selected_brushes == selected_brushes.next ) {
7182                 return;
7183         }
7184         Undo_Start( "move up" );
7185         Undo_AddBrushList( &selected_brushes );
7186
7187         vec3_t vAmt;
7188         vAmt[0] = vAmt[1] = 0.0;
7189         vAmt[2] = g_qeglobals.d_gridsize;
7190         Select_Move( vAmt );
7191         Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7192
7193         Undo_EndBrushList( &selected_brushes );
7194         Undo_End();
7195 }
7196
7197 void MainFrame::OnSelectionPrint(){
7198         for ( brush_t* b = selected_brushes.next ; b != &selected_brushes ; b = b->next )
7199                 Brush_Print( b );
7200 }
7201
7202 void MainFrame::OnSelectionTogglesizepaint(){
7203         g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7204         Sys_UpdateWindows( W_XY );
7205 }
7206
7207 void MainFrame::OnPatchNaturalize(){
7208         Patch_NaturalizeSelected();
7209         Sys_UpdateWindows( W_ALL );
7210 }
7211
7212 void MainFrame::OnSnapToGrid(){
7213         if ( &selected_brushes == selected_brushes.next ) {
7214                 return;
7215         }
7216         Undo_Start( "snap selection to grid" );
7217         Undo_AddBrushList( &selected_brushes );
7218         //Select_SnapToGrid();
7219         for ( brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next )
7220         {
7221                 if ( pb->patchBrush ) {
7222                         Patch_SnapToGrid( pb->pPatch );
7223                 }
7224                 else{
7225                         Brush_SnapToGrid( pb );
7226                 }
7227         }
7228         Sys_UpdateWindows( W_ALL );
7229         Undo_EndBrushList( &selected_brushes );
7230         Undo_End();
7231 }
7232
7233 void MainFrame::OnSelectAll(){
7234         Select_AllOfType();
7235 }
7236
7237 void MainFrame::OnSelectionInvert(){
7238         Select_Invert();
7239         Sys_UpdateWindows( W_XY | W_Z | W_CAMERA );
7240 }
7241
7242
7243 void PerformFiltering(){
7244         brush_t *brush;
7245
7246         FilterUpdateBase();
7247
7248         for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7249                 brush->bFiltered = FilterBrush( brush );
7250
7251         for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7252                 brush->bFiltered = FilterBrush( brush );
7253 }
7254
7255 void MainFrame::OnFilterAreaportals(){
7256         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
7257         g_bIgnoreCommands++;
7258         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS ) & EXCLUDE_AREAPORTALS ) {
7259                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7260         }
7261         else{
7262                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7263         }
7264         g_bIgnoreCommands--;
7265         PerformFiltering();
7266         Sys_UpdateWindows( W_XY | W_CAMERA );
7267 }
7268
7269 void MainFrame::OnFilterCaulk(){
7270         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
7271         g_bIgnoreCommands++;
7272         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK ) & EXCLUDE_CAULK ) {
7273                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7274         }
7275         else{
7276                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7277         }
7278         g_bIgnoreCommands--;
7279         PerformFiltering();
7280         Sys_UpdateWindows( W_XY | W_CAMERA );
7281 }
7282
7283 void MainFrame::OnFilterClips(){
7284         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
7285         g_bIgnoreCommands++;
7286         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP ) {
7287                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7288         }
7289         else{
7290                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7291         }
7292         g_bIgnoreCommands--;
7293         PerformFiltering();
7294         Sys_UpdateWindows( W_XY | W_CAMERA );
7295 }
7296
7297 void MainFrame::OnFilterBotClips(){
7298         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
7299         g_bIgnoreCommands++;
7300         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP ) & EXCLUDE_BOTCLIP ) {
7301                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7302         }
7303         else{
7304                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7305         }
7306         g_bIgnoreCommands--;
7307         PerformFiltering();
7308         Sys_UpdateWindows( W_XY | W_CAMERA );
7309 }
7310
7311 void MainFrame::OnFilterStructural(){
7312         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
7313         g_bIgnoreCommands++;
7314         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL ) & EXCLUDE_STRUCTURAL ) {
7315                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7316         }
7317         else{
7318                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7319         }
7320         g_bIgnoreCommands--;
7321         PerformFiltering();
7322         Sys_UpdateWindows( W_XY | W_CAMERA );
7323 }
7324
7325 void MainFrame::OnFilterDetails(){
7326         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
7327         g_bIgnoreCommands++;
7328         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS ) & EXCLUDE_DETAILS ) {
7329                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7330         }
7331         else{
7332                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7333         }
7334         g_bIgnoreCommands--;
7335         PerformFiltering();
7336         Sys_UpdateWindows( W_XY | W_CAMERA );
7337 }
7338
7339 void MainFrame::OnFilterEntities(){
7340         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
7341         g_bIgnoreCommands++;
7342         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT ) {
7343                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7344         }
7345         else{
7346                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7347         }
7348         g_bIgnoreCommands--;
7349         PerformFiltering();
7350         Sys_UpdateWindows( W_XY | W_CAMERA );
7351 }
7352
7353 void MainFrame::OnFilterHintsskips(){
7354         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
7355         g_bIgnoreCommands++;
7356         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS ) & EXCLUDE_HINTSSKIPS ) {
7357                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7358         }
7359         else{
7360                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7361         }
7362         g_bIgnoreCommands--;
7363         PerformFiltering();
7364         Sys_UpdateWindows( W_XY | W_CAMERA );
7365 }
7366
7367 void MainFrame::OnFilterLights(){
7368         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
7369         g_bIgnoreCommands++;
7370         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS ) {
7371                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7372         }
7373         else{
7374                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7375         }
7376         g_bIgnoreCommands--;
7377         PerformFiltering();
7378         Sys_UpdateWindows( W_XY | W_CAMERA );
7379 }
7380
7381 void MainFrame::OnFilterLiquids(){
7382         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
7383         g_bIgnoreCommands++;
7384         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS ) & EXCLUDE_LIQUIDS ) {
7385                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7386         }
7387         else{
7388                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7389         }
7390         g_bIgnoreCommands--;
7391         PerformFiltering();
7392         Sys_UpdateWindows( W_XY | W_CAMERA );
7393 }
7394
7395 void MainFrame::OnFilterModels(){
7396         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
7397         g_bIgnoreCommands++;
7398         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS ) & EXCLUDE_MODELS ) {
7399                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7400         }
7401         else{
7402                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7403         }
7404         g_bIgnoreCommands--;
7405         PerformFiltering();
7406         Sys_UpdateWindows( W_XY | W_CAMERA );
7407 }
7408
7409 void MainFrame::OnFilterPatches(){
7410         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
7411         g_bIgnoreCommands++;
7412         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES ) & EXCLUDE_CURVES ) {
7413                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7414         }
7415         else{
7416                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7417         }
7418         g_bIgnoreCommands--;
7419         PerformFiltering();
7420         Sys_UpdateWindows( W_XY | W_CAMERA );
7421 }
7422
7423 void MainFrame::OnFilterPaths(){
7424         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
7425         g_bIgnoreCommands++;
7426         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS ) {
7427                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7428         }
7429         else{
7430                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7431         }
7432         g_bIgnoreCommands--;
7433         PerformFiltering();
7434         Sys_UpdateWindows( W_XY | W_CAMERA );
7435 }
7436
7437 void MainFrame::OnFilterClusterportals(){
7438         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
7439         g_bIgnoreCommands++;
7440         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS ) & EXCLUDE_CLUSTERPORTALS ) {
7441                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7442         }
7443         else{
7444                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7445         }
7446         g_bIgnoreCommands--;
7447         PerformFiltering();
7448         Sys_UpdateWindows( W_XY | W_CAMERA );
7449 }
7450
7451 void MainFrame::OnFilterLightgrid(){
7452         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
7453         g_bIgnoreCommands++;
7454         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID ) & EXCLUDE_LIGHTGRID ) {
7455                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7456         }
7457         else{
7458                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7459         }
7460         g_bIgnoreCommands--;
7461         PerformFiltering();
7462         Sys_UpdateWindows( W_XY | W_CAMERA );
7463 }
7464
7465 void MainFrame::OnFilterTranslucent(){
7466         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
7467         g_bIgnoreCommands++;
7468         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT ) & EXCLUDE_TRANSLUCENT ) {
7469                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7470         }
7471         else{
7472                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7473         }
7474         g_bIgnoreCommands--;
7475         PerformFiltering();
7476         Sys_UpdateWindows( W_XY | W_CAMERA );
7477 }
7478
7479 void MainFrame::OnFilterTriggers(){
7480         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
7481         g_bIgnoreCommands++;
7482         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS ) & EXCLUDE_TRIGGERS ) {
7483                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7484         }
7485         else{
7486                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7487         }
7488         g_bIgnoreCommands--;
7489         PerformFiltering();
7490         Sys_UpdateWindows( W_XY | W_CAMERA );
7491 }
7492
7493 void MainFrame::OnFilterWorld(){
7494         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
7495         g_bIgnoreCommands++;
7496         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD ) {
7497                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7498         }
7499         else{
7500                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7501         }
7502         g_bIgnoreCommands--;
7503         PerformFiltering();
7504         Sys_UpdateWindows( W_XY | W_CAMERA );
7505 }
7506
7507
7508
7509
7510
7511
7512
7513
7514 // =============================================================================
7515 // leo: Unused functions, not called anywhere from the code (need to check)
7516
7517 void MainFrame::OnViewConsole(){
7518         if ( FloatingGroupDialog() ) { // QE4 style
7519                 if ( inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating ) { // are we in console mode already?
7520                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
7521                                 widget_delete_hide( g_qeglobals_gui.d_entity );
7522                         }
7523                         else{
7524                                 gtk_widget_show( g_qeglobals_gui.d_entity );
7525                         }
7526                 }
7527                 else
7528                 {
7529                         gtk_widget_show( g_qeglobals_gui.d_entity );
7530                         SetInspectorMode( W_CONSOLE );
7531                 }
7532         }
7533 }
7534
7535 void MainFrame::OnCurveFreeze(){
7536         Patch_Freeze();
7537 }
7538
7539 void MainFrame::OnCurveUnFreeze(){
7540         Patch_UnFreeze( false );
7541 }
7542
7543 void MainFrame::OnCurveUnFreezeAll(){
7544         Patch_UnFreeze( true );
7545 }
7546
7547 void MainFrame::OnSelectReselect(){
7548         Select_Reselect();
7549 }
7550
7551 void MainFrame::OnSelectionTextureFit(){
7552         // TODO: Add your command handler code here
7553 }
7554
7555 void MainFrame::OnPatchEnter(){
7556
7557 }
7558
7559 void MainFrame::OnDropGroupAddtoWorld(){
7560         /*
7561            Select_AddToGroup("World");
7562            Sys_UpdateWindows (W_ALL);
7563          */
7564 }