97 i = this_proj -> natomes;
101 for (j=0; j<this_proj -> natomes; j++)
106 if (i == 0)
return NULL;
112 for (i=0; i<this_proj -> natomes; i++)
114 coords[i][0] = this_proj ->
atoms[0][i].x;
115 coords[i][1] = this_proj ->
atoms[0][i].y;
116 coords[i][2] = this_proj ->
atoms[0][i].z;
121 for (j=0; j<this_proj -> natomes; j++)
125 coords[i][0] = this_proj ->
atoms[0][j].x;
126 coords[i][1] = this_proj ->
atoms[0][j].y;
127 coords[i][2] = this_proj ->
atoms[0][j].z;
147 if (this_proj -> modelgl -> saved_coord[
status] != NULL)
149 for (j=0; j<this_proj -> natomes; j++)
153 this_proj ->
atoms[0][j].x = this_proj -> modelgl -> saved_coord[
status][i][0];
154 this_proj ->
atoms[0][j].y = this_proj -> modelgl -> saved_coord[
status][i][1];
155 this_proj ->
atoms[0][j].z = this_proj -> modelgl -> saved_coord[
status][i][2];
172 vec3_t bar = vec3(0.0,0.0,0.0);
175 for (j=0; j<this_proj -> natomes; j++)
180 bar = v3_add (bar, vec3(this_proj ->
atoms[0][j].
x, this_proj ->
atoms[0][j].
y, this_proj ->
atoms[0][j].
z));
183 if (i > 0.0) bar = v3_divs (bar, i);
206 this_proj -> modelgl -> atom_win -> new_param[
status][i][j] = this_proj -> modelgl -> edition_param[
status][i][j];
207 this_proj -> modelgl -> atom_win -> old_param[
status][i][j] = this_proj -> modelgl -> edition_param[
status][i][j];
210 this_proj -> modelgl -> atom_win ->
axis[
status] = 1;
234 for (i=0; i<this_proj -> steps; i++)
236 for (j=0; j<this_proj -> natomes; j++)
240 c_old = vec3(this_proj ->
atoms[i][j].
x, this_proj ->
atoms[i][j].
y, this_proj ->
atoms[i][j].
z);
243 c_new = m4_mul_pos (this_proj -> modelgl -> view_matrix, c_old);
244 c_old = v3_add (c_new, trans);
245 c_new = m4_mul_pos (this_proj -> modelgl -> un_view_matrix, c_old);
249 c_new = v3_add (c_old, trans);
251 this_proj ->
atoms[i][j].x = c_new.
x;
252 this_proj ->
atoms[i][j].y = c_new.
y;
253 this_proj ->
atoms[i][j].z = c_new.
z;
272 mat4_t rot = m4_quat_rotation (q);
274 for (j=0; j<this_proj -> natomes; j++)
278 c_old = vec3(this_proj ->
atoms[0][j].
x, this_proj ->
atoms[0][j].
y, this_proj ->
atoms[0][j].
z);
279 c_new = v3_sub(c_old, this_proj -> modelgl -> baryc[
status]);
282 c_old = m4_mul_pos (this_proj -> modelgl -> view_matrix, c_new);
283 c_new = m4_mul_pos (rot, c_old);
284 c_old = m4_mul_pos (this_proj -> modelgl -> un_view_matrix, c_new);
288 c_old = m4_mul_pos (rot, c_new);
290 c_new = v3_add (c_old, this_proj -> modelgl -> baryc[
status]);
291 this_proj ->
atoms[0][j].x = c_new.
x;
292 this_proj ->
atoms[0][j].y = c_new.
y;
293 this_proj ->
atoms[0][j].z = c_new.
z;
313 ax[0] = vec3(1.0,0.0,0.0);
314 ax[1] = vec3(0.0,1.0,0.0);
315 ax[2] = vec3(0.0,0.0,1.0);
316 qr = axis_to_quat(
ax[raxis-3],
param*
pi/90.0);
332 clock_t begin = clock();
337 k = (j+1)*i*aid*(3*this_proj -> numwid);
340 l = (prob <= 0.5) ? 1 : -1;
345 this_proj ->
atoms[0][aid].x += l*prob*sqrt(this_proj -> modelgl -> atom_win ->
msd[aid]/3.0);
348 this_proj ->
atoms[0][aid].y += l*prob*sqrt(this_proj -> modelgl -> atom_win ->
msd[aid]/3.0);
351 this_proj ->
atoms[0][aid].z += l*prob*sqrt(this_proj -> modelgl -> atom_win ->
msd[aid]/3.0);
369 int i, j, k, l, m, n;
372 ax[0] = vec3(1.0,0.0,0.0);
373 ax[1] = vec3(0.0,1.0,0.0);
374 ax[2] = vec3(0.0,0.0,1.0);
375 vec3_t baryc = vec3(
object -> baryc[0],
object -> baryc[1],
object -> baryc[2]);
379 clock_t begin = clock();
384 k = (j+1)*i*(3*this_proj -> numwid);
387 l = (prob <= 0.5) ? 1 : -1;
389 qr = axis_to_quat(
ax[j], l*prob*sqrt(ratio*
msd/3.0)*
pi/90.0);
390 rot = m4_quat_rotation (qr);
391 for (m=0; m<
object ->
atoms; m++)
393 n =
object -> at_list[m].id;
396 c_old = vec3(
object -> at_list[m].
x,
object -> at_list[m].
y,
object -> at_list[m].
z);
397 c_new = m4_mul_pos (rot, c_old);
398 object -> at_list[m].x = c_new.
x;
399 object -> at_list[m].y = c_new.
y;
400 object -> at_list[m].z = c_new.
z;
401 c_old = v3_add (c_new, baryc);
402 this_proj ->
atoms[0][n].x = c_old.
x;
403 this_proj ->
atoms[0][n].y = c_old.
y;
404 this_proj ->
atoms[0][n].z = c_old.
z;
422 int i, j, k, l, m, n;
424 clock_t begin = clock();
429 k = (j+1)*i*(3*this_proj -> numwid);
432 l = (prob <= 0.5) ? 1 : -1;
437 for (m=0; m<
object ->
atoms; m++)
439 n =
object -> at_list[m].id;
444 for (m=0; m<
object ->
atoms; m++)
446 n =
object -> at_list[m].id;
451 for (m=0; m<
object ->
atoms; m++)
453 n =
object -> at_list[m].id;
458 object -> baryc[j] += prob;
476 clock_t begin = clock();
488 j =
object -> species*i*
object ->
atoms*(3*this_proj -> numwid);
507 this_proj -> modelgl -> atom_win -> rebuilt[(asearch ->
action ==
DISPL) ? 0 : 1] = TRUE;
524 gboolean was_frag = this_proj -> modelgl -> adv_bonding[0];
525 gboolean was_mol = this_proj -> modelgl -> adv_bonding[1];
526 gboolean recons = FALSE;
527 int old_frag = this_proj -> coord -> totcoord[2];
529 if (asearch ->
object && this_proj -> modelgl -> rebuild[0][i])
531 int * saved_todo =
duplicate_int (asearch -> todo_size, asearch -> todo);
532 int old_tds = asearch -> todo_size;
533 g_free (asearch -> todo);
537 atomic_object *
object = this_proj -> modelgl -> atom_win -> to_be_moved[i];
541 object =
object -> next;
545 object = this_proj -> modelgl -> atom_win -> to_be_moved[i];
550 for (k=0; k<
object -> ifcl; k++)
552 oifcl[l] =
object -> bcid[k];
555 object =
object -> next;
564 object = this_proj -> modelgl -> atom_win -> to_be_moved[i];
571 for (j=0; j<
object ->
atoms; j++)
573 k =
object -> at_list[j].id;
574 asearch -> todo[k] = 1;
577 object =
object -> next;
584 g_free (asearch -> todo);
586 asearch -> todo_size = old_tds;
589 if ((was_frag && ! this_proj -> modelgl -> adv_bonding[0]) || (was_mol && ! this_proj -> modelgl -> adv_bonding[1]))
593 else if (old_frag != this_proj -> coord -> totcoord[2])
616 atomic_object *
object = this_proj -> modelgl -> atom_win -> to_be_moved[1];
619 gboolean recons = FALSE;
620 if (! this_proj -> modelgl -> atom_win -> rebuilt[1])
625 for (i=0; i<numo; i++)
627 if (asearch -> todo[i] &&
object)
629 v = (obj &&
filter > 2) ? this_proj -> modelgl -> atom_win -> msd_all[i] : this_proj -> modelgl -> atom_win ->
msd[i];
632 for (j=0; j<this_proj -> modelgl -> atom_win ->
repeat_move; j++)
636 for (j=0; j<
object ->
atoms; j++)
638 k =
object -> at_list[j].id;
642 object =
object -> next;
662 gboolean recons = FALSE;
663 if (this_proj -> modelgl -> atom_win -> to_be_moved[1])
669 if (this_proj -> modelgl -> rebuild[0][1] && ! this_proj -> modelgl -> atom_win -> rebuilt[1])
674 for (i=0; i<asearch -> todo_size; i++)
676 if (asearch -> todo[i] && this_proj -> modelgl -> atom_win ->
msd[i] > 0.0)
682 if (asearch -> recompute_bonding)
694 this_proj -> modelgl ->
was_moved = TRUE;
716 c_old = vec3(this_proj ->
atoms[0][aid].
x, this_proj ->
atoms[0][aid].
y, this_proj ->
atoms[0][aid].
z);
719 c_new = m4_mul_pos (this_proj -> modelgl -> view_matrix, c_old);
720 c_old = v3_add (c_new, trans);
721 c_new = m4_mul_pos (this_proj -> modelgl -> un_view_matrix, c_old);
725 c_new = v3_add (c_old, trans);
727 this_proj ->
atoms[0][aid].x = c_new.
x;
728 this_proj ->
atoms[0][aid].y = c_new.
y;
729 this_proj ->
atoms[0][aid].z = c_new.
z;
746 c_old = vec3(
object -> baryc[0],
object -> baryc[1],
object -> baryc[2]);
749 c_new = m4_mul_pos (this_proj -> modelgl -> view_matrix, c_old);
750 c_old = v3_add (c_new, trans);
751 c_new = m4_mul_pos (this_proj -> modelgl -> un_view_matrix, c_old);
755 c_new = v3_add (c_old, trans);
757 object -> baryc[0] = c_new.
x;
758 object -> baryc[1] = c_new.
y;
759 object -> baryc[2] = c_new.
z;
760 for (i=0; i<
object ->
atoms; i++)
762 j =
object -> at_list[i].id;
766 this_proj ->
atoms[0][j].x =
object -> baryc[0] +
object -> at_list[i].x;
767 this_proj ->
atoms[0][j].y =
object -> baryc[1] +
object -> at_list[i].y;
768 this_proj ->
atoms[0][j].z =
object -> baryc[2] +
object -> at_list[i].z;
788 vec3_t baryc = vec3(
object -> baryc[0],
object -> baryc[1],
object -> baryc[2]);
790 ax[0] = vec3(1.0,0.0,0.0);
791 ax[1] = vec3(0.0,1.0,0.0);
792 ax[2] = vec3(0.0,0.0,1.0);
795 qr = axis_to_quat(
ax[rax], ang*
pi/180.0);
796 rot = m4_quat_rotation (qr);
797 for (i=0; i<
object ->
atoms; i++)
799 j =
object -> at_list[i].id;
802 c_old = vec3(
object -> at_list[i].
x,
object -> at_list[i].
y,
object -> at_list[i].
z);
805 c_new = m4_mul_pos (this_proj -> modelgl -> view_matrix, c_old);
806 c_old = m4_mul_pos (rot, c_new);
807 c_new = m4_mul_pos (this_proj -> modelgl -> un_view_matrix, c_old);
811 c_new = m4_mul_pos (rot, c_old);
813 object -> at_list[i].x = c_new.
x;
814 object -> at_list[i].y = c_new.
y;
815 object -> at_list[i].z = c_new.
z;
816 c_old = v3_add (c_new, baryc);
817 this_proj ->
atoms[0][j].x = c_old.
x;
818 this_proj ->
atoms[0][j].y = c_old.
y;
819 this_proj ->
atoms[0][j].z = c_old.
z;
839 gboolean recons = FALSE;
840 if (this_proj -> modelgl -> rebuild[0][0] && ! this_proj -> modelgl -> atom_win -> rebuilt[0])
844 atomic_object *
object = this_proj -> modelgl -> atom_win -> to_be_moved[0];
857 for (i=0; i<
object ->
atoms; i++)
859 j =
object -> at_list[i].id;
862 object =
object -> next;
884 gboolean recons = FALSE;
889 if (this_proj -> modelgl -> atom_win -> to_be_moved[0])
895 if (this_proj -> modelgl -> rebuild[0][0] && ! this_proj -> modelgl -> atom_win -> rebuilt[0])
900 for (i=0; i<asearch -> todo_size; i++)
902 if (asearch -> todo[i])
908 if (asearch -> recompute_bonding)
941 vec3_t trans = vec3(this_proj -> modelgl -> atom_win -> new_param[
status][
axis][0]-this_proj -> modelgl -> atom_win -> old_param[
status][
axis][0],
942 this_proj -> modelgl -> atom_win -> new_param[
status][
axis][1]-this_proj -> modelgl -> atom_win -> old_param[
status][
axis][1],
943 this_proj -> modelgl -> atom_win -> new_param[
status][
axis][2]-this_proj -> modelgl -> atom_win -> old_param[
status][
axis][2]);
945 if (v3_length(trans) != 0.0 || r != 0.0)
948 this_proj -> modelgl ->
was_moved = TRUE;
951 update (this_proj -> modelgl);
966 this_proj -> modelgl -> atom_win ->
repeat_move = gtk_spin_button_get_value_as_int(
res);
982 this_proj -> modelgl -> atom_win -> new_param[i][j][k]);
983 gtk_range_set_value (GTK_RANGE(this_proj -> modelgl -> atom_win -> edit_scale[k]),
984 this_proj -> modelgl -> atom_win -> new_param[i][j][k]);
999 int plimit = (int)(view -> anim -> last ->
img -> p_depth/
limit[
mot]);
1022 i = (h < 3) ? 0 : 1;
1023 j = this_proj -> modelgl -> atom_win ->
axis[i];
1024 k = this_proj -> modelgl -> search_widg[
id ->
c] ->
status;
1025 if (v != this_proj -> modelgl -> atom_win -> new_param[k][j][h])
1027 float plim =
get_limit (i, this_proj -> modelgl);
1028 if (v >= -plim && v <= plim)
1030 this_proj -> modelgl -> atom_win -> new_param[k][j][h] = v;
1031 this_proj -> modelgl -> atom_win -> active = i;
1076G_MODULE_EXPORT gboolean
scroll_range_move (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
1096 this_proj -> modelgl -> atom_win ->
axis[j] = gtk_combo_box_get_active (box);
1097 for (i=3*j; i<(j + 1)*3; i++)
1101 this_proj -> modelgl -> atom_win -> active = j;
1102 update (this_proj -> modelgl);
1132 i = gtk_check_button_get_active (but);
1133 gtk_check_button_set_active (GTK_CHECK_BUTTON(this_proj -> modelgl -> atom_win -> axis_but[! j]), i);
1135 i = gtk_toggle_button_get_active (but);
1136 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(this_proj -> modelgl -> atom_win -> axis_but[! j]), i);
1138 this_proj -> modelgl -> atom_win -> active = j;
1139 this_proj -> modelgl -> atom_win ->
show_axis[j] = i;
1146 this_proj -> modelgl -> anim -> last ->
img -> box_axis[
AXIS] = this_proj -> modelgl -> atom_win -> old_axis;
1148 this_proj -> modelgl -> create_shaders[
MAXIS] = TRUE;
1149 update (this_proj -> modelgl);
1164 if (this_proj -> modelgl -> atom_win)
1168 if (this_proj -> modelgl -> atom_win -> edit_entry[i])
1170 widget_set_sensitive (this_proj -> modelgl -> atom_win -> edit_entry[i], (((asearch ->
object && ! asearch -> passivating ) || (asearch ->
object > 1 && asearch -> passivating)) || i < 3) ? activate : 0);
1172 if (this_proj -> modelgl -> atom_win -> edit_scale[i])
1174 widget_set_sensitive (this_proj -> modelgl -> atom_win -> edit_scale[i], (((asearch ->
object && ! asearch -> passivating ) || (asearch ->
object > 1 && asearch -> passivating)) || i < 3) ? activate : 0);
1195 gchar *
axis[3]={
"x",
"y",
"z"};
1196 gchar * unit[2]={
"<b>Å</b>",
"<b>°</b>"};
1198 int j =
mot*3 + axd;
1200 this_proj -> modelgl -> atom_win -> edit_entry[j] =
create_entry (G_CALLBACK(
set_move), 100, 15, FALSE, & asearch -> pointer[j]);
1201 this_proj -> modelgl -> atom_win -> edit_scale[j] =
create_hscale (-plim, plim, 0.001,
1202 this_proj -> modelgl -> atom_win -> new_param[asearch ->
status][1][j], GTK_POS_TOP, 4, 250,
1206 str = g_strdup_printf (
"On <b>%s</b> axis:",
axis[axd]);
1208 update_entry_double (GTK_ENTRY(this_proj -> modelgl -> atom_win -> edit_entry[j]), this_proj -> modelgl -> atom_win -> new_param[asearch ->
status][1][j]);
1212 add_box_child_start (GTK_ORIENTATION_HORIZONTAL,
hbox, this_proj -> modelgl -> atom_win -> edit_scale[j], FALSE, FALSE, 0);
1213 GtkWidget * fixed = gtk_fixed_new ();
1214 gtk_fixed_put (GTK_FIXED(fixed), this_proj -> modelgl -> atom_win -> edit_entry[j], 0, 15);
1215 gtk_fixed_put (GTK_FIXED(fixed),
lab, 120, 25);
1236 this_proj -> modelgl -> atom_win -> axis_combo[axd] =
create_combo ();
1237 combo_text_append (this_proj -> modelgl -> atom_win -> axis_combo[axd],
"Model axis");
1238 combo_text_append (this_proj -> modelgl -> atom_win -> axis_combo[axd],
"Eye (viewer) axis");
1239 gtk_combo_box_set_active (GTK_COMBO_BOX(this_proj -> modelgl -> atom_win -> axis_combo[axd]),
1240 this_proj -> modelgl -> atom_win ->
axis[axd]);
1241 g_signal_connect (G_OBJECT (this_proj -> modelgl -> atom_win -> axis_combo[axd]),
"changed", G_CALLBACK(
set_axis_for_motion), & asearch -> pointer[axd]);
1242 add_box_child_start (GTK_ORIENTATION_HORIZONTAL,
hbox, this_proj -> modelgl -> atom_win -> axis_combo[axd], FALSE, FALSE, 20);
1244 add_box_child_start (GTK_ORIENTATION_HORIZONTAL,
hbox, this_proj -> modelgl -> atom_win -> axis_but[axd], FALSE, FALSE, 20);
void apply_action(project *this_proj, atom_search *asearch)
apply edition action
gboolean do_we_have_objects_in_selection(project *this_proj, atom_search *asearch, gboolean editing)
check for object(s) in selection to apply action
void clean_all_trees(atom_search *asearch, project *this_proj)
clean all tree models in the 'model edition' window
Function declarations for the mode edition window.
int get_asearch_object(atom_search *asearch)
get the number of object(s) in this atom search
void update_search_tree(atom_search *asearch)
update search tree
void reconstruct_coordinates_for_object(project *this_proj, atomic_object *this_object, gboolean upcoord)
reconstruct object atomic coordinates using PBC
int get_asearch_filter(atom_search *asearch)
get asearch filter
void check_all_trees(project *this_proj)
check all search trees
void allocate_todo(atom_search *asearch, int tsize)
allocate the selection list data buffer
void reconstruct_bonds(project *this_proj, int ifcl, int *bcid)
reconstruct the project bond(s)/clone(s) lists after reconstruction using PBC
void random_translate_this_object(project *this_proj, atomic_object *object, double ratio, double msd)
random translate an object
void rotate(project *this_proj, int status, int axis, int raxis, float param)
rotate
void translate_this_object(project *this_proj, atomic_object *object, int axis, vec3_t trans)
translate object
G_MODULE_EXPORT gboolean scroll_range_move(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
motion callback - scroll
double ** save_coordinates(project *this_proj, int status)
save atomic coordinates
void trigger_refresh(project *this_proj, atom_search *asearch)
refresh search tree model
gboolean rebuild_selection(project *this_proj, atom_search *asearch, int filter)
rebuild selection (split fragments linked thru PBC)
G_MODULE_EXPORT void set_show_motion_axis(GtkToggleButton *but, gpointer data)
set show / hide motion axis toggle callback GTK3
G_MODULE_EXPORT void set_move(GtkEntry *res, gpointer data)
motion callback - entry
float get_limit(int mot, glwin *view)
get motion limit
atom_search * duplicate_atom_search(atom_search *asearch)
duplicate atom search data structure
G_MODULE_EXPORT void repeat_move(GtkSpinButton *res, gpointer data)
repeat motion callback
gboolean random_move_objects(project *this_proj, atom_search *asearch, int numo, int filter, int obj)
random move object(s)
void random_move_this_atom(project *this_proj, int aid)
random move atom
void init_coordinates(project *this_proj, int status, gboolean win, gboolean init)
preserve atomic coordinates
void random_move(project *this_proj, atom_search *asearch)
random move
void random_rotate_this_object(project *this_proj, atomic_object *object, double ratio, double msd)
random rotate an object
void reset_coordinates(project *this_proj, int status)
reset transformation and restore saved atomic coordinates
void move_selection(project *this_proj, int action, int axis, vec3_t trans, float ang)
move atom selection
GtkWidget * add_motion_interaction(atom_search *asearch, int axd, project *this_proj)
add motion interaction widgets
void translate(project *this_proj, int status, int axis, vec3_t trans)
translate
void range_has_changed(gpointer data, double v)
motion
G_MODULE_EXPORT void range_move(GtkRange *range, gpointer data)
motion callback - range
void rotate_quat(project *this_proj, vec4_t q, int status, int axis)
rotate using quaternion
gboolean * was_moved_atom
void update_coordinates(project *this_proj, int status, int axis, int action)
update atomic coordinates on motion
vec3_t get_bary(project *this_proj, int status)
get barycenter of atomic coordinates
void update_range_and_entry(project *this_proj, int i, int j, int k)
update motion range
GtkWidget * create_axis_entries(atom_search *asearch, project *this_proj, int mot, int axd)
create axis entries
gboolean move_objects(project *this_proj, atom_search *asearch, int action, int axis, vec3_t trans, float ang)
move objects, return reconstruction status
void translate_this_atom(project *this_proj, int aid, int axis, vec3_t trans)
translate atom
void rotate_this_object(project *this_proj, atomic_object *object, int axis, int rax, float ang)
rotate object
void check_motion_interactors(project *this_proj, atom_search *asearch)
add motion check button
void random_move_this_object(project *this_proj, atomic_object *object, int move, double msd)
random move object
G_MODULE_EXPORT void set_axis_for_motion(GtkComboBox *box, gpointer data)
set motion axis (eye or model)
GtkFileFilter * filter[NCFORMATS+1]
void init_default_shaders(glwin *view)
re-initialize the default OpenGL shaders
int * duplicate_int(int num, int *old_val)
copy a list of int
gboolean * allocbool(int val)
allocate a gboolean * pointer
double ** allocddouble(int xal, int yal)
allocate a double ** pointer
int * allocint(int val)
allocate an int * pointer
double string_to_double(gpointer string)
convert string to double
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
#define ATOM_LIMIT
atom number limit to compute fragment(s) and molecule(s) analysis automatically
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
G_MODULE_EXPORT void on_calc_bonds_released(GtkWidget *widg, gpointer data)
compute bonding properties
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
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.
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
GtkWidget * create_hscale(float min, float max, float delta, float val, int pos, int round, int size, GCallback handler, GCallback scroll_handler, gpointer data)
create an horizontal scale GtkWidget
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
project * get_project_by_id(int p)
get project pointer using id number
void update(glwin *view)
update the rendering of the OpenGL window
void set_advanced_bonding_menus(glwin *view)
integer(kind=c_int) function msd(dlt, ndts)
void active_project_changed(int id)
change the active project