/* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
- * xscreensaver, Copyright (c) 2001-2008 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
#include "demo-Gtk-conf.h"
-
+/* Deal with deprecation of direct access to struct fields on the way to GTK3
+ See http://live.gnome.org/GnomeGoals/UseGseal
+ */
+#if GTK_CHECK_VERSION(2,14,0)
+# define GET_PARENT(w) gtk_widget_get_parent (w)
+# define GET_ADJ_VALUE(a) gtk_adjustment_get_value (a)
+# define GET_ADJ_UPPER(a) gtk_adjustment_get_upper (a)
+# define GET_ADJ_LOWER(a) gtk_adjustment_get_lower (a)
+#else
+# define GET_PARENT(w) ((w)->parent)
+# define GET_ADJ_VALUE(a) ((a)->value)
+# define GET_ADJ_UPPER(a) ((a)->upper)
+# define GET_ADJ_LOWER(a) ((a)->lower)
+#endif
+
+
extern const char *blurb (void);
else if (!strcmp (name, "number")) p->type = SPINBUTTON;
else if (!strcmp (name, "select")) p->type = SELECT;
- else if (!strcmp (name, "xscreensaver-text") || /* these are ignored in X11 */
- !strcmp (name, "xscreensaver-image")) /* (they are used in Cocoa) */
+ else if (!strcmp (name, "xscreensaver-text") || /* ignored in X11; */
+ !strcmp (name, "xscreensaver-image") || /* used in Cocoa. */
+ !strcmp (name, "xscreensaver-updater") ||
+ !strcmp (name, "video"))
{
free (p);
return 0;
}
+static void
+link_atk_label_to_widget(GtkWidget *label, GtkWidget *widget)
+{
+ AtkObject *atk_label = gtk_widget_get_accessible (label);
+ AtkObject *atk_widget = gtk_widget_get_accessible (widget);
+
+ atk_object_add_relationship (atk_label, ATK_RELATION_LABEL_FOR,
+ atk_widget);
+ atk_object_add_relationship (atk_widget, ATK_RELATION_LABELLED_BY,
+ atk_label);
+}
+
/* Given a `parameter' struct, allocates an appropriate GtkWidget for it,
and stores it in `p->widget'.
`parent' must be a GtkBox.
{
case STRING:
{
+ GtkWidget *entry = gtk_entry_new ();
parent = insert_fake_hbox (parent);
if (label)
{
GtkWidget *w = gtk_label_new (_(label));
+ link_atk_label_to_widget (w, entry);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
gtk_box_pack_start (GTK_BOX (parent), w, FALSE, FALSE, 4);
}
- p->widget = gtk_entry_new ();
+ p->widget = entry;
if (p->string)
gtk_entry_set_text (GTK_ENTRY (p->widget), (char *) p->string);
gtk_box_pack_start (GTK_BOX (parent), p->widget, FALSE, FALSE, 4);
GtkWidget *L = gtk_label_new (label ? _(label) : "");
GtkWidget *entry = gtk_entry_new ();
GtkWidget *button = gtk_button_new_with_label (_("Browse..."));
+ link_atk_label_to_widget (L, entry);
gtk_widget_show (entry);
gtk_widget_show (button);
p->widget = entry;
if (label)
{
labelw = gtk_label_new (_(label));
+ link_atk_label_to_widget (labelw, scale);
gtk_label_set_justify (GTK_LABEL (labelw), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (labelw), 0.0, 0.5);
set_widget_min_width (GTK_WIDGET (labelw), MIN_LABEL_WIDTH);
if (p->low_label)
{
GtkWidget *w = gtk_label_new (_((char *) p->low_label));
+ link_atk_label_to_widget (w, scale);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
if (p->high_label)
{
GtkWidget *w = gtk_label_new (_((char *) p->high_label));
+ link_atk_label_to_widget (w, scale);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
GtkWidget *spin = gtk_spin_button_new (adj, 15, 0);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin), TRUE);
gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (spin), TRUE);
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), adj->value);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), GET_ADJ_VALUE(adj));
set_widget_min_width (GTK_WIDGET (spin), MIN_SPINBUTTON_WIDTH);
if (label)
{
GtkWidget *w = gtk_label_new (_(label));
+ link_atk_label_to_widget (w, spin);
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
set_widget_min_width (GTK_WIDGET (w), MIN_LABEL_WIDTH);
file_sel_cancel (GtkWidget *button, gpointer user_data)
{
GtkWidget *dialog = button;
- while (dialog->parent)
- dialog = dialog->parent;
+ while (GET_PARENT (dialog))
+ dialog = GET_PARENT (dialog);
gtk_widget_destroy (dialog);
}
GtkWidget *entry = GTK_WIDGET (user_data);
GtkWidget *dialog = button;
const char *path;
- while (dialog->parent)
- dialog = dialog->parent;
+
+ while (GET_PARENT (dialog))
+ dialog = GET_PARENT (dialog);
gtk_widget_hide (dialog);
path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog));
char q = s[0];
if (q != '\'' && q != '\"' && q != '`')
abort();
- memmove (s, s+1, strlen (s)+1);
+ memmove (s, s+1, strlen (s));
while (*s && *s != q)
{
if (*s == '\\')
char buf[255];
char *s1;
float value = (p->invert_p
- ? invert_range (adj->lower, adj->upper, adj->value) - 1
- : adj->value);
+ ? invert_range (GET_ADJ_LOWER(adj), GET_ADJ_UPPER(adj),
+ GET_ADJ_VALUE(adj)) - 1
+ : GET_ADJ_VALUE(adj));
if (value == p->value) /* same as default */
return 0;
if (1 == sscanf ((char *) value, "%f %c", &f, &c))
{
if (p->invert_p)
- f = invert_range (adj->lower, adj->upper, f) - 1;
+ f = invert_range (GET_ADJ_LOWER(adj), GET_ADJ_UPPER(adj), f) - 1;
gtk_adjustment_set_value (adj, f);
}
break;