atomes 1.2.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
glwindow.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2025 by CNRS and University of Strasbourg */
15
22/*
23* This file: 'glwindow.c'
24*
25* Contains:
26*
27
28 - The functions to create a project OpenGL window
29
30*
31* List of functions:
32
33 gboolean create_3d_model (int p, gboolean load);
34
35 G_MODULE_EXPORT gboolean on_key_pressed (GtkWidget * widg, GdkEventKey * event, gpointer data);
36 G_MODULE_EXPORT gboolean on_glwin_key_pressed (GtkEventControllerKey * self, guint keyval, guint keycode, GdkModifierType state, gpointer data);
37
38 void update_all_menus (glwin * view, int nats);
39 void menu_items_opengl (GtkWidget * menu, glwin * view, int pop);
40 void menu_items_model (GtkWidget * menu, glwin * view, int pop);
41 void menu_items_view (GtkWidget * menu, glwin * view, int popm);
42 void prepare_opengl_menu_bar (glwin * view);
43 void change_color_map (glwin * view, int col);
44 void set_motion (glwin * view, int axis, int da, int db, gboolean UpDown, GdkModifierType state);
45 void activate_glwin_action (gchar * action_string, gchar * action_name, glwin * view);
46 void glwin_key_pressed (guint keyval, GdkModifierType state, gpointer data);
47 void prep_model (int p);
48
49 G_MODULE_EXPORT void render_gl_image (GtkWidget * widg, gpointer data);
50 G_MODULE_EXPORT void on_win_realize (GtkWidget * widg, gpointer data);
51
52 GtkWidget * prep_rings_menu (glwin * view, int id);
53 GtkWidget * coord_menu (glwin * view);
54 GtkWidget * menu_opengl (glwin * view, int pop);
55 GtkWidget * menu_model (glwin * view, int pop);
56 GtkWidget * menu_view (glwin * view, int popm);
57
58 mat4_t insert_projection (glwin * view);
59
60 vec3_t get_insertion_coordinates (glwin * view);
61
62*/
63
64#include "global.h"
65#include "project.h"
66#include "calc.h"
67#include "glview.h"
68#include "initcoord.h"
69#include "submenus.h"
70#include "color_box.h"
71
72extern G_MODULE_EXPORT void opengl_advanced (GtkWidget * widg, gpointer data);
73extern G_MODULE_EXPORT void coord_properties (GtkWidget * widg, gpointer data);
74extern G_MODULE_EXPORT void set_style (GtkWidget * widg, gpointer data);
75extern G_MODULE_EXPORT void set_render (GtkWidget * widg, gpointer data);
76extern G_MODULE_EXPORT void set_mode (GtkWidget * widg, gpointer data);
77extern void set_sensitive_coord_menu (glwin * view, gboolean status);
78extern void set_color_map_sensitive (glwin * view);
79extern G_MODULE_EXPORT void set_selection_mode (GtkWidget * widg, gpointer data);
80
81extern gboolean spin (gpointer data);
82extern G_MODULE_EXPORT void spin_stop (GtkButton * but, gpointer data);
83extern G_MODULE_EXPORT void spin_go (GtkWidget * widg, gpointer data);
84extern void update_menus (glwin * view);
85extern G_MODULE_EXPORT void set_box_axis_style (GtkWidget * widg, gpointer data);
86extern G_MODULE_EXPORT void window_measures (GtkWidget * widg, gpointer data);
87extern G_MODULE_EXPORT void window_recorder (GtkWidget * widg, gpointer data);
88extern void window_encode (glwin * view, gboolean video);
89extern GtkWidget * menupoly (glwin * view, int jd, int id, gchar * poln);
90extern G_MODULE_EXPORT void set_color_map (GtkWidget * widg, gpointer data);
91#ifdef GTK4
92extern void update_menu_bar (glwin * view);
93extern G_MODULE_EXPORT void set_full_screen (GSimpleAction * action, GVariant * parameter, gpointer data);
94extern G_MODULE_EXPORT void add_object (GSimpleAction * action, GVariant * parameter, gpointer data);
95extern G_MODULE_EXPORT void label_unlabel_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
96extern G_MODULE_EXPORT void select_unselect_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
97extern G_MODULE_EXPORT void edit_in_new_project (GSimpleAction * action, GVariant * parameter, gpointer data);
98extern G_MODULE_EXPORT void remove_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
99extern G_MODULE_EXPORT void copy_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
100#else
101extern void prep_all_coord_menus (glwin * view);
102extern G_MODULE_EXPORT void set_full_screen (GtkWidget * widg, gpointer data);
103extern G_MODULE_EXPORT void to_reset_view (GtkWidget * widg, gpointer data);
104extern G_MODULE_EXPORT void add_object (GtkWidget * widg, gpointer data);
105extern G_MODULE_EXPORT void label_unlabel_atoms (GtkWidget * widg, gpointer data);
106extern G_MODULE_EXPORT void select_unselect_atoms (GtkWidget * widg, gpointer data);
107extern G_MODULE_EXPORT void remove_the_atoms (GtkWidget * widg, gpointer data);
108extern G_MODULE_EXPORT void copy_the_atoms (GtkWidget * widg, gpointer data);
109extern G_MODULE_EXPORT void edit_in_new_project (GtkWidget * widg, gpointer data);
110#endif
111extern void save_rotation_quaternion (glwin * view);
112extern void rotate_x_y (glwin * view, double angle_x, double angle_y);
113extern void translate (project * this_proj, int status, int axis, vec3_t trans);
114extern int selected_aspec;
115extern int is_selected;
116extern int is_labelled;
117extern G_MODULE_EXPORT void on_create_new_project (GtkWidget * widg, gpointer data);
118extern gchar * action_atoms[3];
119extern int get_selection_type (glwin * view);
120extern GtkWidget * shortcuts_window (int sections, int group_by_section[sections], int groups, int shortcut_by_group[groups],
121 gchar * section_names[sections], gchar * group_names[groups], shortcuts shortcs[]);
122
124
125gchar * opengl_section_names[]={ "General", "Analysis mode", "Edition mode" };
126int opengl_group_by_section[] = { 5, 4, 3 };
127gchar * opengl_group_names[]={"Styles", "Measures", "Selection mode", "Window management", "Mouse mode",
128 "Camera rotation", "Camera motion", "Camera spin", "Model interaction",
129 "Coordinates rotation", "Coordinates translation", "Model interaction"};
130int opengl_shortcut_by_group[] = { 10, 1, 4, 6, 2, // Global
131 4, 6, 6, 3, // Analysis
132 4, 6, 6 }; // Edition
133
135//
136// Global
137//
138 { "Atom(s) color map", "change atom(s) color map", GDK_KEY_a, "a" },
139 { "Polyhedra color map", "change polyhedra color map", GDK_KEY_p, "p" },
140 { "Ball and stick", "change global style to ball and stick", GDK_KEY_b, "b" },
141 { "Cylinders", "change global style to cylinders", GDK_KEY_w, "w" },
142 { "Spheres", "change global style to spheres", GDK_KEY_s, "s" },
143 { "Covalent radius", "change global style to cylinders", GDK_KEY_o, "o" },
144 { "Ionic radius", "change global style to cylinders", GDK_KEY_i, "i" },
145 { "Van der Waals radius", "change global style to van der Waals radius", GDK_KEY_v, "v" },
146 { "In crystal radius", "change global style to in crystal radius", GDK_KEY_r, "r" },
147 { "Wireframe", "change global style to wireframe", GDK_KEY_w, "w" },
148//
149 { "All measures for the selection, pressed:\n\n"
150 "\t- 1st time: show inter-atomic distance(s)\n"
151 "\t- 2nd time: show inter-atomic angles\n"
152 "\t- 3rd time: hide measures", "Show measures", GDK_KEY_m, "m" },
153//
154 { "Atom", "atom selection mode", GDK_KEY_a, "<Shift>a" },
155 { "Coordination", "coordination sphere selection mode", GDK_KEY_c, "<Shift>c" },
156 { "Fragment", "fragment selection mode", GDK_KEY_f, "<Shift>f" },
157 { "Molecule", "molecule selection mode", GDK_KEY_m, "<Shift>m" },
158//
159 { "Environments", "Environments window", GDK_KEY_e, "<Ctrl>e" },
160 { "Measures", "Measures window", GDK_KEY_m, "<Ctrl>m" },
161 { "Recorder", "Recorder window", GDK_KEY_r, "<Ctrl>r" },
162 { "Create new project", "Create new project", GDK_KEY_n, "<Ctrl>n" },
163 { "Enter fullscreen", "Enter fullscreen", GDK_KEY_f, "<Ctrl>f" },
164 { "Exit fullscreen", "Exit fullscreen", GDK_KEY_Escape, "Escape" },
165//
166#ifdef OSX
167 { "Analysis mode", "Analysis mode", GDK_KEY_a, "<Meta>a" },
168 { "Edition mode", "Edition mode", GDK_KEY_e, "<Meta>e" },
169#else
170 { "Analysis mode", "Analysis mode", GDK_KEY_a, "<Alt>a" },
171 { "Edition mode", "Edition mode", GDK_KEY_e, "<Alt>e" },
172#endif
173//
174// Analysis
175//
176 { "Rotate right", "rotate right", GDK_KEY_Right, "Right" },
177 { "Rotate left", "rotate left", GDK_KEY_Left, "Left" },
178 { "Rotate up", "rotate up", GDK_KEY_Up, "Up" },
179 { "Rotate down", "rotate down", GDK_KEY_Down, "Down" },
180//
181 { "Move right", "move camera right", GDK_KEY_Right, "<Ctrl>Right" },
182 { "Move left", "move camera left", GDK_KEY_Left, "<Ctrl>Left" },
183 { "Move up", "move camera up", GDK_KEY_Up, "<Ctrl>Up" },
184 { "Move down", "move camera down", GDK_KEY_Down, "<Ctrl>Down" },
185 { "Zoom in", "zoom camera in", GDK_KEY_Down, "<Shift>Up" },
186 { "Zoom out", "zoom camera out", GDK_KEY_Down, "<Shift>Down" },
187//
188 { "Spin right", "rotate right", GDK_KEY_Right, "<Ctrl><Shift>Right" },
189 { "Spin left", "rotate left", GDK_KEY_Left, "<Ctrl><Shift>Left" },
190 { "Spin up", "rotate up", GDK_KEY_Up, "<Ctrl><Shift>Up" },
191 { "Spin down", "rotate down", GDK_KEY_Down, "<Ctrl><Shift>Down" },
192 { "Pause / restart", "pause / restart spinning", GDK_KEY_space, "space" },
193 { "Stop", "stop spinning", GDK_KEY_s, "<Ctrl>s" },
194//
195 { "Label / unlabel all atom(s)", "Label / unlabel all atom(s)", GDK_KEY_l, "<Ctrl>l" },
196 { "Select / unselect all atom(s)", "Select / unselect all atom(s)", GDK_KEY_a, "<Ctrl>a" },
197 { "Copy selection", "Copy selection", GDK_KEY_c, "<Ctrl>c" },
198//
199// Edition
200//
201 { "Rotate right", "rotate right", GDK_KEY_Right, "Right" },
202 { "Rotate left", "rotate left", GDK_KEY_Left, "Left" },
203 { "Rotate up", "rotate up", GDK_KEY_Up, "Up" },
204 { "Rotate down", "rotate down", GDK_KEY_Down, "Down" },
205//
206 { "Translate right", "move camera right", GDK_KEY_Right, "<Ctrl>Right" },
207 { "Translate left", "move camera left", GDK_KEY_Left, "<Ctrl>Left" },
208 { "Translate up", "move camera up", GDK_KEY_Up, "<Ctrl>Up" },
209 { "Translate down", "move camera down", GDK_KEY_Down, "<Ctrl>Down" },
210 { "Zoom in", "zoom camera in", GDK_KEY_Up, "<Shift>Up" },
211 { "Zoom out", "zoom camera out", GDK_KEY_Down, "<Shift>Down" },
212//
213 { "Label / unlabel all atom(s)", "Label / unlabel all atom(s)", GDK_KEY_l, "<Ctrl>l" },
214 { "Select / unselect all atom(s)", "Select / unselect all atom(s)", GDK_KEY_a, "<Ctrl>a" },
215 { "Copy all selection", "Copy selection", GDK_KEY_c, "<Ctrl>c" },
216 { "Cut selection", "Cut selection", GDK_KEY_x, "<Ctrl>x" },
217 { "Paste selection", "Paste selection", GDK_KEY_v, "<Ctrl>v" },
218 { "Delete selection", "Delete selection", GDK_KEY_Delete, "Delete" }
219};
220
221#ifdef GTK3
230GtkWidget * prep_rings_menu (glwin * view, int id)
231{
232 if (id == 0)
233 {
234 return menu_rings (view, 0);
235 }
236 else
237 {
238 return menupoly (view, 0, 2, NULL);
239 }
240}
241
249GtkWidget * coord_menu (glwin * view)
250{
251 int i, j, k;
252 GtkWidget * widg;
253 for (j=4; j<10; j++)
254 {
255 if (j<9)
256 {
257 if (view -> ogl_poly[0][j] != NULL)
258 {
259 for (k=0; k<get_project_by_id(view -> proj) -> coord -> totcoord[j]; k++)
260 {
261 if (view -> ogl_poly[0][j][k] != NULL)
262 {
263 if (GTK_IS_WIDGET(view -> ogl_poly[0][j][k]))
264 {
265 widg = gtk_widget_get_parent (view -> ogl_poly[0][j][k]);
266 if (GTK_IS_WIDGET(widg))
267 {
268 g_object_ref (view -> ogl_poly[0][j][k]);
269 gtk_container_remove (GTK_CONTAINER(widg), view -> ogl_poly[0][j][k]);
270 }
271 }
272 }
273 }
274 }
275 }
276 if (view -> ogl_geom[0][j] != NULL)
277 {
278 for (k=0; k<get_project_by_id(view -> proj) -> coord -> totcoord[j]; k++)
279 {
280 if (view -> ogl_geom[0][j][k] != NULL)
281 {
282 if (GTK_IS_WIDGET(view -> ogl_geom[0][j][k]))
283 {
284 widg = gtk_widget_get_parent (view -> ogl_geom[0][j][k]);
285 if (GTK_IS_WIDGET(widg))
286 {
287 g_object_ref (view -> ogl_geom[0][j][k]);
288 gtk_container_remove (GTK_CONTAINER(widg), view -> ogl_geom[0][j][k]);
289 }
290 }
291 }
292 }
293 }
294 }
295 if (view -> ogl_chains[0]) view -> ogl_chains[0] = destroy_this_widget (view -> ogl_chains[0]);
296 for (i=0; i<2; i++)
297 {
298 for (j=2; j<4; j++)
299 {
300 detach_frag_mol_menu (view, i, j);
301 }
302 }
303 for (i=1; i<OGL_COORDS; i++)
304 {
305 view -> ogl_coord[i] = destroy_this_widget (view -> ogl_coord[i]);
306 }
307 for (i=0; i<2; i++)
308 {
309 view -> ogl_rings[i*6] = menu_item_new_with_submenu ("Ring(s)", view -> rings, prep_rings_menu (view, i*6));
310 }
311 view -> ogl_chains[0] = menu_item_new_with_submenu ("Chain(s)", view -> chains, add_menu_coord (view, 0, 9));
312 view -> ogl_coord[1] = menu_coord (view, 0);
313 view -> ogl_coord[2] = menu_item_new_with_submenu ("Polyhedra", TRUE, menu_poly (view, 0));
314 view -> ogl_coord[3] = menu_item_new_with_submenu ("Fragment(s)", get_project_by_id(view -> proj) -> coord -> totcoord[2], add_menu_coord (view, 0, 2));
315 view -> ogl_coord[4] = menu_item_new_with_submenu ("Molecule(s)", get_project_by_id(view -> proj) -> coord -> totcoord[3], add_menu_coord (view, 0, 3));
316 GtkWidget * menu = gtk_menu_new ();
317 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[1]);
318 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[2]);
319 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_rings[0]);
320 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_chains[0]);
321 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[3]);
322 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[4]);
323 gtk3_menu_item (menu, "Advanced", IMG_NONE, NULL, G_CALLBACK(coord_properties), (gpointer)& view -> colorp[30][0], TRUE, GDK_KEY_e, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
324 // add_advanced_item (menu, G_CALLBACK(coord_properties), (gpointer)& view -> colorp[30][0], TRUE, GDK_KEY_e, GDK_CONTROL_MASK);
325 return menu;
326}
327#endif
328
337void update_all_menus (glwin * view, int nats)
338{
339#ifdef GTK3
340 int i, j, k, l;
341 i = view -> anim -> last -> img -> style;
342 j = (nats <= 1000) ? BALL_AND_STICK : DEFAULT_STYLE;
343 if (i != j)
344 {
345 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[j], FALSE);
346 if (i != SPACEFILL)
347 {
348 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[i], TRUE);
349 set_style (view -> ogl_styles[i], & view -> colorp[i][0]);
350 }
351 else
352 {
353 i = view -> anim -> last -> img -> filled_type;
354 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> filled_styles[i], TRUE);
355 set_style (view -> filled_styles[i], & view -> colorp[OGL_STYLES+i][0]);
356 }
357 }
358 i = view -> anim -> last -> img -> render;
359 j = FILL;
360 if (i != j)
361 {
362 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_render[j], FALSE);
363 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_render[i], TRUE);
364 set_render (view -> ogl_render[i], & view -> colorp[i][0]);
365 }
366
367 update_menus (view);
368 widget_set_sensitive (view -> ogl_box[0], active_cell -> ltype);
369 if (view -> anim -> last -> img -> abc -> box == NONE)
370 {
371 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[0][0], FALSE);
372 set_box_axis_style (view -> ogl_box_axis[0][0], & view -> colorp[0][0]);
373 }
374 else
375 {
376 j = (view -> anim -> last -> img -> abc -> box == WIREFRAME) ? 1 : 2;
377 k = j*j;
378 l = (view -> anim -> last -> img -> abc -> box == WIREFRAME) ? CYLINDERS : WIREFRAME;
379 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[0][0], TRUE);
380 set_box_axis_style (view -> ogl_box_axis[0][0], & view -> colorp[0][0]);
381 view -> anim -> last -> img -> abc -> box = l;
382 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[i][j], TRUE);
383 set_box_axis_style (view -> ogl_box_axis[0][j], & view -> colorp[k][0]);
384 }
385
386 if (view -> anim -> last -> img -> xyz -> axis == NONE)
387 {
388 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], FALSE);
389 set_box_axis_style (view -> ogl_box_axis[i][0], & view -> colorp[0][1]);
390 }
391 else
392 {
393 j = (view -> anim -> last -> img -> xyz -> axis == WIREFRAME) ? 1 : 2;
394 k = j*j;
395 l = (view -> anim -> last -> img -> xyz -> axis == WIREFRAME) ? CYLINDERS : WIREFRAME;
396 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], TRUE);
397 set_box_axis_style (view -> ogl_box_axis[i][0], & view -> colorp[0][1]);
398 view -> anim -> last -> img -> xyz -> axis = l;
399 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][j], TRUE);
400 set_box_axis_style (view -> ogl_box_axis[1][j], & view -> colorp[k][1]);
401 }
402
403 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_rep[view -> anim -> last -> img -> rep], TRUE);
404 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_rep[! view -> anim -> last -> img -> rep], FALSE);
405 for (i=0; i<5; i++) gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][8+i], FALSE);
406 if (view -> anim -> last -> img -> xyz -> t_pos != CUSTOM)
407 {
408 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][8+view -> anim -> last -> img -> xyz -> t_pos], TRUE);
409 }
411 widget_set_sensitive (view -> ogl_clones[0], view -> allbonds[1]);
412 update_rings_menus (view);
413 update_chains_menus (view);
414 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_clones[0], view -> anim -> last -> img -> draw_clones);
415 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_clones[5], view -> anim -> last -> img -> cloned_poly);
416 int * cmap = save_color_map (view);
418 if (view -> color_styles[0])
419 {
420 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> color_styles[0], TRUE);
421 set_color_map (view -> color_styles[0], & view -> colorp[0][0]);
422 }
423 if (view -> color_styles[ATOM_MAPS])
424 {
425 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> color_styles[ATOM_MAPS], TRUE);
426 set_color_map (view -> color_styles[ATOM_MAPS], & view -> colorp[ATOM_MAPS][0]);
427 }
428 restore_color_map (view, cmap);
429 g_free (cmap);
430 gtk_range_set_value (GTK_RANGE(view -> ogl_quality), view -> anim -> last -> img -> quality);
431#else
432 update_menu_bar (view);
433#endif
434}
435
444G_MODULE_EXPORT void render_gl_image (GtkWidget * widg, gpointer data)
445{
446 glwin * view = (glwin *) data;
447 window_encode (view, FALSE);
448}
449
450#ifdef GTK4
460G_MODULE_EXPORT void view_shortcuts (GSimpleAction * action, GVariant * parameter, gpointer data)
461#else
470G_MODULE_EXPORT void view_shortcuts (GtkWidget * widg, gpointer data)
471#endif
472{
473 glwin * view = (glwin *)data;
474 view -> shortcuts = destroy_this_widget (view -> shortcuts);
477}
478
479#ifdef GTK3
480
490void menu_items_opengl (GtkWidget * menu, glwin * view, int pop)
491{
492 GtkWidget * style = gtk3_menu_item (menu, "Style", IMG_FILE, (gpointer)PACKAGE_MOL, NULL, NULL, FALSE, 0, 0, FALSE, FALSE, get_project_by_id(view -> proj) -> nspec);
493 gtk_menu_item_set_submenu ((GtkMenuItem *)style, menu_style(view, pop));
494 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Color Scheme(s)", get_project_by_id(view -> proj) -> nspec, menu_map(view, pop)));
495 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Render", get_project_by_id(view -> proj) -> nspec, menu_render(view, pop)));
496 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Quality", get_project_by_id(view -> proj) -> nspec, menu_quality(view, pop)));
497 gtk3_menu_item (menu, "Material And Light(s)", IMG_NONE, NULL, G_CALLBACK(opengl_advanced), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
498 gtk3_menu_item (menu, "Render Image", IMG_FILE, (gpointer)PACKAGE_IMG, G_CALLBACK(render_gl_image), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
499}
500
509GtkWidget * menu_opengl (glwin * view, int pop)
510{
511 GtkWidget * menu = gtk_menu_new ();
512 menu_items_opengl (menu, view, pop);
513 return menu;
514}
515
525void menu_items_model (GtkWidget * menu, glwin * view, int pop)
526{
527 if (get_project_by_id(view -> proj) -> nspec)
528 {
529 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Atom(s)", TRUE, menu_atoms (view, pop, 0)));
530 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Bond(s)", TRUE, menu_bonds (view, pop, 0)));
531 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Clone(s)", TRUE, menu_clones (view, pop)));
532 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_box_axis (view, 0, 0));
533 }
534}
535
544GtkWidget * menu_model (glwin * view, int pop)
545{
546 GtkWidget * menu = gtk_menu_new ();
547 menu_items_model (menu, view, pop);
548 return menu;
549}
550
560void menu_items_view (GtkWidget * menu, glwin * view, int popm)
561{
562 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Representation", TRUE, menu_rep (view, popm)));
563 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Projection", TRUE, menu_proj (view)));
564 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Background", TRUE, menu_back (view)));
565 if (get_project_by_id(view -> proj) -> nspec) gtk_menu_shell_append ((GtkMenuShell *)menu, menu_box_axis (view, popm, 1));
566 if (! popm)
567 {
568 add_menu_separator (menu);
569 gtk3_menu_item (menu, "Reset view", IMG_STOCK, (gpointer)FITBEST, G_CALLBACK(to_reset_view), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
570 gtk3_menu_item (menu, "Center molecule", IMG_STOCK, (gpointer)FITBEST, G_CALLBACK(to_center_this_molecule), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
571 add_menu_separator (menu);
572 gtk3_menu_item (menu, "Fullscreen", IMG_STOCK, (gpointer)FULLSCREEN, G_CALLBACK(set_full_screen), (gpointer)view, TRUE, GDK_KEY_f, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
573 }
574}
575
584GtkWidget * menu_view (glwin * view, int popm)
585{
586 GtkWidget * menu = gtk_menu_new ();
587 menu_items_view (menu, view, popm);
588 return menu;
589}
590
599GtkWidget * menu_help (glwin * view, int popm)
600{
601 GtkWidget * menu;
602 menu = gtk_menu_new ();
603 gtk3_menu_item (menu, "Shortcuts", IMG_NONE, NULL, G_CALLBACK(view_shortcuts), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
604 return menu;
605}
606#endif
607
616{
617#ifdef GTK3
618 view -> ogl_coord[0] = destroy_this_widget (view -> ogl_coord[0]);
619#endif
620 view -> menu_bar = destroy_this_widget (view -> menu_bar);
621#ifdef GTK3
622 view -> menu_bar = gtk_menu_bar_new ();
623 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu ("OpenGL", TRUE, menu_opengl(view, 0)));
624 project * this_proj = get_project_by_id (view -> proj);
625 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu ("Model", this_proj -> nspec, menu_model(view, 0)));
626 view -> ogl_coord[0] = create_menu_item (FALSE, "Chemistry");
627 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, view -> ogl_coord[0]);
628 widget_set_sensitive (view -> ogl_coord[0], this_proj -> nspec);
629 if (this_proj -> nspec)
630 {
631 gtk_menu_item_set_submenu ((GtkMenuItem *)view -> ogl_coord[0], coord_menu (view));
632 }
633 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu ("Tools", TRUE, menu_tools(view, 0)));
634 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu ("View", TRUE, menu_view(view, 0)));
635 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_anim (view, 0));
636
637 show_the_widgets (view -> menu_bar);
638
639 if (this_proj -> nspec) update_all_menus (view, this_proj -> natomes);
640 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, view -> menu_box, view -> menu_bar, TRUE, TRUE, 0);
641 /* GtkWidget * menu = gtk_menu_bar_new ();
642 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Help", TRUE, menu_help(view, 0)));
643 add_box_child_end (view -> menu_box, menu, FALSE, FALSE, 0);
644 show_the_widgets (menu);*/
645 show_the_widgets (view -> menu_bar);
646#else
647 update_menu_bar (view);
648#endif
649}
650
659void change_color_map (glwin * view, int col)
660{
661 int i, j;
662 i = ATOM_MAPS-1;
663 if (view -> custom_map) i++;
664 if (view -> anim -> last -> img -> color_map[col] < i-1)
665 {
666 if (view -> anim -> last -> img -> color_map[col] < 2)
667 {
668 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
669 }
670 else if (view -> anim -> last -> img -> color_map[col] == 2 && view -> adv_bonding[0])
671 {
672 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
673 }
674 else if (view -> anim -> last -> img -> color_map[col] == 3 && view -> adv_bonding[1])
675 {
676 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
677 }
678 else if (view -> anim -> last -> img -> color_map[col] == 4 && get_project_by_id(view -> proj) -> force_field[0])
679 {
680 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
681 }
682 else
683 {
684 j = col*ATOM_MAPS + ((view -> custom_map) ? 6 : 0);
685 }
686 }
687 else
688 {
689 j = col*ATOM_MAPS;
690 }
691 gboolean was_input = reading_input;
692 reading_input = TRUE;
693#ifdef GTK3
694 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> color_styles[j], TRUE);
695 set_color_map (view -> color_styles[j], & view -> colorp[j][0]);
696#else
697 gchar * variant = g_strdup_printf ("set-%s.%d.0", (col) ? "pmap" : "amap", j);
698 g_action_group_activate_action ((GActionGroup *)view -> action_group, (col) ? "set-pmap" : "set-amap", g_variant_new_string((const gchar *)variant));
699 g_free (variant);
700#endif
701 reading_input = was_input;
702}
703
716void set_motion (glwin * view, int axis, int da, int db, gboolean UpDown, GdkModifierType state)
717{
718 if (state & GDK_CONTROL_MASK)
719 {
720 if (view -> mode == EDITION)
721 {
722 vec3_t trans;
723 if (axis)
724 {
725 trans = vec3(view -> anim -> last -> img -> p_depth*(double) da / view -> pixels[axis], 0.0, 0.0);
726 }
727 else
728 {
729 trans = vec3(0.0, view -> anim -> last -> img -> p_depth*(double) da / view -> pixels[axis], 0.0);
730 }
731 translate (get_project_by_id(view -> proj), 1, 1, trans);
733 update (view);
734 }
735 else if (state & GDK_SHIFT_MASK)
736 {
737 spin_go (NULL, & view -> colorp[db][axis]);
738 }
739 else
740 {
741 view -> anim -> last -> img -> c_shift[! axis] += (double) da / view -> pixels[axis];
742 if (view -> rep_win)
743 {
744 if (view -> rep_win -> camera_widg[! axis + 5] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[! axis + 5]))
745 {
746 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[! axis + 5], - view -> anim -> last -> img -> c_shift[! axis]);
747 }
748 }
749 update (view);
750 }
751 }
752 else if ((state & GDK_SHIFT_MASK) && UpDown)
753 {
754 if (db == 1 && view -> anim -> last -> img -> zoom > ZOOM_MAX) zoom (view, -1);
755 if (db == 3) zoom (view, 1);
756 update (view);
757 }
758 else if (state != GDK_SHIFT_MASK)
759 {
761 double cameraAngle[2] = {0.0, 0.0};
762 cameraAngle[axis] = 0.5*da;
763 rotate_x_y (view, cameraAngle[0], cameraAngle[1]);
764 update (view);
765 }
766}
767
776{
777 GLdouble w, h;
778 GLdouble dw, dh;
779 double gleft, gright, gbottom, gtop;
780 double zoom = view -> anim -> last -> img -> zoom;
781 zoom *= (view -> anim -> last -> img -> p_depth / view -> anim -> last -> img -> gnear);
782 dw = view -> anim -> last -> img -> c_shift[0]*2.0*zoom;
783 dh = view -> anim -> last -> img -> c_shift[1]*2.0*zoom;
784 double aspect = (double)view -> pixels[0] / (double)view -> pixels[1];
785 if (aspect > 1.0)
786 {
787 w = zoom * aspect;
788 h = zoom;
789 }
790 else
791 {
792 w = zoom;
793 h = zoom / aspect;
794 }
795 gleft = -w + dw;
796 gright = w + dw;
797 gbottom = -h + dh;
798 gtop = h + dh;
799 return m4_ortho (gleft, gright, gbottom, gtop, -view -> anim -> last -> img -> gfar, view -> anim -> last -> img -> gfar);
800}
801
810{
811 vec3_t pos;
812 mat4_t insert_pmv_matrix;
813 insert_pmv_matrix = m4_mul (insert_projection (view), view -> model_view_matrix);
814 pos = vec3 (view -> mouseX, view -> mouseY, 0.75);
815 return v3_un_project (pos, view -> view_port, insert_pmv_matrix);
816}
817
827void activate_glwin_action (gchar * action_string, gchar * action_name, glwin * view)
828{
829 GVariant * action_state = g_variant_new_string (action_string);
830 g_action_group_activate_action ((GActionGroup *)view -> action_group, action_name, action_state);
831 // g_variant_unref (action_state);
832}
833
843void glwin_key_pressed (guint keyval, GdkModifierType state, gpointer data)
844{
845 glwin * view = (glwin *)data;
846 int i;
847 switch (keyval)
848 {
849 case GDK_KEY_Escape:
850 if (view -> fullscreen)
851 {
852#ifdef GTK4
853 set_full_screen (NULL, NULL, view);
854#else
855 set_full_screen (NULL, view);
856#endif
857 }
858 break;
859 case GDK_KEY_Delete:
860 if (get_project_by_id(view -> proj) -> natomes && ! is_atom_win_active(view) && get_project_by_id(view -> proj) -> steps == 1 && view -> mode == EDITION)
861 {
863 is_selected = 1;
864 selected_aspec = -1;
865#ifdef GTK4
866 remove_the_atoms (NULL, NULL, & cut_sel);
867#else
868 remove_the_atoms (NULL, & cut_sel);
869#endif
870 }
871 break;
872 case GDK_KEY_space:
873 if (get_project_by_id(view -> proj) -> natomes)
874 {
875 if (view -> spin[0] || view -> spin[1])
876 {
877 for (i=0; i<2; i++)
878 {
879 view -> spin[i+2] = view -> spin[i];
880 view -> spin_speed[i+2] = view -> spin_speed[i];
881 view -> spin[i] = FALSE;
882 }
883 }
884 else if (view -> spin[2] || view -> spin[3])
885 {
886 for (i=0; i<2; i++)
887 {
888 view -> spin[i] = view -> spin[i+2];
889 view -> spin_speed[i] = view -> spin_speed[i+2];
890 g_timeout_add (REFRESH, (GSourceFunc) spin, & view -> colorp[0][i]);
891 view -> spin[i+2] = FALSE;
892 view -> spin_speed[i+2] = 0;
893 }
894 }
895 }
896 break;
897 case GDK_KEY_a:
898 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes)
899 {
901 selected_aspec = -1;
902 i = get_selection_type (view);
903 if (view -> anim -> last -> img -> selected[i] -> selected == opengl_project -> natomes)
904 {
905#ifdef GTK4
906 select_unselect_atoms (NULL, NULL, & view -> colorp[0][0]);
907#else
908 select_unselect_atoms (NULL, & view -> colorp[0][0]);
909#endif
910 }
911 else
912 {
913#ifdef GTK4
914 select_unselect_atoms (NULL, NULL, & view -> colorp[0][1]);
915#else
916 select_unselect_atoms (NULL, & view -> colorp[0][1]);
917#endif
918 }
919 }
920#ifdef GTK4
921#ifdef OSX
922 else if (state & GDK_META_MASK)
923#else
924 else if (state & GDK_ALT_MASK)
925#endif
926#else
927 else if (state & GDK_MOD1_MASK)
928#endif
929 {
930 if (view -> mode == EDITION)
931 {
932#ifdef GTK4
933 activate_glwin_action ("set-mouse-mode.0.0", "set-mouse-mode", view);
934#else
935 // GTK3 Menu Action To Check
936 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_mode[0], TRUE);
937 set_mode (view -> ogl_mode[0], & view -> colorp[0][0]);
938#endif
939 }
940 }
941 else if (get_project_by_id(view -> proj) -> natomes)
942 {
943 change_color_map (view, 0);
944 update (view);
945 }
946 break;
947 case GDK_KEY_A:
948 if (get_project_by_id(view -> proj) -> natomes)
949 {
950 // selection mode to coordination sphere
951#ifdef GTK4
952 activate_glwin_action ("set-sel-mode.0.0", "set-sel-mode", view);
953#else
954 // GTK3 Menu Action To Check
955 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[0], TRUE);
956 set_selection_mode (view -> ogl_smode[0], & view -> colorp[0][0]);
957#endif
958 }
959 break;
960 case GDK_KEY_b:
961 if (get_project_by_id(view -> proj) -> natomes)
962 {
963#ifdef GTK4
964 activate_glwin_action ("set-style.0.0", "set-style", view);
965#else
966 // GTK3 Menu Action To Check
967 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[BALL_AND_STICK], TRUE);
968 set_style (view -> ogl_styles[BALL_AND_STICK], & view -> colorp[BALL_AND_STICK][0]);
969#endif
970
971 }
972 break;
973 case GDK_KEY_c:
974 if (get_project_by_id(view -> proj) -> natomes)
975 {
976 if (state & GDK_CONTROL_MASK)
977 {
978 if (view -> anim -> last -> img -> selected[0] -> selected)
979 {
981 selected_aspec = -1;
982 is_selected = 1;
983 view -> nth_copy = 1;
984 view -> insert_coords = get_insertion_coordinates (view);
985#ifdef GTK4
986 copy_the_atoms (NULL, NULL, & cut_sel);
987#else
988 copy_the_atoms (NULL, & cut_sel);
989#endif
991 }
992 else
993 {
994 if (copied_object)
995 {
996 g_free (copied_object);
997 copied_object = NULL;
998 }
999 }
1000 }
1001 else
1002 {
1003#ifdef GTK4
1004 activate_glwin_action ("set-style.8.0", "set-style", view);
1005#else
1006 // GTK3 Menu Action To Check
1007 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[CYLINDERS], TRUE);
1008 set_style (view -> ogl_styles[CYLINDERS], & view -> colorp[CYLINDERS][0]);
1009#endif
1010 }
1011 }
1012 break;
1013 case GDK_KEY_C:
1014 if (get_project_by_id(view -> proj) -> natomes)
1015 {
1016 // selection mode to coordination sphere
1017#ifdef GTK4
1018 activate_glwin_action ("set-sel-mode.1.0", "set-sel-mode", view);
1019#else
1020 // GTK3 Menu Action To Check
1021 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[1], TRUE);
1022 set_selection_mode (view -> ogl_smode[1], & view -> colorp[1][0]);
1023#endif
1024 }
1025 break;
1026 case GDK_KEY_d:
1027 if (get_project_by_id(view -> proj) -> natomes)
1028 {
1029#ifdef GTK4
1030 activate_glwin_action ("set-style.9.0", "set-style", view);
1031#else
1032 // GTK3 Menu Action To Check
1033 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[PUNT], TRUE);
1034 set_style (view -> ogl_styles[PUNT], & view -> colorp[PUNT][0]);
1035#endif
1036 }
1037 break;
1038 case GDK_KEY_e:
1039 if (get_project_by_id(view -> proj) -> natomes)
1040 {
1041 if (state & GDK_CONTROL_MASK)
1042 {
1043 coord_properties (NULL, & view -> colorp[30][0]);
1044 }
1045#ifdef GTK4
1046#ifdef OSX
1047 else if (state & GDK_META_MASK)
1048#else
1049 else if (state & GDK_ALT_MASK)
1050#endif
1051#else
1052 else if (state & GDK_MOD1_MASK)
1053#endif
1054 {
1055 if (view -> mode == ANALYZE && get_project_by_id(view -> proj) -> steps == 1)
1056 {
1057#ifdef GTK4
1058 activate_glwin_action ("set-mouse-mode.1.0", "set-mouse-mode", view);
1059#else
1060 // GTK3 Menu Action To Check
1061 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_mode[1], TRUE);
1062 set_mode (view -> ogl_mode[1], & view -> colorp[1][0]);
1063#endif
1064 }
1065 }
1066 }
1067 break;
1068 case GDK_KEY_f:
1069#ifdef GTK4
1070 if (state & GDK_CONTROL_MASK) set_full_screen (NULL, NULL, view);
1071#else
1072 if (state & GDK_CONTROL_MASK) set_full_screen (NULL, view);
1073#endif
1074 break;
1075 case GDK_KEY_F:
1076 if (get_project_by_id(view -> proj) -> natomes)
1077 {
1078 // selection mode to coordination sphere
1079#ifdef GTK4
1080 activate_glwin_action ("set-sel-mode.2.0", "set-sel-mode", view);
1081#else
1082 // GTK3 Menu Action To Check
1083 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[2], TRUE);
1084 set_selection_mode (view -> ogl_smode[2], & view -> colorp[2][0]);
1085#endif
1086 }
1087 break;
1088 case GDK_KEY_i:
1089 if (get_project_by_id(view -> proj) -> natomes)
1090 {
1091#ifdef GTK4
1092 activate_glwin_action ("set-style.3.0", "set-style", view);
1093#else
1094 // GTK3 Menu Action To Check
1095 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> filled_styles[1], TRUE);
1096 set_style (view -> filled_styles[1], & view -> colorp[OGL_STYLES+1][0]);
1097#endif
1098 }
1099 break;
1100 case GDK_KEY_l:
1101 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes)
1102 {
1103 opengl_project_changed (view -> proj);
1105 if (view -> labelled == opengl_project -> natomes*opengl_project -> steps)
1106 {
1107#ifdef GTK4
1108 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][0]);
1109#else
1110 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][0]);
1111#endif
1112 }
1113 else
1114 {
1115#ifdef GTK4
1116 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][1]);
1117#else
1118 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][1]);
1119#endif
1120 }
1121 }
1122 break;
1123 case GDK_KEY_m:
1124 if (get_project_by_id(view -> proj) -> natomes)
1125 {
1126 if (state & GDK_CONTROL_MASK)
1127 {
1128 view -> anim -> last -> img -> m_is_pressed = 0;
1129 window_measures (NULL, view);
1130 }
1131 else if (view -> anim -> last -> img -> m_is_pressed < 2)
1132 {
1133 view -> anim -> last -> img -> m_is_pressed ++;
1134 }
1135 else
1136 {
1137 view -> anim -> last -> img -> m_is_pressed = 0;
1138 }
1139 view -> create_shaders[MEASU] = TRUE;
1140 update (view);
1141 }
1142 break;
1143 case GDK_KEY_M:
1144 if (get_project_by_id(view -> proj) -> natomes)
1145 {
1146 // selection mode to coordination sphere
1147#ifdef GTK4
1148 activate_glwin_action ("set-sel-mode.3.0", "set-sel-mode", view);
1149#else
1150 // GTK3 Menu Action To Check
1151 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[3], TRUE);
1152 set_selection_mode (view -> ogl_smode[3], & view -> colorp[3][0]);
1153#endif
1154 }
1155 break;
1156 case GDK_KEY_n:
1157 if (state & GDK_CONTROL_MASK) on_create_new_project (NULL, NULL);
1158 break;
1159 case GDK_KEY_o:
1160 if (get_project_by_id(view -> proj) -> natomes)
1161 {
1162#ifdef GTK4
1163 activate_glwin_action ("set-style.2.0", "set-style", view);
1164#else
1165 // GTK3 Menu Action To Check
1166 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> filled_styles[0], TRUE);
1167 set_style (view -> filled_styles[0], & view -> colorp[OGL_STYLES][0]);
1168#endif
1169 }
1170 break;
1171 case GDK_KEY_p:
1172 if (get_project_by_id(view -> proj) -> natomes) change_color_map (view, 1);
1173 break;
1174 case GDK_KEY_r:
1175 if (get_project_by_id(view -> proj) -> natomes)
1176 {
1177 if (state & GDK_CONTROL_MASK)
1178 {
1179 window_recorder (NULL, (gpointer)view);
1180 }
1181 else
1182 {
1183#ifdef GTK4
1184 activate_glwin_action ("set-style.5.0", "set-style", view);
1185#else
1186 // GTK3 Menu Action To Check
1187 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> filled_styles[3], TRUE);
1188 set_style (view -> filled_styles[3], & view -> colorp[OGL_STYLES+3][0]);
1189#endif
1190 }
1191 }
1192 break;
1193 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes) window_recorder (NULL, (gpointer)view);
1194 break;
1195 case GDK_KEY_s:
1196 if (get_project_by_id(view -> proj) -> natomes)
1197 {
1198 if (state & GDK_CONTROL_MASK)
1199 {
1200 spin_stop (NULL, data);
1201 }
1202 else
1203 {
1204#ifdef GTK4
1205 activate_glwin_action ("set-style.7.0", "set-style", view);
1206#else
1207 // GTK3 Menu Action To Check
1208 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[SPHERES], TRUE);
1209 set_style (view -> ogl_styles[SPHERES], & view -> colorp[SPHERES][0]);
1210#endif
1211 }
1212 }
1213 break;
1214 case GDK_KEY_v:
1215 if (state & GDK_CONTROL_MASK)
1216 {
1217 if (copied_object && ! is_atom_win_active(view) && get_project_by_id(view -> proj) -> steps == 1 && view -> mode == EDITION)
1218 {
1219 //i = (! get_project_by_id(view -> proj) -> natomes) ? 1 : 0;
1220 opengl_project_changed (view -> proj);
1221#ifdef GTK4
1222 add_object (NULL, NULL, & view -> colorp[0][0]);
1223#else
1224 add_object (NULL, & view -> colorp[0][0]);
1225#endif
1226 view -> nth_copy ++;
1227 /*if (i)
1228 {
1229 i = activep;
1230 active_project_changed (view -> proj);
1231 frag_update = (active_project -> natomes > ATOM_LIMIT) ? 0 : 1;
1232 mol_update = (frag_update) ? ((active_project -> steps > STEP_LIMIT) ? 0 : 1) : 0;
1233 bonds_update = 1;
1234 on_calc_bonds_released (NULL, NULL);
1235 active_project_changed (i);
1236 }*/
1237 }
1238 }
1239 else if (get_project_by_id(view -> proj) -> natomes)
1240 {
1241#ifdef GTK4
1242 activate_glwin_action ("set-style.4.0", "set-style", view);
1243#else
1244 // GTK3 Menu Action To Check
1245 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> filled_styles[2], TRUE);
1246 set_style (view -> filled_styles[2], & view -> colorp[OGL_STYLES+2][0]);
1247#endif
1248 }
1249 break;
1250 case GDK_KEY_w:
1251 if (get_project_by_id(view -> proj) -> natomes)
1252 {
1253#ifdef GTK4
1254 activate_glwin_action ("set-style.1.0", "set-style", view);
1255#else
1256 // GTK3 Menu Action To Check
1257 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[WIREFRAME], TRUE);
1258 set_style (view -> ogl_styles[WIREFRAME], & view -> colorp[WIREFRAME][0]);
1259#endif
1260 }
1261 break;
1262 case GDK_KEY_x:
1263 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes)
1264 {
1265 if (! is_atom_win_active(view) && get_project_by_id(view -> proj) -> steps == 1 && view -> mode == EDITION)
1266 {
1267 if (view -> anim -> last -> img -> selected[0] -> selected)
1268 {
1269 opengl_project_changed (view -> proj);
1270 selected_aspec = -1;
1271 is_selected = 1;
1272#ifdef GTK4
1273 copy_the_atoms (NULL, NULL, & cut_sel);
1274 remove_the_atoms (NULL, NULL, & cut_sel);
1275#else
1276 copy_the_atoms (NULL, & cut_sel);
1277 remove_the_atoms (NULL, & cut_sel);
1278#endif
1279 }
1280 }
1281 }
1282 break;
1283 case GDK_KEY_Right:
1284 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 1, 1, 1, FALSE, state);
1285 break;
1286 case GDK_KEY_Left:
1287 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 1, -1, 3, FALSE, state);
1288 break;
1289 case GDK_KEY_Up:
1290 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 0, 1, 3, TRUE, state);
1291 break;
1292 case GDK_KEY_Down:
1293 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 0, -1, 1, TRUE, state);
1294 break;
1295 }
1296}
1297
1298#ifdef GTK3
1308G_MODULE_EXPORT gboolean on_key_pressed (GtkWidget * widg, GdkEventKey * event, gpointer data)
1309{
1310 if (event -> type == GDK_KEY_PRESS)
1311 {
1312 glwin_key_pressed (event -> keyval, event -> state, data);
1313 }
1314 return FALSE;
1315}
1316#else
1328G_MODULE_EXPORT gboolean on_glwin_key_pressed (GtkEventControllerKey * self, guint keyval, guint keycode, GdkModifierType state, gpointer data)
1329{
1330 glwin_key_pressed (keyval, state, data);
1331 return TRUE;
1332}
1333#endif
1334
1343G_MODULE_EXPORT void on_win_realize (GtkWidget * widg, gpointer data)
1344{
1345 glwin * view = (glwin *)data;
1346 int * pix = get_project_by_id(view -> proj) -> tmp_pixels;
1347 int shift = 0;
1348 if (GTK_IS_WIDGET(view -> menu_bar)) shift = get_widget_height (view -> menu_bar);
1349 if (pix[0] > 0 && pix[1] > 0)
1350 {
1351 resize_this_window (view -> win, pix[0], pix[1]+shift);
1352 pix[0] = pix[1] = -1;
1353 }
1354 else
1355 {
1356 resize_this_window (view -> win, 500, 500);
1357 }
1358}
1359
1360#ifdef GTK3
1361#ifdef LINUX
1369void gtk_window_change_gdk_visual (GtkWidget * win)
1370{
1371 // GTK+ > 3.15.1 uses an X11 visual optimized for GTK+'s OpenGL stuff
1372 // since revid dae447728d: https://github.com/GNOME/gtk/commit/dae447728d
1373 // However, in some cases it simply cannot start an OpenGL context.
1374 // This changes to the default X11 visual instead the GTK's default.
1375 GdkScreen * screen = gdk_screen_get_default ();
1376 GList * visuals = gdk_screen_list_visuals (screen);
1377 // printf("n visuals: %u\n", g_list_length(visuals));
1378 GdkX11Screen* x11_screen = GDK_X11_SCREEN (screen);
1379 g_assert (x11_screen != NULL);
1380 Visual * default_xvisual = DefaultVisual (GDK_SCREEN_XDISPLAY(x11_screen), GDK_SCREEN_XNUMBER(x11_screen));
1381 GdkVisual * default_visual = NULL;
1382 // int i = 0;
1383 while (visuals != NULL)
1384 {
1385 GdkVisual * visual = GDK_X11_VISUAL (visuals -> data);
1386 if (default_xvisual -> visualid == gdk_x11_visual_get_xvisual(GDK_X11_VISUAL (visuals -> data)) -> visualid)
1387 {
1388 // printf("Default visual %d\n", i);
1389 default_visual = visual;
1390 }
1391 // i++;
1392 visuals = visuals -> next;
1393 }
1394 gtk_widget_set_visual (win, default_visual);
1395}
1396#endif
1397#endif
1398
1399gboolean create_3d_model (int p, gboolean load)
1400{
1401 project * this_proj = get_project_by_id (p);
1402#ifndef GTKGLAREA
1403 if (! glXQueryExtension (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), NULL, NULL))
1404 {
1405 g_warning ("Sorry OpenGL is not supported !");
1406 return FALSE;
1407 }
1408 else
1409#endif
1410 {
1411 if (this_proj -> modelgl)
1412 {
1413 g_free (this_proj -> modelgl);
1414 this_proj -> modelgl = NULL;
1415 }
1416 this_proj -> modelgl = g_malloc0 (sizeof*this_proj -> modelgl);
1417 this_proj -> modelgl -> init = FALSE;
1418 this_proj -> modelgl -> proj = this_proj -> id;
1419 GtkWidget * gl_vbox;
1420 if (load)
1421 {
1422 gchar * str = g_strdup_printf ("%s - 3D view - [%s mode]", this_proj -> name, mode_name[0]);
1423 this_proj -> modelgl -> win = create_win (str, MainWindow, FALSE, TRUE);
1424#ifdef GTK3
1425#ifdef GTKGLAREA
1426#ifdef LINUX
1427 if (! atomes_visual) gtk_window_change_gdk_visual (this_proj -> modelgl -> win);
1428#endif
1429#endif
1430#endif
1431 // this_proj -> modelgl -> accel_group = gtk_accel_group_new ();
1432 // gtk_window_add_accel_group (GTK_WINDOW (this_proj -> modelgl -> win), this_proj -> modelgl -> accel_group);
1433 g_free (str);
1434 gl_vbox = create_vbox (BSEP);
1435 add_container_child (CONTAINER_WIN, this_proj -> modelgl -> win, gl_vbox);
1436 this_proj -> modelgl -> menu_box = create_hbox (0);
1437 add_box_child_start (GTK_ORIENTATION_VERTICAL, gl_vbox, this_proj -> modelgl -> menu_box, FALSE, FALSE, 0);
1438#ifdef GTK3
1439 this_proj -> modelgl -> menu_bar = gtk_menu_bar_new ();
1440 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, this_proj -> modelgl -> menu_box, this_proj -> modelgl -> menu_bar, TRUE, TRUE, 0);
1441#endif
1442 }
1443#ifdef GTKGLAREA
1444 this_proj -> modelgl -> plot = gtk_gl_area_new ();
1445 gtk_widget_set_can_focus (this_proj -> modelgl -> plot, TRUE);
1446#ifdef GTK4
1447 gtk_widget_set_focusable (this_proj -> modelgl -> plot, TRUE);
1448#endif
1449#else
1450 this_proj -> modelgl -> plot = gtk_drawing_area_new ();
1451#endif
1452 gtk_widget_set_size_request (this_proj -> modelgl -> plot, 100, 100);
1453#ifndef GTKGLAREA
1454 gtk_widget_set_double_buffered (this_proj -> modelgl -> plot, FALSE);
1455 this_proj -> modelgl -> glcontext = NULL;
1456#endif
1457 gtk_widget_set_hexpand (this_proj -> modelgl -> plot, TRUE);
1458 gtk_widget_set_vexpand (this_proj -> modelgl -> plot, TRUE);
1459#ifdef GTKGLAREA
1460#ifdef GTK3
1461 gtk_widget_add_events (GTK_WIDGET (this_proj -> modelgl -> plot),
1462 GDK_SCROLL_MASK |
1463 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |
1464 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
1465#endif
1466#else
1467 gtk_widget_add_events (GTK_WIDGET (this_proj -> modelgl -> plot),
1468 GDK_SMOOTH_SCROLL_MASK |
1469 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |
1470 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
1471#endif
1472#ifdef GTK4
1473 if (load)
1474 {
1475 add_widget_gesture_and_key_action (this_proj -> modelgl -> win, NULL, NULL, NULL,
1476 NULL, NULL, NULL,
1477 "glwin-key-pressed", G_CALLBACK(on_glwin_key_pressed), this_proj -> modelgl,
1478 NULL, NULL, NULL,
1479 NULL, NULL, NULL);
1480 add_widget_gesture_and_key_action (this_proj -> modelgl -> plot, "glwin-button-pressed", G_CALLBACK(on_glwin_button_pressed), this_proj -> modelgl,
1481 "glwin-button-released", G_CALLBACK(on_glwin_button_released), this_proj -> modelgl,
1482 NULL, NULL, NULL,
1483 "glwin-pointer-motion", G_CALLBACK(on_glwin_pointer_motion), this_proj -> modelgl,
1484 "glwin-pointer-scroll", G_CALLBACK(on_glwin_pointer_scoll), this_proj -> modelgl);
1485 }
1486 else
1487 {
1488 add_widget_gesture_and_key_action (this_proj -> modelgl -> plot, "glwin-button-pressed", G_CALLBACK(on_lib_button_pressed), this_proj -> modelgl,
1489 "glwin-button-released", G_CALLBACK(on_lib_button_released), this_proj -> modelgl,
1490 NULL, NULL, NULL,
1491 "glwin-pointer-motion", G_CALLBACK(on_glwin_pointer_motion), this_proj -> modelgl,
1492 NULL, NULL, NULL);
1493 }
1494#else
1495 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "motion-notify-event", G_CALLBACK(on_motion), this_proj -> modelgl);
1496 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "button-release-event", G_CALLBACK(on_glwin_button_event), this_proj -> modelgl);
1497 if (load)
1498 {
1499 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "button-press-event", G_CALLBACK(on_glwin_button_event), this_proj -> modelgl);
1500 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "scroll-event", G_CALLBACK(on_scrolled), this_proj -> modelgl);
1501 }
1502 else
1503 {
1504 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "button-press-event", G_CALLBACK(on_lib_pressed), this_proj -> modelgl);
1505 }
1506#endif
1507 if (load)
1508 {
1509 add_box_child_start (GTK_ORIENTATION_VERTICAL, gl_vbox, this_proj -> modelgl -> plot, FALSE, TRUE, 0);
1510#ifdef GTK3
1511 g_signal_connect (G_OBJECT (this_proj -> modelgl -> win), "key-press-event", G_CALLBACK(on_key_pressed), this_proj -> modelgl);
1512#endif
1513 g_signal_connect (G_OBJECT (this_proj -> modelgl -> win), "realize", G_CALLBACK(on_win_realize), this_proj -> modelgl);
1514 add_gtk_close_event (this_proj -> modelgl -> win, G_CALLBACK(hide_this_window), NULL);
1515 }
1516 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "realize", G_CALLBACK(on_realize), this_proj -> modelgl);
1517#ifdef GTKGLAREA
1518 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "render", G_CALLBACK(on_expose), this_proj -> modelgl);
1519#else
1520 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "draw", G_CALLBACK(on_expose), this_proj -> modelgl);
1521#endif
1522 return TRUE;
1523 }
1524}
1525
1533void prep_model (int p)
1534{
1535 project * this_proj = get_project_by_id (p);
1536 gboolean adv_bonding[2];
1537 if (this_proj -> modelgl == NULL)
1538 {
1539 if (create_3d_model (p, TRUE))
1540 {
1541 /*GtkWidget * dummy = create_menu_item (FALSE, "Dummy");
1542 gtk_menu_shell_append ((GtkMenuShell *)this_proj -> modelgl -> menu_bar, dummy);
1543 show_the_widgets (this_proj -> modelgl -> win);
1544 destroy_this_widget (dummy);*/
1545 show_the_widgets (this_proj -> modelgl -> win);
1546 }
1547 if (this_proj -> initgl)
1548 {
1550#ifdef GTK3
1551 // GTK3 Menu Action To Check
1552 active_glwin -> ogl_box_axis[0] = g_malloc0 (OGL_BOX*sizeof*active_glwin -> ogl_box_axis[0]);
1553 active_glwin -> ogl_box_axis[1] = g_malloc0 (OGL_AXIS*sizeof*active_glwin -> ogl_box_axis[1]);
1554#endif
1556#ifdef GTK3
1557 GtkWidget * menu = gtk_menu_bar_new ();
1558 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu ("Help", TRUE, menu_help(active_glwin, 0)));
1559 add_box_child_end (active_glwin -> menu_box, menu, FALSE, FALSE, 0);
1560 show_the_widgets (menu);
1561#endif
1562 if (reading_input)
1563 {
1564 adv_bonding[0] = (active_project -> natomes > ATOM_LIMIT) ? 0 : tmp_adv_bonding[0];
1565 adv_bonding[1] = (active_project -> steps > STEP_LIMIT) ? 0 : tmp_adv_bonding[1];
1566 frag_update = (active_project -> natomes > ATOM_LIMIT) ? 0 : 1;
1567 mol_update = (frag_update) ? ((active_project -> steps > STEP_LIMIT) ? 0 : 1) : 0;
1568 }
1569 else
1570 {
1571 frag_update = (force_mol) ? 1 : (active_project -> natomes > ATOM_LIMIT) ? 0 : 1;
1572 mol_update = (force_mol) ? 1 : (frag_update) ? ((active_project -> steps > STEP_LIMIT) ? 0 : 1) : 0;
1573 adv_bonding[0] = adv_bonding[1] = TRUE;
1574 }
1575 if (active_project -> natomes && adv_bonding[0] && adv_bonding[1])
1576 {
1577 bonds_update = 1;
1578 active_project -> runc[0] = FALSE;
1579 on_calc_bonds_released (NULL, NULL);
1580 }
1581 }
1582 }
1583 else
1584 {
1585 if (gtk_widget_get_visible(this_proj -> modelgl -> win))
1586 {
1587 hide_the_widgets (this_proj -> modelgl -> win);
1588 }
1589 else
1590 {
1591 show_the_widgets (this_proj -> modelgl -> win);
1592 }
1593 }
1594}
gchar * action_name[5]
Definition atom_edit.c:60
GtkWidget * coord_menu(glwin *view)
void restore_color_map(glwin *view, int *colm)
restore saved color maps
Definition bdcall.c:96
int * save_color_map(glwin *view)
save atoms and polyhedra color maps
Definition bdcall.c:80
gboolean force_mol
Definition calc.c:71
Variable declarations for the MD input preparation assistants.
gchar * groups[230]
Definition cbuild_sg.c:43
integer function chains()
Definition chains.F90:54
void update_insert_combos()
update some GtkComboBox in the workspace if a project is removed
Definition close_p.c:60
Structure definitions for color management Function declarations for color management.
color colorp[64]
ColRGBA col
Definition d_measures.c:77
int * shift
Definition d_measures.c:72
void init_default_shaders(glwin *view)
re-initialize the default OpenGL shaders
dint rep
Definition dlp_edit.c:2227
gboolean reading_input
Definition global.c:182
int mol_update
Definition global.c:171
gchar * PACKAGE_IMG
Definition global.c:81
gboolean tmp_adv_bonding[2]
Definition global.c:183
int frag_update
Definition global.c:170
GtkWidget * MainWindow
Definition global.c:201
int bonds_update
Definition global.c:169
gchar * mode_name[2]
Definition global.c:138
int atomes_visual
Definition global.c:165
gchar * PACKAGE_MOL
Definition global.c:99
GtkWidget * pop
Definition global.c:204
int tmp_pixels[2]
Definition global.c:173
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_NONE
Definition global.h:262
@ IMG_STOCK
Definition global.h:266
@ IMG_FILE
Definition global.h:265
glwin * active_glwin
Definition project.c:53
void update_chains_menus(glwin *view)
#define ATOM_LIMIT
atom number limit to compute fragment(s) and molecule(s) analysis automatically
#define FITBEST
Definition global.h:201
GtkWidget * gtk3_menu_item(GtkWidget *menu, gchar *name, int icon_format, gpointer item_icon, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod, gboolean check, gboolean radio, gboolean status)
gboolean is_atom_win_active(glwin *view)
is the model edition window visible ?
Definition atom_edit.c:71
void resize_this_window(GtkWidget *window, int x, int y)
resize this GtkWindow
Definition gtk-misc.c:591
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:454
cell_info * active_cell
Definition project.c:50
project * proj
int get_widget_height(GtkWidget *widg)
retrive GtkWidget height
Definition gtk-misc.c:2554
#define BSEP
Definition global.h:247
void opengl_project_changed(int id)
change the OpenGL project
Definition update_p.c:245
G_MODULE_EXPORT gboolean hide_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
hide a GtkWindow
Definition gtk-misc.c:2506
void add_gtk_close_event(GtkWidget *widg, GCallback handler, gpointer data)
add a close event signal and callback to a GtkWidget
Definition gtk-misc.c:2522
#define STEP_LIMIT
Definition global.h:279
G_MODULE_EXPORT void on_calc_bonds_released(GtkWidget *widg, gpointer data)
compute bonding properties
Definition bdcall.c:514
@ CONTAINER_WIN
Definition global.h:252
project * opengl_project
Definition project.c:54
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:308
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:215
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:823
#define FULLSCREEN
Definition global.h:200
GtkWidget * create_menu_item(gboolean add_mnemo, gchar *action)
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2169
void add_box_child_end(GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the end position.
Definition gtk-misc.c:286
tint cut_sel
Definition gui.c:145
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:235
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:198
void add_menu_separator(GtkWidget *menu)
GtkWidget * menu_item_new_with_submenu(gchar *name, gboolean active, GtkWidget *sub_menu)
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:811
project * active_project
Definition project.c:47
void update_rings_menus(glwin *view)
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:182
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
G_MODULE_EXPORT void on_realize(GtkWidget *widg, gpointer data)
realize event for the OpenGL widget
Definition glview.c:1787
G_MODULE_EXPORT void on_glwin_pointer_motion(GtkEventControllerMotion *motc, gdouble x, gdouble y, gpointer data)
handle mouse motion event in the OpenGL window GTK4
Definition glview.c:738
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:450
G_MODULE_EXPORT void on_lib_button_released(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
handle mouse button release event on the molecular library OpenGL window (limited interaction)
Definition glview.c:879
void zoom(glwin *view, int delta)
zoom in or zoom out in the OpenGL window
Definition glview.c:1017
G_MODULE_EXPORT void on_lib_button_pressed(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
handle mouse button press event on the molecular library OpenGL window (limited interaction)
Definition glview.c:863
G_MODULE_EXPORT void on_glwin_button_released(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
mouse button released signal on the OpenGL window
Definition glview.c:1002
G_MODULE_EXPORT void on_glwin_button_pressed(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
mouse button pressed signal on the OpenGL window
Definition glview.c:986
G_MODULE_EXPORT gboolean on_glwin_pointer_scoll(GtkEventControllerScroll *event, gdouble dx, gdouble dy, gpointer data)
handle mouse scroll event on the OpenGL window
Definition glview.c:1066
G_MODULE_EXPORT gboolean on_expose(GtkWidget *widg, cairo_t *cr, gpointer data)
OpenGL rendering widget expose event callback GTK3.
Definition glview.c:1844
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
image * plot
Definition ogl_draw.c:70
#define ZOOM_MAX
Maximum value for the OpenGL zoom factor.
Definition glview.h:134
@ CUSTOM
Definition glview.h:219
G_MODULE_EXPORT void to_center_this_molecule(GtkWidget *widg, gpointer data)
center this molecule menu item callback GTK4
Definition popup.c:3979
action
Definition glview.h:198
#define REFRESH
Refresh time for spinning the OpenGL window in milliseconds.
Definition glview.h:139
@ ANALYZE
Definition glview.h:166
@ EDITION
Definition glview.h:167
render
Definition glview.h:191
@ FILL
Definition glview.h:192
#define DEFAULT_STYLE
Default OpenGL style: ball and stick.
Definition glview.h:43
@ SPHERES
Definition glview.h:185
@ SPACEFILL
Definition glview.h:184
@ BALL_AND_STICK
Definition glview.h:182
@ CYLINDERS
Definition glview.h:186
@ WIREFRAME
Definition glview.h:183
@ NONE
Definition glview.h:181
@ PUNT
Definition glview.h:187
#define OGL_COORDS
Definition glwin.h:63
struct axis axis
axis layout data structure
Definition glwin.h:331
#define OGL_BOX
Definition glwin.h:58
#define OGL_STYLES
Definition glwin.h:107
@ MEASU
Definition glwin.h:99
#define OGL_AXIS
Definition glwin.h:59
#define ATOM_MAPS
Definition glwin.h:61
void activate_glwin_action(gchar *action_string, gchar *action_name, glwin *view)
the keyboard shortcut actions for the OpenGL window
Definition glwindow.c:827
void set_sensitive_coord_menu(glwin *view, gboolean status)
void glwin_key_pressed(guint keyval, GdkModifierType state, gpointer data)
the keyboard shortcut actions for the OpenGL window
Definition glwindow.c:843
void set_color_map_sensitive(glwin *view)
void window_encode(glwin *view, gboolean video)
encoding a movie - creating the dialog
Definition w_encode.c:319
G_MODULE_EXPORT void coord_properties(GtkWidget *widg, gpointer data)
create the environments configuration window
Definition w_coord.c:1449
G_MODULE_EXPORT void set_style(GtkWidget *widg, gpointer data)
set style callback
Definition m_style.c:172
gchar * opengl_group_names[]
Definition glwindow.c:127
int get_selection_type(glwin *view)
get selection type
Definition w_measures.c:83
void save_rotation_quaternion(glwin *view)
save the rotation quaternion of the last image
Definition glview.c:554
gchar * opengl_section_names[]
Definition glwindow.c:125
G_MODULE_EXPORT void set_selection_mode(GtkWidget *widg, gpointer data)
set selection mode callback
Definition m_tools.c:133
int opengl_shortcut_by_group[]
Definition glwindow.c:130
int is_labelled
Definition popup.c:182
void update_all_menus(glwin *view, int nats)
update all menus of the OpenGL window
Definition glwindow.c:337
void prep_model(int p)
prepare, or display, the OpenGL model window
Definition glwindow.c:1533
G_MODULE_EXPORT void opengl_advanced(GtkWidget *widg, gpointer data)
create OpenGL rendering advanced window
Definition w_advance.c:1670
G_MODULE_EXPORT gboolean on_glwin_key_pressed(GtkEventControllerKey *self, guint keyval, guint keycode, GdkModifierType state, gpointer data)
keyboard key press event for the OpenGL window GTK4
Definition glwindow.c:1328
G_MODULE_EXPORT void spin_go(GtkWidget *widg, gpointer data)
void update_menus(glwin *view)
G_MODULE_EXPORT void set_box_axis_style(GtkWidget *widg, gpointer data)
G_MODULE_EXPORT void on_win_realize(GtkWidget *widg, gpointer data)
realize event for the OpenGL window
Definition glwindow.c:1343
G_MODULE_EXPORT void set_render(GtkWidget *widg, gpointer data)
set OpenGL rendering mode callback
Definition m_render.c:56
int is_selected
Definition popup.c:181
G_MODULE_EXPORT void set_full_screen(GtkWidget *widg, gpointer data)
set full screen callback GTK3
Definition popup.c:228
GtkWidget * shortcuts_window(int sections, int group_by_section[sections], int groups, int shortcut_by_group[groups], gchar *section_names[sections], gchar *group_names[groups], shortcuts shortcs[])
Create the shortcuts information window.
Definition gui.c:181
G_MODULE_EXPORT void add_object(GtkWidget *widg, gpointer data)
add object call back GTK3
Definition popup.c:712
void prep_all_coord_menus(glwin *view)
G_MODULE_EXPORT void copy_the_atoms(GtkWidget *widg, gpointer data)
copy selected atom(s) callback GTK3
Definition popup.c:1354
void prepare_opengl_menu_bar(glwin *view)
update the OpenGL window menu bar
Definition glwindow.c:615
G_MODULE_EXPORT void view_shortcuts(GtkWidget *widg, gpointer data)
OpenGL window shortcuts callback GTK3.
Definition glwindow.c:470
G_MODULE_EXPORT void label_unlabel_atoms(GtkWidget *widg, gpointer data)
label / unlabel a type of atom(s) callback GTK3
Definition popup.c:1502
G_MODULE_EXPORT void window_recorder(GtkWidget *widg, gpointer data)
create video recorder window
Definition w_record.c:152
void translate(project *this_proj, int status, int axis, vec3_t trans)
translate
Definition atom_move.c:230
gboolean spin(gpointer data)
spin
Definition w_spiner.c:56
gchar * action_atoms[3]
Definition atom_edit.c:61
GtkWidget * menupoly(glwin *view, int jd, int id, gchar *poln)
G_MODULE_EXPORT void select_unselect_atoms(GtkWidget *widg, gpointer data)
select / unselect a type of atom(s) callback GTK3
Definition popup.c:1550
void change_color_map(glwin *view, int col)
change atom / polyhedra color map
Definition glwindow.c:659
gboolean create_3d_model(int p, gboolean load)
Definition glwindow.c:1399
G_MODULE_EXPORT void to_reset_view(GtkWidget *widg, gpointer data)
reset view callback - GTK3
Definition m_rep.c:275
shortcuts opengl_shortcuts[]
Definition glwindow.c:134
G_MODULE_EXPORT void window_measures(GtkWidget *widg, gpointer data)
create the measurements window
Definition w_measures.c:739
G_MODULE_EXPORT void render_gl_image(GtkWidget *widg, gpointer data)
render image from the OpenGL window
Definition glwindow.c:444
G_MODULE_EXPORT void set_mode(GtkWidget *widg, gpointer data)
set mouse mode callback
Definition m_tools.c:172
vec3_t get_insertion_coordinates(glwin *view)
get the insertion coordinates to insert object in the 3D window
Definition glwindow.c:809
int selected_aspec
Definition popup.c:179
G_MODULE_EXPORT void set_color_map(GtkWidget *widg, gpointer data)
set color map callback
Definition m_map.c:1011
G_MODULE_EXPORT void on_create_new_project(GtkWidget *widg, gpointer data)
create a new project
Definition work_menu.c:62
void rotate_x_y(glwin *view, double angle_x, double angle_y)
rotate the OpenGL camera
Definition glview.c:1092
G_MODULE_EXPORT void edit_in_new_project(GtkWidget *widg, gpointer data)
create new project using selection callback GTK3
Definition popup.c:2191
G_MODULE_EXPORT void spin_stop(GtkButton *but, gpointer data)
stop spin
Definition w_spiner.c:138
atomic_object * copied_object
Definition glwindow.c:123
void set_motion(glwin *view, int axis, int da, int db, gboolean UpDown, GdkModifierType state)
handle keyboard motion event on the OpenGL window
Definition glwindow.c:716
mat4_t insert_projection(glwin *view)
calculate the insertion projection matrix to insert object in the 3D window
Definition glwindow.c:775
int opengl_group_by_section[]
Definition glwindow.c:126
G_MODULE_EXPORT void remove_the_atoms(GtkWidget *widg, gpointer data)
remove selected atom(s) callback GTK3
Definition popup.c:1296
GLXContext glcontext
Function declarations to handle the atomic coordination data.
void set_advanced_bonding_menus(glwin *view)
GMenu * menu_anim(glwin *view, int popm)
create the 'Animate' submenu elements
Definition m_anim.c:139
GMenu * menu_atoms(glwin *view, int popm, int at)
create the 'Atom(s)' submenu elements
Definition m_atoms.c:799
GMenu * menu_back(glwin *view, int popm)
create the background color menu item GTK4
Definition m_back.c:89
GMenu * menu_bonds(glwin *view, int popm, int at)
create the 'Bond(s)' submenu GTK4
Definition m_bonds.c:367
GMenuItem * menu_box_axis(glwin *view, int popm, int ab)
create the 'Model -> Box' and 'View -> Axis' submenus GTK4
Definition m_box.c:598
GMenu * menu_clones(glwin *view, int popm)
create the 'Clone(s)' submenu GTK4
Definition m_clones.c:180
GMenu * menu_coord(glwin *view, int popm)
create the 'Coordination' submenu GTK4
Definition m_coord.c:689
GMenu * menu_rings(glwin *view, int popm)
create the 'Ring(s)' submenu GTK4
Definition m_coord.c:705
GMenu * add_menu_coord(glwin *view, int popm, int id)
create a coordination type submenu
Definition m_coord.c:652
GMenu * menu_map(glwin *view, int popm)
create the 'OpenGL -> Color Scheme(s)' submenu - GTK4
Definition m_map.c:1272
G_MODULE_EXPORT void cloned_poly(GtkWidget *widg, gpointer data)
cloned polyehdra callback - GTK3
Definition m_poly.c:181
GMenu * menu_poly(glwin *view, int popm)
create the 'Chemistry -> Polyehdra' submenu - GTK4
Definition m_poly.c:490
GMenu * menu_proj(glwin *view, int popm)
create the 'View -> Projection' submenu - GTK4
Definition m_proj.c:189
GMenu * menu_quality(glwin *view, int popm)
create the 'OpenGL -> Quality' menu item - GTK4
Definition m_quality.c:175
GMenu * menu_render(glwin *view, int popm)
create the 'OpenGL -> Render' submenu - GTK4
Definition m_render.c:182
GMenu * menu_rep(glwin *view, int popm)
create 'View -> Representation' submenu items - GTK4
Definition m_rep.c:742
GMenu * menu_view(glwin *view, int popm)
create the 'View' submenu - GTK4
Definition m_rep.c:808
GMenu * menu_style(glwin *view, int popm)
create the 'OpenGL -> Style' submenu - GTK4
Definition m_style.c:437
GMenu * menu_tools(glwin *view, int popm)
create the 'Tools' submenu - GTK4
Definition m_tools.c:770
Function declarations for reading atomes project file Function declarations for saving atomes proje...
void active_project_changed(int id)
change the active project
Definition update_p.c:175
GtkWidget * prep_rings_menu(glwin *view, int id)
Definition glwin.h:333
Definition glwin.h:351
Definition glwin.h:965
Function declarations for the creation of the OpenGL window menus.
void menu_items_view(GMenu *menu, glwin *view, int popm)
int status
Definition w_advance.c:178
GdkPixbuf * pix
Definition workspace.c:69
GtkWidget * img
Definition workspace.c:70