[virt-tools-list] [virt-viewer v2] window: Replace autoDrawer with native Gtk widgets

Eduardo Lima (Etrunko) etrunko at redhat.com
Wed Jun 22 19:51:29 UTC 2016


Acked-by: Eduardo Lima (Etrunko) <etrunko at redhat.com>

On 06/21/2016 08:19 PM, Fabiano Fidêncio wrote:
> GtkRevealer was intrudced in Gtk+ 3.10 and, combined with Gtk Overlay
> (intoduced in Gtk+ 3.2), can provide a more sustainably implementation
> of the AutoDrawer functionality.
> 
> This approach is completely based on the approach taken by virt-manager:
> https://github.com/virt-manager/virt-manager/commit/dc05600324f6b9a82b68581fc0a9c145f9889ce9
> 
> Resolves: https://bugs.freedesktop.org/show_bug.cgi?id=94495
> 
> Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
> ---
> Changes since v1:
>  - Initialize priv in the same line it's declared
>  - Remove unneeded G_GNUC_UNUSED macros
>  - Move the early return in _enter_leave_notify() to be the first thing in
>    the function
>    - Here is a link for the simple diff including the first 3 changes:
>      https://fidencio.fedorapeople.org/timed_revealer_v1.diff
>  - Moved virt-viewer-timed-revealer.[ch] from $(srcdir)/view to $(srcdir)
> ---
> 
>  src/Makefile.am                  |   8 +-
>  src/resources/ui/virt-viewer.ui  | 401 ++++++++--------
>  src/view/autoDrawer.c            | 991 ---------------------------------------
>  src/view/autoDrawer.h            |  91 ----
>  src/view/drawer.c                | 366 ---------------
>  src/view/drawer.h                |  83 ----
>  src/view/ovBox.c                 | 946 -------------------------------------
>  src/view/ovBox.h                 | 103 ----
>  src/virt-viewer-timed-revealer.c | 213 +++++++++
>  src/virt-viewer-timed-revealer.h |  74 +++
>  src/virt-viewer-window.c         |  36 +-
>  11 files changed, 510 insertions(+), 2802 deletions(-)
>  delete mode 100644 src/view/autoDrawer.c
>  delete mode 100644 src/view/autoDrawer.h
>  delete mode 100644 src/view/drawer.c
>  delete mode 100644 src/view/drawer.h
>  delete mode 100644 src/view/ovBox.c
>  delete mode 100644 src/view/ovBox.h
>  create mode 100644 src/virt-viewer-timed-revealer.c
>  create mode 100644 src/virt-viewer-timed-revealer.h
> 
> diff --git a/src/Makefile.am b/src/Makefile.am
> index bbabc61..0c48e40 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -68,12 +68,8 @@ libvirt_viewer_la_SOURCES =					\
>  	virt-viewer-window.c				\
>  	virt-viewer-vm-connection.h			\
>  	virt-viewer-vm-connection.c			\
> -	view/autoDrawer.c				\
> -	view/autoDrawer.h				\
> -	view/drawer.c					\
> -	view/drawer.h					\
> -	view/ovBox.c					\
> -	view/ovBox.h					\
> +	virt-viewer-timed-revealer.c \
> +	virt-viewer-timed-revealer.h \
>  	$(NULL)
>  
>  if HAVE_GTK_VNC
> diff --git a/src/resources/ui/virt-viewer.ui b/src/resources/ui/virt-viewer.ui
> index 830a451..5f767d1 100644
> --- a/src/resources/ui/virt-viewer.ui
> +++ b/src/resources/ui/virt-viewer.ui
> @@ -8,246 +8,255 @@
>      <property name="default_height">768</property>
>      <signal name="delete-event" handler="virt_viewer_window_delete" swapped="no"/>
>      <child>
> -      <object class="GtkVBox" id="viewer-box">
> +      <object class="GtkOverlay" id="viewer-overlay">
>          <property name="visible">True</property>
>          <property name="can_focus">False</property>
>          <child>
> -          <object class="GtkMenuBar" id="top-menu">
> +          <object class="GtkVBox" id="viewer-box">
>              <property name="visible">True</property>
>              <property name="can_focus">False</property>
>              <child>
> -              <object class="GtkMenuItem" id="menu-file">
> +              <object class="GtkMenuBar" id="top-menu">
>                  <property name="visible">True</property>
>                  <property name="can_focus">False</property>
> -                <property name="use_action_appearance">False</property>
> -                <property name="label" translatable="yes">_File</property>
> -                <property name="use_underline">True</property>
> -                <child type="submenu">
> -                  <object class="GtkMenu" id="menu1">
> +                <child>
> +                  <object class="GtkMenuItem" id="menu-file">
>                      <property name="visible">True</property>
>                      <property name="can_focus">False</property>
> -                    <property name="accel_group">accelgroup</property>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-file-screenshot">
> +                    <property name="use_action_appearance">False</property>
> +                    <property name="label" translatable="yes">_File</property>
> +                    <property name="use_underline">True</property>
> +                    <child type="submenu">
> +                      <object class="GtkMenu" id="menu1">
>                          <property name="visible">True</property>
>                          <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="label" translatable="yes">_Screenshot</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_file_screenshot" swapped="no"/>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-file-usb-device-selection">
> -                        <property name="visible">True</property>
> -                        <property name="sensitive">False</property>
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="label" translatable="yes">_USB device selection</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_file_usb_device_selection" swapped="no"/>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-file-smartcard-insert">
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="accel_path"><virt-viewer>/file/smartcard-insert</property>
> -                        <property name="label" translatable="yes">Smartcard insertion</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_file_smartcard_insert" swapped="no"/>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-file-smartcard-remove">
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="accel_path"><virt-viewer>/file/smartcard-remove</property>
> -                        <property name="label" translatable="yes">Smartcard removal</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_file_smartcard_remove" swapped="no"/>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-preferences">
> -                        <property name="visible">True</property>
> -                        <property name="can_focus">False</property>
> -                        <property name="label" translatable="yes">_Preferences</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_preferences_cb" swapped="no"/>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
> -                        <property name="visible">True</property>
> -                        <property name="can_focus">False</property>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="imagemenuitem5">
> -                        <property name="label" translatable="yes">_Quit</property>
> -                        <property name="visible">True</property>
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="use_underline">True</property>
> -                        <accelerator key="q" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
> -                        <signal name="activate" handler="virt_viewer_window_menu_file_quit" swapped="no"/>
> +                        <property name="accel_group">accelgroup</property>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-file-screenshot">
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="label" translatable="yes">_Screenshot</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_file_screenshot" swapped="no"/>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-file-usb-device-selection">
> +                            <property name="visible">True</property>
> +                            <property name="sensitive">False</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="label" translatable="yes">_USB device selection</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_file_usb_device_selection" swapped="no"/>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-file-smartcard-insert">
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="accel_path"><virt-viewer>/file/smartcard-insert</property>
> +                            <property name="label" translatable="yes">Smartcard insertion</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_file_smartcard_insert" swapped="no"/>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-file-smartcard-remove">
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="accel_path"><virt-viewer>/file/smartcard-remove</property>
> +                            <property name="label" translatable="yes">Smartcard removal</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_file_smartcard_remove" swapped="no"/>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-preferences">
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="label" translatable="yes">_Preferences</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_preferences_cb" swapped="no"/>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="imagemenuitem5">
> +                            <property name="label" translatable="yes">_Quit</property>
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="use_underline">True</property>
> +                            <accelerator key="q" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
> +                            <signal name="activate" handler="virt_viewer_window_menu_file_quit" swapped="no"/>
> +                          </object>
> +                        </child>
>                        </object>
>                      </child>
>                    </object>
>                  </child>
> -              </object>
> -            </child>
> -            <child>
> -              <object class="GtkMenuItem" id="menu-view">
> -                <property name="visible">True</property>
> -                <property name="can_focus">False</property>
> -                <property name="use_action_appearance">False</property>
> -                <property name="label" translatable="yes">_View</property>
> -                <property name="use_underline">True</property>
> -                <child type="submenu">
> -                  <object class="GtkMenu" id="menu2">
> +                <child>
> +                  <object class="GtkMenuItem" id="menu-view">
>                      <property name="visible">True</property>
>                      <property name="can_focus">False</property>
> -                    <property name="accel_group">accelgroup</property>
> -                    <child>
> -                      <object class="GtkCheckMenuItem" id="menu-view-fullscreen">
> -                        <property name="visible">True</property>
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="accel_path"><virt-viewer>/view/toggle-fullscreen</property>
> -                        <property name="label" translatable="yes">_Full screen</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="toggled" handler="virt_viewer_window_menu_view_fullscreen" swapped="no"/>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-view-zoom">
> +                    <property name="use_action_appearance">False</property>
> +                    <property name="label" translatable="yes">_View</property>
> +                    <property name="use_underline">True</property>
> +                    <child type="submenu">
> +                      <object class="GtkMenu" id="menu2">
>                          <property name="visible">True</property>
>                          <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="label" translatable="yes">_Zoom</property>
> -                        <property name="use_underline">True</property>
> -                        <child type="submenu">
> -                          <object class="GtkMenu" id="menu4">
> +                        <property name="accel_group">accelgroup</property>
> +                        <child>
> +                          <object class="GtkCheckMenuItem" id="menu-view-fullscreen">
>                              <property name="visible">True</property>
>                              <property name="can_focus">False</property>
> -                            <property name="accel_group">accelgroup</property>
> -                            <child>
> -                              <object class="GtkMenuItem" id="menu-view-zoom-in">
> -                                <property name="accel_path"><virt-viewer>/view/zoom-in</property>
> -                                <property name="label" translatable="yes">Zoom _In</property>
> -                                <property name="visible">True</property>
> -                                <property name="can_focus">False</property>
> -                                <property name="use_action_appearance">False</property>
> -                                <property name="use_underline">True</property>
> -                                <signal name="activate" handler="virt_viewer_window_menu_view_zoom_in" swapped="no"/>
> -                              </object>
> -                            </child>
> -                            <child>
> -                              <object class="GtkMenuItem" id="menu-view-zoom-out">
> -                                <property name="accel_path"><virt-viewer>/view/zoom-out</property>
> -                                <property name="label" translatable="yes">Zoom _Out</property>
> -                                <property name="visible">True</property>
> -                                <property name="can_focus">False</property>
> -                                <property name="use_action_appearance">False</property>
> -                                <property name="use_underline">True</property>
> -                                <signal name="activate" handler="virt_viewer_window_menu_view_zoom_out" swapped="no"/>
> -                              </object>
> -                            </child>
> -                            <child>
> -                              <object class="GtkSeparatorMenuItem" id="separatormenuitem4">
> -                                <property name="visible">True</property>
> -                                <property name="can_focus">False</property>
> -                              </object>
> -                            </child>
> -                            <child>
> -                              <object class="GtkMenuItem" id="menu-view-zoom-reset">
> -                                <property name="accel_path"><virt-viewer>/view/zoom-reset</property>
> -                                <property name="label" translatable="yes">_Normal Size</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="accel_path"><virt-viewer>/view/toggle-fullscreen</property>
> +                            <property name="label" translatable="yes">_Full screen</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="toggled" handler="virt_viewer_window_menu_view_fullscreen" swapped="no"/>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-view-zoom">
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="label" translatable="yes">_Zoom</property>
> +                            <property name="use_underline">True</property>
> +                            <child type="submenu">
> +                              <object class="GtkMenu" id="menu4">
>                                  <property name="visible">True</property>
>                                  <property name="can_focus">False</property>
> -                                <property name="use_action_appearance">False</property>
> -                                <property name="use_underline">True</property>
> -                                <signal name="activate" handler="virt_viewer_window_menu_view_zoom_reset" swapped="no"/>
> +                                <property name="accel_group">accelgroup</property>
> +                                <child>
> +                                  <object class="GtkMenuItem" id="menu-view-zoom-in">
> +                                    <property name="accel_path"><virt-viewer>/view/zoom-in</property>
> +                                    <property name="label" translatable="yes">Zoom _In</property>
> +                                    <property name="visible">True</property>
> +                                    <property name="can_focus">False</property>
> +                                    <property name="use_action_appearance">False</property>
> +                                    <property name="use_underline">True</property>
> +                                    <signal name="activate" handler="virt_viewer_window_menu_view_zoom_in" swapped="no"/>
> +                                  </object>
> +                                </child>
> +                                <child>
> +                                  <object class="GtkMenuItem" id="menu-view-zoom-out">
> +                                    <property name="accel_path"><virt-viewer>/view/zoom-out</property>
> +                                    <property name="label" translatable="yes">Zoom _Out</property>
> +                                    <property name="visible">True</property>
> +                                    <property name="can_focus">False</property>
> +                                    <property name="use_action_appearance">False</property>
> +                                    <property name="use_underline">True</property>
> +                                    <signal name="activate" handler="virt_viewer_window_menu_view_zoom_out" swapped="no"/>
> +                                  </object>
> +                                </child>
> +                                <child>
> +                                  <object class="GtkSeparatorMenuItem" id="separatormenuitem4">
> +                                    <property name="visible">True</property>
> +                                    <property name="can_focus">False</property>
> +                                  </object>
> +                                </child>
> +                                <child>
> +                                  <object class="GtkMenuItem" id="menu-view-zoom-reset">
> +                                    <property name="accel_path"><virt-viewer>/view/zoom-reset</property>
> +                                    <property name="label" translatable="yes">_Normal Size</property>
> +                                    <property name="visible">True</property>
> +                                    <property name="can_focus">False</property>
> +                                    <property name="use_action_appearance">False</property>
> +                                    <property name="use_underline">True</property>
> +                                    <signal name="activate" handler="virt_viewer_window_menu_view_zoom_reset" swapped="no"/>
> +                                  </object>
> +                                </child>
>                                </object>
>                              </child>
>                            </object>
>                          </child>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-displays">
> -                        <property name="visible">True</property>
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="label" translatable="yes">_Displays</property>
> -                        <property name="use_underline">True</property>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-view-release-cursor">
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="accel_path"><virt-viewer>/view/release-cursor</property>
> -                        <property name="label" translatable="yes">Release cursor</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_view_release_cursor" swapped="no"/>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-displays">
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="label" translatable="yes">_Displays</property>
> +                            <property name="use_underline">True</property>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-view-release-cursor">
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="accel_path"><virt-viewer>/view/release-cursor</property>
> +                            <property name="label" translatable="yes">Release cursor</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_view_release_cursor" swapped="no"/>
> +                          </object>
> +                        </child>
>                        </object>
>                      </child>
>                    </object>
>                  </child>
> -              </object>
> -            </child>
> -            <child>
> -              <object class="GtkMenuItem" id="menu-send">
> -                <property name="visible">True</property>
> -                <property name="can_focus">False</property>
> -                <property name="use_action_appearance">False</property>
> -                <property name="label" translatable="yes">_Send key</property>
> -                <property name="use_underline">True</property>
> -              </object>
> -            </child>
> -            <child>
> -              <object class="GtkMenuItem" id="menu-help">
> -                <property name="visible">True</property>
> -                <property name="can_focus">False</property>
> -                <property name="use_action_appearance">False</property>
> -                <property name="label" translatable="yes">_Help</property>
> -                <property name="use_underline">True</property>
> -                <child type="submenu">
> -                  <object class="GtkMenu" id="menu3">
> +                <child>
> +                  <object class="GtkMenuItem" id="menu-send">
>                      <property name="visible">True</property>
>                      <property name="can_focus">False</property>
> -                    <child>
> -                      <object class="GtkMenuItem" id="menu-help-guest-details">
> -                        <property name="visible">True</property>
> -                        <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="label" translatable="yes">_Guest Details</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_help_guest_details" swapped="no"/>
> -                      </object>
> -                    </child>
> -                    <child>
> -                      <object class="GtkMenuItem" id="imagemenuitem10">
> -                        <property name="label" translatable="yes">_About</property>
> +                    <property name="use_action_appearance">False</property>
> +                    <property name="label" translatable="yes">_Send key</property>
> +                    <property name="use_underline">True</property>
> +                  </object>
> +                </child>
> +                <child>
> +                  <object class="GtkMenuItem" id="menu-help">
> +                    <property name="visible">True</property>
> +                    <property name="can_focus">False</property>
> +                    <property name="use_action_appearance">False</property>
> +                    <property name="label" translatable="yes">_Help</property>
> +                    <property name="use_underline">True</property>
> +                    <child type="submenu">
> +                      <object class="GtkMenu" id="menu3">
>                          <property name="visible">True</property>
>                          <property name="can_focus">False</property>
> -                        <property name="use_action_appearance">False</property>
> -                        <property name="use_underline">True</property>
> -                        <signal name="activate" handler="virt_viewer_window_menu_help_about" swapped="no"/>
> +                        <child>
> +                          <object class="GtkMenuItem" id="menu-help-guest-details">
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="label" translatable="yes">_Guest Details</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_help_guest_details" swapped="no"/>
> +                          </object>
> +                        </child>
> +                        <child>
> +                          <object class="GtkMenuItem" id="imagemenuitem10">
> +                            <property name="label" translatable="yes">_About</property>
> +                            <property name="visible">True</property>
> +                            <property name="can_focus">False</property>
> +                            <property name="use_action_appearance">False</property>
> +                            <property name="use_underline">True</property>
> +                            <signal name="activate" handler="virt_viewer_window_menu_help_about" swapped="no"/>
> +                          </object>
> +                        </child>
>                        </object>
>                      </child>
>                    </object>
>                  </child>
>                </object>
> +              <packing>
> +                <property name="expand">False</property>
> +                <property name="fill">True</property>
> +                <property name="position">0</property>
> +              </packing>
>              </child>
>            </object>
>            <packing>
> -            <property name="expand">False</property>
> -            <property name="fill">True</property>
> -            <property name="position">0</property>
> +            <property name="index">-1</property>
>            </packing>
>          </child>
>        </object>
> diff --git a/src/view/autoDrawer.c b/src/view/autoDrawer.c
> deleted file mode 100644
> index 2ae106c..0000000
> --- a/src/view/autoDrawer.c
> +++ /dev/null
> @@ -1,991 +0,0 @@
> -/* *************************************************************************
> - * Copyright (c) 2005 VMware Inc.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining
> - * a copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sublicense, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - * *************************************************************************/
> -
> -/*
> - * autoDrawer.c -
> - *
> - *    Subclass of ViewDrawer that encapsulates the behaviour typically required
> - *    when using the drawer to implement a menu/toolbar that auto-opens when
> - *    moused-over and auto-closes when the mouse leaves.
> - */
> -
> -#include <config.h>
> -
> -#include "autoDrawer.h"
> -
> -
> -struct _ViewAutoDrawerPrivate
> -{
> -   gboolean active;
> -   gboolean pinned;
> -   gboolean inputUngrabbed;
> -
> -   gboolean opened;
> -   gboolean forceClosing;
> -
> -   gboolean fill;
> -   gint offset;
> -
> -   guint closeConnection;
> -   guint delayConnection;
> -   guint delayValue;
> -   guint overlapPixels;
> -   guint noOverlapPixels;
> -
> -   GtkWidget *over;
> -   GtkWidget *evBox;
> -};
> -
> -#define VIEW_AUTODRAWER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), VIEW_TYPE_AUTODRAWER, ViewAutoDrawerPrivate))
> -
> -/* The unaltered parent class. */
> -static ViewDrawerClass *parentClass;
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerEnforce --
> - *
> - *      Enforce an AutoDrawer's goal now.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerEnforce(ViewAutoDrawer *that, // IN
> -                      gboolean animate)     // IN
> -{
> -   double fraction;
> -   GtkAllocation allocation;
> -   ViewAutoDrawerPrivate *priv = that->priv;
> -
> -   if (!priv->active) {
> -      ViewOvBox_SetMin(VIEW_OV_BOX(that), -1);
> -      ViewOvBox_SetFraction(VIEW_OV_BOX(that), 0);
> -      return;
> -   }
> -
> -   g_assert(priv->over != NULL);
> -   g_assert(GTK_IS_WIDGET(priv->over));
> -
> -   ViewOvBox_SetMin(VIEW_OV_BOX(that), priv->noOverlapPixels);
> -
> -   // The forceClosing flag overrides the opened flag.
> -   if (priv->opened && !priv->forceClosing) {
> -      fraction = 1;
> -   } else {
> -      gtk_widget_get_allocation (priv->over, &allocation);
> -      fraction = ((double)priv->overlapPixels / allocation.height);
> -   }
> -
> -   if (!animate) {
> -      ViewOvBox_SetFraction(VIEW_OV_BOX(that), fraction);
> -   }
> -   ViewDrawer_SetGoal(VIEW_DRAWER(that), fraction);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerOnEnforceDelay --
> - *
> - *      Callback fired when a delayed update happens to update the drawer state.
> - *
> - * Results:
> - *      FALSE to indicate timer should not repeat.
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static gboolean
> -ViewAutoDrawerOnEnforceDelay(ViewAutoDrawer *that) // IN
> -{
> -   that->priv->delayConnection = 0;
> -   ViewAutoDrawerEnforce(that, TRUE);
> -
> -   return FALSE;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerOnCloseDelay --
> - *
> - *      Callback fired when the drawer is closed manually. This prevents the
> - *      drawer from reopening right away.
> - *
> - * Results:
> - *      FALSE to indicate timer should not repeat.
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static gboolean
> -ViewAutoDrawerOnCloseDelay(ViewAutoDrawer *that) // IN
> -{
> -   that->priv->closeConnection = 0;
> -   that->priv->forceClosing = FALSE;
> -
> -   return FALSE;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerUpdate --
> - *
> - *      Decide whether an AutoDrawer should be opened or closed, and enforce
> - *      that decision now or later.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerUpdate(ViewAutoDrawer *that, // IN
> -                     gboolean immediate)   // IN
> -{
> -   ViewAutoDrawerPrivate *priv = that->priv;
> -   GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(that));
> -   GtkWindow *window;
> -   GtkAllocation allocation;
> -
> -   if (!toplevel || !gtk_widget_is_toplevel(toplevel)) {
> -      // The autoDrawer cannot function properly without a toplevel.
> -      return;
> -   }
> -   window = GTK_WINDOW(toplevel);
> -
> -   /*
> -    * We decide to open the drawer by OR'ing several conditions. Evaluating a
> -    * condition can have the side-effect of setting 'immediate' to TRUE, so we
> -    * cannot stop evaluating the conditions after we have found one to be TRUE.
> -    */
> -
> -   priv->opened = FALSE;
> -
> -   /* Is the AutoDrawer pinned? */
> -
> -   if (priv->pinned) {
> -      immediate = TRUE;
> -
> -      priv->opened = TRUE;
> -   }
> -
> -   /* Is the mouse cursor inside the event box? */
> -
> -   if (gtk_widget_get_window(priv->evBox)) {
> -      int x;
> -      int y;
> -      GdkDevice *dev;
> -      GdkDeviceManager *devmgr;
> -
> -      devmgr = gdk_display_get_device_manager(gtk_widget_get_display(priv->evBox));
> -      dev = gdk_device_manager_get_client_pointer(devmgr);
> -
> -      gdk_window_get_device_position(gtk_widget_get_window(priv->evBox),
> -                                     dev, &x, &y, NULL);
> -
> -      gtk_widget_get_allocation(priv->evBox, &allocation);
> -      g_assert(gtk_container_get_border_width(   GTK_CONTAINER(priv->evBox))
> -                                              == 0);
> -      if (   (guint)x < (guint)allocation.width
> -          && (guint)y < (guint)allocation.height) {
> -         priv->opened = TRUE;
> -      }
> -   }
> -
> -   /* If there is a focused widget, is it inside the event box? */
> -
> -   {
> -      GtkWidget *focus;
> -
> -      focus = gtk_window_get_focus(window);
> -      if (focus && gtk_widget_is_ancestor(focus, priv->evBox)) {
> -         /*
> -          * Override the default 'immediate' to make sure the 'over' widget
> -          * immediately appears along with the widget the focused widget.
> -          */
> -         immediate = TRUE;
> -
> -         priv->opened = TRUE;
> -      }
> -   }
> -
> -   /* If input is grabbed, is it on behalf of a widget inside the event box? */
> -
> -   if (!priv->inputUngrabbed) {
> -      GtkWidget *grabbed = NULL;
> -
> -      if (gtk_window_has_group (window)) {
> -        GtkWindowGroup *group = gtk_window_get_group (window);
> -        grabbed = gtk_window_group_get_current_grab (group);
> -      }
> -      if (!grabbed) {
> -         grabbed = gtk_grab_get_current();
> -      }
> -
> -      if (grabbed && GTK_IS_MENU(grabbed)) {
> -         /*
> -          * With cascading menus, the deepest menu owns the grab. Traverse the
> -          * menu hierarchy up until we reach the attach widget for the whole
> -          * hierarchy.
> -          */
> -
> -         for (;;) {
> -            GtkWidget *menuAttach;
> -            GtkWidget *menuItemParent;
> -
> -            menuAttach = gtk_menu_get_attach_widget(GTK_MENU(grabbed));
> -            if (!menuAttach) {
> -               /*
> -                * It is unfortunately not mandatory for a menu to have a proper
> -                * attach widget set.
> -                */
> -               break;
> -            }
> -
> -            grabbed = menuAttach;
> -            if (!GTK_IS_MENU_ITEM(grabbed)) {
> -               break;
> -            }
> -
> -            menuItemParent = gtk_widget_get_parent(grabbed);
> -            g_return_if_fail(menuItemParent);
> -            if (!GTK_IS_MENU(menuItemParent)) {
> -               break;
> -            }
> -
> -            grabbed = menuItemParent;
> -         }
> -      }
> -
> -      if (grabbed && gtk_widget_is_ancestor(grabbed, priv->evBox)) {
> -         /*
> -          * Override the default 'immediate' to make sure the 'over' widget
> -          * immediately appears along with the widget the grab happens on
> -          * behalf of.
> -          */
> -         immediate = TRUE;
> -
> -         priv->opened = TRUE;
> -      }
> -   }
> -
> -   if (priv->delayConnection) {
> -      g_source_remove(priv->delayConnection);
> -      priv->delayConnection = 0;
> -   }
> -
> -   if (priv->forceClosing) {
> -      ViewAutoDrawerEnforce(that, TRUE);
> -   } else if (immediate) {
> -      ViewAutoDrawerEnforce(that, FALSE);
> -   } else {
> -      priv->delayConnection = g_timeout_add(priv->delayValue,
> -         (GSourceFunc)ViewAutoDrawerOnEnforceDelay, that);
> -   }
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerOnOverEnterLeave --
> - *
> - *      Respond to enter/leave events by doing a delayed update of the drawer
> - *      state.
> - *
> - * Results:
> - *      FALSE to indicate event was not handled.
> - *
> - * Side effects:
> - *      Will queue delayed update.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static gboolean
> -ViewAutoDrawerOnOverEnterLeave(GtkWidget *evBox G_GNUC_UNUSED,        // IN: Unused
> -                               GdkEventCrossing *event G_GNUC_UNUSED, // IN
> -                               ViewAutoDrawer *that)    // IN
> -{
> -   /*
> -    * This change happens in response to user input. By default, give the user
> -    * some time to correct his input before reacting to the change.
> -    */
> -   ViewAutoDrawerUpdate(that, FALSE);
> -
> -   return FALSE;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerOnGrabNotify --
> - *
> - *      Respond to grab notifications by updating the drawer state.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Might queue delayed update.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerOnGrabNotify(GtkWidget *evBox G_GNUC_UNUSED,     // IN: Unused
> -                           gboolean ungrabbed,   // IN
> -                           ViewAutoDrawer *that) // IN
> -{
> -   ViewAutoDrawerPrivate *priv = that->priv;
> -
> -   priv->inputUngrabbed = ungrabbed;
> -
> -   /*
> -    * This change happens in response to user input. By default, give the user
> -    * some time to correct his input before reacting to the change.
> -    */
> -   ViewAutoDrawerUpdate(that, FALSE);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerOnSetFocus --
> - *
> - *      Respond to changes in the focus widget of the autoDrawer's toplevel
> - *      by recalculating the state.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerOnSetFocus(GtkWindow *window G_GNUC_UNUSED,    // IN
> -                         GtkWidget *widget G_GNUC_UNUSED,    // IN
> -                         ViewAutoDrawer *that) // IN
> -{
> -   /*
> -    * This change happens in response to user input. By default, give the user
> -    * some time to correct his input before reacting to the change.
> -    */
> -   ViewAutoDrawerUpdate(that, FALSE);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerOnHierarchyChanged --
> - *
> - *      Respond to changes in the toplevel for the AutoDrawer. A toplevel is
> - *      required for the AutoDrawer to calculate its state.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerOnHierarchyChanged(ViewAutoDrawer *that,   // IN
> -                                 GtkWidget *oldToplevel) // IN
> -{
> -   GtkWidget *newToplevel = gtk_widget_get_toplevel(GTK_WIDGET(that));
> -
> -   if (oldToplevel && gtk_widget_is_toplevel(oldToplevel)) {
> -      g_signal_handlers_disconnect_by_func(oldToplevel,
> -                                           G_CALLBACK(ViewAutoDrawerOnSetFocus),
> -                                           that);
> -   }
> -
> -   if (newToplevel && gtk_widget_is_toplevel(newToplevel)) {
> -      g_signal_connect_after(newToplevel, "set-focus",
> -                             G_CALLBACK(ViewAutoDrawerOnSetFocus), that);
> -   }
> -
> -   /* This change happens programmatically. Always react to it immediately. */
> -   ViewAutoDrawerUpdate(that, TRUE);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerSetOver --
> - *
> - *      Virtual method override so that the user's over widget is placed
> - *      inside the AutoDrawer's event box.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerSetOver(ViewOvBox *ovBox,  // IN
> -                      GtkWidget *widget) // IN
> -{
> -   ViewAutoDrawer *that = VIEW_AUTODRAWER(ovBox);
> -   ViewAutoDrawerPrivate *priv = that->priv;
> -   GtkWidget *oldChild = gtk_bin_get_child(GTK_BIN(priv->evBox));
> -
> -   if (oldChild) {
> -      g_object_ref(oldChild);
> -      gtk_container_remove(GTK_CONTAINER(priv->evBox), oldChild);
> -   }
> -
> -   if (widget) {
> -      gtk_container_add(GTK_CONTAINER(priv->evBox), widget);
> -   }
> -
> -   if (oldChild) {
> -      g_object_unref(oldChild);
> -   }
> -
> -   priv->over = widget;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerRefreshPacking --
> - *
> - *      Sets the actual packing values for fill, expand, and packing
> - *      given internal settings.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerRefreshPacking(ViewAutoDrawer *that) // IN
> -{
> -   gboolean expand;
> -   gboolean fill;
> -   guint padding;
> -
> -   expand = (that->priv->fill || (that->priv->offset < 0));
> -   fill = that->priv->fill;
> -   padding = (expand || fill) ? 0 : that->priv->offset;
> -
> -   gtk_box_set_child_packing(GTK_BOX(that), that->priv->evBox,
> -                             expand, fill, padding, GTK_PACK_START);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerInit --
> - *
> - *      Initialize a ViewAutoDrawer.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerInit(GTypeInstance *instance, // IN
> -                   gpointer klass G_GNUC_UNUSED)          // Unused
> -{
> -   ViewAutoDrawer *that;
> -   ViewAutoDrawerPrivate *priv;
> -
> -   that = VIEW_AUTODRAWER(instance);
> -   that->priv = VIEW_AUTODRAWER_GET_PRIVATE(that);
> -   priv = that->priv;
> -
> -   priv->active = TRUE;
> -   priv->pinned = FALSE;
> -   priv->forceClosing = FALSE;
> -   priv->inputUngrabbed = TRUE;
> -   priv->delayConnection = 0;
> -   priv->delayValue = 250;
> -   priv->overlapPixels = 0;
> -   priv->noOverlapPixels = 1;
> -
> -   priv->fill = TRUE;
> -   priv->offset = -1;
> -
> -   priv->evBox = gtk_event_box_new();
> -   gtk_widget_show(priv->evBox);
> -   VIEW_OV_BOX_CLASS(parentClass)->set_over(VIEW_OV_BOX(that), priv->evBox);
> -
> -   g_signal_connect(priv->evBox, "enter-notify-event",
> -                    G_CALLBACK(ViewAutoDrawerOnOverEnterLeave), that);
> -   g_signal_connect(priv->evBox, "leave-notify-event",
> -                    G_CALLBACK(ViewAutoDrawerOnOverEnterLeave), that);
> -   g_signal_connect(priv->evBox, "grab-notify",
> -                    G_CALLBACK(ViewAutoDrawerOnGrabNotify), that);
> -
> -   g_signal_connect(that, "hierarchy-changed",
> -                    G_CALLBACK(ViewAutoDrawerOnHierarchyChanged), NULL);
> -
> -   /* This change happens programmatically. Always react to it immediately. */
> -   ViewAutoDrawerUpdate(that, TRUE);
> -
> -   ViewAutoDrawerRefreshPacking(that);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerFinalize --
> - *
> - *      "finalize" method of a ViewAutoDrawer.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerFinalize(GObject *object) // IN
> -{
> -   ViewAutoDrawer *that;
> -
> -   that = VIEW_AUTODRAWER(object);
> -   if (that->priv->delayConnection) {
> -      g_source_remove(that->priv->delayConnection);
> -   }
> -
> -   G_OBJECT_CLASS(parentClass)->finalize(object);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawerClassInit --
> - *
> - *      Initialize the ViewAutoDrawerClass.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewAutoDrawerClassInit(gpointer klass) // IN
> -{
> -   GObjectClass *objectClass = G_OBJECT_CLASS(klass);
> -   ViewOvBoxClass *ovBoxClass = VIEW_OV_BOX_CLASS(klass);
> -
> -   parentClass = g_type_class_peek_parent(klass);
> -
> -   objectClass->finalize = ViewAutoDrawerFinalize;
> -
> -   ovBoxClass->set_over = ViewAutoDrawerSetOver;
> -
> -   g_type_class_add_private(klass, sizeof(ViewAutoDrawerPrivate));
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_GetType --
> - *
> - *      Get the (memoized) GType of the ViewAutoDrawer GTK+ object.
> - *
> - * Results:
> - *      The GType
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -GType
> -ViewAutoDrawer_GetType(void)
> -{
> -   static GType type = 0;
> -
> -   if (type == 0) {
> -      static const GTypeInfo info = {
> -         sizeof (ViewAutoDrawerClass),
> -         NULL, /* BaseInit */
> -         NULL, /* BaseFinalize */
> -         (GClassInitFunc)ViewAutoDrawerClassInit,
> -         NULL,
> -         NULL, /* Class Data */
> -         sizeof (ViewAutoDrawer),
> -         0, /* n_preallocs */
> -         (GInstanceInitFunc)ViewAutoDrawerInit,
> -         NULL,
> -      };
> -
> -      type = g_type_register_static(VIEW_TYPE_DRAWER, "ViewAutoDrawer", &info, 0);
> -   }
> -
> -   return type;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_New --
> - *
> - *      Create a new ViewAutoDrawer GTK+ widget.
> - *
> - * Results:
> - *      The widget
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -GtkWidget *
> -ViewAutoDrawer_New(void)
> -{
> -   return GTK_WIDGET(g_object_new(VIEW_TYPE_AUTODRAWER, NULL));
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_SetSlideDelay --
> - *
> - *      Set the response time of an AutoDrawer in ms., i.e. the time that
> - *      elapses between:
> - *      - when the AutoDrawer notices a change that can impact the outcome of
> - *        the decision to open or close the drawer,
> - *      and
> - *      - when the AutoDrawer makes such decision.
> - *
> - *      Users move the mouse inaccurately. If they temporarily move the mouse in
> - *      or out of the AutoDrawer for less than the reponse time, their move will
> - *      be ignored.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_SetSlideDelay(ViewAutoDrawer *that, // IN
> -                             guint delay)          // IN
> -{
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -
> -   that->priv->delayValue = delay;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_SetOverlapPixels --
> - *
> - *      Set the number of pixels that the over widget overlaps the under widget
> - *      when not open.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_SetOverlapPixels(ViewAutoDrawer *that, // IN
> -                                guint overlapPixels)  // IN
> -{
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -
> -   that->priv->overlapPixels = overlapPixels;
> -
> -   /* This change happens programmatically. Always react to it immediately. */
> -   ViewAutoDrawerUpdate(that, TRUE);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_SetNoOverlapPixels --
> - *
> - *      Set the number of pixels that the drawer reserves when not open. The
> - *      over widget does not overlap the under widget over these pixels.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_SetNoOverlapPixels(ViewAutoDrawer *that,  // IN
> -                                  guint noOverlapPixels) // IN
> -{
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -
> -   that->priv->noOverlapPixels = noOverlapPixels;
> -
> -   /* This change happens programmatically. Always react to it immediately. */
> -   ViewAutoDrawerUpdate(that, TRUE);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_SetActive --
> - *
> - *      Set whether the AutoDrawer is active or not. That is to say, whether
> - *      it is acting as a drawer or not. When inactive, the over and under
> - *      widget do not overlap and the net result is very much like a vbox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_SetActive(ViewAutoDrawer *that, // IN
> -                         gboolean active)      // IN
> -{
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -
> -   that->priv->active = active;
> -
> -   /* This change happens programmatically. Always react to it immediately. */
> -   ViewAutoDrawerUpdate(that, TRUE);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_SetPinned --
> - *
> - *      Set whether the AutoDrawer is pinned or not. When pinned, the
> - *      AutoDrawer will stay open regardless of the state of any other inputs.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_SetPinned(ViewAutoDrawer *that, // IN
> -                         gboolean pinned)      // IN
> -{
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -
> -   that->priv->pinned = pinned;
> -
> -   /*
> -    * This change happens in response to user input. By default, give the user
> -    * some time to correct his input before reacting to the change.
> -    */
> -   ViewAutoDrawerUpdate(that, FALSE);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_SetFill --
> - *
> - *      Set whether the Over widget of the AutoDrawer should fill the full
> - *      width of the AutoDrawer or just occupy the minimum space it needs.
> - *      A value of TRUE overrides offset settings.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_SetFill(ViewAutoDrawer *that, // IN
> -                       gboolean fill)        // IN
> -{
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -
> -   that->priv->fill = fill;
> -   ViewAutoDrawerRefreshPacking(that);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_SetOffset --
> - *
> - *      Set the drawer's X offset, or distance in pixels from the left side.
> - *      If offset is -1, the drawer will be centered.  If fill has been set
> - *      TRUE by SetFill, these settings will have no effect.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_SetOffset(ViewAutoDrawer *that, // IN
> -                         gint offset)          // IN
> -{
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -
> -   that->priv->offset = offset;
> -   ViewAutoDrawerRefreshPacking(that);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewAutoDrawer_Close --
> - *
> - *      Closes the drawer. This will not unset the pinned state.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      Drawer state is updated. If there is a focused widget inside the
> - *      drawer, unfocus it.
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewAutoDrawer_Close(ViewAutoDrawer *that)   // IN
> -{
> -   GtkWindow *window;
> -   GtkWidget *focus;
> -   GtkWidget *toplevel;
> -
> -   g_return_if_fail(VIEW_IS_AUTODRAWER(that));
> -   toplevel = gtk_widget_get_toplevel(GTK_WIDGET(that));
> -
> -   if (!toplevel || !gtk_widget_is_toplevel(toplevel)) {
> -      // The autoDrawer cannot function properly without a toplevel.
> -      return;
> -   }
> -   window = GTK_WINDOW(toplevel);
> -
> -   focus = gtk_window_get_focus(window);
> -   if (focus && gtk_widget_is_ancestor(focus, that->priv->evBox)) {
> -      gtk_window_set_focus(window, NULL);
> -   }
> -
> -   that->priv->forceClosing = TRUE;
> -   that->priv->closeConnection =
> -      g_timeout_add(ViewDrawer_GetCloseTime(&that->parent) +
> -                    that->priv->delayValue,
> -      (GSourceFunc)ViewAutoDrawerOnCloseDelay, that);
> -
> -   /* This change happens programmatically. Always react to it immediately. */
> -   ViewAutoDrawerUpdate(that, TRUE);
> -}
> diff --git a/src/view/autoDrawer.h b/src/view/autoDrawer.h
> deleted file mode 100644
> index a2fdd54..0000000
> --- a/src/view/autoDrawer.h
> +++ /dev/null
> @@ -1,91 +0,0 @@
> -/* *************************************************************************
> - * Copyright (c) 2005 VMware Inc.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining
> - * a copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sublicense, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - * *************************************************************************/
> -
> -/*
> - * autoDrawer.h --
> - *
> - *      Declarations for the ViewAutoDrawer GTK+ widget.
> - */
> -
> -
> -#ifndef LIBVIEW_AUTODRAWER_H
> -#define LIBVIEW_AUTODRAWER_H
> -
> -
> -#include "drawer.h"
> -
> -
> -#define VIEW_TYPE_AUTODRAWER            (ViewAutoDrawer_GetType())
> -#define VIEW_AUTODRAWER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), VIEW_TYPE_AUTODRAWER, ViewAutoDrawer))
> -#define VIEW_AUTODRAWER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), VIEW_TYPE_AUTODRAWER, ViewAutoDrawerClass))
> -#define VIEW_IS_AUTODRAWER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIEW_TYPE_AUTODRAWER))
> -#define VIEW_IS_AUTODRAWER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), VIEW_TYPE_AUTODRAWER))
> -#define VIEW_AUTODRAWER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), VIEW_TYPE_AUTODRAWER, ViewAutoDrawerClass))
> -
> -typedef struct _ViewAutoDrawerPrivate ViewAutoDrawerPrivate;
> -
> -typedef struct _ViewAutoDrawer {
> -   /* Must come first. */
> -   ViewDrawer parent;
> -
> -   /* Private. */
> -   ViewAutoDrawerPrivate *priv;
> -} ViewAutoDrawer;
> -
> -typedef struct _ViewAutoDrawerClass {
> -   /* Must come first. */
> -   ViewDrawerClass parent;
> -
> -   /* Padding for future expansion */
> -   void (*_view_reserved0)(void);
> -   void (*_view_reserved1)(void);
> -   void (*_view_reserved2)(void);
> -   void (*_view_reserved3)(void);
> -} ViewAutoDrawerClass;
> -
> -
> -G_BEGIN_DECLS
> -
> -
> -GType ViewAutoDrawer_GetType(void);
> -
> -GtkWidget *ViewAutoDrawer_New(void);
> -
> -void ViewAutoDrawer_SetSlideDelay(ViewAutoDrawer *that, guint delay);
> -void ViewAutoDrawer_SetOverlapPixels(ViewAutoDrawer *that, guint overlapPixels);
> -void ViewAutoDrawer_SetNoOverlapPixels(ViewAutoDrawer *that, guint noOverlapPixels);
> -
> -void ViewAutoDrawer_SetActive(ViewAutoDrawer *that, gboolean active);
> -
> -void ViewAutoDrawer_SetPinned(ViewAutoDrawer *that, gboolean pinned);
> -
> -void ViewAutoDrawer_SetFill(ViewAutoDrawer *that, gboolean fill);
> -
> -void ViewAutoDrawer_SetOffset(ViewAutoDrawer *that, gint offset);
> -
> -void ViewAutoDrawer_Close(ViewAutoDrawer *that);
> -
> -G_END_DECLS
> -
> -
> -#endif /* LIBVIEW_AUTODRAWER_H */
> diff --git a/src/view/drawer.c b/src/view/drawer.c
> deleted file mode 100644
> index 40b71dd..0000000
> --- a/src/view/drawer.c
> +++ /dev/null
> @@ -1,366 +0,0 @@
> -/* *************************************************************************
> - * Copyright (c) 2005 VMware, Inc.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining
> - * a copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sublicense, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - * *************************************************************************/
> -
> -/*
> - * drawer.c -
> - *
> - *      Implementation of a GTK+ drawer, i.e. a widget that opens and closes by
> - *      sliding smoothly, at constant speed, over another one.
> - */
> -
> -#include <config.h>
> -
> -#include "drawer.h"
> -
> -
> -struct _ViewDrawerPrivate
> -{
> -   unsigned int period;
> -   double step;
> -   double goal;
> -   struct {
> -      gboolean pending;
> -      guint id;
> -   } timer;
> -};
> -
> -#define VIEW_DRAWER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), VIEW_TYPE_DRAWER, ViewDrawerPrivate))
> -
> -/* The unaltered parent class. */
> -static ViewOvBoxClass *parentClass;
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawerInit --
> - *
> - *      Initialize a ViewDrawer.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewDrawerInit(GTypeInstance *instance, // IN
> -               gpointer klass G_GNUC_UNUSED)          // Unused
> -{
> -   ViewDrawer *that;
> -
> -   that = VIEW_DRAWER(instance);
> -   that->priv = VIEW_DRAWER_GET_PRIVATE(that);
> -
> -   that->priv->period = 10;
> -   that->priv->step = 0.2;
> -   that->priv->timer.pending = FALSE;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawerFinalize --
> - *
> - *      "finalize" method of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewDrawerFinalize(GObject *object) // IN
> -{
> -   ViewDrawer *that;
> -   ViewDrawerPrivate *priv;
> -
> -   that = VIEW_DRAWER(object);
> -   priv = that->priv;
> -
> -   if (priv->timer.pending) {
> -      g_source_remove(priv->timer.id);
> -      priv->timer.pending = FALSE;
> -   }
> -
> -   G_OBJECT_CLASS(parentClass)->finalize(object);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawerClassInit --
> - *
> - *      Initialize the ViewDrawerClass.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewDrawerClassInit(gpointer klass) // IN
> -{
> -   GObjectClass *objectClass = G_OBJECT_CLASS(klass);
> -
> -   parentClass = g_type_class_peek_parent(klass);
> -
> -   objectClass->finalize = ViewDrawerFinalize;
> -
> -   g_type_class_add_private(klass, sizeof(ViewDrawerPrivate));
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawer_GetType --
> - *
> - *      Get the (memoized) GType of the ViewDrawer GTK+ object.
> - *
> - * Results:
> - *      The GType
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -GType
> -ViewDrawer_GetType(void)
> -{
> -   static GType type = 0;
> -
> -   if (type == 0) {
> -      static const GTypeInfo info = {
> -         sizeof (ViewDrawerClass),
> -         NULL, /* BaseInit */
> -         NULL, /* BaseFinalize */
> -         (GClassInitFunc)ViewDrawerClassInit,
> -         NULL,
> -         NULL, /* Class Data */
> -         sizeof (ViewDrawer),
> -         0, /* n_preallocs */
> -         (GInstanceInitFunc)ViewDrawerInit,
> -         NULL
> -      };
> -
> -      type = g_type_register_static(VIEW_TYPE_OV_BOX, "ViewDrawer", &info, 0);
> -   }
> -
> -   return type;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawer_New --
> - *
> - *      Create a new ViewDrawer GTK+ widget.
> - *
> - * Results:
> - *      The widget
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -GtkWidget *
> -ViewDrawer_New(void)
> -{
> -   ViewDrawer *that;
> -
> -   that = VIEW_DRAWER(g_object_new(VIEW_TYPE_DRAWER, NULL));
> -
> -   return GTK_WIDGET(that);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawerOnTimer --
> - *
> - *      Timer callback of a ViewDrawer. If we have reached the goal, deschedule
> - *      the timer. Otherwise make progress towards the goal, and keep the timer
> - *      scheduled.
> - *
> - * Results:
> - *      TRUE if the timer must be rescheduled.
> - *      FALSE if the timer must not be rescheduled.
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static gint
> -ViewDrawerOnTimer(gpointer data) // IN
> -{
> -   ViewDrawer *that;
> -   ViewDrawerPrivate *priv;
> -   double fraction;
> -
> -   that = VIEW_DRAWER(data);
> -   priv = that->priv;
> -
> -   fraction = ViewOvBox_GetFraction(VIEW_OV_BOX(that));
> -   /*
> -    * Comparing double values with '==' is most of the time a bad idea, due to
> -    * the inexact representation of values in binary (see
> -    * http://www2.hursley.ibm.com/decimal/decifaq1.html and http://boost.org/libs/test/doc/components/test_tools/floating_point_comparison.html).
> -    * But in this particular case it is legitimate. --hpreg
> -    */
> -   if (priv->goal == fraction) {
> -      return priv->timer.pending = FALSE;
> -   }
> -
> -   ViewOvBox_SetFraction(VIEW_OV_BOX(that),
> -                         priv->goal > fraction
> -                            ? MIN(fraction + priv->step, priv->goal)
> -                            : MAX(fraction - priv->step, priv->goal));
> -   return TRUE;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawer_SetSpeed --
> - *
> - *      Set the 'period' (in ms.) and 'step' properties of a ViewDrawer, which
> - *      determine the speed and smoothness of the drawer's motion.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewDrawer_SetSpeed(ViewDrawer *that,    // IN
> -                    unsigned int period, // IN
> -                    double step)         // IN
> -{
> -   ViewDrawerPrivate *priv;
> -
> -   g_return_if_fail(that != NULL);
> -
> -   priv = that->priv;
> -
> -   priv->period = period;
> -   if (priv->timer.pending) {
> -      g_source_remove(priv->timer.id);
> -      priv->timer.id = g_timeout_add(priv->period, ViewDrawerOnTimer, that);
> -   }
> -   priv->step = step;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawer_SetGoal --
> - *
> - *      Set the 'goal' property of a ViewDrawer, i.e. how much the drawer should
> - *      be opened when it is done sliding.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewDrawer_SetGoal(ViewDrawer *that, // IN
> -                   double goal)      // IN
> -{
> -   ViewDrawerPrivate *priv;
> -
> -   g_return_if_fail(that != NULL);
> -   g_return_if_fail(goal >= 0 && goal <= 1);
> -
> -   priv = that->priv;
> -
> -   priv->goal = goal;
> -   if (priv->timer.pending == FALSE) {
> -      priv->timer.id = g_timeout_add(priv->period, ViewDrawerOnTimer, that);
> -      priv->timer.pending = TRUE;
> -   }
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewDrawer_GetCloseTime --
> - *
> - *    Get the approximate amount of time it will take for this drawer to
> - *    open and close, in ms.
> - *
> - * Results:
> - *      The time it takes to open or close the drawer.
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -int
> -ViewDrawer_GetCloseTime(ViewDrawer *that)
> -{
> -   ViewDrawerPrivate *priv;
> -
> -   if (that == NULL) {
> -      return 0;
> -   }
> -
> -   priv = that->priv;
> -
> -   return priv->period * ((int)(1/priv->step) + 1);
> -}
> diff --git a/src/view/drawer.h b/src/view/drawer.h
> deleted file mode 100644
> index 12964a2..0000000
> --- a/src/view/drawer.h
> +++ /dev/null
> @@ -1,83 +0,0 @@
> -/* *************************************************************************
> - * Copyright (c) 2005 VMware, Inc.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining
> - * a copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sublicense, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - * *************************************************************************/
> -
> -/*
> - * drawer.h --
> - *
> - *      Declarations for the ViewDrawer GTK+ widget.
> - */
> -
> -
> -#ifndef LIBVIEW_DRAWER_H
> -#define LIBVIEW_DRAWER_H
> -
> -
> -#include "ovBox.h"
> -
> -
> -#define VIEW_TYPE_DRAWER            (ViewDrawer_GetType())
> -#define VIEW_DRAWER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), VIEW_TYPE_DRAWER, ViewDrawer))
> -#define VIEW_DRAWER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), VIEW_TYPE_DRAWER, ViewDrawerClass))
> -#define VIEW_IS_DRAWER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIEW_TYPE_DRAWER))
> -#define VIEW_IS_DRAWER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), VIEW_TYPE_DRAWER))
> -#define VIEW_DRAWER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), VIEW_TYPE_DRAWER, ViewDrawerClass))
> -
> -typedef struct _ViewDrawerPrivate ViewDrawerPrivate;
> -
> -typedef struct _ViewDrawer {
> -   /* Must come first. */
> -   ViewOvBox parent;
> -
> -   /* Private. */
> -   ViewDrawerPrivate *priv;
> -} ViewDrawer;
> -
> -
> -typedef struct _ViewDrawerClass {
> -   /* Must come first. */
> -   ViewOvBoxClass parent;
> -
> -   /* Padding for future expansion */
> -   void (*_view_reserved0)(void);
> -   void (*_view_reserved1)(void);
> -   void (*_view_reserved2)(void);
> -   void (*_view_reserved3)(void);
> -} ViewDrawerClass;
> -
> -
> -G_BEGIN_DECLS
> -
> -
> -GType ViewDrawer_GetType(void);
> -
> -GtkWidget *ViewDrawer_New(void);
> -
> -void ViewDrawer_SetSpeed(ViewDrawer *that, unsigned int period, double step);
> -void ViewDrawer_SetGoal(ViewDrawer *that, double fraction);
> -int ViewDrawer_GetCloseTime(ViewDrawer *that);
> -
> -
> -G_END_DECLS
> -
> -
> -#endif /* LIBVIEW_DRAWER_H */
> diff --git a/src/view/ovBox.c b/src/view/ovBox.c
> deleted file mode 100644
> index fa56fd5..0000000
> --- a/src/view/ovBox.c
> +++ /dev/null
> @@ -1,946 +0,0 @@
> -/* *************************************************************************
> - * Copyright (c) 2005 VMware, Inc.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining
> - * a copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sublicense, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - * *************************************************************************/
> -
> -/*
> - * ovBox.c --
> - *
> - *      Implementation of a GTK+ overlapping box. Allows you to display and
> - *      quickly move a child that overlaps another child.
> - *
> - *      Implementation notes
> - *      --------------------
> - *
> - *      Changing 'fraction' is fast (we just move the 'overWin' X window, which
> - *      ultimately copies a rectangle on the X server side), and does not
> - *      flicker (the 'under' and 'over' GTK children are not re-drawn, except
> - *      for parts of them that become exposed).
> - *
> - *      o Initially, we thought it could be done with only 2 X windows
> - *
> - *        Layout                  Hierarchy
> - *        ------                  ---------
> - *
> - *          /- overWin --\        underWin
> - *          |            |           overWin
> - *        /-+- underWin -+-\
> - *        | |            | |
> - *        | \------------/ |
> - *        |                |
> - *        \----------------/
> - *
> - *        But the 'under' GTK child could create other X windows inside
> - *        'underWin', which makes it impossible to guarantee that 'overWin'
> - *        will stay stacked on top.
> - *
> - *      o So we are forced to use 3 X windows
> - *
> - *        Layout                  Hierarchy
> - *        ------                  ---------
> - *
> - *            /- overWin --\      window
> - *            |            |         overWin
> - *        /---+- window ---+---\     underWin
> - *        |   |            |   |
> - *        | /-+- underWin -+-\ |
> - *        | | |            | | |
> - *        | | \------------/ | |
> - *        | |                | |
> - *        | \----------------/ |
> - *        |                    |
> - *        \--------------------/
> - *
> - *  --hpreg
> - */
> -
> -#include <config.h>
> -
> -#include "ovBox.h"
> -
> -struct _ViewOvBoxPrivate
> -{
> -   GdkWindow *underWin;
> -   GtkWidget *under;
> -   GdkWindow *overWin;
> -   GtkWidget *over;
> -   GtkRequisition overR;
> -   unsigned int min;
> -   double fraction;
> -   gint verticalOffset;
> -};
> -
> -#define VIEW_OV_BOX_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), VIEW_TYPE_OV_BOX, ViewOvBoxPrivate))
> -
> -/* The unaltered parent class. */
> -static GtkBoxClass *parentClass;
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxInit --
> - *
> - *      Initialize a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxInit(GTypeInstance *instance, // IN
> -              gpointer klass G_GNUC_UNUSED)          // Unused
> -{
> -   ViewOvBox *that;
> -   ViewOvBoxPrivate *priv;
> -
> -   that = VIEW_OV_BOX(instance);
> -   that->priv = VIEW_OV_BOX_GET_PRIVATE(that);
> -   priv = that->priv;
> -
> -   gtk_widget_set_has_window (GTK_WIDGET (that), TRUE);
> -
> -   priv->underWin = NULL;
> -   priv->under = NULL;
> -   priv->overWin = NULL;
> -   priv->over = NULL;
> -   priv->overR.height = -1;
> -   priv->overR.width = -1;
> -   priv->min = 0;
> -   priv->fraction = 0;
> -   priv->verticalOffset = 0;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxMap --
> - *
> - *      "map" method of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxMap(GtkWidget *widget) // IN
> -{
> -   gdk_window_show(gtk_widget_get_window (widget));
> -   GTK_WIDGET_CLASS(parentClass)->map(widget);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxUnmap --
> - *
> - *      "unmap" method of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxUnmap(GtkWidget *widget) // IN
> -{
> -   gdk_window_hide(gtk_widget_get_window (widget));
> -   GTK_WIDGET_CLASS(parentClass)->unmap(widget);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxGetActualMin --
> - *
> - *      Retrieve the actual 'min' value, i.e. a value that is guaranteed not to
> - *      exceed the height of the 'over' child.
> - *
> - * Results:
> - *      The actual 'min' value.
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static inline unsigned int
> -ViewOvBoxGetActualMin(ViewOvBox *that) // IN
> -{
> -   return MIN(that->priv->min, that->priv->overR.height);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxGetUnderGeometry --
> - *
> - *      Retrieve the geometry to apply to 'that->underWin'.
> - *
> - * Results:
> - *      The geometry
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxGetUnderGeometry(ViewOvBox *that, // IN
> -                          int *x,          // OUT
> -                          int *y,          // OUT
> -                          int *width,      // OUT
> -                          int *height)     // OUT
> -{
> -   unsigned int min;
> -   GtkAllocation allocation;
> -
> -   min = ViewOvBoxGetActualMin(that);
> -   gtk_widget_get_allocation (GTK_WIDGET(that), &allocation);
> -
> -   *x = 0;
> -   *y = min;
> -   *width = allocation.width;
> -   *height = allocation.height - min;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxGetOverGeometry --
> - *
> - *      Retrieve the geometry to apply to 'that->overWin'.
> - *
> - * Results:
> - *      The geometry
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxGetOverGeometry(ViewOvBox *that, // IN
> -                         int *x,          // OUT
> -                         int *y,          // OUT
> -                         int *width,      // OUT
> -                         int *height)     // OUT
> -{
> -   ViewOvBoxPrivate *priv;
> -   gboolean expand;
> -   gboolean fill;
> -   guint padding;
> -   unsigned int boxWidth;
> -   GtkAllocation allocation;
> -
> -   priv = that->priv;
> -
> -   if (priv->over) {
> -      /*
> -       * When a child's expand or fill property changes, GtkBox queues
> -       * a resize for the child.
> -       */
> -      gtk_container_child_get(GTK_CONTAINER(that), priv->over,
> -                              "expand", &expand,
> -                              "fill", &fill,
> -                              "padding", &padding,
> -                              NULL);
> -   } else {
> -      /* Default values used by GtkBox. */
> -      expand = TRUE;
> -      fill = TRUE;
> -      padding = 0;
> -   }
> -
> -   gtk_widget_get_allocation(GTK_WIDGET(that), &allocation);
> -   boxWidth = allocation.width;
> -   if (!expand) {
> -      *width = MIN(priv->overR.width, boxWidth - padding);
> -      *x = padding;
> -   } else if (!fill) {
> -      *width = MIN(priv->overR.width, boxWidth);
> -      *x = (boxWidth - *width) / 2;
> -   } else {
> -      *width = boxWidth;
> -      *x = 0;
> -   }
> -
> -   *y =   (priv->overR.height - ViewOvBoxGetActualMin(that))
> -        * (priv->fraction - 1) + priv->verticalOffset;
> -   *height = priv->overR.height;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxSetBackground --
> - *
> - *      Set the background color of the 'underWin' and 'overWin' X windows.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxSetBackground(ViewOvBox *that) // IN
> -{
> -   GtkWidget *widget = GTK_WIDGET(that);
> -   GtkStyleContext *stylecontext;
> -
> -   stylecontext = gtk_widget_get_style_context(widget);
> -   gtk_style_context_set_background(stylecontext, gtk_widget_get_window(widget));
> -   gtk_style_context_set_background(stylecontext, that->priv->underWin);
> -   gtk_style_context_set_background(stylecontext, that->priv->overWin);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxRealize --
> - *
> - *      "realize" method of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxRealize(GtkWidget *widget) // IN
> -{
> -   ViewOvBox *that;
> -   ViewOvBoxPrivate *priv;
> -   GdkWindowAttr attributes;
> -   gint mask;
> -   GtkAllocation allocation;
> -   GdkWindow *window;
> -
> -   gtk_widget_set_realized (widget, TRUE);
> -
> -   that = VIEW_OV_BOX(widget);
> -   priv = that->priv;
> -
> -   attributes.window_type = GDK_WINDOW_CHILD;
> -   attributes.wclass = GDK_INPUT_OUTPUT;
> -   attributes.visual = gtk_widget_get_visual(widget);
> -   attributes.event_mask = gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK;
> -   mask = GDK_WA_VISUAL | GDK_WA_X | GDK_WA_Y;
> -
> -   gtk_widget_get_allocation(widget, &allocation);
> -   attributes.x = allocation.x;
> -   attributes.y = allocation.y;
> -   attributes.width = allocation.width;
> -   attributes.height = allocation.height;
> -   window = gdk_window_new(gtk_widget_get_parent_window(widget),
> -                           &attributes, mask);
> -   gtk_widget_set_window(widget, window);
> -   gdk_window_set_user_data(window, that);
> -
> -   /*
> -    * The order in which we create the children X window matters: the child
> -    * created last is stacked on top. --hpreg
> -    */
> -
> -   ViewOvBoxGetUnderGeometry(that, &attributes.x, &attributes.y,
> -                             &attributes.width, &attributes.height);
> -   priv->underWin = gdk_window_new(window, &attributes, mask);
> -   gdk_window_set_user_data(priv->underWin, that);
> -   if (priv->under) {
> -      gtk_widget_set_parent_window(priv->under, priv->underWin);
> -   }
> -   gdk_window_show(priv->underWin);
> -
> -   ViewOvBoxGetOverGeometry(that, &attributes.x, &attributes.y,
> -                            &attributes.width, &attributes.height);
> -   priv->overWin = gdk_window_new(window, &attributes, mask);
> -   gdk_window_set_user_data(priv->overWin, that);
> -   if (priv->over) {
> -      gtk_widget_set_parent_window(priv->over, priv->overWin);
> -   }
> -   gdk_window_show(priv->overWin);
> -
> -   ViewOvBoxSetBackground(that);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxUnrealize --
> - *
> - *      "unrealize" method of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxUnrealize(GtkWidget *widget) // IN
> -{
> -   ViewOvBox *that;
> -   ViewOvBoxPrivate *priv;
> -
> -   that = VIEW_OV_BOX(widget);
> -   priv = that->priv;
> -
> -   /*
> -    * Unrealize the parent before destroying the windows so that we end up
> -    * unrealizing all the child widgets before destroying the child windows,
> -    * giving them a chance to reparent their windows before we clobber them.
> -    */
> -   GTK_WIDGET_CLASS(parentClass)->unrealize(widget);
> -
> -
> -   gdk_window_set_user_data(priv->underWin, NULL);
> -   gdk_window_destroy(priv->underWin);
> -   priv->underWin = NULL;
> -
> -   gdk_window_set_user_data(priv->overWin, NULL);
> -   gdk_window_destroy(priv->overWin);
> -   priv->overWin = NULL;
> -
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxRealSizeRequest --
> - *
> - *      "size_request" method, generalized to work with both gtk-2 and 3.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -static void
> -ViewOvBoxRealSizeRequest(GtkWidget *widget,           // IN
> -   GtkRequisition *min_in, GtkRequisition *nat_in,      // IN
> -   GtkRequisition *min_out, GtkRequisition *nat_out)    // OUT
> -{
> -   ViewOvBox *that;
> -   ViewOvBoxPrivate *priv;
> -   gboolean expand;
> -   gboolean fill;
> -   guint padding;
> -   unsigned int min;
> -
> -   that = VIEW_OV_BOX(widget);
> -   priv = that->priv;
> -
> -   gtk_widget_get_preferred_size(priv->over, NULL, &priv->overR);
> -
> -   gtk_container_child_get(GTK_CONTAINER(that), priv->over,
> -                           "expand", &expand,
> -                           "fill", &fill,
> -                           "padding", &padding,
> -                           NULL);
> -
> -   min = ViewOvBoxGetActualMin(that);
> -
> -   if (min_out) {
> -      min_out->width = MAX(min_in->width, priv->overR.width +
> -                                            ((expand || fill) ? 0 : padding));
> -      min_out->height = MAX(min_in->height + min, priv->overR.height);
> -   }
> -   if (nat_out) {
> -      nat_out->width = MAX(nat_in->width, priv->overR.width +
> -                                            ((expand || fill) ? 0 : padding));
> -      nat_out->height = MAX(nat_in->height + min, priv->overR.height);
> -   }
> -}
> -
> -static void
> -ViewOvBox_get_preferred_width (GtkWidget *widget,
> -                               gint      *minimal_width,
> -                               gint      *natural_width)
> -{
> -   ViewOvBoxPrivate *priv = VIEW_OV_BOX(widget)->priv;
> -   GtkRequisition min_in, nat_in, min_out, nat_out;
> -
> -   gtk_widget_get_preferred_size(priv->under, &min_in, &nat_in);
> -
> -   ViewOvBoxRealSizeRequest(widget, &min_in, &nat_in, &min_out, &nat_out);
> -
> -   *minimal_width = min_out.width;
> -   *natural_width = nat_out.width;
> -}
> -
> -static void
> -ViewOvBox_get_preferred_height (GtkWidget *widget,
> -                                gint      *minimal_height,
> -                                gint      *natural_height)
> -{
> -   ViewOvBoxPrivate *priv = VIEW_OV_BOX(widget)->priv;
> -   GtkRequisition min_in, nat_in, min_out, nat_out;
> -
> -   gtk_widget_get_preferred_size(priv->under, &min_in, &nat_in);
> -
> -   ViewOvBoxRealSizeRequest(widget, &min_in, &nat_in, &min_out, &nat_out);
> -
> -   *minimal_height = min_out.height;
> -   *natural_height = nat_out.height;
> -}
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxSizeAllocate --
> - *
> - *      "size_allocate" method of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxSizeAllocate(GtkWidget *widget,         // IN
> -                      GtkAllocation *allocation) // IN
> -{
> -   ViewOvBox *that;
> -   ViewOvBoxPrivate *priv;
> -   GtkAllocation under;
> -   GtkAllocation over;
> -
> -   gtk_widget_set_allocation (widget, allocation);
> -
> -   that = VIEW_OV_BOX(widget);
> -   priv = that->priv;
> -
> -   ViewOvBoxGetUnderGeometry(that, &under.x, &under.y, &under.width,
> -                             &under.height);
> -   ViewOvBoxGetOverGeometry(that, &over.x, &over.y, &over.width, &over.height);
> -
> -   if (gtk_widget_get_realized(widget)) {
> -      gdk_window_move_resize(gtk_widget_get_window(widget),
> -                             allocation->x, allocation->y,
> -                             allocation->width, allocation->height);
> -      gdk_window_move_resize(priv->underWin, under.x, under.y, under.width,
> -                             under.height);
> -      gdk_window_move_resize(priv->overWin, over.x, over.y, over.width,
> -                             over.height);
> -   }
> -
> -   under.x = 0;
> -   under.y = 0;
> -   gtk_widget_size_allocate(priv->under, &under);
> -   over.x = 0;
> -   over.y = 0;
> -   gtk_widget_size_allocate(priv->over, &over);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxStyleSet --
> - *
> - *      "style_set" method of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxStyleSet(GtkWidget *widget,       // IN
> -                  GtkStyle *previousStyle) // IN: Unused
> -{
> -   ViewOvBox *that;
> -
> -   that = VIEW_OV_BOX(widget);
> -
> -   if (gtk_widget_get_realized(widget)) {
> -      ViewOvBoxSetBackground(that);
> -   }
> -
> -   GTK_WIDGET_CLASS(parentClass)->style_set(widget, previousStyle);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxSetChild --
> - *
> - *      Set a child of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxSetChild(ViewOvBox *that,     // IN
> -                  GtkWidget **child,   // IN
> -                  GdkWindow *childWin, // IN
> -                  GtkWidget *widget)   // IN
> -{
> -   GtkWidget *oldChild = *child;
> -
> -   if (oldChild) {
> -      g_object_ref(oldChild);
> -      gtk_container_remove(GTK_CONTAINER(that), oldChild);
> -   }
> -
> -   *child = widget;
> -   if (*child) {
> -      gtk_widget_set_parent_window(widget, childWin);
> -      gtk_container_add(GTK_CONTAINER(that), *child);
> -   }
> -
> -   if (oldChild) {
> -      g_object_unref(oldChild);
> -   }
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxSetOver --
> - *
> - *      Base implementation of ViewOvBox_SetOver.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxSetOver(ViewOvBox *that,   // IN
> -                 GtkWidget *widget) // IN
> -{
> -   ViewOvBoxSetChild(that, &that->priv->over, that->priv->overWin, widget);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBoxClassInit --
> - *
> - *      Initialize the ViewOvBoxClass.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -static void
> -ViewOvBoxClassInit(ViewOvBoxClass *klass) // IN
> -{
> -   GtkWidgetClass *widgetClass;
> -
> -   widgetClass = GTK_WIDGET_CLASS(klass);
> -
> -   widgetClass->map = ViewOvBoxMap;
> -   widgetClass->unmap = ViewOvBoxUnmap;
> -   widgetClass->realize = ViewOvBoxRealize;
> -   widgetClass->unrealize = ViewOvBoxUnrealize;
> -   widgetClass->get_preferred_width = ViewOvBox_get_preferred_width;
> -   widgetClass->get_preferred_height = ViewOvBox_get_preferred_height;
> -   widgetClass->size_allocate = ViewOvBoxSizeAllocate;
> -   widgetClass->style_set = ViewOvBoxStyleSet;
> -
> -   klass->set_over = ViewOvBoxSetOver;
> -
> -   parentClass = g_type_class_peek_parent(klass);
> -
> -   g_type_class_add_private(klass, sizeof(ViewOvBoxPrivate));
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBox_GetType --
> - *
> - *      Get the (memoized) GType of the ViewOvBox GTK+ object.
> - *
> - * Results:
> - *      The GType
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -GType
> -ViewOvBox_GetType(void)
> -{
> -   static GType type = 0;
> -
> -   if (type == 0) {
> -      static const GTypeInfo info = {
> -         sizeof (ViewOvBoxClass),
> -         NULL, /* BaseInit */
> -         NULL, /* BaseFinalize */
> -         (GClassInitFunc)ViewOvBoxClassInit,
> -         NULL,
> -         NULL, /* Class Data */
> -         sizeof (ViewOvBox),
> -         0, /* n_preallocs */
> -         (GInstanceInitFunc)ViewOvBoxInit,
> -         NULL,
> -      };
> -
> -      type = g_type_register_static(GTK_TYPE_BOX, "ViewOvBox", &info, 0);
> -   }
> -
> -   return type;
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBox_New --
> - *
> - *      Create a new ViewOvBox GTK+ widget.
> - *
> - * Results:
> - *      The widget
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -GtkWidget *
> -ViewOvBox_New(void)
> -{
> -   ViewOvBox *that;
> -
> -   that = VIEW_OV_BOX(g_object_new(VIEW_TYPE_OV_BOX, NULL));
> -
> -   return GTK_WIDGET(that);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBox_SetUnder --
> - *
> - *      Set the under widget of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewOvBox_SetUnder(ViewOvBox *that,   // IN
> -                   GtkWidget *widget) // IN
> -{
> -   g_return_if_fail(that != NULL);
> -
> -   ViewOvBoxSetChild(that, &that->priv->under, that->priv->underWin, widget);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBox_SetOver --
> - *
> - *      Set the over widget of a ViewOvBox.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewOvBox_SetOver(ViewOvBox *that,   // IN
> -                  GtkWidget *widget) // IN
> -{
> -   g_return_if_fail(that != NULL);
> -
> -   VIEW_OV_BOX_GET_CLASS(that)->set_over(that, widget);
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBox_SetMin --
> - *
> - *      Set the 'min' property of a ViewOvBox, i.e. the number of pixel of the
> - *      'over' child that should always be displayed without overlapping on the
> - *      'under' child.
> - *
> - *      Using a value of -1 displays the 'over' child entirely.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewOvBox_SetMin(ViewOvBox *that,  // IN
> -                 unsigned int min) // IN
> -{
> -   g_return_if_fail(that != NULL);
> -
> -   that->priv->min = min;
> -   gtk_widget_queue_resize(GTK_WIDGET(that));
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBox_SetFraction --
> - *
> - *      Set the 'fraction' property of a ViewOvBox, i.e. how much of the 'over'
> - *      child should overlap on the 'under' child.
> - *
> - * Results:
> - *      None
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -void
> -ViewOvBox_SetFraction(ViewOvBox *that, // IN
> -                      double fraction) // IN
> -{
> -   g_return_if_fail(that != NULL);
> -   g_return_if_fail(fraction >=0 && fraction <= 1);
> -
> -   that->priv->fraction = fraction;
> -   if (gtk_widget_get_realized(GTK_WIDGET (that))) {
> -      int x;
> -      int y;
> -      int width;
> -      int height;
> -
> -      ViewOvBoxGetOverGeometry(that, &x, &y, &width, &height);
> -      gdk_window_move(that->priv->overWin, x, y);
> -   }
> -}
> -
> -
> -/*
> - *-----------------------------------------------------------------------------
> - *
> - * ViewOvBox_GetFraction --
> - *
> - *      Retrieve the 'fraction' property of a ViewOvBox.
> - *
> - * Results:
> - *      The value
> - *
> - * Side effects:
> - *      None
> - *
> - *-----------------------------------------------------------------------------
> - */
> -
> -double
> -ViewOvBox_GetFraction(ViewOvBox *that)
> -{
> -   g_return_val_if_fail(that != NULL, 0);
> -
> -   return that->priv->fraction;
> -}
> diff --git a/src/view/ovBox.h b/src/view/ovBox.h
> deleted file mode 100644
> index 4fa61fd..0000000
> --- a/src/view/ovBox.h
> +++ /dev/null
> @@ -1,103 +0,0 @@
> -/* *************************************************************************
> - * Copyright (c) 2005 VMware, Inc.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining
> - * a copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sublicense, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be
> - * included in all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - * *************************************************************************/
> -
> -/*
> - * ovBox.h --
> - *
> - *      Declarations for the ViewOvBox GTK+ widget.
> - */
> -
> -
> -#ifndef LIBVIEW_OVBOX_H
> -#define LIBVIEW_OVBOX_H
> -
> -
> -#include <gtk/gtk.h>
> -
> -
> -#define VIEW_TYPE_OV_BOX            (ViewOvBox_GetType())
> -#define VIEW_OV_BOX(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), VIEW_TYPE_OV_BOX, ViewOvBox))
> -#define VIEW_OV_BOX_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), VIEW_TYPE_OV_BOX, ViewOvBoxClass))
> -#define VIEW_IS_OV_BOX(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), VIEW_TYPE_OV_BOX))
> -#define VIEW_IS_OV_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), VIEW_TYPE_OV_BOX))
> -#define VIEW_OV_BOX_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), VIEW_TYPE_OV_BOX, ViewOvBoxClass))
> -
> -typedef struct _ViewOvBoxPrivate ViewOvBoxPrivate;
> -
> -typedef struct _ViewOvBox {
> -   /* Must come first. */
> -   GtkBox parent;
> -
> -   /* Private. */
> -   ViewOvBoxPrivate *priv;
> -} ViewOvBox;
> -
> -
> -typedef struct _ViewOvBoxClass {
> -   /* Must come first. */
> -   GtkBoxClass parent;
> -
> -   /* Virtual methods. */
> -   void (* set_over)(ViewOvBox *ovBox, GtkWidget *widget);
> -
> -   /* Padding for future expansion */
> -   void (*_view_reserved0)(void);
> -   void (*_view_reserved1)(void);
> -   void (*_view_reserved2)(void);
> -   void (*_view_reserved3)(void);
> -} ViewOvBoxClass;
> -
> -
> -G_BEGIN_DECLS
> -
> -
> -GType
> -ViewOvBox_GetType(void);
> -
> -GtkWidget *
> -ViewOvBox_New(void);
> -
> -void
> -ViewOvBox_SetUnder(ViewOvBox *that,
> -                 GtkWidget *widget);
> -
> -void
> -ViewOvBox_SetOver(ViewOvBox *that,
> -                GtkWidget *widget);
> -
> -void
> -ViewOvBox_SetMin(ViewOvBox *that,
> -               unsigned int min);
> -
> -void
> -ViewOvBox_SetFraction(ViewOvBox *that,
> -                    double fraction);
> -
> -double
> -ViewOvBox_GetFraction(ViewOvBox *that);
> -
> -
> -G_END_DECLS
> -
> -
> -#endif /* LIBVIEW_OVBOX_H */
> diff --git a/src/virt-viewer-timed-revealer.c b/src/virt-viewer-timed-revealer.c
> new file mode 100644
> index 0000000..9124dad
> --- /dev/null
> +++ b/src/virt-viewer-timed-revealer.c
> @@ -0,0 +1,213 @@
> +/*
> + * Virt Viewer: A virtual machine console viewer
> + *
> + * Copyright (c) 2016 Red Hat, Inc.
> + *
> + * 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 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 General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> + *
> + * Author: Cole Robinson <crobinso at redhat.com>
> + * Author: Fabiano Fidêncio <fidencio at redhat.com>
> + */
> +
> +#include <config.h>
> +
> +#include "virt-viewer-timed-revealer.h"
> +
> +G_DEFINE_TYPE (VirtViewerTimedRevealer, virt_viewer_timed_revealer, G_TYPE_OBJECT)
> +
> +#define VIRT_VIEWER_TIMED_REVEALER_GET_PRIVATE(obj) \
> +    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), VIRT_VIEWER_TYPE_TIMED_REVEALER, VirtViewerTimedRevealerPrivate))
> +
> +struct _VirtViewerTimedRevealerPrivate
> +{
> +    gboolean fullscreen;
> +    guint timeout_id;
> +
> +    GtkWidget *revealer;
> +    GtkWidget *evBox;
> +};
> +
> +static void
> +virt_viewer_timed_revealer_unregister_timeout(VirtViewerTimedRevealer *self)
> +{
> +    VirtViewerTimedRevealerPrivate *priv = self->priv;
> +
> +    if (priv->timeout_id) {
> +        g_source_remove(priv->timeout_id);
> +        priv->timeout_id = 0;
> +    }
> +}
> +
> +static gboolean
> +schedule_unreveal_timeout_cb(VirtViewerTimedRevealer *self)
> +{
> +    VirtViewerTimedRevealerPrivate *priv = self->priv;
> +
> +    gtk_revealer_set_reveal_child(GTK_REVEALER(priv->revealer), FALSE);
> +    priv->timeout_id = 0;
> +
> +    return FALSE;
> +}
> +
> +static void
> +virt_viewer_timed_revealer_schedule_unreveal_timeout(VirtViewerTimedRevealer *self,
> +                                                     guint timeout)
> +{
> +    VirtViewerTimedRevealerPrivate *priv = self->priv;
> +
> +    if (priv->timeout_id != 0)
> +        return;
> +
> +    priv->timeout_id = g_timeout_add(timeout,
> +                                     (GSourceFunc)schedule_unreveal_timeout_cb,
> +                                     self);
> +}
> +
> +static gboolean
> +virt_viewer_timed_revealer_enter_leave_notify(GtkWidget *evBox,
> +                                              GdkEventCrossing *event,
> +                                              VirtViewerTimedRevealer *self)
> +{
> +    VirtViewerTimedRevealerPrivate *priv = self->priv;
> +    GdkDevice *device;
> +    GtkAllocation allocation;
> +    gint x, y;
> +    gboolean entered;
> +
> +    if (!priv->fullscreen)
> +        return FALSE;
> +
> +    device = gdk_event_get_device((GdkEvent *)event);
> +
> +    gdk_window_get_device_position(event->window, device, &x, &y, 0);
> +    gtk_widget_get_allocation(evBox, &allocation);
> +
> +    entered = !!(x >= 0 && y >= 0 && x < allocation.width && y < allocation.height);
> +
> +    /*
> +     * Pointer exited the toolbar, and toolbar is revealed. Schedule
> +     * a timeout to close it, if one isn't already scheduled.
> +     */
> +    if (!entered && gtk_revealer_get_reveal_child(GTK_REVEALER(priv->revealer))) {
> +        virt_viewer_timed_revealer_schedule_unreveal_timeout(self, 1000);
> +        return FALSE;
> +    }
> +
> +    virt_viewer_timed_revealer_unregister_timeout(self);
> +    if (entered && !gtk_revealer_get_reveal_child(GTK_REVEALER(priv->revealer))) {
> +        gtk_revealer_set_reveal_child(GTK_REVEALER(priv->revealer), TRUE);
> +    }
> +
> +    return FALSE;
> +}
> +
> +static void
> +virt_viewer_timed_revealer_init(VirtViewerTimedRevealer *self)
> +{
> +    self->priv = VIRT_VIEWER_TIMED_REVEALER_GET_PRIVATE(self);
> +}
> +
> +static void
> +virt_viewer_timed_revealer_dispose(GObject *object)
> +{
> +    VirtViewerTimedRevealer *self = VIRT_VIEWER_TIMED_REVEALER(object);
> +    VirtViewerTimedRevealerPrivate *priv = self->priv;
> +
> +    g_clear_object(&priv->evBox);
> +    g_clear_object(&priv->revealer);
> +
> +    if (priv->timeout_id) {
> +        g_source_remove(priv->timeout_id);
> +        priv->timeout_id = 0;
> +    }
> +
> +    G_OBJECT_CLASS(virt_viewer_timed_revealer_parent_class)->dispose(object);
> +}
> +
> +
> +static void
> +virt_viewer_timed_revealer_class_init(VirtViewerTimedRevealerClass *klass)
> +{
> +   GObjectClass *object_class = G_OBJECT_CLASS(klass);
> +
> +   g_type_class_add_private (klass, sizeof (VirtViewerTimedRevealerPrivate));
> +
> +   object_class->dispose = virt_viewer_timed_revealer_dispose;
> +}
> +
> +VirtViewerTimedRevealer *
> +virt_viewer_timed_revealer_new(GtkWidget *toolbar)
> +{
> +    VirtViewerTimedRevealer *self;
> +    VirtViewerTimedRevealerPrivate *priv;
> +
> +    self = g_object_new(VIRT_VIEWER_TYPE_TIMED_REVEALER, NULL);
> +
> +    priv = self->priv;
> +
> +    priv->fullscreen = FALSE;
> +    priv->timeout_id = 0;
> +
> +    priv->revealer = gtk_revealer_new();
> +    gtk_container_add(GTK_CONTAINER(priv->revealer), toolbar);
> +
> +    /*
> +     * Adding the revealer to the eventbox seems to ensure the
> +     * GtkEventBox always has 1 invisible pixel showing at the top of the
> +     * screen, which we can use to grab the pointer event to show
> +     * the hidden toolbar.
> +     */
> +
> +    priv->evBox = gtk_event_box_new();
> +    gtk_container_add(GTK_CONTAINER(priv->evBox), priv->revealer);
> +    gtk_widget_set_halign(priv->evBox, GTK_ALIGN_CENTER);
> +    gtk_widget_set_valign(priv->evBox, GTK_ALIGN_START);
> +    gtk_widget_show_all(priv->evBox);
> +
> +    g_signal_connect(priv->evBox,
> +                     "enter-notify-event",
> +                     G_CALLBACK(virt_viewer_timed_revealer_enter_leave_notify),
> +                     self);
> +    g_signal_connect(priv->evBox,
> +                     "leave-notify-event",
> +                     G_CALLBACK(virt_viewer_timed_revealer_enter_leave_notify),
> +                     self);
> +
> +    return self;
> +}
> +
> +void
> +virt_viewer_timed_revealer_force_reveal(VirtViewerTimedRevealer *self,
> +                                        gboolean fullscreen)
> +{
> +    VirtViewerTimedRevealerPrivate *priv;
> +
> +    g_return_if_fail(VIRT_VIEWER_IS_TIMED_REVEALER(self));
> +
> +    priv = self->priv;
> +
> +    virt_viewer_timed_revealer_unregister_timeout(self);
> +    priv->fullscreen = fullscreen;
> +    gtk_revealer_set_reveal_child(GTK_REVEALER(priv->revealer), fullscreen);
> +    virt_viewer_timed_revealer_schedule_unreveal_timeout(self, 2000);
> +}
> +
> +GtkWidget *
> +virt_viewer_timed_revealer_get_overlay_widget(VirtViewerTimedRevealer *self)
> +{
> +    g_return_val_if_fail(VIRT_VIEWER_IS_TIMED_REVEALER(self), NULL);
> +
> +    return self->priv->evBox;
> +}
> diff --git a/src/virt-viewer-timed-revealer.h b/src/virt-viewer-timed-revealer.h
> new file mode 100644
> index 0000000..6720a63
> --- /dev/null
> +++ b/src/virt-viewer-timed-revealer.h
> @@ -0,0 +1,74 @@
> +/*
> + * Virt Viewer: A virtual machine console viewer
> + *
> + * Copyright (c) 2016 Red Hat, Inc.
> + *
> + * 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 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 General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> + *
> + * Author: Cole Robinson <crobinso at redhat.com>
> + * Author: Fabiano Fidêncio <fidencio at redhat.com>
> + */
> +
> +#ifndef _VIRT_VIEWER_TIMED_REVEALER_H
> +#define _VIRT_VIEWER_TIMED_REVEALER_H
> +
> +#include <glib-object.h>
> +#include <gtk/gtk.h>
> +
> +G_BEGIN_DECLS
> +
> +#define VIRT_VIEWER_TYPE_TIMED_REVEALER virt_viewer_timed_revealer_get_type()
> +
> +#define VIRT_VIEWER_TIMED_REVEALER(obj) \
> +    (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIRT_VIEWER_TYPE_TIMED_REVEALER, VirtViewerTimedRevealer))
> +
> +#define VIRT_VIEWER_TIMED_REVEALER_CLASS(klass) \
> +    (G_TYPE_CHECK_CLASS_CAST ((klass), VIRT_VIEWER_TYPE_TIMED_REVEALER, VirtViewerTimedRevealerClass))
> +
> +#define VIRT_VIEWER_IS_TIMED_REVEALER(obj) \
> +    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIRT_VIEWER_TYPE_TIMED_REVEALER))
> +
> +#define VIRT_VIEWER_IS_TIMED_REVEALER_CLASS(klass) \
> +    (G_TYPE_CHECK_CLASS_TYPE ((klass), VIRT_VIEWER_TYPE_TIMED_REVEALER))
> +
> +#define VIRT_VIEWER_TIMED_REVEALER_GET_CLASS(obj) \
> +    (G_TYPE_INSTANCE_GET_CLASS ((obj), VIRT_VIEWER_TYPE_TIMED_REVEALER, VirtViewerTimedRevealerClass))
> +
> +typedef struct _VirtViewerTimedRevealerPrivate VirtViewerTimedRevealerPrivate;
> +
> +typedef struct {
> +    GObject parent;
> +    VirtViewerTimedRevealerPrivate *priv;
> +} VirtViewerTimedRevealer;
> +
> +typedef struct {
> +    GObjectClass parent_class;
> +} VirtViewerTimedRevealerClass;
> +
> +GType virt_viewer_timed_revealer_get_type (void);
> +
> +VirtViewerTimedRevealer *
> +virt_viewer_timed_revealer_new(GtkWidget *toolbar);
> +
> +void
> +virt_viewer_timed_revealer_force_reveal(VirtViewerTimedRevealer *self,
> +                                        gboolean fullscreen);
> +
> +GtkWidget *
> +virt_viewer_timed_revealer_get_overlay_widget(VirtViewerTimedRevealer *self);
> +
> +G_END_DECLS
> +
> +#endif /* _VIRT_VIEWER_TIMED_REVEALER_H */
> diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
> index 8ec2521..fa682c5 100644
> --- a/src/virt-viewer-window.c
> +++ b/src/virt-viewer-window.c
> @@ -41,7 +41,7 @@
>  #include "virt-viewer-session.h"
>  #include "virt-viewer-app.h"
>  #include "virt-viewer-util.h"
> -#include "view/autoDrawer.h"
> +#include "virt-viewer-timed-revealer.h"
>  
>  /* Signal handlers for main window (move in a VirtViewerMainWindow?) */
>  void virt_viewer_window_menu_view_zoom_out(GtkWidget *menu, VirtViewerWindow *self);
> @@ -89,13 +89,13 @@ struct _VirtViewerWindowPrivate {
>  
>      GtkBuilder *builder;
>      GtkWidget *window;
> -    GtkWidget *layout;
>      GtkWidget *toolbar;
>      GtkWidget *toolbar_usb_device_selection;
>      GtkWidget *toolbar_send_key;
>      GtkAccelGroup *accel_group;
>      VirtViewerNotebook *notebook;
>      VirtViewerDisplay *display;
> +    VirtViewerTimedRevealer *revealer;
>  
>      gboolean accel_enabled;
>      GValue accel_setting;
> @@ -186,6 +186,8 @@ virt_viewer_window_dispose (GObject *object)
>          priv->builder = NULL;
>      }
>  
> +    g_clear_object(&priv->revealer);
> +
>      for (it = priv->accel_list ; it != NULL ; it = it->next) {
>          g_object_unref(G_OBJECT(it->data));
>      }
> @@ -303,6 +305,8 @@ virt_viewer_window_init (VirtViewerWindow *self)
>      g_value_init(&priv->accel_setting, G_TYPE_STRING);
>  
>      priv->notebook = virt_viewer_notebook_new();
> +    gtk_widget_show(GTK_WIDGET(priv->notebook));
> +
>      priv->builder = virt_viewer_util_load_ui("virt-viewer.ui");
>  
>      gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-send")), FALSE);
> @@ -333,7 +337,7 @@ virt_viewer_window_init (VirtViewerWindow *self)
>      vbox = GTK_WIDGET(gtk_builder_get_object(priv->builder, "viewer-box"));
>      virt_viewer_window_toolbar_setup(self);
>  
> -    gtk_box_pack_end(GTK_BOX(vbox), priv->layout, TRUE, TRUE, 0);
> +    gtk_box_pack_end(GTK_BOX(vbox), GTK_WIDGET(priv->notebook), TRUE, TRUE, 0);
>      gdk_rgba_parse(&color, "black");
>      /* FIXME:
>       * This method has been deprecated in 3.16.
> @@ -342,7 +346,7 @@ virt_viewer_window_init (VirtViewerWindow *self)
>       * For the bug report about this deprecated function, please, see:
>       * https://bugs.freedesktop.org/show_bug.cgi?id=94276
>       */
> -    gtk_widget_override_background_color(priv->layout, GTK_STATE_FLAG_NORMAL, &color);
> +    gtk_widget_override_background_color(GTK_WIDGET(priv->notebook), GTK_STATE_FLAG_NORMAL, &color);
>  
>      priv->window = GTK_WIDGET(gtk_builder_get_object(priv->builder, "viewer"));
>      gtk_window_add_accel_group(GTK_WINDOW(priv->window), priv->accel_group);
> @@ -479,7 +483,7 @@ virt_viewer_window_leave_fullscreen(VirtViewerWindow *self)
>          virt_viewer_display_set_monitor(priv->display, -1);
>          virt_viewer_display_set_fullscreen(priv->display, FALSE);
>      }
> -    ViewAutoDrawer_SetActive(VIEW_AUTODRAWER(priv->layout), FALSE);
> +    virt_viewer_timed_revealer_force_reveal(priv->revealer, FALSE);
>      gtk_widget_show(menu);
>      gtk_widget_hide(priv->toolbar);
>      gtk_widget_set_size_request(priv->window, -1, -1);
> @@ -516,8 +520,7 @@ virt_viewer_window_enter_fullscreen(VirtViewerWindow *self, gint monitor)
>      virt_viewer_window_menu_fullscreen_set_active(self, TRUE);
>      gtk_widget_hide(menu);
>      gtk_widget_show(priv->toolbar);
> -    ViewAutoDrawer_SetActive(VIEW_AUTODRAWER(priv->layout), TRUE);
> -    ViewAutoDrawer_Close(VIEW_AUTODRAWER(priv->layout));
> +    virt_viewer_timed_revealer_force_reveal(priv->revealer, TRUE);
>  
>      if (priv->display) {
>          virt_viewer_display_set_monitor(priv->display, monitor);
> @@ -1065,6 +1068,7 @@ static void
>  virt_viewer_window_toolbar_setup(VirtViewerWindow *self)
>  {
>      GtkWidget *button;
> +    GtkWidget *overlay;
>      VirtViewerWindowPrivate *priv = self->priv;
>  
>      priv->toolbar = g_object_ref(gtk_toolbar_new());
> @@ -1110,16 +1114,10 @@ virt_viewer_window_toolbar_setup(VirtViewerWindow *self)
>      gtk_toolbar_insert(GTK_TOOLBAR(priv->toolbar), GTK_TOOL_ITEM(button), 0);
>      g_signal_connect(button, "clicked", G_CALLBACK(virt_viewer_window_toolbar_leave_fullscreen), self);
>  
> -    priv->layout = ViewAutoDrawer_New();
> -
> -    ViewAutoDrawer_SetActive(VIEW_AUTODRAWER(priv->layout), FALSE);
> -    ViewOvBox_SetOver(VIEW_OV_BOX(priv->layout), priv->toolbar);
> -    ViewOvBox_SetUnder(VIEW_OV_BOX(priv->layout), GTK_WIDGET(priv->notebook));
> -    ViewAutoDrawer_SetOffset(VIEW_AUTODRAWER(priv->layout), -1);
> -    ViewAutoDrawer_SetFill(VIEW_AUTODRAWER(priv->layout), FALSE);
> -    ViewAutoDrawer_SetOverlapPixels(VIEW_AUTODRAWER(priv->layout), 1);
> -    ViewAutoDrawer_SetNoOverlapPixels(VIEW_AUTODRAWER(priv->layout), 0);
> -    gtk_widget_show(priv->layout);
> +    priv->revealer = virt_viewer_timed_revealer_new(priv->toolbar);
> +    overlay = GTK_WIDGET(gtk_builder_get_object(priv->builder, "viewer-overlay"));
> +    gtk_overlay_add_overlay(GTK_OVERLAY(overlay),
> +                            virt_viewer_timed_revealer_get_overlay_widget(priv->revealer));
>  }
>  
>  VirtViewerNotebook*
> @@ -1357,9 +1355,7 @@ virt_viewer_window_enable_kiosk(VirtViewerWindow *self)
>      g_return_if_fail(VIRT_VIEWER_IS_WINDOW(self));
>      priv = self->priv;
>  
> -    ViewOvBox_SetOver(VIEW_OV_BOX(priv->layout), gtk_drawing_area_new());
> -    ViewAutoDrawer_SetActive(VIEW_AUTODRAWER(priv->layout), FALSE);
> -    ViewAutoDrawer_SetOverlapPixels(VIEW_AUTODRAWER(priv->layout), 0);
> +    virt_viewer_timed_revealer_force_reveal(priv->revealer, FALSE);
>  
>      /* You probably also want X11 Option "DontVTSwitch" "true" */
>      /* and perhaps more distro/desktop-specific options */
> 


-- 
Eduardo de Barros Lima (Etrunko)
Software Engineer - RedHat
etrunko at redhat.com




More information about the virt-tools-list mailing list