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