[Xfce4-commits] [apps/xfdashboard] 11/13: Move focus to viewpad (and to search view finally) if a search has started
noreply at xfce.org
noreply at xfce.org
Tue Mar 24 10:25:09 CET 2015
This is an automated email from the git hooks/post-receive script.
nomad pushed a commit to annotated tag 0.2.1
in repository apps/xfdashboard.
commit efa106197145c799d366c6473cd248298e990bc6
Author: Stephan Haller <nomad at froevel.de>
Date: Wed Jul 16 19:53:11 2014 +0200
Move focus to viewpad (and to search view finally) if a search has started
This addresses issue #30. It was requested to select and focus the first item in search view when a search started to visualize the first item in search item which can be selected by pressing ENTER even if search box has not the focus - the "just-type-to-search" feature ;)
---
src/focus-manager.c | 14 ++++++++++++++
src/focus-manager.h | 1 +
src/search-view.c | 31 +++++++++++++++++++++++++++++--
src/stage.c | 23 +++++++++++++++++------
src/viewpad.c | 40 ++++++++++++++++++++++++++++++++++++++++
5 files changed, 101 insertions(+), 8 deletions(-)
diff --git a/src/focus-manager.c b/src/focus-manager.c
index feeacbd..2c372a5 100644
--- a/src/focus-manager.c
+++ b/src/focus-manager.c
@@ -348,6 +348,20 @@ gboolean xfdashboard_focus_manager_is_registered(XfdashboardFocusManager *self,
return(FALSE);
}
+/* Determine if a specific actor has the focus */
+gboolean xfdashboard_focus_manager_has_focus(XfdashboardFocusManager *self, XfdashboardFocusable *inFocusable)
+{
+ XfdashboardFocusManagerPrivate *priv;
+
+ g_return_val_if_fail(XFDASHBOARD_IS_FOCUS_MANAGER(self), FALSE);
+ g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), FALSE);
+
+ priv=self->priv;
+
+ /* Return TRUE if given actor has the focus otherwise return FALSE */
+ return(priv->currentFocus==inFocusable ? TRUE : FALSE);
+}
+
/* Get focusable actor which has the focus currently */
XfdashboardFocusable* xfdashboard_focus_manager_get_focus(XfdashboardFocusManager *self)
{
diff --git a/src/focus-manager.h b/src/focus-manager.h
index 313928d..08c1728 100644
--- a/src/focus-manager.h
+++ b/src/focus-manager.h
@@ -77,6 +77,7 @@ void xfdashboard_focus_manager_unregister(XfdashboardFocusManager *self, Xfdashb
GList* xfdashboard_focus_manager_get_registered(XfdashboardFocusManager *self);
gboolean xfdashboard_focus_manager_is_registered(XfdashboardFocusManager *self, XfdashboardFocusable *inFocusable);
+gboolean xfdashboard_focus_manager_has_focus(XfdashboardFocusManager *self, XfdashboardFocusable *inFocusable);
XfdashboardFocusable* xfdashboard_focus_manager_get_focus(XfdashboardFocusManager *self);
void xfdashboard_focus_manager_set_focus(XfdashboardFocusManager *self, XfdashboardFocusable *inFocusable);
diff --git a/src/search-view.c b/src/search-view.c
index 21f1ee9..935b271 100644
--- a/src/search-view.c
+++ b/src/search-view.c
@@ -482,9 +482,13 @@ static void _xfdashboard_search_view_update_provider_actor_new(gpointer inData,
static void _xfdashboard_search_view_update_provider_container(XfdashboardSearchView *self,
XfdashboardSearchViewProviderData *inProviderData)
{
+ XfdashboardSearchViewPrivate *priv;
+
g_return_if_fail(XFDASHBOARD_IS_SEARCH_VIEW(self));
g_return_if_fail(inProviderData);
+ priv=self->priv;
+
/* If result set for provider is given then check if we need to create a container
* or if we have to update one ...
*/
@@ -521,6 +525,29 @@ static void _xfdashboard_search_view_update_provider_container(XfdashboardSearch
(GFunc)_xfdashboard_search_view_update_provider_actor_destroy,
inProviderData->lastResultSet);
}
+
+ /* Select first item if nothing is selected */
+ if(!priv->selectionProvider ||
+ !xfdashboard_search_result_container_get_current_selection(XFDASHBOARD_SEARCH_RESULT_CONTAINER(inProviderData->container)))
+ {
+ ClutterActor *item;
+
+ /* Set this provider as the selected one */
+ priv->selectionProvider=inProviderData;
+
+ /* Set focus to search result container of selected provider */
+ xfdashboard_search_result_container_set_focus(XFDASHBOARD_SEARCH_RESULT_CONTAINER(priv->selectionProvider->container),
+ TRUE);
+
+ /* Get current selectionr and style it */
+ item=xfdashboard_search_result_container_set_next_selection(XFDASHBOARD_SEARCH_RESULT_CONTAINER(priv->selectionProvider->container),
+ XFDASHBOARD_SEARCH_RESULT_CONTAINER_SELECTION_STEP_SIZE_BEGIN_END);
+ if(item &&
+ XFDASHBOARD_IS_STYLABLE(item))
+ {
+ xfdashboard_stylable_add_pseudo_class(XFDASHBOARD_STYLABLE(item), "selected");
+ }
+ }
}
/* ... but if no result set for provider is given then destroy existing container */
else
@@ -613,8 +640,8 @@ static gboolean _xfdashboard_search_view_focusable_can_focus(XfdashboardFocusabl
XfdashboardFocusableInterface *selfIface;
XfdashboardFocusableInterface *parentIface;
- 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);
+ g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), FALSE);
+ g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_VIEW(inFocusable), FALSE);
self=XFDASHBOARD_SEARCH_VIEW(inFocusable);
diff --git a/src/stage.c b/src/stage.c
index 63f0191..f9acfc6 100644
--- a/src/stage.c
+++ b/src/stage.c
@@ -219,15 +219,20 @@ static gboolean xfdashboard_stage_event(ClutterActor *inActor, ClutterEvent *inE
result=xfdashboard_focus_manager_handle_key_event(priv->focusManager, inEvent);
if(result==CLUTTER_EVENT_STOP) return(result);
- /* If even focus manager did not handle this event
- * send even to searchbox.
- */
+ /* If even focus manager did not handle this event send this event to searchbox */
if(priv->searchbox &&
XFDASHBOARD_IS_FOCUSABLE(priv->searchbox) &&
xfdashboard_focus_manager_is_registered(priv->focusManager, XFDASHBOARD_FOCUSABLE(priv->searchbox)))
{
- result=xfdashboard_focusable_handle_key_event(XFDASHBOARD_FOCUSABLE(priv->searchbox), inEvent);
- if(result==CLUTTER_EVENT_STOP) return(result);
+ /* Ask searchbox to handle this event if it has not the focus currently
+ * because in this case it has already handled the event and we do
+ * not to do this twice.
+ */
+ if(xfdashboard_focus_manager_get_focus(priv->focusManager)!=XFDASHBOARD_FOCUSABLE(priv->searchbox))
+ {
+ result=xfdashboard_focusable_handle_key_event(XFDASHBOARD_FOCUSABLE(priv->searchbox), inEvent);
+ if(result==CLUTTER_EVENT_STOP) return(result);
+ }
}
/* If we get here there was no searchbox or it could not handle the event
@@ -457,8 +462,14 @@ static void _xfdashboard_stage_on_searchbox_text_changed(XfdashboardStage *self,
/* Remember current active view to restore it when search ended */
priv->viewBeforeSearch=XFDASHBOARD_VIEW(g_object_ref(xfdashboard_viewpad_get_active_view(XFDASHBOARD_VIEWPAD(priv->viewpad))));
- /* Enable search view */
+ /* Enable search view and set focus to viewpad which will show the
+ * search view so this search view will get the focus finally
+ */
xfdashboard_view_set_enabled(searchView, TRUE);
+ if(priv->viewpad && priv->focusManager)
+ {
+ xfdashboard_focus_manager_set_focus(priv->focusManager, XFDASHBOARD_FOCUSABLE(priv->viewpad));
+ }
/* Activate "clear" button on text box */
xfdashboard_stylable_add_class(XFDASHBOARD_STYLABLE(priv->searchbox), "search-active");
diff --git a/src/viewpad.c b/src/viewpad.c
index 03768b2..555e88c 100644
--- a/src/viewpad.c
+++ b/src/viewpad.c
@@ -36,6 +36,7 @@
#include "enums.h"
#include "utils.h"
#include "focusable.h"
+#include "focus-manager.h"
/* Define this class in GObject system */
static void _xfdashboard_viewpad_focusable_iface_init(XfdashboardFocusableInterface *iface);
@@ -224,6 +225,8 @@ static void _xfdashboard_viewpad_activate_view(XfdashboardViewpad *self, Xfdashb
{
XfdashboardViewpadPrivate *priv;
gfloat x, y;
+ XfdashboardFocusManager *focusManager;
+ gboolean hasFocus;
g_return_if_fail(XFDASHBOARD_IS_VIEWPAD(self));
g_return_if_fail(inView==NULL || XFDASHBOARD_IS_VIEW(inView));
@@ -249,9 +252,20 @@ static void _xfdashboard_viewpad_activate_view(XfdashboardViewpad *self, Xfdashb
return;
}
+ /* Determine if this viewpad has the focus because we have to move focus in this case */
+ focusManager=xfdashboard_focus_manager_get_default();
+ hasFocus=xfdashboard_focus_manager_has_focus(focusManager, XFDASHBOARD_FOCUSABLE(self));
+
/* Deactivate current view */
if(priv->activeView)
{
+ /* Unset focus at current active view if this viewpad has the focus */
+ if(hasFocus)
+ {
+ xfdashboard_focusable_unset_focus(XFDASHBOARD_FOCUSABLE(priv->activeView));
+ g_debug("Viewpad has focus so unset focus from view '%s'", xfdashboard_view_get_name(priv->activeView));
+ }
+
/* Hide current view and emit signal before and after deactivation */
g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_DEACTIVATING], 0, priv->activeView);
g_signal_emit_by_name(priv->activeView, "deactivating");
@@ -296,8 +310,34 @@ static void _xfdashboard_viewpad_activate_view(XfdashboardViewpad *self, Xfdashb
g_signal_emit_by_name(priv->activeView, "activated");
g_signal_emit(self, XfdashboardViewpadSignals[SIGNAL_VIEW_ACTIVATED], 0, priv->activeView);
+
+ /* Set focus to new active view if this viewpad has the focus */
+ if(hasFocus)
+ {
+ xfdashboard_focusable_set_focus(XFDASHBOARD_FOCUSABLE(priv->activeView));
+ g_debug("Viewpad has focus so set focus to view '%s'", xfdashboard_view_get_name(priv->activeView));
+ }
}
+ /* If no view is active at this time move focus to next focusable actor
+ * if this viewpad has the focus.
+ */
+ if(hasFocus && !priv->activeView)
+ {
+ XfdashboardFocusable *newFocusable;
+
+ newFocusable=xfdashboard_focus_manager_get_next_focusable(focusManager, XFDASHBOARD_FOCUSABLE(self));
+ if(newFocusable)
+ {
+ xfdashboard_focus_manager_set_focus(focusManager, newFocusable);
+ g_debug("Viewpad has focus but no view is active so move focus to next focusable actor of type '%s'",
+ G_OBJECT_TYPE_NAME(newFocusable));
+ }
+ }
+
+ /* Release allocated resources */
+ if(focusManager) g_object_unref(focusManager);
+
/* Notify about property change */
g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewpadProperties[PROP_ACTIVE_VIEW]);
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list