atomes 1.1.14
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-2024 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 widget_set_sensitive (GtkWidget * widg, gboolean sensitive);
53 void add_container_child (int type, GtkWidget * widg, GtkWidget * child);
54 void add_box_child_end (GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding);
55 void add_box_child_start (int orientation, GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding);
56 void add_widget_gesture_and_key_action (GtkWidget * widget,
57 gchar * cp_name, GCallback cp_handler, gpointer cp_data,
58 gchar * cr_name, GCallback cr_handler, gpointer cr_data,
59 gchar * kp_name, GCallback kp_handler, gpointer kp_data,
60 gchar * mo_name, GCallback mo_handler, gpointer mo_data,
61 gchar * sc_name, GCallback sc_handler, gpointer sc_data);
62 void run_this_gtk_native_dialog (GtkNativeDialog * dial, GCallback handler, gpointer data);
63 void run_this_gtk_dialog (GtkWidget * dial, GCallback handler, gpointer data);
64 void resize_this_window (GtkWidget * window, int x, int y);
65 void update_entry_int (GtkEntry * entry, int intval);
66 void update_entry_double (GtkEntry * entry, double doubleval);
67 void update_entry_long_double (GtkEntry * entry, double doubleval);
68 void update_entry_text (GtkEntry * entry, gchar * text);
69 void text_view_set_monospace (GtkWidget * view);
70 void gtk_label_align (GtkWidget * lab, float ax, float ay);
71 void layout_add_widget (GtkWidget * layout, GtkWidget * child, int x_pos, int y_pos);
72 void combo_text_append (GtkWidget * combo, gchar * text);
73 void combo_text_prepend (GtkWidget * combo, gchar * text);
74 void setup_text_tags (GtkTextBuffer * buffer);
75 void add_menu_separator (GtkWidget * menu);
76 void set_renderer_color (int tocol, GtkCellRenderer * renderer, ColRGBA col);
77 void button_set_image (GtkButton * but, gchar * text, int format, gpointer image);
78 void adjust_label (GtkWidget * lab, int dimx, int dimy, float ax, float ay);
79 void set_image_from_icon_name (GtkWidget * widg, gchar * icon);
80 void provide_gtk_css (gchar * css);
81 void destroy_this_dialog (GtkDialog * dialog);
82 void destroy_this_native_dialog (GtkNativeDialog * dialog);
83 void file_chooser_set_current_folder (GtkFileChooser * chooser);
84 void set_color_chooser_color (GtkWidget * color_win, ColRGBA col);
85 void pop_menu_at_pointer (GtkWidget * pop, double x, double y);
86 void pop_menu_at_pointer (GtkWidget * widg, GdkEvent * event);
87 void add_gtk_close_event (GtkWidget * widg, GCallback handler, gpointer data);
88 static void convert_alpha (cairo_surface_t * surf, GdkPixbuf * pix, int src_x, int src_y, int width, int height);
89
90 G_MODULE_EXPORT void to_activate_entry (GtkEventControllerFocus * focus, gpointer data);
91 G_MODULE_EXPORT void run_destroy_dialog (GtkDialog * dialog, gint response_id, gpointer data);
92
93 GtkWidget * menu_item_new_with_submenu (gchar * name, gboolean active, GtkWidget * sub_menu);
94 GtkWidget * new_gtk_window ();
95 GtkWidget * create_win (gchar * str, GtkWidget * parent, gboolean modal, gboolean resiz);
96 GtkWidget * dialogmodal (gchar * str, GtkWindow * parent);
97 GtkWidget * message_dialogmodal (gchar * message, gchar * title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget * parent);
98 GtkWidget * dialog_cancel_apply (gchar * title, GtkWidget * parent, gboolean resiz);
99 GtkWidget * create_hscale (float min, float max, float delta,
100 float val, int pos, int round, int size,
101 GCallback handler, GCallback scroll_handler, gpointer data);
102 GtkWidget * create_vscale (float min, float max, float delta,
103 float val, int pos, int round, int size,
104 GCallback handler, GCallback scroll_handler, gpointer data);
105 GtkWidget * create_vbox (int spacing);
106 GtkWidget * create_hbox (int spacing);
107 GtkWidget * dialog_get_content_area (GtkWidget * widg);
108 GtkWidget * add_vbox_to_layout (GtkWidget * layout, int size_x, int size_y);
109 GtkWidget * create_layout (int x, int y);
110 GtkWidget * create_combo ();
111 GtkWidget * create_text_view (int dimx, int dimy, int edit, int mono, GCallback handler, gpointer data, gchar * text);
112 GtkWidget * create_entry (GCallback handler, int dim, int cdim, gboolean key_release, gpointer data);
113 GtkWidget * stock_image (const gchar * stock_id);
114 GtkWidget * create_menu_item (gboolean add_mnemo, gchar * name);
115 GtkWidget * create_menu_item_from_widget (GtkWidget * widg, gboolean check, gboolean radio, gboolean status);
116 GtkWidget * create_image_from_data (int format, gpointer item_image);
117 GtkWidget * gtk3_menu_item (GtkWidget * menu, gchar * name,
118 int icon_format, gpointer item_icon,
119 GCallback handler, gpointer data,
120 gboolean accel, guint key, GdkModifierType mod,
121 gboolean check, gboolean radio, gboolean status);
122 GtkWidget * add_advanced_item (GtkWidget * menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod);
123 GtkWidget * markup_label (gchar * text, int dimx, int dimy, float ax, float ay);
124 GtkWidget * color_button (ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data);
125 GtkWidget * font_button (gchar * font, int dimx, int dimy, GCallback handler, gpointer data);
126 GtkWidget * spin_button (GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data);
127 GtkWidget * check_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data);
128 GtkWidget * radio_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data);
129 GtkWidget * create_button (gchar * text, int image_format, gchar * image, int dimx, int dimy, int relief, GCallback handler, gpointer data);
130 GtkWidget * abox (GtkWidget * box, char * lab, int vspace);
131 GtkWidget * bbox (GtkWidget * box, char * lab);
132 GtkWidget * cbox (GtkWidget * box, char * lab);
133 GtkWidget * fbox (GtkWidget * box, char * lab);
134 GtkWidget * create_scroll (GtkWidget * box, int dimx, int dimy, int shadow);
135 GtkWidget * create_expander (gchar * name, gchar * file_img);
136 GtkWidget * destroy_this_widget (GtkWidget * widg);
137 GtkWidget * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name);
138 GtkWidget * get_top_level (GtkWidget * widg);
139
140 GtkTextBuffer * add_buffer (GCallback handler, gpointer data, gchar * text);
141
142 GtkFileChooserNative * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name);
143
144 GdkPixbuf * convert_to_pixbuf (cairo_surface_t * surf);
145
146 GMenuItem * create_menu_item (gboolean add_mnemo, gchar * name, gchar * action);
147
148 GListModel * file_chooser_get_file_names (GtkFileChooser * chooser);
149
150 ColRGBA * duplicate_color (int num, ColRGBA * col);
151 ColRGBA gdkrgba_to_rgba (GdkRGBA colgdk);
152 ColRGBA get_button_color (GtkColorChooser * colob);
153 ColRGBA get_window_color (GtkWidget * color_win);
154
155 GdkRGBA colrgba_togtkrgba (ColRGBA col);
156
157*/
158
159#include "global.h"
160#include "interface.h"
161
169void show_the_widgets (GtkWidget * widg)
170{
171#ifdef GTK4
172 gtk_widget_show (widg);
173#else
174 gtk_widget_show_all (widg);
175#endif
176}
177
186void widget_set_sensitive (GtkWidget * widg, gboolean sensitive)
187{
188 if (widg != NULL)
189 {
190 if (GTK_IS_WIDGET(widg))
191 {
192 gtk_widget_set_sensitive (widg, sensitive);
193 }
194 }
195}
196
206void add_container_child (int type, GtkWidget * widg, GtkWidget * child)
207{
208#ifdef GTK3
209 gtk_container_add (GTK_CONTAINER(widg), child);
210#else
211 switch (type)
212 {
213 case CONTAINER_WIN:
214 // gtk_window_set_child ((GtkWindow *)widg, NULL);
215 gtk_window_set_child ((GtkWindow *)widg, child);
216 break;
217 case CONTAINER_SCR:
218 // Bug in the management of scrolled window child
219/* Frequently getting warning messages at this point with GTK4
220(atomes:?????): GLib-GObject-CRITICAL **: ??:??:??.???: g_object_set: assertion 'G_IS_OBJECT (object)' failed
221(atomes:?????): Gtk-CRITICAL **: ??:??:??.???: gtk_widget_unparent: assertion 'GTK_IS_WIDGET (widget)' failed
222*/
223 gtk_scrolled_window_set_child ((GtkScrolledWindow *)widg, NULL);
224 gtk_scrolled_window_set_child ((GtkScrolledWindow *)widg, child);
225 break;
226 case CONTAINER_VIE:
227 // gtk_viewport_set_child ((GtkViewport *)widg, NULL);
228 gtk_viewport_set_child ((GtkViewport *)widg, child);
229 break;
230 case CONTAINER_BUT:
231 // gtk_button_set_child ((GtkButton *)widg, NULL);
232 gtk_button_set_child ((GtkButton *)widg, child);
233 break;
234 case CONTAINER_FRA:
235 // gtk_frame_set_child ((GtkFrame *)widg, NULL);
236 gtk_frame_set_child ((GtkFrame *)widg, child);
237 break;
238 case CONTAINER_EXP:
239 // gtk_expander_set_child ((GtkExpander *)widg, NULL);
240 gtk_expander_set_child ((GtkExpander *)widg, child);
241 break;
242 }
243#endif
244}
245
257void add_box_child_end (GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding)
258{
259#ifdef GTK4
260 // gtk_widget_set_hexpand (child, TRUE);
261 gtk_box_append (GTK_BOX(widg), child);
262#else
263 gtk_box_pack_end (GTK_BOX(widg), child, expand, fill, padding);
264#endif
265}
266
279void add_box_child_start (int orientation, GtkWidget * widg, GtkWidget * child, gboolean expand, gboolean fill, int padding)
280{
281#ifdef GTK4
282 if (orientation == GTK_ORIENTATION_HORIZONTAL && padding)
283 {
284 gtk_box_append (GTK_BOX(widg), markup_label (" ", padding, -1, 0.0, 0.0));
285 }
286 else if (orientation == GTK_ORIENTATION_VERTICAL && padding > 10)
287 {
288 gtk_box_append (GTK_BOX(widg), markup_label (" ", -1, padding/2, 0.0, 0.0));
289 }
290 gtk_box_append (GTK_BOX(widg), child);
291 if (orientation == GTK_ORIENTATION_HORIZONTAL && padding)
292 {
293 gtk_box_append (GTK_BOX(widg), markup_label (" ", padding, -1, 0.0, 0.0));
294 }
295 else if (orientation == GTK_ORIENTATION_VERTICAL && padding > 10)
296 {
297 gtk_box_append (GTK_BOX(widg), markup_label (" ", -1, padding/2, 0.0, 0.0));
298 }
299#else
300 gtk_box_pack_start (GTK_BOX(widg), child, expand, fill, padding);
301#endif
302}
303
304#ifdef GTK3
314GtkWidget * menu_item_new_with_submenu (gchar * name, gboolean active, GtkWidget * sub_menu)
315{
316 GtkWidget * item = create_menu_item (FALSE, name);
317 gtk_menu_item_set_submenu ((GtkMenuItem *)item, sub_menu);
318 widget_set_sensitive (item, active);
319 return item;
320}
321#endif
322
328GtkWidget * new_gtk_window ()
329{
330#ifdef GTK4
331 return gtk_window_new ();
332#else
333 return gtk_window_new (GTK_WINDOW_TOPLEVEL);
334#endif
335}
336
337#ifdef GTK4
365void add_widget_gesture_and_key_action (GtkWidget * widget,
366 gchar * cp_name, GCallback cp_handler, gpointer cp_data,
367 gchar * cr_name, GCallback cr_handler, gpointer cr_data,
368 gchar * kp_name, GCallback kp_handler, gpointer kp_data,
369 gchar * mo_name, GCallback mo_handler, gpointer mo_data,
370 gchar * sc_name, GCallback sc_handler, gpointer sc_data)
371{
372 GtkGesture * gesture;
373 GtkEventController * key;
374 GtkEventController * motion;
375 if (cp_name)
376 {
377 gesture = gtk_gesture_click_new ();
378 gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (gesture), cp_name);
379 gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
380 if (cp_handler) g_signal_connect (gesture, "pressed", cp_handler, cp_data);
381 gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
382 }
383 if (cr_name)
384 {
385 gesture = gtk_gesture_click_new ();
386 gtk_event_controller_set_name (GTK_EVENT_CONTROLLER (gesture), cr_name);
387 gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
388 if (cr_handler) g_signal_connect (gesture, "released", cr_handler, cr_data);
389 gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
390 }
391 if (kp_name)
392 {
393 key = gtk_event_controller_key_new ();
394 gtk_event_controller_set_name (key, kp_name);
395 if (kp_handler) g_signal_connect (key, "key-pressed", kp_handler, kp_data);
396 gtk_widget_add_controller (widget, key);
397 }
398 if (mo_name)
399 {
400 motion = gtk_event_controller_motion_new ();
401 gtk_event_controller_set_name (motion, mo_name);
402 if (mo_handler) g_signal_connect (motion, "motion", mo_handler, mo_data);
403 gtk_widget_add_controller (widget, motion);
404 }
405 if (sc_name)
406 {
407 motion = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL);
408 gtk_event_controller_set_name (motion, sc_name);
409 if (sc_handler) g_signal_connect (motion, "scroll", sc_handler, sc_data);
410 gtk_widget_add_controller (widget, motion);
411 }
412}
413#endif
414
425GtkWidget * create_win (gchar * str, GtkWidget * parent, gboolean modal, gboolean resiz)
426{
427 GtkWidget * win;
428 win = new_gtk_window ();
429 gtk_window_set_title (GTK_WINDOW(win), prepare_for_title(str));
430 gtk_window_set_resizable (GTK_WINDOW (win), TRUE);
431#ifdef GTK3
432 gtk_window_set_attached_to (GTK_WINDOW (win), parent);
433 gtk_window_set_icon (GTK_WINDOW (win), THETD);
434#endif
435 // gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent));
436 gtk_window_set_modal (GTK_WINDOW(win), modal);
437 gtk_window_set_resizable (GTK_WINDOW(win), resiz);
438 gtk_window_set_destroy_with_parent (GTK_WINDOW (win), TRUE);
439 return win;
440}
441
442#ifdef GTK4
452void run_this_gtk_native_dialog (GtkNativeDialog * dial, GCallback handler, gpointer data)
453{
454 gtk_native_dialog_set_modal (dial, TRUE);
455 if (handler) g_signal_connect (G_OBJECT(dial), "response", handler, data);
456 gtk_native_dialog_show (dial);
457 dialog_id ++;
458 Event_loop[dialog_id] = g_main_loop_new (NULL, FALSE);
459 g_main_loop_run (Event_loop[dialog_id]);
460}
461#endif
462
472void run_this_gtk_dialog (GtkWidget * dial, GCallback handler, gpointer data)
473{
474 gtk_window_set_modal (GTK_WINDOW(dial), TRUE);
475 if (handler) g_signal_connect (G_OBJECT(dial), "response", handler, data);
476 show_the_widgets (dial);
477 dialog_id ++;
478 Event_loop[dialog_id] = g_main_loop_new (NULL, FALSE);
479 g_main_loop_run (Event_loop[dialog_id]);
480}
481
490GtkWidget * dialogmodal (gchar * str, GtkWindow * parent)
491{
492 GtkWidget * win = gtk_dialog_new_with_buttons (str, parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("_Close"), GTK_RESPONSE_CLOSE, NULL);
493 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
494#ifdef GTK3
495 gtk_window_set_icon (GTK_WINDOW (win), THETD);
496#endif
497 return win;
498}
499
511GtkWidget * message_dialogmodal (gchar * message, gchar * title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget * parent)
512{
513 GtkWidget * win;
514 if (parent)
515 {
516 win = gtk_message_dialog_new (GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, mtype, buttons, NULL);
517 }
518 else
519 {
520 win = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, mtype, buttons, NULL);
521 }
522 gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (win), message);
523 gtk_window_set_title (GTK_WINDOW(win), title);
524 gtk_window_set_resizable (GTK_WINDOW (win), FALSE);
525#ifdef GTK3
526 gtk_window_set_icon (GTK_WINDOW (win), THETD);
527#endif
528 show_the_widgets (win);
529 return win;
530}
531
541GtkWidget * dialog_cancel_apply (gchar * title, GtkWidget * parent, gboolean resiz)
542{
543 GtkWidget * dca = gtk_dialog_new_with_buttons (title, GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
544 "Cancel", GTK_RESPONSE_CANCEL, "Apply", GTK_RESPONSE_APPLY, NULL);
545 gtk_window_set_resizable (GTK_WINDOW(dca), resiz);
546#ifdef GTK3
547 gtk_window_set_icon (GTK_WINDOW (dca), THETD);
548#endif
549 return dca;
550}
551
561void resize_this_window (GtkWidget * window, int x, int y)
562{
563#ifdef GTK3
564 gtk_window_resize (GTK_WINDOW(window), x, y);
565#else
566 gtk_window_set_default_size (GTK_WINDOW(window), x, y);
567#endif
568}
569
577const gchar * entry_get_text (GtkEntry * entry)
578{
579#ifdef GTK4
580 return gtk_editable_get_text (GTK_EDITABLE(entry));
581#else
582 return gtk_entry_get_text (entry);
583#endif
584}
585
594void update_entry_int (GtkEntry * entry, int intval)
595{
596 gchar * value = g_strdup_printf("%d", intval);
597#ifdef GTK4
598 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
599#else
600 gtk_entry_set_text (entry, (const gchar *)value);
601#endif
602 g_free (value);
603}
604
613void update_entry_double (GtkEntry * entry, double doubleval)
614{
615 gchar * value = g_strdup_printf("%f", doubleval);
616#ifdef GTK4
617 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
618#else
619 gtk_entry_set_text (entry, (const gchar *)value);
620#endif
621 g_free (value);
622}
623
632void update_entry_long_double (GtkEntry * entry, double doubleval)
633{
634 gchar * value = g_strdup_printf("%15.10lf", doubleval);
635#ifdef GTK4
636 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)value);
637#else
638 gtk_entry_set_text (entry, (const gchar *)value);
639 g_free (value);
640#endif
641}
642
651void update_entry_text (GtkEntry * entry, gchar * text)
652{
653#ifdef GTK4
654 gtk_editable_set_text (GTK_EDITABLE(entry), (const gchar *)text);
655#else
656 gtk_entry_set_text (entry, (const gchar *)text);
657#endif
658}
659
667void text_view_set_monospace (GtkWidget * view)
668{
669 gtk_text_view_set_monospace (GTK_TEXT_VIEW(view), TRUE);
670}
671
681void gtk_label_align (GtkWidget * lab, float ax, float ay)
682{
683 gtk_label_set_xalign (GTK_LABEL (lab), ax);
684 gtk_label_set_yalign (GTK_LABEL (lab), ay);
685}
686
694gboolean is_the_widget_visible (GtkWidget * widg)
695{
696 if (GTK_IS_WIDGET(widg))
697 {
698 return gtk_widget_is_visible (widg);
699 }
700 else
701 {
702 return FALSE;
703 }
704}
705
724GtkWidget * create_hscale (float min, float max, float delta,
725 float val, int pos, int round, int size,
726 GCallback handler, GCallback scroll_handler, gpointer data)
727{
728 GtkWidget * hscale;
729 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, min, max, delta);
730 gtk_scale_set_draw_value (GTK_SCALE(hscale), TRUE);
731 gtk_widget_set_size_request (hscale, size, -1);
732 gtk_scale_set_value_pos (GTK_SCALE(hscale), pos);
733 gtk_range_set_value (GTK_RANGE(hscale), val);
734 gtk_range_set_round_digits (GTK_RANGE(hscale), round);
735 if (handler != NULL) g_signal_connect (G_OBJECT(hscale), "value-changed", handler, data);
736 if (scroll_handler != NULL) g_signal_connect (G_OBJECT(hscale), "change-value", scroll_handler, data);
737 return hscale;
738}
739
758GtkWidget * create_vscale (float min, float max, float delta,
759 float val, int pos, int round, int size,
760 GCallback handler, GCallback scroll_handler, gpointer data)
761{
762 GtkWidget * vscale;
763 vscale = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, min, max, delta);
764 gtk_scale_set_draw_value (GTK_SCALE(vscale), TRUE);
765 gtk_scale_set_value_pos (GTK_SCALE(vscale), pos);
766 gtk_widget_set_size_request (vscale, size, size);
767 gtk_range_set_value (GTK_RANGE(vscale), val);
768 gtk_range_set_round_digits (GTK_RANGE(vscale), round);
769 if (handler != NULL) g_signal_connect (G_OBJECT(vscale), "value-changed", handler, data);
770 if (scroll_handler != NULL) g_signal_connect (G_OBJECT(vscale), "change-value", scroll_handler, data);
771 return vscale;
772}
773
781GtkWidget * create_vbox (int spacing)
782{
783 return gtk_box_new (GTK_ORIENTATION_VERTICAL, spacing);
784}
785
793GtkWidget * create_hbox (int spacing)
794{
795 return gtk_box_new (GTK_ORIENTATION_HORIZONTAL, spacing);
796}
797
805GtkWidget * dialog_get_content_area (GtkWidget * widg)
806{
807#ifdef GTK3
808 return gtk_dialog_get_content_area (GTK_DIALOG(widg));
809#else
810 GtkWidget * vbox = create_vbox (BSEP);
811 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, gtk_dialog_get_content_area (GTK_DIALOG(widg)), vbox, TRUE, TRUE, 0);
812 return vbox;
813#endif
814}
815
826void layout_add_widget (GtkWidget * layout, GtkWidget * child, int x_pos, int y_pos)
827{
828#ifdef GTK3
829 gtk_layout_put (GTK_LAYOUT(layout), child, x_pos, y_pos);
830#else
831 gtk_fixed_put (GTK_FIXED(layout), child, x_pos, y_pos);
832#endif
833}
834
844GtkWidget * add_vbox_to_layout (GtkWidget * layout, int size_x, int size_y)
845{
846 GtkWidget * vbox = create_vbox (BSEP);
847 gtk_widget_set_size_request (vbox, size_x, size_y);
849 return vbox;
850}
851
860GtkWidget * create_layout (int x, int y)
861{
862 GtkWidget * layout;
863#ifdef GTK3
864 layout = gtk_layout_new (NULL, NULL);
865#else
866 layout = gtk_fixed_new ();
867#endif
868 gtk_widget_set_size_request (layout, x, y);
869 return layout;
870}
871
880void combo_text_append (GtkWidget * combo, gchar * text)
881{
882 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo), text);
883}
884
893void combo_text_prepend (GtkWidget * combo, gchar * text)
894{
895 gtk_combo_box_text_prepend_text (GTK_COMBO_BOX_TEXT(combo), text);
896}
897
903GtkWidget * create_combo ()
904{
905 return gtk_combo_box_text_new ();
906}
907
915void setup_text_tags (GtkTextBuffer * buffer)
916{
917 GtkTextTagTable * textags = gtk_text_buffer_get_tag_table(buffer);
918
919 /* Sans font */
920 tag = gtk_text_tag_new ("sans");
921 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "family", "sans", NULL);
922 gtk_text_tag_table_add (textags, tag);
923 g_object_unref (tag);
924
925 /* Monospace font */
926 tag = gtk_text_tag_new ("monospace");
927 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "family", "monospace", NULL);
928 gtk_text_tag_table_add (textags, tag);
929 g_object_unref (tag);
930
931 /* Default Font size */
932 tag = gtk_text_tag_new ("default-size");
933 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, NULL);
934 gtk_text_tag_table_add (textags, tag);
935 g_object_unref (tag);
936
937 /* <u> */
938 tag = gtk_text_tag_new ("underline");
939 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "underline", PANGO_UNDERLINE_SINGLE, NULL);
940 gtk_text_tag_table_add (textags, tag);
941 g_object_unref (tag);
942
943 /* <uu> */
944 tag = gtk_text_tag_new ("underline_double");
945 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "underline", PANGO_UNDERLINE_DOUBLE, NULL);
946 gtk_text_tag_table_add (textags, tag);
947 g_object_unref (tag);
948
949 /* <i> italic */
950 tag = gtk_text_tag_new ("italic");
951 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "style", PANGO_STYLE_ITALIC, NULL);
952 gtk_text_tag_table_add (textags, tag);
953 g_object_unref (tag);
954
955 /* <b> bold */
956 tag = gtk_text_tag_new ("bold");
957 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "weight", PANGO_WEIGHT_BOLD, NULL);
958 gtk_text_tag_table_add (textags, tag);
959 g_object_unref (tag);
960
961 /* <b> bold italic */
962 tag = gtk_text_tag_new ("bold_italic");
963 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
964 "style", PANGO_STYLE_ITALIC,
965 "weight", PANGO_WEIGHT_BOLD, NULL);
966 gtk_text_tag_table_add (textags, tag);
967 g_object_unref (tag);
968
969 /* <sup> superscript */
970 tag = gtk_text_tag_new ("sup");
971 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "scale", .6, "rise", 6000, NULL);
972 gtk_text_tag_table_add (textags, tag);
973 g_object_unref (tag);
974
975 /* <sub> subscript */
976 tag = gtk_text_tag_new ("sub");
977 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "scale", .6, "rise", -6000, NULL);
978 gtk_text_tag_table_add (textags, tag);
979 g_object_unref (tag);
980
981 /* justify-left */
982 tag = gtk_text_tag_new("justify-left");
983 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "justification", GTK_JUSTIFY_LEFT, NULL);
984 gtk_text_tag_table_add(textags, tag);
985 g_object_unref(tag);
986
987 /* justify-center */
988 tag = gtk_text_tag_new("justify-center");
989 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "justification", GTK_JUSTIFY_CENTER, NULL);
990 gtk_text_tag_table_add(textags, tag);
991 g_object_unref(tag);
992
993 /* justify-right */
994 tag = gtk_text_tag_new("justify-right");
995 g_object_set(tag, "justification", GTK_JUSTIFY_RIGHT, NULL);
996 gtk_text_tag_table_add(textags, tag);
997 g_object_unref (tag);
998
999 /* heading */
1000 tag = gtk_text_tag_new("heading");
1001 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1002 "weight", PANGO_WEIGHT_BOLD,
1003 "scale", 1.5,
1004 "justification", GTK_JUSTIFY_CENTER,
1005 "underline", PANGO_UNDERLINE_DOUBLE, NULL);
1006 gtk_text_tag_table_add(textags, tag);
1007 g_object_unref (tag);
1008
1009 /* red font */
1010 tag = gtk_text_tag_new("red");
1011 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "red", NULL);
1012 gtk_text_tag_table_add(textags, tag);
1013 g_object_unref (tag);
1014
1015 /* orange font */
1016 tag = gtk_text_tag_new("orange");
1017 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "orange", NULL);
1018 gtk_text_tag_table_add(textags, tag);
1019 g_object_unref (tag);
1020
1021 /* yellow font */
1022 tag = gtk_text_tag_new("yellow");
1023 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "yellow2", NULL);
1024 gtk_text_tag_table_add(textags, tag);
1025 g_object_unref (tag);
1026
1027 /* green font */
1028 tag = gtk_text_tag_new("green");
1029 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "green", NULL);
1030 gtk_text_tag_table_add(textags, tag);
1031 g_object_unref (tag);
1032
1033 /* light green font */
1034 tag = gtk_text_tag_new("light_green");
1035 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "light green", NULL);
1036 gtk_text_tag_table_add(textags, tag);
1037 g_object_unref (tag);
1038
1039 /* cyan font */
1040 tag = gtk_text_tag_new("cyan");
1041 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "cyan", NULL);
1042 gtk_text_tag_table_add(textags, tag);
1043 g_object_unref (tag);
1044
1045 /* blue font */
1046 tag = gtk_text_tag_new("blue");
1047 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "blue", NULL);
1048 gtk_text_tag_table_add(textags, tag);
1049 g_object_unref (tag);
1050
1051 /* pink font */
1052 tag = gtk_text_tag_new("pink");
1053 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "pink", NULL);
1054 gtk_text_tag_table_add(textags, tag);
1055 g_object_unref (tag);
1056
1057 /* violet font */
1058 tag = gtk_text_tag_new("violet");
1059 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "foreground", "dark violet", NULL);
1060 gtk_text_tag_table_add(textags, tag);
1061 g_object_unref (tag);
1062
1063 /* grey background */
1064 tag = gtk_text_tag_new("grey_back");
1065 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE, "background", "lightgrey", NULL);
1066 gtk_text_tag_table_add(textags, tag);
1067 g_object_unref (tag);
1068
1069 /* bold grey background */
1070 tag = gtk_text_tag_new("bold_grey_back");
1071 g_object_set(tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1072 "background", "lightgrey",
1073 "weight", PANGO_WEIGHT_BOLD, NULL);
1074 gtk_text_tag_table_add(textags, tag);
1075 g_object_unref (tag);
1076
1077 /* bold red font */
1078 tag = gtk_text_tag_new ("bold_red");
1079 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1080 "foreground", "red",
1081 "weight", PANGO_WEIGHT_BOLD, NULL);
1082 gtk_text_tag_table_add (textags, tag);
1083 g_object_unref (tag);
1084
1085 /* bold blue font */
1086 tag = gtk_text_tag_new ("bold_blue");
1087 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1088 "foreground", "blue",
1089 "weight", PANGO_WEIGHT_BOLD, NULL);
1090 gtk_text_tag_table_add (textags, tag);
1091 g_object_unref (tag);
1092
1093 /* bold green font */
1094 tag = gtk_text_tag_new ("bold_green");
1095 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1096 "foreground", "green",
1097 "weight", PANGO_WEIGHT_BOLD, NULL);
1098 gtk_text_tag_table_add (textags, tag);
1099 g_object_unref (tag);
1100
1101 /* bold orange font */
1102 tag = gtk_text_tag_new ("bold_orange");
1103 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1104 "foreground", "orange",
1105 "weight", PANGO_WEIGHT_BOLD, NULL);
1106 gtk_text_tag_table_add (textags, tag);
1107 g_object_unref (tag);
1108
1109 /* bold pink font */
1110 tag = gtk_text_tag_new ("bold_pink");
1111 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1112 "foreground", "pink",
1113 "weight", PANGO_WEIGHT_BOLD, NULL);
1114 gtk_text_tag_table_add (textags, tag);
1115 g_object_unref (tag);
1116
1117 /* subscript italic*/
1118 tag = gtk_text_tag_new ("sub_italic");
1119 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1120 "style", PANGO_STYLE_ITALIC,
1121 "scale", .6, "rise", -6000, NULL);
1122 gtk_text_tag_table_add (textags, tag);
1123 g_object_unref (tag);
1124
1125 /* subscript bold */
1126 tag = gtk_text_tag_new ("sub_bold");
1127 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1128 "weight", PANGO_WEIGHT_BOLD,
1129 "scale", .6, "rise", -6000, NULL);
1130 gtk_text_tag_table_add (textags, tag);
1131 g_object_unref (tag);
1132
1133 /* superscript bold */
1134 tag = gtk_text_tag_new ("sup_bold");
1135 g_object_set (tag, "size", DEFAULT_FONT_SIZE * PANGO_SCALE,
1136 "weight", PANGO_WEIGHT_BOLD,
1137 "scale", .6, "rise", 6000, NULL);
1138 gtk_text_tag_table_add (textags, tag);
1139 g_object_unref (tag);
1140}
1141
1151GtkTextBuffer * add_buffer (GCallback handler, gpointer data, gchar * text)
1152{
1153 GtkTextBuffer * buffer;
1154 GtkTextIter bStart;
1155 GtkTextIter bEnd;
1156 buffer = gtk_text_buffer_new (NULL);
1157 setup_text_tags (buffer);
1158 gtk_text_buffer_get_start_iter (buffer, &bStart);
1159 gtk_text_buffer_get_end_iter (buffer, &bEnd);
1160 gtk_text_buffer_delete (buffer, &bStart, &bEnd);
1161 if (text != NULL) gtk_text_buffer_set_text (buffer, text, -1);
1162 if (handler != NULL) g_signal_connect (G_OBJECT (buffer), "changed", handler, data);
1163 return buffer;
1164}
1165
1179GtkWidget * create_text_view (int dimx, int dimy, int edit, int mono, GCallback handler, gpointer data, gchar * text)
1180{
1181 GtkWidget * tview = gtk_text_view_new ();
1182 gtk_text_view_set_buffer (GTK_TEXT_VIEW(tview), add_buffer(handler, data, text));
1183 gtk_widget_set_size_request (tview, dimx, dimy);
1184 gtk_text_view_set_editable (GTK_TEXT_VIEW(tview), edit);
1185 if (mono) text_view_set_monospace (tview);
1186 return tview;
1187}
1188
1201static void convert_alpha (cairo_surface_t * surf, GdkPixbuf * pix, int src_x, int src_y, int width, int height)
1202{
1203 int x, y;
1204 guchar * src_data = cairo_image_surface_get_data (surf);
1205 int src_stride = cairo_image_surface_get_stride (surf);
1206 guchar * dest_data = gdk_pixbuf_get_pixels (pix);
1207 int dest_stride = gdk_pixbuf_get_rowstride (pix);
1208
1209 src_data += src_stride * src_y + src_x * 4;
1210
1211 for (y = 0; y < height; y++) {
1212 guint32 *src = (guint32 *) src_data;
1213
1214 for (x = 0; x < width; x++) {
1215 guint alpha = src[x] >> 24;
1216
1217 if (alpha == 0)
1218 {
1219 dest_data[x * 4 + 0] = 0;
1220 dest_data[x * 4 + 1] = 0;
1221 dest_data[x * 4 + 2] = 0;
1222 }
1223 else
1224 {
1225 dest_data[x * 4 + 0] = (((src[x] & 0xff0000) >> 16) * 255 + alpha / 2) / alpha;
1226 dest_data[x * 4 + 1] = (((src[x] & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha;
1227 dest_data[x * 4 + 2] = (((src[x] & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha;
1228 }
1229 dest_data[x * 4 + 3] = alpha;
1230 }
1231
1232 src_data += src_stride;
1233 dest_data += dest_stride;
1234 }
1235}
1236
1244GdkPixbuf * convert_to_pixbuf (cairo_surface_t * surf)
1245{
1246 int width = cairo_image_surface_get_width (surf);
1247 int height = cairo_image_surface_get_height (surf);
1248 GdkPixbuf * pix = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width , height);
1249 convert_alpha (surf, pix, 0, 0, width, height);
1250 return pix;
1251}
1252
1253#ifdef GTK3
1263G_MODULE_EXPORT gboolean to_activate_entry (GtkWidget * widg, GdkEventFocus * event, gpointer data)
1264{
1265 g_signal_emit_by_name (G_OBJECT(widg), "activate", data);
1266 return FALSE;
1267}
1268#else
1277G_MODULE_EXPORT void to_activate_entry (GtkEventControllerFocus * focus, gpointer data)
1278{
1279 g_signal_emit_by_name (G_OBJECT(gtk_event_controller_get_widget((GtkEventController *)focus)), "activate", data);
1280}
1281#endif
1282
1294GtkWidget * create_entry (GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
1295{
1296 GtkWidget * entry = gtk_entry_new ();
1297 gtk_widget_set_size_request (entry, dim, -1);
1298#ifdef GTK4
1299 gtk_editable_set_width_chars (GTK_EDITABLE(entry), 0);
1300 gtk_editable_set_max_width_chars (GTK_EDITABLE(entry), cdim);
1301#else
1302 gtk_entry_set_width_chars (GTK_ENTRY(entry), 0);
1303 gtk_entry_set_max_width_chars (GTK_ENTRY(entry), cdim);
1304#endif
1305 gtk_entry_set_alignment (GTK_ENTRY(entry), 1.0);
1306
1307 if (handler != NULL)
1308 {
1309 g_signal_connect (G_OBJECT (entry), "activate", handler, data);
1310#ifdef GTK3
1311 g_signal_connect (G_OBJECT (entry), "focus-out-event", G_CALLBACK(to_activate_entry), data);
1312#else
1313 /* Pour ajouter une icone dans l'entry:
1314 gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, "edit-find-symbolic");
1315 // Set up the search icon
1316 gtk_entry_set_icon_activatable (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
1317 gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE);
1318 // Then the press can have action see gtk4 demo
1319 g_signal_connect (entry, "icon-press", G_CALLBACK(icon_press_cb), NULL); */
1320 GtkEventController * focus = gtk_event_controller_focus_new ();
1321 gtk_event_controller_set_name (focus, "focus-out");
1322 g_signal_connect (G_OBJECT(focus), "leave", G_CALLBACK(to_activate_entry), data);
1323 gtk_widget_add_controller (entry, focus);
1324#endif
1325 }
1326 if (key_release)
1327 {
1328#ifdef GTK3
1329 g_signal_connect (G_OBJECT (entry), "key-release-event", G_CALLBACK(to_activate_entry), data);
1330#else
1331 // Key press controler
1332#endif
1333 }
1334 return entry;
1335}
1336
1344GtkWidget * stock_image (const gchar * stock_id)
1345{
1346#ifdef GTK4
1347 return gtk_image_new_from_icon_name (stock_id);
1348#else
1349 return gtk_image_new_from_icon_name (stock_id, GTK_ICON_SIZE_MENU);
1350#endif
1351}
1352
1353#ifdef GTK3
1362GtkWidget * create_menu_item (gboolean add_mnemo, gchar * name)
1363{
1364 return (add_mnemo) ? gtk_menu_item_new_with_mnemonic (name) : gtk_menu_item_new_with_label (name);
1365}
1366
1377GtkWidget * create_menu_item_from_widget (GtkWidget * widg, gboolean check, gboolean radio, gboolean status)
1378{
1379 GtkWidget * item;
1380 if (check)
1381 {
1382 item = gtk_check_menu_item_new ();
1383 if (radio) gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM(item), TRUE);
1384 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), status);
1385 }
1386 else
1387 {
1388 item = gtk_menu_item_new ();
1389 }
1390 gtk_container_add (GTK_CONTAINER(item), widg);
1391 return item;
1392}
1393#endif
1394
1395/* GIcon*
1396g_icon_new_for_string (
1397 const gchar* str,
1398 GError** error
1399)
1400
1401void
1402g_menu_item_set_icon (
1403 GMenuItem* menu_item,
1404 GIcon* icon
1405)
1406
1407void
1408g_menu_item_set_attribute (
1409 GMenuItem* menu_item,
1410 const gchar* attribute,
1411 const gchar* format_string,
1412 ...
1413) */
1414
1423GtkWidget * create_image_from_data (int format, gpointer item_image)
1424{
1425 GtkWidget * icon = NULL;
1426 switch (format)
1427 {
1428 case IMG_PIXBUF:
1429 icon = gtk_image_new_from_pixbuf ((GdkPixbuf*)item_image);
1430 break;
1431 case IMG_SURFACE:
1432#ifdef GTK4
1433 icon = gtk_image_new_from_pixbuf (convert_to_pixbuf ((cairo_surface_t *)item_image));
1434#else
1435 icon = gtk_image_new_from_surface ((cairo_surface_t *)item_image);
1436#endif
1437 break;
1438 case IMG_FILE:
1439 icon = gtk_image_new_from_file ((const gchar *)item_image);
1440 break;
1441 case IMG_STOCK:
1442 icon = stock_image ((const gchar *)item_image);
1443 break;
1444 }
1445 return icon;
1446}
1447
1448#ifdef GTK3
1471GtkWidget * gtk3_menu_item (GtkWidget * menu, gchar * name,
1472 int icon_format, gpointer item_icon,
1473 GCallback handler, gpointer data,
1474 gboolean accel, guint key, GdkModifierType mod,
1475 gboolean check, gboolean radio, gboolean status)
1476{
1477 GtkWidget * item;
1478 GtkWidget * icon = NULL;
1479 GtkWidget * lab = NULL;
1480
1481 if (name)
1482 {
1483 if (accel)
1484 {
1485 lab = gtk_accel_label_new (name);
1486 gtk_label_align (lab, 0.0, 0.5);
1487 gtk_widget_set_size_request (lab, -1, -1);
1488 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1489 gtk_accel_label_set_accel ((GtkAccelLabel *)lab, key, mod);
1490 }
1491 else
1492 {
1493 lab = markup_label(name, -1, -1, 0.0, 0.5);
1494 }
1495 }
1496 if (icon_format != IMG_NONE) icon = create_image_from_data (icon_format, item_icon);
1497 if (name)
1498 {
1499#ifdef MENU_ICONS
1500 if (icon)
1501 {
1502 GtkWidget * box = create_hbox (0);
1503 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, icon, FALSE, FALSE, 0);
1504 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, lab, FALSE, FALSE, (icon_format == IMG_SURFACE) ? 0 : 6);
1505 item = create_menu_item_from_widget (box, check, radio, status);
1506 }
1507 else
1508 {
1509 item = create_menu_item_from_widget (lab, check, radio, status);
1510 }
1511#else
1512 item = create_menu_item_from_widget (lab, check, radio, status);
1513#endif
1514 }
1515 else if (icon)
1516 {
1517 item = create_menu_item_from_widget (icon, check, radio, status);
1518 }
1519 if (handler != NULL) g_signal_connect (G_OBJECT(item), "activate", handler, data);
1520 if (menu != NULL) gtk_menu_shell_append ((GtkMenuShell *)menu, item);
1521 return item;
1522}
1523
1536GtkWidget * add_advanced_item (GtkWidget * menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
1537{
1538 return gtk3_menu_item (menu, "Advanced", IMG_STOCK, (gpointer)DPROPERTIES, handler, data, accel, key, mod, FALSE, FALSE, FALSE);
1539}
1540
1548void add_menu_separator (GtkWidget * menu)
1549{
1550 gtk_menu_shell_append ((GtkMenuShell *)menu, gtk_separator_menu_item_new ());
1551}
1552#endif
1553
1554/*
1555* GtkWidget * markup_label (gchar * text, int dimx, int dimy, float ax, float ay)
1556
1557 \brief create a GtkLabel with pango markup
1558
1559 \param text Message to display
1560 \param dimx y size for the widget
1561 \param dimy y size for the widget
1562 \param ax x alignment
1563 \param ay y alignment
1564*/
1565GtkWidget * markup_label (gchar * text, int dimx, int dimy, float ax, float ay)
1566{
1567 GtkWidget * lab = gtk_label_new (text);
1569 gtk_widget_set_size_request (lab, dimx, dimy);
1570 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1571 return lab;
1572}
1573
1583{
1584 ColRGBA * new_col = g_malloc0 (num*sizeof*new_col);
1585 int i;
1586 for (i=0; i<num; i++) new_col[i] = col[i];
1587 return new_col;
1588}
1589
1597ColRGBA gdkrgba_to_rgba (GdkRGBA colgdk)
1598{
1599 ColRGBA col;
1600 col.red = colgdk.red;
1601 col.green = colgdk.green;
1602 col.blue = colgdk.blue;
1603 col.alpha = colgdk.alpha;
1604 return col;
1605}
1606
1615{
1616 GdkRGBA colo;
1617 colo.red = col.red;
1618 colo.green = col.green;
1619 colo.blue = col.blue;
1620 colo.alpha = col.alpha;
1621 return colo;
1622}
1623
1633void set_renderer_color (int tocol, GtkCellRenderer * renderer, ColRGBA col)
1634{
1635 if (tocol)
1636 {
1637 GdkRGBA colo = colrgba_togtkrgba (col);
1638 g_object_set (renderer, "foreground-rgba", & colo, "foreground-set", TRUE, NULL);
1639 g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
1640 }
1641 else
1642 {
1643 g_object_set(renderer, "foreground-set", FALSE, "weight", FALSE, NULL);
1644 }
1645}
1646
1657void button_set_image (GtkButton * but, gchar * text, int format, gpointer image)
1658{
1659#ifdef GTK4
1660 GtkWidget * img = create_image_from_data (format, image);
1661 if (text)
1662 {
1663 GtkWidget * hbox = create_hbox (5);
1664 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, img, FALSE, FALSE, 0);
1665 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (text, -1, -1, 0.0, 0.5), FALSE, FALSE, 0);
1666 gtk_button_set_child (but, hbox);
1667 }
1668 else
1669 {
1670 gtk_button_set_child (but, img);
1671 }
1672#else
1673 gtk_button_set_image (but, create_image_from_data (format, image));
1674#endif
1675}
1676
1688void adjust_label (GtkWidget * lab, int dimx, int dimy, float ax, float ay)
1689{
1690 gtk_label_set_xalign (GTK_LABEL(lab), ax);
1691 gtk_label_set_yalign (GTK_LABEL(lab), ay);
1692 gtk_widget_set_size_request (lab, dimx, dimy);
1693 gtk_label_set_use_markup (GTK_LABEL(lab), TRUE);
1694}
1695
1708GtkWidget * color_button (ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
1709{
1710 GtkWidget * colorb;
1711 GdkRGBA colo = colrgba_togtkrgba (col);
1712 colorb = gtk_color_button_new_with_rgba (& colo);
1713 gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(colorb), alpha);
1714 if (handler != NULL) g_signal_connect (G_OBJECT(colorb), "color-set", handler, data);
1715 gtk_widget_set_size_request (colorb, dimx, dimy);
1716 return colorb;
1717}
1718
1730GtkWidget * font_button (gchar * font, int dimx, int dimy, GCallback handler, gpointer data)
1731{
1732 GtkWidget * fontb = gtk_font_button_new_with_font (font);
1733 g_signal_connect (G_OBJECT(fontb), "font-set", handler, data);
1734 gtk_widget_set_size_request (fontb, dimx, dimy);
1735 return fontb;
1736}
1737
1752GtkWidget * spin_button (GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data)
1753{
1754 GtkWidget * spin = gtk_spin_button_new_with_range (start, end, step);
1755 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(spin), digits);
1756#ifdef GTK4
1757 gtk_editable_set_alignment (GTK_EDITABLE(spin), 1.0);
1758#else
1759 gtk_entry_set_alignment (GTK_ENTRY(spin), 1.0);
1760#endif
1761 gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin), value);
1762 gtk_widget_set_size_request (spin, dim, -1);
1763 if (handler != NULL) g_signal_connect (G_OBJECT (spin), "value-changed", handler, data);
1764 return spin;
1765}
1766
1779GtkWidget * check_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
1780{
1781 GtkWidget * but = gtk_check_button_new ();
1782 if (text != NULL)
1783 {
1784#ifdef GTK4
1785 gtk_check_button_set_label (GTK_CHECK_BUTTON(but), text);
1786 GtkWidget * lab = gtk_widget_get_last_child (but);
1787 adjust_label (lab, -1, -1, 0.0, 0.5);
1788#else
1789 add_container_child (CONTAINER_BUT, but, markup_label(text, -1, -1, 0.0, 0.5));
1790#endif
1791 }
1792 gtk_widget_set_size_request (but, dimx, dimy);
1793#ifdef GTK4
1794 gtk_check_button_set_active (GTK_CHECK_BUTTON(but), state);
1795#else
1796 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(but), state);
1797#endif
1798 if (handler != NULL) g_signal_connect (G_OBJECT(but), "toggled", handler, data);
1799 return but;
1800}
1801
1814GtkWidget * radio_button (gchar * text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
1815{
1816 GtkWidget * but;
1817#ifdef GTK4
1818 but = gtk_toggle_button_new ();
1819#else
1820 but = gtk_radio_button_new (NULL);
1821#endif
1822 if (text != NULL) add_container_child (CONTAINER_BUT, but, markup_label(text, -1, -1, 0.0, 0.5));
1823 gtk_widget_set_size_request (but, dimx, dimy);
1824 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(but), state);
1825 if (handler != NULL) g_signal_connect (G_OBJECT(but), "toggled", handler, data);
1826 return but;
1827}
1828
1843GtkWidget * create_button (gchar * text, int image_format, gchar * image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
1844{
1845 GtkWidget * but;
1846#ifdef GTK3
1847 but = (text) ? gtk_button_new_with_label (text) : gtk_button_new ();
1848#else
1849 but = (text && image_format == IMG_NONE) ? gtk_button_new_with_label (text) : gtk_button_new ();
1850#endif
1851 if (image_format != IMG_NONE) button_set_image (GTK_BUTTON(but), text, image_format, (gpointer)image);
1852 gtk_widget_set_size_request (but, dimx, dimy);
1853#ifdef GTK3
1854 gtk_button_set_relief (GTK_BUTTON(but), relief);
1855#endif
1856#ifdef GTK4
1857 if (relief == GTK_RELIEF_NONE) gtk_button_set_has_frame (GTK_BUTTON(but), FALSE);
1858#endif
1859 if (handler != NULL)
1860 {
1861 g_signal_connect (G_OBJECT (but), "clicked", handler, data);
1862 }
1863 return but;
1864}
1865
1874void set_image_from_icon_name (GtkWidget * widg, gchar * icon)
1875{
1876#ifdef GTK4
1877 gtk_image_set_from_icon_name (GTK_IMAGE(widg), icon);
1878#else
1879 gtk_image_set_from_icon_name (GTK_IMAGE(widg), icon, GTK_ICON_SIZE_BUTTON);
1880#endif
1881}
1882
1892GtkWidget * abox (GtkWidget * box, char * lab, int vspace)
1893{
1894 GtkWidget * hbox = create_hbox (0);
1895 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, vspace);
1896 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.5), FALSE, FALSE, 10);
1897 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
1898 return hbox;
1899}
1900
1901GtkWidget * bbox (GtkWidget * box, char * lab)
1902{
1903 GtkWidget * hbox = create_hbox (0);
1904 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 2);
1905 GtkWidget * hhbox = create_hbox (0);
1906 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, FALSE, FALSE, 40);
1907 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(lab, 150, 30, 0.0, 0.5), FALSE, FALSE, 0);
1908 return hhbox;
1909}
1910
1911GtkWidget * cbox (GtkWidget * box, char * lab)
1912{
1913 GtkWidget * hbox = create_hbox (0);
1914 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, TRUE, TRUE, 2);
1915 GtkWidget * hhbox = create_hbox (0);
1916 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, hhbox, TRUE, TRUE, 40);
1917 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hhbox, markup_label(lab, -1, 30, 0.0, 0.5), TRUE, TRUE, 40);
1918 return hhbox;
1919}
1920
1921GtkWidget * fbox (GtkWidget * box, char * lab)
1922{
1923 GtkWidget * hbox = create_hbox (0);
1924 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 0);
1925 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label("<b>.</b>", 5, -1, 0.0, 0.5), FALSE, FALSE, 10);
1926 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, 350, 30, 0.0, 0.5), FALSE, FALSE, 0);
1927 return hbox;
1928}
1929
1940GtkWidget * create_scroll (GtkWidget * box, int dimx, int dimy, int shadow)
1941{
1942 GtkWidget * scroll;
1943#ifdef GTK4
1944 scroll = gtk_scrolled_window_new ();
1945#else
1946 scroll = gtk_scrolled_window_new (NULL, NULL);
1947 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll), shadow);
1948#endif
1949 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1950 gtk_widget_set_size_request (scroll, dimx, dimy);
1951 // To check all create_scroll !
1952 if (box != NULL) add_box_child_start (GTK_ORIENTATION_VERTICAL, box, scroll, TRUE, TRUE, 0);
1953 return scroll;
1954}
1955
1964GtkWidget * create_expander (gchar * name, gchar * file_img)
1965{
1966 GtkWidget * expand = gtk_expander_new (name);
1967 GtkWidget * hbox = create_hbox (0);
1968 if (file_img != NULL)
1969 {
1970 GtkWidget * img = gtk_image_new_from_file (file_img);
1971 gtk_widget_set_size_request (img, 20, 20);
1972 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, img, TRUE, TRUE, 10);
1973 }
1974 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(name, 200, 20, 0.0, 0.5), FALSE, TRUE, 0);
1975 gtk_expander_set_label_widget (GTK_EXPANDER(expand), hbox);
1976 return expand;
1977}
1978
1986void provide_gtk_css (gchar * css)
1987{
1988 GtkCssProvider * provider = gtk_css_provider_new ();
1989#ifdef GTK4
1990 gtk_css_provider_load_from_data (provider, css, -1);
1991 gtk_style_context_add_provider_for_display (gdk_display_get_default (),
1992 GTK_STYLE_PROVIDER(provider),
1993 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
1994#else
1995 gtk_css_provider_load_from_data (provider, css, -1, NULL);
1996 gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
1997 GTK_STYLE_PROVIDER(provider),
1998 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
1999#endif
2000 g_object_unref (provider);
2001}
2002
2010GtkWidget * destroy_this_widget (GtkWidget * widg)
2011{
2012 if (widg != NULL)
2013 {
2014 if (GTK_IS_WIDGET(widg))
2015 {
2016 if (is_the_widget_visible(widg)) gtk_widget_hide (widg);
2017#ifdef GTK3
2018 gtk_widget_destroy (widg);
2019#else
2020 GtkWidget * wid = gtk_widget_get_parent (widg);
2021 if (wid != NULL)
2022 {
2023 if (GTK_IS_WIDGET(wid))
2024 {
2025 gtk_widget_unparent (widg);
2026 }
2027 }
2028#endif
2029 }
2030 }
2031 return NULL;
2032}
2033
2041void destroy_this_dialog (GtkDialog * dialog)
2042{
2043#ifdef GTK4
2044 gtk_window_destroy (GTK_WINDOW(dialog));
2045#else
2046 destroy_this_widget (GTK_WIDGET(dialog));
2047#endif
2048 g_main_loop_quit (Event_loop[dialog_id]);
2049 g_main_loop_unref (Event_loop[dialog_id]);
2050 dialog_id --;
2051}
2052
2060void destroy_this_native_dialog (GtkNativeDialog * dialog)
2061{
2062 gtk_native_dialog_destroy (dialog);
2063 g_object_unref (dialog);
2064 g_main_loop_quit (Event_loop[dialog_id]);
2065 g_main_loop_unref (Event_loop[dialog_id]);
2066 dialog_id --;
2067}
2068
2078G_MODULE_EXPORT void run_destroy_dialog (GtkDialog * dialog, gint response_id, gpointer data)
2079{
2080 destroy_this_dialog (dialog);
2081}
2082
2083#ifdef GTK4
2089GListModel * file_chooser_get_file_names (GtkFileChooser * chooser)
2090{
2091 return gtk_file_chooser_get_files (chooser);
2092}
2093#else
2099GSList * file_chooser_get_file_names (GtkFileChooser * chooser)
2100{
2101 return gtk_file_chooser_get_filenames (chooser);
2102}
2103#endif
2104
2112gchar * file_chooser_get_file_name (GtkFileChooser * chooser)
2113{
2114#ifdef GTK4
2115 return g_file_get_parse_name (gtk_file_chooser_get_file (chooser));
2116#else
2117 return gtk_file_chooser_get_filename (chooser);
2118#endif
2119}
2120
2128gchar * file_chooser_get_current_folder (GtkFileChooser * chooser)
2129{
2130#ifdef GTK4
2131 return g_file_get_parse_name (gtk_file_chooser_get_current_folder (chooser));
2132#else
2133 return gtk_file_chooser_get_current_folder (chooser);
2134#endif
2135}
2136
2145gboolean file_chooser_set_file_name (GtkFileChooser * chooser, gchar * filename)
2146{
2147 GFile * default_file_for_saving = g_file_new_for_path (filename);
2148 gboolean res = gtk_file_chooser_set_file (chooser, default_file_for_saving, NULL);
2149 if (! res)
2150 {
2151 gchar * str = g_strdup_printf ("Impossible to locate file: %s", filename);
2152 show_error (str, 0, (GtkWidget *)chooser);
2153 }
2154 return res;
2155}
2156
2164void file_chooser_set_current_folder (GtkFileChooser * chooser)
2165{
2166#ifdef GTK4
2167 gtk_file_chooser_set_current_folder (chooser, g_file_new_for_path ("./"), NULL);
2168#else
2169 gtk_file_chooser_set_current_folder (chooser, "");
2170#endif
2171}
2172
2173#ifdef GTK4
2184GtkFileChooserNative * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name)
2185{
2186 return gtk_file_chooser_native_new (title, parent, act, act_name, "Cancel");
2187}
2188#else
2199GtkWidget * create_file_chooser (const gchar * title, GtkWindow * parent, GtkFileChooserAction act, const gchar * act_name)
2200{
2201 return gtk_file_chooser_dialog_new (title, parent, act, "Cancel", GTK_RESPONSE_CANCEL, act_name, GTK_RESPONSE_ACCEPT, NULL);
2202}
2203#endif
2204
2212ColRGBA get_button_color (GtkColorChooser * colob)
2213{
2214 GdkRGBA col;
2215 gtk_color_chooser_get_rgba (colob, & col);
2216 return gdkrgba_to_rgba (col);
2217}
2218
2226ColRGBA get_window_color (GtkWidget * color_win)
2227{
2228 GdkRGBA col;
2229 gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_win), & col);
2230 return gdkrgba_to_rgba (col);
2231}
2232
2241void set_color_chooser_color (GtkWidget * color_win, ColRGBA col)
2242{
2243 GdkRGBA colo = colrgba_togtkrgba(col);
2244 gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(color_win), & colo);
2245}
2246
2247#ifdef GTK4
2257void pop_menu_at_pointer (GtkWidget * pop, double x, double y)
2258{
2259 GdkRectangle rect;
2260 rect.x = x;
2261 rect.y = y;
2262 rect.width = 1;
2263 rect.height = 1;
2264 gtk_popover_set_has_arrow (GTK_POPOVER(pop), FALSE);
2265 gtk_popover_set_pointing_to (GTK_POPOVER(pop), & rect);
2266 gtk_popover_popup (GTK_POPOVER(pop));
2267}
2268#else
2277void pop_menu_at_pointer (GtkWidget * widg, GdkEvent * event)
2278{
2279 show_the_widgets (widg);
2280 gtk_menu_popup_at_pointer (GTK_MENU (widg), event);
2281}
2282#endif
2283
2291GtkWidget * get_top_level (GtkWidget * widg)
2292{
2293#ifdef GTK4
2294 return (GtkWidget *)gtk_widget_get_root (widg);
2295#else
2296 return gtk_widget_get_toplevel (widg);
2297#endif
2298}
2299
2300#ifdef GTK4
2309G_MODULE_EXPORT gboolean destroy_this_window (GtkWindow * win, gpointer data)
2310#else
2320G_MODULE_EXPORT gboolean destroy_this_window (GtkWidget * win, GdkEvent * event, gpointer data)
2321#endif
2322{
2323 destroy_this_widget (GTK_WIDGET(win));
2324 return TRUE;
2325}
2326
2327#ifdef GTK4
2336G_MODULE_EXPORT gboolean hide_this_window (GtkWindow * win, gpointer data)
2337#else
2347G_MODULE_EXPORT gboolean hide_this_window (GtkWidget * win, GdkEvent * event, gpointer data)
2348#endif
2349{
2350 gtk_widget_hide (GTK_WIDGET(win));
2351 return TRUE;
2352}
2353
2363void add_gtk_close_event (GtkWidget * widg, GCallback handler, gpointer data)
2364{
2365#ifdef GTK4
2366 g_signal_connect (G_OBJECT (widg), "close-request", handler, data);
2367#else
2368 g_signal_connect (G_OBJECT (widg), "delete-event", handler, data);
2369#endif
2370}
double ay
Definition curve.c:70
double ax
Definition curve.c:70
PangoLayout * layout
Definition curve.c:79
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:225
GMainLoop * Event_loop[5]
Definition global.c:178
GdkPixbuf * THETD
Definition global.c:228
GtkWidget * pop
Definition global.c:217
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_PIXBUF
Definition global.h:233
@ IMG_NONE
Definition global.h:232
@ IMG_STOCK
Definition global.h:236
@ IMG_SURFACE
Definition global.h:234
@ IMG_FILE
Definition global.h:235
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:217
GtkWidget * add_advanced_item(GtkWidget *menu, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod)
@ CONTAINER_EXP
Definition global.h:227
@ CONTAINER_WIN
Definition global.h:222
@ CONTAINER_FRA
Definition global.h:226
@ CONTAINER_BUT
Definition global.h:225
@ CONTAINER_SCR
Definition global.h:223
@ CONTAINER_VIE
Definition global.h:224
#define DPROPERTIES
Definition global.h:178
GtkWidget * create_menu_item(gboolean add_mnemo, gchar *action)
#define min(a, b)
Definition global.h:75
#define DEFAULT_FONT_SIZE
Definition global.h:307
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:74
void motion(glwin *view, gint x, gint y, GdkModifierType state)
mouse motion in the OpenGL window
Definition glview.c:620
int step
Definition ogl_draw.c:70
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:541
GdkPixbuf * convert_to_pixbuf(cairo_surface_t *surf)
convert cairo surface to GdkPixbuf
Definition gtk-misc.c:1244
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:472
void file_chooser_set_current_folder(GtkFileChooser *chooser)
set current folder in a GtkFilechooser
Definition gtk-misc.c:2164
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1294
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:613
void set_renderer_color(int tocol, GtkCellRenderer *renderer, ColRGBA col)
set the color of a GtkCellRenderer
Definition gtk-misc.c:1633
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:1688
ColRGBA gdkrgba_to_rgba(GdkRGBA colgdk)
convert GdkRGBA color to ColRGBA color
Definition gtk-misc.c:1597
GtkWidget * font_button(gchar *font, int dimx, int dimy, GCallback handler, gpointer data)
create a font selection button
Definition gtk-misc.c:1730
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:1179
GtkTextBuffer * add_buffer(GCallback handler, gpointer data, gchar *text)
create a GtkTextBuffer
Definition gtk-misc.c:1151
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:1940
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:490
void set_color_chooser_color(GtkWidget *color_win, ColRGBA col)
set the color of a color selection window
Definition gtk-misc.c:2241
gboolean is_the_widget_visible(GtkWidget *widg)
test if a GtkWidget exist, then return if it is visible or not
Definition gtk-misc.c:694
void resize_this_window(GtkWidget *window, int x, int y)
resize this GtkWindow
Definition gtk-misc.c:561
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:425
ColRGBA get_window_color(GtkWidget *color_win)
get the ColRGBA color from a color selection window
Definition gtk-misc.c:2226
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:844
gchar * file_chooser_get_file_name(GtkFileChooser *chooser)
get a file name from a GtkFileChooser (single file selected)
Definition gtk-misc.c:2112
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:577
GdkRGBA colrgba_togtkrgba(ColRGBA col)
convert ColRGBA color to GdkRGBA color
Definition gtk-misc.c:1614
void update_entry_int(GtkEntry *entry, int intval)
update the content of a GtkEntry as int
Definition gtk-misc.c:594
G_MODULE_EXPORT gboolean hide_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
hide a GtkWindow
Definition gtk-misc.c:2347
void pop_menu_at_pointer(GtkWidget *widg, GdkEvent *event)
popup a menu at pointer location
Definition gtk-misc.c:2277
gboolean file_chooser_set_file_name(GtkFileChooser *chooser, gchar *filename)
set file name in a GtkFilechooser
Definition gtk-misc.c:2145
G_MODULE_EXPORT gboolean destroy_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
destroy a GtkWindow
Definition gtk-misc.c:2320
GtkWidget * stock_image(const gchar *stock_id)
create a GtkImage for the Gtk database
Definition gtk-misc.c:1344
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:2363
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:758
void layout_add_widget(GtkWidget *layout, GtkWidget *child, int x_pos, int y_pos)
Add a GtkWidget in a GtkLayout.
Definition gtk-misc.c:826
GtkWidget * fbox(GtkWidget *box, char *lab)
Definition gtk-misc.c:1921
gchar * file_chooser_get_current_folder(GtkFileChooser *chooser)
get the current folder for a GtkFileChooser
Definition gtk-misc.c:2128
GtkWidget * radio_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a radio button
Definition gtk-misc.c:1814
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:1752
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1779
G_MODULE_EXPORT void to_activate_entry(GtkEventControllerFocus *focus, gpointer data)
GtkEntry activate signal managment.
Definition gtk-misc.c:1277
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:1843
GtkWidget * get_top_level(GtkWidget *widg)
get the top level container, window, of a widget
Definition gtk-misc.c:2291
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:903
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:805
void button_set_image(GtkButton *but, gchar *text, int format, gpointer image)
Add an image to a GtkButton.
Definition gtk-misc.c:1657
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
Definition gtk-misc.c:1565
GtkWidget * cbox(GtkWidget *box, char *lab)
Definition gtk-misc.c:1911
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:279
ColRGBA get_button_color(GtkColorChooser *colob)
get the ColRGBA color from a GtkColorChooser button
Definition gtk-misc.c:2212
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:186
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2041
void text_view_set_monospace(GtkWidget *view)
set the font of a GtkTextView as monospace
Definition gtk-misc.c:667
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:793
GtkWidget * new_gtk_window()
create a new GtkWindow
Definition gtk-misc.c:328
GtkWidget * create_image_from_data(int format, gpointer item_image)
create Gtk image for data
Definition gtk-misc.c:1423
void gtk_label_align(GtkWidget *lab, float ax, float ay)
set text alignment in a GtkLabel
Definition gtk-misc.c:681
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:880
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:2078
GtkWidget * create_layout(int x, int y)
create a GtkLayout / GtkFixed widget
Definition gtk-misc.c:860
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2010
GtkWidget * color_button(ColRGBA col, gboolean alpha, int dimx, int dimy, GCallback handler, gpointer data)
create a color selection button
Definition gtk-misc.c:1708
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:724
GtkWidget * bbox(GtkWidget *box, char *lab)
Definition gtk-misc.c:1901
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:257
void update_entry_text(GtkEntry *entry, gchar *text)
update the content of a GtkEntry as string
Definition gtk-misc.c:651
void provide_gtk_css(gchar *css)
create a css provider based on the css data
Definition gtk-misc.c:1986
GSList * file_chooser_get_file_names(GtkFileChooser *chooser)
create a file list from files selected using a GtkFileChooser
Definition gtk-misc.c:2099
void setup_text_tags(GtkTextBuffer *buffer)
prepare the avialable text tags for the GtkTextBuffer
Definition gtk-misc.c:915
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:206
void set_image_from_icon_name(GtkWidget *widg, gchar *icon)
set a image from a stock icon name
Definition gtk-misc.c:1874
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:511
void combo_text_prepend(GtkWidget *combo, gchar *text)
prepend text in GtkComboBox widget
Definition gtk-misc.c:893
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:781
ColRGBA * duplicate_color(int num, ColRGBA *col)
duplicate a ColRGBA pointer
Definition gtk-misc.c:1582
GtkWidget * abox(GtkWidget *box, char *lab, int vspace)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:1892
GtkWidget * create_expander(gchar *name, gchar *file_img)
create GtkExpander
Definition gtk-misc.c:1964
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:2199
void destroy_this_native_dialog(GtkNativeDialog *dialog)
destroy a GtkNativeDialog
Definition gtk-misc.c:2060
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:169
void update_entry_long_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as long double
Definition gtk-misc.c:632
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:57
double x
Definition ogl_draw.c:57
float blue
Definition global.h:118
float alpha
Definition global.h:119
float red
Definition global.h:116
float green
Definition global.h:117
Definition glwin.h:277
int status
Definition w_advance.c:160
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