Commit b22bc91e authored by Victor Ananjevsky's avatar Victor Ananjevsky

use GSettings instead of config file

parent 9f0ec896
......@@ -27,3 +27,5 @@ src/pfd
stamp-h1
*.tar.xz
build.log
*.gschema.xml
*.gschema.valid
......@@ -108,6 +108,9 @@ AC_ARG_ENABLE([icon-browser],
[build_ib=$enableval], [build_ib=no])
AM_CONDITIONAL([BUILD_IB], [test x$build_ib = xyes])
# GSettings
GLIB_GSETTINGS
# *******************************
# Internationalization
# *******************************
......
......@@ -7,6 +7,11 @@ desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@
endif
gsettings_in_file = yad.gschema.xml.in
gsettings_SCHEMAS = $(gsettings_in_file:.xml.in=.xml)
@INTLTOOL_XML_NOMERGE_RULE@
@GSETTINGS_RULES@
dist_man_MANS = yad.1
if BUILD_PFD
dist_man_MANS += pfd.1
......@@ -15,6 +20,6 @@ endif
m4dir = $(datadir)/aclocal
m4_DATA = yad.m4
EXTRA_DIST = $(desktop_in_files) zenity.sh notify-send
EXTRA_DIST = $(desktop_in_files) $(gsettings_in_files) zenity.sh notify-send
DISTCLEAN_FILES = $(desktop_DATA) $(m4_DATA) yad.spec
DISTCLEAN_FILES = $(desktop_DATA) $(gsettings_SCHEMAS) $(m4_DATA) yad.spec
<schemalist>
<schema id="yad.settings" path="/yad/settings/" gettext-domain="yad">
<key name="width" type="i">
<default>-1</default>
<_summary>Default width of dialog window</_summary>
</key>
<key name="height" type="i">
<default>-1</default>
<_summary>Default height of dialog window</_summary>
</key>
<key name="border" type="i">
<default>5</default>
<_summary>Borders around dialog</_summary>
</key>
<key name="combo_always_editable" type="b">
<default>false</default>
<_summary>Combo-box in entry dialog is always editable</_summary>
</key>
<key name="terminal" type="s">
<default>'xterm -e "%s"'</default>
<_summary>Default terminal command (use %s for arguments placeholder)</_summary>
</key>
<key name="open_command" type="s">
<default>'xdg-open "%s"'</default>
<_summary>Default open command (use %s for arguments placeholder)</_summary>
</key>
<key name="date_format" type="s">
<default>'%x'</default>
<_summary>Default date format (see strftime(3) for details)</_summary>
</key>
<key name="uri_color" type="s">
<default>'blue'</default>
<_summary>Default color for URI in text-info dialog</_summary>
</key>
<key name="ignore_unknown_options" type="b">
<default>true</default>
<_summary>Ignore unknown command-line options</_summary>
</key>
<key name="max_tab" type="i">
<default>100</default>
<_summary>Maximum number of tabs in notebook dialog</_summary>
</key>
</schema>
</schemalist>
......@@ -22,3 +22,4 @@ src/browser.c
src/notebook.c
src/pfd.c
data/yad-icon-browser.desktop.in
data/yad.gschema.xml.in
......@@ -188,7 +188,7 @@ entry_create_widget (GtkWidget * dlg)
{
gint active, i;
if (options.common_data.editable || settings.combo_always_editable)
if (options.common_data.editable || g_settings_get_boolean (settings, "combo_always_editable"))
{
c = gtk_combo_box_text_new_with_entry ();
gtk_widget_set_name (c, "yad-entry-edit-combo");
......
......@@ -346,7 +346,7 @@ parse_desktop_file (gchar * filename)
gchar *url = g_key_file_get_string (kf, "Desktop Entry", "URL", NULL);
if (url)
{
ent->command = g_strdup_printf (settings.open_cmd, url);
ent->command = g_strdup_printf (g_settings_get_string (settings, "open_command"), url);
g_free (url);
}
}
......
......@@ -34,6 +34,12 @@
#include "yad.h"
YadOptions options;
GSettings *settings;
GtkIconTheme *yad_icon_theme;
GdkPixbuf *big_fallback_image = NULL;
GdkPixbuf *small_fallback_image = NULL;
static GtkWidget *dialog = NULL;
static gint ret = YAD_RESPONSE_ESC;
......@@ -113,7 +119,7 @@ timeout_cb (gpointer data)
{
gdouble percent = ((gdouble) options.data.timeout - count) / (gdouble) options.data.timeout;
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (w), percent);
if (settings.show_remain)
if (g_settings_get_boolean (settings, "show_remain"))
{
gchar *lbl = g_strdup_printf (_("%d sec"), options.data.timeout - count);
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (w), lbl);
......@@ -386,7 +392,7 @@ create_dialog (void)
gtk_box_pack_end (GTK_BOX (cbox), topb, FALSE, FALSE, 2);
}
if (settings.show_remain)
if (g_settings_get_boolean (settings, "show_remain"))
{
gchar *lbl = g_strdup_printf (_("%d sec"), options.data.timeout);
gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (topb), TRUE);
......@@ -656,7 +662,11 @@ main (gint argc, gchar ** argv)
gtk_init (&argc, &argv);
g_set_application_name ("YAD");
read_settings ();
settings = g_settings_new ("yad.settings");
yad_icon_theme = gtk_icon_theme_get_default ();
yad_options_init ();
ctx = yad_create_context ();
......@@ -708,13 +718,11 @@ main (gint argc, gchar ** argv)
/* set default icons and icon theme */
if (options.data.icon_theme)
gtk_icon_theme_set_custom_theme (settings.icon_theme, options.data.icon_theme);
gtk_icon_theme_set_custom_theme (yad_icon_theme, options.data.icon_theme);
gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &w, &h);
settings.big_fallback_image =
gtk_icon_theme_load_icon (settings.icon_theme, "yad", MIN (w, h), GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
big_fallback_image = gtk_icon_theme_load_icon (yad_icon_theme, "yad", MIN (w, h), GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h);
settings.small_fallback_image =
gtk_icon_theme_load_icon (settings.icon_theme, "yad", MIN (w, h), GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
small_fallback_image = gtk_icon_theme_load_icon (yad_icon_theme, "yad", MIN (w, h), GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
/* correct separators */
str = g_strcompress (options.common_data.separator);
......
......@@ -1150,7 +1150,7 @@ static gboolean
add_image_path (const gchar * option_name, const gchar * value, gpointer data, GError ** err)
{
if (value)
gtk_icon_theme_append_search_path (settings.icon_theme, value);
gtk_icon_theme_append_search_path (yad_icon_theme, value);
return TRUE;
}
......@@ -1443,8 +1443,8 @@ yad_options_init (void)
/* Initialize general data */
options.data.dialog_title = NULL;
options.data.window_icon = "yad";
options.data.width = settings.width;
options.data.height = settings.height;
options.data.width = g_settings_get_int (settings, "width");
options.data.height = g_settings_get_int (settings, "height");
options.data.use_posx = FALSE;
options.data.posx = 0;
options.data.use_posy = FALSE;
......@@ -1455,12 +1455,12 @@ yad_options_init (void)
options.data.dialog_image = NULL;
options.data.icon_theme = NULL;
options.data.expander = NULL;
options.data.timeout = settings.timeout;
options.data.to_indicator = settings.to_indicator;
options.data.timeout = 0;
options.data.to_indicator = NULL;
options.data.buttons = NULL;
options.data.no_buttons = FALSE;
options.data.buttons_layout = GTK_BUTTONBOX_END;
options.data.borders = 2;
options.data.borders = g_settings_get_int (settings, "border");;
options.data.no_markup = FALSE;
options.data.no_escape = FALSE;
options.data.escape_ok = FALSE;
......@@ -1491,7 +1491,7 @@ yad_options_init (void)
options.common_data.editable = FALSE;
options.common_data.tail = FALSE;
options.common_data.command = NULL;
options.common_data.date_format = settings.date_format;
options.common_data.date_format = g_settings_get_string (settings, "date_format");
options.common_data.float_precision = 3;
options.common_data.vertical = FALSE;
options.common_data.align = 0.0;
......@@ -1582,7 +1582,7 @@ yad_options_init (void)
options.icons_data.compact = FALSE;
options.icons_data.generic = FALSE;
options.icons_data.width = -1;
options.icons_data.term = settings.term;
options.icons_data.term = g_settings_get_string (settings, "term");
options.icons_data.sort_by_name = FALSE;
options.icons_data.descend = FALSE;
options.icons_data.single_click = FALSE;
......@@ -1680,7 +1680,7 @@ yad_options_init (void)
options.text_data.justify = GTK_JUSTIFY_LEFT;
options.text_data.margins = 0;
options.text_data.hide_cursor = TRUE;
options.text_data.uri_color = "blue";
options.text_data.uri_color = g_settings_get_string (settings, "uri_color");
options.text_data.formatted = FALSE;
#ifdef HAVE_SOURCEVIEW
......@@ -1856,7 +1856,7 @@ yad_create_context (void)
g_option_context_add_group (tmp_ctx, a_group);
g_option_context_set_help_enabled (tmp_ctx, TRUE);
g_option_context_set_ignore_unknown_options (tmp_ctx, settings.ignore_unknown);
g_option_context_set_ignore_unknown_options (tmp_ctx, g_settings_get_boolean (settings, "ignore_unknown_options"));
return tmp_ctx;
}
......@@ -213,9 +213,11 @@ yad_print_run (void)
{
GtkWidget *dlg;
GtkWidget *box, *img, *lbl;
gchar *uri, *job_name = NULL;
gchar *uri, *fn, *job_name = NULL;
GtkPrintCapabilities pcap;
GtkPrintOperationAction act = GTK_PRINT_OPERATION_ACTION_PRINT;
GtkPrintSettings *print_settings = NULL;
GtkPageSetup *page_setup = NULL;
gint resp, ret = 0;
GError *err = NULL;
......@@ -234,6 +236,15 @@ yad_print_run (void)
return 1;
}
/* load previously saved print settings */
fn = g_build_filename (g_get_user_config_dir (), "yad", "print.conf", NULL);
if (g_file_test (fn, G_FILE_TEST_EXISTS))
{
print_settings = gtk_print_settings_new_from_file (fn, NULL);
page_setup = gtk_page_setup_new_from_file (fn, NULL);
}
g_free (fn);
/* create print dialog */
dlg = gtk_print_unix_dialog_new (options.data.dialog_title, NULL);
gtk_window_set_type_hint (GTK_WINDOW (dlg), GDK_WINDOW_TYPE_HINT_NORMAL);
......@@ -245,17 +256,15 @@ yad_print_run (void)
pcap |= GTK_PRINT_CAPABILITY_PREVIEW;
gtk_print_unix_dialog_set_manual_capabilities (GTK_PRINT_UNIX_DIALOG (dlg), pcap);
if (!settings.print_settings)
settings.print_settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dlg));
uri = g_build_filename (g_get_current_dir (), "yad.pdf", NULL);
gtk_print_settings_set (settings.print_settings, "output-uri", g_filename_to_uri (uri, NULL, NULL));
gtk_print_settings_set (print_settings, "output-uri", g_filename_to_uri (uri, NULL, NULL));
g_free (uri);
gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG (dlg), settings.print_settings);
if (print_settings)
gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG (dlg), print_settings);
if (settings.page_setup)
gtk_print_unix_dialog_set_page_setup (GTK_PRINT_UNIX_DIALOG (dlg), settings.page_setup);
if (page_setup)
gtk_print_unix_dialog_set_page_setup (GTK_PRINT_UNIX_DIALOG (dlg), page_setup);
/* set window behavior */
gtk_widget_set_name (dlg, "yad-dialog-window");
......@@ -325,16 +334,16 @@ yad_print_run (void)
case GTK_RESPONSE_APPLY: /* ask for preview */
act = GTK_PRINT_OPERATION_ACTION_PREVIEW;
case GTK_RESPONSE_OK: /* run print */
settings.print_settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dlg));
settings.page_setup = gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (dlg));
print_settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dlg));
page_setup = gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (dlg));
job_name = g_strdup_printf ("yad-%s-%d", g_path_get_basename (options.common_data.uri), getpid ());
if (options.print_data.type != YAD_PRINT_RAW)
{
/* print text or image */
GtkPrintOperation *op = gtk_print_operation_new ();
gtk_print_operation_set_unit (op, GTK_UNIT_POINTS);
gtk_print_operation_set_print_settings (op, settings.print_settings);
gtk_print_operation_set_default_page_setup (op, settings.page_setup);
gtk_print_operation_set_print_settings (op, print_settings);
gtk_print_operation_set_default_page_setup (op, page_setup);
gtk_print_operation_set_job_name (op, job_name);
switch (options.print_data.type)
......@@ -388,7 +397,7 @@ yad_print_run (void)
if (ret == 1)
break;
job = gtk_print_job_new (job_name, prnt, settings.print_settings, settings.page_setup);
job = gtk_print_job_new (job_name, prnt, print_settings, page_setup);
if (gtk_print_job_set_source_file (job, options.common_data.uri, &err))
{
gtk_print_job_send (job, (GtkPrintJobCompleteFunc) raw_print_done, &ret, NULL);
......@@ -409,6 +418,16 @@ yad_print_run (void)
while (resp == GTK_RESPONSE_APPLY);
gtk_widget_destroy (dlg);
write_settings ();
/* save print settings */
fn = g_build_filename (g_get_user_config_dir (), "yad", NULL);
g_mkdir_with_parents (fn, 0700);
g_free (fn);
fn = g_build_filename (g_get_user_config_dir (), "yad", "print.conf", NULL);
gtk_print_settings_to_file (print_settings, fn, NULL);
gtk_page_setup_to_file (page_setup, fn, NULL);
g_free (fn);
return ret;
}
......@@ -173,7 +173,7 @@ tag_event_cb (GtkTextTag * tag, GObject * obj, GdkEvent * ev, GtkTextIter * iter
gtk_text_iter_forward_to_tag_toggle (&end, tag);
url = gtk_text_iter_get_text (&start, &end);
cmdline = g_strdup_printf (settings.open_cmd, url);
cmdline = g_strdup_printf (g_settings_get_string (settings, "open_command"), url);
g_free (url);
g_spawn_command_line_async (cmdline, NULL);
......
......@@ -30,8 +30,6 @@
#include "yad.h"
YadSettings settings;
const YadStock yad_stock_items[] = {
{ "yad-about", N_("About"), "help-about" },
{ "yad-add", N_("Add"), "list-add" },
......@@ -54,124 +52,6 @@ const YadStock yad_stock_items[] = {
{ "yad-yes", N_("Yes"), "gtk-yes" }
};
void
read_settings (void)
{
GKeyFile *kf;
gchar *filename;
/* set defaults */
settings.width = settings.height = -1;
settings.timeout = 0;
settings.to_indicator = "none";
settings.show_remain = FALSE;
settings.combo_always_editable = FALSE;
settings.term = "xterm -e '%s'";
settings.open_cmd = "xdg-open '%s'";
settings.date_format = "%x";
settings.ignore_unknown = TRUE;
settings.max_tab = 100;
settings.print_settings = NULL;
settings.page_setup = NULL;
settings.icon_theme = gtk_icon_theme_get_default ();
filename = g_build_filename (g_get_user_config_dir (), YAD_SETTINGS_FILE, NULL);
if (g_file_test (filename, G_FILE_TEST_EXISTS))
{
kf = g_key_file_new ();
if (g_key_file_load_from_file (kf, filename, G_KEY_FILE_NONE, NULL))
{
if (g_key_file_has_key (kf, "General", "width", NULL))
settings.width = g_key_file_get_integer (kf, "General", "width", NULL);
if (g_key_file_has_key (kf, "General", "height", NULL))
settings.height = g_key_file_get_integer (kf, "General", "height", NULL);
if (g_key_file_has_key (kf, "General", "timeout", NULL))
settings.timeout = g_key_file_get_integer (kf, "General", "timeout", NULL);
if (g_key_file_has_key (kf, "General", "timeout_indicator", NULL))
settings.to_indicator = g_key_file_get_string (kf, "General", "timeout_indicator", NULL);
if (g_key_file_has_key (kf, "General", "show_remain", NULL))
settings.show_remain = g_key_file_get_boolean (kf, "General", "show_remain", NULL);
if (g_key_file_has_key (kf, "General", "combo_always_editable", NULL))
settings.combo_always_editable = g_key_file_get_boolean (kf, "General", "combo_always_editable", NULL);
if (g_key_file_has_key (kf, "General", "terminal", NULL))
settings.term = g_key_file_get_string (kf, "General", "terminal", NULL);
if (g_key_file_has_key (kf, "General", "open_command", NULL))
settings.open_cmd = g_key_file_get_string (kf, "General", "open_command", NULL);
if (g_key_file_has_key (kf, "General", "date_format", NULL))
settings.date_format = g_key_file_get_string (kf, "General", "date_format", NULL);
if (g_key_file_has_key (kf, "General", "ignore_unknown_options", NULL))
settings.ignore_unknown = g_key_file_get_boolean (kf, "General", "ignore_unknown_options", NULL);
if (g_key_file_has_key (kf, "General", "max_tab", NULL))
settings.max_tab = g_key_file_get_integer (kf, "General", "max_tab", NULL);
settings.print_settings = gtk_print_settings_new_from_key_file (kf, NULL, NULL);
settings.page_setup = gtk_page_setup_new_from_key_file (kf, NULL, NULL);
}
g_key_file_free (kf);
}
else
write_settings ();
g_free (filename);
}
void
write_settings (void)
{
GKeyFile *kf;
gchar *context;
kf = g_key_file_new ();
g_key_file_set_integer (kf, "General", "width", settings.width);
g_key_file_set_comment (kf, "General", "width", " Default dialog width", NULL);
g_key_file_set_integer (kf, "General", "height", settings.height);
g_key_file_set_comment (kf, "General", "height", " Default dialog height", NULL);
g_key_file_set_integer (kf, "General", "timeout", settings.timeout);
g_key_file_set_comment (kf, "General", "timeout", " Default timeout (0 for no timeout)", NULL);
g_key_file_set_string (kf, "General", "timeout_indicator", settings.to_indicator);
g_key_file_set_comment (kf, "General", "timeout_indicator", " Position of timeout indicator (top, bottom, left, right, none)", NULL);
g_key_file_set_boolean (kf, "General", "show_remain", settings.show_remain);
g_key_file_set_comment (kf, "General", "show_remain", " Show remain seconds in timeout indicator", NULL);
g_key_file_set_boolean (kf, "General", "combo_always_editable", settings.combo_always_editable);
g_key_file_set_comment (kf, "General", "combo_always_editable", " Combo-box in entry dialog is always editable", NULL);
g_key_file_set_string (kf, "General", "terminal", settings.term);
g_key_file_set_comment (kf, "General", "terminal", " Default terminal command (use %s for arguments placeholder)", NULL);
g_key_file_set_string (kf, "General", "open_command", settings.open_cmd);
g_key_file_set_comment (kf, "General", "open_command", " Default open command (use %s for arguments placeholder)", NULL);
g_key_file_set_string (kf, "General", "date_format", settings.date_format);
g_key_file_set_comment (kf, "General", "date_format", " Default date format (see strftime(3) for details)", NULL);
g_key_file_set_boolean (kf, "General", "ignore_unknown_options", settings.ignore_unknown);
g_key_file_set_comment (kf, "General", "ignore_unknown_options", " Ignore unknown command-line options", NULL);
g_key_file_set_integer (kf, "General", "max_tab", settings.max_tab);
g_key_file_set_comment (kf, "General", "max_tab", " Maximum number of tabs in notebook", NULL);
if (settings.print_settings)
gtk_print_settings_to_key_file (settings.print_settings, kf, NULL);
if (settings.page_setup)
gtk_page_setup_to_key_file (settings.page_setup, kf, NULL);
context = g_key_file_to_data (kf, NULL, NULL);
g_key_file_free (kf);
if (g_mkdir_with_parents (g_get_user_config_dir (), 0755) != -1)
{
gchar *filename = g_build_filename (g_get_user_config_dir (), YAD_SETTINGS_FILE, NULL);
g_file_set_contents (filename, context, -1, NULL);
g_free (filename);
}
else
g_printerr ("yad: cannot write settings file: %s\n", strerror (errno));
g_free (context);
}
gboolean
stock_lookup (gchar *key, YadStock *it)
{
......@@ -218,14 +98,14 @@ get_pixbuf (gchar * name, YadIconSize size, gboolean force)
}
}
else
pb = gtk_icon_theme_load_icon (settings.icon_theme, name, MIN (w, h), GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
pb = gtk_icon_theme_load_icon (yad_icon_theme, name, MIN (w, h), GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
if (!pb)
{
if (size == YAD_BIG_ICON)
pb = g_object_ref (settings.big_fallback_image);
pb = g_object_ref (big_fallback_image);
else
pb = g_object_ref (settings.small_fallback_image);
pb = g_object_ref (small_fallback_image);
}
/* force scaling image to specific size */
......@@ -357,12 +237,13 @@ YadNTabs *
get_tabs (key_t key, gboolean create)
{
YadNTabs *t = NULL;
int shmid, i;
int shmid, i, max_tab;
/* get shared memory */
max_tab = g_settings_get_int (settings, "max_tab") + 1;
if (create)
{
if ((shmid = shmget (key, (settings.max_tab + 1) * sizeof (YadNTabs), IPC_CREAT | IPC_EXCL | 0644)) == -1)
if ((shmid = shmget (key, max_tab * sizeof (YadNTabs), IPC_CREAT | IPC_EXCL | 0644)) == -1)
{
g_printerr ("yad: cannot create shared memory for key %d: %s\n", key, strerror (errno));
return NULL;
......@@ -370,7 +251,7 @@ get_tabs (key_t key, gboolean create)
}
else
{
if ((shmid = shmget (key, (settings.max_tab + 1) * sizeof (YadNTabs), 0)) == -1)
if ((shmid = shmget (key, max_tab * sizeof (YadNTabs), 0)) == -1)
{
if (errno != ENOENT)
g_printerr ("yad: cannot get shared memory for key %d: %s\n", key, strerror (errno));
......@@ -388,7 +269,7 @@ get_tabs (key_t key, gboolean create)
/* initialize memory */
if (create)
{
for (i = 0; i < settings.max_tab + 1; i++)
for (i = 0; i < max_tab; i++)
{
t[i].pid = -1;
t[i].xid = 0;
......
......@@ -43,8 +43,6 @@
G_BEGIN_DECLS
#define YAD_SETTINGS_FILE "yad.conf"
#define YAD_RESPONSE_OK 0
#define YAD_RESPONSE_CANCEL 1
#define YAD_RESPONSE_TIMEOUT 70
......@@ -520,29 +518,11 @@ typedef struct {
} YadOptions;
extern YadOptions options;
extern GSettings *settings;
extern GtkIconTheme *yad_icon_theme;
/* SETTINGS */
typedef struct {
guint width;
guint height;
guint timeout;
gchar *to_indicator;
gboolean show_remain;
gboolean combo_always_editable;
gboolean ignore_unknown;
GtkIconTheme *icon_theme;
GdkPixbuf *big_fallback_image;
GdkPixbuf *small_fallback_image;
gchar *term;
gchar *open_cmd;
gchar *date_format;
guint max_tab;
GtkPrintSettings *print_settings;
GtkPageSetup *page_setup;
} YadSettings;
extern YadSettings settings;
extern GdkPixbuf *big_fallback_image;
extern GdkPixbuf *small_fallback_image;
/* TABS */
typedef struct {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment