[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