]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - plugins/surface/surfacedialog.cpp
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / plugins / surface / surfacedialog.cpp
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 */\r
21 \r
22 //\r
23 // Surface Dialog Module\r
24 //\r
25 \r
26 //\r
27 // Nurail: Implemented to Module from the main Radiant Surface Dialog code\r
28 //\r
29 \r
30 \r
31 #include <gtk/gtk.h>\r
32 #include <gdk/gdkkeysyms.h>\r
33 \r
34 #include "surfdlg_plugin.h"\r
35 \r
36 \r
37 \r
38 #ifdef _DEBUG\r
39 //#define DBG_SI 1\r
40 #endif\r
41 \r
42 #include "gtkr_vector.h"\r
43 \r
44 vector<texdef_to_face_t> g_texdef_face_vector;\r
45 \r
46 inline texdef_to_face_t* get_texdef_face_list()\r
47 {\r
48   return &(*g_texdef_face_vector.begin());\r
49 }\r
50 \r
51 inline unsigned int texdef_face_list_empty()\r
52 {\r
53   return g_texdef_face_vector.empty();\r
54 }\r
55 \r
56 inline unsigned int texdef_face_list_size()\r
57 {\r
58   return g_texdef_face_vector.size();\r
59 }\r
60 \r
61 // For different faces having different values\r
62 bool is_HShift_conflicting;\r
63 bool is_VShift_conflicting;\r
64 bool is_HScale_conflicting;\r
65 bool is_VScale_conflicting;\r
66 bool is_Rotate_conflicting;\r
67 bool is_TextureName_conflicting;\r
68 \r
69 void ShowDlg();\r
70 void HideDlg();\r
71 void SetTexMods();\r
72 void GetTexMods(bool b_SetUndoPoint = FALSE);\r
73 void BuildDialog();\r
74 void FitAll();\r
75 void InitDefaultIncrement(texdef_t *);\r
76 void DoSnapTToGrid(float hscale, float vscale);\r
77 // called to perform a fitting from the outside (shortcut key)\r
78 void SurfaceDialogFitAll();\r
79 \r
80 \r
81 // Dialog Data\r
82 int m_nHeight;\r
83 int m_nWidth;\r
84 \r
85 // 0 is invalid, otherwise it's the Id of the last 'do' we are responsible for\r
86 int m_nUndoId;\r
87 \r
88 \r
89 texturewin_t *texturewin;\r
90 texdef_t *l_pIncrement;\r
91 texdef_t texdef_offset;\r
92 texdef_t texdef_SI_values;\r
93 \r
94 // For Texture Entry, activate only on entry change\r
95 char old_texture_entry[128];\r
96 \r
97 // the texdef to switch back to when the OnCancel is called\r
98 texdef_t        g_old_texdef;\r
99 \r
100 // when TRUE, this thing means the surface inspector is currently being displayed\r
101 bool  g_surfwin = FALSE;\r
102 // turn on/off processing of the "changed" "value_changed" messages\r
103 // (need to turn off when we are feeding data in)\r
104 bool g_bListenChanged = true;\r
105 // turn on/off listening of the update messages\r
106 bool g_bListenUpdate = true;\r
107 \r
108 GtkWidget* create_SurfaceInspector (void);\r
109 GtkWidget *SurfaceInspector = NULL;\r
110 \r
111 GtkWidget *m_pWidget;\r
112 GtkWidget *GetWidget () { return SurfaceInspector; }\r
113 GtkWidget *Get_SI_Module_Widget () { return SurfaceInspector; }\r
114 void SetWidget(GtkWidget *new_widget) { m_pWidget = new_widget; }\r
115 GtkWidget *GetDlgWidget (const char* name)\r
116   { return GTK_WIDGET (g_object_get_data (G_OBJECT (SurfaceInspector), name)); }\r
117 \r
118 // Spins for FitTexture\r
119 GtkWidget *spin_width;\r
120 GtkWidget *spin_height;\r
121 \r
122 \r
123 GtkWidget *texture_combo;\r
124 GtkWidget *texture_combo_entry;\r
125 \r
126 GtkWidget *match_grid_button;\r
127 GtkWidget *lock_valuechange_togglebutton;\r
128 \r
129 GtkObject *hshift_value_spinbutton_adj;\r
130 GtkWidget *hshift_value_spinbutton;\r
131 GtkObject *vshift_value_spinbutton_adj;\r
132 GtkWidget *vshift_value_spinbutton;\r
133 GtkObject *hscale_value_spinbutton_adj;\r
134 GtkWidget *hscale_value_spinbutton;\r
135 GtkObject *vscale_value_spinbutton_adj;\r
136 GtkWidget *vscale_value_spinbutton;\r
137 GtkObject *rotate_value_spinbutton_adj;\r
138 GtkWidget *rotate_value_spinbutton;\r
139 \r
140 GtkObject *hshift_offset_spinbutton_adj;\r
141 GtkWidget *hshift_offset_spinbutton;\r
142 GtkObject *vshift_offset_spinbutton_adj;\r
143 GtkWidget *vshift_offset_spinbutton;\r
144 GtkObject *hscale_offset_spinbutton_adj;\r
145 GtkWidget *hscale_offset_spinbutton;\r
146 GtkObject *vscale_offset_spinbutton_adj;\r
147 GtkWidget *vscale_offset_spinbutton;\r
148 GtkObject *rotate_offset_spinbutton_adj;\r
149 GtkWidget *rotate_offset_spinbutton;\r
150 \r
151 GtkObject *hshift_step_spinbutton_adj;\r
152 GtkWidget *hshift_step_spinbutton;\r
153 GtkObject *vshift_step_spinbutton_adj;\r
154 GtkWidget *vshift_step_spinbutton;\r
155 GtkObject *hscale_step_spinbutton_adj;\r
156 GtkWidget *hscale_step_spinbutton;\r
157 GtkObject *vscale_step_spinbutton_adj;\r
158 GtkWidget *vscale_step_spinbutton;\r
159 GtkObject *rotate_step_spinbutton_adj;\r
160 GtkWidget *rotate_step_spinbutton;\r
161 \r
162 GtkObject *fit_width_spinbutton_adj;\r
163 GtkWidget *fit_width_spinbutton;\r
164 GtkObject *fit_height_spinbutton_adj;\r
165 GtkWidget *fit_height_spinbutton;\r
166 GtkWidget *fit_button;\r
167 GtkWidget *axial_button;\r
168 \r
169 GtkWidget *done_button;\r
170 GtkWidget *apply_button;\r
171 GtkWidget *cancel_button;\r
172 \r
173 // Callbacks\r
174 gboolean on_texture_combo_entry_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data);\r
175 void on_texture_combo_entry_activate (GtkEntry *entry, gpointer user_data);\r
176 \r
177 static void on_match_grid_button_clicked (GtkButton *button, gpointer user_data);\r
178 static void on_lock_valuechange_togglebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data);\r
179 \r
180 static void on_hshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
181 static void on_vshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
182 static void on_hscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
183 static void on_vscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
184 static void on_rotate_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
185 \r
186 static void on_hshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
187 static void on_vshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
188 static void on_hscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
189 static void on_vscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
190 static void on_rotate_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
191 \r
192 static void on_hshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
193 static void on_vshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
194 static void on_hscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
195 static void on_vscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
196 static void on_rotate_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
197 \r
198 static void on_fit_width_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
199 static void on_fit_height_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
200 static void on_fit_button_clicked (GtkButton *button, gpointer user_data);\r
201 static void on_axial_button_clicked (GtkButton *button, gpointer user_data);\r
202 \r
203 static void on_done_button_clicked (GtkButton *button, gpointer user_data);\r
204 static void on_apply_button_clicked (GtkButton *button, gpointer user_data);\r
205 static void on_cancel_button_clicked (GtkButton *button, gpointer user_data);\r
206 \r
207 \r
208 /*\r
209 ===================================================\r
210 \r
211   SURFACE INSPECTOR\r
212 \r
213 ===================================================\r
214 */\r
215 \r
216 \r
217 void IsFaceConflicting()\r
218 {\r
219   texdef_t* tmp_texdef;\r
220   texdef_to_face_t* temp_texdef_face_list;\r
221   char buf[12];\r
222   char texture_name[128];\r
223 \r
224   if (texdef_face_list_empty())\r
225   {\r
226     gtk_entry_set_text( GTK_ENTRY (hshift_value_spinbutton), "");\r
227     gtk_entry_set_text( GTK_ENTRY (vshift_value_spinbutton), "");\r
228     gtk_entry_set_text( GTK_ENTRY (hscale_value_spinbutton), "");\r
229     gtk_entry_set_text( GTK_ENTRY (vscale_value_spinbutton), "");\r
230     gtk_entry_set_text( GTK_ENTRY (rotate_value_spinbutton), "");\r
231     gtk_entry_set_text( GTK_ENTRY (texture_combo_entry), "");\r
232     return;\r
233   }\r
234 \r
235   g_bListenChanged = FALSE;\r
236 \r
237   tmp_texdef = &get_texdef_face_list()->texdef;\r
238 \r
239   strcpy(texture_name, tmp_texdef->GetName() );\r
240 \r
241   texdef_SI_values.shift[0] = tmp_texdef->shift[0];\r
242   texdef_SI_values.shift[1] = tmp_texdef->shift[1];\r
243   texdef_SI_values.scale[0] = tmp_texdef->scale[0];\r
244   texdef_SI_values.scale[1] = tmp_texdef->scale[1];\r
245   texdef_SI_values.rotate = tmp_texdef->rotate;\r
246   texdef_SI_values.SetName( texture_name );\r
247 \r
248   is_HShift_conflicting = FALSE;\r
249   is_VShift_conflicting = FALSE;\r
250   is_HScale_conflicting = FALSE;\r
251   is_VScale_conflicting = FALSE;\r
252   is_Rotate_conflicting = FALSE;\r
253   is_TextureName_conflicting = FALSE;\r
254 \r
255   if (texdef_face_list_size() > 1)\r
256   {\r
257     temp_texdef_face_list = get_texdef_face_list()->next;\r
258 \r
259     for (temp_texdef_face_list; temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
260     {\r
261       tmp_texdef = &temp_texdef_face_list->texdef;\r
262       if ( texdef_SI_values.shift[0] != tmp_texdef->shift[0] )\r
263         is_HShift_conflicting = TRUE;\r
264 \r
265       if ( texdef_SI_values.shift[1] != tmp_texdef->shift[1] )\r
266         is_VShift_conflicting = TRUE;\r
267 \r
268       if ( texdef_SI_values.scale[0] != tmp_texdef->scale[0] )\r
269         is_HScale_conflicting = TRUE;\r
270 \r
271       if ( texdef_SI_values.scale[1] != tmp_texdef->scale[1] )\r
272         is_VScale_conflicting = TRUE;\r
273 \r
274       if ( texdef_SI_values.rotate != tmp_texdef->rotate )\r
275         is_Rotate_conflicting = TRUE;\r
276 \r
277       if ( strcmp( texture_name, tmp_texdef->GetName() ) )\r
278         is_TextureName_conflicting = TRUE;\r
279     }\r
280   }\r
281 \r
282   if(is_HShift_conflicting)\r
283     gtk_entry_set_text( GTK_ENTRY (hshift_value_spinbutton), "");\r
284   else\r
285     gtk_spin_button_set_value( GTK_SPIN_BUTTON(hshift_value_spinbutton) , texdef_SI_values.shift[0] );\r
286 \r
287   if(is_VShift_conflicting)\r
288     gtk_entry_set_text( GTK_ENTRY (vshift_value_spinbutton), "");\r
289   else\r
290     gtk_spin_button_set_value( GTK_SPIN_BUTTON(vshift_value_spinbutton) , texdef_SI_values.shift[1] );\r
291 \r
292   if(is_HScale_conflicting)\r
293     gtk_entry_set_text( GTK_ENTRY (hscale_value_spinbutton), "");\r
294   else\r
295     gtk_spin_button_set_value( GTK_SPIN_BUTTON(hscale_value_spinbutton) , texdef_SI_values.scale[0] );\r
296 \r
297   if(is_VScale_conflicting)\r
298     gtk_entry_set_text( GTK_ENTRY (vscale_value_spinbutton), "");\r
299   else\r
300     gtk_spin_button_set_value( GTK_SPIN_BUTTON(vscale_value_spinbutton) , texdef_SI_values.scale[1] );\r
301 \r
302   if(is_Rotate_conflicting)\r
303     gtk_entry_set_text( GTK_ENTRY (rotate_value_spinbutton), "");\r
304   else\r
305     gtk_spin_button_set_value( GTK_SPIN_BUTTON(rotate_value_spinbutton) , texdef_SI_values.rotate );\r
306 \r
307   g_bListenChanged = TRUE;\r
308 }\r
309 \r
310 #define MAX_NUM_LIST_ITEMS 15\r
311 static void PopulateTextureComboList()\r
312 {\r
313   texdef_t* tmp_texdef;\r
314   texdef_to_face_t* temp_texdef_face_list;\r
315   char blank[1];\r
316   GList *items = NULL;\r
317   GList *tmp_item;\r
318   int num_of_list_items = 0;\r
319 \r
320   blank[0] = 0;\r
321   \r
322   if (texdef_face_list_empty())\r
323   {\r
324     items = g_list_append (items, (gpointer) blank);\r
325     // For Texture Entry, activate only on entry change\r
326     strcpy (old_texture_entry, blank);\r
327   }\r
328   else if ( !is_TextureName_conflicting )\r
329   {\r
330     temp_texdef_face_list = get_texdef_face_list(); \r
331     tmp_texdef = (texdef_t *) &get_texdef_face_list()->texdef;\r
332     items = g_list_append( items, (gpointer) tmp_texdef->GetName() );\r
333     // For Texture Entry, activate only on entry change\r
334     strcpy (old_texture_entry, tmp_texdef->GetName());\r
335   }\r
336   else\r
337   {\r
338     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
339     {\r
340       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
341       // Need to do a string compare, hence the custom search\r
342       if (!( g_list_find_custom (items, tmp_texdef->GetName(), (GCompareFunc) strcmp ) ))\r
343       {\r
344         items = g_list_append( items, (gpointer) tmp_texdef->GetName() );\r
345         num_of_list_items++;\r
346       }\r
347       // Make sure the combo list isn't too long\r
348       if (num_of_list_items >= MAX_NUM_LIST_ITEMS)\r
349         break;\r
350     }\r
351     // If this isn't added last (to the top of the list), g_list_find freaks.\r
352     items = g_list_prepend (items, (gpointer) blank);\r
353     // For Texture Entry, activate only on entry change\r
354     strcpy (old_texture_entry, blank);\r
355   }\r
356   \r
357   gtk_combo_set_popdown_strings (GTK_COMBO (texture_combo), items);\r
358   g_list_free(items);\r
359 \r
360 }\r
361 \r
362 static void ZeroOffsetValues()\r
363 {\r
364   texdef_offset.shift[0] = 0.0;\r
365   texdef_offset.shift[1] = 0.0;\r
366   texdef_offset.scale[0] = 0.0;\r
367   texdef_offset.scale[1] = 0.0;\r
368   texdef_offset.rotate = 0.0;\r
369 }\r
370 \r
371 static void GetTexdefInfo_from_Radiant()\r
372 {\r
373   g_texdef_face_vector.clear();\r
374 \r
375   unsigned int count = GetSelectedFaceCountfromBrushes();\r
376   if(count == 0)\r
377     count = GetSelectedFaceCount();\r
378     \r
379   g_texdef_face_vector.resize(count);\r
380 \r
381   if (!texdef_face_list_empty())\r
382   {\r
383     texdef_to_face_t* p = get_texdef_face_list();\r
384     GetSelFacesTexdef( get_texdef_face_list() );\r
385   }\r
386   \r
387   IsFaceConflicting();\r
388   PopulateTextureComboList(); \r
389   ZeroOffsetValues();\r
390 }\r
391 \r
392 static gint delete_event_callback(GtkWidget *widget, GdkEvent* event, gpointer data)\r
393 {\r
394   HideDlg();\r
395   return TRUE;\r
396 }\r
397 \r
398 // make the shift increments match the grid settings\r
399 // the objective being that the shift+arrows shortcuts move the texture by the corresponding grid size\r
400 // this depends on a scale value if you have selected a particular texture on which you want it to work:\r
401 // we move the textures in pixels, not world units. (i.e. increment values are in pixel)\r
402 // depending on the texture scale it doesn't take the same amount of pixels to move of g_qeglobals.d_gridsize\r
403 // increment * scale = gridsize\r
404 // hscale and vscale are optional parameters, if they are zero they will be set to the default scale\r
405 // NOTE: the default scale depends if you are using BP mode or regular.\r
406 // For regular it's 0.5f (128 pixels cover 64 world units), for BP it's simply 1.0f\r
407 // see fenris #2810\r
408 void DoSnapTToGrid(float hscale, float vscale)\r
409 {\r
410   l_pIncrement = Get_SI_Inc();\r
411 \r
412   if (hscale == 0.0f)\r
413   {\r
414     hscale = 0.5f;\r
415   }\r
416   if (vscale == 0.0f)\r
417   {\r
418      vscale = 0.5f;\r
419   }\r
420 #ifdef _DEBUG\r
421   Sys_Printf ("DoSnapTToGrid: hscale %g vscale %g\n", hscale, vscale);\r
422 #endif\r
423   l_pIncrement->shift[0] = GridSize() / hscale;\r
424   l_pIncrement->shift[1] = GridSize() / vscale;\r
425   // now some update work\r
426   // FIXME: doesn't look good here, seems to be called several times\r
427   SetTexMods();\r
428 }\r
429 \r
430 void UpdateSurfaceDialog()\r
431 {\r
432   if (!g_bListenUpdate)\r
433     return;\r
434     \r
435   if (!SurfaceInspector)\r
436     return;\r
437 \r
438   // avoid long delays on slow computers\r
439   while (gtk_events_pending ())\r
440     gtk_main_iteration ();\r
441     \r
442   if (g_surfwin)\r
443   {\r
444 #ifdef DBG_SI\r
445     Sys_Printf("UpdateSurfaceDialog\n");\r
446 #endif\r
447     GetTexdefInfo_from_Radiant();\r
448     SetTexMods();\r
449   }\r
450 \r
451 }\r
452 \r
453 // DoSurface will always try to show the surface inspector\r
454 // or update it because something new has been selected\r
455 void DoSurface (void)\r
456 {\r
457 #ifdef DBG_SI\r
458   Sys_Printf("DoSurface\n");\r
459 #endif\r
460   if (!SurfaceInspector)\r
461     create_SurfaceInspector ();\r
462   \r
463   ShowDlg();\r
464   SetTexMods ();\r
465 }\r
466 \r
467 void ToggleSurface()\r
468 {\r
469 #ifdef DBG_SI\r
470   Sys_Printf("ToggleSurface Module\n");\r
471 #endif\r
472   if (!g_surfwin)\r
473     DoSurface ();\r
474   else\r
475     on_cancel_button_clicked(NULL, NULL);\r
476 }\r
477 \r
478 // NOTE: will raise and show the Surface inspector and exec fit for patches and brushes\r
479 void SurfaceDlgFitAll()\r
480 {\r
481   DoSurface();\r
482   FitAll();\r
483 }\r
484 \r
485 // =============================================================================\r
486 // SurfaceDialog class\r
487 \r
488 void ShowDlg()\r
489 {\r
490 \r
491   if(!SurfaceInspector)\r
492     create_SurfaceInspector();\r
493   else\r
494     gtk_widget_show (SurfaceInspector);\r
495 \r
496   GetTexdefInfo_from_Radiant();\r
497   GetTexMods(TRUE); // Set Initial Undo Point\r
498   g_surfwin = TRUE;\r
499 }\r
500 \r
501 void HideDlg()\r
502 {\r
503   g_surfwin = FALSE;\r
504   gtk_widget_hide (SurfaceInspector);\r
505 }\r
506 \r
507 \r
508 // set default values for increments (shift scale and rot)\r
509 // this is called by the prefs code if can't find the values\r
510 void InitDefaultIncrement(texdef_t *tex)\r
511 {\r
512   tex->SetName("foo");\r
513   tex->shift[0] = 8;\r
514   tex->shift[1] = 8;\r
515   tex->scale[0] = 0.25;\r
516   tex->scale[1] = 0.25;\r
517   tex->rotate = 10;\r
518 }\r
519 \r
520 void BuildDialog ()\r
521 {\r
522    if ( !SurfaceInspector )\r
523     create_SurfaceInspector();\r
524 }\r
525 \r
526 /*\r
527 ==============\r
528 SetTexMods\r
529 \r
530 Set the fields to the current texdef (i.e. map/texdef -> dialog widgets)\r
531 ===============\r
532 */\r
533 \r
534 void SetTexMods()\r
535 {\r
536   texdef_t *pt;\r
537   GtkSpinButton *spin;\r
538   GtkAdjustment *adjust;\r
539 \r
540   texturewin = Texturewin ();\r
541   l_pIncrement = Get_SI_Inc();\r
542 \r
543 #ifdef DBG_SI\r
544   Sys_Printf("SurfaceDlg SetTexMods\n");\r
545 #endif\r
546 \r
547   if (!g_surfwin)\r
548     return;\r
549     \r
550   pt = &texturewin->texdef;\r
551 \r
552   g_bListenChanged = false;\r
553 \r
554   if(strncmp(pt->GetName(), "textures/", 9) != 0)\r
555     texdef_offset.SetName(SHADER_NOT_FOUND);\r
556 \r
557  \r
558   spin = GTK_SPIN_BUTTON (hshift_offset_spinbutton);\r
559   gtk_spin_button_set_value (spin, texdef_offset.shift[0]);\r
560   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
561   adjust->step_increment = l_pIncrement->shift[0];\r
562   gtk_spin_button_set_value (GTK_SPIN_BUTTON(hshift_step_spinbutton), l_pIncrement->shift[0]);\r
563   \r
564   spin = GTK_SPIN_BUTTON (hshift_value_spinbutton);\r
565   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
566   adjust->step_increment = l_pIncrement->shift[0];\r
567   \r
568 \r
569   spin = GTK_SPIN_BUTTON (vshift_offset_spinbutton);\r
570   gtk_spin_button_set_value (spin, texdef_offset.shift[1]);\r
571   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
572   adjust->step_increment = l_pIncrement->shift[1];\r
573   gtk_spin_button_set_value (GTK_SPIN_BUTTON(vshift_step_spinbutton), l_pIncrement->shift[1]);\r
574   \r
575   spin = GTK_SPIN_BUTTON (vshift_value_spinbutton);\r
576   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
577   adjust->step_increment = l_pIncrement->shift[1];\r
578 \r
579 \r
580   spin = GTK_SPIN_BUTTON (hscale_offset_spinbutton);\r
581   gtk_spin_button_set_value (spin, texdef_offset.scale[0]);\r
582   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
583   adjust->step_increment = l_pIncrement->scale[0];\r
584   gtk_spin_button_set_value (GTK_SPIN_BUTTON(hscale_step_spinbutton), l_pIncrement->scale[0]);\r
585 \r
586   spin = GTK_SPIN_BUTTON (hscale_value_spinbutton);\r
587   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
588   adjust->step_increment = l_pIncrement->scale[0];\r
589 \r
590   \r
591   spin = GTK_SPIN_BUTTON (vscale_offset_spinbutton);\r
592   gtk_spin_button_set_value (spin, texdef_offset.scale[1]);\r
593   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
594   adjust->step_increment = l_pIncrement->scale[1];\r
595   gtk_spin_button_set_value (GTK_SPIN_BUTTON(vscale_step_spinbutton), l_pIncrement->scale[1]);\r
596   \r
597   spin = GTK_SPIN_BUTTON (vscale_value_spinbutton);\r
598   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
599   adjust->step_increment = l_pIncrement->scale[1];\r
600   \r
601 \r
602   spin = GTK_SPIN_BUTTON (rotate_offset_spinbutton);\r
603   gtk_spin_button_set_value (spin, texdef_offset.rotate);\r
604   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
605   adjust->step_increment = l_pIncrement->rotate;\r
606   gtk_spin_button_set_value (GTK_SPIN_BUTTON(rotate_step_spinbutton), l_pIncrement->rotate);\r
607   \r
608   spin = GTK_SPIN_BUTTON (rotate_value_spinbutton);\r
609   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
610   adjust->step_increment = l_pIncrement->rotate;\r
611 \r
612   \r
613   g_bListenChanged = true;\r
614 \r
615   // store the current texdef as our escape route if user hits OnCancel\r
616   g_old_texdef = texturewin->texdef;\r
617 }\r
618 \r
619 /*\r
620 ==============\r
621 GetTexMods\r
622 \r
623 Shows any changes to the main Radiant windows\r
624 ===============\r
625 */\r
626 void GetTexMods(bool b_SetUndoPoint)\r
627 {\r
628 \r
629 #ifdef DBG_SI\r
630   Sys_Printf("SurfaceDlg GetTexMods\n");\r
631 #endif\r
632 \r
633   if ( !texdef_face_list_empty() )\r
634   {\r
635     g_bListenUpdate=FALSE;\r
636     SetTexdef_FaceList( get_texdef_face_list(), b_SetUndoPoint, false );\r
637     g_bListenUpdate=TRUE;\r
638 \r
639     if (b_SetUndoPoint)\r
640       m_nUndoId = Undo_GetUndoId();\r
641   }\r
642 }\r
643 \r
644 void FitAll()\r
645 {\r
646   on_fit_button_clicked(NULL, NULL);\r
647 }\r
648 \r
649 \r
650 ////////////////////////////////////////////////////////////////////\r
651 //\r
652 //  GUI Section\r
653 //\r
654 ////////////////////////////////////////////////////////////////////\r
655 \r
656 GtkWidget* create_SurfaceInspector (void)\r
657 {\r
658   \r
659   GtkWidget *label;\r
660   GtkWidget *hseparator;\r
661   GtkWidget *eventbox;\r
662 \r
663   GtkWidget *viewport8;\r
664   GtkWidget *viewport9;\r
665   GtkWidget *viewport2;\r
666   GtkWidget *viewport7;\r
667   GtkWidget *viewport5;\r
668   GtkWidget *viewport6;\r
669   GtkWidget *viewport10;\r
670 \r
671   GtkWidget *table1;\r
672   GtkWidget *table4;\r
673   GtkWidget *table5;\r
674   GtkWidget *table7;\r
675 \r
676   GtkWidget *alignment1;\r
677   GtkWidget *alignment2;\r
678   GtkWidget *alignment3;\r
679 \r
680   GtkWidget *vbox7;\r
681 \r
682   GtkWidget *hbox1;\r
683   GtkWidget *hbox2;\r
684   GtkWidget *hbox3;\r
685   GtkWidget *hbox4;\r
686 \r
687   GtkWidget *image1;\r
688   GtkWidget *image2;\r
689   GtkWidget *image3;\r
690 \r
691   GtkWidget *hbuttonbox1;\r
692 \r
693   SurfaceInspector = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
694   gtk_container_set_border_width (GTK_CONTAINER (SurfaceInspector), 4);\r
695   gtk_window_set_title (GTK_WINDOW (SurfaceInspector), "Surface Inspector");\r
696   \r
697   SetWinPos_from_Prefs(SurfaceInspector);\r
698 \r
699   viewport8 = gtk_viewport_new (NULL, NULL);\r
700   gtk_widget_show (viewport8);\r
701   gtk_container_add (GTK_CONTAINER (SurfaceInspector), viewport8);\r
702   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport8), GTK_SHADOW_NONE);\r
703 \r
704   vbox7 = gtk_vbox_new (FALSE, 0);\r
705   gtk_widget_show (vbox7);\r
706   gtk_container_add (GTK_CONTAINER (viewport8), vbox7);\r
707 \r
708   viewport9 = gtk_viewport_new (NULL, NULL);\r
709   gtk_widget_show (viewport9);\r
710   gtk_box_pack_start (GTK_BOX (vbox7), viewport9, FALSE, FALSE, 0);\r
711   gtk_container_set_border_width (GTK_CONTAINER (viewport9), 2);\r
712   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport9), GTK_SHADOW_ETCHED_IN);\r
713 \r
714   hbox1 = gtk_hbox_new (FALSE, 0);\r
715   gtk_widget_show (hbox1);\r
716   gtk_container_add (GTK_CONTAINER (viewport9), hbox1);\r
717   gtk_container_set_border_width (GTK_CONTAINER (hbox1), 4);\r
718 \r
719   label = gtk_label_new ("Texture: ");\r
720   gtk_widget_show (label);\r
721   gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);\r
722   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
723 \r
724   texture_combo = gtk_combo_new ();\r
725   g_object_set_data (G_OBJECT (GTK_COMBO (texture_combo)->popwin),\r
726                      "KeepMeAround", texture_combo);\r
727   gtk_combo_disable_activate ( (GtkCombo*) texture_combo);                   \r
728   gtk_widget_show (texture_combo);\r
729   gtk_box_pack_start (GTK_BOX (hbox1), texture_combo, TRUE, TRUE, 0);\r
730 \r
731   texture_combo_entry = GTK_COMBO (texture_combo)->entry;\r
732   gtk_widget_show (texture_combo_entry);\r
733   gtk_entry_set_max_length (GTK_ENTRY (texture_combo_entry), 128);\r
734 \r
735   viewport2 = gtk_viewport_new (NULL, NULL);\r
736   gtk_widget_show (viewport2);\r
737   gtk_box_pack_start (GTK_BOX (vbox7), viewport2, FALSE, TRUE, 0);\r
738   gtk_container_set_border_width (GTK_CONTAINER (viewport2), 2);\r
739   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport2), GTK_SHADOW_ETCHED_IN);\r
740 \r
741   table1 = gtk_table_new (13, 4, FALSE);\r
742   gtk_widget_show (table1);\r
743   gtk_container_add (GTK_CONTAINER (viewport2), table1);\r
744 \r
745   hseparator = gtk_hseparator_new ();\r
746   gtk_widget_show (hseparator);\r
747   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 1, 2,\r
748                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
749                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
750 \r
751   hseparator = gtk_hseparator_new ();\r
752   gtk_widget_show (hseparator);\r
753   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 1, 2,\r
754                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
755                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
756 \r
757   hseparator = gtk_hseparator_new ();\r
758   gtk_widget_show (hseparator);\r
759   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 1, 2,\r
760                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
761                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
762 \r
763   hseparator = gtk_hseparator_new ();\r
764   gtk_widget_show (hseparator);\r
765   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 3, 4,\r
766                     (GtkAttachOptions) (GTK_FILL),\r
767                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
768 \r
769   hseparator = gtk_hseparator_new ();\r
770   gtk_widget_show (hseparator);\r
771   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 3, 4,\r
772                     (GtkAttachOptions) (GTK_FILL),\r
773                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
774 \r
775   hseparator = gtk_hseparator_new ();\r
776   gtk_widget_show (hseparator);\r
777   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 3, 4,\r
778                     (GtkAttachOptions) (GTK_FILL),\r
779                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
780 \r
781   hseparator = gtk_hseparator_new ();\r
782   gtk_widget_show (hseparator);\r
783   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 5, 6,\r
784                     (GtkAttachOptions) (GTK_FILL),\r
785                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
786 \r
787   hseparator = gtk_hseparator_new ();\r
788   gtk_widget_show (hseparator);\r
789   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 5, 6,\r
790                     (GtkAttachOptions) (GTK_FILL),\r
791                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
792 \r
793   hseparator = gtk_hseparator_new ();\r
794   gtk_widget_show (hseparator);\r
795   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 5, 6,\r
796                     (GtkAttachOptions) (GTK_FILL),\r
797                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
798 \r
799   hseparator = gtk_hseparator_new ();\r
800   gtk_widget_show (hseparator);\r
801   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 7, 8,\r
802                     (GtkAttachOptions) (GTK_FILL),\r
803                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
804 \r
805   hseparator = gtk_hseparator_new ();\r
806   gtk_widget_show (hseparator);\r
807   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 7, 8,\r
808                     (GtkAttachOptions) (GTK_FILL),\r
809                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
810 \r
811   hseparator = gtk_hseparator_new ();\r
812   gtk_widget_show (hseparator);\r
813   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 7, 8,\r
814                     (GtkAttachOptions) (GTK_FILL),\r
815                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
816 \r
817   hseparator = gtk_hseparator_new ();\r
818   gtk_widget_show (hseparator);\r
819   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 9, 10,\r
820                     (GtkAttachOptions) (GTK_FILL),\r
821                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
822 \r
823   hseparator = gtk_hseparator_new ();\r
824   gtk_widget_show (hseparator);\r
825   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 9, 10,\r
826                     (GtkAttachOptions) (GTK_FILL),\r
827                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
828 \r
829   hseparator = gtk_hseparator_new ();\r
830   gtk_widget_show (hseparator);\r
831   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 9, 10,\r
832                     (GtkAttachOptions) (GTK_FILL),\r
833                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
834 \r
835   hseparator = gtk_hseparator_new ();\r
836   gtk_widget_show (hseparator);\r
837   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 11, 12,\r
838                     (GtkAttachOptions) (GTK_FILL),\r
839                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
840 \r
841   hseparator = gtk_hseparator_new ();\r
842   gtk_widget_show (hseparator);\r
843   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 11, 12,\r
844                     (GtkAttachOptions) (GTK_FILL),\r
845                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
846 \r
847   hseparator = gtk_hseparator_new ();\r
848   gtk_widget_show (hseparator);\r
849   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 11, 12,\r
850                     (GtkAttachOptions) (GTK_FILL),\r
851                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
852 \r
853   label = gtk_label_new ("Offset");\r
854   gtk_widget_show (label);\r
855   gtk_table_attach (GTK_TABLE (table1), label, 2, 3, 0, 1,\r
856                     (GtkAttachOptions) (GTK_FILL),\r
857                     (GtkAttachOptions) (0), 0, 0);\r
858 \r
859   label = gtk_label_new ("Step");\r
860   gtk_widget_show (label);\r
861   gtk_table_attach (GTK_TABLE (table1), label, 3, 4, 0, 1,\r
862                     (GtkAttachOptions) (GTK_FILL),\r
863                     (GtkAttachOptions) (0), 0, 0);\r
864 \r
865   eventbox = gtk_event_box_new ();\r
866   gtk_widget_show (eventbox);\r
867   gtk_table_attach (GTK_TABLE (table1), eventbox, 3, 4, 12, 13,\r
868                     (GtkAttachOptions) (GTK_FILL),\r
869                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
870 \r
871   match_grid_button = gtk_button_new_with_mnemonic ("Match Grid");\r
872   gtk_widget_show (match_grid_button);\r
873   gtk_container_add (GTK_CONTAINER (eventbox), match_grid_button);\r
874 \r
875   label = gtk_label_new ("Value");\r
876   gtk_widget_show (label);\r
877   gtk_table_attach (GTK_TABLE (table1), label, 1, 2, 0, 1,\r
878                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
879                     (GtkAttachOptions) (0), 0, 0);\r
880   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 1);\r
881 \r
882   hseparator = gtk_hseparator_new ();\r
883   gtk_widget_show (hseparator);\r
884   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 3, 4,\r
885                     (GtkAttachOptions) (GTK_SHRINK | GTK_FILL),\r
886                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
887 \r
888   hseparator = gtk_hseparator_new ();\r
889   gtk_widget_show (hseparator);\r
890   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 5, 6,\r
891                     (GtkAttachOptions) (GTK_FILL),\r
892                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
893 \r
894   hseparator = gtk_hseparator_new ();\r
895   gtk_widget_show (hseparator);\r
896   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 7, 8,\r
897                     (GtkAttachOptions) (GTK_FILL),\r
898                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
899 \r
900   hseparator = gtk_hseparator_new ();\r
901   gtk_widget_show (hseparator);\r
902   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 9, 10,\r
903                     (GtkAttachOptions) (GTK_FILL),\r
904                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
905 \r
906   hseparator = gtk_hseparator_new ();\r
907   gtk_widget_show (hseparator);\r
908   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 11, 12,\r
909                     (GtkAttachOptions) (GTK_FILL),\r
910                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
911 \r
912   eventbox = gtk_event_box_new ();\r
913   gtk_widget_show (eventbox);\r
914   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 4, 5,\r
915                     (GtkAttachOptions) (GTK_FILL),\r
916                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
917 \r
918   label = gtk_label_new ("V Shift: ");\r
919   gtk_widget_show (label);\r
920   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
921   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
922   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
923 \r
924   eventbox = gtk_event_box_new ();\r
925   gtk_widget_show (eventbox);\r
926   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 6, 7,\r
927                     (GtkAttachOptions) (GTK_FILL),\r
928                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
929 \r
930   label = gtk_label_new (" H Scale: ");\r
931   gtk_widget_show (label);\r
932   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
933   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
934   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
935 \r
936   eventbox = gtk_event_box_new ();\r
937   gtk_widget_show (eventbox);\r
938   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 8, 9,\r
939                     (GtkAttachOptions) (GTK_FILL),\r
940                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
941 \r
942   label = gtk_label_new ("V Scale: ");\r
943   gtk_widget_show (label);\r
944   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
945   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
946   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
947 \r
948   eventbox = gtk_event_box_new ();\r
949   gtk_widget_show (eventbox);\r
950   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 10, 11,\r
951                     (GtkAttachOptions) (GTK_FILL),\r
952                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
953 \r
954   label = gtk_label_new ("Rotate: ");\r
955   gtk_widget_show (label);\r
956   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
957   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
958   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
959 \r
960   eventbox = gtk_event_box_new ();\r
961   gtk_widget_show (eventbox);\r
962   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 2, 3,\r
963                     (GtkAttachOptions) (GTK_FILL),\r
964                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
965 \r
966   label = gtk_label_new ("H Shift: ");\r
967   gtk_widget_show (label);\r
968   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
969   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
970   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
971 \r
972   hseparator = gtk_hseparator_new ();\r
973   gtk_widget_show (hseparator);\r
974   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 1, 2,\r
975                     (GtkAttachOptions) (GTK_FILL),\r
976                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
977 \r
978   eventbox = gtk_event_box_new ();\r
979   gtk_widget_show (eventbox);\r
980   gtk_table_attach (GTK_TABLE (table1), eventbox, 1, 2, 12, 13,\r
981                     (GtkAttachOptions) (GTK_FILL),\r
982                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
983 \r
984   lock_valuechange_togglebutton = gtk_toggle_button_new_with_mnemonic ("UNLOCK");\r
985   gtk_widget_show (lock_valuechange_togglebutton);\r
986   gtk_container_add (GTK_CONTAINER (eventbox), lock_valuechange_togglebutton);\r
987 \r
988   // Value Spins\r
989   hshift_value_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
990   hshift_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hshift_value_spinbutton_adj), 1, 2);\r
991   gtk_widget_show (hshift_value_spinbutton);\r
992   gtk_table_attach (GTK_TABLE (table1), hshift_value_spinbutton, 1, 2, 2, 3,\r
993                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
994                     (GtkAttachOptions) (0), 0, 0);\r
995   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hshift_value_spinbutton), GTK_UPDATE_IF_VALID);\r
996   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hshift_value_spinbutton), TRUE);\r
997   gtk_widget_set_sensitive( GTK_WIDGET( hshift_value_spinbutton ), FALSE );\r
998 \r
999   vshift_value_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1000   vshift_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vshift_value_spinbutton_adj), 1, 2);\r
1001   gtk_widget_show (vshift_value_spinbutton);\r
1002   gtk_table_attach (GTK_TABLE (table1), vshift_value_spinbutton, 1, 2, 4, 5,\r
1003                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1004                     (GtkAttachOptions) (0), 0, 0);\r
1005   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vshift_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1006   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vshift_value_spinbutton), TRUE);\r
1007   gtk_widget_set_sensitive( GTK_WIDGET( vshift_value_spinbutton ), FALSE );\r
1008 \r
1009   hscale_value_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1010   hscale_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hscale_value_spinbutton_adj), 1, 4);\r
1011   gtk_widget_show (hscale_value_spinbutton);\r
1012   gtk_table_attach (GTK_TABLE (table1), hscale_value_spinbutton, 1, 2, 6, 7,\r
1013                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1014                     (GtkAttachOptions) (0), 0, 0);\r
1015   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hscale_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1016   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hscale_value_spinbutton), TRUE);\r
1017   gtk_widget_set_sensitive( GTK_WIDGET( hscale_value_spinbutton ), FALSE );\r
1018 \r
1019   vscale_value_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1020   vscale_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vscale_value_spinbutton_adj), 1, 4);\r
1021   gtk_widget_show (vscale_value_spinbutton);\r
1022   gtk_table_attach (GTK_TABLE (table1), vscale_value_spinbutton, 1, 2, 8, 9,\r
1023                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1024                     (GtkAttachOptions) (0), 0, 0);\r
1025   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vscale_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1026   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vscale_value_spinbutton), TRUE);\r
1027   gtk_widget_set_sensitive( GTK_WIDGET( vscale_value_spinbutton ), FALSE );\r
1028   \r
1029   rotate_value_spinbutton_adj = gtk_adjustment_new (0.0, -360.0, 360.0, 1.0, 10.0, 10.0);\r
1030   rotate_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (rotate_value_spinbutton_adj), 1, 0);\r
1031   gtk_widget_show (rotate_value_spinbutton);\r
1032   gtk_table_attach (GTK_TABLE (table1), rotate_value_spinbutton, 1, 2, 10, 11,\r
1033                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1034                     (GtkAttachOptions) (0), 0, 0);\r
1035   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rotate_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1036   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (rotate_value_spinbutton), TRUE);\r
1037   gtk_widget_set_sensitive( GTK_WIDGET( rotate_value_spinbutton ), FALSE );\r
1038 \r
1039   // Offset Spins                  \r
1040   hshift_offset_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1041   hshift_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hshift_offset_spinbutton_adj), 0, 2);\r
1042   gtk_widget_show (hshift_offset_spinbutton);\r
1043   gtk_table_attach (GTK_TABLE (table1), hshift_offset_spinbutton, 2, 3, 2, 3,\r
1044                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1045                     (GtkAttachOptions) (0), 4, 0);\r
1046   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (hshift_offset_spinbutton), TRUE);\r
1047   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hshift_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1048   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hshift_offset_spinbutton), TRUE);\r
1049 \r
1050   vshift_offset_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1051   vshift_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vshift_offset_spinbutton_adj), 0, 2);\r
1052   gtk_widget_show (vshift_offset_spinbutton);\r
1053   gtk_table_attach (GTK_TABLE (table1), vshift_offset_spinbutton, 2, 3, 4, 5,\r
1054                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1055                     (GtkAttachOptions) (0), 4, 0);\r
1056   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (vshift_offset_spinbutton), TRUE);\r
1057   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vshift_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1058   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vshift_offset_spinbutton), TRUE);\r
1059 \r
1060   hscale_offset_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1061   hscale_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hscale_offset_spinbutton_adj), 0, 4);\r
1062   gtk_widget_show (hscale_offset_spinbutton);\r
1063   gtk_table_attach (GTK_TABLE (table1), hscale_offset_spinbutton, 2, 3, 6, 7,\r
1064                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1065                     (GtkAttachOptions) (0), 4, 0);\r
1066   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (hscale_offset_spinbutton), TRUE);\r
1067   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hscale_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1068   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hscale_offset_spinbutton), TRUE);\r
1069 \r
1070   vscale_offset_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1071   vscale_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vscale_offset_spinbutton_adj), 0, 4);\r
1072   gtk_widget_show (vscale_offset_spinbutton);\r
1073   gtk_table_attach (GTK_TABLE (table1), vscale_offset_spinbutton, 2, 3, 8, 9,\r
1074                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1075                     (GtkAttachOptions) (0), 4, 0);\r
1076   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (vscale_offset_spinbutton), TRUE);\r
1077   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vscale_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1078   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vscale_offset_spinbutton), TRUE);\r
1079 \r
1080   rotate_offset_spinbutton_adj = gtk_adjustment_new (0.0, -360.0, 360.0, 1.0, 10.0, 10.0);\r
1081   rotate_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (rotate_offset_spinbutton_adj), 0, 2);\r
1082   gtk_widget_show (rotate_offset_spinbutton);\r
1083   gtk_table_attach (GTK_TABLE (table1), rotate_offset_spinbutton, 2, 3, 10, 11,\r
1084                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1085                     (GtkAttachOptions) (0), 4, 0);\r
1086   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (rotate_offset_spinbutton), TRUE);\r
1087   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rotate_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1088   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (rotate_offset_spinbutton), TRUE);\r
1089 \r
1090     // Step Spins\r
1091   hshift_step_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1092   hshift_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hshift_step_spinbutton_adj), 1, 2);\r
1093   gtk_widget_show (hshift_step_spinbutton);\r
1094   gtk_table_attach (GTK_TABLE (table1), hshift_step_spinbutton, 3, 4, 2, 3,\r
1095                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1096                     (GtkAttachOptions) (0), 0, 0);\r
1097   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hshift_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1098 \r
1099   vshift_step_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1100   vshift_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vshift_step_spinbutton_adj), 1, 2);\r
1101   gtk_widget_show (vshift_step_spinbutton);\r
1102   gtk_table_attach (GTK_TABLE (table1), vshift_step_spinbutton, 3, 4, 4, 5,\r
1103                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1104                     (GtkAttachOptions) (0), 0, 0);\r
1105   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vshift_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1106 \r
1107   hscale_step_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1108   hscale_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hscale_step_spinbutton_adj), 1, 4);\r
1109   gtk_widget_show (hscale_step_spinbutton);\r
1110   gtk_table_attach (GTK_TABLE (table1), hscale_step_spinbutton, 3, 4, 6, 7,\r
1111                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1112                     (GtkAttachOptions) (0), 0, 0);\r
1113   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hscale_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1114 \r
1115   vscale_step_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1116   vscale_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vscale_step_spinbutton_adj), 1, 4);\r
1117   gtk_widget_show (vscale_step_spinbutton);\r
1118   gtk_table_attach (GTK_TABLE (table1), vscale_step_spinbutton, 3, 4, 8, 9,\r
1119                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1120                     (GtkAttachOptions) (0), 0, 0);\r
1121   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vscale_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1122 \r
1123   rotate_step_spinbutton_adj = gtk_adjustment_new (0.0, -360.0, 360.0, 1.0, 10.0, 10.0);\r
1124   rotate_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (rotate_step_spinbutton_adj), 1, 2);\r
1125   gtk_widget_show (rotate_step_spinbutton);\r
1126   gtk_table_attach (GTK_TABLE (table1), rotate_step_spinbutton, 3, 4, 10, 11,\r
1127                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1128                     (GtkAttachOptions) (0), 0, 0);\r
1129   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rotate_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1130 \r
1131   eventbox = gtk_event_box_new ();\r
1132   gtk_widget_show (eventbox);\r
1133   gtk_table_attach (GTK_TABLE (table1), eventbox, 2, 3, 12, 13,\r
1134                     (GtkAttachOptions) (0),\r
1135                     (GtkAttachOptions) (0), 0, 0);\r
1136 \r
1137   eventbox = gtk_event_box_new ();\r
1138   gtk_widget_show (eventbox);\r
1139   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 12, 13,\r
1140                     (GtkAttachOptions) (0),\r
1141                     (GtkAttachOptions) (0), 0, 0);\r
1142 \r
1143   eventbox = gtk_event_box_new ();\r
1144   gtk_widget_show (eventbox);\r
1145   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 0, 1,\r
1146                     (GtkAttachOptions) (0),\r
1147                     (GtkAttachOptions) (0), 0, 0);\r
1148 \r
1149   viewport7 = gtk_viewport_new (NULL, NULL);\r
1150   gtk_widget_show (viewport7);\r
1151   gtk_box_pack_start (GTK_BOX (vbox7), viewport7, FALSE, TRUE, 0);\r
1152   gtk_container_set_border_width (GTK_CONTAINER (viewport7), 2);\r
1153   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport7), GTK_SHADOW_ETCHED_IN);\r
1154 \r
1155   table4 = gtk_table_new (4, 7, FALSE);\r
1156   gtk_widget_show (table4);\r
1157   gtk_container_add (GTK_CONTAINER (viewport7), table4);\r
1158 \r
1159   viewport5 = gtk_viewport_new (NULL, NULL);\r
1160   gtk_widget_show (viewport5);\r
1161   gtk_table_attach (GTK_TABLE (table4), viewport5, 1, 7, 0, 4,\r
1162                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1163                     (GtkAttachOptions) (0), 0, 0);\r
1164   gtk_container_set_border_width (GTK_CONTAINER (viewport5), 6);\r
1165   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport5), GTK_SHADOW_ETCHED_OUT);\r
1166 \r
1167   table5 = gtk_table_new (2, 3, FALSE);\r
1168   gtk_widget_show (table5);\r
1169   gtk_container_add (GTK_CONTAINER (viewport5), table5);\r
1170   gtk_container_set_border_width (GTK_CONTAINER (table5), 5);\r
1171   gtk_table_set_col_spacings (GTK_TABLE (table5), 2);\r
1172 \r
1173   label = gtk_label_new ("Height");\r
1174   gtk_widget_show (label);\r
1175   gtk_table_attach (GTK_TABLE (table5), label, 2, 3, 0, 1,\r
1176                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1177                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1178   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1179   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 1);\r
1180 \r
1181   label = gtk_label_new ("Width");\r
1182   gtk_widget_show (label);\r
1183   gtk_table_attach (GTK_TABLE (table5), label, 1, 2, 0, 1,\r
1184                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1185                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1186   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1187   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 1);\r
1188 \r
1189   fit_width_spinbutton_adj = gtk_adjustment_new (1, 1, 32, 1, 10, 10);\r
1190   fit_width_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (fit_width_spinbutton_adj), 1, 0);\r
1191   gtk_widget_show (fit_width_spinbutton);\r
1192   gtk_table_attach (GTK_TABLE (table5), fit_width_spinbutton, 1, 2, 1, 2,\r
1193                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1194                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1195   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fit_width_spinbutton), TRUE);\r
1196   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (fit_width_spinbutton), GTK_UPDATE_IF_VALID);\r
1197 \r
1198   fit_height_spinbutton_adj = gtk_adjustment_new (1, 1, 32, 1, 10, 10);\r
1199   fit_height_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (fit_height_spinbutton_adj), 1, 0);\r
1200   gtk_widget_show (fit_height_spinbutton);\r
1201   gtk_table_attach (GTK_TABLE (table5), fit_height_spinbutton, 2, 3, 1, 2,\r
1202                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1203                     (GtkAttachOptions) (GTK_FILL), 3, 0);\r
1204   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fit_height_spinbutton), TRUE);\r
1205   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (fit_height_spinbutton), GTK_UPDATE_IF_VALID);\r
1206 \r
1207   eventbox = gtk_event_box_new ();\r
1208   gtk_widget_show (eventbox);\r
1209   gtk_table_attach (GTK_TABLE (table5), eventbox, 0, 1, 0, 1,\r
1210                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1211                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1212 \r
1213   eventbox = gtk_event_box_new ();\r
1214   gtk_widget_show (eventbox);\r
1215   gtk_table_attach (GTK_TABLE (table5), eventbox, 0, 1, 1, 2,\r
1216                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1217                     (GtkAttachOptions) (GTK_FILL), 4, 0);\r
1218 \r
1219   fit_button = gtk_button_new_with_mnemonic ("    Fit    ");\r
1220   gtk_widget_show (fit_button);\r
1221   gtk_container_add (GTK_CONTAINER (eventbox), fit_button);\r
1222 \r
1223   viewport6 = gtk_viewport_new (NULL, NULL);\r
1224   gtk_widget_show (viewport6);\r
1225   gtk_table_attach (GTK_TABLE (table4), viewport6, 0, 1, 0, 4,\r
1226                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1227                     (GtkAttachOptions) (0), 0, 0);\r
1228   gtk_container_set_border_width (GTK_CONTAINER (viewport6), 4);\r
1229   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport6), GTK_SHADOW_NONE);\r
1230 \r
1231   table7 = gtk_table_new (2, 1, FALSE);\r
1232   gtk_widget_show (table7);\r
1233   gtk_container_add (GTK_CONTAINER (viewport6), table7);\r
1234 \r
1235   eventbox = gtk_event_box_new ();\r
1236   gtk_widget_show (eventbox);\r
1237   gtk_table_attach (GTK_TABLE (table7), eventbox, 0, 1, 0, 2,\r
1238                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1239                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);\r
1240 \r
1241   axial_button = gtk_button_new_with_mnemonic ("Axial");\r
1242   gtk_widget_show (axial_button);\r
1243   gtk_container_add (GTK_CONTAINER (eventbox), axial_button);\r
1244   gtk_widget_set_size_request (axial_button, 56, 29);\r
1245   gtk_container_set_border_width (GTK_CONTAINER (axial_button), 4);\r
1246 \r
1247   viewport10 = gtk_viewport_new (NULL, NULL);\r
1248   gtk_widget_show (viewport10);\r
1249   gtk_box_pack_start (GTK_BOX (vbox7), viewport10, FALSE, TRUE, 0);\r
1250   gtk_container_set_border_width (GTK_CONTAINER (viewport10), 2);\r
1251   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport10), GTK_SHADOW_ETCHED_IN);\r
1252 \r
1253   hbuttonbox1 = gtk_hbutton_box_new ();\r
1254   gtk_widget_show (hbuttonbox1);\r
1255   gtk_container_add (GTK_CONTAINER (viewport10), hbuttonbox1);\r
1256   gtk_container_set_border_width (GTK_CONTAINER (hbuttonbox1), 4);\r
1257   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_SPREAD);\r
1258 \r
1259   done_button = gtk_button_new ();\r
1260   gtk_widget_show (done_button);\r
1261   gtk_container_add (GTK_CONTAINER (hbuttonbox1), done_button);\r
1262   GTK_WIDGET_SET_FLAGS (done_button, GTK_CAN_DEFAULT);\r
1263 \r
1264   alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0);\r
1265   gtk_widget_show (alignment1);\r
1266   gtk_container_add (GTK_CONTAINER (done_button), alignment1);\r
1267 \r
1268   hbox2 = gtk_hbox_new (FALSE, 2);\r
1269   gtk_widget_show (hbox2);\r
1270   gtk_container_add (GTK_CONTAINER (alignment1), hbox2);\r
1271 \r
1272   image1 = gtk_image_new_from_stock ("gtk-yes", GTK_ICON_SIZE_BUTTON);\r
1273   gtk_widget_show (image1);\r
1274   gtk_box_pack_start (GTK_BOX (hbox2), image1, FALSE, FALSE, 0);\r
1275 \r
1276   label = gtk_label_new_with_mnemonic ("Done");\r
1277   gtk_widget_show (label);\r
1278   gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);\r
1279   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1280 \r
1281   apply_button = gtk_button_new ();\r
1282   gtk_widget_show (apply_button);\r
1283   gtk_container_add (GTK_CONTAINER (hbuttonbox1), apply_button);\r
1284   GTK_WIDGET_SET_FLAGS (apply_button, GTK_CAN_DEFAULT);\r
1285 \r
1286   alignment3 = gtk_alignment_new (0.5, 0.5, 0, 0);\r
1287   gtk_widget_show (alignment3);\r
1288   gtk_container_add (GTK_CONTAINER (apply_button), alignment3);\r
1289 \r
1290   hbox4 = gtk_hbox_new (FALSE, 2);\r
1291   gtk_widget_show (hbox4);\r
1292   gtk_container_add (GTK_CONTAINER (alignment3), hbox4);\r
1293 \r
1294   image3 = gtk_image_new_from_stock ("gtk-apply", GTK_ICON_SIZE_BUTTON);\r
1295   gtk_widget_show (image3);\r
1296   gtk_box_pack_start (GTK_BOX (hbox4), image3, FALSE, FALSE, 0);\r
1297 \r
1298   label = gtk_label_new_with_mnemonic ("Apply");\r
1299   gtk_widget_show (label);\r
1300   gtk_box_pack_start (GTK_BOX (hbox4), label, FALSE, FALSE, 0);\r
1301   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1302 \r
1303   cancel_button = gtk_button_new ();\r
1304   gtk_widget_show (cancel_button);\r
1305   gtk_container_add (GTK_CONTAINER (hbuttonbox1), cancel_button);\r
1306   GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);\r
1307 \r
1308   alignment2 = gtk_alignment_new (0.5, 0.5, 0, 0);\r
1309   gtk_widget_show (alignment2);\r
1310   gtk_container_add (GTK_CONTAINER (cancel_button), alignment2);\r
1311 \r
1312   hbox3 = gtk_hbox_new (FALSE, 2);\r
1313   gtk_widget_show (hbox3);\r
1314   gtk_container_add (GTK_CONTAINER (alignment2), hbox3);\r
1315 \r
1316   image2 = gtk_image_new_from_stock ("gtk-no", GTK_ICON_SIZE_BUTTON);\r
1317   gtk_widget_show (image2);\r
1318   gtk_box_pack_start (GTK_BOX (hbox3), image2, FALSE, FALSE, 0);\r
1319 \r
1320   label = gtk_label_new_with_mnemonic ("Cancel");\r
1321   gtk_widget_show (label);\r
1322   gtk_box_pack_start (GTK_BOX (hbox3), label, FALSE, FALSE, 0);\r
1323   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1324 \r
1325 \r
1326   g_signal_connect ( (gpointer) SurfaceInspector, \r
1327                       "delete_event", \r
1328                       G_CALLBACK (delete_event_callback), \r
1329                       NULL );\r
1330   g_signal_connect ((gpointer) SurfaceInspector, "destroy",\r
1331                     G_CALLBACK (gtk_widget_destroy),\r
1332                     NULL);\r
1333   \r
1334   g_signal_connect ((gpointer) texture_combo_entry, "key_press_event",\r
1335                     G_CALLBACK (on_texture_combo_entry_key_press_event),\r
1336                     NULL);\r
1337   g_signal_connect ((gpointer) texture_combo_entry, "activate",\r
1338                     G_CALLBACK (on_texture_combo_entry_activate),\r
1339                     NULL);\r
1340                     \r
1341   \r
1342   g_signal_connect ((gpointer) hshift_offset_spinbutton, "value_changed",\r
1343                     G_CALLBACK (on_hshift_offset_spinbutton_value_changed),\r
1344                     NULL);\r
1345   g_signal_connect ((gpointer) vshift_offset_spinbutton, "value_changed",\r
1346                     G_CALLBACK (on_vshift_offset_spinbutton_value_changed),\r
1347                     NULL);\r
1348   g_signal_connect ((gpointer) hscale_offset_spinbutton, "value_changed",\r
1349                     G_CALLBACK (on_hscale_offset_spinbutton_value_changed),\r
1350                     NULL);\r
1351   g_signal_connect ((gpointer) vscale_offset_spinbutton, "value_changed",\r
1352                     G_CALLBACK (on_vscale_offset_spinbutton_value_changed),\r
1353                     NULL);\r
1354   g_signal_connect ((gpointer) rotate_offset_spinbutton, "value_changed",\r
1355                     G_CALLBACK (on_rotate_offset_spinbutton_value_changed),\r
1356                     NULL);\r
1357   \r
1358   g_signal_connect ((gpointer) hshift_value_spinbutton, "value_changed",\r
1359                     G_CALLBACK (on_hshift_value_spinbutton_value_changed),\r
1360                     NULL);\r
1361   g_signal_connect ((gpointer) vshift_value_spinbutton, "value_changed",\r
1362                     G_CALLBACK (on_vshift_value_spinbutton_value_changed),\r
1363                     NULL);\r
1364   g_signal_connect ((gpointer) hscale_value_spinbutton, "value_changed",\r
1365                     G_CALLBACK (on_hscale_value_spinbutton_value_changed),\r
1366                     NULL);\r
1367   g_signal_connect ((gpointer) vscale_value_spinbutton, "value_changed",\r
1368                     G_CALLBACK (on_vscale_value_spinbutton_value_changed),\r
1369                     NULL);\r
1370   g_signal_connect ((gpointer) rotate_value_spinbutton, "value_changed",\r
1371                     G_CALLBACK (on_rotate_value_spinbutton_value_changed),\r
1372                     NULL);\r
1373   \r
1374   g_signal_connect ((gpointer) hshift_step_spinbutton, "value_changed",\r
1375                     G_CALLBACK (on_hshift_step_spinbutton_value_changed),\r
1376                     NULL);\r
1377   g_signal_connect ((gpointer) vshift_step_spinbutton, "value_changed",\r
1378                     G_CALLBACK (on_vshift_step_spinbutton_value_changed),\r
1379                     NULL);\r
1380   g_signal_connect ((gpointer) hscale_step_spinbutton, "value_changed",\r
1381                     G_CALLBACK (on_hscale_step_spinbutton_value_changed),\r
1382                     NULL);\r
1383   g_signal_connect ((gpointer) vscale_step_spinbutton, "value_changed",\r
1384                     G_CALLBACK (on_vscale_step_spinbutton_value_changed),\r
1385                     NULL);\r
1386   g_signal_connect ((gpointer) rotate_step_spinbutton, "value_changed",\r
1387                     G_CALLBACK (on_rotate_step_spinbutton_value_changed),\r
1388                     NULL);\r
1389   \r
1390   g_signal_connect ((gpointer) match_grid_button, "clicked",\r
1391                     G_CALLBACK (on_match_grid_button_clicked),\r
1392                     NULL);\r
1393   g_signal_connect ((gpointer) lock_valuechange_togglebutton, "toggled",\r
1394                     G_CALLBACK (on_lock_valuechange_togglebutton_toggled),\r
1395                     NULL);\r
1396   \r
1397   g_signal_connect ((gpointer) fit_width_spinbutton, "value_changed",\r
1398                     G_CALLBACK (on_fit_width_spinbutton_value_changed),\r
1399                     NULL);\r
1400   g_signal_connect ((gpointer) fit_height_spinbutton, "value_changed",\r
1401                     G_CALLBACK (on_fit_height_spinbutton_value_changed),\r
1402                     NULL);\r
1403   g_signal_connect ((gpointer) fit_button, "clicked",\r
1404                     G_CALLBACK (on_fit_button_clicked),\r
1405                     NULL);\r
1406   \r
1407   g_signal_connect ((gpointer) axial_button, "clicked",\r
1408                     G_CALLBACK (on_axial_button_clicked),\r
1409                     NULL);\r
1410   \r
1411   g_signal_connect ((gpointer) done_button, "clicked",\r
1412                     G_CALLBACK (on_done_button_clicked),\r
1413                     NULL);\r
1414   g_signal_connect ((gpointer) apply_button, "clicked",\r
1415                     G_CALLBACK (on_apply_button_clicked),\r
1416                     NULL);\r
1417   g_signal_connect ((gpointer) cancel_button, "clicked",\r
1418                     G_CALLBACK (on_cancel_button_clicked),\r
1419                     NULL);\r
1420   \r
1421   \r
1422   return SurfaceInspector;\r
1423 }\r
1424 \r
1425 \r
1426 // Texture Combo\r
1427 gboolean on_texture_combo_entry_key_press_event (GtkWidget *widget, GdkEventKey *event,\r
1428                                                  gpointer user_data)\r
1429 {\r
1430   // Have Tab activate selection as well as Return\r
1431   if (event->keyval == GDK_Tab)\r
1432     g_signal_emit_by_name ( texture_combo_entry, "activate" );\r
1433 \r
1434   return FALSE;\r
1435 }\r
1436 \r
1437 void on_texture_combo_entry_activate (GtkEntry *entry, gpointer user_data)\r
1438 {\r
1439   texdef_t* tmp_texdef;\r
1440   texdef_t* tmp_orig_texdef;\r
1441   texdef_to_face_t* temp_texdef_face_list;\r
1442   char text[128] = { 0 };\r
1443   \r
1444   if (!texdef_face_list_empty() && g_bListenChanged)\r
1445   {\r
1446     // activate only on entry change\r
1447     strcpy( text, gtk_entry_get_text(entry));\r
1448     if ( strcmp( old_texture_entry, text ))\r
1449     {\r
1450       // Check for spaces in shader name\r
1451       if (text[0] <= ' ' || strchr(text, ' '))\r
1452         Sys_FPrintf(SYS_WRN, "WARNING: spaces in shader names are not allowed, ignoring '%s'\n", text);\r
1453       else\r
1454       {  \r
1455         for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1456         {\r
1457           tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1458           tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1459           strcpy( old_texture_entry, text );\r
1460           tmp_texdef->SetName( text );\r
1461         }\r
1462         GetTexMods();\r
1463       }\r
1464     }\r
1465   }\r
1466 }\r
1467 \r
1468 // Offset Spins\r
1469 static void on_hshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1470 {\r
1471   texdef_t* tmp_texdef;\r
1472   texdef_t* tmp_orig_texdef;\r
1473   texdef_to_face_t* temp_texdef_face_list;\r
1474   \r
1475   texdef_offset.shift[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hshift_offset_spinbutton) );\r
1476   \r
1477   if (!texdef_face_list_empty() && g_bListenChanged)\r
1478   {\r
1479     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1480     {\r
1481       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1482       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1483       if (is_HShift_conflicting)\r
1484         tmp_texdef->shift[0] = tmp_orig_texdef->shift[0] + texdef_offset.shift[0];\r
1485       else\r
1486         tmp_texdef->shift[0] = texdef_SI_values.shift[0] + texdef_offset.shift[0];\r
1487     }\r
1488     GetTexMods();\r
1489   }\r
1490 }\r
1491 \r
1492 static void on_vshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1493 {\r
1494   texdef_t* tmp_texdef;\r
1495   texdef_t* tmp_orig_texdef;\r
1496   texdef_to_face_t* temp_texdef_face_list;\r
1497   \r
1498   texdef_offset.shift[1] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vshift_offset_spinbutton) );\r
1499   \r
1500   if (!texdef_face_list_empty() && g_bListenChanged)\r
1501   {\r
1502     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1503     {\r
1504       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1505       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1506       if (is_VShift_conflicting)\r
1507         tmp_texdef->shift[1] = tmp_orig_texdef->shift[1] + texdef_offset.shift[1];\r
1508       else\r
1509         tmp_texdef->shift[1] = texdef_SI_values.shift[1] + texdef_offset.shift[1];\r
1510     }\r
1511     GetTexMods();\r
1512   }\r
1513   \r
1514 }\r
1515 \r
1516 static void on_hscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1517 {\r
1518   texdef_t* tmp_texdef;\r
1519   texdef_t* tmp_orig_texdef;\r
1520   texdef_to_face_t* temp_texdef_face_list;\r
1521   \r
1522   texdef_offset.scale[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_offset_spinbutton) );\r
1523   \r
1524   if (!texdef_face_list_empty() && g_bListenChanged)\r
1525   {\r
1526     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1527     {\r
1528       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1529       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1530       if (is_HScale_conflicting)\r
1531         tmp_texdef->scale[0] = tmp_orig_texdef->scale[0] + texdef_offset.scale[0];\r
1532       else\r
1533         tmp_texdef->scale[0] = texdef_SI_values.scale[0] + texdef_offset.scale[0];\r
1534     }\r
1535     GetTexMods();\r
1536   }\r
1537   \r
1538   \r
1539 }\r
1540 \r
1541 static void on_vscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1542 {\r
1543   texdef_t* tmp_texdef;\r
1544   texdef_t* tmp_orig_texdef;\r
1545   texdef_to_face_t* temp_texdef_face_list;\r
1546   \r
1547   texdef_offset.scale[1] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_offset_spinbutton) );\r
1548   \r
1549   if (!texdef_face_list_empty() && g_bListenChanged)\r
1550   {\r
1551     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1552     {\r
1553       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1554       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1555       if (is_VScale_conflicting)\r
1556         tmp_texdef->scale[1] = tmp_orig_texdef->scale[1] + texdef_offset.scale[1];\r
1557       else\r
1558         tmp_texdef->scale[1] = texdef_SI_values.scale[1] + texdef_offset.scale[1];\r
1559     }\r
1560     GetTexMods();\r
1561   }\r
1562   \r
1563 }\r
1564 \r
1565 static void on_rotate_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1566 {\r
1567   texdef_t* tmp_texdef;\r
1568   texdef_t* tmp_orig_texdef;\r
1569   texdef_to_face_t* temp_texdef_face_list;\r
1570   \r
1571   texdef_offset.rotate = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(rotate_offset_spinbutton) );\r
1572   \r
1573   if (!texdef_face_list_empty() && g_bListenChanged)\r
1574   {\r
1575     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1576     {\r
1577       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1578       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1579       if (is_Rotate_conflicting)\r
1580         tmp_texdef->rotate = tmp_orig_texdef->rotate + texdef_offset.rotate;\r
1581       else\r
1582         tmp_texdef->rotate = texdef_SI_values.rotate + texdef_offset.rotate;\r
1583     }\r
1584     GetTexMods();\r
1585   }\r
1586  \r
1587 }\r
1588 \r
1589 \r
1590 // Match Grid\r
1591 static void on_match_grid_button_clicked (GtkButton *button, gpointer user_data)\r
1592 {\r
1593   float hscale, vscale;\r
1594 \r
1595   if( !strcmp(gtk_entry_get_text (GTK_ENTRY (hscale_value_spinbutton)), "") )\r
1596     hscale = 0.0;\r
1597   else\r
1598     hscale = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_value_spinbutton) );\r
1599 \r
1600   if( !strcmp( gtk_entry_get_text (GTK_ENTRY (vscale_value_spinbutton)), "") )\r
1601     vscale = 0.0;\r
1602   else\r
1603     vscale = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_value_spinbutton) );\r
1604   DoSnapTToGrid (hscale, vscale);\r
1605 }\r
1606 \r
1607 \r
1608 // Lock out changes to Value\r
1609 static void on_lock_valuechange_togglebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data)\r
1610 {\r
1611   bool is_Locked;\r
1612 \r
1613   is_Locked = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lock_valuechange_togglebutton));\r
1614 \r
1615   gtk_widget_set_sensitive( GTK_WIDGET( hscale_value_spinbutton ), is_Locked );\r
1616   gtk_widget_set_sensitive( GTK_WIDGET( vscale_value_spinbutton ), is_Locked );\r
1617   gtk_widget_set_sensitive( GTK_WIDGET( hshift_value_spinbutton ), is_Locked );\r
1618   gtk_widget_set_sensitive( GTK_WIDGET( vshift_value_spinbutton ), is_Locked );\r
1619   gtk_widget_set_sensitive( GTK_WIDGET( rotate_value_spinbutton ), is_Locked );\r
1620 }\r
1621 \r
1622 \r
1623 // Value Spins\r
1624 static void on_hshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1625 {\r
1626   texdef_t* tmp_texdef;\r
1627   texdef_t* tmp_orig_texdef;\r
1628   texdef_to_face_t* temp_texdef_face_list;\r
1629 \r
1630   texdef_SI_values.shift[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hshift_value_spinbutton) );\r
1631 \r
1632   if (!texdef_face_list_empty() && g_bListenChanged)\r
1633   {\r
1634     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1635     {\r
1636       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1637       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1638       tmp_texdef->shift[0] = texdef_SI_values.shift[0] + texdef_offset.shift[0];\r
1639       is_HShift_conflicting = FALSE;\r
1640     }\r
1641     GetTexMods();\r
1642   }\r
1643 }\r
1644 \r
1645 static void on_vshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1646 {\r
1647   texdef_t* tmp_texdef;\r
1648   texdef_t* tmp_orig_texdef;\r
1649   texdef_to_face_t* temp_texdef_face_list;\r
1650   \r
1651   texdef_SI_values.shift[1]  = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vshift_value_spinbutton) );\r
1652   \r
1653   if (!texdef_face_list_empty() && g_bListenChanged)\r
1654   {\r
1655     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1656     {\r
1657       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1658       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1659       tmp_texdef->shift[1] = texdef_SI_values.shift[1] + texdef_offset.shift[1];\r
1660       is_VShift_conflicting = FALSE;\r
1661     }\r
1662     GetTexMods();\r
1663   }\r
1664 }\r
1665 \r
1666 static void on_hscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1667 {\r
1668   texdef_t* tmp_texdef;\r
1669   texdef_t* tmp_orig_texdef;\r
1670   texdef_to_face_t* temp_texdef_face_list;\r
1671   \r
1672   texdef_SI_values.scale[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_value_spinbutton) );\r
1673   \r
1674   if (!texdef_face_list_empty() && g_bListenChanged)\r
1675   {\r
1676     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1677     {\r
1678       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1679       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1680       tmp_texdef->scale[0] = texdef_SI_values.scale[0] + texdef_offset.scale[0];\r
1681       is_HScale_conflicting = FALSE;\r
1682     }\r
1683     GetTexMods();\r
1684   }\r
1685 }\r
1686 \r
1687 static void on_vscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1688 {\r
1689   texdef_t* tmp_texdef;\r
1690   texdef_t* tmp_orig_texdef;\r
1691   texdef_to_face_t* temp_texdef_face_list;\r
1692   \r
1693   texdef_SI_values.scale[1] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_value_spinbutton) );\r
1694   \r
1695   if (!texdef_face_list_empty() && g_bListenChanged)\r
1696   {\r
1697     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1698     {\r
1699       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1700       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1701       tmp_texdef->scale[1] = texdef_SI_values.scale[1] + texdef_offset.scale[1];\r
1702       is_VScale_conflicting = FALSE;\r
1703     }\r
1704     GetTexMods();\r
1705   }\r
1706 }\r
1707 \r
1708 static void on_rotate_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1709 {\r
1710   texdef_t* tmp_texdef;\r
1711   texdef_t* tmp_orig_texdef;\r
1712   texdef_to_face_t* temp_texdef_face_list;\r
1713   \r
1714   texdef_SI_values.rotate = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(rotate_value_spinbutton) );\r
1715   \r
1716   if (!texdef_face_list_empty() && g_bListenChanged)\r
1717   {\r
1718     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1719     {\r
1720       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1721       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1722       tmp_texdef->rotate = texdef_SI_values.rotate + texdef_offset.rotate;\r
1723       is_Rotate_conflicting = FALSE;\r
1724     }\r
1725     GetTexMods();\r
1726   }\r
1727 }\r
1728 \r
1729 \r
1730 // Step Spins\r
1731 static void on_hshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1732 {\r
1733   gfloat val;\r
1734   GtkAdjustment * adjust;\r
1735 \r
1736   if (!g_bListenChanged)\r
1737     return;\r
1738 \r
1739   l_pIncrement = Get_SI_Inc();\r
1740 \r
1741 #ifdef DBG_SI\r
1742   Sys_Printf("OnIncrementChanged HShift\n");\r
1743 #endif\r
1744 \r
1745   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hshift_step_spinbutton) ) ;\r
1746   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hshift_offset_spinbutton ));\r
1747   adjust->step_increment = val;\r
1748   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hshift_value_spinbutton ));\r
1749   adjust->step_increment = val;\r
1750   l_pIncrement->shift[0] = val;\r
1751 }\r
1752 \r
1753 static void on_vshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1754 {\r
1755   gfloat val;\r
1756   GtkAdjustment * adjust;\r
1757 \r
1758   if (!g_bListenChanged)\r
1759     return;\r
1760 \r
1761   l_pIncrement = Get_SI_Inc();\r
1762 \r
1763 #ifdef DBG_SI\r
1764   Sys_Printf("OnIncrementChanged VShift\n");\r
1765 #endif\r
1766 \r
1767   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vshift_step_spinbutton) ) ;\r
1768   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vshift_offset_spinbutton ));\r
1769   adjust->step_increment = val;\r
1770   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vshift_value_spinbutton ));\r
1771   adjust->step_increment = val;\r
1772   l_pIncrement->shift[1] = val;\r
1773 }\r
1774 \r
1775 static void on_hscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1776 {\r
1777   gfloat val;\r
1778   GtkAdjustment * adjust;\r
1779 \r
1780   if (!g_bListenChanged)\r
1781     return;\r
1782 \r
1783   l_pIncrement = Get_SI_Inc();\r
1784 \r
1785 #ifdef DBG_SI\r
1786   Sys_Printf("OnIncrementChanged HShift\n");\r
1787 #endif\r
1788 \r
1789   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_step_spinbutton) ) ;\r
1790   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hscale_offset_spinbutton ));\r
1791   adjust->step_increment = val;\r
1792   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hscale_value_spinbutton ));\r
1793   adjust->step_increment = val;\r
1794   l_pIncrement->scale[0] = val;\r
1795 }\r
1796 \r
1797 static void on_vscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1798 {\r
1799   gfloat val;\r
1800   GtkAdjustment * adjust;\r
1801 \r
1802   if (!g_bListenChanged)\r
1803     return;\r
1804 \r
1805   l_pIncrement = Get_SI_Inc();\r
1806 \r
1807 #ifdef DBG_SI\r
1808   Sys_Printf("OnIncrementChanged HShift\n");\r
1809 #endif\r
1810 \r
1811   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_step_spinbutton) ) ;\r
1812   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vscale_offset_spinbutton ));\r
1813   adjust->step_increment = val;\r
1814   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vscale_value_spinbutton ));\r
1815   adjust->step_increment = val;\r
1816   l_pIncrement->scale[1] = val;\r
1817 }\r
1818 \r
1819 static void on_rotate_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1820 {\r
1821   gfloat val;\r
1822   GtkAdjustment * adjust;\r
1823 \r
1824   if (!g_bListenChanged)\r
1825     return;\r
1826 \r
1827   l_pIncrement = Get_SI_Inc();\r
1828 \r
1829 #ifdef DBG_SI\r
1830   Sys_Printf("OnIncrementChanged HShift\n");\r
1831 #endif\r
1832 \r
1833   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(rotate_step_spinbutton) ) ;\r
1834   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( rotate_offset_spinbutton ));\r
1835   adjust->step_increment = val;\r
1836   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( rotate_value_spinbutton ));\r
1837   adjust->step_increment = val;\r
1838   l_pIncrement->rotate = val;\r
1839 }\r
1840 \r
1841 \r
1842 // Fit Texture\r
1843 static void on_fit_width_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1844 {\r
1845   m_nWidth = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(fit_width_spinbutton) );\r
1846 }\r
1847 \r
1848 static void on_fit_height_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1849 {\r
1850   m_nHeight = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(fit_height_spinbutton) );\r
1851 }\r
1852 \r
1853 static void on_fit_button_clicked (GtkButton *button, gpointer user_data)\r
1854 {\r
1855   FaceList_FitTexture(get_texdef_face_list(), m_nHeight, m_nWidth);\r
1856   Sys_UpdateWindows(W_ALL);\r
1857 }\r
1858 \r
1859 \r
1860 // Axial Button\r
1861 static void on_axial_button_clicked (GtkButton *button, gpointer user_data)\r
1862 {\r
1863   texdef_t* tmp_texdef;\r
1864   texdef_t* tmp_orig_texdef;\r
1865   texdef_to_face_t* temp_texdef_face_list;\r
1866 \r
1867   if (!texdef_face_list_empty() && g_bListenChanged)\r
1868   {\r
1869     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1870     {\r
1871       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1872       tmp_texdef->shift[0] = 0.0;\r
1873       tmp_texdef->shift[1] = 0.0;\r
1874       tmp_texdef->scale[0] = 0.5;\r
1875       tmp_texdef->scale[1] = 0.5;\r
1876       tmp_texdef->rotate = 0.0;\r
1877     }\r
1878   }\r
1879 \r
1880   SetTexdef_FaceList( get_texdef_face_list(), FALSE, TRUE );\r
1881   Sys_UpdateWindows(W_ALL);\r
1882 }\r
1883 \r
1884 \r
1885 // Action Buttons\r
1886 static void on_done_button_clicked (GtkButton *button, gpointer user_data)\r
1887 {\r
1888   if ( !texdef_face_list_empty() )\r
1889     GetTexMods(TRUE);\r
1890   HideDlg();\r
1891   Sys_UpdateWindows(W_ALL);\r
1892 }\r
1893 \r
1894 static void on_apply_button_clicked (GtkButton *button, gpointer user_data)\r
1895 {\r
1896   if (!g_bListenChanged)\r
1897     return;\r
1898   if ( !texdef_face_list_empty() )\r
1899   {\r
1900     GetTexMods (TRUE);\r
1901     Sys_UpdateWindows(W_CAMERA);\r
1902     GetTexdefInfo_from_Radiant();\r
1903     SetTexMods();\r
1904   }\r
1905 }\r
1906 \r
1907 static void on_cancel_button_clicked (GtkButton *button, gpointer user_data)\r
1908 {\r
1909   texturewin = Texturewin ();\r
1910   texturewin->texdef = g_old_texdef;\r
1911   // cancel the last do if we own it\r
1912   if ( (m_nUndoId == Undo_GetUndoId()) && ( m_nUndoId != 0 ))\r
1913   {\r
1914 #ifdef DBG_SI\r
1915     Sys_Printf("OnCancel calling Undo_Undo\n");\r
1916 #endif\r
1917     g_bListenUpdate = false;\r
1918     Undo_Undo(TRUE);\r
1919     g_bListenUpdate = true;\r
1920     m_nUndoId = 0;\r
1921   }\r
1922   HideDlg();\r
1923 }\r
1924 \r
1925 \r