]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/mainframe.cpp
Fixed spelling in a comment
[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         //if (mainframe->CurrentStyle() != MainFrame::eFloating)
2025         gtk_window_set_transient_for( GTK_WINDOW( wnd ), GTK_WINDOW( mainframe->m_pWidget ) );
2026         gtk_widget_set_events( wnd, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2027         gtk_signal_connect( GTK_OBJECT( wnd ), "delete_event", GTK_SIGNAL_FUNC( widget_delete_hide ), NULL );
2028         gtk_signal_connect( GTK_OBJECT( wnd ), "destroy", GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
2029         gtk_signal_connect( GTK_OBJECT( wnd ), "key_press_event",
2030                                                 GTK_SIGNAL_FUNC( mainframe_keypress ), mainframe );
2031         gtk_signal_connect( GTK_OBJECT( wnd ), "key_release_event",
2032                                                 GTK_SIGNAL_FUNC( mainframe_keyrelease ), mainframe );
2033         gtk_signal_connect( GTK_OBJECT( wnd ), "map_event",
2034                                                 GTK_SIGNAL_FUNC( mainframe_map ), mainframe );
2035
2036         gtk_window_set_default_size( GTK_WINDOW( wnd ), 100, 100 );
2037
2038 #ifdef DBG_WINDOWPOS
2039         Sys_Printf( "create_floating: %p, gtk_window_set_default_size 100, 100\n", wnd );
2040 #endif
2041
2042         return wnd;
2043 }
2044
2045 void console_populate_popup( GtkTextView* textview, GtkMenu* menu, gpointer user_data ){
2046         menu_separator( GTK_WIDGET( menu ) );
2047
2048         GtkWidget* item = gtk_menu_item_new_with_label( _( "Clear" ) );
2049         gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( Sys_ClearPrintf ), NULL );
2050         gtk_widget_show( item );
2051         gtk_menu_append( GTK_MENU( menu ), item );
2052 }
2053
2054 void console_construct( GtkWidget* textview ){
2055         g_signal_connect( G_OBJECT( textview ), "populate-popup", G_CALLBACK( console_populate_popup ), NULL );
2056 }
2057
2058 extern MemStream g_Clipboard;
2059
2060 void Clipboard_CopyMap(){
2061         g_Clipboard.SetLength( 0 );
2062         Map_Export( &g_Clipboard, "xmap", false, true );
2063 }
2064
2065 void Clipboard_PasteMap(){
2066         if ( g_Clipboard.GetLength() > 0 ) {
2067                 g_Clipboard.Seek( 0, SEEK_SET );
2068                 Map_Import( &g_Clipboard, "xmap", true );
2069         }
2070 }
2071
2072 /*!
2073    Platform-independent GTK clipboard support.
2074    \todo Using GDK_SELECTION_CLIPBOARD fails on win32, so we use the win32 API directly for now.
2075  */
2076 #if defined ( __linux__ ) || defined ( __APPLE__ )
2077
2078 enum
2079 {
2080         RADIANT_CLIPPINGS = 23,
2081 };
2082
2083 static const GtkTargetEntry clipboard_targets[] = {
2084         { "RADIANT_CLIPPINGS", 0, RADIANT_CLIPPINGS, },
2085 };
2086
2087 static void clipboard_get( GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer user_data_or_owner ){
2088         guchar *buffer;
2089         gint len;
2090         GdkAtom type = GDK_NONE;
2091
2092         len = g_Clipboard.GetLength();
2093
2094         if ( !len ) {
2095                 buffer = NULL;
2096         }
2097         else
2098         {
2099                 buffer = g_Clipboard.GetBuffer();
2100         }
2101
2102         if ( info == clipboard_targets[0].info ) {
2103                 type = gdk_atom_intern( clipboard_targets[0].target, FALSE );
2104         }
2105
2106         gtk_selection_data_set( selection_data, type, 8, buffer, len );
2107 }
2108
2109 static void clipboard_clear( GtkClipboard *clipboard, gpointer user_data_or_owner ){
2110 }
2111
2112 static void clipboard_received( GtkClipboard *clipboard, GtkSelectionData *data, gpointer user_data ){
2113         g_Clipboard.SetLength( 0 );
2114
2115         if ( data->length < 0 ) {
2116                 Sys_FPrintf( SYS_ERR, "Error retrieving selection\n" );
2117         }
2118         else if ( strcmp( gdk_atom_name( data->type ), clipboard_targets[0].target ) == 0 ) {
2119                 g_Clipboard.Write( data->data, data->length );
2120         }
2121
2122         Clipboard_PasteMap();
2123 }
2124
2125 void clipboard_copy(){
2126         Clipboard_CopyMap();
2127
2128         GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2129
2130         gtk_clipboard_set_with_data( clipboard, clipboard_targets, 1, clipboard_get, clipboard_clear, NULL );
2131 }
2132
2133 void clipboard_paste(){
2134         GtkClipboard* clipboard = gtk_clipboard_get( GDK_SELECTION_CLIPBOARD );
2135
2136         gtk_clipboard_request_contents( clipboard, gdk_atom_intern( clipboard_targets[0].target, FALSE ), clipboard_received, NULL );
2137 }
2138
2139
2140 #elif defined( WIN32 )
2141
2142 void clipboard_copy(){
2143         Clipboard_CopyMap();
2144
2145         bool bClipped = false;
2146         UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2147         if ( nClipboard > 0 ) {
2148                 if ( ::OpenClipboard( NULL ) ) {
2149                         EmptyClipboard();
2150                         long lSize = g_Clipboard.GetLength();
2151                         HANDLE h = ::GlobalAlloc( GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, lSize + sizeof( long ) );
2152                         if ( h != NULL ) {
2153                                 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2154                                 memcpy( cp, &lSize, sizeof( long ) );
2155                                 cp += sizeof( long );
2156                                 g_Clipboard.Seek( 0, SEEK_SET );
2157                                 g_Clipboard.Read( cp, lSize );
2158                                 ::GlobalUnlock( h );
2159                                 ::SetClipboardData( nClipboard, h );
2160                                 ::CloseClipboard();
2161                                 bClipped = true;
2162                         }
2163                 }
2164         }
2165
2166         if ( !bClipped ) {
2167                 Sys_Printf( "Unable to register Windows clipboard formats, copy/paste between editors will not be possible\n" );
2168         }
2169 }
2170
2171 void clipboard_paste(){
2172         bool bPasted = false;
2173         UINT nClipboard = ::RegisterClipboardFormat( "RadiantClippings" );
2174         if ( nClipboard > 0 && ::OpenClipboard( NULL ) ) {
2175                 if ( IsClipboardFormatAvailable( nClipboard ) ) {
2176                         HANDLE h = ::GetClipboardData( nClipboard );
2177                         if ( h ) {
2178                                 g_Clipboard.SetLength( 0 );
2179                                 unsigned char *cp = reinterpret_cast<unsigned char*>( ::GlobalLock( h ) );
2180                                 long lSize = 0;
2181                                 memcpy( &lSize, cp, sizeof( long ) );
2182                                 cp += sizeof( long );
2183                                 g_Clipboard.Write( cp, lSize );
2184                                 ::GlobalUnlock( h );
2185                         }
2186                 }
2187                 ::CloseClipboard();
2188         }
2189
2190         Clipboard_PasteMap();
2191 }
2192
2193 #endif
2194
2195 void MainFrame::Copy(){
2196         clipboard_copy();
2197 }
2198
2199 void MainFrame::Paste(){
2200         clipboard_paste();
2201         UpdateSurfaceDialog();
2202 }
2203
2204
2205 #ifdef DBG_WINDOWPOS
2206 GtkWidget *watchit = NULL;
2207
2208 void CheckWatchit( char *msg ){
2209         static int width = 0;
2210         if ( ( watchit != NULL ) && ( watchit->allocation.width != width ) ) {
2211                 Sys_Printf( "CheckWatchit %s: %d\n", msg, watchit->allocation.width );
2212                 width = watchit->allocation.width;
2213         }
2214 }
2215 #endif
2216
2217 #ifdef _WIN32
2218 BOOL CALLBACK m_pCountMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2219         int *n = (int *) dwData;
2220
2221         ( *n )++;
2222
2223         return TRUE;
2224 }
2225
2226 struct monitorInfo_s {
2227         GdkRectangle *win_monitors;
2228         int i_win_mon;
2229 };
2230
2231 BOOL CALLBACK m_pEnumMonitor( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData ){
2232         monitorInfo_s *monitorInfo = (monitorInfo_s *) dwData;
2233         GdkRectangle *monitor;
2234         MONITORINFOEX lpmi;
2235
2236         monitor = monitorInfo->win_monitors + monitorInfo->i_win_mon;
2237
2238         memset( &lpmi, 0, sizeof( MONITORINFOEX ) );
2239         lpmi.cbSize = sizeof( MONITORINFOEX );
2240
2241         GetMonitorInfo( hMonitor, &lpmi );
2242
2243         if ( lpmi.dwFlags & MONITORINFOF_PRIMARY ) {
2244                 RECT rect;
2245
2246                 SystemParametersInfo( SPI_GETWORKAREA, 0, &rect, 0 );
2247                 monitor->x = rect.left;
2248                 monitor->y = rect.top;
2249                 monitor->width = rect.right - rect.left;
2250                 monitor->height = rect.bottom - rect.top;
2251
2252                 if ( monitorInfo->i_win_mon != 0 ) {
2253                         GdkRectangle temp = *monitor;
2254                         *monitor = monitorInfo->win_monitors[0];
2255                         monitorInfo->win_monitors[0] = temp;
2256                 }
2257         }
2258         else {
2259                 monitor->x = lpmi.rcMonitor.left;
2260                 monitor->y = lpmi.rcMonitor.top;
2261                 monitor->width = lpmi.rcMonitor.right - lpmi.rcMonitor.left;
2262                 monitor->height = lpmi.rcMonitor.bottom - lpmi.rcMonitor.top;
2263         }
2264
2265         monitorInfo->i_win_mon++;
2266
2267         return TRUE;
2268 }
2269
2270 void PositionWindowOnPrimaryScreen( window_position_t& position ){
2271         const GdkRectangle primaryMonitorRect = g_pParentWnd->GetPrimaryMonitorRect();
2272
2273         if ( position.x <= primaryMonitorRect.x + 6 ) {
2274                 position.x = primaryMonitorRect.x + 6;
2275         }
2276         else if ( position.x >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 6 ) {
2277                 position.x = primaryMonitorRect.x + 6;
2278         }
2279
2280         if ( position.y <= primaryMonitorRect.y + 6 ) {
2281                 position.y = primaryMonitorRect.y + 6;
2282         }
2283         else if ( position.y >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 6 ) {
2284                 position.y = primaryMonitorRect.y + 6;
2285         }
2286
2287         if ( position.x + position.w >= ( primaryMonitorRect.x + primaryMonitorRect.width ) - 18 ) {
2288                 position.w = primaryMonitorRect.width - 18;
2289         }
2290         if ( position.y + position.h >= ( primaryMonitorRect.y + primaryMonitorRect.height ) - 18 ) {
2291                 position.h = primaryMonitorRect.height - 18;
2292         }
2293 }
2294 #endif
2295
2296 GtkWidget* create_framed_widget( GtkWidget* widget ){
2297         GtkWidget* frame = gtk_frame_new( (char*)NULL );
2298         gtk_widget_show( frame );
2299         gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2300         gtk_container_add( GTK_CONTAINER( frame ), widget );
2301         gtk_widget_show( widget );
2302         return frame;
2303 }
2304
2305 gboolean entry_focus_in( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2306         gtk_window_remove_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2307         return FALSE;
2308 }
2309
2310 gboolean entry_focus_out( GtkWidget *widget, GdkEventFocus *event, gpointer user_data ){
2311         gtk_window_add_accel_group( GTK_WINDOW( g_pParentWnd->m_pWidget ), global_accel );
2312         return FALSE;
2313 }
2314
2315 GtkWidget* create_framed_texwnd( TexWnd* texwnd ){
2316         GtkWidget* frame = gtk_frame_new( (char*)NULL );
2317         gtk_widget_show( frame );
2318         gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_IN );
2319
2320         GtkWidget* hbox = gtk_hbox_new( FALSE, 0 );
2321         gtk_widget_show( hbox );
2322         gtk_container_add( GTK_CONTAINER( frame ), hbox );
2323
2324         GtkWidget* w = gtk_vscrollbar_new( GTK_ADJUSTMENT( gtk_adjustment_new( 0,0,0,1,1,1 ) ) );
2325         gtk_widget_show( w );
2326         gtk_box_pack_end( GTK_BOX( hbox ), w, FALSE, TRUE, 0 );
2327         g_qeglobals_gui.d_texture_scroll = w;
2328
2329         GtkWidget* texbox = gtk_vbox_new( FALSE, 0 );
2330         gtk_widget_show( texbox );
2331         gtk_box_pack_start( GTK_BOX( hbox ), texbox, TRUE, TRUE, 0 );
2332
2333         w = gtk_entry_new();
2334         gtk_box_pack_start( GTK_BOX( texbox ), w, FALSE, FALSE, 0 );
2335         texwnd->m_pFilter = w;
2336         g_signal_connect( G_OBJECT( w ), "focus_in_event", G_CALLBACK( entry_focus_in ), NULL );
2337         g_signal_connect( G_OBJECT( w ), "focus_out_event", G_CALLBACK( entry_focus_out ), NULL );
2338
2339         w = texwnd->GetWidget();
2340         gtk_box_pack_start( GTK_BOX( texbox ), w, TRUE, TRUE, 0 );
2341         gtk_widget_show( w );
2342
2343         return frame;
2344 }
2345
2346 static ZWnd *create_floating_zwnd( MainFrame *mainframe ){
2347         ZWnd *pZWnd = new ZWnd();
2348         GtkWidget* wnd = create_floating( mainframe );
2349
2350         gtk_window_set_title( GTK_WINDOW( wnd ), "Z" );
2351
2352         pZWnd->m_pParent = wnd;
2353
2354         {
2355                 GtkWidget* frame = create_framed_widget( pZWnd->GetWidget() );
2356                 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2357         }
2358
2359         gtk_widget_realize( wnd );
2360
2361         // turn OFF minimize and maximize boxes.
2362         // Must be *after* realize, or wnd->window is NULL
2363         // should do the right thing on *nix, need to verify.
2364         gdk_window_set_decorations( wnd->window,
2365                                                                 GdkWMDecoration( GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE ) );
2366         //TODO 50 by observation, will vary depending on decoration sizes
2367         {
2368                 GdkGeometry geometry;
2369                 geometry.min_width = 50;
2370                 //we only care about width, but have to set this too, or get nasty bugs
2371                 geometry.min_height = 10;
2372                 gdk_window_set_geometry_hints( wnd->window,&geometry,GDK_HINT_MIN_SIZE );
2373         }
2374
2375 #ifdef _WIN32
2376         if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2377                 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posZWnd );
2378         }
2379 #endif
2380         load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posZWnd );
2381
2382         if ( g_PrefsDlg.m_bZVis ) {
2383                 gtk_widget_show( wnd );
2384         }
2385
2386         return pZWnd;
2387 }
2388
2389 static const int gutter = 12;
2390
2391 void MainFrame::Create(){
2392         GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
2393         m_pWidget = window;
2394         gtk_widget_set_events( window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK );
2395         gtk_signal_connect( GTK_OBJECT( window ), "delete_event",
2396                                                 GTK_SIGNAL_FUNC( mainframe_delete ), this );
2397         gtk_signal_connect( GTK_OBJECT( window ), "destroy",
2398                                                 GTK_SIGNAL_FUNC( mainframe_destroy ), this );
2399         gtk_signal_connect( GTK_OBJECT( window ), "key_press_event",
2400                                                 GTK_SIGNAL_FUNC( mainframe_keypress ), this );
2401         gtk_signal_connect( GTK_OBJECT( window ), "key_release_event",
2402                                                 GTK_SIGNAL_FUNC( mainframe_keyrelease ), this );
2403         gtk_signal_connect( GTK_OBJECT( window ), "map_event",
2404                                                 GTK_SIGNAL_FUNC( mainframe_map ), this );
2405         gtk_signal_connect( GTK_OBJECT( window ), "unmap_event",
2406                                                 GTK_SIGNAL_FUNC( mainframe_unmap ), this );
2407
2408         g_qeglobals_gui.d_main_window = window;
2409
2410 #ifdef _WIN32
2411         // calculate gdk offset
2412         int n_win_monitors = 0;
2413
2414         monitorInfo_s monitorInfo;
2415
2416         // detect multiple monitors
2417         EnumDisplayMonitors( NULL, NULL, m_pCountMonitor, reinterpret_cast<LPARAM>( &n_win_monitors ) );
2418
2419         monitorInfo.win_monitors = new GdkRectangle [ n_win_monitors ];
2420         monitorInfo.i_win_mon = 0;
2421         EnumDisplayMonitors( NULL, NULL, m_pEnumMonitor, reinterpret_cast<LPARAM>( &monitorInfo ) );
2422
2423         gdk_offset_x = G_MININT;
2424         gdk_offset_y = G_MININT;
2425
2426         // calculate offset
2427         for ( monitorInfo.i_win_mon = 0; monitorInfo.i_win_mon < n_win_monitors; monitorInfo.i_win_mon++ ) {
2428                 gdk_offset_x = MAX( gdk_offset_x, -monitorInfo.win_monitors[monitorInfo.i_win_mon].x );
2429                 gdk_offset_y = MAX( gdk_offset_y, -monitorInfo.win_monitors[monitorInfo.i_win_mon].y );
2430         }
2431
2432         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 );
2433
2434         if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2435                 // get gdk monitors
2436                 GdkDisplay *display;
2437                 GdkScreen *screen;
2438                 gint n_gdk_monitors = 0;
2439                 gint i_mon;
2440                 GdkRectangle rect;
2441
2442                 // detect multiple monitors
2443                 display = gdk_display_get_default();
2444                 Sys_Printf( "GDK detects that server %s manages %d screens\n", gdk_display_get_name( display ), gdk_display_get_n_screens( display ) );
2445
2446                 screen = gdk_display_get_screen( display, 1 );
2447                 n_gdk_monitors = gdk_screen_get_n_monitors( screen );
2448
2449                 Sys_Printf( "GDK detects that screen 1 has %d monitors\n", n_gdk_monitors );
2450
2451                 for ( i_mon = 0; i_mon < n_gdk_monitors; i_mon++ ) {
2452                         memset( &rect, 0, sizeof( rect ) );
2453                         gdk_screen_get_monitor_geometry( screen, i_mon, &rect );
2454                         Sys_Printf( "  monitor %d: x: %d y: %d w: %d h: %d\n", i_mon, rect.x, rect.y, rect.width, rect.height );
2455
2456                         if ( i_mon == 0 ) {
2457                                 memcpy( &primaryMonitorRect, &rect, sizeof( primaryMonitorRect ) );
2458                         }
2459                 }
2460
2461                 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.position );
2462         }
2463         else {
2464                 primaryMonitorRect.x = primaryMonitorRect.y = 0;
2465                 primaryMonitorRect.width = gdk_screen_width();
2466                 primaryMonitorRect.height = gdk_screen_height();
2467         }
2468
2469 #endif
2470
2471         load_window_pos( window, g_PrefsDlg.mWindowInfo.position );
2472
2473         GtkWidget* vbox = gtk_vbox_new( FALSE, 0 );
2474         gtk_container_add( GTK_CONTAINER( window ), vbox );
2475         gtk_widget_show( vbox );
2476
2477         create_main_menu( window, vbox );
2478         MRU_Load();
2479         create_main_toolbar( window, vbox );
2480         create_plugin_toolbar( window,vbox );
2481
2482         m_nCurrentStyle = g_PrefsDlg.m_nView;
2483
2484         g_pGroupDlg->Create();
2485         OnPluginsRefresh();
2486
2487         CreateQEChildren();
2488
2489         gtk_widget_show( window );
2490
2491         // not needed on win32, it's in the .rc
2492 #ifndef _WIN32
2493         {
2494                 GdkPixmap *pixmap;
2495                 GdkBitmap *mask;
2496                 load_pixmap( "icon.bmp", window, &pixmap, &mask );
2497                 gdk_window_set_icon( window->window, NULL, pixmap, mask );
2498         }
2499 #endif
2500
2501         if ( CurrentStyle() == eRegular || CurrentStyle() == eRegularLeft ) {
2502                 {
2503                         GtkWidget* vsplit = gtk_vpaned_new();
2504                         m_pSplits[0] = vsplit;
2505                         gtk_box_pack_start( GTK_BOX( vbox ), vsplit, TRUE, TRUE, 0 );
2506                         gtk_widget_show( vsplit );
2507
2508                         {
2509                                 GtkWidget* hsplit = gtk_hpaned_new();
2510                                 m_pSplits[2] = hsplit;
2511                                 gtk_paned_add1( GTK_PANED( vsplit ), hsplit );
2512                                 gtk_widget_show( hsplit );
2513
2514                                 {
2515                                         GtkWidget* hsplit2 = gtk_hpaned_new();
2516                                         m_pSplits[3] = hsplit2;
2517                                         gtk_paned_add2( GTK_PANED( hsplit ), hsplit2 );
2518                                         gtk_widget_show( hsplit2 );
2519
2520                                         {
2521                                                 GtkWidget* vsplit2 = gtk_vpaned_new();
2522                                                 m_pSplits[1] = vsplit2;
2523                                                 if ( CurrentStyle() == eRegular ) {
2524                                                         gtk_paned_add2( GTK_PANED( hsplit2 ), vsplit2 );
2525                                                 }
2526                                                 else{
2527                                                         gtk_paned_add1( GTK_PANED( hsplit ), vsplit2 );
2528                                                 }
2529                                                 gtk_widget_show( vsplit2 );
2530
2531                                                 // camera
2532                                                 m_pCamWnd = new CamWnd();
2533                                                 {
2534                                                         GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2535                                                         gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2536                                                 }
2537
2538                                                 // xy
2539                                                 m_pXYWnd = new XYWnd();
2540                                                 m_pXYWnd->SetViewType( XY );
2541                                                 {
2542                                                         GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2543                                                         gtk_paned_add1( GTK_PANED( hsplit2 ), frame );
2544                                                 }
2545
2546                                                 // z
2547                                                 m_pZWnd = new ZWnd();
2548                                                 {
2549                                                         GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2550                                                         if ( CurrentStyle() == eRegular ) {
2551                                                                 gtk_paned_add1( GTK_PANED( hsplit ), frame );
2552                                                         }
2553                                                         else{
2554                                                                 gtk_paned_add2( GTK_PANED( hsplit2 ), frame );
2555                                                         }
2556                                                 }
2557
2558                                                 // textures
2559                                                 m_pTexWnd = new TexWnd();
2560                                                 {
2561                                                         GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2562                                                         gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2563                                                 }
2564
2565                                                 // console
2566                                                 {
2567                                                         GtkWidget* scr = gtk_scrolled_window_new( NULL, NULL );
2568                                                         gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
2569                                                         gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
2570                                                         gtk_widget_show( scr );
2571                                                         gtk_paned_pack2( GTK_PANED( vsplit ), scr, FALSE, TRUE );
2572
2573                                                         {
2574                                                                 GtkWidget* text = gtk_text_view_new();
2575                                                                 gtk_widget_set_size_request( text, 0, -1 ); // allow shrinking
2576                                                                 gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( text ), GTK_WRAP_WORD );
2577                                                                 gtk_text_view_set_editable( GTK_TEXT_VIEW( text ), FALSE );
2578                                                                 gtk_container_add( GTK_CONTAINER( scr ), text );
2579                                                                 gtk_widget_show( text );
2580                                                                 g_qeglobals_gui.d_edit = text;
2581                                                         }
2582                                                 }
2583                                         }
2584                                 }
2585                         }
2586                 }
2587
2588                 gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nXYHeight + 28 );
2589
2590                 if ( CurrentStyle() == eRegular ) {
2591                         gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nZWidth );
2592                         gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2593                 }
2594                 else
2595                 {
2596                         gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), g_PrefsDlg.mWindowInfo.nCamWidth );
2597                         while ( gtk_events_pending() ) gtk_main_iteration();
2598                         gtk_paned_set_position( GTK_PANED( m_pSplits[3] ), g_PrefsDlg.mWindowInfo.nXYWidth );
2599                 }
2600
2601                 while ( gtk_events_pending() ) gtk_main_iteration();
2602
2603                 gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), g_PrefsDlg.mWindowInfo.nCamHeight );
2604         }
2605         else if ( CurrentStyle() == eFloating ) {
2606                 {
2607                         GtkWidget* wnd = create_floating( this );
2608                         gtk_window_set_title( GTK_WINDOW( wnd ), "Camera" );
2609
2610 #ifdef _WIN32
2611                         if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2612                                 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posCamWnd );
2613                         }
2614 #endif
2615                         load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posCamWnd );
2616
2617                         gtk_widget_show( wnd );
2618
2619                         m_pCamWnd = new CamWnd();
2620
2621                         {
2622                                 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2623                                 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2624                         }
2625
2626                         m_pCamWnd->m_pParent = wnd;
2627                 }
2628
2629                 if ( g_PrefsDlg.m_bFloatingZ ) {
2630                         m_pZWnd = create_floating_zwnd( this );
2631
2632                         {
2633                                 GtkWidget* wnd = create_floating( this );
2634                                 gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2635
2636 #ifdef _WIN32
2637                                 if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2638                                         PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2639                                 }
2640 #endif
2641                                 load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2642
2643                                 m_pXYWnd = new XYWnd();
2644                                 m_pXYWnd->SetViewType( XY );
2645
2646                                 {
2647                                         GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2648                                         gtk_container_add( GTK_CONTAINER( wnd ), frame );
2649                                 }
2650
2651                                 m_pXYWnd->m_pParent = wnd;
2652
2653                                 gtk_widget_show( wnd );
2654                         }
2655                 }
2656                 else
2657                 {
2658                         GtkWidget* wnd = create_floating( this );
2659                         gtk_window_set_title( GTK_WINDOW( wnd ), "XY View" );
2660
2661 #ifdef _WIN32
2662                         if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2663                                 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXYWnd );
2664                         }
2665 #endif
2666                         load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXYWnd );
2667
2668                         m_pZWnd = new ZWnd();
2669                         m_pZWnd->m_pParent = wnd;
2670
2671                         m_pXYWnd = new XYWnd();
2672                         m_pXYWnd->SetViewType( XY );
2673                         m_pXYWnd->m_pParent = wnd;
2674
2675
2676                         {
2677                                 GtkWidget* hsplit = gtk_hpaned_new();
2678                                 m_pSplits[0] = hsplit;
2679                                 gtk_container_add( GTK_CONTAINER( wnd ), hsplit );
2680                                 gtk_widget_show( hsplit );
2681
2682                                 {
2683                                         GtkWidget* frame = create_framed_widget( m_pZWnd->GetWidget() );
2684                                         gtk_paned_add1( GTK_PANED( hsplit ), frame );
2685                                 }
2686                                 {
2687                                         GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2688                                         gtk_paned_add2( GTK_PANED( hsplit ), frame );
2689                                 }
2690                         }
2691
2692                         gtk_widget_show( wnd );
2693
2694                         gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), g_PrefsDlg.mWindowInfo.nZFloatWidth );
2695                 }
2696
2697                 {
2698                         GtkWidget* wnd = create_floating( this );
2699                         gtk_window_set_title( GTK_WINDOW( wnd ), _( "XZ View" ) );
2700
2701 #ifdef _WIN32
2702                         if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2703                                 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posXZWnd );
2704                         }
2705 #endif
2706                         load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posXZWnd );
2707
2708                         m_pXZWnd = new XYWnd();
2709                         m_pXZWnd->m_pParent = wnd;
2710                         m_pXZWnd->SetViewType( XZ );
2711
2712                         {
2713                                 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2714                                 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2715                         }
2716
2717                         if ( g_PrefsDlg.m_bXZVis ) {
2718                                 gtk_widget_show( wnd );
2719                         }
2720                 }
2721
2722                 {
2723                         GtkWidget* wnd = create_floating( this );
2724                         gtk_window_set_title( GTK_WINDOW( wnd ), _( "YZ View" ) );
2725
2726 #ifdef _WIN32
2727                         if ( g_PrefsDlg.m_bStartOnPrimMon ) {
2728                                 PositionWindowOnPrimaryScreen( g_PrefsDlg.mWindowInfo.posYZWnd );
2729                         }
2730 #endif
2731                         load_window_pos( wnd, g_PrefsDlg.mWindowInfo.posYZWnd );
2732
2733                         m_pYZWnd = new XYWnd();
2734                         m_pYZWnd->m_pParent = wnd;
2735                         m_pYZWnd->SetViewType( YZ );
2736
2737                         {
2738                                 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2739                                 gtk_container_add( GTK_CONTAINER( wnd ), frame );
2740                         }
2741
2742                         if ( g_PrefsDlg.m_bYZVis ) {
2743                                 gtk_widget_show( wnd );
2744                         }
2745                 }
2746
2747                 m_pTexWnd = new TexWnd();
2748                 {
2749                         GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2750                         m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2751
2752                         {
2753                                 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2754                                 gtk_widget_show( w );
2755                                 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2756                         }
2757                 }
2758
2759                 g_pGroupDlg->Show();
2760         }
2761         else // 4 way
2762         {
2763                 {
2764                         GtkWidget* hsplit = gtk_hpaned_new();
2765                         m_pSplits[0] = hsplit;
2766                         gtk_box_pack_start( GTK_BOX( vbox ), hsplit, TRUE, TRUE, 0 );
2767                         gtk_widget_show( hsplit );
2768
2769                         {
2770                                 GtkWidget* vsplit1 = gtk_vpaned_new();
2771                                 m_pSplits[1] = vsplit1;
2772                                 gtk_paned_add1( GTK_PANED( hsplit ), vsplit1 );
2773                                 gtk_widget_show( vsplit1 );
2774
2775                                 {
2776                                         GtkWidget* vsplit2 = gtk_vpaned_new();
2777                                         m_pSplits[2] = vsplit2;
2778                                         gtk_paned_add2( GTK_PANED( hsplit ), vsplit2 );
2779                                         gtk_widget_show( vsplit2 );
2780
2781                                         m_pCamWnd = new CamWnd();
2782                                         {
2783                                                 GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
2784                                                 gtk_paned_add1( GTK_PANED( vsplit1 ), frame );
2785                                         }
2786
2787                                         m_pXYWnd = new XYWnd();
2788                                         m_pXYWnd->SetViewType( XY );
2789                                         {
2790                                                 GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
2791                                                 gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
2792                                         }
2793
2794                                         m_pYZWnd = new XYWnd();
2795                                         m_pYZWnd->SetViewType( YZ );
2796                                         {
2797                                                 GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
2798                                                 gtk_paned_add2( GTK_PANED( vsplit1 ), frame );
2799                                         }
2800
2801                                         m_pXZWnd = new XYWnd();
2802                                         m_pXZWnd->SetViewType( XZ );
2803                                         {
2804                                                 GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
2805                                                 gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
2806                                         }
2807                                 }
2808                         }
2809                 }
2810
2811                 //    g_qeglobals_gui.d_edit = NULL;
2812
2813                 {
2814                         m_pTexWnd = new TexWnd();
2815                         GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
2816
2817                         {
2818                                 GtkWidget* w = gtk_label_new( _( "Textures" ) );
2819                                 gtk_widget_show( w );
2820                                 gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
2821                         }
2822                 }
2823
2824                 m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
2825 //    gtk_widget_realize (m_pTexWnd->GetWidget ());
2826                 m_pZWnd = create_floating_zwnd( this );
2827
2828                 while ( gtk_events_pending() )
2829                         gtk_main_iteration();
2830
2831                 {
2832                         int x = GTK_PANED( m_pSplits[0] )->max_position / 2 - gutter;
2833                         gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), x );
2834                 }
2835
2836                 {
2837                         int y = GTK_PANED( m_pSplits[1] )->max_position / 2 - gutter;
2838                         gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), y );
2839                         gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), y );
2840                 }
2841         }
2842
2843         if ( g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED ) {
2844                 gtk_window_maximize( GTK_WINDOW( window ) );
2845         }
2846
2847         gtk_widget_show( window );
2848
2849         Texture_Init();
2850
2851         if ( m_pXYWnd ) { // this is always true?
2852                 m_pXYWnd->SetActive( true );
2853         }
2854         m_bSplittersOK = true;
2855         Texture_SetMode( g_qeglobals.d_savedinfo.iTexMenu );
2856
2857         g_pParentWnd->OnEntitiesSetViewAs( 0 );
2858
2859 //  m_wndTextureBar.Create (vbox);
2860         create_main_statusbar( window, vbox );
2861
2862         LoadCommandMap();
2863         ShowMenuItemKeyBindings( window );
2864
2865         if ( g_qeglobals_gui.d_edit != NULL ) {
2866                 console_construct( g_qeglobals_gui.d_edit );
2867         }
2868
2869         //  bool load_last = FALSE;
2870
2871         SetGridStatus();
2872         SetButtonMenuStates();
2873
2874         // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
2875         GtkWidget *item;
2876         g_bIgnoreCommands++;
2877         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
2878         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
2879         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaderlistonly" ) );
2880         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
2881         g_bIgnoreCommands--;
2882
2883 //  if (g_PrefsDlg.m_bTextureBar)
2884 //    gtk_widget_show (m_wndTextureBar.m_pWidget);
2885
2886         SetActiveXY( m_pXYWnd );
2887
2888         s_idle_id = gtk_timeout_add( 25, mainframe_idle, this );
2889
2890         QGL_InitExtensions();
2891
2892         if ( g_PrefsDlg.mLocalPrefs.mbEmpty ) {
2893                 g_PrefsDlg.mLocalPrefs.mbEmpty = false;
2894                 g_PrefsDlg.SavePrefs();
2895         }
2896
2897         // remove the pid file
2898         remove( g_pidGameFile.GetBuffer() );
2899
2900         Sys_Printf( "Entering message loop\n" );
2901
2902         m_bDoLoop = true;
2903
2904         m_nTimer = gtk_timeout_add( 1000, timer, this );
2905 }
2906
2907 // =============================================================================
2908 // MainFrame class
2909
2910 MainFrame::MainFrame(){
2911         m_bDoLoop = false;
2912         m_bSplittersOK = false;
2913         g_pParentWnd = this;
2914         m_pXYWnd = (XYWnd*)NULL;
2915         m_pCamWnd = NULL;
2916         m_pTexWnd = (TexWnd*)NULL;
2917         m_pZWnd = (ZWnd*)NULL;
2918         m_pYZWnd = (XYWnd*)NULL;
2919         m_pXZWnd = (XYWnd*)NULL;
2920         m_pActiveXY = (XYWnd*)NULL;
2921         m_bCamPreview = true;
2922         m_pWatchBSP = NULL;
2923         for ( int n = 0; n < 6; n++ )
2924                 m_pStatusLabel[n] = NULL;
2925         m_bNeedStatusUpdate = false;
2926         m_nTimer = 0;
2927         m_bSleeping = false;
2928         Create();
2929 }
2930
2931 MainFrame::~MainFrame(){
2932         while ( g_BSPFrontendCommands )
2933         {
2934                 free( g_BSPFrontendCommands->data );
2935                 g_BSPFrontendCommands = g_slist_remove( g_BSPFrontendCommands, g_BSPFrontendCommands->data );
2936         }
2937 }
2938
2939 void MainFrame::ReleaseContexts(){
2940         if ( m_pXYWnd ) {
2941                 m_pXYWnd->DestroyContext();
2942         }
2943         if ( m_pYZWnd ) {
2944                 m_pYZWnd->DestroyContext();
2945         }
2946         if ( m_pXZWnd ) {
2947                 m_pXZWnd->DestroyContext();
2948         }
2949         if ( m_pCamWnd ) {
2950                 m_pCamWnd->DestroyContext();
2951         }
2952         if ( m_pTexWnd ) {
2953                 m_pTexWnd->DestroyContext();
2954         }
2955         if ( m_pZWnd ) {
2956                 m_pZWnd->DestroyContext();
2957         }
2958 }
2959
2960 void MainFrame::CreateContexts(){
2961         if ( m_pCamWnd ) {
2962                 m_pCamWnd->CreateContext();
2963         }
2964         if ( m_pXYWnd ) {
2965                 m_pXYWnd->CreateContext();
2966         }
2967         if ( m_pYZWnd ) {
2968                 m_pYZWnd->CreateContext();
2969         }
2970         if ( m_pXZWnd ) {
2971                 m_pXZWnd->CreateContext();
2972         }
2973         if ( m_pTexWnd ) {
2974                 m_pTexWnd->CreateContext();
2975         }
2976         if ( m_pZWnd ) {
2977                 m_pZWnd->CreateContext();
2978         }
2979 }
2980
2981 static void Sys_Iconify( GtkWidget *w ){
2982         // we might not have been realized yet
2983         if ( w->window == NULL ) {
2984                 return;
2985         }
2986
2987         if ( !GTK_WIDGET_MAPPED( w ) ) {
2988                 return;
2989         }
2990
2991 #if defined ( __linux__ ) || defined ( __APPLE__ )
2992         Sys_FPrintf( SYS_WRN, "FIXME: Sys_Iconify\n" );
2993 #if 0
2994         XWindowAttributes xattr;
2995         GdkWindowPrivate *Private;
2996
2997         Private = (GdkWindowPrivate*)w->window;
2998         g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 0 ) );
2999
3000         if ( !Private->destroyed ) {
3001                 xattr.map_state = IsUnmapped;
3002                 XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3003
3004                 if ( xattr.map_state != IsUnmapped ) {
3005                         g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 1 ) );
3006                 }
3007
3008                 XIconifyWindow( Private->xdisplay, Private->xwindow, 0 );
3009         }
3010 #endif
3011 #endif
3012
3013 #ifdef _WIN32
3014         ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_MINIMIZE );
3015 #endif
3016 }
3017
3018 static void Sys_Restore( GtkWidget *w ){
3019         // we might not have been realized yet
3020         if ( w->window == NULL ) {
3021                 return;
3022         }
3023
3024         if ( !GTK_WIDGET_VISIBLE( w ) ) {
3025                 return;
3026         }
3027
3028 #if defined ( __linux__ ) || defined ( __APPLE__ )
3029         Sys_FPrintf( SYS_WRN, "FIXME: Sys_Restore\n" );
3030   #if 0
3031         XWindowAttributes xattr;
3032         GdkWindowPrivate *Private;
3033
3034         Private = (GdkWindowPrivate*)w->window;
3035
3036         xattr.map_state = IsUnmapped;
3037         XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
3038
3039         if ( xattr.map_state == IsUnmapped ) {
3040                 XMapRaised( Private->xdisplay, Private->xwindow );
3041         }
3042   #endif
3043 #endif
3044
3045 #ifdef _WIN32
3046         ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_RESTORE );
3047 #endif
3048 }
3049
3050 #ifdef _DEBUG
3051 //#define DBG_SLEEP
3052 #endif
3053
3054 void RefreshModelSkin( GSList **pModels, entitymodel_t *model ){
3055         //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
3056         // so we avoid the fucked up ones, assuming they are at the end
3057         if ( !model->strSkin ) {
3058 #ifdef DBG_SLEEP
3059                 Sys_Printf( "Dropping model %p with empty skin in RefreshModelSkin\n", model );
3060 #endif
3061
3062                 // and also keeping it so we have an actual count of empty models
3063                 g_slist_append( *pModels, model );
3064                 return;
3065         }
3066         // do we have this model already?
3067         if ( g_slist_find( *pModels, model ) ) {
3068 #ifdef DBG_SLEEP
3069
3070                 // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
3071                 Sys_Printf( "Already processed model: %p %s\n", model, ( (GString *)model->strSkin )->str );
3072 #endif
3073                 return;
3074         }
3075         model->nTextureBind = Texture_LoadSkin( ( (GString *)model->strSkin )->str, &model->nSkinWidth, &model->nSkinHeight );
3076         if ( model->nTextureBind != -1 ) {
3077                 Sys_Printf( "LOADED SKIN: %s\n", ( (GString *)model->strSkin )->str );
3078         }
3079         else{
3080                 Sys_Printf( "Load skin failed: %s\n", ( (GString *)model->strSkin )->str );
3081         }
3082         *pModels = g_slist_append( *pModels, model );
3083 #ifdef DBG_SLEEP
3084         Sys_Printf( "Processed model %p %s\n", model, ( (GString *)model->strSkin )->str );
3085 #endif
3086 }
3087
3088 void MainFrame::OnSleep(){
3089         m_bSleeping ^= 1;
3090         if ( m_bSleeping ) {
3091                 // useful when trying to debug crashes in the sleep code
3092                 Sys_Printf( "Going into sleep mode..\n" );
3093
3094                 Sys_Printf( "Dispatching sleep msg..." );
3095                 DispatchRadiantMsg( RADIANT_SLEEP );
3096                 Sys_Printf( "Done.\n" );
3097
3098                 if ( CurrentStyle() == eSplit ) {
3099                         Sys_Iconify( m_pZWnd->m_pParent );
3100                 }
3101
3102                 Sys_Iconify( m_pWidget );
3103                 Select_Deselect();
3104                 QERApp_FreeShaders();
3105                 g_bScreenUpdates = false;
3106
3107                 // release contexts
3108                 Sys_Printf( "Releasing contexts..." );
3109                 ReleaseContexts();
3110                 Sys_Printf( "Done.\n" );
3111
3112                 // free all the skins in the caches
3113                 // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
3114                 g_lstSkinCache.RemoveAll();
3115         }
3116         else
3117         {
3118                 Sys_Printf( "Waking up\n" );
3119                 if ( CurrentStyle() == eSplit ) {
3120                         Sys_Restore( m_pZWnd->m_pParent );
3121                 }
3122
3123                 Sys_Restore( m_pWidget );
3124
3125                 // create contexts
3126                 Sys_Printf( "Creating contexts..." );
3127                 CreateContexts();
3128                 Sys_Printf( "Done.\n" );
3129
3130                 Sys_Printf( "Making current on camera..." );
3131                 m_pCamWnd->MakeCurrent();
3132                 Sys_Printf( "Done.\n" );
3133
3134                 Sys_Printf( "Reloading shaders..." );
3135                 // reload the shader scripts and textures
3136                 QERApp_ReloadShaders();
3137                 // current shader
3138                 // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
3139                 Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
3140                 Sys_Printf( "Done.\n" );
3141
3142                 // rebuild the patches by setting the bDirty flag on them
3143                 for ( brush_t* b = active_brushes.next ; b != &active_brushes ; b = b->next )
3144                 {
3145                         if ( b->patchBrush ) {
3146                                 b->pPatch->bDirty = true;
3147                         }
3148                 }
3149
3150                 Sys_Printf( "Reloading skins..." );
3151                 // we have purged all the skins before going to sleep
3152                 // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
3153                 // namely, all entitymodel_t
3154                 // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
3155                 // (a single eclass_t can reference several entitymodel_t)
3156                 // FIXME: and what's up with md3Class then? what is it used for?
3157 /*
3158     eclass_t *e;
3159     entity_t *ent;
3160     GSList *Models = NULL;
3161     for (ent = entities.next; ent != &entities; ent = ent->next)
3162     {
3163       // if it's a model with skin then the fixedsize flag must be on
3164       // only if there IS a model .. we are not trying to load
3165       if (ent->eclass->fixedsize)
3166       {
3167         if (ent->eclass->model)
3168         {
3169    #ifdef DBG_SLEEP
3170           if (ent->md3Class)
3171             Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
3172    #endif
3173           entitymodel_t *model;
3174           for (model = ent->eclass->model; model; model=model->pNext)
3175             RefreshModelSkin (&Models, model);
3176         } else if (ent->md3Class)
3177         {
3178           entitymodel_t *model;
3179           for (model = ent->md3Class->model; model; model=model->pNext)
3180             RefreshModelSkin (&Models, model);
3181         }
3182    #ifdef DBG_SLEEP
3183         else
3184           Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
3185    #endif
3186       }
3187     }
3188    #ifdef DBG_SLEEP
3189     for (e = g_md3Cache; e ; e = e->next)
3190     {
3191       entitymodel_t *model;
3192       for (model = e->model; model; model=model->pNext)
3193         if (!g_slist_find (Models, model))
3194         {
3195           Sys_Printf("model %p ", model);
3196           if (model->strSkin)
3197             Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
3198           else
3199             Sys_Printf("not found in main loop (no skin)\n");
3200         }
3201     }
3202    #endif
3203     // clean the model list
3204     g_slist_free (Models);
3205  */
3206                 Sys_Printf( "Done.\n" );
3207
3208                 g_bScreenUpdates = true;
3209
3210                 Sys_Printf( "Dispatching wake msg..." );
3211                 DispatchRadiantMsg( RADIANT_WAKEUP );
3212                 Sys_Printf( "Done\n" );
3213         }
3214 }
3215
3216 void WINAPI QERApp_Sleep(){
3217         g_pParentWnd->OnSleep();
3218 }
3219
3220 /*!
3221    NOTE TTimo
3222    the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
3223    and not in OnDestroy because the info may be lost already?
3224    \todo try sinking OnDelete into OnDestroy and see if it breaks anything
3225  */
3226 void MainFrame::OnDelete(){
3227         save_window_pos( m_pWidget, g_PrefsDlg.mWindowInfo.position );
3228
3229         // surface inspector and patch inspector
3230         save_window_pos( g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd );
3231         save_window_pos( g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd );
3232
3233         // entity inspector / group dialog
3234         // NOTE TTimo do we have to save a different window depending on the view mode?
3235         save_window_pos( g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd );
3236
3237         if ( g_PrefsDlg.m_bFloatingZ ) {
3238                 save_window_pos( m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd );
3239         }
3240         else{
3241                 g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED( m_pSplits[0] )->child1_size;
3242         }
3243
3244         if ( CurrentStyle() == eFloating ) {
3245                 save_window_pos( m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd );
3246                 save_window_pos( m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd );
3247                 save_window_pos( m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd );
3248                 save_window_pos( m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd );
3249         }
3250
3251         g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state( g_pParentWnd->m_pWidget->window );
3252 }
3253
3254 void MainFrame::OnDestroy(){
3255         // shut down console output first
3256         // (we'll still get the info if we are running a log file anyway)
3257         g_qeglobals_gui.d_edit = NULL;
3258
3259 #ifdef _DEBUG
3260         Sys_Printf( "MainFrame::OnDestroy\n" );
3261 #endif
3262         if ( s_idle_id ) {
3263                 gtk_timeout_remove( s_idle_id );
3264         }
3265         if ( m_nTimer ) {
3266                 gtk_timeout_remove( m_nTimer );
3267         }
3268
3269         if ( !g_qeglobals.disable_ini ) {
3270                 Sys_Printf( "Start writing prefs\n" );
3271                 Sys_Printf( "MRU_Save... " );
3272                 MRU_Save();
3273                 Sys_Printf( "OK\n" );
3274
3275                 gpointer w;
3276
3277                 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split1" );
3278                 g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED( w )->child1_size;
3279                 w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split2" );
3280                 g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED( w )->child1_size;
3281
3282                 if ( !FloatingGroupDialog() ) {
3283                         GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
3284
3285                         vsplit = m_pSplits[0];
3286                         vsplit2 = m_pSplits[1];
3287                         hsplit = m_pSplits[2];
3288                         hsplit2 = m_pSplits[3];
3289
3290                         g_PrefsDlg.mWindowInfo.nXYHeight  = GTK_PANED( vsplit )->child1_size;
3291                         g_PrefsDlg.mWindowInfo.nXYWidth   = GTK_PANED( hsplit2 )->child1_size;
3292
3293                         if ( CurrentStyle() == eRegular ) {
3294                                 g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED( hsplit )->child1_size;
3295                         }
3296                         else{
3297                                 g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED( hsplit )->child1_size;
3298                         }
3299
3300                         g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED( vsplit2 )->child1_size;
3301                 }
3302                 else
3303                 {
3304                         if ( g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit ) {
3305                                 if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
3306                                         g_PrefsDlg.m_bZVis = TRUE;
3307                                 }
3308                                 else{
3309                                         g_PrefsDlg.m_bZVis = FALSE;
3310                                 }
3311                         }
3312                 }
3313                 g_PrefsDlg.SavePrefs();
3314                 Sys_Printf( "Done prefs\n" );
3315         }
3316
3317         // spog - this may be better in another place..
3318         // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
3319         g_qeglobals.d_savedinfo.filters = FilterListDelete( g_qeglobals.d_savedinfo.filters );
3320
3321         delete m_pXYWnd; m_pXYWnd = NULL;
3322         delete m_pYZWnd; m_pYZWnd = NULL;
3323         delete m_pXZWnd; m_pXZWnd = NULL;
3324         delete m_pZWnd; m_pZWnd = NULL;
3325         delete m_pTexWnd; m_pTexWnd = NULL;
3326         delete m_pCamWnd; m_pCamWnd = NULL;
3327
3328         if ( g_pGroupDlg->m_pWidget ) {
3329                 //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
3330                 gtk_widget_destroy( g_pGroupDlg->m_pWidget );
3331                 g_pGroupDlg->m_pWidget = NULL;
3332         }
3333
3334         if ( strcmpi( currentmap, "unnamed.map" ) != 0 ) {
3335                 g_PrefsDlg.m_strLastMap = currentmap;
3336                 g_PrefsDlg.SavePrefs();
3337         }
3338         Sys_Printf( "CleanUpEntities..." );
3339         CleanUpEntities();
3340         Sys_Printf( "Done.\n" );
3341
3342         Sys_Printf( "Releasing brushes..." );
3343         while ( active_brushes.next != &active_brushes )
3344                 Brush_Free( active_brushes.next, false );
3345         while ( selected_brushes.next != &selected_brushes )
3346                 Brush_Free( selected_brushes.next, false );
3347         while ( filtered_brushes.next != &filtered_brushes )
3348                 Brush_Free( filtered_brushes.next, false );
3349         Sys_Printf( "Done.\n" );
3350
3351         Sys_Printf( "Releasing entities..." );
3352         while ( entities.next != &entities )
3353                 Entity_Free( entities.next );
3354         Sys_Printf( "Done.\n" );
3355
3356         epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
3357         while ( pEPair )
3358         {
3359                 epair_t* pNextEPair = pEPair->next;
3360                 free( pEPair->key );
3361                 free( pEPair->value );
3362                 free( pEPair );
3363                 pEPair = pNextEPair;
3364         }
3365
3366         entity_t* pEntity = g_qeglobals.d_project_entity->next;
3367         while ( pEntity != NULL && pEntity != g_qeglobals.d_project_entity )
3368         {
3369                 entity_t* pNextEntity = pEntity->next;
3370                 Entity_Free( pEntity );
3371                 pEntity = pNextEntity;
3372         }
3373
3374         Sys_Printf( "Freeing world entity..." );
3375         if ( world_entity ) {
3376                 Entity_Free( world_entity );
3377         }
3378         Sys_Printf( "Done.\n" );
3379
3380         Sys_Printf( "Shutdown VFS..." );
3381         vfsShutdown();
3382         Sys_Printf( "Done.\n" );
3383
3384         Sys_Printf( "FreeShaders..." );
3385         QERApp_FreeShaders();
3386         Sys_Printf( "Done.\n" );
3387 }
3388
3389 // TTimo: now using profile.cpp code
3390 void MainFrame::LoadCommandMap(){
3391         FILE *f;
3392         CString strINI;
3393         bool bUserCmdList = false;
3394         int nLen;
3395         // verbose a little: count of user commands we recognized
3396         int iCount = 0;
3397         int iOverrideCount = 0;
3398         int j;
3399
3400
3401 #if defined ( __linux__ ) || defined ( __APPLE__ )
3402         strINI = g_PrefsDlg.m_rc_path->str;
3403 #elif defined( WIN32 )
3404         strINI = g_strGameToolsPath;
3405 #else
3406 #error "WTF are you compiling this on"
3407 #endif
3408         AddSlash( strINI );
3409         strINI += "shortcuts.ini";
3410
3411         f = fopen( strINI.GetBuffer(), "r" );
3412         if ( f != NULL ) {
3413                 fclose( f );
3414                 // loop through all the commands
3415                 for ( int i = 0; i < g_nCommandCount; i++ )
3416                 {
3417                         char value[1024];
3418                         if ( read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ) ) {
3419                                 if ( !bUserCmdList ) {
3420                                         Sys_Printf( "Found user's shortcuts list at %s\n", strINI.GetBuffer() );
3421                                         bUserCmdList = true;
3422                                 }
3423                                 CString strBuff;
3424                                 strBuff = value;
3425                                 strBuff.TrimLeft();
3426                                 strBuff.TrimRight();
3427                                 strBuff.MakeLower();
3428                                 int nSpecial = strBuff.Find( "+alt" );
3429                                 g_Commands[i].m_nModifiers = 0;
3430                                 if ( nSpecial >= 0 ) {
3431                                         g_Commands[i].m_nModifiers |= RAD_ALT;
3432                                         FindReplace( strBuff, "+alt", "" );
3433                                 }
3434                                 nSpecial = strBuff.Find( "+ctrl" );
3435                                 if ( nSpecial >= 0 ) {
3436                                         g_Commands[i].m_nModifiers |= RAD_CONTROL;
3437                                         FindReplace( strBuff, "+ctrl", "" );
3438                                 }
3439                                 nSpecial = strBuff.Find( "+shift" );
3440                                 if ( nSpecial >= 0 ) {
3441                                         g_Commands[i].m_nModifiers |= RAD_SHIFT;
3442                                         FindReplace( strBuff, "+shift", "" );
3443                                 }
3444                                 strBuff.TrimLeft();
3445                                 strBuff.TrimRight();
3446                                 strBuff.MakeUpper();
3447                                 // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
3448                                 // based on length
3449                                 nLen = strBuff.GetLength();
3450                                 if ( nLen == 1 ) { // most often case.. deal with first
3451                                         g_Commands[i].m_nKey = __toascii( strBuff.GetAt( 0 ) );
3452                                         iCount++;
3453                                 }
3454                                 else // special key
3455                                 {
3456                                         for ( j = 0; j < g_nKeyCount; j++ )
3457                                         {
3458                                                 if ( strBuff.CompareNoCase( g_Keys[j].m_strName ) == 0 ) {
3459                                                         g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
3460                                                         iCount++;
3461                                                         break;
3462                                                 }
3463                                         }
3464                                         if ( j == g_nKeyCount ) {
3465                                                 Sys_Printf( "WARNING: failed to parse user command %s\n", value );
3466                                                 continue;
3467                                         }
3468                                 }
3469                                 // maybe this new shortcut is overriding another one
3470                                 // then we need to disable the other binded key
3471                                 for ( j = 0; j < g_nCommandCount; j++ )
3472                                 {
3473                                         if ( j == i ) {
3474                                                 continue;
3475                                         }
3476                                         if ( g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers ) {
3477                                                 // found!
3478                                                 g_Commands[j].m_nKey = 0;
3479                                                 // verbose
3480                                                 iOverrideCount++;
3481                                                 // it's the only one
3482                                                 break;
3483                                         }
3484                                 }
3485                         }
3486                 }
3487                 if ( iOverrideCount ) {
3488                         Sys_Printf( "User's command list overrides %d default commands\n", iOverrideCount );
3489                 }
3490                 Sys_Printf( "Parsed %d custom shortcuts\n", iCount );
3491         }
3492         else{
3493                 Sys_Printf( "Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer() );
3494         }
3495 }
3496
3497 // TTimo: an m_nKey can be set to zero if there's no shorcut binded
3498 // we also output the count of commands that are not binded .. dunno if it's much use ..
3499 // (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
3500 void MainFrame::ShowMenuItemKeyBindings( GtkWidget* window ){
3501         //!\todo Find a better way to get the global accelerator group..
3502         GtkAccelGroup *accel = GTK_ACCEL_GROUP( gtk_accel_groups_from_object( G_OBJECT( window ) )->data );
3503         gpointer item;
3504         guint mods;
3505         int i;
3506         int iCount = 0;
3507
3508         for ( i = 0; i < g_nCommandCount; i++ )
3509         {
3510                 if ( g_Commands[i].m_nKey == 0 ) {
3511                         iCount++;
3512                         continue;
3513                 }
3514
3515                 item = g_object_get_data( G_OBJECT( m_pWidget ), g_Commands[i].m_strMenu );
3516                 if ( item == NULL ) {
3517                         Sys_FPrintf( SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
3518                                                  g_Commands[i].m_strCommand );
3519                         continue;
3520                 }
3521
3522                 mods = 0;
3523                 if ( g_Commands[i].m_nModifiers ) { // are there modifiers present?
3524                         if ( g_Commands[i].m_nModifiers & RAD_SHIFT ) {
3525                                 mods |= GDK_SHIFT_MASK;
3526                         }
3527                         if ( g_Commands[i].m_nModifiers & RAD_ALT ) {
3528                                 mods |= GDK_MOD1_MASK;
3529                         }
3530                         if ( g_Commands[i].m_nModifiers & RAD_CONTROL ) {
3531                                 mods |= GDK_CONTROL_MASK;
3532                         }
3533                 }
3534
3535                 // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
3536                 if ( gtk_accelerator_valid( g_Commands[i].m_nKey, (GdkModifierType)mods ) ) {
3537 #ifdef DBG_KBD
3538                         // NOTE TTimo this is the important place where all the shortcuts are binded
3539                         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 );
3540 #endif
3541                         gtk_widget_add_accelerator( GTK_WIDGET( item ), "activate", accel, g_Commands[i].m_nKey,
3542                                                                                 (GdkModifierType)mods, GTK_ACCEL_VISIBLE );
3543                 }
3544                 else
3545                 {
3546                         GtkAccelLabel *accel_label = GTK_ACCEL_LABEL( GTK_BIN( item )->child );
3547                         GString *gstring;
3548                         gboolean had_mod;
3549
3550                         g_free( accel_label->accel_string );
3551                         accel_label->accel_string = NULL;
3552
3553                         gstring = g_string_new( accel_label->accel_string );
3554                         g_string_append( gstring, "   " );
3555
3556                         had_mod = FALSE;
3557                         if ( mods & GDK_SHIFT_MASK ) {
3558                                 g_string_append( gstring, "Shft" );
3559                                 had_mod = TRUE;
3560                         }
3561                         if ( mods & GDK_CONTROL_MASK ) {
3562                                 if ( had_mod ) {
3563                                         g_string_append( gstring, "+" );
3564                                 }
3565                                 g_string_append( gstring, "Ctl" );
3566                                 had_mod = TRUE;
3567                         }
3568                         if ( mods & GDK_MOD1_MASK ) {
3569                                 if ( had_mod ) {
3570                                         g_string_append( gstring, "+" );
3571                                 }
3572                                 g_string_append( gstring, "Alt" );
3573                                 had_mod = TRUE;
3574                         }
3575
3576                         if ( had_mod ) {
3577                                 g_string_append( gstring, "+" );
3578                         }
3579                         if ( g_Commands[i].m_nKey < 0x80 || ( g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff ) ) {
3580                                 switch ( g_Commands[i].m_nKey )
3581                                 {
3582                                 case ' ':
3583                                         g_string_append( gstring, "Space" );
3584                                         break;
3585                                 case '\\':
3586                                         g_string_append( gstring, "Backslash" );
3587                                         break;
3588                                 default:
3589                                         g_string_append_c( gstring, toupper( g_Commands[i].m_nKey ) );
3590                                         break;
3591                                 }
3592                         }
3593                         else
3594                         {
3595                                 gchar *tmp;
3596
3597                                 tmp = gtk_accelerator_name( g_Commands[i].m_nKey, (GdkModifierType)0 );
3598                                 if ( tmp[0] != 0 && tmp[1] == 0 ) {
3599                                         tmp[0] = toupper( tmp[0] );
3600                                 }
3601                                 g_string_append( gstring, tmp );
3602                                 g_free( tmp );
3603                         }
3604
3605                         g_free( accel_label->accel_string );
3606                         accel_label->accel_string = gstring->str;
3607                         g_string_free( gstring, FALSE );
3608
3609                         if ( !accel_label->accel_string ) {
3610                                 accel_label->accel_string = g_strdup( "" );
3611                         }
3612
3613                         gtk_widget_queue_resize( GTK_WIDGET( accel_label ) );
3614                 }
3615         }
3616
3617         if ( iCount ) {
3618                 Sys_Printf( "%d commands not bound to a key\n", iCount );
3619         }
3620 }
3621
3622 // Checks whether a given filename ends in .map
3623 const bool IsMap(const char* filename){
3624         return strlen(filename) >= 4 && strcmp(filename + strlen(filename) - 4, ".map") == 0;
3625 }
3626
3627 void MainFrame::CreateQEChildren(){
3628         // load the project file, if it is a project file. (Or at least no .map)
3629         if ( g_argc > 1 && !IsMap( g_argv[1] ) ) {
3630                 Sys_Printf( "loading project file from the command line: %s\n", g_argv[1] );
3631                 if ( !QE_LoadProject( g_argv[1] ) ) {
3632                         Error( "Unable to load project file %s\n", g_argv[1] );
3633                 }
3634         }
3635         else
3636         {
3637                 const char* filename = NULL;
3638                 char buf[PATH_MAX];
3639                 const char *r;
3640                 bool bTriedTemplate = false;
3641
3642                 if ( g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION ) {
3643                         // we need to regenerate from template
3644                         Sys_Printf( "last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION );
3645                         g_PrefsDlg.m_strLastProject = "";
3646                 }
3647
3648                 r = g_PrefsDlg.m_strLastProject.GetBuffer();
3649
3650                 while ( r == NULL || *r == '\0' || access( r, R_OK ) != 0 || !QE_LoadProject( r ) )
3651                 {
3652                         if ( !bTriedTemplate ) {
3653                                 // try default project location
3654                                 bTriedTemplate = true;
3655                                 // for all OSes, we look for the template in the base installation (no homepath here)
3656                                 strcpy( buf, g_pGameDescription->mEnginePath.GetBuffer() );
3657                                 strcat( buf, g_pGameDescription->mBaseGame.GetBuffer() );
3658                                 strcat( buf, "/scripts/" );
3659                                 strcat( buf, PROJECT_TEMPLATE_NAME );
3660                                 r = buf;
3661                         }
3662                         else
3663                         {
3664                                 gtk_MessageBox( NULL, _( "Failed to load project file.\nPlease enter a valid project file." ), _( "Load Project" ) );
3665
3666                                 filename = file_dialog( m_pWidget, TRUE, _( "Choose Project File" ), buf, "project" );
3667                                 if ( filename != NULL ) {
3668                                         r = filename;
3669                                 }
3670                                 else{
3671                                         Error( "Cannot continue without loading a project..." );
3672                                 }
3673                         }
3674                 }
3675         }
3676
3677         QE_Init();
3678 }
3679
3680 void MainFrame::OnTimer(){
3681         GdkModifierType mask;
3682
3683         gdk_window_get_pointer( NULL, NULL, NULL, &mask );
3684
3685         if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) {
3686                 QE_CountBrushesAndUpdateStatusBar();
3687                 QE_CheckAutoSave();
3688         }
3689
3690         // see MainFrame::UpdateStatusText below
3691         if ( m_bNeedStatusUpdate ) {
3692                 for ( int n = 0; n < 6; n++ )
3693                 {
3694                         if ( m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL ) {
3695                                 gtk_label_set_text( GTK_LABEL( m_pStatusLabel[n] ), m_strStatus[n] );
3696                         }
3697                 }
3698                 m_bNeedStatusUpdate = false;
3699         }
3700 }
3701
3702 void MainFrame::UpdateStatusText(){
3703         m_bNeedStatusUpdate = true;
3704 }
3705
3706 void MainFrame::SetStatusText( int nPane, const char* pText ){
3707         if ( pText && nPane <= 5 && nPane >= 0 ) {
3708                 m_strStatus[nPane] = pText;
3709                 UpdateStatusText();
3710         }
3711 }
3712 void MainFrame::SetButtonMenuStates(){
3713         GtkWidget *item;
3714         g_bIgnoreCommands++;
3715
3716         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
3717         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_angles );
3718         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
3719         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_names );
3720         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
3721         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_coordinates );
3722         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
3723         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_outline );
3724         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
3725         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
3726         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
3727         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_axis );
3728         //item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
3729         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3730                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) ? FALSE : TRUE );
3731         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3732         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3733                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3734         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3735         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3736                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3737         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
3738         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3739                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD ) != 0 );
3740         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
3741         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3742                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT ) != 0 );
3743         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
3744         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3745                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS ) != 0 );
3746         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
3747         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3748                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT ) != 0 );
3749         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
3750         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3751                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS ) != 0 );
3752         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
3753         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3754                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) != 0 );
3755         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
3756         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3757                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP ) != 0 );
3758         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
3759         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3760                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP ) != 0 );
3761         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
3762         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3763                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL ) != 0 );
3764         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
3765         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3766                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) != 0 );
3767         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
3768         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3769                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
3770         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
3771         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3772                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
3773         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
3774         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3775                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS ) != 0 );
3776         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
3777         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3778                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES ) != 0 );
3779         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
3780         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3781                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS ) != 0 );
3782         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
3783         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3784                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS ) != 0 );
3785         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
3786         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3787                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS ) != 0 );
3788         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
3789         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
3790                                                                         ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS ) != 0 );
3791         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
3792         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bTextureLock ) ? TRUE : FALSE );
3793         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
3794         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bRotateLock ) ? TRUE : FALSE );
3795         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
3796         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3797         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
3798         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bGLLighting ) ? TRUE : FALSE );
3799         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
3800         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
3801
3802         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
3803         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
3804         item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
3805         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
3806
3807         if ( !g_pGameDescription->mNoPatch ) {
3808                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
3809                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
3810
3811                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
3812                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
3813                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
3814                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
3815                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
3816                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
3817         }
3818
3819         int id, n = g_PrefsDlg.m_nTextureScale;
3820         switch ( n )
3821         {
3822         case 10: id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
3823         case 25: id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
3824         case 50: id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
3825         case 200: id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
3826         default: id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
3827         }
3828         SetTextureScale( id );
3829
3830         // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
3831 /*
3832    if (g_qeglobals.d_project_entity)
3833    {
3834     FillTextureMenu();      // redundant but i'll clean it up later.. yeah right..
3835     FillBSPMenu();
3836    }
3837  */
3838         g_bIgnoreCommands--;
3839 }
3840
3841 void MainFrame::UpdateWindows( int nBits ){
3842         if ( !g_bScreenUpdates ) {
3843                 return;
3844         }
3845 #ifdef DBG_WINDOWPOS
3846         static int bean_count = 0;
3847         char bean_buf[100];
3848         sprintf( bean_buf,"UpdateWindows %d",bean_count );
3849         CheckWatchit( bean_buf );
3850         bean_count++;
3851 #endif
3852
3853         if ( nBits & ( W_XY | W_XY_OVERLAY ) ) {
3854                 if ( m_pXYWnd ) {
3855                         m_pXYWnd->RedrawWindow();
3856                 }
3857                 if ( m_pXZWnd ) {
3858                         m_pXZWnd->RedrawWindow();
3859                 }
3860                 if ( m_pYZWnd ) {
3861                         m_pYZWnd->RedrawWindow();
3862                 }
3863         }
3864
3865         if ( nBits & W_CAMERA || ( ( nBits & W_CAMERA_IFON ) && m_bCamPreview ) ) {
3866                 if ( m_pCamWnd ) {
3867                         m_pCamWnd->RedrawWindow();
3868                 }
3869         }
3870
3871         if ( nBits & ( W_Z | W_Z_OVERLAY ) ) {
3872                 if ( m_pZWnd ) {
3873                         m_pZWnd->RedrawWindow();
3874                 }
3875         }
3876
3877         if ( nBits & W_TEXTURE ) {
3878                 if ( m_pTexWnd ) {
3879                         m_pTexWnd->RedrawWindow();
3880                 }
3881         }
3882 #ifdef DBG_WINDOWPOS
3883         sprintf( bean_buf,"%d (end UpdateWidows)",bean_count );
3884         CheckWatchit( bean_buf );
3885 #endif
3886 }
3887
3888 void MainFrame::RoutineProcessing(){
3889 #ifdef DBG_WINDOWPOS
3890         static int bean_count = 0;
3891         char bean_buf[100];
3892         sprintf( bean_buf,"RoutineProcessing %d",bean_count );
3893         CheckWatchit( bean_buf );
3894         bean_count++;
3895 #endif
3896
3897         if ( m_bDoLoop ) {
3898                 double time = 0.0;
3899                 double oldtime = 0.0;
3900                 double delta = 0.0;
3901
3902 /*    // checking KeyState works right
3903     static short a1,a2;
3904     a2 = GetKeyState(VK_MENU);
3905     if (a1!=a2)
3906     {
3907       Sys_Printf("VK_MENU: %d\n",a2);
3908       a1 = a2;
3909     }
3910     static short b1,b2;
3911     b2 = GetKeyState(VK_UP);
3912     if (b1!=b2)
3913     {
3914       Sys_Printf("VK_UP: %d\n",b2);
3915       b1 = b2;
3916     } */
3917
3918                 time = Sys_DoubleTime();
3919                 delta = time - oldtime;
3920                 oldtime = time;
3921                 if ( delta > 0.2 ) {
3922                         delta = 0.2;
3923                 }
3924
3925                 // update the BSP process watcher
3926                 if ( m_pWatchBSP ) {
3927                         m_pWatchBSP->RoutineProcessing();
3928                 }
3929
3930                 // run time dependant behavior
3931                 if ( m_pCamWnd ) {
3932                         m_pCamWnd->Cam_MouseControl( delta );
3933                 }
3934
3935                 if ( g_nUpdateBits ) {
3936                         int nBits = g_nUpdateBits; // this is done to keep this routine from being
3937                         g_nUpdateBits = 0;        // re-entered due to the paint process.. only
3938                         UpdateWindows( nBits );   // happens in rare cases but causes a stack overflow
3939                 }
3940 /*
3941     // Enable/disable the menu items
3942     GtkWidget *item;
3943
3944     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_cameraupdate"));
3945     gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3946     if (!g_PrefsDlg.m_bWideToolbar)
3947     {
3948       item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_view_cameraupdate"));
3949       gtk_widget_set_sensitive (item, (m_bCamPreview == false));
3950     }
3951     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_undo"));
3952     gtk_widget_set_sensitive (item, Undo_UndoAvailable());
3953     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_edit_redo"));
3954     gtk_widget_set_sensitive (item, Undo_RedoAvailable());
3955     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_file_saveregion"));
3956     gtk_widget_set_sensitive (item, region_active);
3957     g_bIgnoreCommands++;
3958     // update the toolbar before displaying the menu:
3959     // show in use check box
3960     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showinuse"));
3961     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !g_bShowAllShaders);
3962     // show all check box
3963     item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_textures_showall"));
3964     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), g_bShowAllShaders);
3965     g_bIgnoreCommands--;
3966  */
3967         }
3968 #ifdef DBG_WINDOWPOS
3969         sprintf( bean_buf,"%d (end RoutineProcessing)",bean_count );
3970         CheckWatchit( bean_buf );
3971 #endif
3972 }
3973
3974 void MainFrame::DoWatchBSP(){
3975         // network monitoring of the BSP process
3976         if ( !m_pWatchBSP ) {
3977                 m_pWatchBSP = new CWatchBSP();
3978         }
3979 }
3980
3981 void MainFrame::CleanPlugInMenu(){
3982         GtkWidget *menu, *sep;
3983         GList *lst;
3984
3985         // delete everything after the separator
3986         menu = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) );
3987         sep = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin_separator" ) );
3988         m_nNextPlugInID = ID_PLUGIN_START;
3989
3990         lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3991         while ( lst->next )
3992         {
3993                 gtk_container_remove( GTK_CONTAINER( menu ), GTK_WIDGET( lst->next->data ) );
3994                 lst = g_list_find( gtk_container_children( GTK_CONTAINER( menu ) ), sep );
3995         }
3996 }
3997
3998 void MainFrame::AddPlugInMenuItem( IPlugIn* pPlugIn ){
3999         GtkWidget *menu, *item, *parent;
4000         const char *menuText;
4001
4002         parent = gtk_menu_item_new_with_label( pPlugIn->getMenuName() );
4003         gtk_widget_show( parent );
4004         gtk_container_add( GTK_CONTAINER( g_object_get_data( G_OBJECT( m_pWidget ), "menu_plugin" ) ), parent );
4005
4006         int nCount = pPlugIn->getCommandCount();
4007         if ( nCount > 0 ) {
4008                 menu = gtk_menu_new();
4009                 while ( nCount > 0 )
4010                 {
4011                         menuText = pPlugIn->getCommand( --nCount );
4012                         if ( menuText != NULL && strlen( menuText ) > 0 ) {
4013                                 if ( !strcmp( menuText, "-" ) ) {
4014                                         item = gtk_menu_item_new();
4015                                         gtk_widget_set_sensitive( item, FALSE );
4016                                 }
4017                                 else
4018                                 {
4019                                         item = gtk_menu_item_new_with_label( menuText );
4020                                         gtk_signal_connect( GTK_OBJECT( item ), "activate",
4021                                                                                 GTK_SIGNAL_FUNC( HandleCommand ), GINT_TO_POINTER( m_nNextPlugInID ) );
4022                                 }
4023                                 gtk_widget_show( item );
4024                                 gtk_container_add( GTK_CONTAINER( menu ), item );
4025                                 pPlugIn->addMenuID( m_nNextPlugInID++ );
4026                         }
4027                 }
4028                 gtk_menu_item_set_submenu( GTK_MENU_ITEM( parent ), menu );
4029         }
4030 }
4031
4032 void MainFrame::OnPlugIn( unsigned int nID, char* str ){
4033         m_PlugInMgr.Dispatch( nID, str );
4034 }
4035
4036 inline GtkToolbarChildType gtktoolbarchildtype_for_toolbarbuttontype( IToolbarButton::EType type ){
4037         switch ( type )
4038         {
4039         case IToolbarButton::eSpace:
4040                 return GTK_TOOLBAR_CHILD_SPACE;
4041         case IToolbarButton::eButton:
4042                 return GTK_TOOLBAR_CHILD_BUTTON;
4043         case IToolbarButton::eToggleButton:
4044                 return GTK_TOOLBAR_CHILD_TOGGLEBUTTON;
4045         case IToolbarButton::eRadioButton:
4046                 return GTK_TOOLBAR_CHILD_RADIOBUTTON;
4047         }
4048         Error( "invalid toolbar button type" );
4049         return (GtkToolbarChildType)0;
4050 }
4051
4052 void toolbar_insert( GtkWidget *toolbar, const char* image, const char* text, const char* tooltip, IToolbarButton::EType type, GtkSignalFunc handler, gpointer data ){
4053         GtkWidget *w, *pixmap;
4054         GdkPixmap *gdkpixmap;
4055         GdkBitmap *mask;
4056
4057         load_plugin_bitmap( image, (void **)&gdkpixmap, (void **)&mask );
4058         pixmap = gtk_pixmap_new( gdkpixmap, mask );
4059         gdk_pixmap_unref( gdkpixmap );
4060         gdk_pixmap_unref( mask );
4061         w = gtk_toolbar_append_element( GTK_TOOLBAR( toolbar ), gtktoolbarchildtype_for_toolbarbuttontype( type ), NULL, text, tooltip, "", GTK_WIDGET( pixmap ), handler, data );
4062 }
4063
4064 void SignalToolbarButton( GtkWidget *widget, gpointer data ){
4065         const_cast<const IToolbarButton*>( reinterpret_cast<IToolbarButton*>( data ) )->activate();
4066 }
4067
4068 void MainFrame::AddPlugInToolbarButton( const IToolbarButton* button ){
4069         GtkWidget*const toolbar = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "toolbar_plugin" ) );
4070         toolbar_insert( toolbar, button->getImage(), button->getText(), button->getTooltip(), button->getType(), GTK_SIGNAL_FUNC( SignalToolbarButton ), reinterpret_cast<gpointer>( const_cast<IToolbarButton*>( button ) ) );
4071 }
4072
4073 void MainFrame::OnSelectionSelectNudgedown(){
4074         NudgeSelection( 3, g_qeglobals.d_gridsize );
4075 }
4076
4077 void MainFrame::OnSelectionSelectNudgeleft(){
4078         NudgeSelection( 0, g_qeglobals.d_gridsize );
4079 }
4080
4081 void MainFrame::OnSelectionSelectNudgeright(){
4082         NudgeSelection( 2, g_qeglobals.d_gridsize );
4083 }
4084
4085 void MainFrame::OnSelectionSelectNudgeup(){
4086         NudgeSelection( 1, g_qeglobals.d_gridsize );
4087 }
4088
4089 void MainFrame::NudgeSelection( int nDirection, float fAmount ){
4090         if ( ActiveXY()->RotateMode() ) {
4091                 int nAxis = 0;
4092                 if ( ActiveXY()->GetViewType() == XY ) {
4093                         nAxis = 2;
4094                 }
4095                 else
4096                 if ( g_pParentWnd->ActiveXY()->GetViewType() == XZ ) {
4097                         nAxis = 1;
4098                         fAmount = -fAmount;
4099                 }
4100
4101                 if ( nDirection == 2 || nDirection == 3 ) {
4102                         fAmount = -fAmount;
4103                 }
4104
4105                 float fDeg = -fAmount;
4106                 float fAdj = fAmount;
4107
4108                 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAdj;
4109                 CString strStatus;
4110                 strStatus.Format( "Rotation x:: %.1f  y:: %.1f  z:: %.1f", g_pParentWnd->ActiveXY()->Rotation()[0],
4111                                                   g_pParentWnd->ActiveXY()->Rotation()[1], g_pParentWnd->ActiveXY()->Rotation()[2] );
4112                 g_pParentWnd->SetStatusText( 2, strStatus );
4113                 Select_RotateAxis( nAxis, fDeg, false, true );
4114                 Sys_UpdateWindows( W_ALL );
4115         }
4116         else
4117         if ( ActiveXY()->ScaleMode() ) {
4118                 if ( nDirection == 0 || nDirection == 3 ) {
4119                         fAmount = -fAmount;
4120                 }
4121                 vec3_t v;
4122                 v[0] = v[1] = v[2] = 1.0;
4123                 if ( fAmount > 0 ) {
4124                         v[0] = 1.1f;
4125                         v[1] = 1.1f;
4126                         v[2] = 1.1f;
4127                 }
4128                 else
4129                 {
4130                         v[0] = 0.9f;
4131                         v[1] = 0.9f;
4132                         v[2] = 0.9f;
4133                 }
4134
4135                 Select_Scale( ( g_nScaleHow & SCALE_X ) ? v[0] : 1.0,
4136                                           ( g_nScaleHow & SCALE_Y ) ? v[1] : 1.0,
4137                                           ( g_nScaleHow & SCALE_Z ) ? v[2] : 1.0 );
4138                 Sys_UpdateWindows( W_ALL );
4139         }
4140         else
4141         {
4142                 // 0 - left, 1 - up, 2 - right, 3 - down
4143                 int nDim;
4144                 if ( nDirection == 0 ) {
4145                         nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4146                         fAmount = -fAmount;
4147                 }
4148                 else if ( nDirection == 1 ) {
4149                         nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4150                 }
4151                 else if ( nDirection == 2 ) {
4152                         nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
4153                 }
4154                 else
4155                 {
4156                         nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
4157                         fAmount = -fAmount;
4158                 }
4159                 Nudge( nDim, fAmount );
4160         }
4161 }
4162
4163 void MainFrame::Nudge( int nDim, float fNudge ){
4164         vec3_t vMove;
4165         vMove[0] = vMove[1] = vMove[2] = 0;
4166         vMove[nDim] = fNudge;
4167
4168         if ( ( g_qeglobals.d_select_mode == sel_vertex ||
4169                    g_qeglobals.d_select_mode == sel_curvepoint )
4170                  && g_qeglobals.d_num_move_points ) {
4171                 Select_NudgePoint( vMove, true );
4172         }
4173         else{
4174                 Select_Move( vMove, true );
4175         }
4176         Sys_UpdateWindows( W_ALL );
4177 }
4178
4179 void MainFrame::SetGridStatus(){
4180         CString strStatus;
4181         char c1;
4182         char c2;
4183         c1 = ( g_PrefsDlg.m_bTextureLock ) ? 'M' : ' ';
4184         c2 = ( g_PrefsDlg.m_bRotateLock ) ? 'R' : ' ';
4185         strStatus.Format( "G:%g R:%i C:%i L:%c%c", g_qeglobals.d_gridsize,
4186                                           g_PrefsDlg.m_nRotation, g_PrefsDlg.m_nCubicScale, c1, c2 );
4187         SetStatusText( 4, strStatus );
4188 }
4189
4190 void MainFrame::UpdatePatchToolbarButtons(){
4191         GtkWidget *item;
4192         g_bIgnoreCommands++;
4193         item  = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
4194         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
4195 //  item  = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "tb_patch_insdel"));
4196 //  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), (g_bPatchInsertMode) ? TRUE : FALSE);
4197         g_bIgnoreCommands--;
4198 }
4199
4200 // =============================================================================
4201 // Command handlers
4202
4203 void MainFrame::OnFileNew(){
4204         if ( ConfirmModified() ) {
4205                 Map_New();
4206         }
4207 }
4208
4209 void MainFrame::OnFileOpen(){
4210         if ( !ConfirmModified() ) {
4211                 return;
4212         }
4213
4214         const char *str;
4215         char buf[NAME_MAX];
4216
4217         if ( !g_pGameDescription->noMapsInHome ) {
4218                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4219                 strcat( buf, "maps/" );
4220         }
4221         else {
4222                 buf[0] = '\0';
4223         }
4224
4225         str = file_dialog( m_pWidget, TRUE, _( "Open Map" ), buf, MAP_MAJOR, "maps/" );
4226
4227         if ( str != NULL ) {
4228                 strcpy( currentmap,str );
4229                 MRU_AddFile( str );
4230                 Map_LoadFile( str );
4231         }
4232 }
4233
4234 void MainFrame::OnFileImportmap(){
4235         const char *str;
4236         char buf[NAME_MAX];
4237
4238         if ( !g_pGameDescription->noMapsInHome ) {
4239                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4240                 strcat( buf, "maps/" );
4241         }
4242         else {
4243                 buf[0] = '\0';
4244         }
4245
4246         str = file_dialog( m_pWidget, TRUE, _( "Import Map" ), buf, MAP_MAJOR, "maps/" );
4247
4248         if ( str != NULL ) {
4249                 Map_ImportFile( str );
4250         }
4251 }
4252
4253 void MainFrame::OnFileSave(){
4254         if ( !strcmp( currentmap, "unnamed.map" ) ) {
4255                 OnFileSaveas();
4256         }
4257         else{
4258                 Map_SaveFile( currentmap, false );
4259         }
4260 }
4261
4262 void MainFrame::OnFileSaveas(){
4263         const char* str;
4264         char buf[NAME_MAX];
4265
4266         if ( !g_pGameDescription->noMapsInHome ) {
4267                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4268                 strcat( buf, "maps/" );
4269         }
4270         else {
4271                 buf[0] = '\0';
4272         }
4273
4274         str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Save Map" ), buf, MAP_MAJOR, "maps/" );
4275
4276         if ( str != NULL ) {
4277                 strcpy( currentmap, str );
4278                 MRU_AddFile( str );
4279                 Map_SaveFile( str, false ); // ignore region
4280         }
4281 }
4282
4283 void MainFrame::OnFileExportmap(){
4284         const char* str;
4285         char buf[NAME_MAX];
4286
4287         if ( !g_pGameDescription->noMapsInHome ) {
4288                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4289                 strcat( buf, "maps/" );
4290         }
4291         else {
4292                 buf[0] = '\0';
4293         }
4294
4295         str = file_dialog( m_pWidget, FALSE, _( "Export Selection" ), buf, MAP_MAJOR, "maps/" );
4296
4297         if ( str != NULL ) {
4298                 Map_SaveSelected( str );
4299         }
4300 }
4301
4302 void MainFrame::OnFileSaveregion(){
4303         const char* str;
4304         char buf[NAME_MAX];
4305
4306         if ( !g_pGameDescription->noMapsInHome ) {
4307                 strcpy( buf, g_qeglobals.m_strHomeMaps.GetBuffer() );
4308                 strcat( buf, "maps/" );
4309         }
4310         else {
4311                 buf[0] = '\0';
4312         }
4313
4314         str = file_dialog( g_pParentWnd->m_pWidget, FALSE, _( "Export Region" ), buf, MAP_MAJOR, "maps/" );
4315
4316         if ( str != NULL ) {
4317                 Map_SaveFile( str, true ); // ignore region
4318         }
4319 }
4320
4321 void MainFrame::OnFileNewproject(){
4322         char* name = DoNewProjectDlg();
4323
4324         // create a new project:
4325         // create directories and grab current project, save it in new project tree in scripts/user.qe4
4326         // on linux we create under ~/.q3a, on win32 under strEnginePath
4327         // NOTE: working on a seperate project file might be broken, never did much experiment with that..
4328         if ( ( name != NULL ) && ( strlen( name ) > 0 ) ) {
4329                 CString strNewBasePath;
4330
4331                 // NOTE TTimo this would probably not work right on *nix
4332                 strNewBasePath = g_pGameDescription->mEnginePath.GetBuffer(); // assume paths end with '/'
4333                 strNewBasePath += name;
4334                 strNewBasePath += "/";
4335
4336                 CString strProjToLoad;
4337                 CString strMapToLoad;
4338
4339                 // if the dir exists, ask the user if they want to continue anyway
4340                 if ( Q_mkdir( strNewBasePath.GetBuffer(), 0755 ) != 0 ) {
4341                         CString strMsg;
4342                         strMsg.Format( "The directory name %s already exists\nContinue anyway ?\n", strNewBasePath.GetBuffer() );
4343                         Sys_Printf( strMsg );
4344                         if ( gtk_MessageBox( m_pWidget, _( strMsg ), _( "Error" ), MB_YESNO ) != IDYES ) {
4345                                 Sys_Printf( "New Project cancelled, directory already exists for project\n" );
4346                                 free( name );
4347                                 return;
4348                         }
4349                 }
4350
4351                 CString strDir;
4352                 strDir = strNewBasePath;
4353                 strDir += "maps/";
4354                 Q_mkdir( strDir.GetBuffer(), 0755 );
4355
4356                 strDir = strNewBasePath;
4357                 strDir += "textures/";
4358                 Q_mkdir( strDir.GetBuffer(), 0755 );
4359
4360                 strDir = strNewBasePath;
4361                 strDir += "scripts/";
4362                 Q_mkdir( strDir.GetBuffer(), 0755 );
4363
4364                 // print a warning for total conversions, since setting the basepath when required files are
4365                 // not there _will_ break things (ie; textures/radiant/notex.tga, scripts/entities.def)
4366                 Sys_FPrintf( SYS_WRN, "*** Note: basepath unchanged\n" );
4367
4368                 SetKeyValue( g_qeglobals.d_project_entity, "gamename", name );
4369
4370                 strDir = strNewBasePath;
4371                 strDir += "maps/autosave.map";
4372                 SetKeyValue( g_qeglobals.d_project_entity, "autosave", strDir.GetBuffer() );
4373
4374                 // state that this is a user project file, no templating
4375                 SetKeyValue( g_qeglobals.d_project_entity, "user_project", "1" );
4376                 // create the project file
4377                 strProjToLoad = strNewBasePath;
4378                 strProjToLoad += "scripts/";
4379                 strProjToLoad += name;
4380                 strProjToLoad += ".";
4381                 strProjToLoad += PROJECT_FILETYPE;
4382                 QE_SaveProject( strProjToLoad.GetBuffer() );
4383                 free( name );
4384         }
4385 }
4386
4387 void MainFrame::OnFileLoadproject(){
4388         if ( ConfirmModified() ) {
4389                 ProjectDialog();
4390         }
4391 }
4392
4393 void MainFrame::OnFileProjectsettings(){
4394         DoProjectSettings();
4395 }
4396
4397 void MainFrame::OnFilePointfile(){
4398         if ( g_qeglobals.d_pointfile_display_list ) {
4399                 Pointfile_Clear();
4400         }
4401         else{
4402                 Pointfile_Check();
4403         }
4404 }
4405
4406 void MainFrame::OnMru( unsigned int nID ){
4407         if ( ConfirmModified() ) {
4408                 MRU_Activate( nID - ID_FILE_RECENT1 );
4409         }
4410 }
4411
4412 void MainFrame::OnFileExit(){
4413         if ( ConfirmModified() ) {
4414                 // stop printing during shutdown
4415                 // NOTE: we should cleanly release GL contexts and stuff when exiting
4416
4417                 OnDelete();
4418
4419                 g_qeglobals_gui.d_edit = NULL;
4420                 gtk_widget_destroy( m_pWidget );
4421         }
4422 }
4423
4424 void MainFrame::OnFileCheckUpdate(){
4425         // build the URL
4426         Str URL;
4427         URL = "http://www.qeradiant.com/index.php?data=dlupdate&query_dlup=1";
4428 #ifdef _WIN32
4429         URL += "&OS_dlup=1";
4430 #else
4431         URL += "&OS_dlup=2";
4432 #endif
4433         URL += "&Version_dlup=" RADIANT_VERSION;
4434         g_PrefsDlg.mGamesDialog.AddPacksURL( URL );
4435         OpenURL( URL.GetBuffer() );
4436 }
4437
4438 void MainFrame::OnEditUndo(){
4439         Undo_Undo();
4440 }
4441
4442 void MainFrame::OnEditRedo(){
4443         Undo_Redo();
4444 }
4445
4446 void MainFrame::OnEditCopybrush(){
4447         Copy();
4448 }
4449
4450 void MainFrame::OnEditPastebrush(){
4451         Select_Deselect();
4452
4453         Undo_Start( "paste" );
4454
4455         Paste();
4456
4457         Undo_EndBrushList( &selected_brushes );
4458         Undo_End();
4459 }
4460
4461 void MainFrame::OnEditPastebrushToCamera(){
4462         Select_Deselect();
4463         if ( ActiveXY() ) {
4464                 vec3_t mid, camorigin, delta;
4465
4466                 ActiveXY()->Paste();
4467
4468                 // Work out the delta
4469                 Select_GetMid( mid );
4470
4471                 // Snap camera origin to grid
4472                 VectorCopy( m_pCamWnd->Camera()->origin, camorigin );
4473                 camorigin[0] = floor( camorigin[0] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4474                 camorigin[1] = floor( camorigin[1] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4475                 camorigin[2] = floor( camorigin[2] / g_qeglobals.d_gridsize + 0.5 ) * g_qeglobals.d_gridsize;
4476
4477                 VectorSubtract( camorigin, mid, delta );
4478
4479                 // Move to camera
4480                 Select_Move( delta, false );
4481
4482                 Undo_Start( "paste to camera" );
4483                 Undo_EndBrushList( &selected_brushes );
4484                 Undo_End();
4485         }
4486 }
4487
4488 void MainFrame::OnSelectionDelete(){
4489         brush_t *brush;
4490         //if (ActiveXY())
4491         //      ActiveXY()->UndoCopy();
4492         Undo_Start( "delete" );
4493         Undo_AddBrushList( &selected_brushes );
4494         //add all deleted entities to the undo
4495         for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
4496         {
4497                 Undo_AddEntity( brush->owner );
4498         }
4499         // NOTE: Select_Delete does NOT delete entities
4500         Select_Delete();
4501         Undo_EndBrushList( &selected_brushes );
4502         Undo_End();
4503 }
4504
4505 void MainFrame::OnEditMapinfo(){
4506         DoMapInfo();
4507 }
4508
4509 void MainFrame::OnEditEntityinfo(){
4510         DoEntityList();
4511 }
4512
4513 void MainFrame::OnBrushScripts(){
4514         DoScriptsDlg();
4515 }
4516
4517 void MainFrame::OnEditLoadprefab(){
4518         const char *filename;
4519         CString CurPath;
4520
4521         if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4522                 CurPath = g_PrefsDlg.m_strPrefabPath;
4523                 AddSlash( CurPath );
4524         }
4525
4526         filename = file_dialog( m_pWidget, TRUE, _( "Import Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4527
4528         if ( filename != NULL ) {
4529                 Map_ImportFile( filename );
4530         }
4531 }
4532
4533 void MainFrame::OnEditSaveprefab(){
4534         const char *filename;
4535         CString CurPath;
4536
4537         if ( g_PrefsDlg.m_strPrefabPath.GetLength() > 0 ) {
4538                 CurPath = g_PrefsDlg.m_strPrefabPath;
4539         }
4540         else
4541         {
4542                 char tmp[PATH_MAX];
4543                 getcwd( tmp, PATH_MAX );
4544                 CurPath = tmp;
4545         }
4546         AddSlash( CurPath );
4547
4548         filename = file_dialog( m_pWidget, FALSE, _( "Export Prefab" ), CurPath.GetBuffer(), MAP_MAJOR, "prefabs/" );
4549         if ( filename != NULL ) {
4550                 Map_SaveSelected( filename );
4551         }
4552 }
4553
4554 void MainFrame::OnPrefs(){
4555         int nView = g_PrefsDlg.m_nView;
4556         bool bToolbar = g_PrefsDlg.m_bWideToolbar;
4557         bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar;
4558         int nShader = g_PrefsDlg.m_nShader;
4559         int nTextureQuality = g_PrefsDlg.m_nTextureQuality;
4560 //  int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses;
4561         g_PrefsDlg.LoadPrefs();
4562
4563         if ( g_PrefsDlg.DoModal() == IDOK ) {
4564                 if ( ( g_PrefsDlg.m_nLatchedView != nView ) ||
4565                          ( g_PrefsDlg.m_bLatchedDetachableMenus != g_PrefsDlg.m_bDetachableMenus ) ||
4566                          ( g_PrefsDlg.m_bLatchedWideToolbar != bToolbar ) ||
4567                          ( g_PrefsDlg.m_bLatchedPatchToolbar != bToolbar ) ||
4568                          ( g_PrefsDlg.m_bLatchedPluginToolbar != bPluginToolbar ) ||
4569                          ( g_PrefsDlg.m_nLatchedShader != nShader ) ||
4570                          ( g_PrefsDlg.m_nLatchedTextureQuality != nTextureQuality )
4571                          || ( g_PrefsDlg.m_bLatchedFloatingZ != g_PrefsDlg.m_bFloatingZ )
4572                          ) {
4573                         gtk_MessageBox( m_pWidget, _( "You must restart Radiant for the changes to take effect." ) );
4574                 }
4575
4576                 // if the view mode was switched to floating, set the Z window on by default
4577                 // this was originally intended as a bug fix, but the fix is elsewhere .. anyway making sure we force Z on each time is good
4578                 // (and we simply hope there will be a SavePrefs before we die)
4579                 if ( ( g_PrefsDlg.m_nView != nView ) && ( (EViewStyle)g_PrefsDlg.m_nView == (EViewStyle)eFloating ) ) {
4580                         g_PrefsDlg.m_bZVis = true;
4581                 }
4582
4583                 if ( m_pTexWnd ) {
4584                         m_pTexWnd->UpdatePrefs();
4585                 }
4586
4587                 GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
4588                 g_bIgnoreCommands++;
4589                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4590                                                                                 ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
4591                 g_bIgnoreCommands--;
4592         }
4593 }
4594
4595 void MainFrame::OnTogglecamera(){
4596         if ( CurrentStyle() == eFloating ) { // floating views
4597                 if ( m_pCamWnd && m_pCamWnd->m_pParent ) {
4598                         if ( GTK_WIDGET_VISIBLE( m_pCamWnd->m_pParent ) ) {
4599                                 widget_delete_hide( m_pCamWnd->m_pParent );
4600                         }
4601                         else{
4602                                 gtk_widget_show( m_pCamWnd->m_pParent );
4603                         }
4604                 }
4605         }
4606         else
4607         {
4608                 if ( GTK_WIDGET_VISIBLE( m_pCamWnd->GetWidget() ) ) {
4609                         gtk_widget_hide( m_pCamWnd->GetWidget() );
4610                 }
4611                 else{
4612                         gtk_widget_show( m_pCamWnd->GetWidget() );
4613                 }
4614         }
4615 }
4616
4617 void MainFrame::OnToggleconsole(){
4618         if ( FloatingGroupDialog() ) { // QE4 style
4619                 if ( inspector_mode == W_CONSOLE ) {
4620                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4621                                 widget_delete_hide( g_qeglobals_gui.d_entity );
4622                         }
4623                         else{
4624                                 gtk_widget_show( g_qeglobals_gui.d_entity );
4625                         }
4626                 }
4627                 else
4628                 {
4629                         gtk_widget_show( g_qeglobals_gui.d_entity );
4630                         SetInspectorMode( W_CONSOLE );
4631                 }
4632         }
4633 }
4634
4635 // trigger the entity inspector on/off
4636 void MainFrame::OnViewEntity(){
4637         // make sure we're working with the current selection (bugzilla #436)
4638         if ( !GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4639                 Select_Reselect();
4640         }
4641
4642         if ( !FloatingGroupDialog() ) {
4643                 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_ENTITY ) {
4644                         widget_delete_hide( g_qeglobals_gui.d_entity );
4645                 }
4646                 else
4647                 {
4648                         gtk_widget_show( g_qeglobals_gui.d_entity );
4649                         SetInspectorMode( W_ENTITY );
4650                 }
4651         }
4652         else
4653         {
4654                 if ( inspector_mode == W_ENTITY ) {
4655                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4656                                 widget_delete_hide( g_qeglobals_gui.d_entity );
4657                         }
4658                         else{
4659                                 gtk_widget_show( g_qeglobals_gui.d_entity );
4660                         }
4661                 }
4662                 else
4663                 {
4664                         gtk_widget_show( g_qeglobals_gui.d_entity );
4665                         SetInspectorMode( W_ENTITY );
4666                 }
4667         }
4668 }
4669
4670 void MainFrame::OnViewGroups(){
4671         if ( !FloatingGroupDialog() ) {
4672                 if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) && inspector_mode == W_GROUP ) {
4673                         widget_delete_hide( g_qeglobals_gui.d_entity );
4674                 }
4675                 else
4676                 {
4677                         gtk_widget_show( g_qeglobals_gui.d_entity );
4678                         SetInspectorMode( W_GROUP );
4679                 }
4680         }
4681         else
4682         {
4683                 if ( inspector_mode == W_GROUP && CurrentStyle() != MainFrame::eFloating ) {
4684                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
4685                                 widget_delete_hide( g_qeglobals_gui.d_entity );
4686                         }
4687                         else{
4688                                 gtk_widget_show( g_qeglobals_gui.d_entity );
4689                         }
4690                 }
4691                 else
4692                 {
4693                         gtk_widget_show( g_qeglobals_gui.d_entity );
4694                         SetInspectorMode( W_GROUP );
4695                 }
4696         }
4697 }
4698
4699 void MainFrame::OnToggleview(){
4700         if ( CurrentStyle() == eFloating ) { // QE4 style
4701                 if ( m_pXYWnd && m_pXYWnd->m_pParent ) {
4702                         if ( GTK_WIDGET_VISIBLE( m_pXYWnd->m_pParent ) ) {
4703                                 widget_delete_hide( m_pXYWnd->m_pParent );
4704                         }
4705                         else{
4706                                 gtk_widget_show( m_pXYWnd->m_pParent );
4707                         }
4708                 }
4709         }
4710 }
4711
4712 void MainFrame::OnToggleviewXz(){
4713         if ( CurrentStyle() == eFloating ) { // QE4 style
4714                 if ( m_pXZWnd && m_pXZWnd->m_pParent ) {
4715                         // get windowplacement doesn't actually save this so we will here
4716                         g_PrefsDlg.m_bXZVis = GTK_WIDGET_VISIBLE( m_pXZWnd->m_pParent );
4717                         if ( g_PrefsDlg.m_bXZVis ) {
4718                                 widget_delete_hide( m_pXZWnd->m_pParent );
4719                         }
4720                         else{
4721                                 gtk_widget_show( m_pXZWnd->m_pParent );
4722                         }
4723                         g_PrefsDlg.m_bXZVis ^= 1;
4724                         g_PrefsDlg.SavePrefs();
4725                 }
4726         }
4727 }
4728
4729 void MainFrame::OnToggleviewYz(){
4730         if ( CurrentStyle() == eFloating ) { // QE4 style
4731                 if ( m_pYZWnd && m_pYZWnd->m_pParent ) {
4732                         g_PrefsDlg.m_bYZVis = GTK_WIDGET_VISIBLE( m_pYZWnd->m_pParent );
4733                         if ( g_PrefsDlg.m_bYZVis ) {
4734                                 widget_delete_hide( m_pYZWnd->m_pParent );
4735                         }
4736                         else{
4737                                 gtk_widget_show( m_pYZWnd->m_pParent );
4738                         }
4739                         g_PrefsDlg.m_bYZVis ^= 1;
4740                         g_PrefsDlg.SavePrefs();
4741                 }
4742         }
4743 }
4744
4745 void MainFrame::OnTogglez(){
4746         if ( g_pParentWnd->FloatingGroupDialog() ) { // QE4 style
4747                 if ( m_pZWnd && m_pZWnd->m_pParent ) {
4748                         if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
4749                                 widget_delete_hide( m_pZWnd->m_pParent );
4750                         }
4751                         else{
4752                                 gtk_widget_show( m_pZWnd->m_pParent );
4753                         }
4754                         g_PrefsDlg.m_bZVis ^= 1;
4755                         g_PrefsDlg.SavePrefs();
4756                 }
4757         }
4758         else {
4759                 Sys_FPrintf( SYS_WRN, "Z view toggle is only valid in floating views\n" );
4760         }
4761 }
4762
4763 void MainFrame::OnViewCenter(){
4764         m_pCamWnd->Camera()->angles[ROLL] = m_pCamWnd->Camera()->angles[PITCH] = 0;
4765         m_pCamWnd->Camera()->angles[YAW] = 22.5 * floor( ( m_pCamWnd->Camera()->angles[YAW] + 11 ) / 22.5 );
4766         Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
4767 }
4768
4769 void MainFrame::OnViewUpfloor(){
4770         m_pCamWnd->Cam_ChangeFloor( true );
4771 }
4772
4773 void MainFrame::OnViewDownfloor(){
4774         m_pCamWnd->Cam_ChangeFloor( false );
4775 }
4776
4777 void MainFrame::OnViewCenterview(){
4778         if ( CurrentStyle() == eSplit ) {
4779                 GetXYWnd()->PositionView();
4780                 GetXZWnd()->PositionView();
4781                 GetYZWnd()->PositionView();
4782                 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4783         }
4784         else {
4785                 m_pXYWnd->PositionView();
4786                 Sys_UpdateWindows( W_XY );
4787         }
4788 }
4789
4790 void MainFrame::OnViewNextview(){
4791         if ( CurrentStyle() == eSplit ) {
4792                 GetXYWnd()->PositionView();
4793                 GetXZWnd()->PositionView();
4794                 GetYZWnd()->PositionView();
4795                 Sys_UpdateWindows( W_XY | W_XZ | W_YZ );
4796         }
4797         else {
4798                 if ( m_pXYWnd->GetViewType() == XY ) {
4799                         m_pXYWnd->SetViewType( XZ );
4800                 }
4801                 else
4802                 if ( m_pXYWnd->GetViewType() ==  XZ ) {
4803                         m_pXYWnd->SetViewType( YZ );
4804                 }
4805                 else{
4806                         m_pXYWnd->SetViewType( XY );
4807                 }
4808                 m_pXYWnd->PositionView();
4809                 Sys_UpdateWindows( W_XY );
4810         }
4811 }
4812
4813 void MainFrame::OnViewXy(){
4814         if ( !FloatingGroupDialog() ) {
4815                 m_pXYWnd->SetViewType( XY );
4816                 m_pXYWnd->PositionView();
4817         }
4818         Sys_UpdateWindows( W_XY );
4819 }
4820
4821 void MainFrame::OnViewSide(){
4822         if ( !FloatingGroupDialog() ) {
4823                 m_pXYWnd->SetViewType( XZ );
4824                 m_pXYWnd->PositionView();
4825         }
4826         Sys_UpdateWindows( W_XY );
4827 }
4828
4829 void MainFrame::OnViewFront(){
4830         if ( !FloatingGroupDialog() ) {
4831                 m_pXYWnd->SetViewType( YZ );
4832                 m_pXYWnd->PositionView();
4833         }
4834         Sys_UpdateWindows( W_XY );
4835 }
4836
4837 void MainFrame::OnView100(){
4838         if ( m_pXYWnd ) {
4839                 m_pXYWnd->SetScale( 1 );
4840         }
4841         if ( m_pXZWnd ) {
4842                 m_pXZWnd->SetScale( 1 );
4843         }
4844         if ( m_pYZWnd ) {
4845                 m_pYZWnd->SetScale( 1 );
4846         }
4847         Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4848 }
4849
4850 void MainFrame::OnViewZoomin(){
4851         if ( m_pXYWnd && m_pXYWnd->Active() ) {
4852                 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 5.0 / 4 );
4853                 if ( m_pXYWnd->Scale() > 30 ) {
4854                         m_pXYWnd->SetScale( 30 );
4855                 }
4856         }
4857
4858         if ( m_pXZWnd && m_pXZWnd->Active() ) {
4859                 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 5.0 / 4 );
4860                 if ( m_pXZWnd->Scale() > 30 ) {
4861                         m_pXZWnd->SetScale( 30 );
4862                 }
4863         }
4864
4865         if ( m_pYZWnd && m_pYZWnd->Active() ) {
4866                 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 5.0 / 4 );
4867                 if ( m_pYZWnd->Scale() > 30 ) {
4868                         m_pYZWnd->SetScale( 30 );
4869                 }
4870         }
4871
4872         Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4873 }
4874
4875 // NOTE: the zoom out factor is 4/5, we could think about customizing it
4876 //  we don't go below a zoom factor corresponding to 10% of the max world size
4877 //  (this has to be computed against the window size)
4878 void MainFrame::OnViewZoomout(){
4879         float min_scale;
4880         if ( m_pXYWnd && m_pXYWnd->Active() ) {
4881                 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 4.0 / 5 );
4882                 min_scale = MIN( m_pXYWnd->Width(),m_pXYWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4883                 if ( m_pXYWnd->Scale() < min_scale ) {
4884                         m_pXYWnd->SetScale( min_scale );
4885                 }
4886         }
4887
4888         if ( m_pXZWnd && m_pXZWnd->Active() ) {
4889                 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 4.0 / 5 );
4890                 min_scale = MIN( m_pXZWnd->Width(),m_pXZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4891                 if ( m_pXZWnd->Scale() < min_scale ) {
4892                         m_pXZWnd->SetScale( min_scale );
4893                 }
4894         }
4895
4896         if ( m_pYZWnd && m_pYZWnd->Active() ) {
4897                 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 4.0 / 5 );
4898                 min_scale = MIN( m_pYZWnd->Width(),m_pYZWnd->Height() ) / ( 1.1 * ( g_MaxWorldCoord - g_MinWorldCoord ) );
4899                 if ( m_pYZWnd->Scale() < min_scale ) {
4900                         m_pYZWnd->SetScale( min_scale );
4901                 }
4902         }
4903         Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
4904 }
4905
4906 void MainFrame::OnViewZ100(){
4907         z.scale = 1;
4908         Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4909 }
4910
4911 void MainFrame::OnViewZzoomin(){
4912         z.scale *= 5.0 / 4;
4913         if ( z.scale > 4 ) {
4914                 z.scale = 4;
4915         }
4916         Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4917 }
4918
4919 void MainFrame::OnViewZzoomout(){
4920         z.scale *= 4.0f / 5;
4921         if ( z.scale < 0.125 ) {
4922                 z.scale = 0.125;
4923         }
4924         Sys_UpdateWindows( W_Z | W_Z_OVERLAY );
4925 }
4926
4927 void MainFrame::OnViewCubein(){
4928         g_PrefsDlg.m_nCubicScale--;
4929         if ( g_PrefsDlg.m_nCubicScale < 1 ) {
4930                 g_PrefsDlg.m_nCubicScale = 1;
4931         }
4932         g_PrefsDlg.SavePrefs();
4933         Sys_UpdateWindows( W_CAMERA );
4934         SetGridStatus();
4935 }
4936
4937 void MainFrame::OnViewCubeout(){
4938         g_PrefsDlg.m_nCubicScale++;
4939         if ( g_PrefsDlg.m_nCubicScale > 22 ) {
4940                 g_PrefsDlg.m_nCubicScale = 22;
4941         }
4942         g_PrefsDlg.SavePrefs();
4943         Sys_UpdateWindows( W_CAMERA );
4944         SetGridStatus();
4945 }
4946
4947 void MainFrame::OnViewShownames(){
4948         g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
4949         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
4950         g_bIgnoreCommands++;
4951         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4952                                                                         g_qeglobals.d_savedinfo.show_names ? TRUE : FALSE );
4953         g_bIgnoreCommands--;
4954         Sys_UpdateWindows( W_XY );
4955 }
4956
4957 void MainFrame::OnViewShowAngles(){
4958         g_qeglobals.d_savedinfo.show_angles = !g_qeglobals.d_savedinfo.show_angles;
4959         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
4960         g_bIgnoreCommands++;
4961         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4962                                                                         g_qeglobals.d_savedinfo.show_angles ? TRUE : FALSE );
4963         g_bIgnoreCommands--;
4964         Sys_UpdateWindows( W_XY );
4965 }
4966
4967 void MainFrame::OnViewShowblocks(){
4968         g_qeglobals.show_blocks ^= 1;
4969         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showblocks" ) );
4970         g_bIgnoreCommands++;
4971         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.show_blocks ? TRUE : FALSE );
4972         g_bIgnoreCommands--;
4973         Sys_UpdateWindows( W_XY );
4974 }
4975
4976 void MainFrame::OnViewShowcoordinates(){
4977         g_qeglobals.d_savedinfo.show_coordinates ^= 1;
4978         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
4979         g_bIgnoreCommands++;
4980         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4981                                                                         g_qeglobals.d_savedinfo.show_coordinates ? TRUE : FALSE );
4982         g_bIgnoreCommands--;
4983         Sys_UpdateWindows( W_XY | W_Z );
4984 }
4985
4986 void MainFrame::OnViewShowOutline(){
4987         g_qeglobals.d_savedinfo.show_outline ^= 1;
4988         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
4989         g_bIgnoreCommands++;
4990         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
4991                                                                         g_qeglobals.d_savedinfo.show_outline ? TRUE : FALSE );
4992         g_bIgnoreCommands--;
4993         Sys_UpdateWindows( W_XY );
4994 }
4995
4996 void MainFrame::OnViewShowAxes(){
4997         g_qeglobals.d_savedinfo.show_axis ^= 1;
4998         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
4999         g_bIgnoreCommands++;
5000         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
5001                                                                         g_qeglobals.d_savedinfo.show_axis ? TRUE : FALSE );
5002         g_bIgnoreCommands--;
5003         Sys_UpdateWindows( W_XY );
5004 }
5005
5006 void MainFrame::OnViewShowWorkzone(){
5007         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showworkzone" ) );
5008         g_bIgnoreCommands++;
5009         if ( g_qeglobals.d_show_work ) {
5010                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
5011                 g_qeglobals.d_show_work = false;
5012         }
5013         else
5014         {
5015                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5016                 g_qeglobals.d_show_work = true;
5017         }
5018         g_bIgnoreCommands--;
5019         Sys_UpdateWindows( W_XY );
5020 }
5021
5022 void MainFrame::OnViewHideshowHideselected(){
5023         Select_Hide();
5024         Select_Deselect();
5025 }
5026
5027 void MainFrame::OnViewHideshowShowhidden(){
5028         Select_ShowAllHidden();
5029 }
5030
5031 /**
5032    sets the view mode for the entities
5033    called upon LoadPrefs too
5034    NOTE TTimo previous implementation had a SavePrefs call
5035    .. I don't think it is relevant, removed (the prefs are saved upon exit)
5036    NOTE TTimo we activate the menu item, this is only needed when we are called upon a prefs load
5037    (otherwise we are always called following user action on the widget)
5038  */
5039 void MainFrame::OnEntitiesSetViewAs( int mode ){
5040         gpointer item = NULL;
5041         if ( mode == 0 ) {
5042                 switch ( g_PrefsDlg.m_nEntityShowState )
5043                 {
5044                 case ENTITY_BOX:
5045                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5046                         break;
5047                 case ENTITY_WIRE:
5048                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5049                         break;
5050                 case ENTITY_SELECTED:
5051                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5052                         break;
5053                 case ENTITY_SELECTED_SKIN:
5054                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5055                         break;
5056                 case ENTITY_SKINNED:
5057                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5058                         break;
5059                 case ENTITY_SKINNED_BOXED:
5060                         item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5061                         break;
5062                 }
5063                 g_bIgnoreCommands++;
5064                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5065                 g_bIgnoreCommands--;
5066                 return;
5067         }
5068
5069         switch ( mode )
5070         {
5071         case ID_VIEW_ENTITIESAS_BOUNDINGBOX:
5072                 g_PrefsDlg.m_nEntityShowState = ENTITY_BOX;
5073                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_boundingbox" );
5074                 break;
5075         case ID_VIEW_ENTITIESAS_WIREFRAME:
5076                 g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
5077                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_wireframe" );
5078                 break;
5079         case ID_VIEW_ENTITIESAS_SELECTEDWIREFRAME:
5080                 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED;
5081                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedwireframe" );
5082                 break;
5083         case ID_VIEW_ENTITIESAS_SELECTEDSKINNED:
5084                 g_PrefsDlg.m_nEntityShowState = ENTITY_SELECTED_SKIN;
5085                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_selectedskinned" );
5086                 break;
5087         case ID_VIEW_ENTITIESAS_SKINNED:
5088                 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5089                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinned" );
5090                 break;
5091         case ID_VIEW_ENTITIESAS_SKINNEDANDBOXED:
5092                 g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED_BOXED;
5093                 item = g_object_get_data( G_OBJECT( g_pParentWnd->m_pWidget ), "menu_view_entitiesas_skinnedandboxed" );
5094                 break;
5095         default:
5096                 Sys_FPrintf( SYS_ERR, "Entity mode ID_ not found in MainFrame::Entities_SetViewAs\n" );
5097                 return;
5098         }
5099
5100         if ( !item ) {
5101                 Sys_FPrintf( SYS_ERR, "menu not found in MainFrame::Entities_SetViewAs\n" );
5102                 return;
5103         }
5104
5105         g_bIgnoreCommands++;
5106         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5107         g_bIgnoreCommands--;
5108
5109         Sys_UpdateWindows( W_ALL );
5110 }
5111
5112 void MainFrame::OnViewCubicclipping(){
5113         GtkWidget *w;
5114
5115         g_PrefsDlg.m_bCubicClipping ^= 1;
5116         g_bIgnoreCommands++;
5117         w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
5118         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5119         w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
5120         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), g_PrefsDlg.m_bCubicClipping ? TRUE : FALSE );
5121         g_bIgnoreCommands--;
5122         g_PrefsDlg.SavePrefs();
5123         //Map_BuildBrushData ();
5124         Sys_UpdateWindows( W_CAMERA );
5125 }
5126
5127 void MainFrame::OnViewOpengllighting(){
5128         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
5129         g_PrefsDlg.m_bGLLighting ^= 1;
5130         g_PrefsDlg.SavePrefs();
5131         g_bIgnoreCommands++;
5132         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bGLLighting ? TRUE : FALSE );
5133         Sys_UpdateWindows( W_XY | W_CAMERA );
5134         g_bIgnoreCommands--;
5135 }
5136
5137 void MainFrame::OnSelectionDragedges(){
5138         if ( g_qeglobals.d_select_mode == sel_edge ) {
5139                 g_qeglobals.d_select_mode = sel_brush;
5140                 Sys_UpdateWindows( W_ALL );
5141         }
5142         else
5143         {
5144                 SetupVertexSelection();
5145                 if ( g_qeglobals.d_numpoints ) {
5146                         g_qeglobals.d_select_mode = sel_edge;
5147                 }
5148                 Sys_UpdateWindows( W_ALL );
5149         }
5150 }
5151
5152 void MainFrame::OnSelectionDragvertecies(){
5153         if ( g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint ) {
5154                 g_qeglobals.d_select_mode = sel_brush;
5155                 Sys_UpdateWindows( W_ALL );
5156         }
5157         else
5158         {
5159                 //--if (QE_SingleBrush() && selected_brushes.next->patchBrush)
5160                 if ( OnlyPatchesSelected() ) {
5161                         Patch_EditPatch();
5162                 }
5163                 else //if (!AnyPatchesSelected()) // allows vertex mode when patches are selected
5164                 {
5165                         SetupVertexSelection();
5166                         if ( g_qeglobals.d_numpoints ) {
5167                                 g_qeglobals.d_select_mode = sel_vertex;
5168                         }
5169                 }
5170                 Sys_UpdateWindows( W_ALL );
5171         }
5172 }
5173
5174 void MainFrame::OnSelectionClone(){
5175         Select_Clone();
5176 }
5177
5178 // called when the escape key is used (either on the main window or on an inspector)
5179 void MainFrame::OnSelectionDeselect(){
5180         if ( g_bClipMode ) {
5181                 OnViewClipper();
5182         }
5183         else
5184         if ( g_bRotateMode ) {
5185                 OnSelectMouserotate();
5186         }
5187         else
5188         if ( g_bScaleMode ) {
5189                 OnSelectMousescale();
5190         }
5191         else
5192         if ( g_bPathMode ) {
5193                 if ( ActiveXY() ) {
5194                         ActiveXY()->KillPathMode();
5195                 }
5196         }
5197         else
5198         {
5199                 if ( g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0 ) {
5200                         g_qeglobals.d_num_move_points = 0;
5201                         Sys_UpdateWindows( W_ALL );
5202                 }
5203                 else
5204                 {
5205                         Select_Deselect();
5206                         SetStatusText( 2, " " );
5207                 }
5208         }
5209 }
5210
5211 void MainFrame::OnBrushFlipx(){
5212         Undo_Start( "flip X" );
5213         Undo_AddBrushList( &selected_brushes );
5214
5215         Select_FlipAxis( 0 );
5216         // spog - this does not work - it's a rotate not a flip
5217         /*
5218            for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5219            {
5220            if(b->owner->eclass->fixedsize)
5221            {
5222             char buf[16];
5223             float a = FloatForKey(b->owner, "angle");
5224             a = div ((int)(180 - a), 180).rem;
5225             sprintf (buf, "%d", (int)a);
5226             SetKeyValue(b->owner, "angle", buf);
5227             Brush_Build(b,true,true,false,false); // don't filter
5228            }
5229            }
5230          */
5231         Undo_EndBrushList( &selected_brushes );
5232         Undo_End();
5233 }
5234
5235 void MainFrame::OnBrushFlipy(){
5236         Undo_Start( "flip Y" );
5237         Undo_AddBrushList( &selected_brushes );
5238
5239         Select_FlipAxis( 1 );
5240         // spog - this does not work - it's a rotate not a flip
5241         /*
5242            for (brush_t *b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
5243            {
5244            if(b->owner->eclass->fixedsize)
5245            {
5246             float a = FloatForKey(b->owner, "angle");
5247             if (a == 0 || a == 180 || a == 360)
5248            continue;
5249             if ( a == 90 || a == 270)
5250             {
5251            a += 180;
5252             }
5253             else if (a > 270)
5254            a += 90;
5255             else if (a > 180)
5256            a -= 90;
5257             else if (a > 90)
5258            a += 90;
5259             else
5260            a -= 90;
5261             a = (int)a % 360;
5262             char buf[16];
5263             sprintf (buf, "%d", (int)a);
5264             SetKeyValue(b->owner, "angle", buf);
5265             Brush_Build(b,true,true,false,false); // don't filter
5266            }
5267
5268            }
5269          */
5270         Undo_EndBrushList( &selected_brushes );
5271         Undo_End();
5272 }
5273
5274 void MainFrame::OnBrushFlipz(){
5275         Undo_Start( "flip Z" );
5276         Undo_AddBrushList( &selected_brushes );
5277         Select_FlipAxis( 2 );
5278         Undo_EndBrushList( &selected_brushes );
5279         Undo_End();
5280 }
5281
5282 void MainFrame::OnBrushRotatex(){
5283         Undo_Start( "rotate X" );
5284         Undo_AddBrushList( &selected_brushes );
5285         Select_RotateAxis( 0, 90 );
5286         Undo_EndBrushList( &selected_brushes );
5287         Undo_End();
5288 }
5289
5290 void MainFrame::OnBrushRotatey(){
5291         Undo_Start( "rotate Y" );
5292         Undo_AddBrushList( &selected_brushes );
5293         Select_RotateAxis( 1, 90 );
5294         Undo_EndBrushList( &selected_brushes );
5295         Undo_End();
5296 }
5297
5298 void MainFrame::OnBrushRotatez(){
5299         Undo_Start( "rotate Z" );
5300         Undo_AddBrushList( &selected_brushes );
5301         Select_RotateAxis( 2, 90 );
5302         Undo_EndBrushList( &selected_brushes );
5303         Undo_End();
5304 }
5305
5306 void MainFrame::OnSelectionArbitraryrotation(){
5307         Undo_Start( "arbitrary rotation" );
5308         Undo_AddBrushList( &selected_brushes );
5309
5310         DoRotateDlg();
5311
5312         Undo_EndBrushList( &selected_brushes );
5313         Undo_End();
5314 }
5315
5316 void MainFrame::OnSelectScale(){
5317         Undo_Start( "scale" );
5318         Undo_AddBrushList( &selected_brushes );
5319         DoScaleDlg();
5320         Undo_EndBrushList( &selected_brushes );
5321         Undo_End();
5322 }
5323
5324 void MainFrame::OnSelectionMakehollow(){
5325         //if (ActiveXY())
5326         //      ActiveXY()->UndoCopy();
5327         Undo_Start( "hollow" );
5328         Undo_AddBrushList( &selected_brushes );
5329         CSG_MakeHollow();
5330         Undo_EndBrushList( &selected_brushes );
5331         Undo_End();
5332 }
5333
5334 void MainFrame::OnSelectionCsgsubtract(){
5335         Undo_Start( "CSG subtract" );
5336         CSG_Subtract();
5337         Undo_End();
5338 }
5339
5340 void MainFrame::OnSelectionCsgmerge(){
5341         Undo_Start( "CSG merge" );
5342         Undo_AddBrushList( &selected_brushes );
5343         CSG_Merge();
5344         Undo_EndBrushList( &selected_brushes );
5345         Undo_End();
5346 }
5347
5348 void MainFrame::OnSelectionNoOutline(){
5349         //g_qeglobals.d_savedinfo.bNoSelectedOutlines ^= 1;
5350         g_qeglobals.d_savedinfo.iSelectedOutlinesStyle = ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) ^ OUTLINE_ZBUF;
5351         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5352         g_bIgnoreCommands++;
5353         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5354         g_bIgnoreCommands--;
5355         Sys_UpdateWindows( W_CAMERA );
5356 }
5357
5358 void MainFrame::OnSelectionOutlineStyle(){
5359         if ( ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) && ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) ) {
5360                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_ZBUF;
5361         }
5362         else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_BSEL ) {
5363                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle &= ~OUTLINE_BSEL;
5364         }
5365         else if ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) {
5366                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_BSEL;
5367         }
5368         else{
5369                 g_qeglobals.d_savedinfo.iSelectedOutlinesStyle |= OUTLINE_ZBUF;
5370         }
5371         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
5372         g_bIgnoreCommands++;
5373         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
5374         g_bIgnoreCommands--;
5375         Sys_UpdateWindows( W_CAMERA );
5376 }
5377
5378 void MainFrame::OnSelectionSelectcompletetall(){
5379         if ( ActiveXY() ) {
5380                 ActiveXY()->UndoCopy();
5381         }
5382         Select_CompleteTall();
5383 }
5384
5385 void MainFrame::OnSelectionSelecttouching(){
5386         Select_Touching();
5387 }
5388
5389 void MainFrame::OnSelectionSelectpartialtall(){
5390         Select_PartialTall();
5391 }
5392
5393 void MainFrame::OnSelectionSelectinside(){
5394         Select_Inside();
5395 }
5396
5397 void MainFrame::OnViewClipper(){
5398         GtkWidget *w = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_clipper" ) );
5399         g_bIgnoreCommands++;
5400
5401         if ( ActiveXY() ) {
5402                 if ( ActiveXY()->ClipMode() ) {
5403                         ActiveXY()->SetClipMode( false );
5404                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), FALSE );
5405                 }
5406                 else
5407                 {
5408                         if ( ActiveXY()->RotateMode() ) {
5409                                 OnSelectMouserotate();
5410                         }
5411                         ActiveXY()->SetClipMode( true );
5412                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), TRUE );
5413                 }
5414         }
5415         g_bIgnoreCommands--;
5416 }
5417
5418 void MainFrame::OnClipSelected(){
5419         if ( m_pActiveXY && m_pActiveXY->ClipMode() ) {
5420                 Undo_Start( "clip selected" );
5421                 Undo_AddBrushList( &selected_brushes );
5422                 m_pActiveXY->Clip();
5423                 Undo_EndBrushList( &selected_brushes );
5424                 Undo_End();
5425         }
5426         else
5427         {
5428                 if ( g_bPatchBendMode ) {
5429                         Patch_BendHandleENTER();
5430                 }
5431 //    else if (g_bPatchBendMode)
5432 //      Patch_InsDelHandleENTER();
5433         }
5434 }
5435
5436 void MainFrame::OnSplitSelected(){
5437         if ( m_pActiveXY ) {
5438                 Undo_Start( "split selected" );
5439                 Undo_AddBrushList( &selected_brushes );
5440                 m_pActiveXY->SplitClip();
5441                 Undo_EndBrushList( &selected_brushes );
5442                 Undo_End();
5443         }
5444 }
5445
5446 void MainFrame::OnFlipClip(){
5447         if ( m_pActiveXY ) {
5448                 m_pActiveXY->FlipClip();
5449         }
5450 }
5451
5452 void MainFrame::OnSelectionConnect(){
5453         Undo_Start( "connect selected entities" );
5454         Undo_AddBrushList( &selected_brushes );
5455         ConnectEntities();
5456         Undo_EndBrushList( &selected_brushes );
5457         Undo_End();
5458 }
5459
5460 void MainFrame::OnSelectionUngroupentity(){
5461         Undo_Start( "ungroup selected entities" );
5462         Undo_AddBrushList( &selected_brushes );
5463         Select_Ungroup();
5464         Undo_EndBrushList( &selected_brushes );
5465         Undo_End();
5466 }
5467
5468 void MainFrame::OnSelectionMergeentity(){
5469         Undo_Start( "merge entity" );
5470         Undo_AddBrushList( &selected_brushes );
5471         Select_MergeEntity();
5472         Undo_EndBrushList( &selected_brushes );
5473         Undo_End();
5474 }
5475
5476 void MainFrame::OnSelectionGroupworld(){
5477         Undo_Start( "group world" );
5478         Undo_AddBrushList( &selected_brushes );
5479         Select_GroupEntity( world_entity );
5480         Undo_EndBrushList( &selected_brushes );
5481         Undo_End();
5482 }
5483
5484 void MainFrame::OnSelectionMakeDetail(){
5485         Undo_Start( "make detail" );
5486         Undo_AddBrushList( &selected_brushes );
5487         Select_MakeDetail();
5488         Undo_EndBrushList( &selected_brushes );
5489         Undo_End();
5490 }
5491
5492 void MainFrame::OnSelectionMakeStructural(){
5493         Undo_Start( "make structural" );
5494         Undo_AddBrushList( &selected_brushes );
5495         Select_MakeStructural();
5496         Undo_EndBrushList( &selected_brushes );
5497         Undo_End();
5498 }
5499
5500 void MainFrame::OnBspCommand( unsigned int nID ){
5501         // make sure we don't attempt to region compile a map with the camera outside the region
5502         if ( region_active ) {
5503                 vec3_t vOrig;
5504                 VectorSet( vOrig,
5505                                    (int)g_pParentWnd->GetCamWnd()->Camera()->origin[0],
5506                                    (int)g_pParentWnd->GetCamWnd()->Camera()->origin[1],
5507                                    (int)g_pParentWnd->GetCamWnd()->Camera()->origin[2] );
5508
5509                 int i;
5510                 for ( i = 0 ; i < 3 ; i++ )
5511                 {
5512                         if ( vOrig[i] > region_maxs[i] || vOrig[i] < region_mins[i] ) {
5513                                 Sys_FPrintf( SYS_ERR, "The camera must be in the region to start a region compile.\n" );
5514                                 return;
5515                         }
5516                 }
5517         }
5518
5519         // if the map has not been saved yet we need to handle it now before we start processing the BSP commands
5520         if ( stricmp( currentmap, "unnamed.map" ) == 0 ) {
5521                 OnFileSaveas();
5522         }
5523
5524         if ( g_PrefsDlg.m_bSnapShots && ( stricmp( currentmap, "unnamed.map" ) != 0 ) ) {
5525                 Map_Snapshot();
5526         }
5527
5528         if ( g_qeglobals.bBSPFrontendPlugin ) {
5529                 char *cmd = (char*)g_slist_nth_data( g_BSPFrontendCommands, nID - CMD_BSPCOMMAND );
5530                 g_BSPFrontendTable.m_pfnDispatchBSPCommand( cmd );
5531         }
5532         else
5533         {
5534                 RunBsp( bsp_commands[nID - CMD_BSPCOMMAND] );
5535         }
5536 }
5537
5538 void MainFrame::OnGrid( unsigned int nID ){
5539         if ( nID == ID_GRID_025 ) {
5540                 g_qeglobals.d_gridsize = 0.25f;
5541                 g_qeglobals.d_bSmallGrid = true;
5542         }
5543         else if ( nID == ID_GRID_05 ) {
5544                 g_qeglobals.d_gridsize = 0.5f;
5545                 g_qeglobals.d_bSmallGrid = true;
5546         }
5547         else
5548         {
5549                 switch ( nID )
5550                 {
5551                 case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
5552                 case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
5553                 case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
5554                 case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
5555                 case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
5556                 case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
5557                 case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
5558                 case ID_GRID_128: g_qeglobals.d_gridsize = 7; break;
5559                 case ID_GRID_256: g_qeglobals.d_gridsize = 8; break;
5560                 }
5561                 g_qeglobals.d_gridsize = 1 << (int)g_qeglobals.d_gridsize;
5562                 g_qeglobals.d_bSmallGrid = false;
5563         }
5564
5565         SetGridStatus();
5566
5567         // SnapTToGrid option: need to check everywhere the grid size is changed
5568         // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
5569         if ( g_PrefsDlg.m_bSnapTToGrid ) {
5570                 DoSnapTToGrid();
5571         }
5572
5573         Sys_UpdateWindows( W_XY | W_Z );
5574 }
5575
5576 void MainFrame::OnSnaptogrid(){
5577         g_PrefsDlg.m_bSnap ^= 1;
5578         g_PrefsDlg.SavePrefs();
5579
5580         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
5581         g_bIgnoreCommands++;
5582         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bSnap ? TRUE : FALSE );
5583         g_bIgnoreCommands--;
5584 }
5585
5586 void MainFrame::OnTexturesShowinuse(){
5587         Sys_BeginWait();
5588         Texture_ShowInuse();
5589 #ifdef _DEBUG
5590         if ( !g_bShowAllShaders ) {
5591                 Sys_Printf( "Already showing only in-use textures.\n" );
5592         }
5593 #endif
5594         Sys_UpdateWindows( W_TEXTURE );
5595         Sys_EndWait();
5596 }
5597
5598 void MainFrame::OnTexturesShowall(){
5599         Texture_ShowAll();
5600 }
5601
5602 // do some triggering on/off, if the inspector is already up then hide it
5603 void MainFrame::OnTexturesInspector(){
5604         ToggleSurface();
5605 }
5606
5607 void MainFrame::OnViewNearest( unsigned int nID ){
5608         Texture_SetMode( nID );
5609 }
5610
5611 void MainFrame::OnTextureReplaceall(){
5612         FindTextureDialog::show();
5613 }
5614
5615 void MainFrame::OnToggleLock(){
5616         g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
5617
5618         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
5619         g_bIgnoreCommands++;
5620         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTextureLock ? TRUE : FALSE );
5621         g_bIgnoreCommands--;
5622         g_PrefsDlg.SavePrefs();
5623         SetGridStatus();
5624 }
5625
5626 void MainFrame::OnToggleRotatelock(){
5627         g_PrefsDlg.m_bRotateLock ^= 1;
5628
5629         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
5630         g_bIgnoreCommands++;
5631         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bRotateLock ? TRUE : FALSE );
5632         g_bIgnoreCommands--;
5633         g_PrefsDlg.SavePrefs();
5634         SetGridStatus();
5635 }
5636
5637 // use a dialog for direct selection of a texture menu
5638 // the API is a bit crappy, we need to set texture_directory to the directory name in <basepath>/textures/
5639 void MainFrame::OnTexturesLoad(){
5640         char def_path[NAME_MAX];
5641
5642         // FIXME
5643         // check if that works with fs_game (I suspect some more design is needed)
5644         // see how this is done in 1.2?
5645         strcpy( def_path, g_pGameDescription->mEnginePath.GetBuffer() );
5646         strcat( def_path, g_pGameDescription->mBaseGame.GetBuffer() );
5647         strcat( def_path, "/" );
5648
5649         char *dir = dir_dialog( m_pWidget, _( "Load textures from path" ), def_path );
5650
5651         if ( dir != NULL ) {
5652                 // very uncertain task, let's hope the guy pointed to somewhere below the dir we gave him
5653                 Sys_Printf( "user select: '%s'\n", dir );
5654                 // remove a potential trailing slash?
5655                 if ( dir[strlen( dir ) - 1] == '/' || dir[strlen( dir ) - 1] == '\\' ) {
5656                         dir[strlen( dir ) - 1] = '\0';
5657                 }
5658                 char *pouic = MAX( strrchr( dir, '/' ),strrchr( dir, '\\' ) );
5659                 if ( pouic ) {
5660                         strcpy( texture_directory, pouic + 1 );
5661                         Sys_Printf( "Loading '%s'\n", texture_directory );
5662                         Texture_ShowDirectory();
5663                 }
5664                 else{
5665                         Sys_FPrintf( SYS_WRN, "Failed to extract the directory\n" );
5666                 }
5667                 g_free( dir );
5668         }
5669         else{
5670                 Sys_FPrintf( SYS_WRN, "texture load dialog cancelled\n" );
5671         }
5672 }
5673
5674 void MainFrame::OnTexturesReloadshaders(){
5675         Sys_BeginWait();
5676         QERApp_ReloadShaders();
5677         // current shader
5678         // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
5679         Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
5680         Sys_UpdateWindows( W_ALL );
5681         Sys_EndWait();
5682 }
5683
5684 void MainFrame::OnTexturesShadersShow(){
5685         g_PrefsDlg.m_bShowShaders ^= 1;
5686         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
5687         g_bIgnoreCommands++;
5688         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
5689         g_bIgnoreCommands--;
5690         Sys_UpdateWindows( W_TEXTURE );
5691 }
5692
5693 void MainFrame::SetTextureScale( int id ){
5694         GtkWidget *item;
5695
5696         switch ( id )
5697         {
5698         case ID_TEXTURES_TEXTUREWINDOWSCALE_10:
5699                 g_PrefsDlg.m_nTextureScale = 10;
5700                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_10" ) );
5701                 break;
5702         case ID_TEXTURES_TEXTUREWINDOWSCALE_25:
5703                 g_PrefsDlg.m_nTextureScale = 25;
5704                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_25" ) );
5705                 break;
5706         case ID_TEXTURES_TEXTUREWINDOWSCALE_50:
5707                 g_PrefsDlg.m_nTextureScale = 50;
5708                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_50" ) );
5709                 break;
5710         case ID_TEXTURES_TEXTUREWINDOWSCALE_200:
5711                 g_PrefsDlg.m_nTextureScale = 200;
5712                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_200" ) );
5713                 break;
5714         default:
5715                 g_PrefsDlg.m_nTextureScale = 100;
5716                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_texturewindowscale_100" ) );
5717                 break;
5718         }
5719
5720         g_bIgnoreCommands++;
5721         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
5722         g_bIgnoreCommands--;
5723
5724         Texture_ResetPosition();
5725 }
5726
5727 void MainFrame::OnTexturewindowScaleup(){
5728         switch ( g_PrefsDlg.m_nTextureScale ) {
5729         // 200, all the way in, don't do anything
5730         case 100:
5731                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_200 );
5732                 break;
5733         case 50:
5734                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5735                 break;
5736         case 25:
5737                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5738                 break;
5739         case 10:
5740                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5741                 break;
5742         }
5743 }
5744
5745 void MainFrame::OnTexturewindowScaledown(){
5746         switch ( g_PrefsDlg.m_nTextureScale ) {
5747         case 200:
5748                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_100 );
5749                 break;
5750         case 100:
5751                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_50 );
5752                 break;
5753         case 50:
5754                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_25 );
5755                 break;
5756         case 25:
5757                 SetTextureScale( ID_TEXTURES_TEXTUREWINDOWSCALE_10 );
5758                 break;
5759                 // 10, all the way out, don't do anything
5760         }
5761 }
5762
5763 void MainFrame::OnTexturesLoadlist(){
5764         DoTextureListDlg();
5765 }
5766
5767 void MainFrame::OnTexturesShaderlistonly(){
5768         g_PrefsDlg.m_bTexturesShaderlistOnly ^= 1;
5769         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ),"menu_textures_shaderlistonly" ) );
5770         g_bIgnoreCommands++;
5771         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
5772         g_bIgnoreCommands--;
5773         FillTextureMenu();
5774 }
5775
5776 void MainFrame::OnTextureWad( unsigned int nID ){
5777         Sys_BeginWait();
5778         Texture_ShowDirectory( nID );
5779         Sys_UpdateWindows( W_ALL );
5780         Sys_EndWait();
5781 }
5782
5783 void MainFrame::OnMiscBenchmark(){
5784         m_pCamWnd->BenchMark();
5785 }
5786
5787 void MainFrame::OnColorSetoriginal(){
5788         for ( int i = 0 ; i < 3 ; i++ )
5789         {
5790                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5791                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5792                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
5793                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5794                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5795         }
5796
5797         //djbob
5798         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][0] = 0.5f;
5799         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][1] = 0.0f;
5800         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR_ALT][2] = 0.0f;
5801
5802         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][0] = 1.0f;
5803         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][1] = 0.0f;
5804         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR_ALT][2] = 0.0f;
5805         //-djbob
5806
5807         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5808         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5809         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5810
5811         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5812         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5813         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5814
5815         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5816         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5817         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5818
5819         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5820         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5821         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5822
5823         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5824         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5825         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5826
5827         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5828         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5829         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5830
5831         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5832         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5833         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5834
5835         g_PrefsDlg.SavePrefs();
5836         Sys_UpdateWindows( W_ALL );
5837 }
5838
5839 void MainFrame::OnColorSetqer(){
5840         for ( int i = 0 ; i < 3 ; i++ )
5841         {
5842                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5843                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
5844                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
5845                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
5846                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5847         }
5848
5849         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5850         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5851         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5852
5853         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5854         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5855         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5856
5857         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5858         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5859         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5860
5861         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5862         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5863         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5864
5865         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5866         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5867         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5868
5869         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5870         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5871         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5872
5873         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5874         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5875         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5876
5877         g_PrefsDlg.SavePrefs();
5878         Sys_UpdateWindows( W_ALL );
5879 }
5880
5881 void MainFrame::OnColorSetblack(){
5882         for ( int i = 0 ; i < 3 ; i++ )
5883         {
5884                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5885                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
5886                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.2f;
5887                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5888         }
5889
5890         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
5891         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
5892         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
5893
5894         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
5895         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
5896         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5897
5898         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
5899         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
5900         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
5901
5902         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5903         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5904         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5905
5906         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5907         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5908         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5909
5910         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
5911         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
5912         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
5913
5914         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
5915         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
5916         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
5917
5918         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5919         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5920         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5921
5922         g_PrefsDlg.SavePrefs();
5923         Sys_UpdateWindows( W_ALL );
5924 }
5925
5926 /* ydnar: to emulate maya/max/lightwave color schemes */
5927 void MainFrame::OnColorSetydnar(){
5928         for ( int i = 0 ; i < 3 ; i++ )
5929         {
5930                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
5931                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
5932                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
5933                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
5934                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
5935         }
5936
5937         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
5938         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
5939         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
5940
5941         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
5942         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
5943         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
5944
5945         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
5946         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
5947         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
5948
5949         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
5950         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
5951         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
5952
5953         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
5954         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
5955         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
5956
5957         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
5958         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
5959         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
5960
5961         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][0] = 1.0f;
5962         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][1] = 0.0f;
5963         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES3D][2] = 0.0f;
5964
5965         g_PrefsDlg.SavePrefs();
5966         Sys_UpdateWindows( W_ALL );
5967 }
5968
5969 void MainFrame::OnTexturebk(){
5970         DoColor( COLOR_TEXTUREBACK );
5971         Sys_UpdateWindows( W_ALL );
5972 }
5973
5974 void MainFrame::OnColorsXybk(){
5975         DoColor( COLOR_GRIDBACK );
5976         Sys_UpdateWindows( W_ALL );
5977 }
5978
5979 void MainFrame::OnColorsMajor(){
5980         DoColor( COLOR_GRIDMAJOR );
5981         Sys_UpdateWindows( W_ALL );
5982 }
5983
5984 void MainFrame::OnColorsMinor(){
5985         DoColor( COLOR_GRIDMINOR );
5986         Sys_UpdateWindows( W_ALL );
5987 }
5988
5989 void MainFrame::OnColorsMajor_Alt(){
5990         DoColor( COLOR_GRIDMAJOR_ALT );
5991         Sys_UpdateWindows( W_ALL );
5992 }
5993
5994 void MainFrame::OnColorsMinor_Alt(){
5995         DoColor( COLOR_GRIDMINOR_ALT );
5996         Sys_UpdateWindows( W_ALL );
5997 }
5998
5999 void MainFrame::OnColorsGridtext(){
6000         DoColor( COLOR_GRIDTEXT );
6001         Sys_UpdateWindows( W_ALL );
6002 }
6003
6004 void MainFrame::OnColorsGridblock(){
6005         DoColor( COLOR_GRIDBLOCK );
6006         Sys_UpdateWindows( W_ALL );
6007 }
6008
6009 void MainFrame::OnColorsCameraBack(){
6010         DoColor( COLOR_CAMERABACK );
6011         Sys_UpdateWindows( W_ALL );
6012 }
6013
6014 void MainFrame::OnColorsBrush(){
6015         DoColor( COLOR_BRUSHES );
6016         Sys_UpdateWindows( W_ALL );
6017 }
6018
6019 void MainFrame::OnColorsSelectedbrush(){
6020         DoColor( COLOR_SELBRUSHES );
6021         Sys_UpdateWindows( W_ALL );
6022 }
6023
6024 void MainFrame::OnColorsSelectedbrush3D(){
6025         DoColor( COLOR_SELBRUSHES3D );
6026         Sys_UpdateWindows( W_ALL );
6027 }
6028
6029 void MainFrame::OnColorsClipper(){
6030         DoColor( COLOR_CLIPPER );
6031         Sys_UpdateWindows( W_ALL );
6032 }
6033
6034 void MainFrame::OnColorsViewname(){
6035         DoColor( COLOR_VIEWNAME );
6036         Sys_UpdateWindows( W_ALL );
6037 }
6038
6039 void MainFrame::OnMiscGamma(){
6040         float fSave = g_qeglobals.d_savedinfo.fGamma;
6041         DoGamma();
6042         if ( fSave != g_qeglobals.d_savedinfo.fGamma ) {
6043                 gtk_MessageBox( m_pWidget, _( "You must restart Radiant for Gamma settings to take effect." ) );
6044         }
6045 }
6046 void MainFrame::OnMiscFindbrush(){
6047         DoFind();
6048 }
6049
6050 void MainFrame::OnMiscNextleakspot(){
6051         Pointfile_Next();
6052 }
6053
6054 void MainFrame::OnMiscPreviousleakspot(){
6055         Pointfile_Prev();
6056 }
6057
6058 void MainFrame::OnMiscPrintxy(){
6059         WXY_Print();
6060 }
6061
6062 void MainFrame::OnMiscSelectentitycolor(){
6063         if ( edit_entity ) {
6064                 CString strColor = ValueForKey( edit_entity, "_color" );
6065                 if ( strColor.GetLength() > 0 ) {
6066                         float fR, fG, fB;
6067                         int n = sscanf( strColor,"%f %f %f", &fR, &fG, &fB );
6068                         if ( n == 3 ) {
6069                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
6070                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
6071                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
6072                         }
6073                 }
6074
6075                 if ( inspector_mode == W_ENTITY && ( DoColor( COLOR_ENTITY ) ) ) {
6076                         char buffer[100];
6077                         sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
6078                                          g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
6079                                          g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
6080
6081                         gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntValueField] ), buffer );
6082                         gtk_entry_set_text( GTK_ENTRY( EntWidgets[EntKeyField] ), "_color" );
6083                         AddProp();
6084                         //DK - SOF change to get color to entity quickly
6085                         //--::SetWindowText( hwndEnt[EntValueField], buffer );
6086                         //--::SetWindowText( hwndEnt[EntKeyField], "color" );
6087                         //--AddProp();
6088                 }
6089                 Sys_UpdateWindows( W_ALL );
6090         }
6091 }
6092
6093 void MainFrame::OnConvertcurves(){
6094 #if 0
6095         Select_Deselect();
6096         for ( brush_t* pb = active_brushes.next ; pb != &active_brushes ; pb = pb->next )
6097         {
6098                 if ( pb->curveBrush ) {
6099                         for ( face_t* f = pb->brush_faces ; f ; f = f->next )
6100                         {
6101                                 if ( f->texdef.contents & CONTENTS_LADDER ) {
6102                                         f->texdef.contents &= ~CONTENTS_LADDER;
6103                                         f->texdef.contents |= CONTENTS_NEGATIVE_CURVE;
6104                                 }
6105                         }
6106                 }
6107         }
6108         Map_BuildBrushData();
6109 #endif
6110 }
6111
6112 void MainFrame::OnRegionOff(){
6113         Map_RegionOff();
6114 }
6115
6116 void MainFrame::OnRegionSetxy(){
6117         Map_RegionXY();
6118 }
6119
6120 void MainFrame::OnRegionSettallbrush(){
6121         Map_RegionTallBrush();
6122 }
6123
6124 void MainFrame::OnRegionSetbrush(){
6125         Map_RegionBrush();
6126 }
6127
6128 void MainFrame::OnRegionSetselection(){
6129         Map_RegionSelectedBrushes();
6130 }
6131
6132 void MainFrame::OnBrush3sided(){
6133         Undo_Start( "3 sided" );
6134         Undo_AddBrushList( &selected_brushes );
6135         Brush_MakeSided( 3 );
6136         Undo_EndBrushList( &selected_brushes );
6137         Undo_End();
6138 }
6139
6140 void MainFrame::OnBrush4sided(){
6141         Undo_Start( "4 sided" );
6142         Undo_AddBrushList( &selected_brushes );
6143         Brush_MakeSided( 4 );
6144         Undo_EndBrushList( &selected_brushes );
6145         Undo_End();
6146 }
6147
6148 void MainFrame::OnBrush5sided(){
6149         Undo_Start( "5 sided" );
6150         Undo_AddBrushList( &selected_brushes );
6151         Brush_MakeSided( 5 );
6152         Undo_EndBrushList( &selected_brushes );
6153         Undo_End();
6154 }
6155
6156 void MainFrame::OnBrush6sided(){
6157         Undo_Start( "6 sided" );
6158         Undo_AddBrushList( &selected_brushes );
6159         Brush_MakeSided( 6 );
6160         Undo_EndBrushList( &selected_brushes );
6161         Undo_End();
6162 }
6163
6164 void MainFrame::OnBrush7sided(){
6165         Undo_Start( "7 sided" );
6166         Undo_AddBrushList( &selected_brushes );
6167         Brush_MakeSided( 7 );
6168         Undo_EndBrushList( &selected_brushes );
6169         Undo_End();
6170 }
6171
6172 void MainFrame::OnBrush8sided(){
6173         Undo_Start( "8 sided" );
6174         Undo_AddBrushList( &selected_brushes );
6175         Brush_MakeSided( 8 );
6176         Undo_EndBrushList( &selected_brushes );
6177         Undo_End();
6178 }
6179
6180 void MainFrame::OnBrush9sided(){
6181         Undo_Start( "9 sided" );
6182         Undo_AddBrushList( &selected_brushes );
6183         Brush_MakeSided( 9 );
6184         Undo_EndBrushList( &selected_brushes );
6185         Undo_End();
6186 }
6187
6188 void MainFrame::OnBrushArbitrarysided(){
6189         Undo_Start( "arbitrary sided" );
6190         Undo_AddBrushList( &selected_brushes );
6191         DoSides();
6192         Undo_EndBrushList( &selected_brushes );
6193         Undo_End();
6194 }
6195
6196 void MainFrame::OnBrushMakecone(){
6197         Undo_Start( "make cone" );
6198         Undo_AddBrushList( &selected_brushes );
6199         DoSides( true );
6200         Undo_EndBrushList( &selected_brushes );
6201         Undo_End();
6202 }
6203
6204 void MainFrame::OnBrushPrimitivesSphere(){
6205         Undo_Start( "make sphere" );
6206         Undo_AddBrushList( &selected_brushes );
6207
6208         DoSides( false, true );
6209
6210         Undo_EndBrushList( &selected_brushes );
6211         Undo_End();
6212 }
6213
6214 void MainFrame::OnCurvePatchtube(){
6215         Undo_Start( "make curve cylinder" );
6216         Undo_AddBrushList( &selected_brushes );
6217         Patch_BrushToMesh( false );
6218         Sys_UpdateWindows( W_ALL );
6219         Undo_EndBrushList( &selected_brushes );
6220         Undo_End();
6221 }
6222
6223 void MainFrame::OnCurvePatchdensetube(){
6224         Undo_Start( "dense cylinder" );
6225         Undo_AddBrushList( &selected_brushes );
6226
6227         Patch_BrushToMesh( false );
6228         OnCurveInsertAddrow();
6229         Sys_UpdateWindows( W_ALL );
6230
6231         Undo_EndBrushList( &selected_brushes );
6232         Undo_End();
6233 }
6234
6235 void MainFrame::OnCurvePatchverydensetube(){
6236         Undo_Start( "very dense cylinder" );
6237         Undo_AddBrushList( &selected_brushes );
6238
6239         Patch_BrushToMesh( false );
6240         OnCurveInsertAddrow();
6241         OnCurveInsertInsertrow();
6242         OnCurveInsertAddrow();
6243         Sys_UpdateWindows( W_ALL );
6244
6245         Undo_EndBrushList( &selected_brushes );
6246         Undo_End();
6247 }
6248
6249 void MainFrame::OnCurvePatchsquare(){
6250         Undo_Start( "square cylinder" );
6251         Undo_AddBrushList( &selected_brushes );
6252
6253         Patch_BrushToMesh( false, false, false, true );
6254         Sys_UpdateWindows( W_ALL );
6255
6256         Undo_EndBrushList( &selected_brushes );
6257         Undo_End();
6258 }
6259
6260 void MainFrame::OnCurvePatchendcap(){
6261         Undo_Start( "make end cap" );
6262         Undo_AddBrushList( &selected_brushes );
6263         Patch_BrushToMesh( false, false, true );
6264         Sys_UpdateWindows( W_ALL );
6265         Undo_EndBrushList( &selected_brushes );
6266         Undo_End();
6267 }
6268
6269 void MainFrame::OnCurvePatchbevel(){
6270         Undo_Start( "make bevel" );
6271         Undo_AddBrushList( &selected_brushes );
6272         Patch_BrushToMesh( false, true, false );
6273         Sys_UpdateWindows( W_ALL );
6274         Undo_EndBrushList( &selected_brushes );
6275         Undo_End();
6276 }
6277
6278 void MainFrame::OnCurveMoreendcapsbevelsSquarebevel(){
6279         Undo_Start( "square bevel" );
6280         Undo_AddBrushList( &selected_brushes );
6281
6282         Patch_BrushToMesh( false, true, false, true );
6283         Sys_UpdateWindows( W_ALL );
6284
6285         Undo_EndBrushList( &selected_brushes );
6286         Undo_End();
6287 }
6288
6289 void MainFrame::OnCurveMoreendcapsbevelsSquareendcap(){
6290         Undo_Start( "square endcap" );
6291         Undo_AddBrushList( &selected_brushes );
6292
6293         Patch_BrushToMesh( false, false, true, true );
6294         Sys_UpdateWindows( W_ALL );
6295
6296         Undo_EndBrushList( &selected_brushes );
6297         Undo_End();
6298 }
6299
6300 void MainFrame::OnCurvePatchcone(){
6301         Undo_Start( "make curve cone" );
6302         Undo_AddBrushList( &selected_brushes );
6303         Patch_BrushToMesh( true );
6304         Sys_UpdateWindows( W_ALL );
6305         Undo_EndBrushList( &selected_brushes );
6306         Undo_End();
6307 }
6308
6309 void MainFrame::OnCurveSimplepatchmesh(){
6310         Undo_Start( "make simpe patch mesh" );
6311         Undo_AddBrushList( &selected_brushes );
6312         DoNewPatchDlg();
6313         Undo_EndBrushList( &selected_brushes );
6314         Undo_End();
6315 }
6316
6317 void MainFrame::OnCurveInsertInsertcolumn(){
6318         Undo_Start( "insert (2) columns" );
6319         Undo_AddBrushList( &selected_brushes );
6320         Patch_AdjustSelected( true, true, false );
6321         Sys_UpdateWindows( W_ALL );
6322         Undo_EndBrushList( &selected_brushes );
6323         Undo_End();
6324 }
6325
6326 void MainFrame::OnCurveInsertAddcolumn(){
6327         Undo_Start( "add (2) columns" );
6328         Undo_AddBrushList( &selected_brushes );
6329         Patch_AdjustSelected( true, true, true );
6330         Sys_UpdateWindows( W_ALL );
6331         Undo_EndBrushList( &selected_brushes );
6332         Undo_End();
6333 }
6334
6335 void MainFrame::OnCurveInsertInsertrow(){
6336         Undo_Start( "insert (2) rows" );
6337         Undo_AddBrushList( &selected_brushes );
6338         Patch_AdjustSelected( true, false, false );
6339         Sys_UpdateWindows( W_ALL );
6340         Undo_EndBrushList( &selected_brushes );
6341         Undo_End();
6342 }
6343
6344 void MainFrame::OnCurveInsertAddrow(){
6345         Undo_Start( "add (2) rows" );
6346         Undo_AddBrushList( &selected_brushes );
6347         Patch_AdjustSelected( true, false, true );
6348         Sys_UpdateWindows( W_ALL );
6349         Undo_EndBrushList( &selected_brushes );
6350         Undo_End();
6351 }
6352
6353 void MainFrame::OnCurveDeleteFirstcolumn(){
6354         Undo_Start( "delete first (2) columns" );
6355         Undo_AddBrushList( &selected_brushes );
6356         Patch_AdjustSelected( false, true, true );
6357         Sys_UpdateWindows( W_ALL );
6358         Undo_EndBrushList( &selected_brushes );
6359         Undo_End();
6360 }
6361
6362 void MainFrame::OnCurveDeleteLastcolumn(){
6363         Undo_Start( "delete last (2) columns" );
6364         Undo_AddBrushList( &selected_brushes );
6365         Patch_AdjustSelected( false, true, false );
6366         Sys_UpdateWindows( W_ALL );
6367         Undo_EndBrushList( &selected_brushes );
6368         Undo_End();
6369 }
6370
6371 void MainFrame::OnCurveDeleteFirstrow(){
6372         Undo_Start( "delete first (2) rows" );
6373         Undo_AddBrushList( &selected_brushes );
6374         Patch_AdjustSelected( false, false, true );
6375         Sys_UpdateWindows( W_ALL );
6376         Undo_EndBrushList( &selected_brushes );
6377         Undo_End();
6378 }
6379
6380 void MainFrame::OnCurveDeleteLastrow(){
6381         Undo_Start( "delete last (2) rows" );
6382         Undo_AddBrushList( &selected_brushes );
6383         Patch_AdjustSelected( false, false, false );
6384         Sys_UpdateWindows( W_ALL );
6385         Undo_EndBrushList( &selected_brushes );
6386         Undo_End();
6387 }
6388
6389 void MainFrame::OnCurveNegative(){
6390         Patch_ToggleInverted();
6391         //Sys_UpdateWindows(W_ALL);
6392 }
6393
6394 void MainFrame::OnCurveRedisperseRows(){
6395         Undo_Start( "redisperse rows" );
6396         Undo_AddBrushList( &selected_brushes );
6397         Patch_DisperseRows();
6398         Sys_UpdateWindows( W_ALL );
6399         Undo_EndBrushList( &selected_brushes );
6400         Undo_End();
6401 }
6402
6403 void MainFrame::OnCurveRedisperseIntermediateCols(){
6404         Undo_Start( "redisperse im cols" );
6405         Undo_AddBrushList( &selected_brushes );
6406         Patch_DisperseIntermediateColumns();
6407         Sys_UpdateWindows( W_ALL );
6408         Undo_EndBrushList( &selected_brushes );
6409         Undo_End();
6410 }
6411
6412 void MainFrame::OnCurveRedisperseIntermediateRows(){
6413         Undo_Start( "redisperse im rows" );
6414         Undo_AddBrushList( &selected_brushes );
6415         Patch_DisperseIntermediateRows();
6416         Sys_UpdateWindows( W_ALL );
6417         Undo_EndBrushList( &selected_brushes );
6418         Undo_End();
6419 }
6420
6421 void MainFrame::OnCurveMatrixTranspose(){
6422         Patch_Transpose();
6423         Sys_UpdateWindows( W_ALL );
6424 }
6425
6426 void MainFrame::OnCurveCap(){
6427         Patch_CapCurrent();
6428         Sys_UpdateWindows( W_ALL );
6429 }
6430
6431 void MainFrame::OnCurveCyclecap(){
6432         Patch_CycleCapSelected();
6433         Sys_UpdateWindows( W_ALL );
6434 }
6435
6436 void MainFrame::OnCurveOverlaySet(){
6437         Patch_SetOverlays();
6438         Sys_UpdateWindows( W_ALL );
6439 }
6440
6441 void MainFrame::OnCurveOverlayClear(){
6442         Patch_ClearOverlays();
6443         Sys_UpdateWindows( W_ALL );
6444 }
6445
6446 void MainFrame::OnCurveThicken(){
6447         Undo_Start( "curve thicken" );
6448         Undo_AddBrushList( &selected_brushes );
6449         DoThickenDlg();
6450         Undo_EndBrushList( &selected_brushes );
6451         Undo_End();
6452 }
6453
6454 /*!
6455    this can no longer be trigger manually from the menu
6456    happens only once at startup
6457  */
6458 void MainFrame::OnPluginsRefresh(){
6459         CleanPlugInMenu();
6460         m_PlugInMgr.Init();
6461 }
6462
6463 // open the Q3Rad manual
6464 void MainFrame::OnHelp(){
6465         // at least on win32, g_strGameToolsPath + "Q3Rad_Manual/index.htm"
6466         Str help;
6467         help = g_strAppPath;
6468         help += "Q3Rad_Manual/index.htm";
6469         OpenURL( help.GetBuffer() );
6470 }
6471
6472 // FIXME: we'll go towards a unified help thing soon
6473 void MainFrame::OnHelpLinks(){
6474         Str link;
6475         link = g_strAppPath;
6476         link += "links.htm";
6477         OpenURL( link.GetBuffer() );
6478 }
6479
6480 void MainFrame::OnHelpBugreport(){
6481         OpenURL( "http://www.qeradiant.com/faq/fom-serve/cache/138.html" );
6482 }
6483
6484 void MainFrame::OnHelpCommandlist(){
6485         DoCommandListDlg();
6486 }
6487
6488 void MainFrame::OnHelpAbout(){
6489         DoAbout();
6490 }
6491
6492 void MainFrame::OnPopupSelection(){
6493         GtkWidget *menu, *item;
6494         const gchar *labels[] = { _( "Select Complete Tall" ), _( "Select Touching" ), _( "Select Partial Tall" ), _( "Select Inside" )};
6495         int ids[] = { ID_SELECTION_SELECTCOMPLETETALL, ID_SELECTION_SELECTTOUCHING,
6496                                   ID_SELECTION_SELECTPARTIALTALL, ID_SELECTION_SELECTINSIDE};
6497
6498         menu = gtk_menu_new();
6499
6500         for ( int i = 0; i < 4; i++ )
6501         {
6502                 item = gtk_menu_item_new_with_label( labels[i] );
6503                 gtk_signal_connect( GTK_OBJECT( item ), "activate", GTK_SIGNAL_FUNC( HandleCommand ),
6504                                                         GINT_TO_POINTER( ids[i] ) );
6505                 gtk_widget_show( item );
6506                 gtk_menu_append( GTK_MENU( menu ), item );
6507         }
6508
6509         gtk_menu_popup( GTK_MENU( menu ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6510 }
6511
6512 void MainFrame::OnViewChange(){
6513         OnViewNextview();
6514         //HandlePopup(this, IDR_POPUP_VIEW);
6515 }
6516
6517 void MainFrame::OnTexturesPopup(){
6518         gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "render_quality_menu" );
6519         gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6520 }
6521
6522 void MainFrame::ToggleCamera(){
6523         if ( m_bCamPreview ) {
6524                 m_bCamPreview = false;
6525         }
6526         else{
6527                 m_bCamPreview = true;
6528         }
6529 }
6530
6531 void MainFrame::OnViewCameraupdate(){
6532         Sys_UpdateWindows( W_CAMERA );
6533 }
6534
6535 void MainFrame::OnSelectMouserotate(){
6536         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mouserotate" ) );
6537         g_bIgnoreCommands++;
6538
6539         if ( ActiveXY() ) {
6540                 if ( ActiveXY()->ClipMode() ) {
6541                         OnViewClipper();
6542                 }
6543                 if ( ActiveXY()->RotateMode() ) {
6544                         // SetRotateMode(false) always works
6545                         ActiveXY()->SetRotateMode( false );
6546                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6547                 }
6548                 else
6549                 {
6550                         // may not work if no brush selected, see return value
6551                         if ( ActiveXY()->SetRotateMode( true ) ) {
6552                                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6553                         }
6554                         else{
6555                                 // if MFC called, we need to set back to FALSE ourselves
6556                                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6557                         }
6558                 }
6559         }
6560         g_bIgnoreCommands--;
6561 }
6562
6563 void MainFrame::OnSelectMousescale(){
6564         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_select_mousescale" ) );
6565         g_bIgnoreCommands++;
6566
6567         if ( ActiveXY() ) {
6568                 if ( ActiveXY()->ClipMode() ) {
6569                         OnViewClipper();
6570                 }
6571                 if ( ActiveXY()->RotateMode() ) {
6572                         // SetRotateMode(false) always works
6573                         ActiveXY()->SetRotateMode( false );
6574                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6575                 }
6576                 if ( ActiveXY()->ScaleMode() ) {
6577                         ActiveXY()->SetScaleMode( false );
6578                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6579                 }
6580                 else
6581                 {
6582                         ActiveXY()->SetScaleMode( true );
6583                         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6584                 }
6585         }
6586         g_bIgnoreCommands--;
6587 }
6588
6589 void MainFrame::OnScalelockx(){
6590         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockx" ) );
6591         g_bIgnoreCommands++;
6592
6593         if ( g_nScaleHow & SCALE_X ) {
6594                 g_nScaleHow ^= SCALE_X;
6595                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6596         }
6597         else
6598         {
6599                 g_nScaleHow |= SCALE_X;
6600                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6601         }
6602         g_bIgnoreCommands--;
6603 }
6604
6605 void MainFrame::OnScalelocky(){
6606         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelocky" ) );
6607         g_bIgnoreCommands++;
6608
6609         if ( g_nScaleHow & SCALE_Y ) {
6610                 g_nScaleHow ^= SCALE_Y;
6611                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6612         }
6613         else
6614         {
6615                 g_nScaleHow |= SCALE_Y;
6616                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6617         }
6618         g_bIgnoreCommands--;
6619 }
6620
6621 void MainFrame::OnScalelockz(){
6622         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_scalelockz" ) );
6623         g_bIgnoreCommands++;
6624
6625         if ( g_nScaleHow & SCALE_Z ) {
6626                 g_nScaleHow ^= SCALE_Z;
6627                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), FALSE );
6628         }
6629         else
6630         {
6631                 g_nScaleHow |= SCALE_Z;
6632                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), TRUE );
6633         }
6634         g_bIgnoreCommands--;
6635 }
6636
6637 void MainFrame::OnDontselectcurve(){
6638         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
6639         g_bIgnoreCommands++;
6640         g_PrefsDlg.m_bSelectCurves ^= 1;
6641         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
6642         g_bIgnoreCommands--;
6643 }
6644
6645 void MainFrame::OnPatchToggleBox(){
6646         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
6647         g_bIgnoreCommands++;
6648         g_bPatchShowBounds ^= 1;
6649         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
6650         g_bIgnoreCommands--;
6651         Sys_UpdateWindows( W_ALL );
6652 }
6653
6654 void MainFrame::OnPatchWireframe(){
6655         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_wireframe" ) );
6656         g_bIgnoreCommands++;
6657         g_bPatchWireFrame ^= 1;
6658         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWireFrame ) ? TRUE : FALSE );
6659         g_bIgnoreCommands--;
6660         Sys_UpdateWindows( W_ALL );
6661 }
6662
6663 void MainFrame::OnPatchBend(){
6664         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_bend" ) );
6665         g_bIgnoreCommands++;
6666         Patch_BendToggle();
6667         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchBendMode ) ? TRUE : FALSE );
6668         g_bIgnoreCommands--;
6669         Sys_UpdateWindows( W_ALL );
6670 }
6671
6672 void MainFrame::OnPatchWeld(){
6673         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
6674         g_bIgnoreCommands++;
6675         g_bPatchWeld ^= 1;
6676         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
6677         g_bIgnoreCommands--;
6678         Sys_UpdateWindows( W_ALL );
6679 }
6680
6681 void MainFrame::OnPatchDrilldown(){
6682         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
6683         g_bIgnoreCommands++;
6684         g_bPatchDrillDown ^= 1;
6685         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
6686         g_bIgnoreCommands--;
6687         Sys_UpdateWindows( W_ALL );
6688 }
6689
6690 void MainFrame::OnShowEntities(){
6691         gpointer item = g_object_get_data( G_OBJECT( m_pWidget ), "view_entitiesas_menu" ); // use pointer to existing menu object
6692         gtk_menu_popup( GTK_MENU( item ), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME );
6693 }
6694
6695 void MainFrame::OnDropGroupName(){
6696         /*
6697            char* name = DoNameDlg ("Name Selection");
6698
6699            if (name != NULL)
6700            {
6701            Select_Name (name);
6702            Sys_UpdateWindows (W_ALL);
6703            free (name);
6704            }
6705          */
6706 }
6707
6708 void MainFrame::OnDropGroupNewgroup(){
6709
6710 }
6711
6712 void MainFrame::OnDropGroupRemove(){
6713         /*
6714            Select_AddToGroup("World");
6715            Sys_UpdateWindows (W_ALL);
6716          */
6717 }
6718
6719 // NOTE: it's called OnFaceFit() but we want to process everything here, faces and patches
6720 void MainFrame::OnFaceFit(){
6721         SurfaceDlgFitAll();
6722 }
6723
6724 void MainFrame::OnDontselectmodel(){
6725         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
6726         g_bIgnoreCommands++;
6727         g_PrefsDlg.m_bSelectModels ^= 1;
6728         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
6729         g_bIgnoreCommands--;
6730 }
6731
6732 void MainFrame::OnViewTexture(){
6733         if ( FloatingGroupDialog() ) { // QE4 style
6734                 if ( inspector_mode == W_TEXTURE ) {
6735                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
6736                                 widget_delete_hide( g_qeglobals_gui.d_entity );
6737                         }
6738                         else{
6739                                 gtk_widget_show( g_qeglobals_gui.d_entity );
6740                         }
6741                 }
6742                 else
6743                 {
6744                         gtk_widget_show( g_qeglobals_gui.d_entity );
6745                         SetInspectorMode( W_TEXTURE );
6746                 }
6747         }
6748 }
6749
6750 void MainFrame::OnPatchInspector(){
6751         TogglePatchInspector();
6752 }
6753
6754 void MainFrame::OnCurveNegativeTextureX(){
6755         Patch_InvertTexture( false );
6756         //Sys_UpdateWindows(W_ALL);
6757 }
6758
6759 void MainFrame::OnCurveNegativeTextureY(){
6760         Patch_InvertTexture( true );
6761         //Sys_UpdateWindows(W_ALL);
6762 }
6763
6764 void MainFrame::OnCurveInsertcolumn(){
6765         if ( &selected_brushes == selected_brushes.next ) {
6766                 return;
6767         }
6768         Undo_Start( "insert colum" );
6769         Undo_AddBrushList( &selected_brushes );
6770         //Patch_AdjustSelectedRowCols(0, 2);
6771         Patch_AdjustSelected( true, true, true );
6772         Sys_UpdateWindows( W_ALL );
6773         Undo_EndBrushList( &selected_brushes );
6774         Undo_End();
6775 }
6776
6777 void MainFrame::OnCurveInsertrow(){
6778         if ( &selected_brushes == selected_brushes.next ) {
6779                 return;
6780         }
6781         Undo_Start( "insert row" );
6782         Undo_AddBrushList( &selected_brushes );
6783         //Patch_AdjustSelectedRowCols(2, 0);
6784         Patch_AdjustSelected( true, false, true );
6785         Sys_UpdateWindows( W_ALL );
6786         Undo_EndBrushList( &selected_brushes );
6787         Undo_End();
6788 }
6789
6790 void MainFrame::OnCurveDeletecolumn(){
6791         if ( &selected_brushes == selected_brushes.next ) {
6792                 return;
6793         }
6794         Undo_Start( "delete column" );
6795         Undo_AddBrushList( &selected_brushes );
6796         Patch_AdjustSelected( false, true, true );
6797         Sys_UpdateWindows( W_ALL );
6798         Undo_EndBrushList( &selected_brushes );
6799         Undo_End();
6800 }
6801
6802 void MainFrame::OnCurveDeleterow(){
6803         if ( &selected_brushes == selected_brushes.next ) {
6804                 return;
6805         }
6806         Undo_Start( "delete row" );
6807         Undo_AddBrushList( &selected_brushes );
6808         Patch_AdjustSelected( false, false, true );
6809         Sys_UpdateWindows( W_ALL );
6810         Undo_EndBrushList( &selected_brushes );
6811         Undo_End();
6812 }
6813
6814 void MainFrame::OnPatchTab(){
6815         if ( g_bPatchBendMode ) {
6816                 Patch_BendHandleTAB();
6817         }
6818 //  else if (g_bPatchInsertMode)
6819 //    Patch_InsDelHandleTAB();
6820         else
6821         {
6822                 // check to see if the selected brush is part of a func group
6823                 // if it is, deselect everything and reselect the next brush
6824                 // in the group
6825                 brush_t *b2, *b = selected_brushes.next;
6826                 entity_t * e;
6827                 if ( b != &selected_brushes ) {
6828                         if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6829                                 e = b->owner;
6830                                 Select_Deselect();
6831                                 for ( b2 = e->brushes.onext ; b2 != &e->brushes ; b2 = b2->onext )
6832                                 {
6833                                         if ( b == b2 ) {
6834                                                 b2 = b2->onext;
6835                                                 break;
6836                                         }
6837                                 }
6838                                 if ( b2 == &e->brushes ) {
6839                                         b2 = b2->onext;
6840                                 }
6841
6842                                 Select_Brush( b2, false );
6843                                 Sys_UpdateWindows( W_ALL );
6844                         }
6845                 }
6846         }
6847 }
6848
6849 void MainFrame::OnSelectFuncGroup(){
6850         // check to see if the selected brush is part of a func group
6851         // if it is, deselect everything and reselect the next brush
6852         // in the group
6853         brush_t *b = selected_brushes.next;
6854         entity_t * e;
6855         if ( b != &selected_brushes ) {
6856                 if ( strcmpi( b->owner->eclass->name, "worldspawn" ) != 0 ) {
6857                         e = b->owner;
6858                         Select_SelectGroup( e );
6859                 }
6860         }
6861 }
6862
6863 void MainFrame::OnCameraForward( bool keydown ){
6864         if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6865                 if ( keydown ) {
6866                         VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6867                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6868                         Sys_UpdateWindows( nUpdate );
6869                 }
6870         }
6871         else {
6872                 if ( keydown ) {
6873                         m_pCamWnd->Camera()->movementflags |= MOVE_FORWARD;
6874                 }
6875                 else{
6876                         m_pCamWnd->Camera()->movementflags &= ~MOVE_FORWARD;
6877                 }
6878         }
6879 }
6880
6881 void MainFrame::OnCameraBack( bool keydown ){
6882         if ( g_PrefsDlg.m_bCamDiscrete && ( m_pCamWnd && !m_pCamWnd->m_bFreeMove ) ) {
6883                 if ( keydown ) {
6884                         VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->forward, m_pCamWnd->Camera()->origin );
6885                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6886                         Sys_UpdateWindows( nUpdate );
6887                 }
6888         }
6889         else {
6890                 if ( keydown ) {
6891                         m_pCamWnd->Camera()->movementflags |= MOVE_BACK;
6892                 }
6893                 else{
6894                         m_pCamWnd->Camera()->movementflags &= ~MOVE_BACK;
6895                 }
6896         }
6897 }
6898
6899 void MainFrame::OnCameraLeft( bool keydown ){
6900         if ( m_pCamWnd ) {
6901                 if ( m_pCamWnd->m_bFreeMove ) {
6902                         OnCameraStrafeleft( keydown );
6903                         return;
6904                 }
6905         }
6906
6907         if ( g_PrefsDlg.m_bCamDiscrete ) {
6908                 if ( keydown ) {
6909                         m_pCamWnd->Camera()->angles[1] += SPEED_TURN;
6910                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6911                         Sys_UpdateWindows( nUpdate );
6912                 }
6913         }
6914         else {
6915                 if ( keydown ) {
6916                         m_pCamWnd->Camera()->movementflags |= MOVE_ROTLEFT;
6917                 }
6918                 else{
6919                         m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTLEFT;
6920                 }
6921         }
6922 }
6923
6924 void MainFrame::OnCameraRight( bool keydown ){
6925         if ( m_pCamWnd ) {
6926                 if ( m_pCamWnd->m_bFreeMove ) {
6927                         OnCameraStraferight( keydown );
6928                         return;
6929                 }
6930         }
6931
6932         if ( g_PrefsDlg.m_bCamDiscrete ) {
6933                 if ( keydown ) {
6934                         m_pCamWnd->Camera()->angles[1] -= SPEED_TURN;
6935                         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6936                         Sys_UpdateWindows( nUpdate );
6937                 }
6938         }
6939         else {
6940                 if ( keydown ) {
6941                         m_pCamWnd->Camera()->movementflags |= MOVE_ROTRIGHT;
6942                 }
6943                 else{
6944                         m_pCamWnd->Camera()->movementflags &= ~MOVE_ROTRIGHT;
6945                 }
6946         }
6947 }
6948
6949 void MainFrame::OnCameraUp(){
6950         m_pCamWnd->Camera()->origin[2] += SPEED_MOVE;
6951         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6952         Sys_UpdateWindows( nUpdate );
6953 }
6954
6955 void MainFrame::OnCameraDown(){
6956         m_pCamWnd->Camera()->origin[2] -= SPEED_MOVE;
6957         int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY | W_Z ) : ( W_CAMERA );
6958         Sys_UpdateWindows( nUpdate );
6959 }
6960
6961 void MainFrame::OnCameraAngleup(){
6962         m_pCamWnd->Camera()->angles[0] += SPEED_TURN;
6963         if ( m_pCamWnd->Camera()->angles[0] > 85 ) {
6964                 m_pCamWnd->Camera()->angles[0] = 85;
6965         }
6966         Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6967 }
6968
6969 void MainFrame::OnCameraAngledown(){
6970         m_pCamWnd->Camera()->angles[0] -= SPEED_TURN;
6971         if ( m_pCamWnd->Camera()->angles[0] < -85 ) {
6972                 m_pCamWnd->Camera()->angles[0] = -85;
6973         }
6974         Sys_UpdateWindows( W_CAMERA | W_XY_OVERLAY );
6975 }
6976
6977 void MainFrame::OnCameraStrafeleft( bool keydown ){
6978         // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
6979         if ( m_pCamWnd ) {
6980                 if ( !m_pCamWnd->m_bFreeMove ) {
6981                         if ( keydown ) {
6982                                 VectorMA( m_pCamWnd->Camera()->origin, -SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
6983                                 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
6984                                 Sys_UpdateWindows( nUpdate );
6985                         }
6986                         return;
6987                 }
6988         }
6989
6990         if ( keydown ) {
6991                 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFELEFT;
6992         }
6993         else{
6994                 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFELEFT;
6995         }
6996 }
6997
6998 void MainFrame::OnCameraStraferight( bool keydown ){
6999         // FIXME: as soon as gtk supports proper keyup/down support, remove this bit
7000         if ( m_pCamWnd ) {
7001                 if ( !m_pCamWnd->m_bFreeMove ) {
7002                         if ( keydown ) {
7003                                 VectorMA( m_pCamWnd->Camera()->origin, SPEED_MOVE, m_pCamWnd->Camera()->right, m_pCamWnd->Camera()->origin );
7004                                 int nUpdate = ( g_PrefsDlg.m_bCamXYUpdate ) ? ( W_CAMERA | W_XY ) : ( W_CAMERA );
7005                                 Sys_UpdateWindows( nUpdate );
7006                         }
7007                         return;
7008                 }
7009         }
7010
7011         if ( keydown ) {
7012                 m_pCamWnd->Camera()->movementflags |= MOVE_STRAFERIGHT;
7013         }
7014         else{
7015                 m_pCamWnd->Camera()->movementflags &= ~MOVE_STRAFERIGHT;
7016         }
7017 }
7018
7019 void MainFrame::OnGridToggle(){
7020         g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
7021         Sys_UpdateWindows( W_XY | W_Z );
7022 }
7023
7024 void MainFrame::OnViewCrosshair(){
7025         g_bCrossHairs ^= 1;
7026         Sys_UpdateWindows( W_XY );
7027 }
7028
7029 void MainFrame::OnSelectionTextureRotateclock(){
7030         Select_RotateTexture( abs( g_PrefsDlg.m_nRotation ) );
7031 }
7032
7033 void MainFrame::OnSelectionTextureRotatecounter(){
7034         Select_RotateTexture( -abs( g_PrefsDlg.m_nRotation ) );
7035 }
7036
7037 void MainFrame::OnSelectionTextureScaleup(){
7038         Select_ScaleTexture( 0, g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7039 }
7040
7041 void MainFrame::OnSelectionTextureScaledown(){
7042         Select_ScaleTexture( 0, -g_qeglobals.d_savedinfo.m_SIIncrement.scale[1] );
7043 }
7044
7045 void MainFrame::OnSelectionTextureScaleLeft(){
7046         Select_ScaleTexture( -g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7047 }
7048
7049 void MainFrame::OnSelectionTextureScaleRight(){
7050         Select_ScaleTexture( g_qeglobals.d_savedinfo.m_SIIncrement.scale[0],0 );
7051 }
7052
7053 void MainFrame::OnSelectionTextureShiftleft(){
7054         Select_ShiftTexture( (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7055 }
7056
7057 void MainFrame::OnSelectionTextureShiftright(){
7058         Select_ShiftTexture( (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[0], 0 );
7059 }
7060
7061 void MainFrame::OnSelectionTextureShiftup(){
7062         Select_ShiftTexture( 0, (int)g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7063 }
7064
7065 void MainFrame::OnSelectionTextureShiftdown(){
7066         Select_ShiftTexture( 0, (int)-g_qeglobals.d_savedinfo.m_SIIncrement.shift[1] );
7067 }
7068
7069 void MainFrame::OnGridPrev(){
7070         GtkWidget *item;
7071         if ( g_qeglobals.d_gridsize == 1 ) {
7072                 g_qeglobals.d_gridsize = 0.5;
7073                 g_qeglobals.d_bSmallGrid = true;
7074                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7075         }
7076         else if ( g_qeglobals.d_gridsize == 0.5 ) {
7077                 g_qeglobals.d_gridsize = 0.25;
7078                 g_qeglobals.d_bSmallGrid = true;
7079                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_025" ) );
7080         }
7081         else if ( g_qeglobals.d_gridsize > 1 ) {
7082                 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize >> 1;
7083                 g_qeglobals.d_bSmallGrid = false;
7084
7085                 switch ( (int)g_qeglobals.d_gridsize )
7086                 {
7087                 case  1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7088                 case  2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7089                 case  4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7090                 case  8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7091                 case  16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7092                 case  32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7093                 case  64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7094                 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7095                 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7096                 }
7097
7098         }
7099         else{
7100                 return;
7101         }
7102
7103         // SnapTToGrid option: need to check everywhere the grid size is changed
7104         // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7105         if ( g_PrefsDlg.m_bSnapTToGrid ) {
7106                 DoSnapTToGrid();
7107         }
7108
7109         SetGridStatus();
7110         g_bIgnoreCommands++;
7111         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7112         g_bIgnoreCommands--;
7113
7114         Sys_UpdateWindows( W_XY | W_Z );
7115 }
7116
7117 void MainFrame::OnGridNext(){
7118         GtkWidget *item;
7119         if ( g_qeglobals.d_gridsize == 0.25 ) {
7120                 g_qeglobals.d_gridsize = 0.5;
7121                 g_qeglobals.d_bSmallGrid = true;
7122                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_05" ) );
7123         }
7124         else if ( g_qeglobals.d_gridsize == 0.5 ) {
7125                 g_qeglobals.d_gridsize = 1;
7126                 g_qeglobals.d_bSmallGrid = false;
7127                 item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) );
7128         }
7129         else if ( g_qeglobals.d_gridsize < 256 ) {
7130                 g_qeglobals.d_gridsize = (int)g_qeglobals.d_gridsize << 1;
7131                 g_qeglobals.d_bSmallGrid = false;
7132
7133                 switch ( (int)g_qeglobals.d_gridsize )
7134                 {
7135                 case  1: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_1" ) ); break;
7136                 case  2: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_2" ) ); break;
7137                 case  4: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_4" ) ); break;
7138                 case  8: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_8" ) ); break;
7139                 case  16: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_16" ) ); break;
7140                 case  32: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_32" ) ); break;
7141                 case  64: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_64" ) ); break;
7142                 case 128: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_128" ) ); break;
7143                 case 256: item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_grid_256" ) ); break;
7144                 default:  item = NULL;
7145                 }
7146
7147         }
7148         else{
7149                 return;
7150         }
7151
7152         // SnapTToGrid option: need to check everywhere the grid size is changed
7153         // this is a bit clumsy, have to do in OnGrid OnGridPrev and OnGridNext
7154         if ( g_PrefsDlg.m_bSnapTToGrid ) {
7155                 DoSnapTToGrid();
7156         }
7157
7158         SetGridStatus();
7159         g_bIgnoreCommands++;
7160         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7161         g_bIgnoreCommands--;
7162
7163         Sys_UpdateWindows( W_XY | W_Z );
7164 }
7165
7166 void MainFrame::OnSelectionMovedown(){
7167         if ( &selected_brushes == selected_brushes.next ) {
7168                 return;
7169         }
7170         Undo_Start( "move down" );
7171         Undo_AddBrushList( &selected_brushes );
7172
7173         vec3_t vAmt;
7174         vAmt[0] = vAmt[1] = 0.0;
7175         vAmt[2] = -g_qeglobals.d_gridsize;
7176         Select_Move( vAmt );
7177         Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7178
7179         Undo_EndBrushList( &selected_brushes );
7180         Undo_End();
7181 }
7182
7183 void MainFrame::OnSelectionMoveup(){
7184         if ( &selected_brushes == selected_brushes.next ) {
7185                 return;
7186         }
7187         Undo_Start( "move up" );
7188         Undo_AddBrushList( &selected_brushes );
7189
7190         vec3_t vAmt;
7191         vAmt[0] = vAmt[1] = 0.0;
7192         vAmt[2] = g_qeglobals.d_gridsize;
7193         Select_Move( vAmt );
7194         Sys_UpdateWindows( W_CAMERA | W_XY | W_Z );
7195
7196         Undo_EndBrushList( &selected_brushes );
7197         Undo_End();
7198 }
7199
7200 void MainFrame::OnSelectionPrint(){
7201         for ( brush_t* b = selected_brushes.next ; b != &selected_brushes ; b = b->next )
7202                 Brush_Print( b );
7203 }
7204
7205 void MainFrame::OnSelectionTogglesizepaint(){
7206         g_PrefsDlg.m_bSizePaint = !g_PrefsDlg.m_bSizePaint;
7207         Sys_UpdateWindows( W_XY );
7208 }
7209
7210 void MainFrame::OnPatchNaturalize(){
7211         Patch_NaturalizeSelected();
7212         Sys_UpdateWindows( W_ALL );
7213 }
7214
7215 void MainFrame::OnSnapToGrid(){
7216         if ( &selected_brushes == selected_brushes.next ) {
7217                 return;
7218         }
7219         Undo_Start( "snap selection to grid" );
7220         Undo_AddBrushList( &selected_brushes );
7221         //Select_SnapToGrid();
7222         for ( brush_t *pb = selected_brushes.next ; pb != &selected_brushes ; pb = pb->next )
7223         {
7224                 if ( pb->patchBrush ) {
7225                         Patch_SnapToGrid( pb->pPatch );
7226                 }
7227                 else{
7228                         Brush_SnapToGrid( pb );
7229                 }
7230         }
7231         Sys_UpdateWindows( W_ALL );
7232         Undo_EndBrushList( &selected_brushes );
7233         Undo_End();
7234 }
7235
7236 void MainFrame::OnSelectAll(){
7237         Select_AllOfType();
7238 }
7239
7240 void MainFrame::OnSelectionInvert(){
7241         Select_Invert();
7242         Sys_UpdateWindows( W_XY | W_Z | W_CAMERA );
7243 }
7244
7245
7246 void PerformFiltering(){
7247         brush_t *brush;
7248
7249         FilterUpdateBase();
7250
7251         for ( brush = active_brushes.next; brush != &active_brushes; brush = brush->next )
7252                 brush->bFiltered = FilterBrush( brush );
7253
7254         for ( brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next )
7255                 brush->bFiltered = FilterBrush( brush );
7256 }
7257
7258 void MainFrame::OnFilterAreaportals(){
7259         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
7260         g_bIgnoreCommands++;
7261         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_AREAPORTALS ) & EXCLUDE_AREAPORTALS ) {
7262                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7263         }
7264         else{
7265                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7266         }
7267         g_bIgnoreCommands--;
7268         PerformFiltering();
7269         Sys_UpdateWindows( W_XY | W_CAMERA );
7270 }
7271
7272 void MainFrame::OnFilterCaulk(){
7273         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
7274         g_bIgnoreCommands++;
7275         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK ) & EXCLUDE_CAULK ) {
7276                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7277         }
7278         else{
7279                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7280         }
7281         g_bIgnoreCommands--;
7282         PerformFiltering();
7283         Sys_UpdateWindows( W_XY | W_CAMERA );
7284 }
7285
7286 void MainFrame::OnFilterClips(){
7287         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
7288         g_bIgnoreCommands++;
7289         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP ) {
7290                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7291         }
7292         else{
7293                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7294         }
7295         g_bIgnoreCommands--;
7296         PerformFiltering();
7297         Sys_UpdateWindows( W_XY | W_CAMERA );
7298 }
7299
7300 void MainFrame::OnFilterBotClips(){
7301         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
7302         g_bIgnoreCommands++;
7303         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_BOTCLIP ) & EXCLUDE_BOTCLIP ) {
7304                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7305         }
7306         else{
7307                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7308         }
7309         g_bIgnoreCommands--;
7310         PerformFiltering();
7311         Sys_UpdateWindows( W_XY | W_CAMERA );
7312 }
7313
7314 void MainFrame::OnFilterStructural(){
7315         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
7316         g_bIgnoreCommands++;
7317         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_STRUCTURAL ) & EXCLUDE_STRUCTURAL ) {
7318                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7319         }
7320         else{
7321                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7322         }
7323         g_bIgnoreCommands--;
7324         PerformFiltering();
7325         Sys_UpdateWindows( W_XY | W_CAMERA );
7326 }
7327
7328 void MainFrame::OnFilterDetails(){
7329         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
7330         g_bIgnoreCommands++;
7331         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAILS ) & EXCLUDE_DETAILS ) {
7332                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7333         }
7334         else{
7335                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7336         }
7337         g_bIgnoreCommands--;
7338         PerformFiltering();
7339         Sys_UpdateWindows( W_XY | W_CAMERA );
7340 }
7341
7342 void MainFrame::OnFilterEntities(){
7343         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
7344         g_bIgnoreCommands++;
7345         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT ) {
7346                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7347         }
7348         else{
7349                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7350         }
7351         g_bIgnoreCommands--;
7352         PerformFiltering();
7353         Sys_UpdateWindows( W_XY | W_CAMERA );
7354 }
7355
7356 void MainFrame::OnFilterHintsskips(){
7357         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
7358         g_bIgnoreCommands++;
7359         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINTSSKIPS ) & EXCLUDE_HINTSSKIPS ) {
7360                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7361         }
7362         else{
7363                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7364         }
7365         g_bIgnoreCommands--;
7366         PerformFiltering();
7367         Sys_UpdateWindows( W_XY | W_CAMERA );
7368 }
7369
7370 void MainFrame::OnFilterLights(){
7371         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
7372         g_bIgnoreCommands++;
7373         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS ) {
7374                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7375         }
7376         else{
7377                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7378         }
7379         g_bIgnoreCommands--;
7380         PerformFiltering();
7381         Sys_UpdateWindows( W_XY | W_CAMERA );
7382 }
7383
7384 void MainFrame::OnFilterLiquids(){
7385         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
7386         g_bIgnoreCommands++;
7387         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIQUIDS ) & EXCLUDE_LIQUIDS ) {
7388                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7389         }
7390         else{
7391                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7392         }
7393         g_bIgnoreCommands--;
7394         PerformFiltering();
7395         Sys_UpdateWindows( W_XY | W_CAMERA );
7396 }
7397
7398 void MainFrame::OnFilterModels(){
7399         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
7400         g_bIgnoreCommands++;
7401         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS ) & EXCLUDE_MODELS ) {
7402                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7403         }
7404         else{
7405                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7406         }
7407         g_bIgnoreCommands--;
7408         PerformFiltering();
7409         Sys_UpdateWindows( W_XY | W_CAMERA );
7410 }
7411
7412 void MainFrame::OnFilterPatches(){
7413         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
7414         g_bIgnoreCommands++;
7415         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES ) & EXCLUDE_CURVES ) {
7416                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7417         }
7418         else{
7419                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7420         }
7421         g_bIgnoreCommands--;
7422         PerformFiltering();
7423         Sys_UpdateWindows( W_XY | W_CAMERA );
7424 }
7425
7426 void MainFrame::OnFilterPaths(){
7427         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
7428         g_bIgnoreCommands++;
7429         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS ) {
7430                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7431         }
7432         else{
7433                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7434         }
7435         g_bIgnoreCommands--;
7436         PerformFiltering();
7437         Sys_UpdateWindows( W_XY | W_CAMERA );
7438 }
7439
7440 void MainFrame::OnFilterClusterportals(){
7441         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
7442         g_bIgnoreCommands++;
7443         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLUSTERPORTALS ) & EXCLUDE_CLUSTERPORTALS ) {
7444                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7445         }
7446         else{
7447                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7448         }
7449         g_bIgnoreCommands--;
7450         PerformFiltering();
7451         Sys_UpdateWindows( W_XY | W_CAMERA );
7452 }
7453
7454 void MainFrame::OnFilterLightgrid(){
7455         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
7456         g_bIgnoreCommands++;
7457         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTGRID ) & EXCLUDE_LIGHTGRID ) {
7458                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7459         }
7460         else{
7461                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7462         }
7463         g_bIgnoreCommands--;
7464         PerformFiltering();
7465         Sys_UpdateWindows( W_XY | W_CAMERA );
7466 }
7467
7468 void MainFrame::OnFilterTranslucent(){
7469         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
7470         g_bIgnoreCommands++;
7471         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRANSLUCENT ) & EXCLUDE_TRANSLUCENT ) {
7472                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7473         }
7474         else{
7475                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7476         }
7477         g_bIgnoreCommands--;
7478         PerformFiltering();
7479         Sys_UpdateWindows( W_XY | W_CAMERA );
7480 }
7481
7482 void MainFrame::OnFilterTriggers(){
7483         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
7484         g_bIgnoreCommands++;
7485         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS ) & EXCLUDE_TRIGGERS ) {
7486                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7487         }
7488         else{
7489                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7490         }
7491         g_bIgnoreCommands--;
7492         PerformFiltering();
7493         Sys_UpdateWindows( W_XY | W_CAMERA );
7494 }
7495
7496 void MainFrame::OnFilterWorld(){
7497         GtkWidget *item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
7498         g_bIgnoreCommands++;
7499         if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD ) {
7500                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
7501         }
7502         else{
7503                 gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), FALSE );
7504         }
7505         g_bIgnoreCommands--;
7506         PerformFiltering();
7507         Sys_UpdateWindows( W_XY | W_CAMERA );
7508 }
7509
7510
7511
7512
7513
7514
7515
7516
7517 // =============================================================================
7518 // leo: Unused functions, not called anywhere from the code (need to check)
7519
7520 void MainFrame::OnViewConsole(){
7521         if ( FloatingGroupDialog() ) { // QE4 style
7522                 if ( inspector_mode == W_CONSOLE && CurrentStyle() != MainFrame::eFloating ) { // are we in console mode already?
7523                         if ( GTK_WIDGET_VISIBLE( g_qeglobals_gui.d_entity ) ) {
7524                                 widget_delete_hide( g_qeglobals_gui.d_entity );
7525                         }
7526                         else{
7527                                 gtk_widget_show( g_qeglobals_gui.d_entity );
7528                         }
7529                 }
7530                 else
7531                 {
7532                         gtk_widget_show( g_qeglobals_gui.d_entity );
7533                         SetInspectorMode( W_CONSOLE );
7534                 }
7535         }
7536 }
7537
7538 void MainFrame::OnCurveFreeze(){
7539         Patch_Freeze();
7540 }
7541
7542 void MainFrame::OnCurveUnFreeze(){
7543         Patch_UnFreeze( false );
7544 }
7545
7546 void MainFrame::OnCurveUnFreezeAll(){
7547         Patch_UnFreeze( true );
7548 }
7549
7550 void MainFrame::OnSelectReselect(){
7551         Select_Reselect();
7552 }
7553
7554 void MainFrame::OnSelectionTextureFit(){
7555         // TODO: Add your command handler code here
7556 }
7557
7558 void MainFrame::OnPatchEnter(){
7559
7560 }
7561
7562 void MainFrame::OnDropGroupAddtoWorld(){
7563         /*
7564            Select_AddToGroup("World");
7565            Sys_UpdateWindows (W_ALL);
7566          */
7567 }