Acked-by: Eduardo Lima (Etrunko) <etrunko@xxxxxxxxxx> 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@xxxxxxxxxx> > --- > 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@xxxxxxxxxx> > + * Author: Fabiano Fidêncio <fidencio@xxxxxxxxxx> > + */ > + > +#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@xxxxxxxxxx> > + * Author: Fabiano Fidêncio <fidencio@xxxxxxxxxx> > + */ > + > +#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@xxxxxxxxxx _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list