Universal access: add dialog for zoom options

Added UI and code to spawn a zoom options preferences dialog to
modify various magnifier settings.  Modified the 'Seeing'
section of the universal access panel to enable the 'Options...'
button.

https://bugzilla.gnome.org/show_bug.cgi?id=643086
This commit is contained in:
Joseph Scheuhammer 2011-05-18 16:09:47 -04:00 committed by Bastien Nocera
parent 5a81baca8a
commit f7fa758b2b
7 changed files with 1284 additions and 7 deletions

View file

@ -19,13 +19,15 @@ libuniversal_access_la_SOURCES = \
gconf-property-editor.h \ gconf-property-editor.h \
gconf-property-editor.c \ gconf-property-editor.c \
cc-marshal.c \ cc-marshal.c \
cc-marshal.h cc-marshal.h \
zoom-options.c \
zoom-options.h
libuniversal_access_la_LIBADD = $(PANEL_LIBS) $(UNIVERSAL_ACCESS_PANEL_LIBS) $(top_builddir)/panels/common/libshortcuts.la libuniversal_access_la_LIBADD = $(PANEL_LIBS) $(UNIVERSAL_ACCESS_PANEL_LIBS) $(top_builddir)/panels/common/libshortcuts.la
libuniversal_access_la_LDFLAGS = $(PANEL_LDFLAGS) libuniversal_access_la_LDFLAGS = $(PANEL_LDFLAGS)
uidir = $(pkgdatadir)/ui uidir = $(pkgdatadir)/ui
dist_ui_DATA = uap.ui dist_ui_DATA = uap.ui zoom-options.ui
@INTLTOOL_DESKTOP_RULE@ @INTLTOOL_DESKTOP_RULE@

View file

@ -32,6 +32,8 @@
#include "eggaccelerators.h" #include "eggaccelerators.h"
#include "gconf-property-editor.h" #include "gconf-property-editor.h"
#include "zoom-options.h"
#define WID(b, w) (GtkWidget *) gtk_builder_get_object (b, w) #define WID(b, w) (GtkWidget *) gtk_builder_get_object (b, w)
@ -50,6 +52,8 @@ struct _CcUaPanelPrivate
GSettings *application_settings; GSettings *application_settings;
GSettings *mediakeys_settings; GSettings *mediakeys_settings;
GObject *zoom_options;
GSList *notify_list; GSList *notify_list;
}; };
@ -142,6 +146,12 @@ cc_ua_panel_dispose (GObject *object)
priv->mediakeys_settings = NULL; priv->mediakeys_settings = NULL;
} }
if (priv->zoom_options)
{
g_object_unref (priv->zoom_options);
priv->zoom_options = NULL;
}
G_OBJECT_CLASS (cc_ua_panel_parent_class)->dispose (object); G_OBJECT_CLASS (cc_ua_panel_parent_class)->dispose (object);
} }
@ -210,6 +220,17 @@ static gchar *visual_alerts_section[] = {
NULL NULL
}; };
/* zoom options dialog */
static void
zoom_options_launch_cb (GtkWidget *options_button, CcUaPanel *self)
{
if (self->priv->zoom_options == NULL)
self->priv->zoom_options = g_object_new (ZOOM_TYPE_OPTIONS, NULL);
if (self->priv->zoom_options != NULL)
zoom_options_present_dialog (ZOOM_OPTIONS (self->priv->zoom_options));
}
static void static void
cc_ua_panel_section_switched (GObject *object, cc_ua_panel_section_switched (GObject *object,
GParamSpec *pspec, GParamSpec *pspec,
@ -516,10 +537,12 @@ cc_ua_panel_init_seeing (CcUaPanel *self)
WID (priv->builder, "seeing_enable_toggle_keys_checkbutton"), "active", WID (priv->builder, "seeing_enable_toggle_keys_checkbutton"), "active",
G_SETTINGS_BIND_DEFAULT); G_SETTINGS_BIND_DEFAULT);
settings_on_off_editor_new (priv, priv->application_settings, g_signal_connect (WID (priv->builder, "seeing_zoom_preferences_button"),
"screen-magnifier-enabled", "clicked",
WID (priv->builder, "seeing_zoom_switch"), G_CALLBACK (zoom_options_launch_cb), self);
NULL); g_settings_bind (priv->application_settings, "screen-magnifier-enabled",
WID (priv->builder, "seeing_zoom_switch"), "active",
G_SETTINGS_BIND_DEFAULT);
settings_on_off_editor_new (priv, priv->application_settings, settings_on_off_editor_new (priv, priv->application_settings,
"screen-reader-enabled", "screen-reader-enabled",

View file

@ -609,10 +609,12 @@
<object class="GtkButton" id="seeing_zoom_preferences_button"> <object class="GtkButton" id="seeing_zoom_preferences_button">
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="visible">True</property>
<property name="sensitive">True</property>
<child> <child>
<object class="GtkLabel" id="seeing_zoom_preferences_label"> <object class="GtkLabel" id="seeing_zoom_preferences_label">
<property name="visible">True</property> <property name="visible">True</property>
<property name="sensitive">False</property> <property name="sensitive">True</property>
<property name="label" translatable="yes">Options...</property> <property name="label" translatable="yes">Options...</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
</object> </object>

View file

@ -0,0 +1,330 @@
/*
* Copyright 2011 Inclusive Design Research Centre, OCAD University.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* This program 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 General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Author: Joseph Scheuhammer <clown@alum.mit.edu>
*/
#include "zoom-options.h"
#include <gdk/gdk.h>
#include <glib/gi18n.h>
#include <string.h>
#define WID(b, w) (GtkWidget *) gtk_builder_get_object (b, w)
struct _ZoomOptionsPrivate
{
GtkBuilder *builder;
GSettings *settings;
GtkWidget *dialog;
};
G_DEFINE_TYPE (ZoomOptions, zoom_options, G_TYPE_OBJECT);
static void xhairs_color_opacity_changed_cb (GtkColorButton *button, ZoomOptionsPrivate *priv);
static void xhairs_length_add_marks (GtkScale *scale);
static void
mouse_mode_radiobutton_toggled_cb (GtkWidget *widget, ZoomOptionsPrivate *priv)
{
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) == TRUE)
{
g_settings_set_string (priv->settings, "mouse-tracking",
gtk_buildable_get_name (GTK_BUILDABLE (widget)));
}
}
static void
screen_position_radiobutton_toggled_cb (GtkWidget *widget, ZoomOptionsPrivate *priv)
{
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) == TRUE)
{
g_settings_set_string (priv->settings, "screen-position",
gtk_buildable_get_name (GTK_BUILDABLE (widget)));
}
}
static void
init_radio_group (GSList *radio_group,
gchar *key,
GCallback radiobutton_toggled_cb,
ZoomOptionsPrivate *priv)
{
gchar *value;
gchar *name;
value = g_settings_get_string (priv->settings, key);
for (; radio_group != NULL; radio_group = radio_group->next)
{
name = gtk_buildable_get_name (GTK_BUILDABLE (radio_group->data));
if (strcmp (name, value) == 0)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_group->data), TRUE);
else
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_group->data), FALSE);
g_signal_connect (G_OBJECT (radio_group->data), "toggled",
G_CALLBACK(radiobutton_toggled_cb),
priv);
}
}
static void
init_xhairs_color_opacity (GtkColorButton *color_button, ZoomOptionsPrivate *priv)
{
gchar *color_setting;
GdkRGBA rgba;
color_setting = g_settings_get_string (priv->settings, "cross-hairs-color");
gdk_rgba_parse (&rgba, color_setting);
rgba.alpha = g_settings_get_double (priv->settings, "cross-hairs-opacity");
gtk_color_button_set_rgba (GTK_COLOR_BUTTON (color_button), &rgba);
}
static void
update_xhairs_color_cb (GSettings *settings, gchar *key, GtkColorButton *button)
{
gchar *color;
GdkColor rgb;
color = g_settings_get_string (settings, key);
gdk_color_parse (color, &rgb);
gtk_color_button_set_color (button, &rgb);
}
static void
update_xhairs_opacity_cb (GSettings *settings, gchar *key, GtkColorButton *button)
{
gdouble opacity;
opacity = g_settings_get_double (settings, key);
gtk_color_button_set_alpha (button, opacity * 65535);
}
static void
xhairs_color_opacity_changed_cb (GtkColorButton *button, ZoomOptionsPrivate *priv)
{
GdkRGBA rgba;
GdkColor rgb;
gchar *color_string;
gchar gsetting_val[8];
gtk_color_button_get_color (button, &rgb);
color_string = gdk_color_to_string (&rgb);
// color_string is in the form '#rrrrggggbbbb'. Convert to '#rrggbb'.
// Start by copying the leading '#'.
g_strlcpy (gsetting_val, color_string, 4);
g_strlcpy (gsetting_val+3, color_string+5, 3);
g_strlcpy (gsetting_val+5, color_string+9, 3);
g_settings_set_string (priv->settings, "cross-hairs-color", gsetting_val);
gtk_color_button_get_rgba (button, &rgba);
g_settings_set_double (priv->settings, "cross-hairs-opacity", rgba.alpha);
}
static void xhairs_length_add_marks (GtkScale *scale)
{
gint length, quarter_length;
GtkAdjustment *scale_model;
// Get maximum dimension of screen.
length = MAX(gdk_screen_width(), gdk_screen_height());
scale_model = gtk_range_get_adjustment (GTK_RANGE (scale));
if (length < gtk_adjustment_get_upper(scale_model))
{
gtk_adjustment_set_upper (scale_model, length);
}
// The crosshair is made up of four lines in pairs (top, bottom) and
// (left, right). Stipulating: "quarter of the screen" means that the
// length of one hair is 25% of the screen.
quarter_length = length / 4;
gtk_scale_add_mark (scale, quarter_length, GTK_POS_BOTTOM, _("1/4 Screen"));
gtk_scale_add_mark (scale, quarter_length * 2 , GTK_POS_BOTTOM, _("1/2 Screen"));
gtk_scale_add_mark (scale, quarter_length * 3, GTK_POS_BOTTOM, _("3/4 Screen"));
}
static void
zoom_option_close_dialog_cb (GtkWidget *closer, ZoomOptionsPrivate *priv)
{
if (priv->dialog != NULL)
gtk_widget_hide (priv->dialog);
}
static void
zoom_options_dispose (GObject *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (ZOOM_IS_OPTIONS (object));
ZoomOptionsPrivate *priv = ZOOM_OPTIONS (object)->priv;
if (priv->builder)
{
g_object_unref (priv->builder);
priv->builder = NULL;
}
if (priv->settings)
{
g_object_unref (priv->settings);
priv->settings = NULL;
}
if (priv->dialog)
{
gtk_widget_destroy (priv->dialog);
priv->dialog = NULL;
}
G_OBJECT_CLASS (zoom_options_parent_class)->dispose (object);
}
static void
zoom_options_finalize (GObject *object)
{
G_OBJECT_CLASS (zoom_options_parent_class)->finalize (object);
}
static void
zoom_options_class_init (ZoomOptionsClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = zoom_options_dispose;
object_class->finalize = zoom_options_finalize;
g_type_class_add_private (klass, sizeof (ZoomOptionsPrivate));
}
static void
zoom_options_init (ZoomOptions *self)
{
ZoomOptionsPrivate *priv;
GtkWidget *w;
GSList *radio_group;
GError *err = NULL;
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, ZOOM_TYPE_OPTIONS, ZoomOptionsPrivate);
priv->builder = gtk_builder_new ();
gtk_builder_add_from_file (priv->builder,
GNOMECC_UI_DIR "/zoom-options.ui",
&err);
if (err)
{
g_warning ("Could not load interface file: %s", err->message);
g_error_free (err);
g_object_unref (priv->builder);
priv->builder = NULL;
return;
}
priv->settings = g_settings_new ("org.gnome.desktop.a11y.magnifier");
/* Magnification factor */
w = WID (priv->builder, "magFactorSpinButton");
g_settings_bind (priv->settings, "mag-factor",
gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w)),
"value", G_SETTINGS_BIND_DEFAULT);
/* Mouse tracking */
w = WID (priv->builder, "proportional");
radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
init_radio_group (radio_group, "mouse-tracking",
G_CALLBACK(mouse_mode_radiobutton_toggled_cb), priv);
/* Screen position */
w = WID (priv->builder, "full-screen");
radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
init_radio_group (radio_group, "screen-position",
G_CALLBACK(screen_position_radiobutton_toggled_cb), priv);
/* Lens mode */
w = WID (priv->builder, "moveableLensCheckbox");
g_settings_bind (priv->settings, "lens-mode", w, "active",
G_SETTINGS_BIND_DEFAULT);
/* Clamp scrolling at screen edges */
w = WID (priv->builder, "scrollAtEdges");
g_settings_bind (priv->settings, "scroll-at-edges", w, "active",
G_SETTINGS_BIND_DEFAULT);
/* Cross hairs: show/hide ... */
w = WID (priv->builder, "xhairsEnabledSwitch");
g_settings_bind (priv->settings, "show-cross-hairs", w, "active",
G_SETTINGS_BIND_DEFAULT);
/* ... Cross hairs: color and opacity */
w = WID (priv->builder, "xHairsPicker");
init_xhairs_color_opacity (GTK_COLOR_BUTTON (w), priv);
g_signal_connect (G_OBJECT (priv->settings), "changed::cross-hairs-color",
G_CALLBACK (update_xhairs_color_cb), w);
g_signal_connect (G_OBJECT (priv->settings), "changed::cross-hairs-opacity",
G_CALLBACK (update_xhairs_opacity_cb), w);
g_signal_connect (G_OBJECT (w), "color-set",
G_CALLBACK(xhairs_color_opacity_changed_cb),
priv);
/* ... Cross hairs: thickness ... */
w = WID (priv->builder, "xHairsThicknessSlider");
g_settings_bind (priv->settings, "cross-hairs-thickness",
gtk_range_get_adjustment (GTK_RANGE (w)), "value",
G_SETTINGS_BIND_DEFAULT);
/* ... Cross hairs: clip ... */
w = WID (priv->builder, "xHairsClipCheckbox");
g_settings_bind (priv->settings, "cross-hairs-clip", w, "active",
G_SETTINGS_BIND_INVERT_BOOLEAN);
/* ... Cross hairs: length */
w = WID (priv->builder, "xHairsLengthSlider");
xhairs_length_add_marks (GTK_SCALE (w));
g_settings_bind (priv->settings, "cross-hairs-length",
gtk_range_get_adjustment (GTK_RANGE (w)), "value",
G_SETTINGS_BIND_DEFAULT);
/* ... Window itself ... */
priv->dialog = WID (priv->builder, "magPrefsDialog");
w = WID (priv->builder, "closeButton");
g_signal_connect (G_OBJECT (w), "clicked",
G_CALLBACK (zoom_option_close_dialog_cb),
priv);
g_signal_connect (G_OBJECT (priv->dialog), "delete-event",
G_CALLBACK (gtk_widget_hide_on_delete),
NULL);
zoom_options_present_dialog (self);
}
/**
* zoom_options_present_dialog:
* @self: the #ZoomOptions object
*
* Activate the dialog associated with this ZoomOptions.
*/
void
zoom_options_present_dialog (ZoomOptions *self)
{
g_return_if_fail (ZOOM_IS_OPTIONS (self));
if (self->priv->dialog != NULL)
gtk_window_present (GTK_WINDOW (self->priv->dialog));
}

View file

@ -0,0 +1,73 @@
/*
* Copyright 2011 Inclusive Design Research Centre, OCAD University.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* This program 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 General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Author: Joseph Scheuhammer <clown@alum.mit.edu>
*/
#ifndef _ZOOM_OPTIONS_H
#define _ZOOM_OPTIONS_H
#include <glib-object.h>
#include <gtk/gtk.h>
G_BEGIN_DECLS
typedef struct _ZoomOptions ZoomOptions;
typedef struct _ZoomOptionsClass ZoomOptionsClass;
typedef struct _ZoomOptionsPrivate ZoomOptionsPrivate;
#define ZOOM_TYPE_OPTIONS (zoom_options_get_type ())
#define ZOOM_OPTIONS(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
ZOOM_TYPE_OPTIONS, ZoomOptions))
#define ZOOM_OPTIONS_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
ZOOM_TYPE_OPTIONS, ZoomOptionsClass))
#define ZOOM_IS_OPTIONS(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
ZOOM_TYPE_OPTIONS))
#define ZOOM_IS_OPTIONS_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
ZOOM_TYPE_OPTIONS))
#define ZOOM_OPTIONS_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
ZOOM_TYPE_OPTIONS, ZoomOptionsClass))
struct _ZoomOptionsClass
{
GObjectClass parent_class;
};
struct _ZoomOptions
{
GObject parent;
ZoomOptionsPrivate *priv;
};
GType zoom_options_get_type (void) G_GNUC_CONST;
void zoom_options_present_dialog (ZoomOptions *self);
G_END_DECLS
#endif /* _ZOOM_OPTIONS_H */

View file

@ -0,0 +1,845 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<object class="GtkAdjustment" id="adjustment2">
<property name="lower">100</property>
<property name="upper">4096</property>
<property name="value">4096</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
<property name="page_size">10</property>
</object>
<object class="GtkAdjustment" id="magFactor">
<property name="lower">1</property>
<property name="upper">20</property>
<property name="value">2</property>
<property name="step_increment">0.25</property>
<property name="page_increment">1</property>
</object>
<object class="GtkDialog" id="magPrefsDialog">
<property name="width_request">650</property>
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Zoom Options</property>
<property name="resizable">False</property>
<property name="window_position">center-on-parent</property>
<property name="default_width">600</property>
<property name="type_hint">normal</property>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkVBox" id="vbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkFrame" id="frame2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yscale">0</property>
<property name="left_padding">12</property>
<child>
<object class="GtkSpinButton" id="magFactorSpinButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="invisible_char">●</property>
<property name="adjustment">magFactor</property>
<property name="digits">2</property>
<accessibility>
<relation type="labelled-by" target="mag_factor_label"/>
</accessibility>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="mag_factor_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="ypad">2</property>
<property name="label" translatable="yes">Magnification:</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.25"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yscale">0</property>
<property name="left_padding">12</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkRadioButton" id="proportional">
<property name="label" translatable="yes">Always</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="push">
<property name="label" translatable="yes">To keep the pointer visible</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">proportional</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="centered">
<property name="label" translatable="yes">To keep the pointer centered</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">proportional</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xpad">1</property>
<property name="label" translatable="yes">Image moves with the mouse pointer:</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.25"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="left_padding">12</property>
<child>
<object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">4</property>
<child>
<object class="GtkRadioButton" id="full-screen">
<property name="label" translatable="yes">Full Screen</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="top-half">
<property name="label" translatable="yes">Top Half</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">full-screen</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="bottom-half">
<property name="label" translatable="yes">Bottom Half</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">full-screen</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="left-half">
<property name="label" translatable="yes">Left Half</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">full-screen</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="right-half">
<property name="label" translatable="yes">Right Half</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">full-screen</property>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Position of magnified view on screen:</property>
<property name="use_markup">True</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.25"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="moveableLensCheckbox">
<property name="label" translatable="yes">Moveable lens - magnified view follows mouse movements</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="scrollAtEdges">
<property name="label" translatable="yes">Image scrolls at screen edges</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">5</property>
</packing>
</child>
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">General</property>
</object>
<packing>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="vbox8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkFrame" id="frame3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="left_padding">12</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkHBox" id="xhairs_enabled_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkSwitch" id="xhairsEnabledSwitch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<accessibility>
<relation target="xhairs-section-heading" type="labelled-by"/>
</accessibility>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="xHairsClipCheckbox">
<property name="label" translatable="yes">Show crosshairs intersection</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">8</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Color and Opacity:</property>
<accessibility>
<relation type="label-for" target="xHairsPicker"/>
</accessibility>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.25"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkColorButton" id="xHairsPicker">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="yalign">0</property>
<property name="use_alpha">True</property>
<property name="color">#ffff00000000</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">8</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Length:</property>
<accessibility>
<relation type="label-for" target="xHairsLengthSlider"/>
</accessibility>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.25"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="xhairs_length_short_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes" comments="short delay">Short</property>
<property name="justify">center</property>
<attributes>
<attribute name="scale" value="0.82999999999999996"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHScale" id="xHairsLengthSlider">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">xhairsLength</property>
<property name="draw_value">False</property>
<property name="value_pos">right</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="xhairs_length_long_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes" comments="long delay">Long</property>
<property name="justify">center</property>
<attributes>
<attribute name="scale" value="0.82999999999999996"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">8</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Thickness:</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.25"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="xhairs_thickness_thin_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes" comments="short delay">Thin</property>
<property name="justify">center</property>
<attributes>
<attribute name="scale" value="0.82999999999999996"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHScale" id="xHairsThicknessSlider">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">xHairsThickness</property>
<property name="draw_value">False</property>
<property name="value_pos">right</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="xhairs_thickness_thick_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes" comments="long delay">Thick</property>
<property name="justify">center</property>
<attributes>
<attribute name="scale" value="0.82999999999999996"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">8</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">8</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="xhairs-section-heading">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Show</property>
<property name="use_markup">True</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.25"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Crosshairs</property>
</object>
<packing>
<property name="position">1</property>
<property name="tab_fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="closeButton">
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<property name="xalign">0.49000000953674316</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">closeButton</action-widget>
</action-widgets>
</object>
<object class="GtkListStore" id="mouseTrackingList">
<columns>
<!-- column-name gchararray1 -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">None</col>
</row>
<row>
<col id="0" translatable="yes">Centered</col>
</row>
<row>
<col id="0" translatable="yes">Push</col>
</row>
<row>
<col id="0" translatable="yes">Proportional</col>
</row>
</data>
</object>
<object class="GtkListStore" id="screenPositionList">
<columns>
<!-- column-name positions -->
<column type="gchararray"/>
<!-- column-name scale -->
<column type="gdouble"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">Full Screen</col>
<col id="1">1.25</col>
</row>
<row>
<col id="0" translatable="yes">Top Half</col>
<col id="1">1.25</col>
</row>
<row>
<col id="0" translatable="yes">Bottom Half</col>
<col id="1">1.25</col>
</row>
<row>
<col id="0" translatable="yes">Left Half</col>
<col id="1">1.25</col>
</row>
<row>
<col id="0" translatable="yes">Right Half</col>
<col id="1">1.25</col>
</row>
</data>
</object>
<object class="GtkAdjustment" id="xHairsThickness">
<property name="lower">1</property>
<property name="upper">100</property>
<property name="value">8</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="xhairsLength">
<property name="lower">20</property>
<property name="upper">4096</property>
<property name="value">4096</property>
<property name="step_increment">1</property>
<property name="page_increment">100</property>
</object>
<object class="GtkAdjustment" id="xhairsOpacity">
<property name="lower">0.10000000000000001</property>
<property name="upper">1</property>
<property name="value">0.66000000000000003</property>
<property name="step_increment">0.01</property>
<property name="page_increment">0.10000000000000001</property>
</object>
</interface>

View file

@ -78,8 +78,10 @@ panels/sound/data/gnome-sound-panel.desktop.in.in
panels/sound/data/sounds/gnome-sounds-default.xml.in.in panels/sound/data/sounds/gnome-sounds-default.xml.in.in
panels/universal-access/cc-ua-panel.c panels/universal-access/cc-ua-panel.c
panels/universal-access/gconf-property-editor.c panels/universal-access/gconf-property-editor.c
panels/universal-access/zoom-options.c
panels/universal-access/gnome-universal-access-panel.desktop.in.in panels/universal-access/gnome-universal-access-panel.desktop.in.in
[type: gettext/glade]panels/universal-access/uap.ui [type: gettext/glade]panels/universal-access/uap.ui
[type: gettext/glade]panels/universal-access/zoom-options.ui
panels/user-accounts/run-passwd.c panels/user-accounts/run-passwd.c
panels/user-accounts/um-account-dialog.c panels/user-accounts/um-account-dialog.c
panels/user-accounts/um-account-type.c panels/user-accounts/um-account-type.c