1769 lines
61 KiB
Diff
1769 lines
61 KiB
Diff
diff --git a/capplets/display/ChangeLog b/capplets/display/ChangeLog
|
|
index d8460ba..633fa45 100644
|
|
--- a/capplets/display/ChangeLog
|
|
+++ b/capplets/display/ChangeLog
|
|
@@ -1,3 +1,98 @@
|
|
+2008-12-18 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ * xrandr-capplet.c (get_output_for_window): Include "off" outputs
|
|
+ in the intersected rectangles. This makes the capplet not select
|
|
+ a new output when changing virtual desktops.
|
|
+
|
|
+2008-12-18 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ https://bugzilla.novell.com/show_bug.cgi?id=433939 - It's not
|
|
+ obvious how to turn on a new monitor.
|
|
+
|
|
+ * display-capplet.glade: Add On/Off radio buttons for the selected
|
|
+ monitor, as it is hard to find that the on/off state is actually
|
|
+ set by the Resolution combo.
|
|
+
|
|
+ * xrandr-capplet.c (rebuild_gui): Don't set sensitivity of
|
|
+ resolution_combo here...
|
|
+ (rebuild_resolution_combo): ... but do it here instead. This is
|
|
+ so that we can match the state of the monitor on/off buttons.
|
|
+ (rebuild_on_off_radios): New function. We set the on/off radio
|
|
+ buttons based on the "on" state of the current output.
|
|
+ (monitor_on_off_toggled_cb): New callback; we toggle the current
|
|
+ output's on/off state.
|
|
+ (rebuild_resolution_combo): Desensitize the resolution combo when
|
|
+ the output is off. Don't add an "Off" item to it, either.
|
|
+
|
|
+2008-12-16 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ https://bugzilla.novell.com/show_bug.cgi?id=450141 - Help button
|
|
+ in the Display capplet does nothing.
|
|
+
|
|
+ * xrandr-capplet.c (run_application): Hide the Help button as we
|
|
+ have no help to show for this capplet yet.
|
|
+ (hide_help_button): New function.
|
|
+
|
|
+2008-12-15 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ * xrandr-capplet.c (on_screen_changed): Use
|
|
+ select_current_output_from_dialog_position() instead of selecting
|
|
+ an output ourselves.
|
|
+
|
|
+2008-12-15 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ * xrandr-capplet.c (select_current_output_from_dialog_position):
|
|
+ New function.
|
|
+ (dialog_map_event_cb): New GtkWidget::map-event handler for the
|
|
+ toplevel dialog. When the dialog gets mapped, we make the current
|
|
+ output be the one which actually contains the dialog window, so
|
|
+ that the user can edit the monitor which he's looking at.
|
|
+
|
|
+2008-12-15 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ * display-capplet.glade: Put the "Monitor" label inside an event
|
|
+ box, so we can change the background color of the event box. Give
|
|
+ names to both widgets: current_monitor_label,
|
|
+ current_monitor_event_box.
|
|
+
|
|
+ * xrandr-capplet.c (rebuild_gui): When a monitor is selected,
|
|
+ update the "Monitor" label to include the monitor's name and color
|
|
+ so the user will know which monitor he is editing.
|
|
+ (rebuild_current_monitor_label): New function.
|
|
+ (struct App): New fields current_monitor_label,
|
|
+ current_monitor_event_box.
|
|
+
|
|
+2008-12-12 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ https://bugzilla.novell.com/show_bug.cgi?id=381030 - Prettify the
|
|
+ Display capplet's dialog
|
|
+
|
|
+ * display-capplet.glade: Use the HIG's recommended colons,
|
|
+ capitalization, and spacing. Use headers to separate the Monitor
|
|
+ options from the Panel icon option. Add instructions on how to
|
|
+ operate the draggable monitors.
|
|
+
|
|
+2008-12-12 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ * xrandr-capplet.c (on_clone_changed): If we turn off "mirror
|
|
+ screens", and if the monitors are still overlapping, lay out the
|
|
+ monitors from left to right so that the user will know that all
|
|
+ the monitors are present. Previously you had to know that you had
|
|
+ to un-overlap them by hand.
|
|
+ (lay_out_outputs_horizontally): New function.
|
|
+
|
|
+2008-12-03 Federico Mena Quintero <federico@novell.com>
|
|
+
|
|
+ * xrandr-capplet.c (rebuild_rotation_combo): Pass a NULL error
|
|
+ argument to gnome_rr_config_applicable; we should really show why
|
|
+ that rotation is not available.
|
|
+ (apply): Use the new DBus interface from the XRANDR plugin in
|
|
+ g-s-d instead of an X client message. Display an error if g-s-d
|
|
+ couldn't apply the monitor configuration.
|
|
+ (gnome_randr_atom): Removed.
|
|
+ (on_detect_displays): Display an error if detecting the displays fails.
|
|
+ (run_application): Display error messages.
|
|
+
|
|
2008-09-06 Jens Granseuer <jensgr@gmx.net>
|
|
|
|
Patch by: Bruce Cowan <bugs@bcowan.fastmail.co.uk>
|
|
diff --git a/capplets/display/Makefile.am b/capplets/display/Makefile.am
|
|
index 193fd65..d8f7d10 100644
|
|
--- a/capplets/display/Makefile.am
|
|
+++ b/capplets/display/Makefile.am
|
|
@@ -15,8 +15,8 @@ gnome_display_properties_SOURCES = \
|
|
|
|
gnome_display_properties_LDFLAGS = -export-dynamic
|
|
gnome_display_properties_LDADD = \
|
|
- $(DISPLAY_CAPPLET_LIBS) \
|
|
- $(top_builddir)/capplets/common/libcommon.la
|
|
+ $(top_builddir)/capplets/common/libcommon.la \
|
|
+ $(DISPLAY_CAPPLET_LIBS)
|
|
|
|
@INTLTOOL_DESKTOP_RULE@
|
|
|
|
diff --git a/capplets/display/display-capplet.glade b/capplets/display/display-capplet.glade
|
|
index 45d6e4e..7500993 100644
|
|
--- a/capplets/display/display-capplet.glade
|
|
+++ b/capplets/display/display-capplet.glade
|
|
@@ -1,265 +1,538 @@
|
|
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
|
|
-<!--*- mode: xml -*-->
|
|
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
|
|
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
|
|
+
|
|
<glade-interface>
|
|
- <widget class="GtkDialog" id="dialog">
|
|
- <property name="border_width">18</property>
|
|
- <property name="title" translatable="yes">Monitor Resolution Settings</property>
|
|
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
|
- <property name="has_separator">False</property>
|
|
- <child internal-child="vbox">
|
|
- <widget class="GtkVBox" id="dialog-vbox1">
|
|
- <property name="visible">True</property>
|
|
- <child>
|
|
- <widget class="GtkAlignment" id="alignment2">
|
|
- <property name="visible">True</property>
|
|
- <property name="bottom_padding">24</property>
|
|
- <child>
|
|
- <widget class="GtkVBox" id="vbox1">
|
|
- <property name="visible">True</property>
|
|
- <property name="spacing">12</property>
|
|
- <child>
|
|
- <widget class="GtkCheckButton" id="clone_checkbox">
|
|
- <property name="visible">True</property>
|
|
- <property name="can_focus">True</property>
|
|
- <property name="label" translatable="yes">Mirror Screens</property>
|
|
- <property name="use_underline">True</property>
|
|
- <property name="response_id">0</property>
|
|
- <property name="draw_indicator">True</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="expand">False</property>
|
|
- <property name="fill">False</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkAlignment" id="align">
|
|
- <property name="visible">True</property>
|
|
- <child>
|
|
- <placeholder/>
|
|
- </child>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="position">1</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkAlignment" id="alignment1">
|
|
- <property name="visible">True</property>
|
|
- <property name="top_padding">12</property>
|
|
- <property name="bottom_padding">12</property>
|
|
- <property name="left_padding">24</property>
|
|
- <property name="right_padding">24</property>
|
|
- <child>
|
|
- <widget class="GtkTable" id="table1">
|
|
- <property name="visible">True</property>
|
|
- <property name="n_rows">2</property>
|
|
- <property name="n_columns">4</property>
|
|
- <property name="column_spacing">12</property>
|
|
- <property name="row_spacing">12</property>
|
|
- <child>
|
|
- <widget class="GtkCheckButton" id="panel_checkbox">
|
|
- <property name="visible">True</property>
|
|
- <property name="can_focus">True</property>
|
|
- <property name="response_id">0</property>
|
|
- <property name="draw_indicator">True</property>
|
|
- <child>
|
|
- <placeholder/>
|
|
- </child>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="left_attach">3</property>
|
|
- <property name="right_attach">4</property>
|
|
- <property name="x_options">GTK_FILL</property>
|
|
- <property name="y_options"></property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkComboBox" id="rotation_combo">
|
|
- <property name="visible">True</property>
|
|
- <property name="items" translatable="yes">Normal
|
|
+
|
|
+<widget class="GtkDialog" id="dialog">
|
|
+ <property name="border_width">5</property>
|
|
+ <property name="title" translatable="yes">Display Settings</property>
|
|
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
|
|
+ <property name="window_position">GTK_WIN_POS_NONE</property>
|
|
+ <property name="modal">False</property>
|
|
+ <property name="resizable">True</property>
|
|
+ <property name="destroy_with_parent">False</property>
|
|
+ <property name="decorated">True</property>
|
|
+ <property name="skip_taskbar_hint">False</property>
|
|
+ <property name="skip_pager_hint">False</property>
|
|
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
|
|
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
|
|
+ <property name="focus_on_map">True</property>
|
|
+ <property name="urgency_hint">False</property>
|
|
+ <property name="has_separator">False</property>
|
|
+
|
|
+ <child internal-child="vbox">
|
|
+ <widget class="GtkVBox" id="dialog-vbox1">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="homogeneous">False</property>
|
|
+ <property name="spacing">2</property>
|
|
+
|
|
+ <child internal-child="action_area">
|
|
+ <widget class="GtkHButtonBox" id="dialog-action_area1">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkButton" id="helpbutton1">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_default">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label">gtk-help</property>
|
|
+ <property name="use_stock">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="response_id">-11</property>
|
|
+ </widget>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkButton" id="button1">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_default">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label">gtk-apply</property>
|
|
+ <property name="use_stock">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="response_id">-10</property>
|
|
+ </widget>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkButton" id="button2">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_default">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label">gtk-close</property>
|
|
+ <property name="use_stock">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="response_id">-7</property>
|
|
+ </widget>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">True</property>
|
|
+ <property name="pack_type">GTK_PACK_END</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkVBox" id="vbox1">
|
|
+ <property name="border_width">5</property>
|
|
+ <property name="visible">True</property>
|
|
+ <property name="homogeneous">False</property>
|
|
+ <property name="spacing">12</property>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkLabel" id="label6">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="label" translatable="yes"><i>Drag the monitors to set their place</i></property>
|
|
+ <property name="use_underline">False</property>
|
|
+ <property name="use_markup">True</property>
|
|
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
|
|
+ <property name="wrap">False</property>
|
|
+ <property name="selectable">False</property>
|
|
+ <property name="xalign">0.5</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xpad">0</property>
|
|
+ <property name="ypad">0</property>
|
|
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
+ <property name="width_chars">-1</property>
|
|
+ <property name="single_line_mode">False</property>
|
|
+ <property name="angle">0</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkAlignment" id="align">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="xalign">0.5</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xscale">1</property>
|
|
+ <property name="yscale">1</property>
|
|
+ <property name="top_padding">0</property>
|
|
+ <property name="bottom_padding">0</property>
|
|
+ <property name="left_padding">0</property>
|
|
+ <property name="right_padding">0</property>
|
|
+
|
|
+ <child>
|
|
+ <placeholder/>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">True</property>
|
|
+ <property name="fill">True</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkHBox" id="hbox1">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="homogeneous">False</property>
|
|
+ <property name="spacing">0</property>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkCheckButton" id="clone_checkbox">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label" translatable="yes">_Mirror screens</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="active">False</property>
|
|
+ <property name="inconsistent">False</property>
|
|
+ <property name="draw_indicator">True</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkButton" id="detect_displays_button">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label" translatable="yes">_Detect Monitors</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ <property name="pack_type">GTK_PACK_END</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkEventBox" id="current_monitor_event_box">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="visible_window">True</property>
|
|
+ <property name="above_child">False</property>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkLabel" id="current_monitor_label">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="label" translatable="yes"><b>Monitor</b></property>
|
|
+ <property name="use_underline">False</property>
|
|
+ <property name="use_markup">True</property>
|
|
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
|
|
+ <property name="wrap">False</property>
|
|
+ <property name="selectable">False</property>
|
|
+ <property name="xalign">0</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xpad">0</property>
|
|
+ <property name="ypad">0</property>
|
|
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
+ <property name="width_chars">-1</property>
|
|
+ <property name="single_line_mode">False</property>
|
|
+ <property name="angle">0</property>
|
|
+ </widget>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkTable" id="table1">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="n_rows">3</property>
|
|
+ <property name="n_columns">5</property>
|
|
+ <property name="homogeneous">False</property>
|
|
+ <property name="row_spacing">6</property>
|
|
+ <property name="column_spacing">12</property>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkCheckButton" id="panel_checkbox">
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label" translatable="yes">Include _panel</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="active">False</property>
|
|
+ <property name="inconsistent">False</property>
|
|
+ <property name="draw_indicator">True</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">3</property>
|
|
+ <property name="right_attach">5</property>
|
|
+ <property name="top_attach">1</property>
|
|
+ <property name="bottom_attach">2</property>
|
|
+ <property name="x_options">shrink|fill</property>
|
|
+ <property name="y_options"></property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkLabel" id="label2">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="label" translatable="yes">_Resolution:</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="use_markup">False</property>
|
|
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
|
|
+ <property name="wrap">False</property>
|
|
+ <property name="selectable">False</property>
|
|
+ <property name="xalign">0</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xpad">0</property>
|
|
+ <property name="ypad">0</property>
|
|
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
+ <property name="width_chars">-1</property>
|
|
+ <property name="single_line_mode">False</property>
|
|
+ <property name="angle">0</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">1</property>
|
|
+ <property name="right_attach">2</property>
|
|
+ <property name="top_attach">1</property>
|
|
+ <property name="bottom_attach">2</property>
|
|
+ <property name="x_options">shrink|fill</property>
|
|
+ <property name="y_options"></property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkLabel" id="label3">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="label" translatable="yes">Re_fresh rate:</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="use_markup">False</property>
|
|
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
|
|
+ <property name="wrap">False</property>
|
|
+ <property name="selectable">False</property>
|
|
+ <property name="xalign">0</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xpad">0</property>
|
|
+ <property name="ypad">0</property>
|
|
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
+ <property name="width_chars">-1</property>
|
|
+ <property name="single_line_mode">False</property>
|
|
+ <property name="angle">0</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">1</property>
|
|
+ <property name="right_attach">2</property>
|
|
+ <property name="top_attach">2</property>
|
|
+ <property name="bottom_attach">3</property>
|
|
+ <property name="x_options">shrink|fill</property>
|
|
+ <property name="y_options"></property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkLabel" id="label5">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="label" translatable="yes">R_otation:</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="use_markup">False</property>
|
|
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
|
|
+ <property name="wrap">False</property>
|
|
+ <property name="selectable">False</property>
|
|
+ <property name="xalign">0</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xpad">0</property>
|
|
+ <property name="ypad">0</property>
|
|
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
+ <property name="width_chars">-1</property>
|
|
+ <property name="single_line_mode">False</property>
|
|
+ <property name="angle">0</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">3</property>
|
|
+ <property name="right_attach">4</property>
|
|
+ <property name="top_attach">2</property>
|
|
+ <property name="bottom_attach">3</property>
|
|
+ <property name="x_options">shrink|fill</property>
|
|
+ <property name="y_options"></property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkComboBox" id="resolution_combo">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="add_tearoffs">False</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">2</property>
|
|
+ <property name="right_attach">3</property>
|
|
+ <property name="top_attach">1</property>
|
|
+ <property name="bottom_attach">2</property>
|
|
+ <property name="x_options">expand|shrink|fill</property>
|
|
+ <property name="y_options"></property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkComboBox" id="refresh_combo">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="add_tearoffs">False</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">2</property>
|
|
+ <property name="right_attach">3</property>
|
|
+ <property name="top_attach">2</property>
|
|
+ <property name="bottom_attach">3</property>
|
|
+ <property name="y_options"></property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkComboBox" id="rotation_combo">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="items" translatable="yes">Normal
|
|
Left
|
|
Right
|
|
Upside-down
|
|
</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="left_attach">3</property>
|
|
- <property name="right_attach">4</property>
|
|
- <property name="top_attach">1</property>
|
|
- <property name="bottom_attach">2</property>
|
|
- <property name="y_options">GTK_FILL</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkLabel" id="label5">
|
|
- <property name="visible">True</property>
|
|
- <property name="xalign">0</property>
|
|
- <property name="label" translatable="yes">R_otation</property>
|
|
- <property name="use_underline">True</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="left_attach">2</property>
|
|
- <property name="right_attach">3</property>
|
|
- <property name="top_attach">1</property>
|
|
- <property name="bottom_attach">2</property>
|
|
- <property name="x_options">GTK_FILL</property>
|
|
- <property name="y_options"></property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkLabel" id="panel_label">
|
|
- <property name="visible">True</property>
|
|
- <property name="xalign">0</property>
|
|
- <property name="label" translatable="yes">Include _Panel</property>
|
|
- <property name="use_underline">True</property>
|
|
- <property name="mnemonic_widget">panel_checkbox</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="left_attach">2</property>
|
|
- <property name="right_attach">3</property>
|
|
- <property name="x_options">GTK_FILL</property>
|
|
- <property name="y_options"></property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkComboBox" id="refresh_combo">
|
|
- <property name="visible">True</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="left_attach">1</property>
|
|
- <property name="right_attach">2</property>
|
|
- <property name="top_attach">1</property>
|
|
- <property name="bottom_attach">2</property>
|
|
- <property name="x_options">GTK_FILL</property>
|
|
- <property name="y_options">GTK_FILL</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkComboBox" id="resolution_combo">
|
|
- <property name="visible">True</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="left_attach">1</property>
|
|
- <property name="right_attach">2</property>
|
|
- <property name="y_options">GTK_FILL</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkLabel" id="label3">
|
|
- <property name="visible">True</property>
|
|
- <property name="xalign">0</property>
|
|
- <property name="label" translatable="yes">Re_fresh Rate:</property>
|
|
- <property name="use_underline">True</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="top_attach">1</property>
|
|
- <property name="bottom_attach">2</property>
|
|
- <property name="x_options">GTK_FILL</property>
|
|
- <property name="y_options"></property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkLabel" id="label2">
|
|
- <property name="visible">True</property>
|
|
- <property name="xalign">0</property>
|
|
- <property name="label" translatable="yes">_Resolution</property>
|
|
- <property name="use_underline">True</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="x_options">GTK_FILL</property>
|
|
- <property name="y_options"></property>
|
|
- </packing>
|
|
- </child>
|
|
- </widget>
|
|
- </child>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="expand">False</property>
|
|
- <property name="position">2</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkButton" id="detect_displays_button">
|
|
- <property name="visible">True</property>
|
|
- <property name="can_focus">True</property>
|
|
- <property name="label" translatable="yes">_Detect Displays</property>
|
|
- <property name="use_underline">True</property>
|
|
- <property name="response_id">0</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="expand">False</property>
|
|
- <property name="fill">False</property>
|
|
- <property name="position">3</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkCheckButton" id="show_notification_icon">
|
|
- <property name="visible">True</property>
|
|
- <property name="can_focus">True</property>
|
|
- <property name="label" translatable="yes">_Show Displays in Panel</property>
|
|
- <property name="use_underline">True</property>
|
|
- <property name="response_id">0</property>
|
|
- <property name="draw_indicator">True</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="position">4</property>
|
|
- </packing>
|
|
- </child>
|
|
- </widget>
|
|
- </child>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="position">1</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child internal-child="action_area">
|
|
- <widget class="GtkHButtonBox" id="dialog-action_area1">
|
|
- <property name="visible">True</property>
|
|
- <property name="layout_style">GTK_BUTTONBOX_END</property>
|
|
- <child>
|
|
- <widget class="GtkButton" id="helpbutton1">
|
|
- <property name="visible">True</property>
|
|
- <property name="can_focus">True</property>
|
|
- <property name="can_default">True</property>
|
|
- <property name="label">gtk-help</property>
|
|
- <property name="use_stock">True</property>
|
|
- <property name="response_id">-11</property>
|
|
- </widget>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkButton" id="button1">
|
|
- <property name="visible">True</property>
|
|
- <property name="can_focus">True</property>
|
|
- <property name="can_default">True</property>
|
|
- <property name="label">gtk-apply</property>
|
|
- <property name="use_stock">True</property>
|
|
- <property name="response_id">-10</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="position">1</property>
|
|
- </packing>
|
|
- </child>
|
|
- <child>
|
|
- <widget class="GtkButton" id="button2">
|
|
- <property name="visible">True</property>
|
|
- <property name="can_focus">True</property>
|
|
- <property name="can_default">True</property>
|
|
- <property name="label">gtk-close</property>
|
|
- <property name="use_stock">True</property>
|
|
- <property name="response_id">-7</property>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="position">2</property>
|
|
- </packing>
|
|
- </child>
|
|
- </widget>
|
|
- <packing>
|
|
- <property name="expand">False</property>
|
|
- <property name="pack_type">GTK_PACK_END</property>
|
|
- </packing>
|
|
- </child>
|
|
- </widget>
|
|
- </child>
|
|
- </widget>
|
|
+ <property name="add_tearoffs">False</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">4</property>
|
|
+ <property name="right_attach">5</property>
|
|
+ <property name="top_attach">2</property>
|
|
+ <property name="bottom_attach">3</property>
|
|
+ <property name="y_options"></property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkAlignment" id="alignment1">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="xalign">0.5</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xscale">1</property>
|
|
+ <property name="yscale">1</property>
|
|
+ <property name="top_padding">0</property>
|
|
+ <property name="bottom_padding">0</property>
|
|
+ <property name="left_padding">12</property>
|
|
+ <property name="right_padding">0</property>
|
|
+
|
|
+ <child>
|
|
+ <placeholder/>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">0</property>
|
|
+ <property name="right_attach">1</property>
|
|
+ <property name="top_attach">0</property>
|
|
+ <property name="bottom_attach">3</property>
|
|
+ <property name="y_options">fill</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkHBox" id="hbox2">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="homogeneous">False</property>
|
|
+ <property name="spacing">12</property>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkRadioButton" id="monitor_on_radio">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label" translatable="yes">On</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="active">False</property>
|
|
+ <property name="inconsistent">False</property>
|
|
+ <property name="draw_indicator">True</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkRadioButton" id="monitor_off_radio">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label" translatable="yes">Off</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="active">False</property>
|
|
+ <property name="inconsistent">False</property>
|
|
+ <property name="draw_indicator">True</property>
|
|
+ <property name="group">monitor_on_radio</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="left_attach">1</property>
|
|
+ <property name="right_attach">5</property>
|
|
+ <property name="top_attach">0</property>
|
|
+ <property name="bottom_attach">1</property>
|
|
+ <property name="x_options">fill</property>
|
|
+ <property name="y_options">fill</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">True</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkLabel" id="label8">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="label" translatable="yes"><b>Panel icon</b></property>
|
|
+ <property name="use_underline">False</property>
|
|
+ <property name="use_markup">True</property>
|
|
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
|
|
+ <property name="wrap">False</property>
|
|
+ <property name="selectable">False</property>
|
|
+ <property name="xalign">0</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xpad">0</property>
|
|
+ <property name="ypad">0</property>
|
|
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
|
|
+ <property name="width_chars">-1</property>
|
|
+ <property name="single_line_mode">False</property>
|
|
+ <property name="angle">0</property>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkAlignment" id="alignment2">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="xalign">0.5</property>
|
|
+ <property name="yalign">0.5</property>
|
|
+ <property name="xscale">1</property>
|
|
+ <property name="yscale">1</property>
|
|
+ <property name="top_padding">0</property>
|
|
+ <property name="bottom_padding">0</property>
|
|
+ <property name="left_padding">12</property>
|
|
+ <property name="right_padding">0</property>
|
|
+
|
|
+ <child>
|
|
+ <widget class="GtkCheckButton" id="show_notification_icon">
|
|
+ <property name="visible">True</property>
|
|
+ <property name="can_focus">True</property>
|
|
+ <property name="label" translatable="yes">_Show displays in panel</property>
|
|
+ <property name="use_underline">True</property>
|
|
+ <property name="relief">GTK_RELIEF_NORMAL</property>
|
|
+ <property name="focus_on_click">True</property>
|
|
+ <property name="active">False</property>
|
|
+ <property name="inconsistent">False</property>
|
|
+ <property name="draw_indicator">True</property>
|
|
+ </widget>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">False</property>
|
|
+ <property name="fill">False</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+ </widget>
|
|
+ <packing>
|
|
+ <property name="padding">0</property>
|
|
+ <property name="expand">True</property>
|
|
+ <property name="fill">True</property>
|
|
+ </packing>
|
|
+ </child>
|
|
+ </widget>
|
|
+ </child>
|
|
+</widget>
|
|
+
|
|
</glade-interface>
|
|
diff --git a/capplets/display/scrollarea.c b/capplets/display/scrollarea.c
|
|
index 3d3d8b6..666b70c 100644
|
|
--- a/capplets/display/scrollarea.c
|
|
+++ b/capplets/display/scrollarea.c
|
|
@@ -816,7 +816,7 @@ foo_scroll_area_size_allocate (GtkWidget *widget,
|
|
-widget->allocation.x, -widget->allocation.y);
|
|
invalid = gdk_region_rectangle (allocation);
|
|
gdk_region_offset (invalid, -allocation->x, -allocation->y);
|
|
- gdk_region_subtract (invalid, old_allocation);
|
|
+ gdk_region_xor (invalid, old_allocation);
|
|
allocation_to_canvas_region (scroll_area, invalid);
|
|
foo_scroll_area_invalidate_region (scroll_area, invalid);
|
|
gdk_region_destroy (old_allocation);
|
|
diff --git a/capplets/display/xrandr-capplet.c b/capplets/display/xrandr-capplet.c
|
|
index ae6b80b..0505d65 100644
|
|
--- a/capplets/display/xrandr-capplet.c
|
|
+++ b/capplets/display/xrandr-capplet.c
|
|
@@ -33,6 +33,8 @@
|
|
#include <X11/Xlib.h>
|
|
#include <glib/gi18n.h>
|
|
#include <gconf/gconf-client.h>
|
|
+#include <dbus/dbus-glib.h>
|
|
+#include <dbus/dbus-glib-bindings.h>
|
|
|
|
typedef struct App App;
|
|
typedef struct GrabInfo GrabInfo;
|
|
@@ -45,12 +47,15 @@ struct App
|
|
GnomeOutputInfo *current_output;
|
|
|
|
GtkWidget *dialog;
|
|
+ GtkWidget *current_monitor_event_box;
|
|
+ GtkWidget *current_monitor_label;
|
|
+ GtkWidget *monitor_on_radio;
|
|
+ GtkWidget *monitor_off_radio;
|
|
GtkListStore *resolution_store;
|
|
GtkWidget *resolution_combo;
|
|
GtkWidget *refresh_combo;
|
|
GtkWidget *rotation_combo;
|
|
GtkWidget *panel_checkbox;
|
|
- GtkWidget *panel_label;
|
|
GtkWidget *clone_checkbox;
|
|
GtkWidget *show_icon_checkbox;
|
|
|
|
@@ -61,26 +66,25 @@ struct App
|
|
|
|
static void rebuild_gui (App *app);
|
|
static void on_rate_changed (GtkComboBox *box, gpointer data);
|
|
+static gboolean output_overlaps (GnomeOutputInfo *output, GnomeRRConfig *config);
|
|
+static void select_current_output_from_dialog_position (App *app);
|
|
+static void monitor_on_off_toggled_cb (GtkToggleButton *toggle, gpointer data);
|
|
|
|
-#if 0
|
|
static void
|
|
-show_error (const GError *err)
|
|
+error_message (App *app, const char *primary_text, const char *secondary_text)
|
|
{
|
|
- if (!err)
|
|
- return;
|
|
+ GtkWidget *dialog;
|
|
|
|
- GtkWidget *dialog = gtk_message_dialog_new (
|
|
- NULL,
|
|
- GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
- GTK_MESSAGE_WARNING,
|
|
- GTK_BUTTONS_OK, err->message);
|
|
-
|
|
- gtk_window_set_title (GTK_WINDOW (dialog), "");
|
|
+ dialog = gtk_message_dialog_new ((app && app->dialog) ? GTK_WINDOW (app->dialog) : NULL,
|
|
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
|
|
+ GTK_MESSAGE_ERROR,
|
|
+ GTK_BUTTONS_CLOSE,
|
|
+ "%s", primary_text);
|
|
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", secondary_text);
|
|
|
|
gtk_dialog_run (GTK_DIALOG (dialog));
|
|
gtk_widget_destroy (dialog);
|
|
}
|
|
-#endif
|
|
|
|
static gboolean
|
|
do_free (gpointer data)
|
|
@@ -113,7 +117,6 @@ on_screen_changed (GnomeRRScreen *scr,
|
|
GnomeRRConfig *current;
|
|
App *app = data;
|
|
int i;
|
|
- GnomeOutputInfo *best;
|
|
|
|
current = gnome_rr_config_new_current (app->screen);
|
|
|
|
@@ -157,25 +160,7 @@ on_screen_changed (GnomeRRScreen *scr,
|
|
}
|
|
#endif
|
|
|
|
- /* Select an output */
|
|
- best = NULL;
|
|
- for (i = 0; app->current_configuration->outputs[i] != NULL; ++i)
|
|
- {
|
|
- GnomeOutputInfo *output = app->current_configuration->outputs[i];
|
|
-
|
|
- if (output->connected)
|
|
- {
|
|
- char *cur_name =
|
|
- app->current_output? app->current_output->name : NULL;
|
|
-
|
|
- if ((cur_name && strcmp (output->name, cur_name) == 0) || !best)
|
|
- best = output;
|
|
- }
|
|
- }
|
|
-
|
|
- app->current_output = best;
|
|
-
|
|
- rebuild_gui (app);
|
|
+ select_current_output_from_dialog_position (app);
|
|
}
|
|
|
|
static void
|
|
@@ -264,16 +249,14 @@ add_key (GtkWidget *widget,
|
|
if (!info.found)
|
|
{
|
|
GtkTreeIter iter;
|
|
- gtk_list_store_append (store, &iter);
|
|
-
|
|
- gtk_list_store_set (store, &iter,
|
|
- 0, text,
|
|
- 1, width,
|
|
- 2, height,
|
|
- 3, rate,
|
|
- 4, width * height,
|
|
- 5, rotation,
|
|
- -1);
|
|
+ gtk_list_store_insert_with_values (store, &iter, -1,
|
|
+ 0, text,
|
|
+ 1, width,
|
|
+ 2, height,
|
|
+ 3, rate,
|
|
+ 4, width * height,
|
|
+ 5, rotation,
|
|
+ -1);
|
|
|
|
retval = TRUE;
|
|
}
|
|
@@ -302,80 +285,6 @@ combo_select (GtkWidget *widget, const char *text)
|
|
return TRUE;
|
|
}
|
|
|
|
-static gboolean
|
|
-has_similar_mode (GnomeRROutput *output, GnomeRRMode *mode)
|
|
-{
|
|
- int i;
|
|
- GnomeRRMode **modes = gnome_rr_output_list_modes (output);
|
|
- int width = gnome_rr_mode_get_width (mode);
|
|
- int height = gnome_rr_mode_get_height (mode);
|
|
-
|
|
- for (i = 0; modes[i] != NULL; ++i)
|
|
- {
|
|
- GnomeRRMode *m = modes[i];
|
|
-
|
|
- if (gnome_rr_mode_get_width (m) == width &&
|
|
- gnome_rr_mode_get_height (m) == height)
|
|
- {
|
|
- return TRUE;
|
|
- }
|
|
- }
|
|
-
|
|
- return FALSE;
|
|
-}
|
|
-
|
|
-static GnomeRRMode **
|
|
-list_clone_modes (GnomeRRConfig *config, GnomeRRScreen *screen)
|
|
-{
|
|
- int i;
|
|
- GPtrArray *result;
|
|
- GnomeRRMode **modes;
|
|
-
|
|
- for (i = 0; config->outputs[i] != NULL; ++i)
|
|
- {
|
|
- if (config->outputs[i]->connected)
|
|
- {
|
|
- GnomeRROutput *output =
|
|
- gnome_rr_screen_get_output_by_name (screen, config->outputs[i]->name);
|
|
-
|
|
- modes = gnome_rr_output_list_modes (output);
|
|
- }
|
|
- }
|
|
-
|
|
- if (!modes)
|
|
- return NULL;
|
|
-
|
|
- result = g_ptr_array_new ();
|
|
-
|
|
- for (i = 0; modes[i] != NULL; ++i)
|
|
- {
|
|
- gboolean valid = TRUE;
|
|
- int j;
|
|
-
|
|
- for (j = 0; config->outputs[j] != NULL; ++j)
|
|
- {
|
|
- if (config->outputs[j]->connected)
|
|
- {
|
|
- GnomeRROutput *output = gnome_rr_screen_get_output_by_name (
|
|
- screen, config->outputs[j]->name);
|
|
-
|
|
- if (!has_similar_mode (output, modes[i]))
|
|
- {
|
|
- valid = FALSE;
|
|
- break;
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- if (valid)
|
|
- g_ptr_array_add (result, modes[i]);
|
|
- }
|
|
-
|
|
- g_ptr_array_add (result, NULL);
|
|
-
|
|
- return (GnomeRRMode **)g_ptr_array_free (result, FALSE);
|
|
-}
|
|
-
|
|
static GnomeRRMode **
|
|
get_current_modes (App *app)
|
|
{
|
|
@@ -383,7 +292,7 @@ get_current_modes (App *app)
|
|
|
|
if (app->current_configuration->clone)
|
|
{
|
|
- return list_clone_modes (app->current_configuration, app->screen);
|
|
+ return gnome_rr_screen_list_clone_modes (app->screen);
|
|
}
|
|
else
|
|
{
|
|
@@ -435,7 +344,8 @@ rebuild_rotation_combo (App *app)
|
|
|
|
app->current_output->rotation = info->rotation;
|
|
|
|
- if (gnome_rr_config_applicable (app->current_configuration, app->screen))
|
|
+ /* NULL-GError --- FIXME: we should say why this rotation is not available! */
|
|
+ if (gnome_rr_config_applicable (app->current_configuration, app->screen, NULL))
|
|
{
|
|
add_key (app->rotation_combo, info->name, 0, 0, 0, info->rotation);
|
|
|
|
@@ -450,8 +360,6 @@ rebuild_rotation_combo (App *app)
|
|
combo_select (app->rotation_combo, N_("Normal"));
|
|
}
|
|
|
|
-#define idle_free_printf(x) idle_free (g_strdup_printf (x))
|
|
-
|
|
static void
|
|
rebuild_rate_combo (App *app)
|
|
{
|
|
@@ -512,6 +420,7 @@ count_active_outputs (App *app)
|
|
return count;
|
|
}
|
|
|
|
+#if 0
|
|
static int
|
|
count_all_outputs (GnomeRRConfig *config)
|
|
{
|
|
@@ -522,6 +431,77 @@ count_all_outputs (GnomeRRConfig *config)
|
|
|
|
return i;
|
|
}
|
|
+#endif
|
|
+
|
|
+static void
|
|
+rebuild_current_monitor_label (App *app)
|
|
+{
|
|
+ char *str;
|
|
+ gboolean free_str;
|
|
+ GdkColor color;
|
|
+ gboolean use_color;
|
|
+
|
|
+ if (app->current_output)
|
|
+ {
|
|
+ str = g_strdup_printf (_("<b>Monitor: %s</b>"), app->current_output->display_name);
|
|
+ free_str = TRUE;
|
|
+ gnome_rr_labeler_get_color_for_output (app->labeler, app->current_output, &color);
|
|
+ use_color = TRUE;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ str = _("<b>Monitor</b>");
|
|
+ free_str = FALSE;
|
|
+ use_color = FALSE;
|
|
+ }
|
|
+
|
|
+ gtk_label_set_markup (GTK_LABEL (app->current_monitor_label), str);
|
|
+
|
|
+ if (free_str)
|
|
+ g_free (str);
|
|
+
|
|
+ if (use_color)
|
|
+ gtk_widget_modify_bg (app->current_monitor_event_box, app->current_monitor_event_box->state, &color);
|
|
+
|
|
+ gtk_event_box_set_visible_window (GTK_EVENT_BOX (app->current_monitor_event_box), use_color);
|
|
+}
|
|
+
|
|
+static void
|
|
+rebuild_on_off_radios (App *app)
|
|
+{
|
|
+ gboolean sensitive;
|
|
+ gboolean on_active;
|
|
+ gboolean off_active;
|
|
+
|
|
+ g_signal_handlers_block_by_func (app->monitor_on_radio, G_CALLBACK (monitor_on_off_toggled_cb), app);
|
|
+ g_signal_handlers_block_by_func (app->monitor_off_radio, G_CALLBACK (monitor_on_off_toggled_cb), app);
|
|
+
|
|
+ if (app->current_output)
|
|
+ {
|
|
+ if (count_active_outputs (app) > 1 || !app->current_output->on)
|
|
+ sensitive = TRUE;
|
|
+ else
|
|
+ sensitive = FALSE;
|
|
+
|
|
+ on_active = app->current_output->on;
|
|
+ off_active = !on_active;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ sensitive = FALSE;
|
|
+ on_active = FALSE;
|
|
+ off_active = FALSE;
|
|
+ }
|
|
+
|
|
+ gtk_widget_set_sensitive (app->monitor_on_radio, sensitive);
|
|
+ gtk_widget_set_sensitive (app->monitor_off_radio, sensitive);
|
|
+
|
|
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (app->monitor_on_radio), on_active);
|
|
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (app->monitor_off_radio), off_active);
|
|
+
|
|
+ g_signal_handlers_unblock_by_func (app->monitor_on_radio, G_CALLBACK (monitor_on_off_toggled_cb), app);
|
|
+ g_signal_handlers_unblock_by_func (app->monitor_off_radio, G_CALLBACK (monitor_on_off_toggled_cb), app);
|
|
+}
|
|
|
|
static void
|
|
rebuild_resolution_combo (App *app)
|
|
@@ -533,8 +513,16 @@ rebuild_resolution_combo (App *app)
|
|
|
|
clear_combo (app->resolution_combo);
|
|
|
|
- if (!(modes = get_current_modes (app)))
|
|
+ if (!(modes = get_current_modes (app))
|
|
+ || !app->current_output->on)
|
|
+ {
|
|
+ gtk_widget_set_sensitive (app->resolution_combo, FALSE);
|
|
return;
|
|
+ }
|
|
+
|
|
+ g_assert (app->current_output != NULL);
|
|
+
|
|
+ gtk_widget_set_sensitive (app->resolution_combo, TRUE);
|
|
|
|
best_w = 0;
|
|
best_h = 0;
|
|
@@ -556,20 +544,9 @@ rebuild_resolution_combo (App *app)
|
|
}
|
|
}
|
|
|
|
- if (count_active_outputs (app) > 1 || !app->current_output->on)
|
|
- add_key (app->resolution_combo, _("Off"), 0, 0, 0, 0);
|
|
-
|
|
- if (!app->current_output->on)
|
|
- {
|
|
- current = "Off";
|
|
- }
|
|
- else
|
|
- {
|
|
- current = idle_free (g_strdup_printf (_("%d x %d"),
|
|
- app->current_output->width,
|
|
- app->current_output->height));
|
|
- }
|
|
-
|
|
+ current = idle_free (g_strdup_printf (_("%d x %d"),
|
|
+ app->current_output->width,
|
|
+ app->current_output->height));
|
|
|
|
if (!combo_select (app->resolution_combo, current))
|
|
{
|
|
@@ -597,12 +574,12 @@ rebuild_gui (App *app)
|
|
g_debug ("rebuild gui, is on: %d", app->current_output->on);
|
|
#endif
|
|
|
|
+ rebuild_current_monitor_label (app);
|
|
+ rebuild_on_off_radios (app);
|
|
rebuild_resolution_combo (app);
|
|
rebuild_rate_combo (app);
|
|
rebuild_rotation_combo (app);
|
|
|
|
- gtk_widget_set_sensitive (app->resolution_combo, sensitive);
|
|
-
|
|
#if 0
|
|
g_debug ("sensitive: %d, on: %d", sensitive, app->current_output->on);
|
|
#endif
|
|
@@ -682,6 +659,34 @@ on_rate_changed (GtkComboBox *box, gpointer data)
|
|
}
|
|
|
|
static void
|
|
+monitor_on_off_toggled_cb (GtkToggleButton *toggle, gpointer data)
|
|
+{
|
|
+ App *app = data;
|
|
+ gboolean is_on;
|
|
+
|
|
+ if (!app->current_output)
|
|
+ return;
|
|
+
|
|
+ if (!gtk_toggle_button_get_active (toggle))
|
|
+ return;
|
|
+
|
|
+ if (GTK_WIDGET (toggle) == app->monitor_on_radio)
|
|
+ is_on = TRUE;
|
|
+ else if (GTK_WIDGET (toggle) == app->monitor_off_radio)
|
|
+ is_on = FALSE;
|
|
+ else
|
|
+ {
|
|
+ g_assert_not_reached ();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ app->current_output->on = is_on;
|
|
+
|
|
+ rebuild_gui (app);
|
|
+ foo_scroll_area_invalidate (FOO_SCROLL_AREA (app->area));
|
|
+}
|
|
+
|
|
+static void
|
|
on_resolution_changed (GtkComboBox *box, gpointer data)
|
|
{
|
|
App *app = data;
|
|
@@ -727,6 +732,47 @@ on_resolution_changed (GtkComboBox *box, gpointer data)
|
|
}
|
|
|
|
static void
|
|
+lay_out_outputs_horizontally (App *app)
|
|
+{
|
|
+ int i;
|
|
+ int x;
|
|
+
|
|
+ /* Lay out all the monitors horizontally when "mirror screens" is turned
|
|
+ * off, to avoid having all of them overlapped initially. We put the
|
|
+ * outputs turned off on the right-hand side.
|
|
+ */
|
|
+
|
|
+ x = 0;
|
|
+
|
|
+ /* First pass, all "on" outputs */
|
|
+
|
|
+ for (i = 0; app->current_configuration->outputs[i]; ++i)
|
|
+ {
|
|
+ GnomeOutputInfo *output;
|
|
+
|
|
+ output = app->current_configuration->outputs[i];
|
|
+ if (output->connected && output->on)
|
|
+ output->x = x;
|
|
+
|
|
+ x += output->width;
|
|
+ }
|
|
+
|
|
+ /* Second pass, all the black screens */
|
|
+
|
|
+ for (i = 0; app->current_configuration->outputs[i]; ++i)
|
|
+ {
|
|
+ GnomeOutputInfo *output;
|
|
+
|
|
+ output = app->current_configuration->outputs[i];
|
|
+ if (!(output->connected && output->on))
|
|
+ output->x = x;
|
|
+
|
|
+ x += output->width;
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+static void
|
|
on_clone_changed (GtkWidget *box, gpointer data)
|
|
{
|
|
App *app = data;
|
|
@@ -747,6 +793,11 @@ on_clone_changed (GtkWidget *box, gpointer data)
|
|
}
|
|
}
|
|
}
|
|
+ else
|
|
+ {
|
|
+ if (output_overlaps (app->current_output, app->current_configuration))
|
|
+ lay_out_outputs_horizontally (app);
|
|
+ }
|
|
|
|
rebuild_gui (app);
|
|
}
|
|
@@ -1411,7 +1462,7 @@ paint_output (App *app, cairo_t *cr, int i)
|
|
}
|
|
else if (output->rotation & GNOME_RR_ROTATION_90)
|
|
{
|
|
- angle = G_PI / 2;
|
|
+ angle = 1.5 * G_PI;
|
|
}
|
|
else if (output->rotation & GNOME_RR_ROTATION_180)
|
|
{
|
|
@@ -1419,7 +1470,7 @@ paint_output (App *app, cairo_t *cr, int i)
|
|
}
|
|
else if (output->rotation & GNOME_RR_ROTATION_270)
|
|
{
|
|
- angle = 1.5 * G_PI;
|
|
+ angle = G_PI / 2;
|
|
}
|
|
else
|
|
{
|
|
@@ -1565,20 +1616,6 @@ make_text_combo (GtkWidget *widget, int sort_column)
|
|
}
|
|
}
|
|
|
|
-static Atom
|
|
-gnome_randr_atom (void)
|
|
-{
|
|
- static Atom atom = None;
|
|
-
|
|
- if (!atom)
|
|
- {
|
|
- atom = XInternAtom (gdk_x11_get_default_xdisplay(),
|
|
- "_GNOME_RANDR_ATOM", FALSE);
|
|
- }
|
|
-
|
|
- return atom;
|
|
-}
|
|
-
|
|
static void
|
|
compute_virtual_size_for_configuration (GnomeRRConfig *config, int *ret_width, int *ret_height)
|
|
{
|
|
@@ -1636,7 +1673,9 @@ check_required_virtual_size (App *app)
|
|
static void
|
|
apply (App *app)
|
|
{
|
|
- GError *err = NULL;
|
|
+ GError *error = NULL;
|
|
+ DBusGConnection *connection;
|
|
+ DBusGProxy *proxy;
|
|
|
|
gnome_rr_config_sanitize (app->current_configuration);
|
|
|
|
@@ -1644,25 +1683,40 @@ apply (App *app)
|
|
|
|
foo_scroll_area_invalidate (FOO_SCROLL_AREA (app->area));
|
|
|
|
- if (gnome_rr_config_save (app->current_configuration, &err))
|
|
+ if (!gnome_rr_config_save (app->current_configuration, &error))
|
|
{
|
|
- XEvent message;
|
|
+ error_message (app, _("Could not save the monitor configuration"), error->message);
|
|
+ g_error_free (error);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
|
|
+ if (connection == NULL) {
|
|
+ error_message (app, _("Could not get session bus while applying display configuration"), error->message);
|
|
+ g_error_free (error);
|
|
+ return;
|
|
+ }
|
|
|
|
- message.xclient.type = ClientMessage;
|
|
- message.xclient.message_type = gnome_randr_atom();
|
|
- message.xclient.format = 8;
|
|
+ proxy = dbus_g_proxy_new_for_name (connection,
|
|
+ "org.gnome.SettingsDaemon",
|
|
+ "/org/gnome/SettingsDaemon/XRANDR",
|
|
+ "org.gnome.SettingsDaemon.XRANDR");
|
|
+ if (!proxy) {
|
|
+ error_message (app, _("Could not get org.gnome.SettingsDaemon.XRANDR"), NULL);
|
|
+ return;
|
|
|
|
-#if 0
|
|
- g_debug ("Sending client message");
|
|
-#endif
|
|
+ }
|
|
|
|
- XSendEvent (gdk_x11_get_default_xdisplay(),
|
|
- gdk_x11_get_default_root_xwindow(),
|
|
- FALSE,
|
|
- StructureNotifyMask, &message);
|
|
+ if (!dbus_g_proxy_call (proxy, "ApplyConfiguration", &error, G_TYPE_INVALID, G_TYPE_INVALID)) {
|
|
+ error_message (app, _("Could not apply the selected configuration"), error->message);
|
|
+ g_error_free (error);
|
|
}
|
|
+
|
|
+ g_object_unref (proxy);
|
|
+ dbus_g_connection_unref (connection);
|
|
}
|
|
|
|
+#if 0
|
|
/* Returns whether the graphics driver doesn't advertise RANDR 1.2 features, and just 1.0 */
|
|
static gboolean
|
|
driver_is_randr_10 (GnomeRRConfig *config)
|
|
@@ -1683,13 +1737,21 @@ driver_is_randr_10 (GnomeRRConfig *config)
|
|
|
|
return (count_all_outputs (config) == 1 && strcmp (config->outputs[0]->name, "default") == 0);
|
|
}
|
|
+#endif
|
|
|
|
static void
|
|
on_detect_displays (GtkWidget *widget, gpointer data)
|
|
{
|
|
App *app = data;
|
|
+ GError *error;
|
|
|
|
- gnome_rr_screen_refresh (app->screen);
|
|
+ error = NULL;
|
|
+ if (!gnome_rr_screen_refresh (app->screen, &error)) {
|
|
+ if (error) {
|
|
+ error_message (app, _("Could not detect displays"), error->message);
|
|
+ g_error_free (error);
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
#define SHOW_ICON_KEY "/apps/gnome_settings_daemon/xrandr/show_notification_icon"
|
|
@@ -1705,6 +1767,162 @@ on_show_icon_toggled (GtkWidget *widget, gpointer data)
|
|
gtk_toggle_button_get_active (tb), NULL);
|
|
}
|
|
|
|
+static GnomeOutputInfo *
|
|
+get_nearest_output (GnomeRRConfig *configuration, int x, int y)
|
|
+{
|
|
+ int i;
|
|
+ int nearest_index;
|
|
+ int nearest_dist;
|
|
+
|
|
+ nearest_index = -1;
|
|
+ nearest_dist = G_MAXINT;
|
|
+
|
|
+ for (i = 0; configuration->outputs[i] != NULL; i++)
|
|
+ {
|
|
+ GnomeOutputInfo *output;
|
|
+ int dist_x, dist_y;
|
|
+
|
|
+ output = configuration->outputs[i];
|
|
+
|
|
+ if (!(output->connected && output->on))
|
|
+ continue;
|
|
+
|
|
+ if (x < output->x)
|
|
+ dist_x = output->x - x;
|
|
+ else if (x >= output->x + output->width)
|
|
+ dist_x = x - (output->x + output->width) + 1;
|
|
+ else
|
|
+ dist_x = 0;
|
|
+
|
|
+ if (y < output->y)
|
|
+ dist_y = output->y - y;
|
|
+ else if (y >= output->y + output->height)
|
|
+ dist_y = y - (output->y + output->height) + 1;
|
|
+ else
|
|
+ dist_y = 0;
|
|
+
|
|
+ if (MIN (dist_x, dist_y) < nearest_dist)
|
|
+ {
|
|
+ nearest_dist = MIN (dist_x, dist_y);
|
|
+ nearest_index = i;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (nearest_index != -1)
|
|
+ return configuration->outputs[nearest_index];
|
|
+ else
|
|
+ return NULL;
|
|
+
|
|
+}
|
|
+
|
|
+/* Gets the output that contains the largest intersection with the window.
|
|
+ * Logic stolen from gdk_screen_get_monitor_at_window().
|
|
+ */
|
|
+static GnomeOutputInfo *
|
|
+get_output_for_window (GnomeRRConfig *configuration, GdkWindow *window)
|
|
+{
|
|
+ GdkRectangle win_rect;
|
|
+ int i;
|
|
+ int largest_area;
|
|
+ int largest_index;
|
|
+
|
|
+ gdk_window_get_geometry (window, &win_rect.x, &win_rect.y, &win_rect.width, &win_rect.height, NULL);
|
|
+ gdk_window_get_origin (window, &win_rect.x, &win_rect.y);
|
|
+
|
|
+ largest_area = 0;
|
|
+ largest_index = -1;
|
|
+
|
|
+ for (i = 0; configuration->outputs[i] != NULL; i++)
|
|
+ {
|
|
+ GnomeOutputInfo *output;
|
|
+ GdkRectangle output_rect, intersection;
|
|
+
|
|
+ output = configuration->outputs[i];
|
|
+
|
|
+ output_rect.x = output->x;
|
|
+ output_rect.y = output->y;
|
|
+ output_rect.width = output->width;
|
|
+ output_rect.height = output->height;
|
|
+
|
|
+ if (output->connected && gdk_rectangle_intersect (&win_rect, &output_rect, &intersection))
|
|
+ {
|
|
+ int area;
|
|
+
|
|
+ area = intersection.width * intersection.height;
|
|
+ if (area > largest_area)
|
|
+ {
|
|
+ largest_area = area;
|
|
+ largest_index = i;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (largest_index != -1)
|
|
+ return configuration->outputs[largest_index];
|
|
+ else
|
|
+ return get_nearest_output (configuration,
|
|
+ win_rect.x + win_rect.width / 2,
|
|
+ win_rect.y + win_rect.height / 2);
|
|
+}
|
|
+
|
|
+/* We select the current output, i.e. select the one being edited, based on
|
|
+ * which output is showing the configuration dialog.
|
|
+ */
|
|
+static void
|
|
+select_current_output_from_dialog_position (App *app)
|
|
+{
|
|
+ if (GTK_WIDGET_REALIZED (app->dialog))
|
|
+ {
|
|
+ GnomeOutputInfo *output;
|
|
+
|
|
+ output = get_output_for_window (app->current_configuration, app->dialog->window);
|
|
+
|
|
+ if (output)
|
|
+ app->current_output = output;
|
|
+ }
|
|
+
|
|
+ rebuild_gui (app);
|
|
+}
|
|
+
|
|
+/* This is a GtkWidget::map-event handler. We wait for the display-properties
|
|
+ * dialog to be mapped, and then we select the output which corresponds to the
|
|
+ * monitor on which the dialog is being shown.
|
|
+ */
|
|
+static gboolean
|
|
+dialog_map_event_cb (GtkWidget *widget, GdkEventAny *event, gpointer data)
|
|
+{
|
|
+ App *app = data;
|
|
+
|
|
+ select_current_output_from_dialog_position (app);
|
|
+ return FALSE;
|
|
+}
|
|
+
|
|
+static void
|
|
+hide_help_button (App *app)
|
|
+{
|
|
+ GtkWidget *action_area;
|
|
+ GList *children;
|
|
+ GList *l;
|
|
+
|
|
+ action_area = gtk_dialog_get_action_area (GTK_DIALOG (app->dialog));
|
|
+ children = gtk_container_get_children (GTK_CONTAINER (action_area));
|
|
+
|
|
+ for (l = children; l; l = l->next)
|
|
+ {
|
|
+ GtkWidget *child;
|
|
+ int response;
|
|
+
|
|
+ child = GTK_WIDGET (l->data);
|
|
+
|
|
+ response = gtk_dialog_get_response_for_widget (GTK_DIALOG (app->dialog), child);
|
|
+ if (response == GTK_RESPONSE_HELP)
|
|
+ {
|
|
+ gtk_widget_hide (child);
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
static void
|
|
run_application (App *app)
|
|
{
|
|
@@ -1714,6 +1932,7 @@ run_application (App *app)
|
|
#define GLADE_FILE GLADEDIR "/display-capplet.glade"
|
|
GladeXML *xml;
|
|
GtkWidget *align;
|
|
+ GError *error;
|
|
|
|
xml = glade_xml_new (GLADE_FILE, NULL, NULL);
|
|
if (!xml)
|
|
@@ -1722,11 +1941,13 @@ run_application (App *app)
|
|
return;
|
|
}
|
|
|
|
+ error = NULL;
|
|
app->screen = gnome_rr_screen_new (gdk_screen_get_default (),
|
|
- on_screen_changed, app);
|
|
+ on_screen_changed, app, &error);
|
|
if (!app->screen)
|
|
{
|
|
- g_error ("Could not get screen info");
|
|
+ error_message (NULL, _("Could not get screen information"), error->message);
|
|
+ g_error_free (error);
|
|
g_object_unref (xml);
|
|
return;
|
|
}
|
|
@@ -1734,11 +1955,23 @@ run_application (App *app)
|
|
app->client = gconf_client_get_default ();
|
|
|
|
app->dialog = glade_xml_get_widget (xml, "dialog");
|
|
+ g_signal_connect_after (app->dialog, "map-event",
|
|
+ G_CALLBACK (dialog_map_event_cb), app);
|
|
|
|
gtk_window_set_default_icon_name ("gnome-display-properties");
|
|
gtk_window_set_icon_name (GTK_WINDOW (app->dialog),
|
|
"gnome-display-properties");
|
|
|
|
+ app->current_monitor_event_box = glade_xml_get_widget (xml, "current_monitor_event_box");
|
|
+ app->current_monitor_label = glade_xml_get_widget (xml, "current_monitor_label");
|
|
+
|
|
+ app->monitor_on_radio = glade_xml_get_widget (xml, "monitor_on_radio");
|
|
+ app->monitor_off_radio = glade_xml_get_widget (xml, "monitor_off_radio");
|
|
+ g_signal_connect (app->monitor_on_radio, "toggled",
|
|
+ G_CALLBACK (monitor_on_off_toggled_cb), app);
|
|
+ g_signal_connect (app->monitor_off_radio, "toggled",
|
|
+ G_CALLBACK (monitor_on_off_toggled_cb), app);
|
|
+
|
|
app->resolution_combo = glade_xml_get_widget (xml, "resolution_combo");
|
|
g_signal_connect (app->resolution_combo, "changed",
|
|
G_CALLBACK (on_resolution_changed), app);
|
|
@@ -1766,7 +1999,6 @@ run_application (App *app)
|
|
g_signal_connect (app->show_icon_checkbox, "toggled", G_CALLBACK (on_show_icon_toggled), app);
|
|
|
|
app->panel_checkbox = glade_xml_get_widget (xml, "panel_checkbox");
|
|
- app->panel_label = glade_xml_get_widget (xml, "panel_label");
|
|
|
|
make_text_combo (app->resolution_combo, 4);
|
|
make_text_combo (app->refresh_combo, 3);
|
|
@@ -1791,11 +2023,11 @@ run_application (App *app)
|
|
|
|
gtk_container_add (GTK_CONTAINER (align), app->area);
|
|
|
|
+ /* Until we have help to show, we'll just hide the Help button */
|
|
+ hide_help_button (app);
|
|
+
|
|
on_screen_changed (app->screen, app);
|
|
- rebuild_gui (app);
|
|
|
|
- gtk_widget_hide (app->panel_checkbox);
|
|
- gtk_widget_hide (app->panel_label);
|
|
g_object_unref (xml);
|
|
|
|
restart:
|