Snapshot/WIP
This commit is contained in:
parent
2cee6a8efa
commit
285b723164
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue