Snapshot/WIP

This commit is contained in:
Emmanuele Bassi 2012-02-20 14:36:27 +00:00
parent 2cee6a8efa
commit 285b723164
4 changed files with 207 additions and 19 deletions

View File

@ -46,10 +46,15 @@
typedef struct _ClutterEventPrivate {
ClutterEvent base;
gpointer platform_data;
ClutterInputDevice *device;
ClutterInputDevice *source_device;
gpointer platform_data;
float scroll_delta_x;
float scroll_delta_y;
guint has_precise_scroll_delta : 1;
} ClutterEventPrivate;
static GHashTable *all_events = NULL;
@ -532,6 +537,111 @@ clutter_event_get_scroll_direction (const ClutterEvent *event)
return event->scroll.direction;
}
/**
* clutter_event_get_scroll_delta:
* @event: a #ClutterEvent of type %CLUTTER_SCROLL
* @delta_x: (out): the return location for the horizontal delta
* @delta_y: (out): the return location for the vertical delta
*
* Retrieves the scroll delta on both the horizontal and vertical axis.
*
* When clutter_event_has_precise_scroll_delta() returns %FALSE, the
* scrolling is discrete, and it's deferred to the caller to compute
* the size of the scrolling; otherwise, if it returns %TRUE, the user
* should scroll using the given amount.
*
* Since: 1.10
*/
void
clutter_event_get_scroll_delta (const ClutterEvent *event,
gfloat *delta_x,
gfloat *delta_y)
{
ClutterEventPrivate *real_event;
g_return_if_fail (event != NULL);
g_return_if_fail (event->type == CLUTTER_SCROLL);
if (!is_event_allocated (event))
{
if (delta_x != NULL)
*delta_x = 0.f;
if (delta_y != NULL)
*delta_y = 0.f;
return;
}
real_event = (ClutterEventPrivate *) event;
if (delta_x != NULL)
*delta_x = real_event->scroll_delta_x;
if (delta_y != NULL)
*delta_y = real_event->scroll_delta_y;
}
/**
* clutter_event_set_scroll_delta:
* @event: an allocated #ClutterEvent
* @delta_x: the horizontal scroll wheel delta
* @delta_y: the vertical scroll wheel delta
*
* Sets the precise scrolling delta information on @event.
*
* Since: 1.10
*/
void
clutter_event_set_scroll_delta (ClutterEvent *event,
gfloat delta_x,
gfloat delta_y)
{
ClutterEventPrivate *real_event;
g_return_if_fail (event != NULL);
if (!is_event_allocated (event))
return;
real_event = (ClutterEventPrivate *) event;
real_event->has_precise_scroll_delta = TRUE;
real_event->scroll_delta_x = delta_x;
real_event->scroll_delta_y = delta_y;
}
/**
* clutter_event_has_precise_scroll_delta:
* @event: a #ClutterEvent
*
* Retrieves whether @event contains precise scrolling delta information,
* or if the amount of scrolling is discrete.
*
* This function should be called to decide whether or not the
* clutter_event_get_scroll_delta() should be used when scrolling
* contents.
*
* Return value: %TRUE if the event contains precise scrolling delta, and
* %FALSE otherwise.
*
* Since: 1.10
*/
gboolean
clutter_event_has_precise_scroll_delta (const ClutterEvent *event)
{
ClutterEventPrivate *real_event;
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (event->type == CLUTTER_SCROLL, FALSE);
if (!is_event_allocated (event))
return FALSE;
real_event = (ClutterEventPrivate *) event;
return real_event->has_precise_scroll_delta;
}
/**
* clutter_event_set_scroll_direction:
* @event: a #ClutterEvent

View File

@ -420,6 +420,13 @@ ClutterActor * clutter_event_get_related (const ClutterEv
void clutter_event_set_scroll_direction (ClutterEvent *event,
ClutterScrollDirection direction);
ClutterScrollDirection clutter_event_get_scroll_direction (const ClutterEvent *event);
void clutter_event_set_scroll_delta (ClutterEvent *event,
gfloat delta_x,
gfloat delta_y);
void clutter_event_get_scroll_delta (const ClutterEvent *event,
gfloat *delta_x,
gfloat *delta_y);
gboolean clutter_event_has_precise_scroll_delta (const ClutterEvent *event);
guint32 clutter_keysym_to_unicode (guint keyval);
guint clutter_unicode_to_keysym (guint32 wc);

View File

@ -252,7 +252,7 @@ take_and_queue_event (ClutterEvent *event)
static void
process_scroll_event (ClutterEvent *event,
gboolean isVertical)
gboolean isVertical)
{
ClutterStageWindow *impl;
ClutterStageOSX *stage_osx;
@ -290,14 +290,6 @@ process_scroll_event (ClutterEvent *event,
clutter_event_set_device (event_gen, clutter_event_get_device (event));
take_and_queue_event (event_gen);
CLUTTER_NOTE (EVENT, "scroll %s at %f,%f",
(event_gen->scroll.direction == CLUTTER_SCROLL_UP) ? "UP" :
(
(event_gen->scroll.direction == CLUTTER_SCROLL_DOWN) ? "DOWN" :
(
(event_gen->scroll.direction == CLUTTER_SCROLL_RIGHT) ? "RIGHT" : "LEFT")),
event->scroll.x, event->scroll.y);
}
}
@ -387,15 +379,51 @@ clutter_event_osx_translate (NSEvent *nsevent,
return TRUE;
case NSScrollWheel:
stage_osx->scroll_pos_x += [nsevent deltaX];
stage_osx->scroll_pos_y += [nsevent deltaY];
[nsevent clutterX:&(event->scroll.x) y:&(event->scroll.y)];
event->scroll.modifier_state = [nsevent clutterModifierState];
clutter_event_set_device (event, manager_osx->core_pointer);
process_scroll_event (event, TRUE);
process_scroll_event (event, FALSE);
{
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7
BOOL isPrecise = NO;
[nsevent clutterX:&(event->scroll.x) y:&(event->scroll.y)];
event->scroll.modifier_state = [nsevent clutterModifierState];
clutter_event_set_device (event, manager_osx->core_pointer);
isPrecise = [nsevent hasPreciseScrollingDeltas];
if (isPrecise)
{
ClutterScrollDirection direction;
CGFloat deltaX, deltaY;
deltaX = [nsevent scrollingDeltaX];
deltaY = [nsevent scrollingDeltaY];
if (deltaX >= deltaY)
{
if (deltaX < 0)
direction = CLUTTER_SCROLL_LEFT;
else
direction = CLUTTER_SCROLL_RIGHT;
}
else
{
if (deltaY < 0)
direction = CLUTTER_SCROLL_UP;
else
direction = CLUTTER_SCROLL_DOWN;
}
clutter_event_set_scroll_direction (event, direction);
clutter_event_set_scroll_delta (event, (float) deltaX, (float) deltaY);
return TRUE;
}
#endif
stage_osx->scroll_pos_x += [nsevent deltaX];
stage_osx->scroll_pos_y += [nsevent deltaY];
process_scroll_event (event, TRUE);
process_scroll_event (event, FALSE);
}
break;
case NSFlagsChanged:

View File

@ -65,6 +65,45 @@ on_drag_end (ClutterDragAction *action,
NULL);
}
static gboolean
on_scroll_event (ClutterActor *actor,
ClutterEvent *event)
{
if (clutter_event_has_precise_scroll_delta (event))
{
float delta_x;
clutter_event_get_scroll_delta (event, &delta_x, NULL);
if (clutter_actor_get_x (actor) + delta_x >= clutter_actor_get_width (actor))
return CLUTTER_EVENT_STOP;
clutter_actor_move_by (actor, delta_x, 0);
}
else
{
ClutterScrollDirection dir;
dir = clutter_event_get_scroll_direction (event);
switch (dir)
{
case CLUTTER_SCROLL_LEFT:
g_print ("Scroll left\n");
break;
case CLUTTER_SCROLL_RIGHT:
g_print ("Scroll right\n");
break;
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_DOWN:
break;
}
}
return CLUTTER_EVENT_STOP;
}
G_MODULE_EXPORT int
test_scrolling_main (int argc, char *argv[])
{
@ -111,6 +150,10 @@ test_scrolling_main (int argc, char *argv[])
g_signal_connect (action, "drag-end", G_CALLBACK (on_drag_end), NULL);
clutter_actor_set_reactive (viewport, TRUE);
g_signal_connect (viewport, "scroll-event",
G_CALLBACK (on_scroll_event),
NULL);
/* children of the viewport */
for (i = 0; i < N_RECTS; i++)
{