This is an automated email from the git hooks/post-receive script.

nomad pushed a commit to annotated tag 0.2.2
in repository apps/xfdashboard.

commit f63b5d3c88fd575100d6ca11eb633631ae2de744
Author: Stephan Haller <[email protected]>
Date:   Tue Aug 12 20:35:24 2014 +0200

    Split key handling function into "specialized" functions
    
    Split key handling function in XfdashboardFocusable into "specialized" 
functions for 'key-press' and 'key-release' events. This make handling 
repeative 'key-press' event easier and cleaner (code), e.g. for moving 
selection when key is pressed and hold pressed. 'key-release' is only called 
once when pressed key is released.
---
 src/applications-view.c  |   75 +++++++++------
 src/focus-manager.c      |   24 ++++-
 src/focusable.c          |   78 +++++++++++++--
 src/focusable.h          |    5 +-
 src/quicklaunch.c        |  104 +++++++++++---------
 src/search-view.c        |   88 ++++++++++-------
 src/text-box.c           |   75 ++++++++++-----
 src/viewpad.c            |   45 ++++++++-
 src/windows-view.c       |  238 ++++++++++++++++++++++++----------------------
 src/workspace-selector.c |  101 ++++++++++++--------
 10 files changed, 530 insertions(+), 303 deletions(-)

diff --git a/src/applications-view.c b/src/applications-view.c
index 3ee648b..0abfd2b 100644
--- a/src/applications-view.c
+++ b/src/applications-view.c
@@ -667,8 +667,8 @@ static gboolean 
_xfdashboard_applications_view_focusable_handle_key_event_at_lis
        return(CLUTTER_EVENT_STOP);
 }
 
-static gboolean 
_xfdashboard_applications_view_focusable_handle_key_event(XfdashboardFocusable 
*inFocusable,
-                                                                               
                                                                        const 
ClutterEvent *inEvent)
+static gboolean 
_xfdashboard_applications_view_focusable_handle_keypress_event(XfdashboardFocusable
 *inFocusable,
+                                                                               
                                                                                
const ClutterEvent *inEvent)
 {
        XfdashboardApplicationsView                             *self;
        XfdashboardApplicationsViewPrivate              *priv;
@@ -680,40 +680,52 @@ static gboolean 
_xfdashboard_applications_view_focusable_handle_key_event(Xfdash
        self=XFDASHBOARD_APPLICATIONS_VIEW(inFocusable);
        priv=self->priv;
 
-       /* Handle key events when key was released */
-       if(clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE)
+       /* Move selection if an arrow key was pressed */
+       if(priv->viewMode==XFDASHBOARD_VIEW_MODE_LIST)
        {
-               /* Start selected application on ENTER */
-               switch(inEvent->key.keyval)
+               
handledEvent=_xfdashboard_applications_view_focusable_handle_key_event_at_list_mode(self,
 inEvent);
+       }
+               else
                {
-                       case CLUTTER_KEY_Return:
-                       case CLUTTER_KEY_KP_Enter:
-                       case CLUTTER_KEY_ISO_Enter:
-                               if(priv->selectedItem)
-                               {
-                                       
if(XFDASHBOARD_IS_APPLICATION_BUTTON(priv->selectedItem))
-                                       {
-                                               
_xfdashboard_applications_view_on_item_clicked(self, 
XFDASHBOARD_APPLICATION_BUTTON(priv->selectedItem));
-                                       }
-                                               else 
if(XFDASHBOARD_IS_BUTTON(priv->selectedItem))
-                                               {
-                                                       
_xfdashboard_applications_view_on_parent_menu_clicked(self, 
XFDASHBOARD_BUTTON(priv->selectedItem));
-                                               }
-                               }
-                               return(CLUTTER_EVENT_STOP);
+                       
handledEvent=_xfdashboard_applications_view_focusable_handle_key_event_at_icon_mode(self,
 inEvent);
                }
 
-               /* Move selection if an arrow key was pressed */
-               if(priv->viewMode==XFDASHBOARD_VIEW_MODE_LIST)
-               {
-                       
handledEvent=_xfdashboard_applications_view_focusable_handle_key_event_at_list_mode(self,
 inEvent);
-               }
-                       else
+       if(handledEvent==CLUTTER_EVENT_STOP) return(handledEvent);
+
+       /* We did not handle this event */
+       return(CLUTTER_EVENT_PROPAGATE);
+}
+
+static gboolean 
_xfdashboard_applications_view_focusable_handle_keyrelease_event(XfdashboardFocusable
 *inFocusable,
+                                                                               
                                                                                
        const ClutterEvent *inEvent)
+{
+       XfdashboardApplicationsView                             *self;
+       XfdashboardApplicationsViewPrivate              *priv;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(XFDASHBOARD_IS_APPLICATIONS_VIEW(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_APPLICATIONS_VIEW(inFocusable);
+       priv=self->priv;
+
+       /* Start selected application on ENTER */
+       switch(inEvent->key.keyval)
+       {
+               case CLUTTER_KEY_Return:
+               case CLUTTER_KEY_KP_Enter:
+               case CLUTTER_KEY_ISO_Enter:
+                       if(priv->selectedItem)
                        {
-                               
handledEvent=_xfdashboard_applications_view_focusable_handle_key_event_at_icon_mode(self,
 inEvent);
+                               
if(XFDASHBOARD_IS_APPLICATION_BUTTON(priv->selectedItem))
+                               {
+                                       
_xfdashboard_applications_view_on_item_clicked(self, 
XFDASHBOARD_APPLICATION_BUTTON(priv->selectedItem));
+                               }
+                                       else 
if(XFDASHBOARD_IS_BUTTON(priv->selectedItem))
+                                       {
+                                               
_xfdashboard_applications_view_on_parent_menu_clicked(self, 
XFDASHBOARD_BUTTON(priv->selectedItem));
+                                       }
                        }
-
-               if(handledEvent==CLUTTER_EVENT_STOP) return(handledEvent);
+                       return(CLUTTER_EVENT_STOP);
        }
 
        /* We did not handle this event */
@@ -728,7 +740,8 @@ void 
_xfdashboard_applications_view_focusable_iface_init(XfdashboardFocusableInt
        iface->can_focus=_xfdashboard_applications_view_focusable_can_focus;
        iface->set_focus=_xfdashboard_applications_view_focusable_set_focus;
        iface->unset_focus=_xfdashboard_applications_view_focusable_unset_focus;
-       
iface->handle_key_event=_xfdashboard_applications_view_focusable_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_applications_view_focusable_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_applications_view_focusable_handle_keyrelease_event;
 }
 
 /* IMPLEMENTATION: GObject */
diff --git a/src/focus-manager.c b/src/focus-manager.c
index 27ee3b7..8f623f6 100644
--- a/src/focus-manager.c
+++ b/src/focus-manager.c
@@ -580,7 +580,29 @@ gboolean 
xfdashboard_focus_manager_handle_key_event(XfdashboardFocusManager *sel
        /* Synthesize event for current focused focusable actor */
        if(priv->currentFocus)
        {
-               
return(xfdashboard_focusable_handle_key_event(priv->currentFocus, inEvent));
+               gboolean                                        handled;
+
+               handled=CLUTTER_EVENT_PROPAGATE;
+
+               /* Try handler function depending on key event type */
+               switch(clutter_event_type(inEvent))
+               {
+                       case CLUTTER_KEY_PRESS:
+                               
handled=xfdashboard_focusable_handle_keypress_event(priv->currentFocus, 
inEvent);
+                               break;
+
+                       case CLUTTER_KEY_RELEASE:
+                               
handled=xfdashboard_focusable_handle_keyrelease_event(priv->currentFocus, 
inEvent);
+                               break;
+
+                       default:
+                               /* We should never get here */
+                               g_assert_not_reached();
+                               break;
+               }
+
+               /* Return handling result */
+               return(handled);
        }
 
        /* If we get here there is no focus set */
diff --git a/src/focusable.c b/src/focusable.c
index 9e43752..7f6332b 100644
--- a/src/focusable.c
+++ b/src/focusable.c
@@ -61,8 +61,18 @@ static void 
_xfdashboard_focusable_real_unset_focus(XfdashboardFocusable *self)
        /* By default (if not overidden) do nothing */
 }
 
-/* Default implementation of virtual function "handle_key_event" */
-static gboolean 
_xfdashboard_focusable_real_handle_key_event(XfdashboardFocusable *self, const 
ClutterEvent *inEvent)
+/* Default implementation of virtual function "handle_keypress_event" */
+static gboolean 
_xfdashboard_focusable_real_handle_keypress_event(XfdashboardFocusable *self, 
const ClutterEvent *inEvent)
+{
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(self), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(CLUTTER_IS_ACTOR(self), CLUTTER_EVENT_PROPAGATE);
+
+       /* By default synthesize event to focusable actor */
+       return(clutter_actor_event(CLUTTER_ACTOR(self), inEvent, FALSE));
+}
+
+/* Default implementation of virtual function "handle_keyrelease_event" */
+static gboolean 
_xfdashboard_focusable_real_handle_keyrelease_event(XfdashboardFocusable *self, 
const ClutterEvent *inEvent)
 {
        g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(self), 
CLUTTER_EVENT_PROPAGATE);
        g_return_val_if_fail(CLUTTER_IS_ACTOR(self), CLUTTER_EVENT_PROPAGATE);
@@ -86,7 +96,8 @@ void 
xfdashboard_focusable_default_init(XfdashboardFocusableInterface *iface)
         */
        iface->can_focus=_xfdashboard_focusable_real_can_focus;
        iface->unset_focus=_xfdashboard_focusable_real_unset_focus;
-       iface->handle_key_event=_xfdashboard_focusable_real_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_focusable_real_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_focusable_real_handle_keyrelease_event;
 }
 
 /* Implementation: Public API */
@@ -151,22 +162,71 @@ void 
xfdashboard_focusable_unset_focus(XfdashboardFocusable *self)
        XFDASHBOARD_FOCUSABLE_WARN_NOT_IMPLEMENTED(self, "unset_focus");
 }
 
-/* Call virtual function "handle_key_event" */
+/* Call key handling function depending on key event type */
 gboolean xfdashboard_focusable_handle_key_event(XfdashboardFocusable *self, 
const ClutterEvent *inEvent)
 {
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(self), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(inEvent, CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(clutter_event_type(inEvent)==CLUTTER_KEY_PRESS ||
+                                                       
clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE, CLUTTER_EVENT_PROPAGATE);
+
+       switch(clutter_event_type(inEvent))
+       {
+               case CLUTTER_KEY_PRESS:
+                       
return(xfdashboard_focusable_handle_keypress_event(self, inEvent));
+
+               case CLUTTER_KEY_RELEASE:
+                       
return(xfdashboard_focusable_handle_keyrelease_event(self, inEvent));
+
+               default:
+                       /* We should never get here */
+                       g_assert_not_reached();
+                       break;
+       }
+
+       return(CLUTTER_EVENT_PROPAGATE);
+}
+
+/* Call virtual function "handle_keypress_event" */
+gboolean xfdashboard_focusable_handle_keypress_event(XfdashboardFocusable 
*self, const ClutterEvent *inEvent)
+{
        XfdashboardFocusableInterface           *iface;
 
-       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(self), FALSE);
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(self), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(inEvent, CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(clutter_event_type(inEvent)==CLUTTER_KEY_PRESS, 
CLUTTER_EVENT_PROPAGATE);
 
        iface=XFDASHBOARD_FOCUSABLE_GET_IFACE(self);
 
        /* Call virtual function */
-       if(iface->handle_key_event)
+       if(iface->handle_keypress_event)
        {
-               return(iface->handle_key_event(self, inEvent));
+               return(iface->handle_keypress_event(self, inEvent));
        }
 
        /* If we get here the virtual function was not overridden */
-       XFDASHBOARD_FOCUSABLE_WARN_NOT_IMPLEMENTED(self, "handle_key_event");
-       return(FALSE);
+       XFDASHBOARD_FOCUSABLE_WARN_NOT_IMPLEMENTED(self, 
"handle_keypress_event");
+       return(CLUTTER_EVENT_PROPAGATE);
+}
+
+/* Call virtual function "handle_keypress_event" */
+gboolean xfdashboard_focusable_handle_keyrelease_event(XfdashboardFocusable 
*self, const ClutterEvent *inEvent)
+{
+       XfdashboardFocusableInterface           *iface;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(self), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(inEvent, CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE, 
CLUTTER_EVENT_PROPAGATE);
+
+       iface=XFDASHBOARD_FOCUSABLE_GET_IFACE(self);
+
+       /* Call virtual function */
+       if(iface->handle_keyrelease_event)
+       {
+               return(iface->handle_keyrelease_event(self, inEvent));
+       }
+
+       /* If we get here the virtual function was not overridden */
+       XFDASHBOARD_FOCUSABLE_WARN_NOT_IMPLEMENTED(self, 
"handle_keyrelease_event");
+       return(CLUTTER_EVENT_PROPAGATE);
 }
diff --git a/src/focusable.h b/src/focusable.h
index e75ea1a..c25d86d 100644
--- a/src/focusable.h
+++ b/src/focusable.h
@@ -49,7 +49,8 @@ struct _XfdashboardFocusableInterface
        void (*set_focus)(XfdashboardFocusable *self);
        void (*unset_focus)(XfdashboardFocusable *self);
 
-       gboolean (*handle_key_event)(XfdashboardFocusable *self, const 
ClutterEvent *inEvent);
+       gboolean (*handle_keypress_event)(XfdashboardFocusable *self, const 
ClutterEvent *inEvent);
+       gboolean (*handle_keyrelease_event)(XfdashboardFocusable *self, const 
ClutterEvent *inEvent);
 };
 
 /* Public API */
@@ -60,6 +61,8 @@ void xfdashboard_focusable_set_focus(XfdashboardFocusable 
*self);
 void xfdashboard_focusable_unset_focus(XfdashboardFocusable *self);
 
 gboolean xfdashboard_focusable_handle_key_event(XfdashboardFocusable *self, 
const ClutterEvent *inEvent);
+gboolean xfdashboard_focusable_handle_keypress_event(XfdashboardFocusable 
*self, const ClutterEvent *inEvent);
+gboolean xfdashboard_focusable_handle_keyrelease_event(XfdashboardFocusable 
*self, const ClutterEvent *inEvent);
 
 G_END_DECLS
 
diff --git a/src/quicklaunch.c b/src/quicklaunch.c
index ea1b55a..eac4c6e 100644
--- a/src/quicklaunch.c
+++ b/src/quicklaunch.c
@@ -1455,9 +1455,9 @@ static void 
_xfdashboard_quicklaunch_focusable_unset_focus(XfdashboardFocusable
        }
 }
 
-/* Virtual function "handle_key_event" was called */
-static gboolean 
_xfdashboard_quicklaunch_focusable_handle_key_event(XfdashboardFocusable 
*inFocusable,
-                                                                               
                                                        const ClutterEvent 
*inEvent)
+/* Virtual function "handle_keypress_event" was called */
+static gboolean 
_xfdashboard_quicklaunch_focusable_handle_keypress_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                        const 
ClutterEvent *inEvent)
 {
        XfdashboardQuicklaunch                                  *self;
        XfdashboardQuicklaunchPrivate                   *priv;
@@ -1469,17 +1469,35 @@ static gboolean 
_xfdashboard_quicklaunch_focusable_handle_key_event(XfdashboardF
        self=XFDASHBOARD_QUICKLAUNCH(inFocusable);
        priv=self->priv;
 
-       /* Handle key events when key was released */
-       if(clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE)
+       /* Move selection if an arrow key was pressed which makes sense
+        * for orientation set
+        */
+       if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Up) ||
+               (priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Left))
        {
-               /* Move selection if an arrow key was pressed which makes sense
-                * for orientation set
-                */
-               if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Up) ||
-                       (priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Left))
+               /* Find previous item to select and set style to it but also 
unstyle previous one */
+               newItem=xfdashboard_quicklaunch_get_previous_selectable(self, 
priv->selectedItem);
+               if(newItem && newItem!=priv->selectedItem)
+               {
+                       /* Unset current selected item if any */
+                       if(priv->selectedItem)
+                       {
+                               
xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem),
 "selected");
+                       }
+
+                       /* Set new current selected item */
+                       priv->selectedItem=newItem;
+                       
xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem), 
"selected");
+               }
+
+               /* Event handled */
+               return(CLUTTER_EVENT_STOP);
+       }
+               else if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Down) ||
+                               
(priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Right))
                {
-                       /* Find previous item to select and set style to it but 
also unstyle previous one */
-                       
newItem=xfdashboard_quicklaunch_get_previous_selectable(self, 
priv->selectedItem);
+                       /* Find next item to select and set style to it but 
also unstyle previous one */
+                       
newItem=xfdashboard_quicklaunch_get_next_selectable(self, priv->selectedItem);
                        if(newItem && newItem!=priv->selectedItem)
                        {
                                /* Unset current selected item if any */
@@ -1496,42 +1514,37 @@ static gboolean 
_xfdashboard_quicklaunch_focusable_handle_key_event(XfdashboardF
                        /* Event handled */
                        return(CLUTTER_EVENT_STOP);
                }
-                       else 
if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Down) ||
-                                       
(priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Right))
-                       {
-                               /* Find next item to select and set style to it 
but also unstyle previous one */
-                               
newItem=xfdashboard_quicklaunch_get_next_selectable(self, priv->selectedItem);
-                               if(newItem && newItem!=priv->selectedItem)
-                               {
-                                       /* Unset current selected item if any */
-                                       if(priv->selectedItem)
-                                       {
-                                               
xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem),
 "selected");
-                                       }
-
-                                       /* Set new current selected item */
-                                       priv->selectedItem=newItem;
-                                       
xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem), 
"selected");
-                               }
 
-                               /* Event handled */
-                               return(CLUTTER_EVENT_STOP);
-                       }
+       /* We did not handle this event */
+       return(CLUTTER_EVENT_PROPAGATE);
+}
 
-               /* Activate workspace on ENTER */
-               if(inEvent->key.keyval==CLUTTER_KEY_Return ||
-                       inEvent->key.keyval==CLUTTER_KEY_KP_Enter ||
-                       inEvent->key.keyval==CLUTTER_KEY_ISO_Enter)
-               {
-                       /* Emit "clicked" signal at selected item */
-                       if(priv->selectedItem)
-                       {
-                               g_signal_emit_by_name(priv->selectedItem, 
"clicked");
-                       }
+/* Virtual function "handle_keyrelease_event" was called */
+static gboolean 
_xfdashboard_quicklaunch_focusable_handle_keyrelease_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                        const 
ClutterEvent *inEvent)
+{
+       XfdashboardQuicklaunch                                  *self;
+       XfdashboardQuicklaunchPrivate                   *priv;
 
-                       /* Event handled */
-                       return(CLUTTER_EVENT_STOP);
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(XFDASHBOARD_IS_QUICKLAUNCH(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_QUICKLAUNCH(inFocusable);
+       priv=self->priv;
+
+       /* Activate selected icon on ENTER */
+       if(inEvent->key.keyval==CLUTTER_KEY_Return ||
+               inEvent->key.keyval==CLUTTER_KEY_KP_Enter ||
+               inEvent->key.keyval==CLUTTER_KEY_ISO_Enter)
+       {
+               /* Emit "clicked" signal at selected item */
+               if(priv->selectedItem)
+               {
+                       g_signal_emit_by_name(priv->selectedItem, "clicked");
                }
+
+               /* Event handled */
+               return(CLUTTER_EVENT_STOP);
        }
 
        /* We did not handle this event */
@@ -1545,7 +1558,8 @@ void 
_xfdashboard_quicklaunch_focusable_iface_init(XfdashboardFocusableInterface
 {
        iface->set_focus=_xfdashboard_quicklaunch_focusable_set_focus;
        iface->unset_focus=_xfdashboard_quicklaunch_focusable_unset_focus;
-       
iface->handle_key_event=_xfdashboard_quicklaunch_focusable_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_quicklaunch_focusable_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_quicklaunch_focusable_handle_keyrelease_event;
 }
 
 /* IMPLEMENTATION: GObject */
diff --git a/src/search-view.c b/src/search-view.c
index 935b271..de6f6ab 100644
--- a/src/search-view.c
+++ b/src/search-view.c
@@ -754,8 +754,8 @@ static void 
_xfdashboard_search_view_focusable_unset_focus(XfdashboardFocusable
 }
 
 /* Virtual function "handle_key_event" was called */
-static gboolean 
_xfdashboard_search_view_focusable_handle_key_event(XfdashboardFocusable 
*inFocusable,
-                                                                               
                                                        const ClutterEvent 
*inEvent)
+static gboolean 
_xfdashboard_search_view_focusable_handle_keypress_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                        const 
ClutterEvent *inEvent)
 {
        XfdashboardSearchView                   *self;
        XfdashboardSearchViewPrivate    *priv;
@@ -770,38 +770,12 @@ static gboolean 
_xfdashboard_search_view_focusable_handle_key_event(XfdashboardF
 
        /* Handle key events at container of selected provider */
        if(priv->selectionProvider &&
-               priv->selectionProvider->container &&
-               clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE)
+               priv->selectionProvider->container)
        {
-               ClutterActor                            *currentSelection;
                ClutterActor                            *newSelection;
                gboolean                                        doGetPrevious;
                gint                                            
selectionDirection;
 
-               /* Emit click on current selection when ENTER was pressed */
-               switch(inEvent->key.keyval)
-               {
-                       case CLUTTER_KEY_Return:
-                       case CLUTTER_KEY_KP_Enter:
-                       case CLUTTER_KEY_ISO_Enter:
-                               /* Get current selection to lookup mapping */
-                               
currentSelection=xfdashboard_search_result_container_get_current_selection(XFDASHBOARD_SEARCH_RESULT_CONTAINER(priv->selectionProvider->container));
-                               if(currentSelection)
-                               {
-                                       
XfdashboardSearchViewProviderItemsMapping       *mapping;
-
-                                       /* Get mapping of current selection to 
determine actor where to emit click action */
-                                       
mapping=_xfdashboard_search_view_provider_data_get_mapping_by_actor(priv->selectionProvider,
 currentSelection);
-                                       if(mapping)
-                                       {
-                                               
_xfdashboard_search_view_on_provider_item_actor_clicked(XFDASHBOARD_CLICK_ACTION(mapping->clickAction),
-                                                                               
                                                                                
mapping->actor,
-                                                                               
                                                                                
mapping);
-                                       }
-                               }
-                               return(CLUTTER_EVENT_STOP);
-               }
-
                /* Move selection if an corresponding key was pressed */
                switch(inEvent->key.keyval)
                {
@@ -835,9 +809,6 @@ static gboolean 
_xfdashboard_search_view_focusable_handle_key_event(XfdashboardF
 
                if(handledEvent==CLUTTER_EVENT_STOP)
                {
-                       /* Get current selection to determine if selection has 
changed */
-                       
currentSelection=xfdashboard_search_result_container_get_current_selection(XFDASHBOARD_SEARCH_RESULT_CONTAINER(priv->selectionProvider->container));
-
                        /* Get new selection */
                        if(doGetPrevious)
                        {
@@ -916,6 +887,56 @@ static gboolean 
_xfdashboard_search_view_focusable_handle_key_event(XfdashboardF
        return(handledEvent);
 }
 
+/* Virtual function "handle_keyrelease_event" was called */
+static gboolean 
_xfdashboard_search_view_focusable_handle_keyrelease_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                        const 
ClutterEvent *inEvent)
+{
+       XfdashboardSearchView                   *self;
+       XfdashboardSearchViewPrivate    *priv;
+       gboolean                                                handledEvent;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_VIEW(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_SEARCH_VIEW(inFocusable);
+       priv=self->priv;
+       handledEvent=CLUTTER_EVENT_PROPAGATE;
+
+       /* Handle key events at container of selected provider */
+       if(priv->selectionProvider &&
+               priv->selectionProvider->container)
+       {
+               ClutterActor                            *currentSelection;
+
+               /* Emit click on current selection when ENTER was pressed */
+               switch(inEvent->key.keyval)
+               {
+                       case CLUTTER_KEY_Return:
+                       case CLUTTER_KEY_KP_Enter:
+                       case CLUTTER_KEY_ISO_Enter:
+                               /* Get current selection to lookup mapping */
+                               
currentSelection=xfdashboard_search_result_container_get_current_selection(XFDASHBOARD_SEARCH_RESULT_CONTAINER(priv->selectionProvider->container));
+                               if(currentSelection)
+                               {
+                                       
XfdashboardSearchViewProviderItemsMapping       *mapping;
+
+                                       /* Get mapping of current selection to 
determine actor where to emit click action */
+                                       
mapping=_xfdashboard_search_view_provider_data_get_mapping_by_actor(priv->selectionProvider,
 currentSelection);
+                                       if(mapping)
+                                       {
+                                               
_xfdashboard_search_view_on_provider_item_actor_clicked(XFDASHBOARD_CLICK_ACTION(mapping->clickAction),
+                                                                               
                                                                                
mapping->actor,
+                                                                               
                                                                                
mapping);
+                                       }
+                               }
+                               return(CLUTTER_EVENT_STOP);
+               }
+       }
+
+       /* Return result of key handling */
+       return(handledEvent);
+}
+
 /* Interface initialization
  * Set up default functions
  */
@@ -924,7 +945,8 @@ void 
_xfdashboard_search_view_focusable_iface_init(XfdashboardFocusableInterface
        iface->can_focus=_xfdashboard_search_view_focusable_can_focus;
        iface->set_focus=_xfdashboard_search_view_focusable_set_focus;
        iface->unset_focus=_xfdashboard_search_view_focusable_unset_focus;
-       
iface->handle_key_event=_xfdashboard_search_view_focusable_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_search_view_focusable_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_search_view_focusable_handle_keyrelease_event;
 }
 
 
diff --git a/src/text-box.c b/src/text-box.c
index 1664121..6f4ef3a 100644
--- a/src/text-box.c
+++ b/src/text-box.c
@@ -490,30 +490,6 @@ static gboolean 
_xfdashboard_text_box_focusable_can_focus(XfdashboardFocusable *
        return(FALSE);
 }
 
-/* Virtual function "handle_key_event" was called */
-static gboolean 
_xfdashboard_text_box_focusable_handle_key_event(XfdashboardFocusable 
*inFocusable,
-                                                                               
                                                        const ClutterEvent 
*inEvent)
-{
-       XfdashboardTextBox                      *self;
-       XfdashboardTextBoxPrivate       *priv;
-       gboolean                                        result;
-
-       g_return_val_if_fail(XFDASHBOARD_IS_TEXT_BOX(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
-
-       self=XFDASHBOARD_TEXT_BOX(inFocusable);
-       priv=self->priv;
-       result=CLUTTER_EVENT_PROPAGATE;
-
-       /* Push event to real text box if available */
-       if(priv->actorTextBox)
-       {
-               result=clutter_actor_event(priv->actorTextBox, inEvent, FALSE);
-       }
-
-       /* Return event handling result */
-       return(result);
-}
-
 /* Set focus to actor */
 static void _xfdashboard_text_box_focusable_set_focus(XfdashboardFocusable 
*inFocusable)
 {
@@ -584,6 +560,54 @@ static void 
_xfdashboard_text_box_focusable_unset_focus(XfdashboardFocusable *in
        clutter_stage_set_key_focus(stage, NULL);
 }
 
+/* Virtual function "handle_keypress_event" was called */
+static gboolean 
_xfdashboard_text_box_focusable_handle_keypress_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                const 
ClutterEvent *inEvent)
+{
+       XfdashboardTextBox                      *self;
+       XfdashboardTextBoxPrivate       *priv;
+       gboolean                                        result;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_TEXT_BOX(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_TEXT_BOX(inFocusable);
+       priv=self->priv;
+       result=CLUTTER_EVENT_PROPAGATE;
+
+       /* Push event to real text box if available */
+       if(priv->actorTextBox)
+       {
+               result=clutter_actor_event(priv->actorTextBox, inEvent, FALSE);
+       }
+
+       /* Return event handling result */
+       return(result);
+}
+
+/* Virtual function "handle_keyrelease_event" was called */
+static gboolean 
_xfdashboard_text_box_focusable_handle_keyrelease_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                const 
ClutterEvent *inEvent)
+{
+       XfdashboardTextBox                      *self;
+       XfdashboardTextBoxPrivate       *priv;
+       gboolean                                        result;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_TEXT_BOX(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_TEXT_BOX(inFocusable);
+       priv=self->priv;
+       result=CLUTTER_EVENT_PROPAGATE;
+
+       /* Push event to real text box if available */
+       if(priv->actorTextBox)
+       {
+               result=clutter_actor_event(priv->actorTextBox, inEvent, FALSE);
+       }
+
+       /* Return event handling result */
+       return(result);
+}
+
 /* Interface initialization
  * Set up default functions
  */
@@ -592,7 +616,8 @@ void 
_xfdashboard_text_box_focusable_iface_init(XfdashboardFocusableInterface *i
        iface->can_focus=_xfdashboard_text_box_focusable_can_focus;
        iface->set_focus=_xfdashboard_text_box_focusable_set_focus;
        iface->unset_focus=_xfdashboard_text_box_focusable_unset_focus;
-       
iface->handle_key_event=_xfdashboard_text_box_focusable_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_text_box_focusable_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_text_box_focusable_handle_keyrelease_event;
 }
 
 /* IMPLEMENTATION: GObject */
diff --git a/src/viewpad.c b/src/viewpad.c
index 555e88c..22560d2 100644
--- a/src/viewpad.c
+++ b/src/viewpad.c
@@ -999,9 +999,9 @@ static void 
_xfdashboard_viewpad_focusable_unset_focus(XfdashboardFocusable *inF
        }
 }
 
-/* Virtual function "handle_key_event" was called */
-static gboolean 
_xfdashboard_viewpad_focusable_handle_key_event(XfdashboardFocusable 
*inFocusable,
-                                                                               
                                                const ClutterEvent *inEvent)
+/* Virtual function "handle_keypress_event" was called */
+static gboolean 
_xfdashboard_viewpad_focusable_handle_keypress_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                const 
ClutterEvent *inEvent)
 {
        XfdashboardViewpad                      *self;
        XfdashboardViewpadPrivate       *priv;
@@ -1026,7 +1026,41 @@ static gboolean 
_xfdashboard_viewpad_focusable_handle_key_event(XfdashboardFocus
        if(priv->activeView &&
                XFDASHBOARD_IS_FOCUSABLE(priv->activeView))
        {
-               
handledEvent=xfdashboard_focusable_handle_key_event(XFDASHBOARD_FOCUSABLE(priv->activeView),
 inEvent);
+               
handledEvent=xfdashboard_focusable_handle_keypress_event(XFDASHBOARD_FOCUSABLE(priv->activeView),
 inEvent);
+       }
+
+       /* Return focusable state */
+       return(handledEvent);
+}
+
+/* Virtual function "handle_keyrelease_event" was called */
+static gboolean 
_xfdashboard_viewpad_focusable_handle_keyrelease_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                const 
ClutterEvent *inEvent)
+{
+       XfdashboardViewpad                      *self;
+       XfdashboardViewpadPrivate       *priv;
+       gboolean                                        handledEvent;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(XFDASHBOARD_IS_VIEWPAD(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_VIEWPAD(inFocusable);
+       priv=self->priv;
+
+       /* Set handled key eventto CLUTTER_EVENT_PROPAGATE. It might be set to
+        * CLUTTER_EVENT_STOP if current active view is focusable and it handled
+        * the key event by its virtual function.
+        */
+       handledEvent=CLUTTER_EVENT_PROPAGATE;
+
+       /* Viewpad is just a proxy for the current active view.
+        * So check if current active view is focusable and call its
+        * virtual function.
+        */
+       if(priv->activeView &&
+               XFDASHBOARD_IS_FOCUSABLE(priv->activeView))
+       {
+               
handledEvent=xfdashboard_focusable_handle_keyrelease_event(XFDASHBOARD_FOCUSABLE(priv->activeView),
 inEvent);
        }
 
        /* Return focusable state */
@@ -1041,7 +1075,8 @@ void 
_xfdashboard_viewpad_focusable_iface_init(XfdashboardFocusableInterface *if
        iface->can_focus=_xfdashboard_viewpad_focusable_can_focus;
        iface->set_focus=_xfdashboard_viewpad_focusable_set_focus;
        iface->unset_focus=_xfdashboard_viewpad_focusable_unset_focus;
-       iface->handle_key_event=_xfdashboard_viewpad_focusable_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_viewpad_focusable_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_viewpad_focusable_handle_keyrelease_event;
 }
 
 /* IMPLEMENTATION: GObject */
diff --git a/src/windows-view.c b/src/windows-view.c
index 7eb02a8..171727e 100644
--- a/src/windows-view.c
+++ b/src/windows-view.c
@@ -689,9 +689,9 @@ static void 
_xfdashboard_windows_view_focusable_unset_focus(XfdashboardFocusable
        }
 }
 
-/* Virtual function "handle_key_event" was called */
-static gboolean 
_xfdashboard_windows_view_focusable_handle_key_event(XfdashboardFocusable 
*inFocusable,
-                                                                               
                                                                const 
ClutterEvent *inEvent)
+/* Virtual function "handle_keypress_event" was called */
+static gboolean 
_xfdashboard_windows_view_focusable_handle_keypress_event(XfdashboardFocusable 
*inFocusable,
+                                                                               
                                                                        const 
ClutterEvent *inEvent)
 {
        XfdashboardWindowsView                                  *self;
        XfdashboardWindowsViewPrivate                   *priv;
@@ -702,142 +702,155 @@ static gboolean 
_xfdashboard_windows_view_focusable_handle_key_event(Xfdashboard
        self=XFDASHBOARD_WINDOWS_VIEW(inFocusable);
        priv=self->priv;
 
-       /* Handle key events when key was released */
-       if(clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE)
+       /* Move selection if an arrow key was pressed */
+       if(inEvent->key.keyval==CLUTTER_KEY_Left ||
+               inEvent->key.keyval==CLUTTER_KEY_Right ||
+               inEvent->key.keyval==CLUTTER_KEY_Up ||
+               inEvent->key.keyval==CLUTTER_KEY_Down)
        {
-               /* Activate selected window on ENTER or close window on 
DELETE/BACKSPACE */
-               switch(inEvent->key.keyval)
+               gint                                                    index;
+               gint                                                    
newIndex;
+               gint                                                    
numberChildren;
+               gint                                                    rows;
+               gint                                                    columns;
+               gint                                                    
selectionRow;
+               gint                                                    
selectionColumn;
+               ClutterActorIter                                iter;
+               ClutterActor                                    *child;
+
+               /* If there is nothing selected, select first actor and return 
*/
+               if(!priv->selectedItem)
                {
-                       case CLUTTER_KEY_Return:
-                       case CLUTTER_KEY_KP_Enter:
-                       case CLUTTER_KEY_ISO_Enter:
-                               if(priv->selectedItem)
-                               {
-                                       
_xfdashboard_windows_view_on_window_clicked(self, 
XFDASHBOARD_LIVE_WINDOW(priv->selectedItem));
-                               }
-                               return(CLUTTER_EVENT_STOP);
+                       
priv->selectedItem=clutter_actor_get_first_child(CLUTTER_ACTOR(self));
 
-                       case CLUTTER_KEY_BackSpace:
-                       case CLUTTER_KEY_Delete:
-                       case CLUTTER_KEY_KP_Delete:
-                               if(priv->selectedItem)
-                               {
-                                       
_xfdashboard_windows_view_on_window_close_clicked(self, 
XFDASHBOARD_LIVE_WINDOW(priv->selectedItem));
-                               }
-                               return(CLUTTER_EVENT_STOP);
+                       if(priv->selectedItem)
+                       {
+                               
xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem), 
"selected");
+                       }
+
+                       return(CLUTTER_EVENT_STOP);
                }
 
-               /* Move selection if an arrow key was pressed */
-               if(inEvent->key.keyval==CLUTTER_KEY_Left ||
-                       inEvent->key.keyval==CLUTTER_KEY_Right ||
-                       inEvent->key.keyval==CLUTTER_KEY_Up ||
-                       inEvent->key.keyval==CLUTTER_KEY_Down)
+               /* Get number of rows and columns and also get number of 
children
+                * of layout manager.
+                */
+               
numberChildren=xfdashboard_scaled_table_layout_get_number_children(XFDASHBOARD_SCALED_TABLE_LAYOUT(priv->layout));
+               
rows=xfdashboard_scaled_table_layout_get_rows(XFDASHBOARD_SCALED_TABLE_LAYOUT(priv->layout));
+               
columns=xfdashboard_scaled_table_layout_get_columns(XFDASHBOARD_SCALED_TABLE_LAYOUT(priv->layout));
+
+               /* Get index of current selection */
+               newIndex=index=0;
+               clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self));
+               while(clutter_actor_iter_next(&iter, &child) &&
+                               child!=priv->selectedItem)
                {
-                       gint                                                    
index;
-                       gint                                                    
newIndex;
-                       gint                                                    
numberChildren;
-                       gint                                                    
rows;
-                       gint                                                    
columns;
-                       gint                                                    
selectionRow;
-                       gint                                                    
selectionColumn;
-                       ClutterActorIter                                iter;
-                       ClutterActor                                    *child;
-
-                       /* If there is nothing selected, select first actor and 
return */
-                       if(!priv->selectedItem)
-                       {
-                               
priv->selectedItem=clutter_actor_get_first_child(CLUTTER_ACTOR(self));
-
-                               if(priv->selectedItem)
-                               {
-                                       
xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem), 
"selected");
-                               }
+                       index++;
+                       newIndex++;
+               }
 
-                               return(CLUTTER_EVENT_STOP);
-                       }
+               selectionRow=(index / columns);
+               selectionColumn=(index % columns);
 
-                       /* Get number of rows and columns and also get number 
of children
-                        * of layout manager.
-                        */
-                       
numberChildren=xfdashboard_scaled_table_layout_get_number_children(XFDASHBOARD_SCALED_TABLE_LAYOUT(priv->layout));
-                       
rows=xfdashboard_scaled_table_layout_get_rows(XFDASHBOARD_SCALED_TABLE_LAYOUT(priv->layout));
-                       
columns=xfdashboard_scaled_table_layout_get_columns(XFDASHBOARD_SCALED_TABLE_LAYOUT(priv->layout));
-
-                       /* Get index of current selection */
-                       newIndex=index=0;
-                       clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self));
-                       while(clutter_actor_iter_next(&iter, &child) &&
-                                       child!=priv->selectedItem)
+               /* Determine index of new selection depending on arrow key 
pressed */
+               if(columns>1 && inEvent->key.keyval==CLUTTER_KEY_Left)
+               {
+                       newIndex--;
+                       if(newIndex<(selectionRow*columns))
                        {
-                               index++;
-                               newIndex++;
+                               newIndex=(selectionRow*columns)+columns-1;
+                               if(newIndex>=numberChildren) 
newIndex=numberChildren-1;
                        }
+               }
 
-                       selectionRow=(index / columns);
-                       selectionColumn=(index % columns);
-
-                       /* Determine index of new selection depending on arrow 
key pressed */
-                       if(columns>1 && inEvent->key.keyval==CLUTTER_KEY_Left)
+               if(columns>1 && inEvent->key.keyval==CLUTTER_KEY_Right)
+               {
+                       newIndex++;
+                       if(newIndex>=((selectionRow+1)*columns) ||
+                               newIndex>=numberChildren)
                        {
-                               newIndex--;
-                               if(newIndex<(selectionRow*columns))
-                               {
-                                       
newIndex=(selectionRow*columns)+columns-1;
-                                       if(newIndex>=numberChildren) 
newIndex=numberChildren-1;
-                               }
+                               newIndex=(selectionRow*columns);
                        }
+               }
 
-                       if(columns>1 && inEvent->key.keyval==CLUTTER_KEY_Right)
+               if(rows>1 && inEvent->key.keyval==CLUTTER_KEY_Up)
+               {
+                       newIndex-=columns;
+                       if(newIndex<0)
                        {
-                               newIndex++;
-                               if(newIndex>=((selectionRow+1)*columns) ||
-                                       newIndex>=numberChildren)
-                               {
-                                       newIndex=(selectionRow*columns);
-                               }
+                               newIndex=((rows-1)*columns)+selectionColumn;
+                               if(newIndex>=numberChildren) newIndex-=columns;
                        }
+               }
 
-                       if(rows>1 && inEvent->key.keyval==CLUTTER_KEY_Up)
-                       {
-                               newIndex-=columns;
-                               if(newIndex<0)
-                               {
-                                       
newIndex=((rows-1)*columns)+selectionColumn;
-                                       if(newIndex>=numberChildren) 
newIndex-=columns;
-                               }
-                       }
+               if(rows>1 && inEvent->key.keyval==CLUTTER_KEY_Down)
+               {
+                       newIndex+=columns;
+                       if(newIndex>=numberChildren) newIndex=selectionColumn;
+               }
 
-                       if(rows>1 && inEvent->key.keyval==CLUTTER_KEY_Down)
-                       {
-                               newIndex+=columns;
-                               if(newIndex>=numberChildren) 
newIndex=selectionColumn;
-                       }
+               /* Only change selection and update the affected actors if 
index of
+                * new and old selection differ.
+                */
+               if(newIndex==index) return(CLUTTER_EVENT_STOP);
 
-                       /* Only change selection and update the affected actors 
if index of
-                        * new and old selection differ.
-                        */
-                       if(newIndex==index) return(CLUTTER_EVENT_STOP);
+               /* Unstyle current selection */
+               
xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem),
 "selected");
 
-                       /* Unstyle current selection */
-                       
xfdashboard_stylable_remove_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem),
 "selected");
+               /* Get new selection and style it */
+               index=newIndex;
+               clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self));
+               while(clutter_actor_iter_next(&iter, &priv->selectedItem) &&
+                               index>0)
+               {
+                       index--;
+               }
 
-                       /* Get new selection and style it */
-                       index=newIndex;
-                       clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self));
-                       while(clutter_actor_iter_next(&iter, 
&priv->selectedItem) &&
-                                       index>0)
+               if(priv->selectedItem)
+               {
+                       
xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem), 
"selected");
+               }
+
+               /* Event handled */
+               return(CLUTTER_EVENT_STOP);
+       }
+
+       /* We did not handle this event */
+       return(CLUTTER_EVENT_PROPAGATE);
+}
+
+/* Virtual function "handle_key_event" was called */
+static gboolean 
_xfdashboard_windows_view_focusable_handle_keyrelease_event(XfdashboardFocusable
 *inFocusable,
+                                                                               
                                                                        const 
ClutterEvent *inEvent)
+{
+       XfdashboardWindowsView                                  *self;
+       XfdashboardWindowsViewPrivate                   *priv;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(XFDASHBOARD_IS_WINDOWS_VIEW(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_WINDOWS_VIEW(inFocusable);
+       priv=self->priv;
+
+       /* Activate selected window on ENTER or close window on 
DELETE/BACKSPACE */
+       switch(inEvent->key.keyval)
+       {
+               case CLUTTER_KEY_Return:
+               case CLUTTER_KEY_KP_Enter:
+               case CLUTTER_KEY_ISO_Enter:
+                       if(priv->selectedItem)
                        {
-                               index--;
+                               
_xfdashboard_windows_view_on_window_clicked(self, 
XFDASHBOARD_LIVE_WINDOW(priv->selectedItem));
                        }
+                       return(CLUTTER_EVENT_STOP);
 
+               case CLUTTER_KEY_BackSpace:
+               case CLUTTER_KEY_Delete:
+               case CLUTTER_KEY_KP_Delete:
                        if(priv->selectedItem)
                        {
-                               
xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(priv->selectedItem), 
"selected");
+                               
_xfdashboard_windows_view_on_window_close_clicked(self, 
XFDASHBOARD_LIVE_WINDOW(priv->selectedItem));
                        }
-
-                       /* Event handled */
                        return(CLUTTER_EVENT_STOP);
-               }
        }
 
        /* We did not handle this event */
@@ -852,7 +865,8 @@ void 
_xfdashboard_windows_view_focusable_iface_init(XfdashboardFocusableInterfac
        iface->can_focus=_xfdashboard_windows_view_focusable_can_focus;
        iface->set_focus=_xfdashboard_windows_view_focusable_set_focus;
        iface->unset_focus=_xfdashboard_windows_view_focusable_unset_focus;
-       
iface->handle_key_event=_xfdashboard_windows_view_focusable_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_windows_view_focusable_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_windows_view_focusable_handle_keyrelease_event;
 }
 
 /* IMPLEMENTATION: GObject */
diff --git a/src/workspace-selector.c b/src/workspace-selector.c
index de15bfa..1f12e03 100644
--- a/src/workspace-selector.c
+++ b/src/workspace-selector.c
@@ -801,9 +801,9 @@ static void 
_xfdashboard_workspace_selector_allocate(ClutterActor *inActor,
 
 /* IMPLEMENTATION: Interface XfdashboardFocusable */
 
-/* Virtual function "handle_key_event" was called */
-static gboolean 
_xfdashboard_workspace_selector_focusable_handle_key_event(XfdashboardFocusable 
*inFocusable,
-                                                                               
                                                                        const 
ClutterEvent *inEvent)
+/* Virtual function "handle_keypress_event" was called */
+static gboolean 
_xfdashboard_workspace_selector_focusable_handle_keypress_event(XfdashboardFocusable
 *inFocusable,
+                                                                               
                                                                                
const ClutterEvent *inEvent)
 {
        XfdashboardWorkspaceSelector                    *self;
        XfdashboardWorkspaceSelectorPrivate             *priv;
@@ -817,22 +817,32 @@ static gboolean 
_xfdashboard_workspace_selector_focusable_handle_key_event(Xfdas
        self=XFDASHBOARD_WORKSPACE_SELECTOR(inFocusable);
        priv=self->priv;
 
-       /* Handle key events when key was released */
-       if(clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE)
+       /* Get current and last workspace */
+       
currentWorkspace=xfdashboard_window_tracker_workspace_get_number(priv->activeWorkspace);
+       
maxWorkspace=xfdashboard_window_tracker_get_workspaces_count(priv->windowTracker);
+
+       /* Change workspace if an arrow key was pressed which makes sense
+        * for orientation set
+        */
+       if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Up) ||
+               (priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Left))
        {
-               /* Get current and last workspace */
-               
currentWorkspace=xfdashboard_window_tracker_workspace_get_number(priv->activeWorkspace);
-               
maxWorkspace=xfdashboard_window_tracker_get_workspaces_count(priv->windowTracker);
+               /* Activate previous workspace */
+               currentWorkspace--;
+               if(currentWorkspace<0) currentWorkspace=maxWorkspace-1;
 
-               /* Change workspace if an arrow key was pressed which makes 
sense
-                * for orientation set
-                */
-               if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Up) ||
-                       (priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Left))
+               
workspace=xfdashboard_window_tracker_get_workspace_by_number(priv->windowTracker,
 currentWorkspace);
+               xfdashboard_window_tracker_workspace_activate(workspace);
+
+               /* Event handled */
+               return(CLUTTER_EVENT_STOP);
+       }
+               else if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Down) ||
+                               
(priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Right))
                {
-                       /* Activate previous workspace */
-                       currentWorkspace--;
-                       if(currentWorkspace<0) currentWorkspace=maxWorkspace-1;
+                       /* Activate next workspace */
+                       currentWorkspace++;
+                       if(currentWorkspace>=maxWorkspace) currentWorkspace=0;
 
                        
workspace=xfdashboard_window_tracker_get_workspace_by_number(priv->windowTracker,
 currentWorkspace);
                        
xfdashboard_window_tracker_workspace_activate(workspace);
@@ -840,35 +850,43 @@ static gboolean 
_xfdashboard_workspace_selector_focusable_handle_key_event(Xfdas
                        /* Event handled */
                        return(CLUTTER_EVENT_STOP);
                }
-                       else 
if((priv->orientation==CLUTTER_ORIENTATION_VERTICAL && 
inEvent->key.keyval==CLUTTER_KEY_Down) ||
-                                       
(priv->orientation==CLUTTER_ORIENTATION_HORIZONTAL && 
inEvent->key.keyval==CLUTTER_KEY_Right))
-                       {
-                               /* Activate next workspace */
-                               currentWorkspace++;
-                               if(currentWorkspace>=maxWorkspace) 
currentWorkspace=0;
 
-                               
workspace=xfdashboard_window_tracker_get_workspace_by_number(priv->windowTracker,
 currentWorkspace);
-                               
xfdashboard_window_tracker_workspace_activate(workspace);
+       /* We did not handle this event */
+       return(CLUTTER_EVENT_PROPAGATE);
+}
 
-                               /* Event handled */
-                               return(CLUTTER_EVENT_STOP);
-                       }
+/* Virtual function "handle_keyrelease_event" was called */
+static gboolean 
_xfdashboard_workspace_selector_focusable_handle_keyrelease_event(XfdashboardFocusable
 *inFocusable,
+                                                                               
                                                                                
        const ClutterEvent *inEvent)
+{
+       XfdashboardWorkspaceSelector                    *self;
+       XfdashboardWorkspaceSelectorPrivate             *priv;
+       gint                                                                    
currentWorkspace;
+       XfdashboardWindowTrackerWorkspace               *workspace;
 
-               /* Activate workspace on ENTER */
-               if(inEvent->key.keyval==CLUTTER_KEY_Return ||
-                       inEvent->key.keyval==CLUTTER_KEY_KP_Enter ||
-                       inEvent->key.keyval==CLUTTER_KEY_ISO_Enter)
-               {
-                       /* Active workspace */
-                       
workspace=xfdashboard_window_tracker_get_workspace_by_number(priv->windowTracker,
 currentWorkspace);
-                       
xfdashboard_window_tracker_workspace_activate(workspace);
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+       g_return_val_if_fail(XFDASHBOARD_IS_WORKSPACE_SELECTOR(inFocusable), 
CLUTTER_EVENT_PROPAGATE);
+
+       self=XFDASHBOARD_WORKSPACE_SELECTOR(inFocusable);
+       priv=self->priv;
 
-                       /* Quit application */
-                       xfdashboard_application_quit();
+       /* Activate workspace on ENTER */
+       if(inEvent->key.keyval==CLUTTER_KEY_Return ||
+               inEvent->key.keyval==CLUTTER_KEY_KP_Enter ||
+               inEvent->key.keyval==CLUTTER_KEY_ISO_Enter)
+       {
+               /* Get current workspace */
+               
currentWorkspace=xfdashboard_window_tracker_workspace_get_number(priv->activeWorkspace);
 
-                       /* Event handled */
-                       return(CLUTTER_EVENT_STOP);
-               }
+               /* Active workspace */
+               
workspace=xfdashboard_window_tracker_get_workspace_by_number(priv->windowTracker,
 currentWorkspace);
+               xfdashboard_window_tracker_workspace_activate(workspace);
+
+               /* Quit application */
+               xfdashboard_application_quit();
+
+               /* Event handled */
+               return(CLUTTER_EVENT_STOP);
        }
 
        /* We did not handle this event */
@@ -880,7 +898,8 @@ static gboolean 
_xfdashboard_workspace_selector_focusable_handle_key_event(Xfdas
  */
 void 
_xfdashboard_workspace_selector_focusable_iface_init(XfdashboardFocusableInterface
 *iface)
 {
-       
iface->handle_key_event=_xfdashboard_workspace_selector_focusable_handle_key_event;
+       
iface->handle_keypress_event=_xfdashboard_workspace_selector_focusable_handle_keypress_event;
+       
iface->handle_keyrelease_event=_xfdashboard_workspace_selector_focusable_handle_keyrelease_event;
 }
 
 /* IMPLEMENTATION: GObject */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
Xfce4-commits mailing list
[email protected]
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to