/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2018 Red Hat, Inc. (www.redhat.com)
*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*/
#include "evolution-data-server-config.h"
#include
#include
#include "libedataserver/libedataserver.h"
#include "libedataserver/libedataserver-private.h"
#include "libedataserverui-private.h"
/*
* _libedataserverui_load_modules:
*
* Usually called in a GObject::constructed() method to ensure
* the modules from the UI module directories are loaded.
*
* Since: 3.30
**/
void
_libedataserverui_load_modules (void)
{
static gboolean modules_loaded = FALSE;
/* Load modules only once. */
if (!modules_loaded) {
GList *module_types;
modules_loaded = TRUE;
module_types = e_module_load_all_in_directory_and_prefixes (E_DATA_SERVER_UIMODULEDIR, E_DATA_SERVER_PREFIX);
g_list_free_full (module_types, (GDestroyNotify) g_type_module_unuse);
}
}
/*
* _libedataserverui_init_icon_theme:
*
* Adds fallback icons to the gtk+ default theme search path.
*
* Since: 3.44
*/
void
_libedataserverui_init_icon_theme (void)
{
static gboolean icons_added = FALSE;
#if GTK_CHECK_VERSION(4, 0, 0)
if (!icons_added) {
GdkDisplayManager *manager;
manager = gdk_display_manager_get ();
if (manager) {
GSList *displays, *link;
displays = gdk_display_manager_list_displays (manager);
icons_added = displays != NULL;
for (link = displays; link; link = g_slist_next (link)) {
GdkDisplay *display = link->data;
GtkIconTheme *icon_theme = gtk_icon_theme_get_for_display (display);
if (icon_theme)
gtk_icon_theme_add_search_path (icon_theme, E_DATA_SERVER_ICONDIR);
}
g_slist_free (displays);
}
}
#else
/* The screen can be NULL when building the documentation */
if (!icons_added && gdk_screen_get_default ()) {
icons_added = TRUE;
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), E_DATA_SERVER_ICONDIR);
}
#endif
}
#if GTK_CHECK_VERSION(4, 0, 0)
typedef struct
{
gint response_id;
GMainLoop *loop;
} RunInfo;
static void
shutdown_loop (RunInfo *run_info)
{
if (g_main_loop_is_running (run_info->loop))
g_main_loop_quit (run_info->loop);
}
static void
unmap_cb (GtkDialog *dialog,
RunInfo *run_info)
{
shutdown_loop (run_info);
}
static void
response_cb (GtkDialog *dialog,
gint response_id,
RunInfo *run_info)
{
run_info->response_id = response_id;
shutdown_loop (run_info);
}
static gboolean
close_requested_cb (GtkDialog *dialog,
RunInfo *run_info)
{
shutdown_loop (run_info);
return GDK_EVENT_STOP;
}
static gint
_eds_gtk4_dialog_run (GtkDialog *dialog)
{
RunInfo run_info;
gulong close_request_id, reponse_id, unmap_id;
close_request_id = g_signal_connect (dialog, "close-request", G_CALLBACK (close_requested_cb), &run_info);
reponse_id = g_signal_connect (dialog, "response", G_CALLBACK (response_cb), &run_info);
unmap_id = g_signal_connect (dialog, "unmap", G_CALLBACK (unmap_cb), &run_info);
run_info.response_id = GTK_RESPONSE_NONE;
run_info.loop = g_main_loop_new (NULL, FALSE);
if (!gtk_widget_get_visible (GTK_WIDGET (dialog)))
gtk_window_present (GTK_WINDOW (dialog));
g_main_loop_run (run_info.loop);
g_clear_pointer (&run_info.loop, g_main_loop_unref);
g_signal_handler_disconnect (dialog, close_request_id);
g_signal_handler_disconnect (dialog, reponse_id);
g_signal_handler_disconnect (dialog, unmap_id);
return run_info.response_id;
}
static const gchar *
_eds_gtk4_entry_get_text (GtkEntry *entry)
{
return gtk_entry_buffer_get_text (gtk_entry_get_buffer (entry));
}
static void
_eds_gtk4_entry_set_text (GtkEntry *entry,
const gchar *text)
{
gtk_entry_buffer_set_text (gtk_entry_get_buffer (entry), text, -1);
}
static void
_eds_gtk4_box_pack_start (GtkBox *box,
GtkWidget *child,
gboolean expand,
gboolean fill,
guint padding)
{
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (box)) == GTK_ORIENTATION_VERTICAL) {
if (expand)
gtk_widget_set_hexpand (child, TRUE);
if (fill)
gtk_widget_set_halign (child, GTK_ALIGN_FILL);
if (padding) {
gtk_widget_set_margin_start (child, padding + gtk_widget_get_margin_start (child));
gtk_widget_set_margin_end (child, padding + gtk_widget_get_margin_end (child));
}
} else {
if (expand)
gtk_widget_set_vexpand (child, TRUE);
if (fill)
gtk_widget_set_valign (child, GTK_ALIGN_FILL);
if (padding) {
gtk_widget_set_margin_top (child, padding + gtk_widget_get_margin_top (child));
gtk_widget_set_margin_bottom (child, padding + gtk_widget_get_margin_bottom (child));
}
}
gtk_box_append (box, child);
}
#endif
gint
_libedataserverui_dialog_run (GtkDialog *dialog)
{
#if GTK_CHECK_VERSION(4, 0, 0)
return _eds_gtk4_dialog_run (dialog);
#else
return gtk_dialog_run (dialog);
#endif
}
const gchar *
_libedataserverui_entry_get_text (GtkEntry *entry)
{
#if GTK_CHECK_VERSION(4, 0, 0)
return _eds_gtk4_entry_get_text (entry);
#else
return gtk_entry_get_text (entry);
#endif
}
void
_libedataserverui_entry_set_text (GtkEntry *entry,
const gchar *text)
{
#if GTK_CHECK_VERSION(4, 0, 0)
_eds_gtk4_entry_set_text (entry, text);
#else
gtk_entry_set_text (entry, text);
#endif
}
void
_libedataserverui_box_pack_start (GtkBox *box,
GtkWidget *child,
gboolean expand,
gboolean fill,
guint padding)
{
#if GTK_CHECK_VERSION(4, 0, 0)
_eds_gtk4_box_pack_start (box, child, expand, fill, padding);
#else
gtk_box_pack_start (box, child, expand, fill, padding);
#endif
}