atomes 1.2.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
gtk-misc.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
24/*
25* This file: 'gtk-misc.c'
26*
27* Contains:
28*
29
30 - GTK3/GTK4 utility subroutines, instead of having pre-processor flags everywhere in the code
31 Whenever I need to use a GTK function that changed between v3 and v4,
32 I created an home made function declared in this file, and deal then here with the potential GTK versions issues.
33
34*
35* List of functions:
36
37 gboolean is_the_widget_visible (GtkWidget * widg);
38 gboolean file_chooser_set_file_name (GtkFileChooser * chooser, gchar * filename);
39
40 G_MODULE_EXPORT gboolean to_activate_entry (GtkWidget * widg, GdkEventFocus * event, gpointer data);
41 G_MODULE_EXPORT gboolean destroy_this_window (GtkWindow * win, gpointer data);
42 G_MODULE_EXPORT gboolean destroy_this_window (GtkWidget * win, GdkEvent * event, gpointer data);
43 G_MODULE_EXPORT gboolean hide_this_window (GtkWindow * win, gpointer data);
44 G_MODULE_EXPORT gboolean hide_this_window (GtkWidget * win, GdkEvent * event, gpointer data);
45
46 gchar * file_chooser_get_file_name (GtkFileChooser * chooser);
47 gchar * file_chooser_get_current_folder (GtkFileChooser * chooser);
48
49 const gchar * entry_get_text (GtkEntry * entry);
50
51 void show_the_widgets (GtkWidget * widg);
52 void hide_the_widgets (GtkWidget * widg);
53 void widget_set_sensitive (GtkWidget * widg, gboolean sensitive);
54 void add_container_child (int type, GtkWidget * widg, GtkWidget * child);
55 void add_box_child_end (GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding);
56 void add_box_child_start (int orientation, GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding);
57 void add_widget_gesture_and_key_action (GtkWidget * widget,
58 gchar * cp_name, GCallback cp_handler, gpointer cp_data,
59 gchar * cr_name, GCallback cr_handler, gpointer cr_data,
60 gchar * kp_name, GCallback kp_handler, gpointer kp_data,
61 gchar * mo_name, GCallback mo_handler, gpointer mo_data,
62 gchar * sc_name, GCallback sc_handler, gpointer sc_data);
63 void run_this_gtk_native_dialog (GtkNativeDialog * dial, GCallback handler, gpointer data);
64 void run_this_gtk_dialog (GtkWidget * dial, GCallback handler, gpointer data);
65 void resize_this_window (GtkWidget * window, int x, int y);
66 void button_set_status (GtkWidget * button, int status);
67 void update_entry_int (GtkEntry * entry, int intval);
68 void update_entry_double (GtkEntry * entry, double doubleval);
69 void update_entry_long_double (GtkEntry * entry, double doubleval);
70 void update_entry_text (GtkEntry * entry, gchar * text);
71 void text_view_set_monospace (GtkWidget * view);
72 void gtk_label_align (GtkWidget * lab, float ax, float ay);
73 void layout_add_widget (GtkWidget * layout, GtkWidget * child, int x_pos, int y_pos);
74 void combo_set_markup (GtkWidget * combo);
75 void combo_set_active (GtkWidget * combo, int pos);
76 void combo_text_append (GtkWidget * combo, gchar * text);
77 void combo_text_prepend (GtkWidget * combo, gchar * text);
78 void setup_text_tags (GtkTextBuffer * buffer);
79 void add_menu_separator (GtkWidget * menu);
80 void set_renderer_color (int tocol, GtkCellRenderer * renderer, ColRGBA col);
81 void button_set_image (GtkButton * but, gchar * text, int format, gpointer image);
82 void adjust_label (GtkWidget * lab, int dimx, int dimy, float ax, float ay);
83 void set_image_from_icon_name (GtkWidget * widg, gchar * icon);
84 void append_comments (GtkWidget * vbox, gchar * symbol, gchar * legend);
85 void provide_gtk_css (gchar * css);
86 void destroy_this_dialog (GtkDialog * dialog);
87 void destroy_this_native_dialog (GtkNativeDialog * dialog);
88 void file_chooser_set_current_folder (GtkFileChooser * chooser);
89 void set_color_chooser_color (GtkWidget * color_win, ColRGBA col);
90 void pop_menu_at_pointer (GtkWidget * pop, double x, double y);
91 void pop_menu_at_pointer (GtkWidget * widg, GdkEvent * event);
92 void add_gtk_close_event (GtkWidget * widg, GCallback handler, gpointer data);
93 static void convert_alpha (cairo_surface_t * surf, GdkPixbuf * pix, int src_x, int src_y, int width, int height);
94
95 G_MODULE_EXPORT void to_activate_entry (GtkEventControllerFocus * focus, gpointer data);
96 G_MODULE_EXPORT void run_destroy_dialog (GtkDialog * dialog, gint response_id, gpointer data);
97
98 GtkWidget * menu_item_new_with_submenu (gchar * name, gboolean active, GtkWidget * sub_menu);
99 GtkWidget * new_gtk_window ();
100 GtkWidget * create_win (gchar * str, GtkWidget * parent, gboolean modal, gboolean resiz);
101 GtkWidget * dialogmodal (gchar * str, GtkWindow * parent);
102 GtkWidget * message_dialogmodal (gchar * message, gchar * title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget * parent);
103 GtkWidget * dialog_cancel_apply (gchar * title, GtkWidget * parent, gboolean resiz);
104 GtkWidget * create_hscale (float min, float max, float delta,
105 float val, int pos, int round, int size,
106 GCallback handler, GCallback scroll_handler, gpointer data);
107 GtkWidget * create_vscale (float min, float max, float delta,
108 float val, int pos, int round, int size,
109 GCallback handler, GCallback scroll_handler, gpointer data);
110 GtkWidget * create_vbox (int spacing);
111 GtkWidget * create_hbox (int spacing);
112 GtkWidget * dialog_get_content_area (GtkWidget * widg);
113 GtkWidget * add_vbox_to_layout (GtkWidget * layout, int size_x, int size_y);
114 GtkWidget * create_layout (int x, int y);
115 GtkWidget * create_combo ();
116 GtkWidget * create_text_view (int dimx, int dimy, int edit, int mono, GCallback handler, gpointer data, gchar * text);
117 GtkWidget * create_entry (GCallback handler, int dim, int cdim, gboolean key_release, gpointer data);
118 GtkWidget * stock_image (const gchar * stock_id);
119 GtkWidget * create_menu_item (gboolean add_mnemo, gchar * name);
120 GtkWidget * create_menu_item_from_widget (GtkWidget * widg, gboolean check, gboolean radio, gboolean status);
121 GtkWidget * create_image_from_data (int format, gpointer item_image);
122 GtkWidget * gtk3_menu_item (GtkWidget * menu, gchar * name,
123 int icon_format, gpointer item_icon,
124 GCallback handler, gpointer data,
125 gboolean accel, guint key, GdkModifierType mod,
126 gboolean check, gboolean radio, gboolean status);
127 GtkWidget * add_advanced_item (GtkWidget * menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod);
128 GtkWidget * markup_label (gchar * text, int dimx, int dimy, float ax, float ay);
129 GtkWidget * color_button (ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data);
130 GtkWidget * font_button (gchar * font, int dimx, int dimy, GCallback handler, gpointer data);
131 GtkWidget * spin_button (GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data);
132 GtkWidget * check_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data);
133 GtkWidget * radio_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data);
134 GtkWidget * create_button (gchar * text, int image_format, gchar * image, int dimx, int dimy, int relief, GCallback handler, gpointer data);
135 GtkWidget * abox (GtkWidget * box, char * lab, int vspace);
136 GtkWidget * bbox (GtkWidget * box, char * lab);
137 GtkWidget * cbox (GtkWidget * box, char * lab);
138 GtkWidget * fbox (GtkWidget * box, char * lab);
139 GtkWidget * create_scroll (GtkWidget * box, int dimx, int dimy, int shadow);
140 GtkWidget * create_expander (gchar * name, gchar * file_img);
141 GtkWidget * destroy_this_widget (GtkWidget * widg);
142 GtkWidget * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name);
143 GtkWidget * get_top_level (GtkWidget * widg);
144
145 GtkTextBuffer * add_buffer (GCallback handler, gpointer data, gchar * text);
146
147 GtkFileChooserNative * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name);
148
149 GdkPixbuf * convert_to_pixbuf (cairo_surface_t * surf);
150
151 GMenuItem * create_menu_item (gboolean add_mnemo, gchar * name, gchar * action);
152
153 GListModel * file_chooser_get_file_names (GtkFileChooser * chooser);
154
155 ColRGBA * duplicate_color (int num, ColRGBA * col);
156 ColRGBA gdkrgba_to_rgba (GdkRGBA colgdk);
157 ColRGBA get_button_color (GtkColorChooser * colob);
158 ColRGBA get_window_color (GtkWidget * color_win);
159
160 GdkRGBA colrgba_togtkrgba (ColRGBA col);
161
162 int get_widget_width (GtkWidget * widg);
163 int get_widget_height (GtkWidget * widg);
164 int button_get_status (GtkWidget * button);
165
166*/
167
168#include "global.h"
169#include "interface.h"
170#include "preferences.h"
171#include "glview.h"
172
173extern void adjust_preferences_window ();
174
182void show_the_widgets (GtkWidget * widg)
183{
184#ifdef GTK4
185 gtk_widget_set_visible (widg, TRUE);
186#else
187 gtk_widget_show_all (widg);
188#endif
189}
190
198void hide_the_widgets (GtkWidget * widg)
199{
200#ifdef GTK4
201 gtk_widget_set_visible (widg, FALSE);
202#else
203 gtk_widget_hide (widg);
204#endif
205}
206
215void widget_set_sensitive (GtkWidget * widg, gboolean sensitive)
216{
217 if (widg != NULL)
218 {
219 if (GTK_IS_WIDGET(widg))
220 {
221 gtk_widget_set_sensitive (widg, sensitive);
222 }
223 }
224}
225
235void add_container_child (int type, GtkWidget * widg, GtkWidget * child)
236{
237#ifdef GTK3
238 gtk_container_add (GTK_CONTAINER(widg), child);
239#else
240 switch (type)
241 {
242 case CONTAINER_WIN:
243 // gtk_window_set_child ((GtkWindow *)widg, NULL);
244 gtk_window_set_child ((GtkWindow *)widg, child);
245 break;
246 case CONTAINER_SCR:
247 // Bug in the management of scrolled window child
248/* Frequently getting warning messages at this point with GTK4
249(atomes:?????): GLib-GObject-CRITICAL **: ??:??:??.???: g_object_set: assertion 'G_IS_OBJECT (object)' failed
250(atomes:?????): Gtk-CRITICAL **: ??:??:??.???: gtk_widget_unparent: assertion 'GTK_IS_WIDGET (widget)' failed
251*/
252 gtk_scrolled_window_set_child ((GtkScrolledWindow *)widg, NULL);
253 gtk_scrolled_window_set_child ((GtkScrolledWindow *)widg, child);
254 break;
255 case CONTAINER_VIE:
256 // gtk_viewport_set_child ((GtkViewport *)widg, NULL);
257 gtk_viewport_set_child ((GtkViewport *)widg, child);
258 break;
259 case CONTAINER_BUT:
260 // gtk_button_set_child ((GtkButton *)widg, NULL);
261 gtk_button_set_child ((GtkButton *)widg, child);
262 break;
263 case CONTAINER_FRA:
264 // gtk_frame_set_child ((GtkFrame *)widg, NULL);
265 gtk_frame_set_child ((GtkFrame *)widg, child);
266 break;
267 case CONTAINER_EXP:
268 // gtk_expander_set_child ((GtkExpander *)widg, NULL);
269 gtk_expander_set_child ((GtkExpander *)widg, child);
270 break;
271 }
272#endif
273}
274
286void add_box_child_end (GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding)
287{
288#ifdef GTK4
289 // gtk_widget_set_hexpand (child, TRUE);
290 gtk_box_append (GTK_BOX(widg), child);
291#else
292 gtk_box_pack_end (GTK_BOX(widg), child, expand, fill, padding);
293#endif
294}
295
308void add_box_child_start (int orientation, GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding)
309{
310#ifdef GTK4
311 if (orientation == GTK_ORIENTATION_HORIZONTAL && padding)
312 {
313 gtk_box_append (GTK_BOX(widg), markup_label (" ", padding, -1, 0.0, 0.0));
314 }
315 else if (orientation == GTK_ORIENTATION_VERTICAL && padding > 10)
316 {
317 gtk_box_append (GTK_BOX(widg), markup_label (" ", -1, padding/2, 0.0, 0.0));
318 }
319 gtk_box_append (GTK_BOX(widg), child);
320 if (orientation == GTK_ORIENTATION_HORIZONTAL && padding)
321 {
322 gtk_box_append (GTK_BOX(widg), markup_label (" ", padding, -1, 0.0, 0.0));
323 }
324 else if (orientation == GTK_ORIENTATION_VERTICAL && padding > 10)
325 {
326 gtk_box_append (GTK_BOX(widg), markup_label (" ", -1, padding/2, 0.0, 0.0));
327 }
328#else
329 gtk_box_pack_start (GTK_BOX(widg), child, expand, fill, padding);
330#endif
331}
332
333#ifdef GTK3
343GtkWidget * menu_item_new_with_submenu (gchar * name, gboolean active, GtkWidget * sub_menu)
344{
345 GtkWidget * item = create_menu_item (FALSE, name);
346 gtk_menu_item_set_submenu ((GtkMenuItem *)item, sub_menu);
347 widget_set_sensitive (item, active);
348 return item;
349}
350#endif
351
357GtkWidget * new_gtk_window ()
358{
359#ifdef GTK4
360 return gtk_window_new ();
361#else
362 return gtk_window_new (GTK_WINDOW_TOPLEVEL);
363#endif
364}
365
366#ifdef GTK4
394void add_widget_gesture_and_key_action (GtkWidget * widget,
395 gchar * cp_name, GCallback cp_handler, gpointer cp_data,
396 gchar * cr_name, GCallback cr_handler, gpointer cr_data,
397 gchar * kp_name, GCallback kp_handler, gpointer kp_data,
398 gchar * mo_name, GCallback mo_handler, gpointer mo_data,
399 gchar * sc_name, GCallback sc_handler, gpointer sc_data)
400{
401 GtkGesture * gesture;
402 GtkEventController * key;
403 GtkEventController * motion;
404 if (cp_name)
405 {
406 gesture = gtk_gesture_click_new ();
407 gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (gesture), cp_name);
408 gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
409 if (cp_handler) g_signal_connect (gesture, "pressed", cp_handler, cp_data);
410 gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
411 }
412 if (cr_name)
413 {
414 gesture = gtk_gesture_click_new ();
415 gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (gesture), cr_name);
416 gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
417 if (cr_handler) g_signal_connect (gesture, "released", cr_handler, cr_data);
418 gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
419 }
420 if (kp_name)
421 {
422 key = gtk_event_controller_key_new ();
423 gtk_event_controller_set_name (key, kp_name);
424 if (kp_handler) g_signal_connect (key, "key-pressed", kp_handler, kp_data);
425 gtk_widget_add_controller (widget, key);
426 }
427 if (mo_name)
428 {
429 motion = gtk_event_controller_motion_new ();
430 gtk_event_controller_set_name (motion, mo_name);
431 if (mo_handler) g_signal_connect (motion, "motion", mo_handler, mo_data);
432 gtk_widget_add_controller (widget, motion);
433 }
434 if (sc_name)
435 {
436 motion = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL);
437 gtk_event_controller_set_name (motion, sc_name);
438 if (sc_handler) g_signal_connect (motion, "scroll", sc_handler, sc_data);
439 gtk_widget_add_controller (widget, motion);
440 }
441}
442#endif
443
454GtkWidget * create_win (gchar * str, GtkWidget * parent, gboolean modal, gboolean resiz)
455{
456 GtkWidget * win;
457 win = new_gtk_window ();
458 if (str) gtk_window_set_title (GTK_WINDOW(win), prepare_for_title(str));
459 gtk_window_set_resizable (GTK_WINDOW (win), TRUE);
460#ifdef GTK3
461 gtk_window_set_attached_to (GTK_WINDOW (win), parent);
462 gtk_window_set_icon (GTK_WINDOW (win), THETD);
463#endif
464 // gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent));
465 gtk_window_set_modal (GTK_WINDOW(win), modal);
466 gtk_window_set_resizable (GTK_WINDOW(win), resiz);
467 gtk_window_set_destroy_with_parent (GTK_WINDOW (win), TRUE);
468 return win;
469}
470
471#ifdef GTK4
481void run_this_gtk_native_dialog (GtkNativeDialog * dial, GCallback handler, gpointer data)
482{
483 gtk_native_dialog_set_modal (dial, TRUE);
484 if (handler) g_signal_connect (G_OBJECT(dial), "response", handler, data);
485 gtk_native_dialog_show (dial);
486 dialog_id ++;
487 Event_loop[dialog_id] = g_main_loop_new (NULL, FALSE);
488 g_main_loop_run (Event_loop[dialog_id]);
489}
490#endif
491
501void run_this_gtk_dialog (GtkWidget * dial, GCallback handler, gpointer data)
502{
503 gtk_window_set_modal (GTK_WINDOW(dial), TRUE);
504 if (handler) g_signal_connect (G_OBJECT(dial), "response", handler, data);
505 show_the_widgets (dial);
507 dialog_id ++;
508 Event_loop[dialog_id] = g_main_loop_new (NULL, FALSE);
509 g_main_loop_run (Event_loop[dialog_id]);
510}
511
520GtkWidget * dialogmodal (gchar * str, GtkWindow * parent)
521{
522 GtkWidget * win = gtk_dialog_new_with_buttons (str, parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("_Close"), GTK_RESPONSE_CLOSE, NULL);
523 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
524#ifdef GTK3
525 gtk_window_set_icon (GTK_WINDOW (win), THETD);
526#endif
527 return win;
528}
529
541GtkWidget * message_dialogmodal (gchar * message, gchar * title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget * parent)
542{
543 GtkWidget * win;
544 if (parent)
545 {
546 win = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, mtype, buttons, NULL);
547 }
548 else
549 {
550 win = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, mtype, buttons, NULL);
551 }
552 gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (win), message);
553 gtk_window_set_title (GTK_WINDOW(win), title);
554 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
555#ifdef GTK3
556 gtk_window_set_icon (GTK_WINDOW (win), THETD);
557#endif
558 show_the_widgets (win);
559 return win;
560}
561
571GtkWidget * dialog_cancel_apply (gchar * title, GtkWidget * parent, gboolean resiz)
572{
573 GtkWidget * dca = gtk_dialog_new_with_buttons (title, GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
574 "Cancel", GTK_RESPONSE_CANCEL, "Apply", GTK_RESPONSE_APPLY, NULL);
575 gtk_window_set_resizable (GTK_WINDOW(dca), resiz);
576#ifdef GTK3
577 gtk_window_set_icon (GTK_WINDOW (dca), THETD);
578#endif
579 return dca;
580}
581
591void resize_this_window (GtkWidget * window, int x, int y)
592{
593#ifdef GTK3
594 gtk_window_resize (GTK_WINDOW(window), x, y);
595#else
596 gtk_window_set_default_size (GTK_WINDOW(window), x, y);
597#endif
598}
599
607const gchar * entry_get_text (GtkEntry * entry)
608{
609#ifdef GTK4
610 return gtk_editable_get_text (GTK_EDITABLE(entry));
611#else
612 return gtk_entry_get_text (entry);
613#endif
614}
615
624void update_entry_int (GtkEntry * entry, int intval)
625{
626 gchar * value = g_strdup_printf("%d", intval);
627#ifdef GTK4
628 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
629#else
630 gtk_entry_set_text (entry, (const gchar *)value);
631#endif
632 g_free (value);
633}
634
643void update_entry_double (GtkEntry * entry, double doubleval)
644{
645 gchar * value = g_strdup_printf("%f", doubleval);
646#ifdef GTK4
647 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
648#else
649 gtk_entry_set_text (entry, (const gchar *)value);
650#endif
651 g_free (value);
652}
653
662void update_entry_long_double (GtkEntry * entry, double doubleval)
663{
664 gchar * value = g_strdup_printf("%15.10lf", doubleval);
665#ifdef GTK4
666 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
667#else
668 gtk_entry_set_text (entry, (const gchar *)value);
669 g_free (value);
670#endif
671}
672
681void update_entry_text (GtkEntry * entry, gchar * text)
682{
683#ifdef GTK4
684 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)text);
685#else
686 gtk_entry_set_text (entry, (const gchar *)text);
687#endif
688}
689
697void text_view_set_monospace (GtkWidget * view)
698{
699 gtk_text_view_set_monospace (GTK_TEXT_VIEW(view), TRUE);
700}
701
711void gtk_label_align (GtkWidget * lab, float ax, float ay)
712{
713 gtk_label_set_xalign (GTK_LABEL (lab), ax);
714 gtk_label_set_yalign (GTK_LABEL (lab), ay);
715}
716
724gboolean is_the_widget_visible (GtkWidget * widg)
725{
726 if (GTK_IS_WIDGET(widg))
727 {
728 return gtk_widget_is_visible (widg);
729 }
730 else
731 {
732 return FALSE;
733 }
734}
735
754GtkWidget * create_hscale (float min, float max, float delta,
755 float val, int pos, int round, int size,
756 GCallback handler, GCallback scroll_handler, gpointer data)
757{
758 GtkWidget * hscale;
759 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, min, max, delta);
760 gtk_scale_set_draw_value (GTK_SCALE(hscale), TRUE);
761 gtk_widget_set_size_request (hscale, size, -1);
762 gtk_scale_set_value_pos (GTK_SCALE(hscale), pos);
763 gtk_range_set_value (GTK_RANGE(hscale), val);
764 gtk_range_set_round_digits (GTK_RANGE(hscale), round);
765 if (handler != NULL) g_signal_connect (G_OBJECT(hscale), "value-changed", handler, data);
766 if (scroll_handler != NULL) g_signal_connect (G_OBJECT(hscale), "change-value", scroll_handler, data);
767 return hscale;
768}
769
788GtkWidget * create_vscale (float min, float max, float delta,
789 float val, int pos, int round, int size,
790 GCallback handler, GCallback scroll_handler, gpointer data)
791{
792 GtkWidget * vscale;
793 vscale = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, min, max, delta);
794 gtk_scale_set_draw_value (GTK_SCALE(vscale), TRUE);
795 gtk_scale_set_value_pos (GTK_SCALE(vscale), pos);
796 gtk_widget_set_size_request (vscale, size, size);
797 gtk_range_set_value (GTK_RANGE(vscale), val);
798 gtk_range_set_round_digits (GTK_RANGE(vscale), round);
799 if (handler != NULL) g_signal_connect (G_OBJECT(vscale), "value-changed", handler, data);
800 if (scroll_handler != NULL) g_signal_connect (G_OBJECT(vscale), "change-value", scroll_handler, data);
801 return vscale;
802}
803
811GtkWidget * create_vbox (int spacing)
812{
813 return gtk_box_new (GTK_ORIENTATION_VERTICAL, spacing);
814}
815
823GtkWidget * create_hbox (int spacing)
824{
825 return gtk_box_new (GTK_ORIENTATION_HORIZONTAL, spacing);
826}
827
835GtkWidget * dialog_get_content_area (GtkWidget * widg)
836{
837#ifdef GTK3
838 return gtk_dialog_get_content_area (GTK_DIALOG(widg));
839#else
840 GtkWidget * vbox = create_vbox (BSEP);
841 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, gtk_dialog_get_content_area (GTK_DIALOG(widg)), vbox, TRUE, TRUE, 0);
842 return vbox;
843#endif
844}
845
856void layout_add_widget (GtkWidget * layout, GtkWidget * child, int x_pos, int y_pos)
857{
858#ifdef GTK3
859 gtk_layout_put (GTK_LAYOUT(layout), child, x_pos, y_pos);
860#else
861 gtk_fixed_put (GTK_FIXED(layout), child, x_pos, y_pos);
862#endif
863}
864
874GtkWidget * add_vbox_to_layout (GtkWidget * layout, int size_x, int size_y)
875{
876 GtkWidget * vbox = create_vbox (BSEP);
877 gtk_widget_set_size_request (vbox, size_x, size_y);
879 return vbox;
880}
881
890GtkWidget * create_layout (int x, int y)
891{
892 GtkWidget * layout;
893#ifdef GTK3
894 layout = gtk_layout_new (NULL, NULL);
895#else
896 layout = gtk_fixed_new ();
897#endif
898 gtk_widget_set_size_request (layout, x, y);
899 return layout;
900}
901
909int combo_get_active (GtkWidget * combo)
910{
911 return gtk_combo_box_get_active ((GtkComboBox *)combo);
912}
913/* #ifdef GTK4
914#if GTK_MINOR_VERSION > 9
915 return gtk_drop_down_get_selected (GtkDropDown *)combo);
916#else
917 return gtk_combo_box_get_active ((GtkComboBox *)combo);
918#endif
919#else
920 return gtk_combo_box_get_active ((GtkComboBox *)combo);
921#endif // GTK4
922} */
923
932void combo_set_active (GtkWidget * combo, int pos)
933{
934 gtk_combo_box_set_active ((GtkComboBox *)combo, pos);
935}
936
944void combo_set_markup (GtkWidget * combo)
945{
946 GList * cell_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(combo));
947 if (cell_list && cell_list -> data)
948 {
949 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), cell_list -> data, "markup", 0, NULL);
950 }
951}
952
961void combo_text_append (GtkWidget * combo, gchar * text)
962{
963 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo), text);
964}
965
974void combo_text_prepend (GtkWidget * combo, gchar * text)
975{
976 gtk_combo_box_text_prepend_text (GTK_COMBO_BOX_TEXT(combo), text);
977}
978
984GtkWidget * create_combo ()
985{
986 return gtk_combo_box_text_new ();
987}
988
996void setup_text_tags (GtkTextBuffer * buffer)
997{
998 GtkTextTagTable * textags = gtk_text_buffer_get_tag_table(buffer);
999
1000 /* Sans font */
1001 tag = gtk_text_tag_new ("sans");
1002 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "family", "sans", NULL);
1003 gtk_text_tag_table_add (textags, tag);
1004 g_object_unref (tag);
1005
1006 /* Monospace font */
1007 tag = gtk_text_tag_new ("monospace");
1008 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "family", "monospace", NULL);
1009 gtk_text_tag_table_add (textags, tag);
1010 g_object_unref (tag);
1011
1012 /* Default Font size */
1013 tag = gtk_text_tag_new ("default-size");
1014 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, NULL);
1015 gtk_text_tag_table_add (textags, tag);
1016 g_object_unref (tag);
1017
1018 /* <u> */
1019 tag = gtk_text_tag_new ("underline");
1020 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "underline", PANGO_UNDERLINE_SINGLE, NULL);
1021 gtk_text_tag_table_add (textags, tag);
1022 g_object_unref (tag);
1023
1024 /* <uu> */
1025 tag = gtk_text_tag_new ("underline_double");
1026 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "underline", PANGO_UNDERLINE_DOUBLE, NULL);
1027 gtk_text_tag_table_add (textags, tag);
1028 g_object_unref (tag);
1029
1030 /* <i> italic */
1031 tag = gtk_text_tag_new ("italic");
1032 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "style", PANGO_STYLE_ITALIC, NULL);
1033 gtk_text_tag_table_add (textags, tag);
1034 g_object_unref (tag);
1035
1036 /* <b> bold */
1037 tag = gtk_text_tag_new ("bold");
1038 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "weight", PANGO_WEIGHT_BOLD, NULL);
1039 gtk_text_tag_table_add (textags, tag);
1040 g_object_unref (tag);
1041
1042 /* <b> bold italic */
1043 tag = gtk_text_tag_new ("bold_italic");
1044 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1045 "style", PANGO_STYLE_ITALIC,
1046 "weight", PANGO_WEIGHT_BOLD, NULL);
1047 gtk_text_tag_table_add (textags, tag);
1048 g_object_unref (tag);
1049
1050 /* <sup> superscript */
1051 tag = gtk_text_tag_new ("sup");
1052 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "scale", .6, "rise", 6000, NULL);
1053 gtk_text_tag_table_add (textags, tag);
1054 g_object_unref (tag);
1055
1056 /* <sub> subscript */
1057 tag = gtk_text_tag_new ("sub");
1058 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "scale", .6, "rise", -6000, NULL);
1059 gtk_text_tag_table_add (textags, tag);
1060 g_object_unref (tag);
1061
1062 /* justify-left */
1063 tag = gtk_text_tag_new("justify-left");
1064 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "justification", GTK_JUSTIFY_LEFT, NULL);
1065 gtk_text_tag_table_add(textags, tag);
1066 g_object_unref(tag);
1067
1068 /* justify-center */
1069 tag = gtk_text_tag_new("justify-center");
1070 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "justification", GTK_JUSTIFY_CENTER, NULL);
1071 gtk_text_tag_table_add(textags, tag);
1072 g_object_unref(tag);
1073
1074 /* justify-right */
1075 tag = gtk_text_tag_new("justify-right");
1076 g_object_set(tag, "justification", GTK_JUSTIFY_RIGHT, NULL);
1077 gtk_text_tag_table_add(textags, tag);
1078 g_object_unref (tag);
1079
1080 /* heading */
1081 tag = gtk_text_tag_new("heading");
1082 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1083 "weight", PANGO_WEIGHT_BOLD,
1084 "scale", 1.5,
1085 "justification", GTK_JUSTIFY_CENTER,
1086 "underline", PANGO_UNDERLINE_DOUBLE, NULL);
1087 gtk_text_tag_table_add(textags, tag);
1088 g_object_unref (tag);
1089
1090 /* red font */
1091 tag = gtk_text_tag_new("red");
1092 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "red", NULL);
1093 gtk_text_tag_table_add(textags, tag);
1094 g_object_unref (tag);
1095
1096 /* orange font */
1097 tag = gtk_text_tag_new("orange");
1098 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "orange", NULL);
1099 gtk_text_tag_table_add(textags, tag);
1100 g_object_unref (tag);
1101
1102 /* yellow font */
1103 tag = gtk_text_tag_new("yellow");
1104 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "yellow2", NULL);
1105 gtk_text_tag_table_add(textags, tag);
1106 g_object_unref (tag);
1107
1108 /* green font */
1109 tag = gtk_text_tag_new("green");
1110 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "green", NULL);
1111 gtk_text_tag_table_add(textags, tag);
1112 g_object_unref (tag);
1113
1114 /* light green font */
1115 tag = gtk_text_tag_new("light_green");
1116 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "light green", NULL);
1117 gtk_text_tag_table_add(textags, tag);
1118 g_object_unref (tag);
1119
1120 /* cyan font */
1121 tag = gtk_text_tag_new("cyan");
1122 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "cyan", NULL);
1123 gtk_text_tag_table_add(textags, tag);
1124 g_object_unref (tag);
1125
1126 /* blue font */
1127 tag = gtk_text_tag_new("blue");
1128 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "blue", NULL);
1129 gtk_text_tag_table_add(textags, tag);
1130 g_object_unref (tag);
1131
1132 /* pink font */
1133 tag = gtk_text_tag_new("pink");
1134 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "pink", NULL);
1135 gtk_text_tag_table_add(textags, tag);
1136 g_object_unref (tag);
1137
1138 /* violet font */
1139 tag = gtk_text_tag_new("violet");
1140 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "dark violet", NULL);
1141 gtk_text_tag_table_add(textags, tag);
1142 g_object_unref (tag);
1143
1144 /* grey background */
1145 tag = gtk_text_tag_new("grey_back");
1146 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "background", "lightgrey", NULL);
1147 gtk_text_tag_table_add(textags, tag);
1148 g_object_unref (tag);
1149
1150 /* bold grey background */
1151 tag = gtk_text_tag_new("bold_grey_back");
1152 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1153 "background", "lightgrey",
1154 "weight", PANGO_WEIGHT_BOLD, NULL);
1155 gtk_text_tag_table_add(textags, tag);
1156 g_object_unref (tag);
1157
1158 /* bold red font */
1159 tag = gtk_text_tag_new ("bold_red");
1160 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1161 "foreground", "red",
1162 "weight", PANGO_WEIGHT_BOLD, NULL);
1163 gtk_text_tag_table_add (textags, tag);
1164 g_object_unref (tag);
1165
1166 /* bold blue font */
1167 tag = gtk_text_tag_new ("bold_blue");
1168 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1169 "foreground", "blue",
1170 "weight", PANGO_WEIGHT_BOLD, NULL);
1171 gtk_text_tag_table_add (textags, tag);
1172 g_object_unref (tag);
1173
1174 /* bold green font */
1175 tag = gtk_text_tag_new ("bold_green");
1176 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1177 "foreground", "green",
1178 "weight", PANGO_WEIGHT_BOLD, NULL);
1179 gtk_text_tag_table_add (textags, tag);
1180 g_object_unref (tag);
1181
1182 /* bold orange font */
1183 tag = gtk_text_tag_new ("bold_orange");
1184 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1185 "foreground", "orange",
1186 "weight", PANGO_WEIGHT_BOLD, NULL);
1187 gtk_text_tag_table_add (textags, tag);
1188 g_object_unref (tag);
1189
1190 /* bold pink font */
1191 tag = gtk_text_tag_new ("bold_pink");
1192 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1193 "foreground", "pink",
1194 "weight", PANGO_WEIGHT_BOLD, NULL);
1195 gtk_text_tag_table_add (textags, tag);
1196 g_object_unref (tag);
1197
1198 /* subscript italic*/
1199 tag = gtk_text_tag_new ("sub_italic");
1200 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1201 "style", PANGO_STYLE_ITALIC,
1202 "scale", .6, "rise", -6000, NULL);
1203 gtk_text_tag_table_add (textags, tag);
1204 g_object_unref (tag);
1205
1206 /* subscript bold */
1207 tag = gtk_text_tag_new ("sub_bold");
1208 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1209 "weight", PANGO_WEIGHT_BOLD,
1210 "scale", .6, "rise", -6000, NULL);
1211 gtk_text_tag_table_add (textags, tag);
1212 g_object_unref (tag);
1213
1214 /* superscript bold */
1215 tag = gtk_text_tag_new ("sup_bold");
1216 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1217 "weight", PANGO_WEIGHT_BOLD,
1218 "scale", .6, "rise", 6000, NULL);
1219 gtk_text_tag_table_add (textags, tag);
1220 g_object_unref (tag);
1221}
1222
1232GtkTextBuffer * add_buffer (GCallback handler, gpointer data, gchar * text)
1233{
1234 GtkTextBuffer * buffer;
1235 GtkTextIter bStart;
1236 GtkTextIter bEnd;
1237 buffer = gtk_text_buffer_new (NULL);
1238 setup_text_tags (buffer);
1239 gtk_text_buffer_get_start_iter (buffer, &bStart);
1240 gtk_text_buffer_get_end_iter (buffer, &bEnd);
1241 gtk_text_buffer_delete (buffer, &bStart, &bEnd);
1242 if (text != NULL) gtk_text_buffer_set_text (buffer, text, -1);
1243 if (handler != NULL) g_signal_connect (G_OBJECT (buffer), "changed", handler, data);
1244 return buffer;
1245}
1246
1260GtkWidget * create_text_view (int dimx, int dimy, int edit, int mono, GCallback handler, gpointer data, gchar * text)
1261{
1262 GtkWidget * tview = gtk_text_view_new ();
1263 gtk_text_view_set_buffer (GTK_TEXT_VIEW(tview), add_buffer(handler, data, text));
1264 gtk_widget_set_size_request (tview, dimx, dimy);
1265 gtk_text_view_set_editable (GTK_TEXT_VIEW(tview), edit);
1266 if (mono) text_view_set_monospace (tview);
1267 return tview;
1268}
1269
1282static void convert_alpha (cairo_surface_t * surf, GdkPixbuf * pix, int src_x, int src_y, int width, int height)
1283{
1284 int x, y;
1285 guchar * src_data = cairo_image_surface_get_data (surf);
1286 int src_stride = cairo_image_surface_get_stride (surf);
1287 guchar * dest_data = gdk_pixbuf_get_pixels (pix);
1288 int dest_stride = gdk_pixbuf_get_rowstride (pix);
1289
1290 src_data += src_stride * src_y + src_x * 4;
1291
1292 for (y = 0; y < height; y++) {
1293 guint32 *src = (guint32 *) src_data;
1294
1295 for (x = 0; x < width; x++) {
1296 guint alpha = src[x] >> 24;
1297
1298 if (alpha == 0)
1299 {
1300 dest_data[x * 4 + 0] = 0;
1301 dest_data[x * 4 + 1] = 0;
1302 dest_data[x * 4 + 2] = 0;
1303 }
1304 else
1305 {
1306 dest_data[x * 4 + 0] = (((src[x] & 0xff0000) >> 16) * 255 + alpha / 2) / alpha;
1307 dest_data[x * 4 + 1] = (((src[x] & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha;
1308 dest_data[x * 4 + 2] = (((src[x] & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha;
1309 }
1310 dest_data[x * 4 + 3] = alpha;
1311 }
1312
1313 src_data += src_stride;
1314 dest_data += dest_stride;
1315 }
1316}
1317
1325GdkPixbuf * convert_to_pixbuf (cairo_surface_t * surf)
1326{
1327 int width = cairo_image_surface_get_width (surf);
1328 int height = cairo_image_surface_get_height (surf);
1329 GdkPixbuf * pix = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width , height);
1330 convert_alpha (surf, pix, 0, 0, width, height);
1331 return pix;
1332}
1333
1334#ifdef GTK3
1344G_MODULE_EXPORT gboolean to_activate_entry (GtkWidget * widg, GdkEventFocus * event, gpointer data)
1345{
1346 g_signal_emit_by_name (G_OBJECT(widg), "activate", data);
1347 return FALSE;
1348}
1349#else
1358G_MODULE_EXPORT void to_activate_entry (GtkEventControllerFocus * focus, gpointer data)
1359{
1360 g_signal_emit_by_name (G_OBJECT(gtk_event_controller_get_widget((GtkEventController *)focus)), "activate", data);
1361}
1362#endif
1363
1375GtkWidget * create_entry (GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
1376{
1377 GtkWidget * entry = gtk_entry_new ();
1378 gtk_widget_set_size_request (entry, dim, -1);
1379#ifdef GTK4
1380 gtk_editable_set_width_chars (GTK_EDITABLE(entry), 0);
1381 gtk_editable_set_max_width_chars (GTK_EDITABLE(entry), cdim);
1382#else
1383 gtk_entry_set_width_chars (GTK_ENTRY(entry), 0);
1384 gtk_entry_set_max_width_chars (GTK_ENTRY(entry), cdim);
1385#endif
1386 gtk_entry_set_alignment (GTK_ENTRY(entry), 1.0);
1387
1388 if (handler != NULL)
1389 {
1390 g_signal_connect (G_OBJECT (entry), "activate", handler, data);
1391#ifdef GTK3
1392 g_signal_connect (G_OBJECT (entry), "focus-out-event", G_CALLBACK(to_activate_entry), data);
1393#else
1394 /* Pour ajouter une icone dans l'entry:
1395 gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, "edit-find-symbolic");
1396 // Set up the search icon
1397 gtk_entry_set_icon_activatable (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
1398 gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
1399 // Then the press can have action see gtk4 demo
1400 g_signal_connect (entry, "icon-press", G_CALLBACK(icon_press_cb), NULL); */
1401 GtkEventController * focus = gtk_event_controller_focus_new ();
1402 gtk_event_controller_set_name (focus, "focus-out");
1403 g_signal_connect (G_OBJECT(focus), "leave", G_CALLBACK(to_activate_entry), data);
1404 gtk_widget_add_controller (entry, focus);
1405#endif
1406 }
1407 if (key_release)
1408 {
1409#ifdef GTK3
1410 g_signal_connect (G_OBJECT (entry), "key-release-event", G_CALLBACK(to_activate_entry), data);
1411#else
1412 // Key press controler
1413#endif
1414 }
1415 return entry;
1416}
1417
1425GtkWidget * stock_image (const gchar * stock_id)
1426{
1427#ifdef GTK4
1428 return gtk_image_new_from_icon_name (stock_id);
1429#else
1430 return gtk_image_new_from_icon_name (stock_id, GTK_ICON_SIZE_MENU);
1431#endif
1432}
1433
1434#ifdef GTK3
1443GtkWidget * create_menu_item (gboolean add_mnemo, gchar * name)
1444{
1445 return (add_mnemo) ? gtk_menu_item_new_with_mnemonic (name) : gtk_menu_item_new_with_label (name);
1446}
1447
1458GtkWidget * create_menu_item_from_widget (GtkWidget * widg, gboolean check, gboolean radio, gboolean status)
1459{
1460 GtkWidget * item;
1461 if (check)
1462 {
1463 item = gtk_check_menu_item_new ();
1464 if (radio) gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM(item), TRUE);
1465 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), status);
1466 }
1467 else
1468 {
1469 item = gtk_menu_item_new ();
1470 }
1471 gtk_container_add (GTK_CONTAINER(item), widg);
1472 return item;
1473}
1474#endif
1475
1476/* GIcon*
1477g_icon_new_for_string (
1478 const gchar* str,
1479 GError** error
1480)
1481
1482void
1483g_menu_item_set_icon (
1484 GMenuItem* menu_item,
1485 GIcon* icon
1486)
1487
1488void
1489g_menu_item_set_attribute (
1490 GMenuItem* menu_item,
1491 const gchar* attribute,
1492 const gchar* format_string,
1493 ...
1494) */
1495
1504GtkWidget * create_image_from_data (int format, gpointer item_image)
1505{
1506 GtkWidget * icon = NULL;
1507 switch (format)
1508 {
1509 case IMG_PIXBUF:
1510 icon = gtk_image_new_from_pixbuf ((GdkPixbuf*)item_image);
1511 break;
1512 case IMG_SURFACE:
1513#ifdef GTK4
1514 icon = gtk_image_new_from_pixbuf (convert_to_pixbuf ((cairo_surface_t *)item_image));
1515#else
1516 icon = gtk_image_new_from_surface ((cairo_surface_t *)item_image);
1517#endif
1518 break;
1519 case IMG_FILE:
1520 icon = gtk_image_new_from_file ((const gchar *)item_image);
1521 break;
1522 case IMG_STOCK:
1523 icon = stock_image ((const gchar *)item_image);
1524 break;
1525 }
1526 return icon;
1527}
1528
1529#ifdef GTK3
1552GtkWidget * gtk3_menu_item (GtkWidget * menu, gchar * name,
1553 int icon_format, gpointer item_icon,
1554 GCallback handler, gpointer data,
1555 gboolean accel, guint key, GdkModifierType mod,
1556 gboolean check, gboolean radio, gboolean status)
1557{
1558 GtkWidget * item = NULL;
1559 GtkWidget * icon = NULL;
1560 GtkWidget * lab = NULL;
1561
1562 if (name)
1563 {
1564 if (accel)
1565 {
1566 lab = gtk_accel_label_new (name);
1567 gtk_label_align (lab, 0.0, 0.5);
1568 gtk_widget_set_size_request (lab, -1, -1);
1569 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1570 gtk_accel_label_set_accel ((GtkAccelLabel *)lab, key, mod);
1571 }
1572 else
1573 {
1574 lab = markup_label(name, -1, -1, 0.0, 0.5);
1575 }
1576 }
1577 if (icon_format != IMG_NONE) icon = create_image_from_data (icon_format, item_icon);
1578 if (name)
1579 {
1580#ifdef MENU_ICONS
1581 if (icon)
1582 {
1583 GtkWidget * box = create_hbox (0);
1584 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, icon, FALSE, FALSE, 0);
1585 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, lab, FALSE, FALSE, (icon_format == IMG_SURFACE) ? 0 : 6);
1586 item = create_menu_item_from_widget (box, check, radio, status);
1587 }
1588 else
1589 {
1590 item = create_menu_item_from_widget (lab, check, radio, status);
1591 }
1592#else
1593 item = create_menu_item_from_widget (lab, check, radio, status);
1594#endif
1595 }
1596 else if (icon)
1597 {
1598 item = create_menu_item_from_widget (icon, check, radio, status);
1599 }
1600 if (handler != NULL) g_signal_connect (G_OBJECT(item), "activate", handler, data);
1601 if (menu != NULL) gtk_menu_shell_append ((GtkMenuShell *)menu, item);
1602 return item;
1603}
1604
1617GtkWidget * add_advanced_item (GtkWidget * menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
1618{
1619 return gtk3_menu_item (menu, "Advanced", IMG_STOCK, (gpointer)DPROPERTIES, handler, data, accel, key, mod, FALSE, FALSE, FALSE);
1620}
1621
1629void add_menu_separator (GtkWidget * menu)
1630{
1631 gtk_menu_shell_append ((GtkMenuShell *)menu, gtk_separator_menu_item_new ());
1632}
1633#endif
1634
1646GtkWidget * markup_label (gchar * text, int dimx, int dimy, float ax, float ay)
1647{
1648 GtkWidget * lab = gtk_label_new (text);
1650 gtk_widget_set_size_request (lab, dimx, dimy);
1651 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1652 return lab;
1653}
1654
1664{
1665 ColRGBA * new_col = g_malloc0 (num*sizeof*new_col);
1666 int i;
1667 for (i=0; i<num; i++) new_col[i] = col[i];
1668 return new_col;
1669}
1670
1678ColRGBA gdkrgba_to_rgba (GdkRGBA colgdk)
1679{
1680 ColRGBA col;
1681 col.red = colgdk.red;
1682 col.green = colgdk.green;
1683 col.blue = colgdk.blue;
1684 col.alpha = colgdk.alpha;
1685 return col;
1686}
1687
1696{
1697 GdkRGBA colo;
1698 colo.red = col.red;
1699 colo.green = col.green;
1700 colo.blue = col.blue;
1701 colo.alpha = col.alpha;
1702 return colo;
1703}
1704
1714void set_renderer_color (int tocol, GtkCellRenderer * renderer, ColRGBA col)
1715{
1716 if (tocol)
1717 {
1718 GdkRGBA colo = colrgba_togtkrgba (col);
1719 g_object_set (renderer, "foreground-rgba", & colo, "foreground-set", TRUE, NULL);
1720 g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
1721 }
1722 else
1723 {
1724 g_object_set(renderer, "foreground-set", FALSE, "weight", FALSE, NULL);
1725 }
1726}
1727
1738void button_set_image (GtkButton * but, gchar * text, int format, gpointer image)
1739{
1740#ifdef GTK4
1741 GtkWidget * img = create_image_from_data (format, image);
1742 if (text)
1743 {
1744 GtkWidget * hbox = create_hbox (5);
1745 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, img, FALSE, FALSE, 0);
1746 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (text, -1, -1, 0.0, 0.5), FALSE, FALSE, 0);
1747 gtk_button_set_child (but, hbox);
1748 }
1749 else
1750 {
1751 gtk_button_set_child (but, img);
1752 }
1753#else
1754 gtk_button_set_image (but, create_image_from_data (format, image));
1755#endif
1756}
1757
1769void adjust_label (GtkWidget * lab, int dimx, int dimy, float ax, float ay)
1770{
1771 gtk_label_set_xalign (GTK_LABEL(lab), ax);
1772 gtk_label_set_yalign (GTK_LABEL(lab), ay);
1773 gtk_widget_set_size_request (lab, dimx, dimy);
1774 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1775}
1776
1789GtkWidget * color_button (ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
1790{
1791 GtkWidget * colorb;
1792 GdkRGBA colo = colrgba_togtkrgba (col);
1793 colorb = gtk_color_button_new_with_rgba (& colo);
1794 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(colorb), alpha);
1795 if (handler != NULL) g_signal_connect (G_OBJECT(colorb), "color-set", handler, data);
1796 gtk_widget_set_size_request (colorb, dimx, dimy);
1797 return colorb;
1798}
1799
1811GtkWidget * font_button (gchar * font, int dimx, int dimy, GCallback handler, gpointer data)
1812{
1813 GtkWidget * fontb = gtk_font_button_new_with_font (font);
1814 g_signal_connect (G_OBJECT(fontb), "font-set", handler, data);
1815 gtk_widget_set_size_request (fontb, dimx, dimy);
1816 return fontb;
1817}
1818
1833GtkWidget * spin_button (GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data)
1834{
1835 GtkWidget * spin = gtk_spin_button_new_with_range (start, end, step);
1836 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(spin), digits);
1837#ifdef GTK4
1838 gtk_editable_set_alignment (GTK_EDITABLE(spin), 1.0);
1839#else
1840 gtk_entry_set_alignment (GTK_ENTRY(spin), 1.0);
1841#endif
1842 gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin), value);
1843 gtk_widget_set_size_request (spin, dim, -1);
1844 if (handler != NULL) g_signal_connect (G_OBJECT (spin), "value-changed", handler, data);
1845 return spin;
1846}
1847
1855int button_get_status (GtkWidget * button)
1856{
1857#ifdef GTK4
1858 return gtk_check_button_get_active (GTK_CHECK_BUTTON(button));
1859#else
1860 return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
1861#endif
1862}
1863
1872void button_set_status (GtkWidget * button, int status)
1873{
1874#ifdef GTK4
1875 gtk_check_button_set_active (GTK_CHECK_BUTTON(button), status);
1876#else
1877 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), status);
1878#endif
1879}
1880
1893GtkWidget * check_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
1894{
1895 GtkWidget * but = gtk_check_button_new ();
1896 if (text != NULL)
1897 {
1898 gchar * label = g_strdup_printf (" %s", text);
1899#ifdef GTK4
1900 gtk_check_button_set_label (GTK_CHECK_BUTTON(but), label);
1901 GtkWidget * lab = gtk_widget_get_last_child (but);
1902 adjust_label (lab, -1, -1, 0.0, 0.5);
1903#else
1904 add_container_child (CONTAINER_BUT, but, markup_label(label, -1, -1, 0.0, 0.5));
1905#endif
1906 g_free (label);
1907 }
1908 gtk_widget_set_size_request (but, dimx, dimy);
1909 button_set_status (but, state);
1910 if (handler != NULL) g_signal_connect (G_OBJECT(but), "toggled", handler, data);
1911 return but;
1912}
1913
1926GtkWidget * radio_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
1927{
1928 GtkWidget * but;
1929#ifdef GTK4
1930 but = gtk_toggle_button_new ();
1931#else
1932 but = gtk_radio_button_new (NULL);
1933#endif
1934 if (text != NULL) add_container_child (CONTAINER_BUT, but, markup_label(text, -1, -1, 0.0, 0.5));
1935 gtk_widget_set_size_request (but, dimx, dimy);
1936 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(but), state);
1937 if (handler != NULL) g_signal_connect (G_OBJECT(but), "toggled", handler, data);
1938 return but;
1939}
1940
1955GtkWidget * create_button (gchar * text, int image_format, gchar * image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
1956{
1957 GtkWidget * but;
1958#ifdef GTK3
1959 but = (text) ? gtk_button_new_with_label (text) : gtk_button_new ();
1960#else
1961 but = (text && image_format == IMG_NONE) ? gtk_button_new_with_label (text) : gtk_button_new ();
1962#endif
1963 if (image_format != IMG_NONE) button_set_image (GTK_BUTTON(but), text, image_format, (gpointer)image);
1964 gtk_widget_set_size_request (but, dimx, dimy);
1965#ifdef GTK3
1966 gtk_button_set_relief (GTK_BUTTON(but), relief);
1967#endif
1968#ifdef GTK4
1969 if (relief == GTK_RELIEF_NONE) gtk_button_set_has_frame (GTK_BUTTON(but), FALSE);
1970#endif
1971 if (handler != NULL)
1972 {
1973 g_signal_connect (G_OBJECT (but), "clicked", handler, data);
1974 }
1975 return but;
1976}
1977
1986void set_image_from_icon_name (GtkWidget * widg, gchar * icon)
1987{
1988#ifdef GTK4
1989 gtk_image_set_from_icon_name (GTK_IMAGE(widg), icon);
1990#else
1991 gtk_image_set_from_icon_name (GTK_IMAGE(widg), icon, GTK_ICON_SIZE_BUTTON);
1992#endif
1993}
1994
2004void append_comments (GtkWidget * vbox, gchar * symbol, gchar * legend)
2005{
2006 GtkWidget * hbox = create_hbox (BSEP);
2007 gchar * str = g_strdup_printf ("<i><sub>%s</sub></i>", legend);
2008 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(symbol, 15, -1, 1.0, 0.5) , FALSE, FALSE, 5);
2009 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, -1, -1, 0.0, 0.5) , FALSE, FALSE, 5);
2010 g_free (str);
2011 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2012}
2013
2023GtkWidget * abox (GtkWidget * box, char * lab, int vspace)
2024{
2025 GtkWidget * hbox = create_hbox (0);
2026 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, vspace);
2027 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.25), FALSE, FALSE, 10);
2028 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
2029 return hbox;
2030}
2031
2040GtkWidget * bbox (GtkWidget * box, char * lab)
2041{
2042 GtkWidget * hbox = create_hbox (0);
2043 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 2);
2044 GtkWidget * hhbox = create_hbox (0);
2045 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
2046 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(lab, 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
2047 return hhbox;
2048}
2049
2058GtkWidget * cbox (GtkWidget * box, char * lab)
2059{
2060 GtkWidget * hbox = create_hbox (0);
2061 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, TRUE, TRUE, 2);
2062 GtkWidget * hhbox = create_hbox (0);
2063 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, TRUE, TRUE, 40);
2064 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(lab, -1, 30, 0.0, 0.5), TRUE, TRUE, 40);
2065 return hhbox;
2066}
2067
2076GtkWidget * fbox (GtkWidget * box, char * lab)
2077{
2078 GtkWidget * hbox = create_hbox (0);
2079 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 0);
2080 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.5), FALSE, FALSE, 10);
2081 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, 350, 30, 0.0, 0.5), FALSE, FALSE, 0);
2082 return hbox;
2083}
2084
2095GtkWidget * create_scroll (GtkWidget * box, int dimx, int dimy, int shadow)
2096{
2097 GtkWidget * scroll;
2098#ifdef GTK4
2099 scroll = gtk_scrolled_window_new ();
2100#else
2101 scroll = gtk_scrolled_window_new (NULL, NULL);
2102 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll), shadow);
2103#endif
2104 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2105 gtk_widget_set_size_request (scroll, dimx, dimy);
2106 // To check all create_scroll !
2107 if (box != NULL) add_box_child_start (GTK_ORIENTATION_VERTICAL, box, scroll, TRUE, TRUE, 0);
2108 return scroll;
2109}
2110
2119GtkWidget * create_expander (gchar * name, gchar * file_img)
2120{
2121 GtkWidget * expand = gtk_expander_new (name);
2122 GtkWidget * hbox = create_hbox (0);
2123 if (file_img != NULL)
2124 {
2125 GtkWidget * img = gtk_image_new_from_file (file_img);
2126 gtk_widget_set_size_request (img, 20, 20);
2127 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, img, TRUE, TRUE, 10);
2128 }
2129 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(name, 200, 20, 0.0, 0.5), FALSE, TRUE, 0);
2130 gtk_expander_set_label_widget (GTK_EXPANDER(expand), hbox);
2131 return expand;
2132}
2133
2141void provide_gtk_css (gchar * css)
2142{
2143 GtkCssProvider * provider = gtk_css_provider_new ();
2144#ifdef GTK4
2145#if GTK_MINOR_VERSION < 12
2146 gtk_css_provider_load_from_data (provider, css, -1);
2147#else
2148 gtk_css_provider_load_from_string (provider, css);
2149#endif
2150 gtk_style_context_add_provider_for_display (gdk_display_get_default (),
2151 GTK_STYLE_PROVIDER(provider),
2152 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
2153#else
2154 gtk_css_provider_load_from_data (provider, css, -1, NULL);
2155 gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
2156 GTK_STYLE_PROVIDER(provider),
2157 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
2158#endif
2159 g_object_unref (provider);
2160}
2161
2169GtkWidget * destroy_this_widget (GtkWidget * widg)
2170{
2171 if (widg != NULL)
2172 {
2173 if (GTK_IS_WIDGET(widg))
2174 {
2175 if (is_the_widget_visible(widg)) hide_the_widgets (widg);
2176#ifdef GTK3
2177 gtk_widget_destroy (widg);
2178#else
2179 /* GtkWidget * wid = gtk_widget_get_parent (widg);
2180 if (wid != NULL)
2181 {
2182 if (GTK_IS_WIDGET(wid))
2183 {
2184 gtk_widget_unparent (widg);
2185 }
2186 } */
2187#endif
2188 }
2189 }
2190 return NULL;
2191}
2192
2200void destroy_this_dialog (GtkDialog * dialog)
2201{
2202#ifdef GTK4
2203 gtk_window_destroy (GTK_WINDOW(dialog));
2204#else
2205 destroy_this_widget (GTK_WIDGET(dialog));
2206#endif
2207 g_main_loop_quit (Event_loop[dialog_id]);
2208 g_main_loop_unref (Event_loop[dialog_id]);
2209 dialog_id --;
2210}
2211
2219void destroy_this_native_dialog (GtkNativeDialog * dialog)
2220{
2221 gtk_native_dialog_destroy (dialog);
2222 g_object_unref (dialog);
2223 g_main_loop_quit (Event_loop[dialog_id]);
2224 g_main_loop_unref (Event_loop[dialog_id]);
2225 dialog_id --;
2226}
2227
2237G_MODULE_EXPORT void run_destroy_dialog (GtkDialog * dialog, gint response_id, gpointer data)
2238{
2239 destroy_this_dialog (dialog);
2240}
2241
2242#ifdef GTK4
2248GListModel * file_chooser_get_file_names (GtkFileChooser * chooser)
2249{
2250 return gtk_file_chooser_get_files (chooser);
2251}
2252#else
2258GSList * file_chooser_get_file_names (GtkFileChooser * chooser)
2259{
2260 return gtk_file_chooser_get_filenames (chooser);
2261}
2262#endif
2263
2271gchar * file_chooser_get_file_name (GtkFileChooser * chooser)
2272{
2273#ifdef GTK4
2274 return g_file_get_parse_name (gtk_file_chooser_get_file (chooser));
2275#else
2276 return gtk_file_chooser_get_filename (chooser);
2277#endif
2278}
2279
2287gchar * file_chooser_get_current_folder (GtkFileChooser * chooser)
2288{
2289#ifdef GTK4
2290 return g_file_get_parse_name (gtk_file_chooser_get_current_folder (chooser));
2291#else
2292 return gtk_file_chooser_get_current_folder (chooser);
2293#endif
2294}
2295
2304gboolean file_chooser_set_file_name (GtkFileChooser * chooser, gchar * filename)
2305{
2306 GFile * default_file_for_saving = g_file_new_for_path (filename);
2307 gboolean res = gtk_file_chooser_set_file (chooser, default_file_for_saving, NULL);
2308 if (! res)
2309 {
2310 gchar * str = g_strdup_printf ("Impossible to locate file: %s", filename);
2311 show_error (str, 0, (GtkWidget *)chooser);
2312 }
2313 return res;
2314}
2315
2323void file_chooser_set_current_folder (GtkFileChooser * chooser)
2324{
2325#ifdef GTK4
2326 gtk_file_chooser_set_current_folder (chooser, g_file_new_for_path ("./"), NULL);
2327#else
2328 gtk_file_chooser_set_current_folder (chooser, "");
2329#endif
2330}
2331
2332#ifdef GTK4
2343GtkFileChooserNative * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name)
2344{
2345 return gtk_file_chooser_native_new (title, parent, act, act_name, "Cancel");
2346}
2347#else
2358GtkWidget * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name)
2359{
2360 return gtk_file_chooser_dialog_new (title, parent, act, "Cancel", GTK_RESPONSE_CANCEL, act_name, GTK_RESPONSE_ACCEPT, NULL);
2361}
2362#endif
2363
2371ColRGBA get_button_color (GtkColorChooser * colob)
2372{
2373 GdkRGBA col;
2374 gtk_color_chooser_get_rgba (colob, & col);
2375 return gdkrgba_to_rgba (col);
2376}
2377
2385ColRGBA get_window_color (GtkWidget * color_win)
2386{
2387 GdkRGBA col;
2388 gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_win), & col);
2389 return gdkrgba_to_rgba (col);
2390}
2391
2400void set_color_chooser_color (GtkWidget * color_win, ColRGBA col)
2401{
2402 GdkRGBA colo = colrgba_togtkrgba(col);
2403 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(color_win), & colo);
2404}
2405
2406#ifdef GTK4
2416void pop_menu_at_pointer (GtkWidget * pop, double x, double y)
2417{
2418 GdkRectangle rect;
2419 rect.x = x;
2420 rect.y = y;
2421 rect.width = 1;
2422 rect.height = 1;
2423 gtk_popover_set_has_arrow (GTK_POPOVER(pop), FALSE);
2424 gtk_popover_set_pointing_to (GTK_POPOVER(pop), & rect);
2425 gtk_popover_popup (GTK_POPOVER(pop));
2426}
2427#else
2436void pop_menu_at_pointer (GtkWidget * widg, GdkEvent * event)
2437{
2438 show_the_widgets (widg);
2439 gtk_menu_popup_at_pointer (GTK_MENU (widg), event);
2440}
2441#endif
2442
2450GtkWidget * get_top_level (GtkWidget * widg)
2451{
2452#ifdef GTK4
2453 return (GtkWidget *)gtk_widget_get_root (widg);
2454#else
2455 return gtk_widget_get_toplevel (widg);
2456#endif
2457}
2458
2459#ifdef GTK4
2468G_MODULE_EXPORT gboolean destroy_this_window (GtkWindow * win, gpointer data)
2469#else
2479G_MODULE_EXPORT gboolean destroy_this_window (GtkWidget * win, GdkEvent * event, gpointer data)
2480#endif
2481{
2482 destroy_this_widget (GTK_WIDGET(win));
2483 return TRUE;
2484}
2485
2486#ifdef GTK4
2495G_MODULE_EXPORT gboolean hide_this_window (GtkWindow * win, gpointer data)
2496#else
2506G_MODULE_EXPORT gboolean hide_this_window (GtkWidget * win, GdkEvent * event, gpointer data)
2507#endif
2508{
2509 hide_the_widgets (GTK_WIDGET(win));
2510 return TRUE;
2511}
2512
2522void add_gtk_close_event (GtkWidget * widg, GCallback handler, gpointer data)
2523{
2524#ifdef GTK4
2525 g_signal_connect (G_OBJECT (widg), "close-request", handler, data);
2526#else
2527 g_signal_connect (G_OBJECT (widg), "delete-event", handler, data);
2528#endif
2529}
2530
2538int get_widget_width (GtkWidget * widg)
2539{
2540#ifdef GTK3
2541 return gtk_widget_get_allocated_width (widg);
2542#else
2543 return gtk_widget_get_width (widg);
2544#endif
2545}
2546
2554int get_widget_height (GtkWidget * widg)
2555{
2556#ifdef GTK3
2557 return gtk_widget_get_allocated_height (widg);
2558#else
2559 return gtk_widget_get_height (widg);
2560#endif
2561}
double ay
Definition curve.c:70
double ax
Definition curve.c:70
PangoLayout * layout
Definition curve.c:79
void label(cairo_t *cr, double val, int axe, int p, project *this_proj)
draw axis label
Definition labels.c:56
ColRGBA col
Definition d_measures.c:77
gchar * text
Definition datab.c:105
float val
Definition dlp_init.c:117
int dialog_id
Definition global.c:167
GtkTextTag * tag
Definition global.c:213
GMainLoop * Event_loop[5]
Definition global.c:178
GdkPixbuf * THETD
Definition global.c:216
GtkWidget * pop
Definition global.c:204
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_PIXBUF
Definition global.h:263
@ IMG_NONE
Definition global.h:262
@ IMG_STOCK
Definition global.h:266
@ IMG_SURFACE
Definition global.h:264
@ IMG_FILE
Definition global.h:265
GtkWidget * create_menu_item_from_widget(GtkWidget *widg, gboolean check, gboolean radio, gboolean status)
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)
#define BSEP
Definition global.h:247
GtkWidget * add_advanced_item(GtkWidget *menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
@ CONTAINER_EXP
Definition global.h:257
@ CONTAINER_WIN
Definition global.h:252
@ CONTAINER_FRA
Definition global.h:256
@ CONTAINER_BUT
Definition global.h:255
@ CONTAINER_SCR
Definition global.h:253
@ CONTAINER_VIE
Definition global.h:254
#define DPROPERTIES
Definition global.h:208
GtkWidget * create_menu_item(gboolean add_mnemo, gchar *action)
#define min(a, b)
Definition global.h:81
#define DEFAULT_FONT_SIZE
Definition global.h:337
gchar * prepare_for_title(gchar *init)
prepare a string for a window title, getting rid of all markup
Definition tools.c:71
void add_menu_separator(GtkWidget *menu)
GtkWidget * menu_item_new_with_submenu(gchar *name, gboolean active, GtkWidget *sub_menu)
#define max(a, b)
Definition global.h:80
void motion(glwin *view, gint x, gint y, GdkModifierType state)
mouse motion in the OpenGL window
Definition glview.c:637
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
int step
Definition ogl_draw.c:74
gboolean spin(gpointer data)
spin
Definition w_spiner.c:56
GtkWidget * dialog_cancel_apply(gchar *title, GtkWidget *parent, gboolean resiz)
create a dialog modal offering a choice to apply something or not
Definition gtk-misc.c:571
GdkPixbuf * convert_to_pixbuf(cairo_surface_t *surf)
convert cairo surface to GdkPixbuf
Definition gtk-misc.c:1325
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:501
void file_chooser_set_current_folder(GtkFileChooser *chooser)
set current folder in a GtkFilechooser
Definition gtk-misc.c:2323
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:909
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1375
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:643
void set_renderer_color(int tocol, GtkCellRenderer *renderer, ColRGBA col)
set the color of a GtkCellRenderer
Definition gtk-misc.c:1714
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2004
void adjust_label(GtkWidget *lab, int dimx, int dimy, float ax, float ay)
adjust the text position, and widget size of a GtkLabel
Definition gtk-misc.c:1769
ColRGBA gdkrgba_to_rgba(GdkRGBA colgdk)
convert GdkRGBA color to ColRGBA color
Definition gtk-misc.c:1678
GtkWidget * font_button(gchar *font, int dimx, int dimy, GCallback handler, gpointer data)
create a font selection button
Definition gtk-misc.c:1811
GtkWidget * create_text_view(int dimx, int dimy, int edit, int mono, GCallback handler, gpointer data, gchar *text)
create a GtkTextView and display some text
Definition gtk-misc.c:1260
GtkTextBuffer * add_buffer(GCallback handler, gpointer data, gchar *text)
create a GtkTextBuffer
Definition gtk-misc.c:1232
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:2095
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:520
void set_color_chooser_color(GtkWidget *color_win, ColRGBA col)
set the color of a color selection window
Definition gtk-misc.c:2400
gboolean is_the_widget_visible(GtkWidget *widg)
test if a GtkWidget exist, then return if it is visible or not
Definition gtk-misc.c:724
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
void combo_set_markup(GtkWidget *combo)
use pango markup in combo widget
Definition gtk-misc.c:944
ColRGBA get_window_color(GtkWidget *color_win)
get the ColRGBA color from a color selection window
Definition gtk-misc.c:2385
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:932
GtkWidget * add_vbox_to_layout(GtkWidget *layout, int size_x, int size_y)
Insert a vertical GtkBox in a GtkLatout then send back the GtkBox.
Definition gtk-misc.c:874
int get_widget_height(GtkWidget *widg)
retrive GtkWidget height
Definition gtk-misc.c:2554
gchar * file_chooser_get_file_name(GtkFileChooser *chooser)
get a file name from a GtkFileChooser (single file selected)
Definition gtk-misc.c:2271
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:607
GdkRGBA colrgba_togtkrgba(ColRGBA col)
convert ColRGBA color to GdkRGBA color
Definition gtk-misc.c:1695
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:624
G_MODULE_EXPORT gboolean hide_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
hide a GtkWindow
Definition gtk-misc.c:2506
void pop_menu_at_pointer(GtkWidget *widg, GdkEvent *event)
popup a menu at pointer location
Definition gtk-misc.c:2436
gboolean file_chooser_set_file_name(GtkFileChooser *chooser, gchar *filename)
set file name in a GtkFilechooser
Definition gtk-misc.c:2304
G_MODULE_EXPORT gboolean destroy_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
destroy a GtkWindow
Definition gtk-misc.c:2479
GtkWidget * stock_image(const gchar *stock_id)
create a GtkImage for the Gtk database
Definition gtk-misc.c:1425
int get_widget_width(GtkWidget *widg)
retrive GtkWidget width
Definition gtk-misc.c:2538
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
GtkWidget * create_vscale(float min, float max, float delta, float val, int pos, int round, int size, GCallback handler, GCallback scroll_handler, gpointer data)
create an vertical scale GtkWidget
Definition gtk-misc.c:788
void layout_add_widget(GtkWidget *layout, GtkWidget *child, int x_pos, int y_pos)
Add a GtkWidget in a GtkLayout.
Definition gtk-misc.c:856
void button_set_status(GtkWidget *button, int status)
set status of check / toggle button
Definition gtk-misc.c:1872
GtkWidget * fbox(GtkWidget *box, char *lab)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2076
gchar * file_chooser_get_current_folder(GtkFileChooser *chooser)
get the current folder for a GtkFileChooser
Definition gtk-misc.c:2287
GtkWidget * radio_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a radio button
Definition gtk-misc.c:1926
GtkWidget * spin_button(GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data)
create a spin button
Definition gtk-misc.c:1833
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1893
G_MODULE_EXPORT void to_activate_entry(GtkEventControllerFocus *focus, gpointer data)
GtkEntry activate signal managment.
Definition gtk-misc.c:1358
GtkWidget * create_button(gchar *text, int image_format, gchar *image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
create a simple button
Definition gtk-misc.c:1955
GtkWidget * get_top_level(GtkWidget *widg)
get the top level container, window, of a widget
Definition gtk-misc.c:2450
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:984
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:835
void button_set_image(GtkButton *but, gchar *text, int format, gpointer image)
Add an image to a GtkButton.
Definition gtk-misc.c:1738
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1646
GtkWidget * cbox(GtkWidget *box, char *lab)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2058
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
ColRGBA get_button_color(GtkColorChooser *colob)
get the ColRGBA color from a GtkColorChooser button
Definition gtk-misc.c:2371
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:215
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2200
void text_view_set_monospace(GtkWidget *view)
set the font of a GtkTextView as monospace
Definition gtk-misc.c:697
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:823
GtkWidget * new_gtk_window()
create a new GtkWindow
Definition gtk-misc.c:357
GtkWidget * create_image_from_data(int format, gpointer item_image)
create Gtk image for data
Definition gtk-misc.c:1504
void gtk_label_align(GtkWidget *lab, float ax, float ay)
set text alignment in a GtkLabel
Definition gtk-misc.c:711
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:961
G_MODULE_EXPORT void run_destroy_dialog(GtkDialog *dialog, gint response_id, gpointer data)
to destroy a GtkDialog when the dialog emit the closing signal
Definition gtk-misc.c:2237
GtkWidget * create_layout(int x, int y)
create a GtkLayout / GtkFixed widget
Definition gtk-misc.c:890
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2169
GtkWidget * color_button(ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
create a color selection button
Definition gtk-misc.c:1789
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
Definition gtk-misc.c:754
GtkWidget * bbox(GtkWidget *box, char *lab)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2040
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
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:681
void provide_gtk_css(gchar *css)
create a css provider based on the css data
Definition gtk-misc.c:2141
GSList * file_chooser_get_file_names(GtkFileChooser *chooser)
create a file list from files selected using a GtkFileChooser
Definition gtk-misc.c:2258
void setup_text_tags(GtkTextBuffer *buffer)
prepare the available text tags for the GtkTextBuffer
Definition gtk-misc.c:996
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:235
void set_image_from_icon_name(GtkWidget *widg, gchar *icon)
set a image from a stock icon name
Definition gtk-misc.c:1986
GtkWidget * message_dialogmodal(gchar *message, gchar *title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget *parent)
create a modal (cannot be ignored) message window
Definition gtk-misc.c:541
void combo_text_prepend(GtkWidget *combo, gchar *text)
prepend text in GtkComboBox widget
Definition gtk-misc.c:974
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:198
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:811
ColRGBA * duplicate_color(int num, ColRGBA *col)
duplicate a ColRGBA pointer
Definition gtk-misc.c:1663
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1855
GtkWidget * abox(GtkWidget *box, char *lab, int vspace)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2023
GtkWidget * create_expander(gchar *name, gchar *file_img)
create GtkExpander
Definition gtk-misc.c:2119
GtkWidget * create_file_chooser(const gchar *title, GtkWindow *parent, GtkFileChooserAction act, const gchar *act_name)
create a GtkFileChooser, utility to select file(s)
Definition gtk-misc.c:2358
void destroy_this_native_dialog(GtkNativeDialog *dialog)
destroy a GtkNativeDialog
Definition gtk-misc.c:2219
void adjust_preferences_window()
adjust the widgets of the preferences window
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:182
void update_entry_long_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as long double
Definition gtk-misc.c:662
void show_error(char *error, int val, GtkWidget *win)
show error message
Definition interface.c:293
Messaging function declarations.
double y
Definition ogl_draw.c:61
double x
Definition ogl_draw.c:61
gboolean preferences
Preference variable declarations.
float blue
Definition global.h:126
float alpha
Definition global.h:127
float red
Definition global.h:124
float green
Definition global.h:125
Definition glwin.h:351
Definition glwin.h:365
int status
Definition w_advance.c:178
GtkWidget * res[2]
Definition w_encode.c:212
GdkPixbuf * pix
Definition workspace.c:69
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72
GtkWidget * lab
Definition workspace.c:73