atomes 1.3.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-2026 by CNRS and University of Strasbourg */
15
21
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#include "movie.h"
72
73extern G_MODULE_EXPORT void opengl_advanced (GtkWidget * widg, gpointer data);
74extern G_MODULE_EXPORT void coord_properties (GtkWidget * widg, gpointer data);
75extern G_MODULE_EXPORT void set_style (GtkWidget * widg, gpointer data);
76extern void set_render (gpointer data);
77extern G_MODULE_EXPORT void set_mode (GtkWidget * widg, gpointer data);
78extern void set_sensitive_coord_menu (glwin * view, gboolean status);
79extern void set_color_map_sensitive (glwin * view);
80extern G_MODULE_EXPORT void set_selection_mode (GtkWidget * widg, gpointer data);
81
82extern gboolean spin (gpointer data);
83extern G_MODULE_EXPORT void spin_stop (GtkButton * but, gpointer data);
84extern G_MODULE_EXPORT void spin_go (GtkWidget * widg, gpointer data);
85extern void update_menus (glwin * view);
86extern void set_this_style (glwin * view, int style);
87extern G_MODULE_EXPORT void set_box_axis_style (GtkWidget * widg, gpointer data);
88extern G_MODULE_EXPORT void window_measures (GtkWidget * widg, gpointer data);
89extern G_MODULE_EXPORT void window_recorder (GtkWidget * widg, gpointer data);
90extern void window_encode (glwin * view, gboolean video);
91extern GtkWidget * menupoly (glwin * view, int jd, int id, gchar * poln);
92extern G_MODULE_EXPORT void set_color_map (GtkWidget * widg, gpointer data);
93#ifdef GTK4
94extern void update_menu_bar (glwin * view);
95extern G_MODULE_EXPORT void set_full_screen (GSimpleAction * action, GVariant * parameter, gpointer data);
96extern G_MODULE_EXPORT void add_object (GSimpleAction * action, GVariant * parameter, gpointer data);
97extern G_MODULE_EXPORT void label_unlabel_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
98extern G_MODULE_EXPORT void select_unselect_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
99extern G_MODULE_EXPORT void edit_in_new_project (GSimpleAction * action, GVariant * parameter, gpointer data);
100extern G_MODULE_EXPORT void remove_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
101extern G_MODULE_EXPORT void copy_the_atoms (GSimpleAction * action, GVariant * parameter, gpointer data);
102#else
103extern G_MODULE_EXPORT void set_full_screen (GtkWidget * widg, gpointer data);
104extern G_MODULE_EXPORT void to_reset_view (GtkWidget * widg, gpointer data);
105extern G_MODULE_EXPORT void add_object (GtkWidget * widg, gpointer data);
106extern G_MODULE_EXPORT void label_unlabel_atoms (GtkWidget * widg, gpointer data);
107extern G_MODULE_EXPORT void select_unselect_atoms (GtkWidget * widg, gpointer data);
108extern G_MODULE_EXPORT void remove_the_atoms (GtkWidget * widg, gpointer data);
109extern G_MODULE_EXPORT void copy_the_atoms (GtkWidget * widg, gpointer data);
110extern G_MODULE_EXPORT void edit_in_new_project (GtkWidget * widg, gpointer data);
111#endif
112extern void save_rotation_quaternion (glwin * view);
113extern void rotate_x_y (glwin * view, double angle_x, double angle_y);
114extern void translate (project * this_proj, int status, int axis, vec3_t trans);
115extern int selected_aspec;
116extern int is_selected;
117extern int is_labelled;
118extern G_MODULE_EXPORT void on_create_new_project (GtkWidget * widg, gpointer data);
119extern gchar * action_atoms[3];
120extern int get_selection_type (glwin * view);
121extern GtkWidget * shortcuts_window (int sections, int group_by_section[sections], int groups, int shortcut_by_group[groups],
122 gchar * section_names[sections], gchar * group_names[groups], shortcuts shortcs[]);
123
125
126gchar * opengl_section_names[]={ i18n("General"), i18n("Analysis mode"), i18n("Edition mode") };
127int opengl_group_by_section[] = { 5, 4, 3 };
128gchar * opengl_group_names[]={i18n("Styles"), i18n("Measures"), i18n("Selection mode"), i18n("Window management"), i18n("Mouse mode"),
129 i18n("Camera rotation"), i18n("Camera motion"), i18n("Camera spin"), i18n("Model interaction"),
130 i18n("Coordinates rotation"), i18n("Coordinates translation"), i18n("Model interaction")};
131int opengl_shortcut_by_group[] = { 10, 1, 4, 6, 2, // Global
132 4, 6, 6, 3, // Analysis
133 4, 6, 6 }; // Edition
134
136//
137// Global
138//
139 { i18n("Atom(s) color map"), i18n("change atom(s) color map"), GDK_KEY_a, "a" },
140 { i18n("Polyhedra color map"), i18n("change polyhedra color map"), GDK_KEY_p, "p" },
141 { i18n("Balls and Sticks"), i18n("change global style to balls and sticks"), GDK_KEY_b, "b" },
142 { i18n("Cylinders"), i18n("change global style to cylinders"), GDK_KEY_c, "c" },
143 { i18n("Spheres"), i18n("change global style to spheres"), GDK_KEY_s, "s" },
144 { i18n("Covalent Radii"), i18n("change global style to covalent radii"), GDK_KEY_o, "o" },
145 { i18n("Ionic Radii"), i18n("change global style to ionic radii"), GDK_KEY_i, "i" },
146 { i18n("van der Waals Radii"), i18n("change global style to van der Waals radii"), GDK_KEY_v, "v" },
147 { i18n("In Crystal Radii"), i18n("change global style to in crystal radii"), GDK_KEY_r, "r" },
148 { i18n("Wireframes"), i18n("change global style to wireframes"), GDK_KEY_w, "w" },
149//
150 { i18n("All measures for the selection, pressed:\n\n"
151 "\t- 1st time: show inter-atomic distances\n"
152 "\t- 2nd time: show inter-atomic angles\n"
153 "\t- 3rd time: hide measures"), i18n("Show measures"), GDK_KEY_m, "m" },
154//
155 { i18n("Atom"), i18n("atom selection mode"), GDK_KEY_a, "<Shift>a" },
156 { i18n("Coordination"), i18n("coordination sphere selection mode"), GDK_KEY_c, "<Shift>c" },
157 { i18n("Fragment"), i18n("fragment selection mode"), GDK_KEY_f, "<Shift>f" },
158 { i18n("Molecule"), i18n("molecule selection mode"), GDK_KEY_m, "<Shift>m" },
159//
160 { i18n("Environments"), i18n("Environments window"), GDK_KEY_e, "<Ctrl>e" },
161 { i18n("Measures"), i18n("Measures window"), GDK_KEY_m, "<Ctrl>m" },
162 { i18n("Recorder"), i18n("Recorder window"), GDK_KEY_r, "<Ctrl>r" },
163 { i18n("Create new project"), i18n("Create new project"), GDK_KEY_n, "<Ctrl>n" },
164 { i18n("Enter fullscreen"), i18n("Enter fullscreen"), GDK_KEY_f, "<Ctrl>f" },
165 { i18n("Exit fullscreen"), i18n("Exit fullscreen"), GDK_KEY_Escape, "Escape" },
166//
167#ifdef OSX
168 { i18n("Analysis mode"), i18n("Analysis mode"), GDK_KEY_a, "<Meta>a" },
169 { i18n("Edition mode"), i18n("Edition mode"), GDK_KEY_e, "<Meta>e" },
170#else
171 { i18n("Analysis mode"), i18n("Analysis mode"), GDK_KEY_a, "<Alt>a" },
172 { i18n("Edition mode"), i18n("Edition mode"), GDK_KEY_e, "<Alt>e" },
173#endif
174//
175// Analysis
176//
177 { i18n("Rotate right"), i18n("rotate right"), GDK_KEY_Right, "Right" },
178 { i18n("Rotate left"), i18n("rotate left"), GDK_KEY_Left, "Left" },
179 { i18n("Rotate up"), i18n("rotate up"), GDK_KEY_Up, "Up" },
180 { i18n("Rotate down"), i18n("rotate down"), GDK_KEY_Down, "Down" },
181//
182 { i18n("Move right"), i18n("move camera right"), GDK_KEY_Right, "<Ctrl>Right" },
183 { i18n("Move left"), i18n("move camera left"), GDK_KEY_Left, "<Ctrl>Left" },
184 { i18n("Move up"), i18n("move camera up"), GDK_KEY_Up, "<Ctrl>Up" },
185 { i18n("Move down"), i18n("move camera down"), GDK_KEY_Down, "<Ctrl>Down" },
186 { i18n("Zoom in"), i18n("zoom camera in"), GDK_KEY_Down, "<Shift>Up" },
187 { i18n("Zoom out"), i18n("zoom camera out"), GDK_KEY_Down, "<Shift>Down" },
188//
189 { i18n("Spin right"), i18n("rotate right"), GDK_KEY_Right, "<Ctrl><Shift>Right" },
190 { i18n("Spin left"), i18n("rotate left"), GDK_KEY_Left, "<Ctrl><Shift>Left" },
191 { i18n("Spin up"), i18n("rotate up"), GDK_KEY_Up, "<Ctrl><Shift>Up" },
192 { i18n("Spin down"), i18n("rotate down"), GDK_KEY_Down, "<Ctrl><Shift>Down" },
193 { i18n("Pause / restart"), i18n("pause / restart spinning"), GDK_KEY_space, "space" },
194 { i18n("Stop"), i18n("stop spinning"), GDK_KEY_s, "<Ctrl>s" },
195//
196 { i18n("Label / unlabel all atom(s)"), i18n("Label / unlabel all atom(s)"), GDK_KEY_l, "<Ctrl>l" },
197 { i18n("Select / unselect all atom(s)"), i18n("Select / unselect all atom(s)"), GDK_KEY_a, "<Ctrl>a" },
198 { i18n("Copy selection"), i18n("Copy selection"), GDK_KEY_c, "<Ctrl>c" },
199//
200// Edition
201//
202 { i18n("Rotate right"), i18n("rotate right"), GDK_KEY_Right, "Right" },
203 { i18n("Rotate left"), i18n("rotate left"), GDK_KEY_Left, "Left" },
204 { i18n("Rotate up"), i18n("rotate up"), GDK_KEY_Up, "Up" },
205 { i18n("Rotate down"), i18n("rotate down"), GDK_KEY_Down, "Down" },
206//
207 { i18n("Translate right"), i18n("move camera right"), GDK_KEY_Right, "<Ctrl>Right" },
208 { i18n("Translate left"), i18n("move camera left"), GDK_KEY_Left, "<Ctrl>Left" },
209 { i18n("Translate up"), i18n("move camera up"), GDK_KEY_Up, "<Ctrl>Up" },
210 { i18n("Translate down"), i18n("move camera down"), GDK_KEY_Down, "<Ctrl>Down" },
211 { i18n("Zoom in"), i18n("zoom camera in"), GDK_KEY_Up, "<Shift>Up" },
212 { i18n("Zoom out"), i18n("zoom camera out"), GDK_KEY_Down, "<Shift>Down" },
213//
214 { i18n("Label / unlabel all atom(s)"), i18n("Label / unlabel all atom(s)"), GDK_KEY_l, "<Ctrl>l" },
215 { i18n("Select / unselect all atom(s)"), i18n("Select / unselect all atom(s)"), GDK_KEY_a, "<Ctrl>a" },
216 { i18n("Copy selection"), i18n("Copy selection"), GDK_KEY_c, "<Ctrl>c" },
217 { i18n("Cut selection"), i18n("Cut selection"), GDK_KEY_x, "<Ctrl>x" },
218 { i18n("Paste selection"), i18n("Paste selection"), GDK_KEY_v, "<Ctrl>v" },
219 { i18n("Delete selection"), i18n("Delete selection"), GDK_KEY_Delete, "Delete" }
220};
221
222#ifdef GTK3
231GtkWidget * prep_rings_menu (glwin * view, int id)
232{
233 if (id == 0)
234 {
235 return menu_rings (view, 0);
236 }
237 else
238 {
239 return menupoly (view, 0, 2, NULL);
240 }
241}
242
250GtkWidget * coord_menu (glwin * view)
251{
252 int i, j, k;
253 GtkWidget * widg;
254 for (j=4; j<10; j++)
255 {
256 if (j<9)
257 {
258 if (view -> ogl_poly[0][j] != NULL)
259 {
260 for (k=0; k<get_project_by_id(view -> proj) -> coord -> totcoord[j]; k++)
261 {
262 if (view -> ogl_poly[0][j][k] != NULL)
263 {
264 if (GTK_IS_WIDGET(view -> ogl_poly[0][j][k]))
265 {
266 widg = gtk_widget_get_parent (view -> ogl_poly[0][j][k]);
267 if (GTK_IS_WIDGET(widg))
268 {
269 g_object_ref (view -> ogl_poly[0][j][k]);
270 gtk_container_remove (GTK_CONTAINER(widg), view -> ogl_poly[0][j][k]);
271 }
272 }
273 }
274 }
275 }
276 }
277 if (view -> ogl_geom[0][j] != NULL)
278 {
279 for (k=0; k<get_project_by_id(view -> proj) -> coord -> totcoord[j]; k++)
280 {
281 if (view -> ogl_geom[0][j][k] != NULL)
282 {
283 if (GTK_IS_WIDGET(view -> ogl_geom[0][j][k]))
284 {
285 widg = gtk_widget_get_parent (view -> ogl_geom[0][j][k]);
286 if (GTK_IS_WIDGET(widg))
287 {
288 g_object_ref (view -> ogl_geom[0][j][k]);
289 gtk_container_remove (GTK_CONTAINER(widg), view -> ogl_geom[0][j][k]);
290 }
291 }
292 }
293 }
294 }
295 }
296 if (view -> ogl_chains[0]) view -> ogl_chains[0] = destroy_this_widget (view -> ogl_chains[0]);
297 for (i=0; i<2; i++)
298 {
299 for (j=2; j<4; j++)
300 {
301 detach_frag_mol_menu (view, i, j);
302 }
303 }
304 for (i=1; i<OGL_COORDS; i++)
305 {
306 view -> ogl_coord[i] = destroy_this_widget (view -> ogl_coord[i]);
307 }
308 for (i=0; i<2; i++)
309 {
310 view -> ogl_rings[i*6] = menu_item_new_with_submenu (_("Ring(s)"), view -> rings, prep_rings_menu (view, i*6));
311 }
312 view -> ogl_chains[0] = menu_item_new_with_submenu (_("Chain(s)"), view -> chains, add_menu_coord (view, 0, 9));
313 view -> ogl_coord[1] = menu_coord (view, 0);
314 view -> ogl_coord[2] = menu_item_new_with_submenu (_("Polyhedra"), TRUE, menu_poly (view, 0));
315 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));
316 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));
317 GtkWidget * menu = gtk_menu_new ();
318 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[1]);
319 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[2]);
320 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_rings[0]);
321 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_chains[0]);
322 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[3]);
323 gtk_menu_shell_append ((GtkMenuShell *)menu, view -> ogl_coord[4]);
324 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);
325 // add_advanced_item (menu, G_CALLBACK(coord_properties), (gpointer)& view -> colorp[30][0], TRUE, GDK_KEY_e, GDK_CONTROL_MASK);
326 return menu;
327}
328#endif
329
338void update_all_menus (glwin * view, int nats)
339{
340#ifdef GTK3
341 int i, j, k, l;
342 i = view -> anim -> last -> img -> style;
343 j = (nats <= 10000) ? BALL_AND_STICK : DEFAULT_STYLE;
344 if (i != j)
345 {
346 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[j], FALSE);
347 if (i != SPACEFILL)
348 {
349 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_styles[i], TRUE);
350 set_style (view -> ogl_styles[i], & view -> colorp[i][0]);
351 }
352 else
353 {
354 i = view -> anim -> last -> img -> filled_type;
355 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> filled_styles[i], TRUE);
356 set_style (view -> filled_styles[i], & view -> colorp[OGL_STYLES+i][0]);
357 }
358 }
359 i = view -> anim -> last -> img -> render;
360 j = FILL;
361 if (i != j)
362 {
363 set_render (& view -> colorp[i][0]);
364 }
365
366 update_menus (view);
367 widget_set_sensitive (view -> ogl_box[0], active_cell -> ltype);
368 if (view -> anim -> last -> img -> abc -> box == NONE)
369 {
370 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[0][0], FALSE);
371 set_box_axis_style (view -> ogl_box_axis[0][0], & view -> colorp[0][0]);
372 }
373 else
374 {
375 j = (view -> anim -> last -> img -> abc -> box == WIREFRAME) ? 1 : 2;
376 k = j*j;
377 l = (view -> anim -> last -> img -> abc -> box == WIREFRAME) ? CYLINDERS : WIREFRAME;
378 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[0][0], TRUE);
379 set_box_axis_style (view -> ogl_box_axis[0][0], & view -> colorp[0][0]);
380 view -> anim -> last -> img -> abc -> box = l;
381 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[i][j], TRUE);
382 set_box_axis_style (view -> ogl_box_axis[0][j], & view -> colorp[k][0]);
383 }
384
385 if (view -> anim -> last -> img -> xyz -> axis == NONE)
386 {
387 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], FALSE);
388 set_box_axis_style (view -> ogl_box_axis[i][0], & view -> colorp[0][1]);
389 }
390 else
391 {
392 j = (view -> anim -> last -> img -> xyz -> axis == WIREFRAME) ? 1 : 2;
393 k = j*j;
394 l = (view -> anim -> last -> img -> xyz -> axis == WIREFRAME) ? CYLINDERS : WIREFRAME;
395 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][0], TRUE);
396 set_box_axis_style (view -> ogl_box_axis[1][0], & view -> colorp[0][1]);
397 view -> anim -> last -> img -> xyz -> axis = l;
398 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][j], TRUE);
399 set_box_axis_style (view -> ogl_box_axis[1][j], & view -> colorp[k][1]);
400 }
401
402 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_rep[view -> anim -> last -> img -> rep], TRUE);
403 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_rep[! view -> anim -> last -> img -> rep], FALSE);
404 for (i=0; i<5; i++) gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][8+i], FALSE);
405 if (view -> anim -> last -> img -> xyz -> t_pos != CUSTOM)
406 {
407 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_box_axis[1][8+view -> anim -> last -> img -> xyz -> t_pos], TRUE);
408 }
410 widget_set_sensitive (view -> ogl_clones[0], view -> allbonds[1]);
411 update_rings_menus (view);
412 update_chains_menus (view);
413 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_clones[0], view -> anim -> last -> img -> draw_clones);
414 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_clones[5], view -> anim -> last -> img -> cloned_poly);
415 int * cmap = save_color_map (view);
417 if (view -> color_styles[0])
418 {
419 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> color_styles[0], TRUE);
420 set_color_map (view -> color_styles[0], & view -> colorp[0][0]);
421 }
422 if (view -> color_styles[ATOM_MAPS])
423 {
424 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> color_styles[ATOM_MAPS], TRUE);
425 set_color_map (view -> color_styles[ATOM_MAPS], & view -> colorp[ATOM_MAPS][0]);
426 }
427 restore_color_map (view, cmap);
428 g_free (cmap);
429#else
430 update_menu_bar (view);
431#endif
432}
433
442G_MODULE_EXPORT void render_gl_image (GtkWidget * widg, gpointer data)
443{
444 glwin * view = (glwin *) data;
445 window_encode (view, FALSE);
446}
447
448#ifdef GTK4
458G_MODULE_EXPORT void view_shortcuts (GSimpleAction * action, GVariant * parameter, gpointer data)
459#else
468G_MODULE_EXPORT void view_shortcuts (GtkWidget * widg, gpointer data)
469#endif
470{
471 glwin * view = (glwin *)data;
472 view -> shortcuts = destroy_this_widget (view -> shortcuts);
475}
476
477#ifdef GTK3
478
488void menu_items_opengl (GtkWidget * menu, glwin * view, int pop)
489{
490 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);
491 gtk_menu_item_set_submenu ((GtkMenuItem *)style, menu_style(view, pop));
492 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Color Maps"), get_project_by_id(view -> proj) -> nspec, menu_map(view, pop)));
493 gtk3_menu_item (menu, _("Material and Light(s)"), IMG_NONE, NULL, G_CALLBACK(opengl_advanced), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
494 gtk3_menu_item (menu, _("Render Image"), IMG_FILE, (gpointer)PACKAGE_IMG, G_CALLBACK(render_gl_image), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
495}
496
505GtkWidget * menu_opengl (glwin * view, int pop)
506{
507 GtkWidget * menu = gtk_menu_new ();
508 menu_items_opengl (menu, view, pop);
509 return menu;
510}
511
521void menu_items_model (GtkWidget * menu, glwin * view, int pop)
522{
523 if (get_project_by_id(view -> proj) -> nspec)
524 {
525 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Atom(s)"), TRUE, menu_atoms (view, pop, 0)));
526 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Bond(s)"), TRUE, menu_bonds (view, pop, 0)));
527 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Clone(s)"), TRUE, menu_clones (view, pop)));
528 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_box_axis (view, 0, 0));
529 }
530}
531
540GtkWidget * menu_model (glwin * view, int pop)
541{
542 GtkWidget * menu = gtk_menu_new ();
543 menu_items_model (menu, view, pop);
544 return menu;
545}
546
556void menu_items_view (GtkWidget * menu, glwin * view, int popm)
557{
558 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Representation"), TRUE, menu_rep (view, popm)));
559 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Projection"), TRUE, menu_proj (view)));
560 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Background"), TRUE, menu_back (view)));
561 if (get_project_by_id(view -> proj) -> nspec) gtk_menu_shell_append ((GtkMenuShell *)menu, menu_box_axis (view, popm, 1));
562 if (! popm)
563 {
564 add_menu_separator (menu);
565 gtk3_menu_item (menu, _("Reset View"), IMG_STOCK, (gpointer)FITBEST, G_CALLBACK(to_reset_view), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
566 gtk3_menu_item (menu, _("Center Molecule"), IMG_STOCK, (gpointer)FITBEST, G_CALLBACK(to_center_this_molecule), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
567 add_menu_separator (menu);
568 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);
569 }
570}
571
580GtkWidget * menu_view (glwin * view, int popm)
581{
582 GtkWidget * menu = gtk_menu_new ();
583 menu_items_view (menu, view, popm);
584 return menu;
585}
586
595GtkWidget * menu_help (glwin * view, int popm)
596{
597 GtkWidget * menu;
598 menu = gtk_menu_new ();
599 gtk3_menu_item (menu, _("Shortcuts"), IMG_NONE, NULL, G_CALLBACK(view_shortcuts), (gpointer)view, FALSE, 0, 0, FALSE, FALSE, FALSE);
600 return menu;
601}
602#endif
603
612{
613#ifdef GTK3
614 // clean_all_menu_bar_widgets (view);
615 view -> ogl_coord[0] = destroy_this_widget (view -> ogl_coord[0]);
616#endif
617 view -> menu_bar = destroy_this_widget (view -> menu_bar);
618#ifdef GTK3
619 view -> menu_bar = gtk_menu_bar_new ();
620 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu ("OpenGL", TRUE, menu_opengl(view, 0)));
621 project * this_proj = get_project_by_id (view -> proj);
622 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu (_("Model"), this_proj -> nspec, menu_model(view, 0)));
623 view -> ogl_coord[0] = create_menu_item (FALSE, _("Chemistry"));
624 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, view -> ogl_coord[0]);
625 widget_set_sensitive (view -> ogl_coord[0], this_proj -> nspec);
626 if (this_proj -> nspec)
627 {
628 gtk_menu_item_set_submenu ((GtkMenuItem *)view -> ogl_coord[0], coord_menu (view));
629 }
630 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu (_("Tools"), TRUE, menu_tools(view, 0)));
631 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_item_new_with_submenu (_("View"), TRUE, menu_view(view, 0)));
632 gtk_menu_shell_append ((GtkMenuShell *)view -> menu_bar, menu_anim (view, 0));
633
634 show_the_widgets (view -> menu_bar);
635
636 if (this_proj -> nspec) update_all_menus (view, this_proj -> natomes);
637 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, view -> menu_box, view -> menu_bar, TRUE, TRUE, 0);
638 /* GtkWidget * menu = gtk_menu_bar_new ();
639 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Help"), TRUE, menu_help(view, 0)));
640 add_box_child_end (view -> menu_box, menu, FALSE, FALSE, 0);
641 show_the_widgets (menu);*/
642 show_the_widgets (view -> menu_bar);
643#else
644 update_menu_bar (view);
645#endif
646}
647
656void change_color_map (glwin * view, int col)
657{
658 int i, j;
659 i = ATOM_MAPS-1;
660 if (view -> custom_map) i++;
661 if (view -> anim -> last -> img -> color_map[col] < i-1)
662 {
663 if (view -> anim -> last -> img -> color_map[col] < 2)
664 {
665 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
666 }
667 else if (view -> anim -> last -> img -> color_map[col] == 2 && view -> adv_bonding[0])
668 {
669 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
670 }
671 else if (view -> anim -> last -> img -> color_map[col] == 3 && view -> adv_bonding[1])
672 {
673 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
674 }
675 else if (view -> anim -> last -> img -> color_map[col] == 4 && get_project_by_id(view -> proj) -> force_field[0])
676 {
677 j = col*ATOM_MAPS + view -> anim -> last -> img -> color_map[col] + 1;
678 }
679 else
680 {
681 j = col*ATOM_MAPS + ((view -> custom_map) ? 6 : 0);
682 }
683 }
684 else
685 {
686 j = col*ATOM_MAPS;
687 }
688 gboolean was_input = reading_input;
689 reading_input = TRUE;
690#ifdef GTK3
691 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> color_styles[j], TRUE);
692 set_color_map (view -> color_styles[j], & view -> colorp[j][0]);
693#else
694 gchar * variant = g_strdup_printf ("set-%s.%d.0", (col) ? "pmap" : "amap", j);
695 g_action_group_activate_action ((GActionGroup *)view -> action_group, (col) ? "set-pmap" : "set-amap", g_variant_new_string((const gchar *)variant));
696 g_free (variant);
697#endif
698 reading_input = was_input;
699}
700
713void set_motion (glwin * view, int axis, int da, int db, gboolean UpDown, GdkModifierType state)
714{
715 if (state & GDK_CONTROL_MASK)
716 {
717 if (view -> mode == EDITION)
718 {
719 vec3_t trans;
720 if (axis)
721 {
722 trans = vec3(view -> anim -> last -> img -> p_depth*(double) da / view -> pixels[axis], 0.0, 0.0);
723 }
724 else
725 {
726 trans = vec3(0.0, view -> anim -> last -> img -> p_depth*(double) da / view -> pixels[axis], 0.0);
727 }
728 translate (get_project_by_id(view -> proj), 1, 1, trans);
730 update (view);
731 }
732 else if (state & GDK_SHIFT_MASK)
733 {
734 spin_go (NULL, & view -> colorp[db][axis]);
735 }
736 else
737 {
738 view -> anim -> last -> img -> c_shift[! axis] += (double) da / view -> pixels[axis];
739 if (view -> rep_win)
740 {
741 if (view -> rep_win -> camera_widg[! axis + 5] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[! axis + 5]))
742 {
743 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[! axis + 5], - view -> anim -> last -> img -> c_shift[! axis]);
744 }
745 }
746 update (view);
747 }
748 }
749 else if ((state & GDK_SHIFT_MASK) && UpDown)
750 {
751 if (db == 1 && view -> anim -> last -> img -> zoom > ZOOM_MAX) zoom (view, -1);
752 if (db == 3) zoom (view, 1);
753 update (view);
754 }
755 else if (state != GDK_SHIFT_MASK)
756 {
758 double cameraAngle[2] = {0.0, 0.0};
759 cameraAngle[axis] = 0.5*da;
760 rotate_x_y (view, cameraAngle[0], cameraAngle[1]);
761 update (view);
762 }
763}
764
773{
774 GLdouble w, h;
775 GLdouble dw, dh;
776 double gleft, gright, gbottom, gtop;
777 double zoom = view -> anim -> last -> img -> zoom;
778 zoom *= (view -> anim -> last -> img -> p_depth / view -> anim -> last -> img -> gnear);
779 dw = view -> anim -> last -> img -> c_shift[0]*2.0*zoom;
780 dh = view -> anim -> last -> img -> c_shift[1]*2.0*zoom;
781 double aspect = (double)view -> pixels[0] / (double)view -> pixels[1];
782 if (aspect > 1.0)
783 {
784 w = zoom * aspect;
785 h = zoom;
786 }
787 else
788 {
789 w = zoom;
790 h = zoom / aspect;
791 }
792 gleft = -w + dw;
793 gright = w + dw;
794 gbottom = -h + dh;
795 gtop = h + dh;
796 return m4_ortho (gleft, gright, gbottom, gtop, -view -> anim -> last -> img -> gfar, view -> anim -> last -> img -> gfar);
797}
798
807{
808 vec3_t pos;
809 mat4_t insert_pmv_matrix;
810 insert_pmv_matrix = m4_mul (insert_projection (view), view -> model_view_matrix);
811 pos = vec3 (view -> mouseX, view -> mouseY, 0.75);
812 return v3_un_project (pos, view -> view_port, insert_pmv_matrix);
813}
814
824void activate_glwin_action (gchar * action_string, gchar * action_name, glwin * view)
825{
826 GVariant * action_state = g_variant_new_string (action_string);
827 g_action_group_activate_action ((GActionGroup *)view -> action_group, action_name, action_state);
828 // g_variant_unref (action_state);
829}
830
840void glwin_key_pressed (guint keyval, GdkModifierType state, gpointer data)
841{
842 glwin * view = (glwin *)data;
843 int i;
844 switch (keyval)
845 {
846 case GDK_KEY_Escape:
847 if (view -> fullscreen)
848 {
849#ifdef GTK4
850 set_full_screen (NULL, NULL, view);
851#else
852 set_full_screen (NULL, view);
853#endif
854 }
855 break;
856 case GDK_KEY_Delete:
857 if (get_project_by_id(view -> proj) -> natomes && ! is_atom_win_active(view) && get_project_by_id(view -> proj) -> steps == 1 && view -> mode == EDITION)
858 {
860 is_selected = 1;
861 selected_aspec = -1;
862#ifdef GTK4
863 remove_the_atoms (NULL, NULL, & cut_sel);
864#else
865 remove_the_atoms (NULL, & cut_sel);
866#endif
867 }
868 break;
869 case GDK_KEY_space:
870 if (get_project_by_id(view -> proj) -> natomes)
871 {
872 if (view -> spin[0] || view -> spin[1])
873 {
874 for (i=0; i<2; i++)
875 {
876 view -> spin[i+2] = view -> spin[i];
877 view -> spin_speed[i+2] = view -> spin_speed[i];
878 view -> spin[i] = FALSE;
879 }
880 }
881 else if (view -> spin[2] || view -> spin[3])
882 {
883 for (i=0; i<2; i++)
884 {
885 view -> spin[i] = view -> spin[i+2];
886 view -> spin_speed[i] = view -> spin_speed[i+2];
887 g_timeout_add (REFRESH, (GSourceFunc) spin, & view -> colorp[0][i]);
888 view -> spin[i+2] = FALSE;
889 view -> spin_speed[i+2] = 0;
890 }
891 }
892 }
893 break;
894 case GDK_KEY_a:
895 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes)
896 {
898 selected_aspec = -1;
899 i = get_selection_type (view);
900 if (view -> anim -> last -> img -> selected[i] -> selected == opengl_project -> natomes)
901 {
902#ifdef GTK4
903 select_unselect_atoms (NULL, NULL, & view -> colorp[0][0]);
904#else
905 select_unselect_atoms (NULL, & view -> colorp[0][0]);
906#endif
907 }
908 else
909 {
910#ifdef GTK4
911 select_unselect_atoms (NULL, NULL, & view -> colorp[0][1]);
912#else
913 select_unselect_atoms (NULL, & view -> colorp[0][1]);
914#endif
915 }
916 }
917#ifdef GTK4
918#ifdef OSX
919 else if (state & GDK_META_MASK)
920#else
921 else if (state & GDK_ALT_MASK)
922#endif
923#else
924 else if (state & GDK_MOD1_MASK)
925#endif
926 {
927 if (view -> mode == EDITION)
928 {
929#ifdef GTK4
930 activate_glwin_action ("set-mouse-mode.0.0", "set-mouse-mode", view);
931#else
932 // GTK3 Menu Action To Check
933 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_mode[0], TRUE);
934 set_mode (view -> ogl_mode[0], & view -> colorp[0][0]);
935#endif
936 }
937 }
938 else if (get_project_by_id(view -> proj) -> natomes)
939 {
940 change_color_map (view, 0);
941 update (view);
942 }
943 break;
944 case GDK_KEY_A:
945 if (get_project_by_id(view -> proj) -> natomes)
946 {
947 // selection mode to coordination sphere
948#ifdef GTK4
949 activate_glwin_action ("set-sel-mode.0.0", "set-sel-mode", view);
950#else
951 // GTK3 Menu Action To Check
952 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[0], TRUE);
953 set_selection_mode (view -> ogl_smode[0], & view -> colorp[0][0]);
954#endif
955 }
956 break;
957 case GDK_KEY_b:
959 break;
960 case GDK_KEY_c:
961 if (get_project_by_id(view -> proj) -> natomes)
962 {
963 if (state & GDK_CONTROL_MASK)
964 {
965 if (view -> anim -> last -> img -> selected[0] -> selected)
966 {
968 selected_aspec = -1;
969 is_selected = 1;
970 view -> nth_copy = 1;
971 view -> insert_coords = get_insertion_coordinates (view);
972#ifdef GTK4
973 copy_the_atoms (NULL, NULL, & cut_sel);
974#else
975 copy_the_atoms (NULL, & cut_sel);
976#endif
978 }
979 else
980 {
981 if (copied_object)
982 {
983 g_free (copied_object);
984 copied_object = NULL;
985 }
986 }
987 }
988 else
989 {
991 }
992 }
993 break;
994 case GDK_KEY_C:
995 if (get_project_by_id(view -> proj) -> natomes)
996 {
997 // selection mode to coordination sphere
998#ifdef GTK4
999 activate_glwin_action ("set-sel-mode.1.0", "set-sel-mode", view);
1000#else
1001 // GTK3 Menu Action To Check
1002 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[1], TRUE);
1003 set_selection_mode (view -> ogl_smode[1], & view -> colorp[1][0]);
1004#endif
1005 }
1006 break;
1007 case GDK_KEY_d:
1008 set_this_style (view, PUNT);
1009 break;
1010 case GDK_KEY_e:
1011 if (get_project_by_id(view -> proj) -> natomes)
1012 {
1013 if (state & GDK_CONTROL_MASK)
1014 {
1015 coord_properties (NULL, & view -> colorp[30][0]);
1016 }
1017#ifdef GTK4
1018#ifdef OSX
1019 else if (state & GDK_META_MASK)
1020#else
1021 else if (state & GDK_ALT_MASK)
1022#endif
1023#else
1024 else if (state & GDK_MOD1_MASK)
1025#endif
1026 {
1027 if (view -> mode == ANALYZE && get_project_by_id(view -> proj) -> steps == 1)
1028 {
1029#ifdef GTK4
1030 activate_glwin_action ("set-mouse-mode.1.0", "set-mouse-mode", view);
1031#else
1032 // GTK3 Menu Action To Check
1033 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_mode[1], TRUE);
1034 set_mode (view -> ogl_mode[1], & view -> colorp[1][0]);
1035#endif
1036 }
1037 }
1038 }
1039 break;
1040 case GDK_KEY_f:
1041#ifdef GTK4
1042 if (state & GDK_CONTROL_MASK) set_full_screen (NULL, NULL, view);
1043#else
1044 if (state & GDK_CONTROL_MASK) set_full_screen (NULL, view);
1045#endif
1046 break;
1047 case GDK_KEY_F:
1048 if (get_project_by_id(view -> proj) -> natomes)
1049 {
1050 // selection mode to coordination sphere
1051#ifdef GTK4
1052 activate_glwin_action ("set-sel-mode.2.0", "set-sel-mode", view);
1053#else
1054 // GTK3 Menu Action To Check
1055 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[2], TRUE);
1056 set_selection_mode (view -> ogl_smode[2], & view -> colorp[2][0]);
1057#endif
1058 }
1059 break;
1060 case GDK_KEY_i:
1061 set_this_style (view, OGL_STYLES+1);
1062 break;
1063 case GDK_KEY_l:
1064 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes)
1065 {
1066 opengl_project_changed (view -> proj);
1068 if (view -> labelled == opengl_project -> natomes*opengl_project -> steps)
1069 {
1070#ifdef GTK4
1071 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][0]);
1072#else
1073 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][0]);
1074#endif
1075 }
1076 else
1077 {
1078#ifdef GTK4
1079 label_unlabel_atoms (NULL, NULL, & opengl_project -> modelgl -> colorp[0][1]);
1080#else
1081 label_unlabel_atoms (NULL, & opengl_project -> modelgl -> colorp[0][1]);
1082#endif
1083 }
1084 }
1085 break;
1086 case GDK_KEY_m:
1087 if (get_project_by_id(view -> proj) -> natomes)
1088 {
1089 if (state & GDK_CONTROL_MASK)
1090 {
1091 view -> anim -> last -> img -> m_is_pressed = 0;
1092 window_measures (NULL, view);
1093 }
1094 else if (view -> anim -> last -> img -> m_is_pressed < 2)
1095 {
1096 view -> anim -> last -> img -> m_is_pressed ++;
1097 }
1098 else
1099 {
1100 view -> anim -> last -> img -> m_is_pressed = 0;
1101 }
1102 view -> create_shaders[MEASU] = TRUE;
1103 update (view);
1104 }
1105 break;
1106 case GDK_KEY_M:
1107 if (get_project_by_id(view -> proj) -> natomes)
1108 {
1109 // selection mode to coordination sphere
1110#ifdef GTK4
1111 activate_glwin_action ("set-sel-mode.3.0", "set-sel-mode", view);
1112#else
1113 // GTK3 Menu Action To Check
1114 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)view -> ogl_smode[3], TRUE);
1115 set_selection_mode (view -> ogl_smode[3], & view -> colorp[3][0]);
1116#endif
1117 }
1118 break;
1119 case GDK_KEY_n:
1120 if (state & GDK_CONTROL_MASK && ! atomes_from_libreoffice) on_create_new_project (NULL, NULL);
1121 break;
1122 case GDK_KEY_o:
1123 set_this_style (view, OGL_STYLES);
1124 break;
1125 case GDK_KEY_p:
1126 if (get_project_by_id(view -> proj) -> natomes) change_color_map (view, 1);
1127 break;
1128 case GDK_KEY_r:
1129 if (get_project_by_id(view -> proj) -> natomes)
1130 {
1131 if (state & GDK_CONTROL_MASK)
1132 {
1133 window_recorder (NULL, (gpointer)view);
1134 }
1135 else
1136 {
1137 set_this_style (view, OGL_STYLES+3);
1138 }
1139 }
1140 break;
1141 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes) window_recorder (NULL, (gpointer)view);
1142 break;
1143 case GDK_KEY_s:
1144 if (get_project_by_id(view -> proj) -> natomes)
1145 {
1146 if (state & GDK_CONTROL_MASK)
1147 {
1148 spin_stop (NULL, data);
1149 }
1150 else
1151 {
1152 set_this_style (view, SPHERES);
1153 }
1154 }
1155 break;
1156 case GDK_KEY_v:
1157 if (state & GDK_CONTROL_MASK)
1158 {
1159 if (copied_object && ! is_atom_win_active(view) && get_project_by_id(view -> proj) -> steps == 1 && view -> mode == EDITION)
1160 {
1161 //i = (! get_project_by_id(view -> proj) -> natomes) ? 1 : 0;
1162 opengl_project_changed (view -> proj);
1163#ifdef GTK4
1164 add_object (NULL, NULL, & view -> colorp[0][0]);
1165#else
1166 add_object (NULL, & view -> colorp[0][0]);
1167#endif
1168 view -> nth_copy ++;
1169 /*if (i)
1170 {
1171 i = activep;
1172 active_project_changed (view -> proj);
1173 frag_update = (active_project -> natomes > ATOM_LIMIT) ? 0 : 1;
1174 mol_update = (frag_update) ? ((active_project -> steps > STEP_LIMIT) ? 0 : 1) : 0;
1175 bonds_update = 1;
1176 on_calc_bonds_released (NULL, NULL);
1177 active_project_changed (i);
1178 }*/
1179 }
1180 }
1181 else
1182 {
1183 set_this_style (view, OGL_STYLES+2);
1184 }
1185 break;
1186 case GDK_KEY_w:
1187 set_this_style (view, WIREFRAME);
1188 break;
1189 case GDK_KEY_x:
1190 if ((state & GDK_CONTROL_MASK) && get_project_by_id(view -> proj) -> natomes)
1191 {
1192 if (! is_atom_win_active(view) && get_project_by_id(view -> proj) -> steps == 1 && view -> mode == EDITION)
1193 {
1194 if (view -> anim -> last -> img -> selected[0] -> selected)
1195 {
1196 opengl_project_changed (view -> proj);
1197 selected_aspec = -1;
1198 is_selected = 1;
1199#ifdef GTK4
1200 copy_the_atoms (NULL, NULL, & cut_sel);
1201 remove_the_atoms (NULL, NULL, & cut_sel);
1202#else
1203 copy_the_atoms (NULL, & cut_sel);
1204 remove_the_atoms (NULL, & cut_sel);
1205#endif
1206 }
1207 }
1208 }
1209 break;
1210 case GDK_KEY_Right:
1211 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 1, 1, 1, FALSE, state);
1212 break;
1213 case GDK_KEY_Left:
1214 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 1, -1, 3, FALSE, state);
1215 break;
1216 case GDK_KEY_Up:
1217 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 0, 1, 3, TRUE, state);
1218 break;
1219 case GDK_KEY_Down:
1220 if (get_project_by_id(view -> proj) -> natomes) set_motion (view, 0, -1, 1, TRUE, state);
1221 break;
1222 }
1223}
1224
1225#ifdef GTK3
1235G_MODULE_EXPORT gboolean on_key_pressed (GtkWidget * widg, GdkEventKey * event, gpointer data)
1236{
1237 if (event -> type == GDK_KEY_PRESS)
1238 {
1239 glwin_key_pressed (event -> keyval, event -> state, data);
1240 }
1241 return FALSE;
1242}
1243#else
1255G_MODULE_EXPORT gboolean on_glwin_key_pressed (GtkEventControllerKey * self, guint keyval, guint keycode, GdkModifierType state, gpointer data)
1256{
1257 glwin_key_pressed (keyval, state, data);
1258 return TRUE;
1259}
1260#endif
1261
1270G_MODULE_EXPORT void on_win_realize (GtkWidget * widg, gpointer data)
1271{
1272 glwin * view = (glwin *)data;
1273 int * pix = get_project_by_id(view -> proj) -> tmp_pixels;
1274 int shift = 0;
1275 if (GTK_IS_WIDGET(view -> menu_bar)) shift = get_widget_height (view -> menu_bar);
1276 if (pix[0] > 0 && pix[1] > 0)
1277 {
1278 resize_this_window (view -> win, pix[0], pix[1]+shift);
1279 pix[0] = pix[1] = -1;
1280 }
1281 else
1282 {
1283 resize_this_window (view -> win, 500, 500);
1284 }
1285}
1286
1287#ifdef GTK3
1288#ifdef LINUX
1296void gtk_window_change_gdk_visual (GtkWidget * win)
1297{
1298 // GTK+ > 3.15.1 uses an X11 visual optimized for GTK+'s OpenGL stuff
1299 // since revid dae447728d: https://github.com/GNOME/gtk/commit/dae447728d
1300 // However, in some cases it simply cannot start an OpenGL context.
1301 // This changes to the default X11 visual instead the GTK's default.
1302 GdkScreen * screen = gdk_screen_get_default ();
1303 GList * visuals = gdk_screen_list_visuals (screen);
1304 // printf("n visuals: %u\n", g_list_length(visuals));
1305 GdkX11Screen* x11_screen = GDK_X11_SCREEN (screen);
1306 g_assert (x11_screen != NULL);
1307 Visual * default_xvisual = DefaultVisual (GDK_SCREEN_XDISPLAY(x11_screen), GDK_SCREEN_XNUMBER(x11_screen));
1308 GdkVisual * default_visual = NULL;
1309 // int i = 0;
1310 while (visuals != NULL)
1311 {
1312 GdkVisual * visual = GDK_X11_VISUAL (visuals -> data);
1313 if (default_xvisual -> visualid == gdk_x11_visual_get_xvisual(GDK_X11_VISUAL (visuals -> data)) -> visualid)
1314 {
1315 // printf("Default visual %d\n", i);
1316 default_visual = visual;
1317 }
1318 // i++;
1319 visuals = visuals -> next;
1320 }
1321 gtk_widget_set_visual (win, default_visual);
1322}
1323#endif
1324#endif
1325
1326
1327#ifdef GTK4
1336G_MODULE_EXPORT gboolean do_not_hide (GtkWindow * win, gpointer data)
1337#else
1347G_MODULE_EXPORT gboolean do_not_hide (GtkWidget * win, GdkEvent * event, gpointer data)
1348#endif
1349{
1350 return TRUE;
1351}
1352
1353gboolean create_3d_model (int p, gboolean load)
1354{
1355 project * this_proj = get_project_by_id (p);
1356#ifndef GTKGLAREA
1357 if (! glXQueryExtension (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), NULL, NULL))
1358 {
1359 g_warning (_("Sorry OpenGL is not supported !"));
1360 return FALSE;
1361 }
1362 else
1363#endif
1364 {
1365 if (this_proj -> modelgl)
1366 {
1367 g_free (this_proj -> modelgl);
1368 this_proj -> modelgl = NULL;
1369 }
1370 this_proj -> modelgl = g_malloc0(sizeof*this_proj -> modelgl);
1371 this_proj -> modelgl -> init = FALSE;
1372 this_proj -> modelgl -> proj = this_proj -> id;
1373 GtkWidget * gl_vbox;
1374 if (load)
1375 {
1376 gchar * str = g_strdup_printf (_("%s - 3D view - [%s mode]"), this_proj -> name, _(mode_name[0]));
1377 this_proj -> modelgl -> win = create_win (str, MainWindow, FALSE, TRUE);
1378#ifdef GTK3
1379#ifdef GTKGLAREA
1380#ifdef LINUX
1381 if (! atomes_visual) gtk_window_change_gdk_visual (this_proj -> modelgl -> win);
1382#endif
1383#endif
1384#endif
1385 // this_proj -> modelgl -> accel_group = gtk_accel_group_new ();
1386 // gtk_window_add_accel_group (GTK_WINDOW (this_proj -> modelgl -> win), this_proj -> modelgl -> accel_group);
1387 g_free (str);
1388 gl_vbox = create_vbox (BSEP);
1389 add_container_child (CONTAINER_WIN, this_proj -> modelgl -> win, gl_vbox);
1390 this_proj -> modelgl -> menu_box = create_hbox (0);
1391 add_box_child_start (GTK_ORIENTATION_VERTICAL, gl_vbox, this_proj -> modelgl -> menu_box, FALSE, FALSE, 0);
1392#ifdef GTK3
1393 this_proj -> modelgl -> menu_bar = gtk_menu_bar_new ();
1394 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, this_proj -> modelgl -> menu_box, this_proj -> modelgl -> menu_bar, TRUE, TRUE, 0);
1395#endif
1396 }
1397#ifdef GTKGLAREA
1398 this_proj -> modelgl -> plot = gtk_gl_area_new ();
1399 gtk_widget_set_can_focus (this_proj -> modelgl -> plot, TRUE);
1400#ifdef GTK4
1401 gtk_widget_set_focusable (this_proj -> modelgl -> plot, TRUE);
1402#endif
1403#else
1404 this_proj -> modelgl -> plot = gtk_drawing_area_new ();
1405#endif
1406 gtk_widget_set_size_request (this_proj -> modelgl -> plot, 100, 100);
1407#ifndef GTKGLAREA
1408 gtk_widget_set_double_buffered (this_proj -> modelgl -> plot, FALSE);
1409 this_proj -> modelgl -> glcontext = NULL;
1410#endif
1411 gtk_widget_set_hexpand (this_proj -> modelgl -> plot, TRUE);
1412 gtk_widget_set_vexpand (this_proj -> modelgl -> plot, TRUE);
1413#ifdef GTKGLAREA
1414#ifdef GTK3
1415 gtk_widget_add_events (GTK_WIDGET (this_proj -> modelgl -> plot),
1416 GDK_SCROLL_MASK |
1417 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |
1418 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
1419#endif
1420#else
1421 gtk_widget_add_events (GTK_WIDGET (this_proj -> modelgl -> plot),
1422 GDK_SMOOTH_SCROLL_MASK |
1423 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK |
1424 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
1425#endif
1426#ifdef GTK4
1427 if (load)
1428 {
1429 add_widget_gesture_and_key_action (this_proj -> modelgl -> win, NULL, NULL, NULL,
1430 NULL, NULL, NULL,
1431 "glwin-key-pressed", G_CALLBACK(on_glwin_key_pressed), this_proj -> modelgl,
1432 NULL, NULL, NULL,
1433 NULL, NULL, NULL);
1434 add_widget_gesture_and_key_action (this_proj -> modelgl -> plot, "glwin-button-pressed", G_CALLBACK(on_glwin_button_pressed), this_proj -> modelgl,
1435 "glwin-button-released", G_CALLBACK(on_glwin_button_released), this_proj -> modelgl,
1436 NULL, NULL, NULL,
1437 "glwin-pointer-motion", G_CALLBACK(on_glwin_pointer_motion), this_proj -> modelgl,
1438 "glwin-pointer-scroll", G_CALLBACK(on_glwin_pointer_scoll), this_proj -> modelgl);
1439 }
1440 else
1441 {
1442 add_widget_gesture_and_key_action (this_proj -> modelgl -> plot, "glwin-button-pressed", G_CALLBACK(on_lib_button_pressed), this_proj -> modelgl,
1443 "glwin-button-released", G_CALLBACK(on_lib_button_released), this_proj -> modelgl,
1444 NULL, NULL, NULL,
1445 "glwin-pointer-motion", G_CALLBACK(on_glwin_pointer_motion), this_proj -> modelgl,
1446 NULL, NULL, NULL);
1447 }
1448#else
1449 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "motion-notify-event", G_CALLBACK(on_motion), this_proj -> modelgl);
1450 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "button-release-event", G_CALLBACK(on_glwin_button_event), this_proj -> modelgl);
1451 if (load)
1452 {
1453 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "button-press-event", G_CALLBACK(on_glwin_button_event), this_proj -> modelgl);
1454 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "scroll-event", G_CALLBACK(on_scrolled), this_proj -> modelgl);
1455 }
1456 else
1457 {
1458 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "button-press-event", G_CALLBACK(on_lib_pressed), this_proj -> modelgl);
1459 }
1460#endif
1461 if (load)
1462 {
1463 add_box_child_start (GTK_ORIENTATION_VERTICAL, gl_vbox, this_proj -> modelgl -> plot, FALSE, TRUE, 0);
1464#ifdef GTK3
1465 g_signal_connect (G_OBJECT (this_proj -> modelgl -> win), "key-press-event", G_CALLBACK(on_key_pressed), this_proj -> modelgl);
1466#endif
1467 g_signal_connect (G_OBJECT (this_proj -> modelgl -> win), "realize", G_CALLBACK(on_win_realize), this_proj -> modelgl);
1469 {
1470#ifdef GTK4
1471 g_signal_connect (G_OBJECT (this_proj -> modelgl -> win), "close-request", G_CALLBACK(do_not_hide), NULL);
1472#else
1473 g_signal_connect (G_OBJECT (this_proj -> modelgl -> win), "delete-event", G_CALLBACK(do_not_hide), NULL);
1474#endif
1475 }
1476 else
1477 {
1478 add_gtk_close_event (this_proj -> modelgl -> win, G_CALLBACK(hide_this_window), NULL);
1479 }
1480 }
1481 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "realize", G_CALLBACK(on_realize), this_proj -> modelgl);
1482#ifdef GTKGLAREA
1483 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "render", G_CALLBACK(on_expose), this_proj -> modelgl);
1484#else
1485 g_signal_connect (G_OBJECT (this_proj -> modelgl -> plot), "draw", G_CALLBACK(on_expose), this_proj -> modelgl);
1486#endif
1487 return TRUE;
1488 }
1489}
1490
1498void prep_model (int p)
1499{
1500 project * this_proj = get_project_by_id (p);
1501 gboolean adv_bonding[2];
1502 if (this_proj -> modelgl == NULL)
1503 {
1504 if (create_3d_model (p, TRUE))
1505 {
1506 /*GtkWidget * dummy = create_menu_item (FALSE, "Dummy");
1507 gtk_menu_shell_append ((GtkMenuShell *)this_proj -> modelgl -> menu_bar, dummy);
1508 show_the_widgets (this_proj -> modelgl -> win);
1509 destroy_this_widget (dummy);*/
1510 show_the_widgets (this_proj -> modelgl -> win);
1511 }
1512 if (this_proj -> initgl)
1513 {
1515#ifdef GTK3
1516 // GTK3 Menu Action To Check
1517 active_glwin -> ogl_box_axis[0] = g_malloc0(OGL_BOX*sizeof*active_glwin -> ogl_box_axis[0]);
1518 active_glwin -> ogl_box_axis[1] = g_malloc0(OGL_AXIS*sizeof*active_glwin -> ogl_box_axis[1]);
1519#endif
1521#ifdef GTK3
1522 GtkWidget * menu = gtk_menu_bar_new ();
1523 gtk_menu_shell_append ((GtkMenuShell *)menu, menu_item_new_with_submenu (_("Help"), TRUE, menu_help(active_glwin, 0)));
1524 add_box_child_end (active_glwin -> menu_box, menu, FALSE, FALSE, 0);
1525 show_the_widgets (menu);
1526#endif
1527 if (reading_input)
1528 {
1529 adv_bonding[0] = (active_project -> natomes > ATOM_LIMIT) ? 0 : tmp_adv_bonding[0];
1530 adv_bonding[1] = (active_project -> steps > reading_step_limit) ? 0 : tmp_adv_bonding[1];
1532 mol_update = (trigger_molecule_analysis) ? 1 : (frag_update) ? ((active_project -> steps > reading_step_limit) ? 0 : 1) : 0;
1533 }
1534 else
1535 {
1536 frag_update = (force_mol || trigger_fragment_analysis) ? 1 : (active_project -> natomes > ATOM_LIMIT) ? 0 : 1;
1537 mol_update = (force_mol || trigger_molecule_analysis) ? 1 : (frag_update) ? ((active_project -> steps > STEP_LIMIT) ? 0 : 1) : 0;
1538 adv_bonding[0] = adv_bonding[1] = TRUE;
1539 }
1540 if (active_project -> natomes && adv_bonding[0] && adv_bonding[1])
1541 {
1542 bonds_update = 1;
1543 active_project -> runc[0] = FALSE;
1544 on_calc_bonds_released (NULL, NULL);
1545 }
1546 }
1547 }
1548 else
1549 {
1550 if (gtk_widget_get_visible(this_proj -> modelgl -> win))
1551 {
1552 hide_the_widgets (this_proj -> modelgl -> win);
1553 }
1554 else
1555 {
1556 show_the_widgets (this_proj -> modelgl -> win);
1557 }
1558 }
1559}
gchar * action_name[5]
Definition atom_edit.c:60
gchar * action_atoms[3]
Definition atom_edit.c:61
GtkWidget * coord_menu(glwin *view)
int is_selected
Definition popup.c:181
void restore_color_map(glwin *view, int *colm)
restore saved color maps
Definition bdcall.c:98
int * save_color_map(glwin *view)
save atoms and polyhedra color maps
Definition bdcall.c:82
gboolean force_mol
Definition calc.c:71
int selected_aspec
Definition popup.c:179
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:65
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:2242
gboolean reading_input
Definition global.c:186
int mol_update
Definition global.c:175
gchar * PACKAGE_IMG
Definition global.c:92
gboolean tmp_adv_bonding[2]
Definition global.c:187
int frag_update
Definition global.c:174
GtkWidget * MainWindow
Definition global.c:207
int bonds_update
Definition global.c:173
gchar * mode_name[2]
Definition global.c:141
int atomes_visual
Definition global.c:168
#define i18n(String)
Definition global.c:80
gchar * PACKAGE_MOL
Definition global.c:102
int reading_step_limit
Definition global.c:172
GtkWidget * pop
Definition global.c:210
int tmp_pixels[2]
Definition global.c:177
gboolean atomes_from_libreoffice
Definition global.c:195
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_NONE
Definition global.h:276
@ IMG_STOCK
Definition global.h:280
@ IMG_FILE
Definition global.h:279
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:215
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:636
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:486
cell_info * active_cell
Definition project.c:50
project * proj
int get_widget_height(GtkWidget *widg)
retrive GtkWidget height
Definition gtk-misc.c:2589
#define BSEP
Definition global.h:261
void opengl_project_changed(int id)
change the OpenGL project
Definition update_p.c:296
G_MODULE_EXPORT gboolean hide_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
hide a GtkWindow
Definition gtk-misc.c:2541
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:2557
#define STEP_LIMIT
Definition global.h:293
G_MODULE_EXPORT void on_calc_bonds_released(GtkWidget *widg, gpointer data)
compute bonding properties
Definition bdcall.c:559
@ CONTAINER_WIN
Definition global.h:266
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:340
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
#define FULLSCREEN
Definition global.h:214
GtkWidget * create_menu_item(gboolean add_mnemo, gchar *action)
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
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:318
tint cut_sel
Definition gui.c:147
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:224
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:837
project * active_project
Definition project.c:47
void update_rings_menus(glwin *view)
atomic_object * copied_object
Definition glwindow.c:124
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
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:1797
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:749
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
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:890
void zoom(glwin *view, int delta)
zoom in or zoom out in the OpenGL window
Definition glview.c:1028
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:874
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:1013
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:997
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:1077
G_MODULE_EXPORT gboolean on_expose(GtkWidget *widg, cairo_t *cr, gpointer data)
OpenGL rendering widget expose event callback GTK3.
Definition glview.c:1854
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
image * plot
Definition ogl_draw.c:72
#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:4019
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
#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:824
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:840
void set_color_map_sensitive(glwin *view)
void window_encode(glwin *view, gboolean video)
encoding a movie - creating the dialog
Definition w_encode.c:449
G_MODULE_EXPORT void coord_properties(GtkWidget *widg, gpointer data)
create the environments configuration window
Definition w_coord.c:1457
G_MODULE_EXPORT void set_style(GtkWidget *widg, gpointer data)
set style callback
Definition m_style.c:209
gchar * opengl_group_names[]
Definition glwindow.c:128
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:565
gchar * opengl_section_names[]
Definition glwindow.c:126
G_MODULE_EXPORT void set_selection_mode(GtkWidget *widg, gpointer data)
set selection mode callback
Definition m_tools.c:141
int opengl_shortcut_by_group[]
Definition glwindow.c:131
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:338
void prep_model(int p)
prepare, or display, the OpenGL model window
Definition glwindow.c:1498
G_MODULE_EXPORT void opengl_advanced(GtkWidget *widg, gpointer data)
create OpenGL rendering advanced window
Definition w_advance.c:1733
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:1255
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)
void set_render(gpointer data)
set OpenGL rendering mode callback
Definition m_render.c:48
G_MODULE_EXPORT void on_win_realize(GtkWidget *widg, gpointer data)
realize event for the OpenGL window
Definition glwindow.c:1270
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:183
G_MODULE_EXPORT void add_object(GtkWidget *widg, gpointer data)
add object call back GTK3
Definition popup.c:717
G_MODULE_EXPORT void copy_the_atoms(GtkWidget *widg, gpointer data)
copy selected atom(s) callback GTK3
Definition popup.c:1374
void prepare_opengl_menu_bar(glwin *view)
update the OpenGL window menu bar
Definition glwindow.c:611
G_MODULE_EXPORT void view_shortcuts(GtkWidget *widg, gpointer data)
OpenGL window shortcuts callback GTK3.
Definition glwindow.c:468
G_MODULE_EXPORT void label_unlabel_atoms(GtkWidget *widg, gpointer data)
label / unlabel a type of atom(s) callback GTK3
Definition popup.c:1522
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
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:1570
void change_color_map(glwin *view, int col)
change atom / polyhedra color map
Definition glwindow.c:656
gboolean create_3d_model(int p, gboolean load)
Definition glwindow.c:1353
G_MODULE_EXPORT void to_reset_view(GtkWidget *widg, gpointer data)
reset view callback - GTK3
Definition m_rep.c:275
G_MODULE_EXPORT gboolean do_not_hide(GtkWidget *win, GdkEvent *event, gpointer data)
revent to hide the OpenGL window in LibreOffice mode
Definition glwindow.c:1347
shortcuts opengl_shortcuts[]
Definition glwindow.c:135
G_MODULE_EXPORT void window_measures(GtkWidget *widg, gpointer data)
create the measurements window
Definition w_measures.c:734
G_MODULE_EXPORT void render_gl_image(GtkWidget *widg, gpointer data)
render image from the OpenGL window
Definition glwindow.c:442
G_MODULE_EXPORT void set_mode(GtkWidget *widg, gpointer data)
set mouse mode callback
Definition m_tools.c:180
vec3_t get_insertion_coordinates(glwin *view)
get the insertion coordinates to insert object in the 3D window
Definition glwindow.c:806
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:1103
G_MODULE_EXPORT void edit_in_new_project(GtkWidget *widg, gpointer data)
create new project using selection callback GTK3
Definition popup.c:2209
G_MODULE_EXPORT void spin_stop(GtkButton *but, gpointer data)
stop spin
Definition w_spiner.c:155
void set_this_style(glwin *view, int style)
set general style for atom(s) and bond(s)
Definition m_style.c:293
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:713
mat4_t insert_projection(glwin *view)
calculate the insertion projection matrix to insert object in the 3D window
Definition glwindow.c:772
int opengl_group_by_section[]
Definition glwindow.c:127
G_MODULE_EXPORT void remove_the_atoms(GtkWidget *widg, gpointer data)
remove selected atom(s) callback GTK3
Definition popup.c:1316
GLXContext glcontext
gboolean trigger_fragment_analysis
Definition image.c:80
gboolean trigger_molecule_analysis
Definition image.c:81
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:800
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:366
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_rep(glwin *view, int popm)
create 'View -> Representation' submenu items - GTK4
Definition m_rep.c:743
GMenu * menu_view(glwin *view, int popm)
create the 'View' submenu - GTK4
Definition m_rep.c:809
GMenu * menu_style(glwin *view, int popm)
create the 'OpenGL -> Style' submenu - GTK4
Definition m_style.c:479
GMenu * menu_tools(glwin *view, int popm)
create the 'Tools' submenu - GTK4
Definition m_tools.c:778
Data structure declarations for movie encoding Function declarations for movie encoding.
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:220
GtkWidget * prep_rings_menu(glwin *view, int id)
Definition glwin.h:332
Definition glwin.h:350
Definition glwin.h:967
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:173
GdkPixbuf * pix
Definition workspace.c:69
GtkWidget * img
Definition workspace.c:70