Snapshot/WIP
This commit is contained in:
parent
2cee6a8efa
commit
285b723164
|
@ -46,10 +46,15 @@
|
||||||
typedef struct _ClutterEventPrivate {
|
typedef struct _ClutterEventPrivate {
|
||||||
ClutterEvent base;
|
ClutterEvent base;
|
||||||
|
|
||||||
|
gpointer platform_data;
|
||||||
|
|
||||||
ClutterInputDevice *device;
|
ClutterInputDevice *device;
|
||||||
ClutterInputDevice *source_device;
|
ClutterInputDevice *source_device;
|
||||||
|
|
||||||
gpointer platform_data;
|
float scroll_delta_x;
|
||||||
|
float scroll_delta_y;
|
||||||
|
|
||||||
|
guint has_precise_scroll_delta : 1;
|
||||||
} ClutterEventPrivate;
|
} ClutterEventPrivate;
|
||||||
|
|
||||||
static GHashTable *all_events = NULL;
|
static GHashTable *all_events = NULL;
|
||||||
|
@ -532,6 +537,111 @@ clutter_event_get_scroll_direction (const ClutterEvent *event)
|
||||||
return event->scroll.direction;
|
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:
|
* clutter_event_set_scroll_direction:
|
||||||
* @event: a #ClutterEvent
|
* @event: a #ClutterEvent
|
||||||
|
|
|
@ -420,6 +420,13 @@ ClutterActor * clutter_event_get_related (const ClutterEv
|
||||||
void clutter_event_set_scroll_direction (ClutterEvent *event,
|
void clutter_event_set_scroll_direction (ClutterEvent *event,
|
||||||
ClutterScrollDirection direction);
|
ClutterScrollDirection direction);
|
||||||
ClutterScrollDirection clutter_event_get_scroll_direction (const ClutterEvent *event);
|
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);
|
guint32 clutter_keysym_to_unicode (guint keyval);
|
||||||
guint clutter_unicode_to_keysym (guint32 wc);
|
guint clutter_unicode_to_keysym (guint32 wc);
|
||||||
|
|
|
@ -252,7 +252,7 @@ take_and_queue_event (ClutterEvent *event)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_scroll_event (ClutterEvent *event,
|
process_scroll_event (ClutterEvent *event,
|
||||||
gboolean isVertical)
|
gboolean isVertical)
|
||||||
{
|
{
|
||||||
ClutterStageWindow *impl;
|
ClutterStageWindow *impl;
|
||||||
ClutterStageOSX *stage_osx;
|
ClutterStageOSX *stage_osx;
|
||||||
|
@ -290,14 +290,6 @@ process_scroll_event (ClutterEvent *event,
|
||||||
clutter_event_set_device (event_gen, clutter_event_get_device (event));
|
clutter_event_set_device (event_gen, clutter_event_get_device (event));
|
||||||
|
|
||||||
take_and_queue_event (event_gen);
|
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;
|
return TRUE;
|
||||||
|
|
||||||
case NSScrollWheel:
|
case NSScrollWheel:
|
||||||
stage_osx->scroll_pos_x += [nsevent deltaX];
|
{
|
||||||
stage_osx->scroll_pos_y += [nsevent deltaY];
|
#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];
|
[nsevent clutterX:&(event->scroll.x) y:&(event->scroll.y)];
|
||||||
clutter_event_set_device (event, manager_osx->core_pointer);
|
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);
|
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;
|
break;
|
||||||
|
|
||||||
case NSFlagsChanged:
|
case NSFlagsChanged:
|
||||||
|
|
|
@ -65,6 +65,45 @@ on_drag_end (ClutterDragAction *action,
|
||||||
NULL);
|
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
|
G_MODULE_EXPORT int
|
||||||
test_scrolling_main (int argc, char *argv[])
|
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);
|
g_signal_connect (action, "drag-end", G_CALLBACK (on_drag_end), NULL);
|
||||||
clutter_actor_set_reactive (viewport, TRUE);
|
clutter_actor_set_reactive (viewport, TRUE);
|
||||||
|
|
||||||
|
g_signal_connect (viewport, "scroll-event",
|
||||||
|
G_CALLBACK (on_scroll_event),
|
||||||
|
NULL);
|
||||||
|
|
||||||
/* children of the viewport */
|
/* children of the viewport */
|
||||||
for (i = 0; i < N_RECTS; i++)
|
for (i = 0; i < N_RECTS; i++)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue