atomes 1.3.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-2026 by CNRS and University of Strasbourg */
15
23
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 set_renderer_markup (GtkTreeModel * mod, GtkTreeIter * iter, GtkCellRenderer * renderer, int col);
82 void button_set_image (GtkButton * but, gchar * text, int format, gpointer image);
83 void adjust_label (GtkWidget * lab, int dimx, int dimy, float ax, float ay);
84 void set_image_from_icon_name (GtkWidget * widg, gchar * icon);
85 void append_comments (GtkWidget * vbox, gchar * symbol, gchar * legend);
86 void provide_gtk_css (gchar * css);
87 void destroy_this_dialog (GtkDialog * dialog);
88 void destroy_this_native_dialog (GtkNativeDialog * dialog);
89 void file_chooser_set_current_folder (GtkFileChooser * chooser);
90 void set_color_chooser_color (GtkWidget * color_win, ColRGBA col);
91 void pop_menu_at_pointer (GtkWidget * pop, double x, double y);
92 void pop_menu_at_pointer (GtkWidget * widg, GdkEvent * event);
93 void add_gtk_close_event (GtkWidget * widg, GCallback handler, gpointer data);
94 static void convert_alpha (cairo_surface_t * surf, GdkPixbuf * pix, int src_x, int src_y, int width, int height);
95
96 G_MODULE_EXPORT void to_activate_entry (GtkEventControllerFocus * focus, gpointer data);
97 G_MODULE_EXPORT void run_destroy_dialog (GtkDialog * dialog, gint response_id, gpointer data);
98
99 GtkWidget * menu_item_new_with_submenu (gchar * name, gboolean active, GtkWidget * sub_menu);
100 GtkWidget * new_gtk_window ();
101 GtkWidget * create_win (gchar * str, GtkWidget * parent, gboolean modal, gboolean resiz);
102 GtkWidget * dialogmodal (gchar * str, GtkWindow * parent);
103 GtkWidget * message_dialogmodal (gchar * message, gchar * title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget * parent);
104 GtkWidget * dialog_cancel_apply (gchar * title, GtkWidget * parent, gboolean resiz);
105 GtkWidget * create_hscale (float min, float max, float delta,
106 float val, int pos, int round, int size,
107 GCallback handler, GCallback scroll_handler, gpointer data);
108 GtkWidget * create_vscale (float min, float max, float delta,
109 float val, int pos, int round, int size,
110 GCallback handler, GCallback scroll_handler, gpointer data);
111 GtkWidget * create_vbox (int spacing);
112 GtkWidget * create_hbox (int spacing);
113 GtkWidget * dialog_get_content_area (GtkWidget * widg);
114 GtkWidget * add_vbox_to_layout (GtkWidget * layout, int size_x, int size_y);
115 GtkWidget * create_layout (int x, int y);
116 GtkWidget * create_combo ();
117 GtkWidget * create_text_view (int dimx, int dimy, int edit, int mono, GCallback handler, gpointer data, gchar * text);
118 GtkWidget * create_entry (GCallback handler, int dim, int cdim, gboolean key_release, gpointer data);
119 GtkWidget * stock_image (const gchar * stock_id);
120 GtkWidget * create_menu_item (gboolean add_mnemo, gchar * name);
121 GtkWidget * create_menu_item_from_widget (GtkWidget * widg, gboolean check, gboolean radio, gboolean status);
122 GtkWidget * create_image_from_data (int format, gpointer item_image);
123 GtkWidget * gtk3_menu_item (GtkWidget * menu, gchar * name,
124 int icon_format, gpointer item_icon,
125 GCallback handler, gpointer data,
126 gboolean accel, guint key, GdkModifierType mod,
127 gboolean check, gboolean radio, gboolean status);
128 GtkWidget * add_advanced_item (GtkWidget * menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod);
129 GtkWidget * markup_label (gchar * text, int dimx, int dimy, float ax, float ay);
130 GtkWidget * color_button (ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data);
131 GtkWidget * font_button (gchar * font, int dimx, int dimy, GCallback handler, gpointer data);
132 GtkWidget * spin_button (GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data);
133 GtkWidget * check_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data);
134 GtkWidget * radio_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data);
135 GtkWidget * create_button (gchar * text, int image_format, gchar * image, int dimx, int dimy, int relief, GCallback handler, gpointer data);
136 GtkWidget * abox (GtkWidget * box, char * lab, int vspace);
137 GtkWidget * bbox (GtkWidget * box, char * lab);
138 GtkWidget * cbox (GtkWidget * box, char * lab);
139 GtkWidget * fbox (GtkWidget * box, char * lab);
140 GtkWidget * create_scroll (GtkWidget * box, int dimx, int dimy, int shadow);
141 GtkWidget * create_expander (gchar * name, gchar * file_img);
142 GtkWidget * destroy_this_widget (GtkWidget * widg);
143 GtkWidget * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name);
144 GtkWidget * get_top_level (GtkWidget * widg);
145
146 GtkTextBuffer * add_buffer (GCallback handler, gpointer data, gchar * text);
147
148 GtkFileChooserNative * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name);
149
150 GdkPixbuf * convert_to_pixbuf (cairo_surface_t * surf);
151
152 GMenuItem * create_menu_item (gboolean add_mnemo, gchar * name, gchar * action);
153
154 GListModel * file_chooser_get_file_names (GtkFileChooser * chooser);
155
156 ColRGBA * duplicate_color (int num, ColRGBA * col);
157 ColRGBA gdkrgba_to_rgba (GdkRGBA colgdk);
158 ColRGBA get_button_color (GtkColorChooser * colob);
159 ColRGBA get_window_color (GtkWidget * color_win);
160
161 GdkRGBA colrgba_togtkrgba (ColRGBA col);
162
163 int get_widget_width (GtkWidget * widg);
164 int get_widget_height (GtkWidget * widg);
165 int button_get_status (GtkWidget * button);
166
167*/
168
169#include "global.h"
170#include "interface.h"
171#include "preferences.h"
172#include "glview.h"
173
174extern void adjust_preferences_window ();
175
183gboolean is_the_widget_visible (GtkWidget * widg)
184{
185 if (GTK_IS_WIDGET(widg))
186 {
187 return gtk_widget_is_visible (widg);
188 }
189 else
190 {
191 return FALSE;
192 }
193}
194
202void show_the_widgets (GtkWidget * widg)
203{
204 if (widg)
205 {
206 if (GTK_IS_WIDGET(widg))
207 {
208#ifdef GTK4
209 gtk_widget_set_visible (widg, TRUE);
210#else
211 gtk_widget_show_all (widg);
212#endif
213 }
214 }
215}
216
224void hide_the_widgets (GtkWidget * widg)
225{
226 if (widg != NULL)
227 {
228 if (GTK_IS_WIDGET(widg))
229 {
230#ifdef GTK4
231 gtk_widget_set_visible (widg, FALSE);
232#else
233 gtk_widget_hide (widg);
234#endif
235 }
236 }
237}
238
247void widget_set_sensitive (GtkWidget * widg, gboolean sensitive)
248{
249 if (widg != NULL)
250 {
251 if (GTK_IS_WIDGET(widg))
252 {
253 gtk_widget_set_sensitive (widg, sensitive);
254 }
255 }
256}
257
267void add_container_child (int type, GtkWidget * widg, GtkWidget * child)
268{
269#ifdef GTK3
270 gtk_container_add (GTK_CONTAINER(widg), child);
271#else
272 switch (type)
273 {
274 case CONTAINER_WIN:
275 // gtk_window_set_child ((GtkWindow *)widg, NULL);
276 gtk_window_set_child ((GtkWindow *)widg, child);
277 break;
278 case CONTAINER_SCR:
279 // Bug in the management of scrolled window child
280/* Frequently getting warning messages at this point with GTK4
281(atomes:?????): GLib-GObject-CRITICAL **: ??:??:??.???: g_object_set: assertion 'G_IS_OBJECT (object)' failed
282(atomes:?????): Gtk-CRITICAL **: ??:??:??.???: gtk_widget_unparent: assertion 'GTK_IS_WIDGET (widget)' failed
283*/
284 gtk_scrolled_window_set_child ((GtkScrolledWindow *)widg, NULL);
285 gtk_scrolled_window_set_child ((GtkScrolledWindow *)widg, child);
286 break;
287 case CONTAINER_VIE:
288 // gtk_viewport_set_child ((GtkViewport *)widg, NULL);
289 gtk_viewport_set_child ((GtkViewport *)widg, child);
290 break;
291 case CONTAINER_BUT:
292 // gtk_button_set_child ((GtkButton *)widg, NULL);
293 gtk_button_set_child ((GtkButton *)widg, child);
294 break;
295 case CONTAINER_FRA:
296 // gtk_frame_set_child ((GtkFrame *)widg, NULL);
297 gtk_frame_set_child ((GtkFrame *)widg, child);
298 break;
299 case CONTAINER_EXP:
300 // gtk_expander_set_child ((GtkExpander *)widg, NULL);
301 gtk_expander_set_child ((GtkExpander *)widg, child);
302 break;
303 }
304#endif
305}
306
318void add_box_child_end (GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding)
319{
320#ifdef GTK4
321 // gtk_widget_set_hexpand (child, TRUE);
322 gtk_box_append (GTK_BOX(widg), child);
323#else
324 gtk_box_pack_end (GTK_BOX(widg), child, expand, fill, padding);
325#endif
326}
327
340void add_box_child_start (int orientation, GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding)
341{
342#ifdef GTK4
343 if (orientation == GTK_ORIENTATION_HORIZONTAL && padding)
344 {
345 gtk_box_append (GTK_BOX(widg), markup_label (" ", padding, -1, 0.0, 0.0));
346 }
347 else if (orientation == GTK_ORIENTATION_VERTICAL && padding > 10)
348 {
349 gtk_box_append (GTK_BOX(widg), markup_label (" ", -1, padding/2, 0.0, 0.0));
350 }
351 gtk_box_append (GTK_BOX(widg), child);
352 if (orientation == GTK_ORIENTATION_HORIZONTAL && padding)
353 {
354 gtk_box_append (GTK_BOX(widg), markup_label (" ", padding, -1, 0.0, 0.0));
355 }
356 else if (orientation == GTK_ORIENTATION_VERTICAL && padding > 10)
357 {
358 gtk_box_append (GTK_BOX(widg), markup_label (" ", -1, padding/2, 0.0, 0.0));
359 }
360#else
361 gtk_box_pack_start (GTK_BOX(widg), child, expand, fill, padding);
362#endif
363}
364
365#ifdef GTK3
375GtkWidget * menu_item_new_with_submenu (gchar * name, gboolean active, GtkWidget * sub_menu)
376{
377 GtkWidget * item = create_menu_item (FALSE, name);
378 gtk_menu_item_set_submenu ((GtkMenuItem *)item, sub_menu);
379 widget_set_sensitive (item, active);
380 return item;
381}
382#endif
383
389GtkWidget * new_gtk_window ()
390{
391#ifdef GTK4
392 return gtk_window_new ();
393#else
394 return gtk_window_new (GTK_WINDOW_TOPLEVEL);
395#endif
396}
397
398#ifdef GTK4
426void add_widget_gesture_and_key_action (GtkWidget * widget,
427 gchar * cp_name, GCallback cp_handler, gpointer cp_data,
428 gchar * cr_name, GCallback cr_handler, gpointer cr_data,
429 gchar * kp_name, GCallback kp_handler, gpointer kp_data,
430 gchar * mo_name, GCallback mo_handler, gpointer mo_data,
431 gchar * sc_name, GCallback sc_handler, gpointer sc_data)
432{
433 GtkGesture * gesture;
434 GtkEventController * key;
435 GtkEventController * motion;
436 if (cp_name)
437 {
438 gesture = gtk_gesture_click_new ();
439 gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (gesture), cp_name);
440 gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
441 if (cp_handler) g_signal_connect (gesture, "pressed", cp_handler, cp_data);
442 gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
443 }
444 if (cr_name)
445 {
446 gesture = gtk_gesture_click_new ();
447 gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (gesture), cr_name);
448 gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
449 if (cr_handler) g_signal_connect (gesture, "released", cr_handler, cr_data);
450 gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
451 }
452 if (kp_name)
453 {
454 key = gtk_event_controller_key_new ();
455 gtk_event_controller_set_name (key, kp_name);
456 if (kp_handler) g_signal_connect (key, "key-pressed", kp_handler, kp_data);
457 gtk_widget_add_controller (widget, key);
458 }
459 if (mo_name)
460 {
461 motion = gtk_event_controller_motion_new ();
462 gtk_event_controller_set_name (motion, mo_name);
463 if (mo_handler) g_signal_connect (motion, "motion", mo_handler, mo_data);
464 gtk_widget_add_controller (widget, motion);
465 }
466 if (sc_name)
467 {
468 motion = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL);
469 gtk_event_controller_set_name (motion, sc_name);
470 if (sc_handler) g_signal_connect (motion, "scroll", sc_handler, sc_data);
471 gtk_widget_add_controller (widget, motion);
472 }
473}
474#endif
475
486GtkWidget * create_win (gchar * str, GtkWidget * parent, gboolean modal, gboolean resiz)
487{
488 GtkWidget * win;
489 win = new_gtk_window ();
490 if (str) gtk_window_set_title (GTK_WINDOW(win), prepare_for_title(str));
491 gtk_window_set_resizable (GTK_WINDOW (win), TRUE);
492#ifdef GTK3
493 gtk_window_set_attached_to (GTK_WINDOW (win), parent);
494 gtk_window_set_icon (GTK_WINDOW (win), THETD);
495#endif
496 // gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent));
497 gtk_window_set_modal (GTK_WINDOW(win), modal);
498 gtk_window_set_resizable (GTK_WINDOW(win), resiz);
499 gtk_window_set_destroy_with_parent (GTK_WINDOW (win), TRUE);
500 return win;
501}
502
503#ifdef GTK4
513void run_this_gtk_native_dialog (GtkNativeDialog * dial, GCallback handler, gpointer data)
514{
515 gtk_native_dialog_set_modal (dial, TRUE);
516 if (handler) g_signal_connect (G_OBJECT(dial), "response", handler, data);
517 gtk_native_dialog_show (dial);
518 dialog_id ++;
519 Event_loop[dialog_id] = g_main_loop_new (NULL, FALSE);
520 g_main_loop_run (Event_loop[dialog_id]);
521}
522#endif
523
533void run_this_gtk_dialog (GtkWidget * dial, GCallback handler, gpointer data)
534{
535 gtk_window_set_modal (GTK_WINDOW(dial), TRUE);
536 if (handler) g_signal_connect (G_OBJECT(dial), "response", handler, data);
537 show_the_widgets (dial);
539 dialog_id ++;
540 Event_loop[dialog_id] = g_main_loop_new (NULL, FALSE);
541 g_main_loop_run (Event_loop[dialog_id]);
542}
543
552GtkWidget * dialogmodal (gchar * str, GtkWindow * parent)
553{
554 GtkWidget * win = gtk_dialog_new_with_buttons (str, parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("_Close"), GTK_RESPONSE_CLOSE, NULL);
555 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
556#ifdef GTK3
557 gtk_window_set_icon (GTK_WINDOW (win), THETD);
558#endif
559 return win;
560}
561
573GtkWidget * message_dialogmodal (gchar * message, gchar * title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget * parent)
574{
575 GtkWidget * win;
576 if (parent)
577 {
578 win = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, mtype, buttons, NULL);
579 }
580 else
581 {
582 win = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, mtype, buttons, NULL);
583 }
584 gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (win), message);
585
586 GtkWidget * content_area = gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(win));
587 GtkWidget * label;
588#ifdef GTK4
589 label = gtk_widget_get_first_child(content_area);
590#else
591 GList * children = gtk_container_get_children(GTK_CONTAINER(content_area));
592 label = GTK_WIDGET(children -> data);
593 g_list_free(children);
594#endif
595 gtk_label_set_use_markup (GTK_LABEL(label), TRUE);
596 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
597
598 gtk_window_set_title (GTK_WINDOW(win), title);
599 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
600#ifdef GTK3
601 gtk_window_set_icon (GTK_WINDOW (win), THETD);
602#endif
603 show_the_widgets (win);
604 return win;
605}
606
616GtkWidget * dialog_cancel_apply (gchar * title, GtkWidget * parent, gboolean resiz)
617{
618 GtkWidget * dca = gtk_dialog_new_with_buttons (title, GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
619 _("Cancel"), GTK_RESPONSE_CANCEL, _("Apply"), GTK_RESPONSE_APPLY, NULL);
620 gtk_window_set_resizable (GTK_WINDOW(dca), resiz);
621#ifdef GTK3
622 gtk_window_set_icon (GTK_WINDOW (dca), THETD);
623#endif
624 return dca;
625}
626
636void resize_this_window (GtkWidget * window, int x, int y)
637{
638#ifdef GTK3
639 gtk_window_resize (GTK_WINDOW(window), x, y);
640#else
641 gtk_window_set_default_size (GTK_WINDOW(window), x, y);
642#endif
643}
644
652const gchar * entry_get_text (GtkEntry * entry)
653{
654#ifdef GTK4
655 return gtk_editable_get_text (GTK_EDITABLE(entry));
656#else
657 return gtk_entry_get_text (entry);
658#endif
659}
660
669void update_entry_int (GtkEntry * entry, int intval)
670{
671 gchar * value = g_strdup_printf("%d", intval);
672#ifdef GTK4
673 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
674#else
675 gtk_entry_set_text (entry, (const gchar *)value);
676#endif
677 g_free (value);
678}
679
688void update_entry_double (GtkEntry * entry, double doubleval)
689{
690 gchar * value = g_strdup_printf("%f", doubleval);
691#ifdef GTK4
692 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
693#else
694 gtk_entry_set_text (entry, (const gchar *)value);
695#endif
696 g_free (value);
697}
698
707void update_entry_long_double (GtkEntry * entry, double doubleval)
708{
709 gchar * value = g_strdup_printf("%15.10lf", doubleval);
710#ifdef GTK4
711 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
712#else
713 gtk_entry_set_text (entry, (const gchar *)value);
714 g_free (value);
715#endif
716}
717
726void update_entry_text (GtkEntry * entry, gchar * text)
727{
728#ifdef GTK4
729 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)text);
730#else
731 gtk_entry_set_text (entry, (const gchar *)text);
732#endif
733}
734
742void text_view_set_monospace (GtkWidget * view)
743{
744 gtk_text_view_set_monospace (GTK_TEXT_VIEW(view), TRUE);
745}
746
756void gtk_label_align (GtkWidget * lab, float ax, float ay)
757{
758 gtk_label_set_xalign (GTK_LABEL (lab), ax);
759 gtk_label_set_yalign (GTK_LABEL (lab), ay);
760}
761
780GtkWidget * create_hscale (float min, float max, float delta,
781 float val, int pos, int round, int size,
782 GCallback handler, GCallback scroll_handler, gpointer data)
783{
784 GtkWidget * hscale;
785 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, min, max, delta);
786 gtk_scale_set_draw_value (GTK_SCALE(hscale), TRUE);
787 gtk_widget_set_size_request (hscale, size, -1);
788 gtk_scale_set_value_pos (GTK_SCALE(hscale), pos);
789 gtk_range_set_value (GTK_RANGE(hscale), val);
790 gtk_range_set_round_digits (GTK_RANGE(hscale), round);
791 if (handler != NULL) g_signal_connect (G_OBJECT(hscale), "value-changed", handler, data);
792 if (scroll_handler != NULL) g_signal_connect (G_OBJECT(hscale), "change-value", scroll_handler, data);
793 return hscale;
794}
795
814GtkWidget * create_vscale (float min, float max, float delta,
815 float val, int pos, int round, int size,
816 GCallback handler, GCallback scroll_handler, gpointer data)
817{
818 GtkWidget * vscale;
819 vscale = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, min, max, delta);
820 gtk_scale_set_draw_value (GTK_SCALE(vscale), TRUE);
821 gtk_scale_set_value_pos (GTK_SCALE(vscale), pos);
822 gtk_widget_set_size_request (vscale, size, size);
823 gtk_range_set_value (GTK_RANGE(vscale), val);
824 gtk_range_set_round_digits (GTK_RANGE(vscale), round);
825 if (handler != NULL) g_signal_connect (G_OBJECT(vscale), "value-changed", handler, data);
826 if (scroll_handler != NULL) g_signal_connect (G_OBJECT(vscale), "change-value", scroll_handler, data);
827 return vscale;
828}
829
837GtkWidget * create_vbox (int spacing)
838{
839 return gtk_box_new (GTK_ORIENTATION_VERTICAL, spacing);
840}
841
849GtkWidget * create_hbox (int spacing)
850{
851 return gtk_box_new (GTK_ORIENTATION_HORIZONTAL, spacing);
852}
853
861GtkWidget * dialog_get_content_area (GtkWidget * widg)
862{
863#ifdef GTK3
864 return gtk_dialog_get_content_area (GTK_DIALOG(widg));
865#else
866 GtkWidget * vbox = create_vbox (BSEP);
867 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, gtk_dialog_get_content_area (GTK_DIALOG(widg)), vbox, TRUE, TRUE, 0);
868 return vbox;
869#endif
870}
871
882void layout_add_widget (GtkWidget * layout, GtkWidget * child, int x_pos, int y_pos)
883{
884#ifdef GTK3
885 gtk_layout_put (GTK_LAYOUT(layout), child, x_pos, y_pos);
886#else
887 gtk_fixed_put (GTK_FIXED(layout), child, x_pos, y_pos);
888#endif
889}
890
900GtkWidget * add_vbox_to_layout (GtkWidget * layout, int size_x, int size_y)
901{
902 GtkWidget * vbox = create_vbox (BSEP);
903 gtk_widget_set_size_request (vbox, size_x, size_y);
905 return vbox;
906}
907
916GtkWidget * create_layout (int x, int y)
917{
918 GtkWidget * layout;
919#ifdef GTK3
920 layout = gtk_layout_new (NULL, NULL);
921#else
922 layout = gtk_fixed_new ();
923#endif
924 gtk_widget_set_size_request (layout, x, y);
925 return layout;
926}
927
935int combo_get_active (GtkWidget * combo)
936{
937 return gtk_combo_box_get_active ((GtkComboBox *)combo);
938}
939/* #ifdef GTK4
940#if GTK_MINOR_VERSION > 9
941 return gtk_drop_down_get_selected (GtkDropDown *)combo);
942#else
943 return gtk_combo_box_get_active ((GtkComboBox *)combo);
944#endif
945#else
946 return gtk_combo_box_get_active ((GtkComboBox *)combo);
947#endif // GTK4
948} */
949
958void combo_set_active (GtkWidget * combo, int pos)
959{
960 gtk_combo_box_set_active ((GtkComboBox *)combo, pos);
961}
962
970void combo_set_markup (GtkWidget * combo)
971{
972 GList * cell_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(combo));
973 if (cell_list && cell_list -> data)
974 {
975 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), cell_list -> data, "markup", 0, NULL);
976 }
977}
978
987void combo_text_append (GtkWidget * combo, gchar * text)
988{
989 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo), text);
990}
991
1000void combo_text_prepend (GtkWidget * combo, gchar * text)
1001{
1002 gtk_combo_box_text_prepend_text (GTK_COMBO_BOX_TEXT(combo), text);
1003}
1004
1010GtkWidget * create_combo ()
1011{
1012 return gtk_combo_box_text_new ();
1013}
1014
1022void setup_text_tags (GtkTextBuffer * buffer)
1023{
1024 GtkTextTagTable * textags = gtk_text_buffer_get_tag_table(buffer);
1025
1026 /* Sans font */
1027 tag = gtk_text_tag_new ("sans");
1028 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "family", "sans", NULL);
1029 gtk_text_tag_table_add (textags, tag);
1030 g_object_unref (tag);
1031
1032 /* Monospace font */
1033 tag = gtk_text_tag_new ("monospace");
1034 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "family", "monospace", NULL);
1035 gtk_text_tag_table_add (textags, tag);
1036 g_object_unref (tag);
1037
1038 /* Default Font size */
1039 tag = gtk_text_tag_new ("default-size");
1040 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, NULL);
1041 gtk_text_tag_table_add (textags, tag);
1042 g_object_unref (tag);
1043
1044 /* <u> */
1045 tag = gtk_text_tag_new ("underline");
1046 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "underline", PANGO_UNDERLINE_SINGLE, NULL);
1047 gtk_text_tag_table_add (textags, tag);
1048 g_object_unref (tag);
1049
1050 /* <uu> */
1051 tag = gtk_text_tag_new ("underline_double");
1052 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "underline", PANGO_UNDERLINE_DOUBLE, NULL);
1053 gtk_text_tag_table_add (textags, tag);
1054 g_object_unref (tag);
1055
1056 /* <i> italic */
1057 tag = gtk_text_tag_new ("italic");
1058 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "style", PANGO_STYLE_ITALIC, NULL);
1059 gtk_text_tag_table_add (textags, tag);
1060 g_object_unref (tag);
1061
1062 /* <b> bold */
1063 tag = gtk_text_tag_new ("bold");
1064 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "weight", PANGO_WEIGHT_BOLD, NULL);
1065 gtk_text_tag_table_add (textags, tag);
1066 g_object_unref (tag);
1067
1068 /* <b> bold italic */
1069 tag = gtk_text_tag_new ("bold_italic");
1070 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1071 "style", PANGO_STYLE_ITALIC,
1072 "weight", PANGO_WEIGHT_BOLD, NULL);
1073 gtk_text_tag_table_add (textags, tag);
1074 g_object_unref (tag);
1075
1076 /* <sup> superscript */
1077 tag = gtk_text_tag_new ("sup");
1078 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "scale", .6, "rise", 6000, NULL);
1079 gtk_text_tag_table_add (textags, tag);
1080 g_object_unref (tag);
1081
1082 /* <sub> subscript */
1083 tag = gtk_text_tag_new ("sub");
1084 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "scale", .6, "rise", -6000, NULL);
1085 gtk_text_tag_table_add (textags, tag);
1086 g_object_unref (tag);
1087
1088 /* justify-left */
1089 tag = gtk_text_tag_new("justify-left");
1090 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "justification", GTK_JUSTIFY_LEFT, NULL);
1091 gtk_text_tag_table_add(textags, tag);
1092 g_object_unref(tag);
1093
1094 /* justify-center */
1095 tag = gtk_text_tag_new("justify-center");
1096 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "justification", GTK_JUSTIFY_CENTER, NULL);
1097 gtk_text_tag_table_add(textags, tag);
1098 g_object_unref(tag);
1099
1100 /* justify-right */
1101 tag = gtk_text_tag_new("justify-right");
1102 g_object_set(tag, "justification", GTK_JUSTIFY_RIGHT, NULL);
1103 gtk_text_tag_table_add(textags, tag);
1104 g_object_unref (tag);
1105
1106 /* heading */
1107 tag = gtk_text_tag_new("heading");
1108 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1109 "weight", PANGO_WEIGHT_BOLD,
1110 "scale", 1.5,
1111 "justification", GTK_JUSTIFY_CENTER,
1112 "underline", PANGO_UNDERLINE_DOUBLE, NULL);
1113 gtk_text_tag_table_add(textags, tag);
1114 g_object_unref (tag);
1115
1116 /* red font */
1117 tag = gtk_text_tag_new("red");
1118 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "red", NULL);
1119 gtk_text_tag_table_add(textags, tag);
1120 g_object_unref (tag);
1121
1122 /* orange font */
1123 tag = gtk_text_tag_new("orange");
1124 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "orange", NULL);
1125 gtk_text_tag_table_add(textags, tag);
1126 g_object_unref (tag);
1127
1128 /* yellow font */
1129 tag = gtk_text_tag_new("yellow");
1130 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "yellow2", NULL);
1131 gtk_text_tag_table_add(textags, tag);
1132 g_object_unref (tag);
1133
1134 /* green font */
1135 tag = gtk_text_tag_new("green");
1136 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "green", NULL);
1137 gtk_text_tag_table_add(textags, tag);
1138 g_object_unref (tag);
1139
1140 /* light green font */
1141 tag = gtk_text_tag_new("light_green");
1142 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "light green", NULL);
1143 gtk_text_tag_table_add(textags, tag);
1144 g_object_unref (tag);
1145
1146 /* cyan font */
1147 tag = gtk_text_tag_new("cyan");
1148 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "cyan", NULL);
1149 gtk_text_tag_table_add(textags, tag);
1150 g_object_unref (tag);
1151
1152 /* blue font */
1153 tag = gtk_text_tag_new("blue");
1154 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "blue", NULL);
1155 gtk_text_tag_table_add(textags, tag);
1156 g_object_unref (tag);
1157
1158 /* pink font */
1159 tag = gtk_text_tag_new("pink");
1160 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "pink", NULL);
1161 gtk_text_tag_table_add(textags, tag);
1162 g_object_unref (tag);
1163
1164 /* violet font */
1165 tag = gtk_text_tag_new("violet");
1166 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "dark violet", NULL);
1167 gtk_text_tag_table_add(textags, tag);
1168 g_object_unref (tag);
1169
1170 /* grey background */
1171 tag = gtk_text_tag_new("grey_back");
1172 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "background", "lightgrey", NULL);
1173 gtk_text_tag_table_add(textags, tag);
1174 g_object_unref (tag);
1175
1176 /* bold grey background */
1177 tag = gtk_text_tag_new("bold_grey_back");
1178 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1179 "background", "lightgrey",
1180 "weight", PANGO_WEIGHT_BOLD, NULL);
1181 gtk_text_tag_table_add(textags, tag);
1182 g_object_unref (tag);
1183
1184 /* bold red font */
1185 tag = gtk_text_tag_new ("bold_red");
1186 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1187 "foreground", "red",
1188 "weight", PANGO_WEIGHT_BOLD, NULL);
1189 gtk_text_tag_table_add (textags, tag);
1190 g_object_unref (tag);
1191
1192 /* bold blue font */
1193 tag = gtk_text_tag_new ("bold_blue");
1194 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1195 "foreground", "blue",
1196 "weight", PANGO_WEIGHT_BOLD, NULL);
1197 gtk_text_tag_table_add (textags, tag);
1198 g_object_unref (tag);
1199
1200 /* bold green font */
1201 tag = gtk_text_tag_new ("bold_green");
1202 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1203 "foreground", "green",
1204 "weight", PANGO_WEIGHT_BOLD, NULL);
1205 gtk_text_tag_table_add (textags, tag);
1206 g_object_unref (tag);
1207
1208 /* bold orange font */
1209 tag = gtk_text_tag_new ("bold_orange");
1210 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1211 "foreground", "orange",
1212 "weight", PANGO_WEIGHT_BOLD, NULL);
1213 gtk_text_tag_table_add (textags, tag);
1214 g_object_unref (tag);
1215
1216 /* bold pink font */
1217 tag = gtk_text_tag_new ("bold_pink");
1218 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1219 "foreground", "pink",
1220 "weight", PANGO_WEIGHT_BOLD, NULL);
1221 gtk_text_tag_table_add (textags, tag);
1222 g_object_unref (tag);
1223
1224 /* subscript italic*/
1225 tag = gtk_text_tag_new ("sub_italic");
1226 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1227 "style", PANGO_STYLE_ITALIC,
1228 "scale", .6, "rise", -6000, NULL);
1229 gtk_text_tag_table_add (textags, tag);
1230 g_object_unref (tag);
1231
1232 /* subscript bold */
1233 tag = gtk_text_tag_new ("sub_bold");
1234 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1235 "weight", PANGO_WEIGHT_BOLD,
1236 "scale", .6, "rise", -6000, NULL);
1237 gtk_text_tag_table_add (textags, tag);
1238 g_object_unref (tag);
1239
1240 /* superscript bold */
1241 tag = gtk_text_tag_new ("sup_bold");
1242 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1243 "weight", PANGO_WEIGHT_BOLD,
1244 "scale", .6, "rise", 6000, NULL);
1245 gtk_text_tag_table_add (textags, tag);
1246 g_object_unref (tag);
1247}
1248
1258GtkTextBuffer * add_buffer (GCallback handler, gpointer data, gchar * text)
1259{
1260 GtkTextBuffer * buffer;
1261 GtkTextIter bStart;
1262 GtkTextIter bEnd;
1263 buffer = gtk_text_buffer_new (NULL);
1264 setup_text_tags (buffer);
1265 gtk_text_buffer_get_start_iter (buffer, &bStart);
1266 gtk_text_buffer_get_end_iter (buffer, &bEnd);
1267 gtk_text_buffer_delete (buffer, &bStart, &bEnd);
1268 if (text != NULL) gtk_text_buffer_set_text (buffer, text, -1);
1269 if (handler != NULL) g_signal_connect (G_OBJECT (buffer), "changed", handler, data);
1270 return buffer;
1271}
1272
1286GtkWidget * create_text_view (int dimx, int dimy, int edit, int mono, GCallback handler, gpointer data, gchar * text)
1287{
1288 GtkWidget * tview = gtk_text_view_new ();
1289 gtk_text_view_set_buffer (GTK_TEXT_VIEW(tview), add_buffer(handler, data, text));
1290 gtk_widget_set_size_request (tview, dimx, dimy);
1291 gtk_text_view_set_editable (GTK_TEXT_VIEW(tview), edit);
1292 if (mono) text_view_set_monospace (tview);
1293 return tview;
1294}
1295
1308static void convert_alpha (cairo_surface_t * surf, GdkPixbuf * pix, int src_x, int src_y, int width, int height)
1309{
1310 int x, y;
1311 guchar * src_data = cairo_image_surface_get_data (surf);
1312 int src_stride = cairo_image_surface_get_stride (surf);
1313 guchar * dest_data = gdk_pixbuf_get_pixels (pix);
1314 int dest_stride = gdk_pixbuf_get_rowstride (pix);
1315
1316 src_data += src_stride * src_y + src_x * 4;
1317
1318 for (y = 0; y < height; y++) {
1319 guint32 *src = (guint32 *) src_data;
1320
1321 for (x = 0; x < width; x++) {
1322 guint alpha = src[x] >> 24;
1323
1324 if (alpha == 0)
1325 {
1326 dest_data[x * 4 + 0] = 0;
1327 dest_data[x * 4 + 1] = 0;
1328 dest_data[x * 4 + 2] = 0;
1329 }
1330 else
1331 {
1332 dest_data[x * 4 + 0] = (((src[x] & 0xff0000) >> 16) * 255 + alpha / 2) / alpha;
1333 dest_data[x * 4 + 1] = (((src[x] & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha;
1334 dest_data[x * 4 + 2] = (((src[x] & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha;
1335 }
1336 dest_data[x * 4 + 3] = alpha;
1337 }
1338
1339 src_data += src_stride;
1340 dest_data += dest_stride;
1341 }
1342}
1343
1351GdkPixbuf * convert_to_pixbuf (cairo_surface_t * surf)
1352{
1353 int width = cairo_image_surface_get_width (surf);
1354 int height = cairo_image_surface_get_height (surf);
1355 GdkPixbuf * pix = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width , height);
1356 convert_alpha (surf, pix, 0, 0, width, height);
1357 return pix;
1358}
1359
1360#ifdef GTK3
1370G_MODULE_EXPORT gboolean to_activate_entry (GtkWidget * widg, GdkEventFocus * event, gpointer data)
1371{
1372 g_signal_emit_by_name (G_OBJECT(widg), "activate", data);
1373 return FALSE;
1374}
1375#else
1384G_MODULE_EXPORT void to_activate_entry (GtkEventControllerFocus * focus, gpointer data)
1385{
1386 g_signal_emit_by_name (G_OBJECT(gtk_event_controller_get_widget((GtkEventController *)focus)), "activate", data);
1387}
1388#endif
1389
1401GtkWidget * create_entry (GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
1402{
1403 GtkWidget * entry = gtk_entry_new ();
1404 gtk_widget_set_size_request (entry, dim, -1);
1405#ifdef GTK4
1406 gtk_editable_set_width_chars (GTK_EDITABLE(entry), 0);
1407 gtk_editable_set_max_width_chars (GTK_EDITABLE(entry), cdim);
1408#else
1409 gtk_entry_set_width_chars (GTK_ENTRY(entry), 0);
1410 gtk_entry_set_max_width_chars (GTK_ENTRY(entry), cdim);
1411#endif
1412 gtk_entry_set_alignment (GTK_ENTRY(entry), 1.0);
1413
1414 if (handler != NULL)
1415 {
1416 g_signal_connect (G_OBJECT (entry), "activate", handler, data);
1417#ifdef GTK3
1418 g_signal_connect (G_OBJECT (entry), "focus-out-event", G_CALLBACK(to_activate_entry), data);
1419#else
1420 /* Pour ajouter une icone dans l'entry:
1421 gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, "edit-find-symbolic");
1422 // Set up the search icon
1423 gtk_entry_set_icon_activatable (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
1424 gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
1425 // Then the press can have action see gtk4 demo
1426 g_signal_connect (entry, "icon-press", G_CALLBACK(icon_press_cb), NULL); */
1427 GtkEventController * focus = gtk_event_controller_focus_new ();
1428 gtk_event_controller_set_name (focus, "focus-out");
1429 g_signal_connect (G_OBJECT(focus), "leave", G_CALLBACK(to_activate_entry), data);
1430 gtk_widget_add_controller (entry, focus);
1431#endif
1432 }
1433 if (key_release)
1434 {
1435#ifdef GTK3
1436 g_signal_connect (G_OBJECT (entry), "key-release-event", G_CALLBACK(to_activate_entry), data);
1437#else
1438 // Key press controler
1439#endif
1440 }
1441 return entry;
1442}
1443
1451GtkWidget * stock_image (const gchar * stock_id)
1452{
1453#ifdef GTK4
1454 return gtk_image_new_from_icon_name (stock_id);
1455#else
1456 return gtk_image_new_from_icon_name (stock_id, GTK_ICON_SIZE_MENU);
1457#endif
1458}
1459
1460#ifdef GTK3
1469GtkWidget * create_menu_item (gboolean add_mnemo, gchar * name)
1470{
1471 return (add_mnemo) ? gtk_menu_item_new_with_mnemonic (name) : gtk_menu_item_new_with_label (name);
1472}
1473
1484GtkWidget * create_menu_item_from_widget (GtkWidget * widg, gboolean check, gboolean radio, gboolean status)
1485{
1486 GtkWidget * item;
1487 if (check)
1488 {
1489 item = gtk_check_menu_item_new ();
1490 if (radio) gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM(item), TRUE);
1491 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), status);
1492 }
1493 else
1494 {
1495 item = gtk_menu_item_new ();
1496 }
1497 gtk_container_add (GTK_CONTAINER(item), widg);
1498 return item;
1499}
1500#endif
1501
1502/* GIcon*
1503g_icon_new_for_string (
1504 const gchar* str,
1505 GError** error
1506)
1507
1508void
1509g_menu_item_set_icon (
1510 GMenuItem* menu_item,
1511 GIcon* icon
1512)
1513
1514void
1515g_menu_item_set_attribute (
1516 GMenuItem* menu_item,
1517 const gchar* attribute,
1518 const gchar* format_string,
1519 ...
1520) */
1521
1530GtkWidget * create_image_from_data (int format, gpointer item_image)
1531{
1532 GtkWidget * icon = NULL;
1533 switch (format)
1534 {
1535 case IMG_PIXBUF:
1536 icon = gtk_image_new_from_pixbuf ((GdkPixbuf*)item_image);
1537 break;
1538 case IMG_SURFACE:
1539#ifdef GTK4
1540 icon = gtk_image_new_from_pixbuf (convert_to_pixbuf ((cairo_surface_t *)item_image));
1541#else
1542 icon = gtk_image_new_from_surface ((cairo_surface_t *)item_image);
1543#endif
1544 break;
1545 case IMG_FILE:
1546 icon = gtk_image_new_from_file ((const gchar *)item_image);
1547 break;
1548 case IMG_STOCK:
1549 icon = stock_image ((const gchar *)item_image);
1550 break;
1551 }
1552 return icon;
1553}
1554
1555#ifdef GTK3
1578GtkWidget * gtk3_menu_item (GtkWidget * menu, gchar * name,
1579 int icon_format, gpointer item_icon,
1580 GCallback handler, gpointer data,
1581 gboolean accel, guint key, GdkModifierType mod,
1582 gboolean check, gboolean radio, gboolean status)
1583{
1584 GtkWidget * item = NULL;
1585 GtkWidget * icon = NULL;
1586 GtkWidget * lab = NULL;
1587
1588 if (name)
1589 {
1590 if (accel)
1591 {
1592 lab = gtk_accel_label_new (name);
1593 gtk_label_align (lab, 0.0, 0.5);
1594 gtk_widget_set_size_request (lab, -1, -1);
1595 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1596 gtk_accel_label_set_accel ((GtkAccelLabel *)lab, key, mod);
1597 }
1598 else
1599 {
1600 lab = markup_label(name, -1, -1, 0.0, 0.5);
1601 }
1602 }
1603 if (icon_format != IMG_NONE) icon = create_image_from_data (icon_format, item_icon);
1604 if (name)
1605 {
1606#ifdef MENU_ICONS
1607 if (icon)
1608 {
1609 GtkWidget * box = create_hbox (0);
1610 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, icon, FALSE, FALSE, 0);
1611 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, lab, FALSE, FALSE, (icon_format == IMG_SURFACE) ? 0 : 6);
1612 item = create_menu_item_from_widget (box, check, radio, status);
1613 }
1614 else
1615 {
1616 item = create_menu_item_from_widget (lab, check, radio, status);
1617 }
1618#else
1619 item = create_menu_item_from_widget (lab, check, radio, status);
1620#endif
1621 }
1622 else if (icon)
1623 {
1624 item = create_menu_item_from_widget (icon, check, radio, status);
1625 }
1626 if (handler != NULL) g_signal_connect (G_OBJECT(item), "activate", handler, data);
1627 if (menu != NULL) gtk_menu_shell_append ((GtkMenuShell *)menu, item);
1628 return item;
1629}
1630
1643GtkWidget * add_advanced_item (GtkWidget * menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
1644{
1645 return gtk3_menu_item (menu, _("Advanced"), IMG_STOCK, (gpointer)DPROPERTIES, handler, data, accel, key, mod, FALSE, FALSE, FALSE);
1646}
1647
1655void add_menu_separator (GtkWidget * menu)
1656{
1657 gtk_menu_shell_append ((GtkMenuShell *)menu, gtk_separator_menu_item_new ());
1658}
1659#endif
1660
1672GtkWidget * markup_label (gchar * text, int dimx, int dimy, float ax, float ay)
1673{
1674 GtkWidget * lab = gtk_label_new (text);
1676 gtk_widget_set_size_request (lab, dimx, dimy);
1677 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1678 return lab;
1679}
1680
1690{
1691 ColRGBA * new_col = g_malloc0(num*sizeof*new_col);
1692 int i;
1693 for (i=0; i<num; i++) new_col[i] = col[i];
1694 return new_col;
1695}
1696
1704ColRGBA gdkrgba_to_rgba (GdkRGBA colgdk)
1705{
1706 ColRGBA col;
1707 col.red = colgdk.red;
1708 col.green = colgdk.green;
1709 col.blue = colgdk.blue;
1710 col.alpha = colgdk.alpha;
1711 return col;
1712}
1713
1722{
1723 GdkRGBA colo;
1724 colo.red = col.red;
1725 colo.green = col.green;
1726 colo.blue = col.blue;
1727 colo.alpha = col.alpha;
1728 return colo;
1729}
1730
1740void set_renderer_color (int tocol, GtkCellRenderer * renderer, ColRGBA col)
1741{
1742 if (tocol)
1743 {
1744 GdkRGBA colo = colrgba_togtkrgba (col);
1745 g_object_set (renderer, "foreground-rgba", & colo, "foreground-set", TRUE, NULL);
1746 g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
1747 }
1748 else
1749 {
1750 g_object_set(renderer, "foreground-set", FALSE, "weight", FALSE, NULL);
1751 }
1752}
1753
1764void set_renderer_markup (GtkTreeModel * mod, GtkTreeIter * iter, GtkCellRenderer * renderer, int col)
1765{
1766 gchar * str = NULL;
1767 gtk_tree_model_get (mod, iter, col, & str, -1);
1768 g_object_set (renderer, "markup", str, NULL, NULL);
1769 g_free (str);
1770}
1771
1782void button_set_image (GtkButton * but, gchar * text, int format, gpointer image)
1783{
1784#ifdef GTK4
1785 GtkWidget * img = create_image_from_data (format, image);
1786 if (text)
1787 {
1788 GtkWidget * hbox = create_hbox (5);
1789 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, img, FALSE, FALSE, 0);
1790 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (text, -1, -1, 0.0, 0.5), FALSE, FALSE, 0);
1791 gtk_button_set_child (but, hbox);
1792 }
1793 else
1794 {
1795 gtk_button_set_child (but, img);
1796 }
1797#else
1798 gtk_button_set_image (but, create_image_from_data (format, image));
1799#endif
1800}
1801
1813void adjust_label (GtkWidget * lab, int dimx, int dimy, float ax, float ay)
1814{
1815 gtk_label_set_xalign (GTK_LABEL(lab), ax);
1816 gtk_label_set_yalign (GTK_LABEL(lab), ay);
1817 gtk_widget_set_size_request (lab, dimx, dimy);
1818 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1819}
1820
1833GtkWidget * color_button (ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
1834{
1835 GtkWidget * colorb;
1836 GdkRGBA colo = colrgba_togtkrgba (col);
1837 colorb = gtk_color_button_new_with_rgba (& colo);
1838 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(colorb), alpha);
1839 if (handler != NULL) g_signal_connect (G_OBJECT(colorb), "color-set", handler, data);
1840 gtk_widget_set_size_request (colorb, dimx, dimy);
1841 return colorb;
1842}
1843
1855GtkWidget * font_button (gchar * font, int dimx, int dimy, GCallback handler, gpointer data)
1856{
1857 GtkWidget * fontb = gtk_font_button_new_with_font (font);
1858 g_signal_connect (G_OBJECT(fontb), "font-set", handler, data);
1859 gtk_widget_set_size_request (fontb, dimx, dimy);
1860 return fontb;
1861}
1862
1877GtkWidget * spin_button (GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data)
1878{
1879 GtkWidget * spin = gtk_spin_button_new_with_range (start, end, step);
1880 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(spin), digits);
1881#ifdef GTK4
1882 gtk_editable_set_alignment (GTK_EDITABLE(spin), 1.0);
1883#else
1884 gtk_entry_set_alignment (GTK_ENTRY(spin), 1.0);
1885#endif
1886 gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin), value);
1887 gtk_widget_set_size_request (spin, dim, -1);
1888 if (handler != NULL) g_signal_connect (G_OBJECT (spin), "value-changed", handler, data);
1889 return spin;
1890}
1891
1899int button_get_status (GtkWidget * button)
1900{
1901#ifdef GTK4
1902 return gtk_check_button_get_active (GTK_CHECK_BUTTON(button));
1903#else
1904 return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
1905#endif
1906}
1907
1916void button_set_status (GtkWidget * button, int status)
1917{
1918#ifdef GTK4
1919 gtk_check_button_set_active (GTK_CHECK_BUTTON(button), status);
1920#else
1921 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), status);
1922#endif
1923}
1924
1937GtkWidget * check_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
1938{
1939 GtkWidget * but = gtk_check_button_new ();
1940 if (text != NULL)
1941 {
1942 gchar * label = g_strdup_printf (" %s", text);
1943#ifdef GTK4
1944 gtk_check_button_set_label (GTK_CHECK_BUTTON(but), label);
1945 GtkWidget * lab = gtk_widget_get_last_child (but);
1946 adjust_label (lab, -1, -1, 0.0, 0.5);
1947#else
1948 add_container_child (CONTAINER_BUT, but, markup_label(label, -1, -1, 0.0, 0.5));
1949#endif
1950 g_free (label);
1951 }
1952 gtk_widget_set_size_request (but, dimx, dimy);
1953 button_set_status (but, state);
1954 if (handler != NULL) g_signal_connect (G_OBJECT(but), "toggled", handler, data);
1955 return but;
1956}
1957
1970GtkWidget * radio_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
1971{
1972 GtkWidget * but;
1973#ifdef GTK4
1974 but = gtk_toggle_button_new ();
1975#else
1976 but = gtk_radio_button_new (NULL);
1977#endif
1978 if (text != NULL) add_container_child (CONTAINER_BUT, but, markup_label(text, -1, -1, 0.0, 0.5));
1979 gtk_widget_set_size_request (but, dimx, dimy);
1980 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(but), state);
1981 if (handler != NULL) g_signal_connect (G_OBJECT(but), "toggled", handler, data);
1982 return but;
1983}
1984
1999GtkWidget * create_button (gchar * text, int image_format, gchar * image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
2000{
2001 GtkWidget * but;
2002#ifdef GTK3
2003 but = (text) ? gtk_button_new_with_label (text) : gtk_button_new ();
2004#else
2005 but = (text && image_format == IMG_NONE) ? gtk_button_new_with_label (text) : gtk_button_new ();
2006#endif
2007 if (image_format != IMG_NONE) button_set_image (GTK_BUTTON(but), text, image_format, (gpointer)image);
2008 gtk_widget_set_size_request (but, dimx, dimy);
2009#ifdef GTK3
2010 gtk_button_set_relief (GTK_BUTTON(but), relief);
2011#endif
2012#ifdef GTK4
2013 if (relief == GTK_RELIEF_NONE) gtk_button_set_has_frame (GTK_BUTTON(but), FALSE);
2014#endif
2015 if (handler != NULL)
2016 {
2017 g_signal_connect (G_OBJECT (but), "clicked", handler, data);
2018 }
2019 return but;
2020}
2021
2030void set_image_from_icon_name (GtkWidget * widg, gchar * icon)
2031{
2032#ifdef GTK4
2033 gtk_image_set_from_icon_name (GTK_IMAGE(widg), icon);
2034#else
2035 gtk_image_set_from_icon_name (GTK_IMAGE(widg), icon, GTK_ICON_SIZE_BUTTON);
2036#endif
2037}
2038
2048void append_comments (GtkWidget * vbox, gchar * symbol, gchar * legend)
2049{
2050 GtkWidget * hbox = create_hbox (BSEP);
2051 gchar * str = g_strdup_printf ("<i><sub>%s</sub></i>", legend);
2052 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(symbol, 15, -1, 1.0, 0.5) , FALSE, FALSE, 5);
2053 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(str, -1, -1, 0.0, 0.5) , FALSE, FALSE, 5);
2054 g_free (str);
2055 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
2056}
2057
2067GtkWidget * abox (GtkWidget * box, char * lab, int vspace)
2068{
2069 GtkWidget * hbox = create_hbox (0);
2070 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, vspace);
2071 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.25), FALSE, FALSE, 10);
2072 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
2073 return hbox;
2074}
2075
2084GtkWidget * bbox (GtkWidget * box, char * lab)
2085{
2086 GtkWidget * hbox = create_hbox (0);
2087 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 2);
2088 GtkWidget * hhbox = create_hbox (0);
2089 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
2090 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(lab, 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
2091 return hhbox;
2092}
2093
2102GtkWidget * cbox (GtkWidget * box, char * lab)
2103{
2104 GtkWidget * hbox = create_hbox (0);
2105 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, TRUE, TRUE, 2);
2106 GtkWidget * hhbox = create_hbox (0);
2107 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, TRUE, TRUE, 40);
2108 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(lab, -1, 30, 0.0, 0.5), TRUE, TRUE, 40);
2109 return hhbox;
2110}
2111
2120GtkWidget * fbox (GtkWidget * box, char * lab)
2121{
2122 GtkWidget * hbox = create_hbox (0);
2123 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 0);
2124 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.5), FALSE, FALSE, 10);
2125 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, 350, 30, 0.0, 0.5), FALSE, FALSE, 0);
2126 return hbox;
2127}
2128
2139GtkWidget * create_scroll (GtkWidget * box, int dimx, int dimy, int shadow)
2140{
2141 GtkWidget * scroll;
2142#ifdef GTK4
2143 scroll = gtk_scrolled_window_new ();
2144#else
2145 scroll = gtk_scrolled_window_new (NULL, NULL);
2146 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll), shadow);
2147#endif
2148 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2149 gtk_widget_set_size_request (scroll, dimx, dimy);
2150 // To check all create_scroll !
2151 if (box != NULL) add_box_child_start (GTK_ORIENTATION_VERTICAL, box, scroll, TRUE, TRUE, 0);
2152 return scroll;
2153}
2154
2163GtkWidget * create_expander (gchar * name, gchar * file_img)
2164{
2165 GtkWidget * expand = gtk_expander_new (name);
2166 GtkWidget * hbox = create_hbox (0);
2167 if (file_img != NULL)
2168 {
2169 GtkWidget * img = gtk_image_new_from_file (file_img);
2170 gtk_widget_set_size_request (img, 20, 20);
2171 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, img, TRUE, TRUE, 10);
2172 }
2173 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(name, 200, 20, 0.0, 0.5), FALSE, TRUE, 0);
2174 gtk_expander_set_label_widget (GTK_EXPANDER(expand), hbox);
2175 return expand;
2176}
2177
2185void provide_gtk_css (gchar * css)
2186{
2187 GtkCssProvider * provider = gtk_css_provider_new ();
2188#ifdef GTK4
2189#if GTK_MINOR_VERSION < 12
2190 gtk_css_provider_load_from_data (provider, css, -1);
2191#else
2192 gtk_css_provider_load_from_string (provider, css);
2193#endif
2194 gtk_style_context_add_provider_for_display (gdk_display_get_default (),
2195 GTK_STYLE_PROVIDER(provider),
2196 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
2197#else
2198 gtk_css_provider_load_from_data (provider, css, -1, NULL);
2199 gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
2200 GTK_STYLE_PROVIDER(provider),
2201 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
2202#endif
2203 g_object_unref (provider);
2204}
2205
2213GtkWidget * destroy_this_widget (GtkWidget * widg)
2214{
2215 hide_the_widgets (widg);
2216#ifdef GTK3
2217 if (widg != NULL)
2218 {
2219 if (GTK_IS_WIDGET(widg))
2220 {
2221 gtk_widget_destroy (widg);
2222 }
2223 }
2224#endif
2225 return NULL;
2226}
2227
2235void destroy_this_dialog (GtkDialog * dialog)
2236{
2237#ifdef GTK4
2238 gtk_window_destroy (GTK_WINDOW(dialog));
2239#else
2240 destroy_this_widget (GTK_WIDGET(dialog));
2241#endif
2242 g_main_loop_quit (Event_loop[dialog_id]);
2243 g_main_loop_unref (Event_loop[dialog_id]);
2244 dialog_id --;
2245}
2246
2254void destroy_this_native_dialog (GtkNativeDialog * dialog)
2255{
2256 gtk_native_dialog_destroy (dialog);
2257 g_object_unref (dialog);
2258 g_main_loop_quit (Event_loop[dialog_id]);
2259 g_main_loop_unref (Event_loop[dialog_id]);
2260 dialog_id --;
2261}
2262
2272G_MODULE_EXPORT void run_destroy_dialog (GtkDialog * dialog, gint response_id, gpointer data)
2273{
2274 destroy_this_dialog (dialog);
2275}
2276
2277#ifdef GTK4
2283GListModel * file_chooser_get_file_names (GtkFileChooser * chooser)
2284{
2285 return gtk_file_chooser_get_files (chooser);
2286}
2287#else
2293GSList * file_chooser_get_file_names (GtkFileChooser * chooser)
2294{
2295 return gtk_file_chooser_get_filenames (chooser);
2296}
2297#endif
2298
2306gchar * file_chooser_get_file_name (GtkFileChooser * chooser)
2307{
2308#ifdef GTK4
2309 return g_file_get_parse_name (gtk_file_chooser_get_file (chooser));
2310#else
2311 return gtk_file_chooser_get_filename (chooser);
2312#endif
2313}
2314
2322gchar * file_chooser_get_current_folder (GtkFileChooser * chooser)
2323{
2324#ifdef GTK4
2325 return g_file_get_parse_name (gtk_file_chooser_get_current_folder (chooser));
2326#else
2327 return gtk_file_chooser_get_current_folder (chooser);
2328#endif
2329}
2330
2339gboolean file_chooser_set_file_name (GtkFileChooser * chooser, gchar * filename)
2340{
2341 GFile * default_file_for_saving = g_file_new_for_path (filename);
2342 gboolean res = gtk_file_chooser_set_file (chooser, default_file_for_saving, NULL);
2343 if (! res)
2344 {
2345 gchar * str = g_strdup_printf (_("Impossible to locate file: %s"), filename);
2346 show_error (str, 0, (GtkWidget *)chooser);
2347 }
2348 return res;
2349}
2350
2358void file_chooser_set_current_folder (GtkFileChooser * chooser)
2359{
2360#ifdef GTK4
2361 gtk_file_chooser_set_current_folder (chooser, g_file_new_for_path ("./"), NULL);
2362#else
2363 gtk_file_chooser_set_current_folder (chooser, "");
2364#endif
2365}
2366
2367#ifdef GTK4
2378GtkFileChooserNative * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name)
2379{
2380 return gtk_file_chooser_native_new (title, parent, act, act_name, _("Cancel"));
2381}
2382#else
2393GtkWidget * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name)
2394{
2395 return gtk_file_chooser_dialog_new (title, parent, act, _("Cancel"), GTK_RESPONSE_CANCEL, act_name, GTK_RESPONSE_ACCEPT, NULL);
2396}
2397#endif
2398
2406ColRGBA get_button_color (GtkColorChooser * colob)
2407{
2408 GdkRGBA col;
2409 gtk_color_chooser_get_rgba (colob, & col);
2410 return gdkrgba_to_rgba (col);
2411}
2412
2420ColRGBA get_window_color (GtkWidget * color_win)
2421{
2422 GdkRGBA col;
2423 gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_win), & col);
2424 return gdkrgba_to_rgba (col);
2425}
2426
2435void set_color_chooser_color (GtkWidget * color_win, ColRGBA col)
2436{
2437 GdkRGBA colo = colrgba_togtkrgba(col);
2438 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(color_win), & colo);
2439}
2440
2441#ifdef GTK4
2451void pop_menu_at_pointer (GtkWidget * pop, double x, double y)
2452{
2453 GdkRectangle rect;
2454 rect.x = x;
2455 rect.y = y;
2456 rect.width = 1;
2457 rect.height = 1;
2458 gtk_popover_set_has_arrow (GTK_POPOVER(pop), FALSE);
2459 gtk_popover_set_pointing_to (GTK_POPOVER(pop), & rect);
2460 gtk_popover_popup (GTK_POPOVER(pop));
2461}
2462#else
2471void pop_menu_at_pointer (GtkWidget * widg, GdkEvent * event)
2472{
2473 show_the_widgets (widg);
2474 gtk_menu_popup_at_pointer (GTK_MENU (widg), event);
2475}
2476#endif
2477
2485GtkWidget * get_top_level (GtkWidget * widg)
2486{
2487#ifdef GTK4
2488 return (GtkWidget *)gtk_widget_get_root (widg);
2489#else
2490 return gtk_widget_get_toplevel (widg);
2491#endif
2492}
2493
2494#ifdef GTK4
2503G_MODULE_EXPORT gboolean destroy_this_window (GtkWindow * win, gpointer data)
2504#else
2514G_MODULE_EXPORT gboolean destroy_this_window (GtkWidget * win, GdkEvent * event, gpointer data)
2515#endif
2516{
2517 destroy_this_widget (GTK_WIDGET(win));
2518 return TRUE;
2519}
2520
2521#ifdef GTK4
2530G_MODULE_EXPORT gboolean hide_this_window (GtkWindow * win, gpointer data)
2531#else
2541G_MODULE_EXPORT gboolean hide_this_window (GtkWidget * win, GdkEvent * event, gpointer data)
2542#endif
2543{
2544 hide_the_widgets (GTK_WIDGET(win));
2545 return TRUE;
2546}
2547
2557void add_gtk_close_event (GtkWidget * widg, GCallback handler, gpointer data)
2558{
2559#ifdef GTK4
2560 g_signal_connect (G_OBJECT (widg), "close-request", handler, data);
2561#else
2562 g_signal_connect (G_OBJECT (widg), "delete-event", handler, data);
2563#endif
2564}
2565
2573int get_widget_width (GtkWidget * widg)
2574{
2575#ifdef GTK3
2576 return gtk_widget_get_allocated_width (widg);
2577#else
2578 return gtk_widget_get_width (widg);
2579#endif
2580}
2581
2589int get_widget_height (GtkWidget * widg)
2590{
2591#ifdef GTK3
2592 return gtk_widget_get_allocated_height (widg);
2593#else
2594 return gtk_widget_get_height (widg);
2595#endif
2596}
double ay
Definition curve.c:71
double ax
Definition curve.c:71
PangoLayout * layout
Definition curve.c:80
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:170
GtkTextTag * tag
Definition global.c:219
GMainLoop * Event_loop[5]
Definition global.c:182
GdkPixbuf * THETD
Definition global.c:222
GtkWidget * pop
Definition global.c:210
Global variable declarations Global convenience function declarations Global data structure defin...
GdkPixbuf * convert_to_pixbuf(cairo_surface_t *surf)
convert cairo surface to GdkPixbuf
Definition gtk-misc.c:1351
@ IMG_PIXBUF
Definition global.h:277
@ IMG_NONE
Definition global.h:276
@ IMG_STOCK
Definition global.h:280
@ IMG_SURFACE
Definition global.h:278
@ IMG_FILE
Definition global.h:279
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:261
GtkWidget * add_advanced_item(GtkWidget *menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
@ CONTAINER_EXP
Definition global.h:271
@ CONTAINER_WIN
Definition global.h:266
@ CONTAINER_FRA
Definition global.h:270
@ CONTAINER_BUT
Definition global.h:269
@ CONTAINER_SCR
Definition global.h:267
@ CONTAINER_VIE
Definition global.h:268
#define DPROPERTIES
Definition global.h:222
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
GtkWidget * create_image_from_data(int format, gpointer item_image)
create Gtk image for data
Definition gtk-misc.c:1530
GtkWidget * create_menu_item(gboolean add_mnemo, gchar *action)
#define min(a, b)
Definition global.h:93
#define DEFAULT_FONT_SIZE
Definition global.h:351
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:92
void motion(glwin *view, gint x, gint y, GdkModifierType state)
mouse motion in the OpenGL window
Definition glview.c:648
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
int step
Definition ogl_draw.c:76
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:616
GdkPixbuf * convert_to_pixbuf(cairo_surface_t *surf)
convert cairo surface to GdkPixbuf
Definition gtk-misc.c:1351
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:533
void file_chooser_set_current_folder(GtkFileChooser *chooser)
set current folder in a GtkFilechooser
Definition gtk-misc.c:2358
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:935
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1401
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:688
void set_renderer_color(int tocol, GtkCellRenderer *renderer, ColRGBA col)
set the color of a GtkCellRenderer
Definition gtk-misc.c:1740
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2048
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:1813
ColRGBA gdkrgba_to_rgba(GdkRGBA colgdk)
convert GdkRGBA color to ColRGBA color
Definition gtk-misc.c:1704
GtkWidget * font_button(gchar *font, int dimx, int dimy, GCallback handler, gpointer data)
create a font selection button
Definition gtk-misc.c:1855
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:1286
GtkTextBuffer * add_buffer(GCallback handler, gpointer data, gchar *text)
create a GtkTextBuffer
Definition gtk-misc.c:1258
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:2139
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:552
void set_color_chooser_color(GtkWidget *color_win, ColRGBA col)
set the color of a color selection window
Definition gtk-misc.c:2435
gboolean is_the_widget_visible(GtkWidget *widg)
test if a GtkWidget exist, then return if it is visible or not
Definition gtk-misc.c:183
void resize_this_window(GtkWidget *window, int x, int y)
resize this GtkWindow
Definition gtk-misc.c:636
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:486
void combo_set_markup(GtkWidget *combo)
use pango markup in combo widget
Definition gtk-misc.c:970
ColRGBA get_window_color(GtkWidget *color_win)
get the ColRGBA color from a color selection window
Definition gtk-misc.c:2420
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:958
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:900
int get_widget_height(GtkWidget *widg)
retrive GtkWidget height
Definition gtk-misc.c:2589
gchar * file_chooser_get_file_name(GtkFileChooser *chooser)
get a file name from a GtkFileChooser (single file selected)
Definition gtk-misc.c:2306
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:652
GdkRGBA colrgba_togtkrgba(ColRGBA col)
convert ColRGBA color to GdkRGBA color
Definition gtk-misc.c:1721
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:669
G_MODULE_EXPORT gboolean hide_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
hide a GtkWindow
Definition gtk-misc.c:2541
void pop_menu_at_pointer(GtkWidget *widg, GdkEvent *event)
popup a menu at pointer location
Definition gtk-misc.c:2471
gboolean file_chooser_set_file_name(GtkFileChooser *chooser, gchar *filename)
set file name in a GtkFilechooser
Definition gtk-misc.c:2339
G_MODULE_EXPORT gboolean destroy_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
destroy a GtkWindow
Definition gtk-misc.c:2514
GtkWidget * stock_image(const gchar *stock_id)
create a GtkImage for the Gtk database
Definition gtk-misc.c:1451
int get_widget_width(GtkWidget *widg)
retrive GtkWidget width
Definition gtk-misc.c:2573
void add_gtk_close_event(GtkWidget *widg, GCallback handler, gpointer data)
add a close event signal and callback to a GtkWidget
Definition gtk-misc.c:2557
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:814
void layout_add_widget(GtkWidget *layout, GtkWidget *child, int x_pos, int y_pos)
Add a GtkWidget in a GtkLayout.
Definition gtk-misc.c:882
void set_renderer_markup(GtkTreeModel *mod, GtkTreeIter *iter, GtkCellRenderer *renderer, int col)
set Pango text markup for a GtkCellRenderer
Definition gtk-misc.c:1764
void button_set_status(GtkWidget *button, int status)
set status of check / toggle button
Definition gtk-misc.c:1916
GtkWidget * fbox(GtkWidget *box, char *lab)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2120
gchar * file_chooser_get_current_folder(GtkFileChooser *chooser)
get the current folder for a GtkFileChooser
Definition gtk-misc.c:2322
GtkWidget * radio_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a radio button
Definition gtk-misc.c:1970
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:1877
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1937
G_MODULE_EXPORT void to_activate_entry(GtkEventControllerFocus *focus, gpointer data)
GtkEntry activate signal managment.
Definition gtk-misc.c:1384
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:1999
GtkWidget * get_top_level(GtkWidget *widg)
get the top level container, window, of a widget
Definition gtk-misc.c:2485
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:1010
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:861
void button_set_image(GtkButton *but, gchar *text, int format, gpointer image)
Add an image to a GtkButton.
Definition gtk-misc.c:1782
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
GtkWidget * cbox(GtkWidget *box, char *lab)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2102
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:340
ColRGBA get_button_color(GtkColorChooser *colob)
get the ColRGBA color from a GtkColorChooser button
Definition gtk-misc.c:2406
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2235
void text_view_set_monospace(GtkWidget *view)
set the font of a GtkTextView as monospace
Definition gtk-misc.c:742
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
GtkWidget * new_gtk_window()
create a new GtkWindow
Definition gtk-misc.c:389
GtkWidget * create_image_from_data(int format, gpointer item_image)
create Gtk image for data
Definition gtk-misc.c:1530
void gtk_label_align(GtkWidget *lab, float ax, float ay)
set text alignment in a GtkLabel
Definition gtk-misc.c:756
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:987
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:2272
GtkWidget * create_layout(int x, int y)
create a GtkLayout / GtkFixed widget
Definition gtk-misc.c:916
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
GtkWidget * color_button(ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
create a color selection button
Definition gtk-misc.c:1833
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:780
GtkWidget * bbox(GtkWidget *box, char *lab)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2084
void add_box_child_end(GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the end position.
Definition gtk-misc.c:318
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:726
void provide_gtk_css(gchar *css)
create a css provider based on the css data
Definition gtk-misc.c:2185
GSList * file_chooser_get_file_names(GtkFileChooser *chooser)
create a file list from files selected using a GtkFileChooser
Definition gtk-misc.c:2293
void setup_text_tags(GtkTextBuffer *buffer)
prepare the available text tags for the GtkTextBuffer
Definition gtk-misc.c:1022
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
void set_image_from_icon_name(GtkWidget *widg, gchar *icon)
set a image from a stock icon name
Definition gtk-misc.c:2030
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:573
void combo_text_prepend(GtkWidget *combo, gchar *text)
prepend text in GtkComboBox widget
Definition gtk-misc.c:1000
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:224
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
ColRGBA * duplicate_color(int num, ColRGBA *col)
duplicate a ColRGBA pointer
Definition gtk-misc.c:1689
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1899
GtkWidget * abox(GtkWidget *box, char *lab, int vspace)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2067
GtkWidget * create_expander(gchar *name, gchar *file_img)
create GtkExpander
Definition gtk-misc.c:2163
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:2393
void destroy_this_native_dialog(GtkNativeDialog *dialog)
destroy a GtkNativeDialog
Definition gtk-misc.c:2254
void adjust_preferences_window()
adjust the widgets of the preferences window
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
void update_entry_long_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as long double
Definition gtk-misc.c:707
void show_error(char *error, int val, GtkWidget *win)
show error message
Definition interface.c:299
Messaging function declarations.
double y
Definition ogl_draw.c:63
double x
Definition ogl_draw.c:63
gboolean preferences
Preference variable declarations.
Definition glwin.h:350
Definition glwin.h:364
int status
Definition w_advance.c:173
GtkWidget * res[2]
Definition w_encode.c:342
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