33static gboolean
show_about_dialog(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
35 GtkWidget *dialog = gtk_about_dialog_new();
36 gtk_widget_set_name (dialog,
"about-dialog");
37#ifdef GDK_WINDOWING_QUARTZ
40 gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog),
PACKAGE_NAME);
42 char *copyright = g_strdup_printf(_(
"Copyright \302\251 darktable authors 2009-2022\nCopyright \302\251 Aur\303\251lien Pierre 2022-%s"),
darktable_last_commit_year);
43 gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog), copyright);
45 gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog),
46 _(
"Organize and develop images from digital cameras"));
47 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog),
"https://ansel.photos");
48 gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(dialog), _(
"Website"));
49 char *icon = g_strdup(
"ansel");
50 gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(dialog), icon);
53 const char *str = _(
"all those of you that made previous releases possible");
55#include "tools/darktable_authors.h"
57 const char *
final[] = {str, NULL };
58 gtk_about_dialog_add_credit_section (GTK_ABOUT_DIALOG(dialog), _(
"and..."),
final);
59 gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(dialog), _(
"translator-credits"));
62 gtk_dialog_run(GTK_DIALOG(dialog));
63 gtk_widget_destroy(dialog);
71static gboolean
update_nightly_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
74 if(!url) url =
"https://ansel.photos/en/download/";
79static gboolean
open_doc_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
82 gtk_show_uri_on_window(GTK_WINDOW(
dt_gui_main_window()),
"https://ansel.photos/en/doc", GDK_CURRENT_TIME, NULL);
86static gboolean
open_chat_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
89 "https://app.element.io/#/room/#ansel:matrix.org", GDK_CURRENT_TIME, NULL);
93static gboolean
open_search_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
96 "https://chantal.aurelienpierre.com", GDK_CURRENT_TIME, NULL);
100static gboolean
open_forum_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
103 "https://community.ansel.photos", GDK_CURRENT_TIME, NULL);
113 gchar *help_url = g_object_get_data(G_OBJECT(widget),
"dt-help-url");
114 if(help_url)
return help_url;
115 widget = gtk_widget_get_parent(widget);
125 gdk_event_handler_set((GdkEventFunc)gtk_main_do_event, NULL, NULL);
130 gboolean handled =
FALSE;
134 case GDK_BUTTON_PRESS:
136 if(event->button.button == GDK_BUTTON_SECONDARY)
144 GtkWidget *event_widget = gtk_get_event_widget(event);
149 if(help_url && *help_url)
157 GtkWidget *dialog = gtk_message_dialog_new
158 (GTK_WINDOW(win), GTK_DIALOG_DESTROY_WITH_PARENT,
159 GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
160 _(
"do you want to access ansel.photos ?"));
161#ifdef GDK_WINDOWING_QUARTZ
165 gtk_window_set_title(GTK_WINDOW(dialog), _(
"access the online usermanual?"));
166 const gint
res = gtk_dialog_run(GTK_DIALOG(dialog));
167 const gboolean open = (
res == GTK_RESPONSE_YES) || !(
res == GTK_RESPONSE_NO);
168 gtk_widget_destroy(dialog);
172 GError *
error = NULL;
173 const gboolean uri_success = gtk_show_uri_on_window(GTK_WINDOW(win), help_url, gtk_get_current_event_time(), &
error);
184 fprintf (stderr,
"unable to read file: %s\n",
error->message);
199 case GDK_ENTER_NOTIFY:
200 case GDK_LEAVE_NOTIFY:
202 GtkWidget *event_widget = gtk_get_event_widget(event);
209 dt_cursor_t cursor =
event->type == GDK_ENTER_NOTIFY ? GDK_QUESTION_ARROW : GDK_X_CURSOR;
221 if(!handled) gtk_main_do_event(event);
224static gboolean
contextual_help_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
232static gboolean
search_accels_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
239static gboolean
supervisor_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
247 add_sub_menu_entry(menus, lists, _(
"Online documentation"), index, NULL,
open_doc_callback, NULL, NULL, NULL, 0, 0);
249 add_sub_menu_entry(menus, lists, _(
"Update to the latest nightly build"), index, NULL,
update_nightly_callback, NULL, NULL, NULL, 0, 0);
250 add_sub_menu_entry(menus, lists, _(
"Ask a question"), index, NULL,
open_search_callback, NULL, NULL, NULL, 0, 0);
251 add_sub_menu_entry(menus, lists, _(
"Join the support chat"), index, NULL,
open_chat_callback, NULL, NULL, NULL, 0, 0);
252 add_sub_menu_entry(menus, lists, _(
"Join the support forum"), index, NULL,
open_forum_callback, NULL, NULL, NULL, 0, 0);
254 add_sub_menu_entry(menus, lists, _(
"Open contextual help"), index, NULL,
contextual_help_callback, NULL, NULL, NULL, 0, 0);
258 add_sub_menu_entry(menus, lists, _(
"Event supervisor..."), index, NULL,
supervisor_callback, NULL, NULL, NULL, 0, 0);
260 add_sub_menu_entry(menus, lists, _(
"About"), index, NULL,
show_about_dialog, NULL, NULL, NULL, 0, 0);
void dt_accels_search(dt_accels_t *accels, GtkWindow *main_window, GtkWidget *anchor)
Handle default and user-set shortcuts (accelerators)
GtkWidget * dt_gui_main_window(void)
struct dt_accels_t * dt_gui_get_accels(void)
static void error(char *msg)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
const char darktable_package_version[]
const char darktable_last_commit_year[]
void dt_control_forbid_change_cursor()
void dt_control_log(const char *msg,...)
void dt_control_allow_change_cursor()
#define dt_control_change_cursor(cursor)
GdkCursorType dt_cursor_t
static gboolean show_about_dialog(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean supervisor_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static void _restore_default_cursor()
static gboolean update_nightly_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
void append_help(GtkWidget **menus, GList **lists, const dt_menus_t index)
static void _main_do_event_help(GdkEvent *event, gpointer data)
static gboolean open_chat_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean search_accels_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean open_search_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean open_doc_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static char * get_help_url(GtkWidget *widget)
static gboolean contextual_help_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
static gboolean open_forum_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
Print to stdout when thread is enabled, prefixed with seconds since startup.
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
void dt_osx_disallow_fullscreen(GtkWidget *widget)
void dt_gui_supervisor_window_show(void)
const char * dt_updates_get_download_url(void)
The nightly update check.