static retval_t filter_key_event (ScimBridgeClientIMContext *imcontext, ClutterKeyEvent *event, boolean *consumed) { scim_bridge_pdebugln (5, "filter_key_event ()"); if (focused_imcontext != imcontext) scim_bridge_client_imcontext_focus_in (CLUTTER_IM_CONTEXT (imcontext)); /* if the source is null, then it's the event we forward out, and we do not handle it again */ if (clutter_event_get_source ((ClutterEvent*) event) == NULL) return RETVAL_SUCCEEDED; focused_actor = clutter_event_get_source ((ClutterEvent*) event); if (scim_bridge_client_is_messenger_opened ()) { ScimBridgeKeyEvent *bridge_key_event = scim_bridge_alloc_key_event (); scim_bridge_key_event_clutter_to_bridge (bridge_key_event, imcontext->client_stage, event); *consumed = FALSE; const retval_t retval_error = scim_bridge_client_handle_key_event (imcontext, bridge_key_event, consumed); scim_bridge_free_key_event (bridge_key_event); if (retval_error) { scim_bridge_perrorln ("An IOException at filter_key_event ()"); } else { return RETVAL_SUCCEEDED; } } return RETVAL_FAILED; }
static MetaWindow * get_window_for_event (MetaDisplay *display, const ClutterEvent *event) { switch (display->event_route) { case META_EVENT_ROUTE_NORMAL: { ClutterActor *source; /* Always use the key focused window for key events. */ if (IS_KEY_EVENT (event)) return stage_has_key_focus () ? display->focus_window : NULL; source = clutter_event_get_source (event); if (META_IS_SURFACE_ACTOR (source)) return meta_surface_actor_get_window (META_SURFACE_ACTOR (source)); else return NULL; } case META_EVENT_ROUTE_WINDOW_OP: case META_EVENT_ROUTE_COMPOSITOR_GRAB: case META_EVENT_ROUTE_WAYLAND_POPUP: case META_EVENT_ROUTE_FRAME_BUTTON: return display->grab_window; default: g_assert_not_reached (); } }
static MetaWindow * get_window_for_event (MetaDisplay *display, const ClutterEvent *event) { switch (display->event_route) { case META_EVENT_ROUTE_NORMAL: { ClutterActor *source; /* Always use the key focused window for key events. */ switch (event->type) { case CLUTTER_KEY_PRESS: case CLUTTER_KEY_RELEASE: return display->focus_window; default: break; } source = clutter_event_get_source (event); if (META_IS_SURFACE_ACTOR (source)) return meta_surface_actor_get_window (META_SURFACE_ACTOR (source)); else return NULL; } case META_EVENT_ROUTE_WAYLAND_POPUP: case META_EVENT_ROUTE_WINDOW_OP: case META_EVENT_ROUTE_COMPOSITOR_GRAB: return display->grab_window; default: g_assert_not_reached (); } }
static gboolean mx_menu_captured_event_handler (ClutterActor *actor, ClutterEvent *event, ClutterActor *menu) { int i; ClutterActor *source; MxMenuPrivate *priv = MX_MENU (menu)->priv; /* allow the event to continue if it is applied to the menu or any of its * children */ source = clutter_event_get_source (event); if (source == menu) return FALSE; for (i = 0; i < priv->children->len; i++) { MxMenuChild *child; child = &g_array_index (priv->children, MxMenuChild, i); if (source == (ClutterActor*) child->box) return FALSE; } if (source == priv->up_button || source == priv->down_button) return FALSE; /* hide the menu if the user clicks outside the menu */ if (event->type == CLUTTER_BUTTON_PRESS) mx_menu_close (menu); return TRUE; }
static gboolean mx_menu_captured_event_handler (ClutterActor *actor, ClutterEvent *event, ClutterActor *menu) { int i; ClutterActor *source; MxMenuPrivate *priv = MX_MENU (menu)->priv; /* allow the event to continue if it is applied to the menu or any of its * children */ source = clutter_event_get_source (event); if (source == menu) return FALSE; for (i = 0; i < priv->children->len; i++) { MxMenuChild *child; child = &g_array_index (priv->children, MxMenuChild, i); if (source == (ClutterActor*) child->box) return FALSE; } if (source == priv->up_button || source == priv->down_button) return FALSE; /* hide the menu if the user clicks outside the menu */ if (event->type == CLUTTER_BUTTON_PRESS) { if (clutter_actor_get_animation (menu)) { clutter_animation_completed (clutter_actor_get_animation (menu)); return FALSE; } clutter_actor_set_reactive (menu, FALSE); clutter_actor_animate (menu, CLUTTER_LINEAR, 250, "opacity", (guchar) 0, "signal-swapped::completed", clutter_actor_hide, menu, NULL); } return TRUE; }
static void notify_motion (ClaylandSeat *seat, const ClutterEvent *event) { ClaylandPointer *pointer = &seat->pointer; float x, y; clutter_event_get_coords (event, &x, &y); pointer->x = wl_fixed_from_double (x); pointer->y = wl_fixed_from_double (y); clayland_seat_repick (seat, clutter_event_get_time (event), clutter_event_get_source (event)); pointer->grab->interface->motion (pointer->grab, clutter_event_get_time (event), pointer->grab->x, pointer->grab->y); }
static gboolean on_input (ClutterStage *stage, ClutterEvent *event, gpointer user_data) { App *app = (App*)user_data; if (event->type == CLUTTER_BUTTON_PRESS) { ClutterActor *actor = clutter_event_get_source (event); const gchar *label = clutter_actor_get_name (actor); int label_val; if (app->dialing_state == TRUE) { call_deactivate(app); return TRUE; } /* retrieve button id (stored in the Actor's name) */ if ( !label ) return FALSE; label_val = atoi(label); if ( label_val < 1 || label_val > 12 ) return FALSE; --label_val; if (label_val == 11) /* 'dial' key */ call_activate (app); else button_activate (app, app->buttons[label_val]); return TRUE; } return FALSE; }
IO_METHOD(IoClutterEvent, getSource) { return IoClutterActor_newWithActor(IOSTATE, clutter_event_get_source(IOCEVENT(self))); }
static gboolean on_captured_event (ClutterActor *stage, ClutterEvent *event, ClutterClickAction *action) { ClutterClickActionPrivate *priv = action->priv; ClutterActor *actor; ClutterModifierType modifier_state; gboolean has_button = TRUE; actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action)); switch (clutter_event_type (event)) { case CLUTTER_TOUCH_END: has_button = FALSE; case CLUTTER_BUTTON_RELEASE: if (!priv->is_held) return CLUTTER_EVENT_STOP; if ((has_button && clutter_event_get_button (event) != priv->press_button) || (has_button && clutter_event_get_click_count (event) != 1) || clutter_event_get_device_id (event) != priv->press_device_id || clutter_event_get_event_sequence (event) != priv->press_sequence) return CLUTTER_EVENT_PROPAGATE; click_action_set_held (action, FALSE); click_action_cancel_long_press (action); /* disconnect the capture */ if (priv->capture_id != 0) { g_signal_handler_disconnect (priv->stage, priv->capture_id); priv->capture_id = 0; } if (priv->long_press_id != 0) { g_source_remove (priv->long_press_id); priv->long_press_id = 0; } if (!clutter_actor_contains (actor, clutter_event_get_source (event))) return CLUTTER_EVENT_PROPAGATE; /* exclude any button-mask so that we can compare * the press and release states properly */ modifier_state = clutter_event_get_state (event) & ~(CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK | CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK | CLUTTER_BUTTON5_MASK); /* if press and release states don't match we * simply ignore modifier keys. i.e. modifier keys * are expected to be pressed throughout the whole * click */ if (modifier_state != priv->modifier_state) priv->modifier_state = 0; click_action_set_pressed (action, FALSE); g_signal_emit (action, click_signals[CLICKED], 0, actor); break; case CLUTTER_MOTION: case CLUTTER_TOUCH_UPDATE: { gfloat motion_x, motion_y; gfloat delta_x, delta_y; if (!priv->is_held) return CLUTTER_EVENT_PROPAGATE; clutter_event_get_coords (event, &motion_x, &motion_y); delta_x = ABS (motion_x - priv->press_x); delta_y = ABS (motion_y - priv->press_y); if (delta_x > priv->drag_threshold || delta_y > priv->drag_threshold) click_action_cancel_long_press (action); } break; default: break; } return CLUTTER_EVENT_STOP; }
static gboolean on_event (ClutterActor *actor, ClutterEvent *event, ClutterClickAction *action) { ClutterClickActionPrivate *priv = action->priv; gboolean has_button = TRUE; if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (action))) return CLUTTER_EVENT_PROPAGATE; switch (clutter_event_type (event)) { case CLUTTER_TOUCH_BEGIN: has_button = FALSE; case CLUTTER_BUTTON_PRESS: if (has_button && clutter_event_get_click_count (event) != 1) return CLUTTER_EVENT_PROPAGATE; if (priv->is_held) return CLUTTER_EVENT_STOP; if (!clutter_actor_contains (actor, clutter_event_get_source (event))) return CLUTTER_EVENT_PROPAGATE; priv->press_button = has_button ? clutter_event_get_button (event) : 0; priv->press_device_id = clutter_event_get_device_id (event); priv->press_sequence = clutter_event_get_event_sequence (event); priv->modifier_state = clutter_event_get_state (event); clutter_event_get_coords (event, &priv->press_x, &priv->press_y); if (priv->long_press_threshold < 0) { ClutterSettings *settings = clutter_settings_get_default (); g_object_get (settings, "dnd-drag-threshold", &priv->drag_threshold, NULL); } else priv->drag_threshold = priv->long_press_threshold; if (priv->stage == NULL) priv->stage = clutter_actor_get_stage (actor); priv->capture_id = g_signal_connect_after (priv->stage, "captured-event", G_CALLBACK (on_captured_event), action); click_action_set_pressed (action, TRUE); click_action_set_held (action, TRUE); click_action_query_long_press (action); break; case CLUTTER_ENTER: click_action_set_pressed (action, priv->is_held); break; case CLUTTER_LEAVE: click_action_set_pressed (action, priv->is_held); click_action_cancel_long_press (action); break; default: break; } return CLUTTER_EVENT_PROPAGATE; }
/* An event was received */ static gboolean _xfdashboard_click_action_on_event(XfdashboardClickAction *self, ClutterEvent *inEvent, gpointer inUserData) { XfdashboardClickActionPrivate *priv; gboolean hasButton; ClutterActor *actor; g_return_val_if_fail(XFDASHBOARD_IS_CLICK_ACTION(self), CLUTTER_EVENT_PROPAGATE); g_return_val_if_fail(CLUTTER_IS_ACTOR(inUserData), CLUTTER_EVENT_PROPAGATE); priv=self->priv; hasButton=TRUE; actor=CLUTTER_ACTOR(inUserData); /* Check if actor is enabled to handle events */ if(!clutter_actor_meta_get_enabled(CLUTTER_ACTOR_META(self))) return(CLUTTER_EVENT_PROPAGATE); /* Handle event */ switch(clutter_event_type(inEvent)) { case CLUTTER_TOUCH_BEGIN: hasButton=FALSE; case CLUTTER_BUTTON_PRESS: /* We only handle single clicks if it is pointer device */ if(hasButton && clutter_event_get_click_count(inEvent)!=1) { return(CLUTTER_EVENT_PROPAGATE); } /* Do we already held the press? */ if(priv->isHeld) return(CLUTTER_EVENT_STOP); /* Is the source of event a child of this actor. If not do * not handle this event but any other. */ if(!clutter_actor_contains(actor, clutter_event_get_source(inEvent))) { return(CLUTTER_EVENT_PROPAGATE); } /* Remember event data */ priv->pressButton=hasButton ? clutter_event_get_button(inEvent) : 0; priv->pressDeviceID=clutter_event_get_device_id(inEvent); priv->pressSequence=clutter_event_get_event_sequence(inEvent); priv->modifierState=clutter_event_get_state(inEvent); clutter_event_get_coords(inEvent, &priv->pressX, &priv->pressY); if(priv->longPressThreshold<0) { ClutterSettings *settings=clutter_settings_get_default(); g_object_get(settings, "dnd-drag-threshold", &priv->dragThreshold, NULL); } else priv->dragThreshold=priv->longPressThreshold; if(priv->stage==NULL) priv->stage=clutter_actor_get_stage(actor); /* Connect signals */ priv->captureID=g_signal_connect_object(priv->stage, "captured-event", G_CALLBACK(_xfdashboard_click_action_on_captured_event), self, G_CONNECT_AFTER | G_CONNECT_SWAPPED); /* Set state of this action */ _xfdashboard_click_action_set_pressed(self, TRUE); _xfdashboard_click_action_set_held(self, TRUE); _xfdashboard_click_action_query_long_press(self); break; case CLUTTER_ENTER: _xfdashboard_click_action_set_pressed(self, priv->isHeld); break; case CLUTTER_LEAVE: _xfdashboard_click_action_set_pressed(self, priv->isHeld); _xfdashboard_click_action_cancel_long_press(self); break; default: break; } return(CLUTTER_EVENT_PROPAGATE); }
/* An event was captured */ static gboolean _xfdashboard_click_action_on_captured_event(XfdashboardClickAction *self, ClutterEvent *inEvent, gpointer inUserData) { XfdashboardClickActionPrivate *priv; ClutterActor *stage G_GNUC_UNUSED; ClutterActor *actor; ClutterModifierType modifierState; gboolean hasButton; g_return_val_if_fail(XFDASHBOARD_IS_CLICK_ACTION(self), CLUTTER_EVENT_PROPAGATE); g_return_val_if_fail(CLUTTER_IS_ACTOR(inUserData), CLUTTER_EVENT_PROPAGATE); priv=self->priv; stage=CLUTTER_ACTOR(inUserData); hasButton=TRUE; /* Handle captured event */ actor=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(self)); switch(clutter_event_type(inEvent)) { case CLUTTER_TOUCH_END: hasButton=FALSE; case CLUTTER_BUTTON_RELEASE: if(!priv->isHeld) return(CLUTTER_EVENT_STOP); if((hasButton && clutter_event_get_button(inEvent)!=priv->pressButton) || (hasButton && clutter_event_get_click_count(inEvent)!=1) || clutter_event_get_device_id(inEvent)!=priv->pressDeviceID || clutter_event_get_event_sequence(inEvent)!=priv->pressSequence) { return(CLUTTER_EVENT_PROPAGATE); } _xfdashboard_click_action_set_held(self, FALSE); _xfdashboard_click_action_cancel_long_press(self); /* Disconnect the capture */ if(priv->captureID!=0) { g_signal_handler_disconnect(priv->stage, priv->captureID); priv->captureID = 0; } if(priv->longPressID!=0) { g_source_remove(priv->longPressID); priv->longPressID=0; } if(!clutter_actor_contains(actor, clutter_event_get_source(inEvent))) { return(CLUTTER_EVENT_PROPAGATE); } /* Exclude any button-mask so that we can compare * the press and release states properly */ modifierState=clutter_event_get_state(inEvent) & ~(CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK | CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK | CLUTTER_BUTTON5_MASK); /* If press and release states don't match we simply ignore * modifier keys. i.e. modifier keys are expected to be pressed * throughout the whole click */ if(modifierState!=priv->modifierState) priv->modifierState=0; _xfdashboard_click_action_set_pressed(self, FALSE); g_signal_emit(self, XfdashboardClickActionSignals[SIGNAL_CLICKED], 0, actor); break; case CLUTTER_MOTION: case CLUTTER_TOUCH_UPDATE: { gfloat motionX, motionY; gfloat deltaX, deltaY; if(!priv->isHeld) return(CLUTTER_EVENT_PROPAGATE); clutter_event_get_coords (inEvent, &motionX, &motionY); deltaX=ABS(motionX-priv->pressX); deltaY=ABS(motionY-priv->pressY); if(deltaX>priv->dragThreshold || deltaY>priv->dragThreshold) { _xfdashboard_click_action_cancel_long_press(self); } } break; default: break; } /* This is line changed in returning CLUTTER_EVENT_PROPAGATE * instead of CLUTTER_EVENT_STOP */ return(CLUTTER_EVENT_PROPAGATE); }
static gboolean input_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { ClutterActor *stage = clutter_actor_get_stage (actor); ClutterActor *source_actor = clutter_event_get_source (event); gchar keybuf[128]; switch (event->type) { case CLUTTER_KEY_PRESS: fill_keybuf (keybuf, &event->key); printf ("[%s] KEY PRESS %s", clutter_actor_get_name (source_actor), keybuf); break; case CLUTTER_KEY_RELEASE: fill_keybuf (keybuf, &event->key); printf ("[%s] KEY RELEASE %s", clutter_actor_get_name (source_actor), keybuf); break; case CLUTTER_MOTION: { ClutterMotionEvent *motion = (ClutterMotionEvent *) event; g_print ("[%s] MOTION (%.02f,%.02f)", clutter_actor_get_name (source_actor), motion->x, motion->y); } break; case CLUTTER_ENTER: g_print ("[%s] ENTER (from:%s)", clutter_actor_get_name (source_actor), clutter_event_get_related (event) != NULL ? clutter_actor_get_name (clutter_event_get_related (event)) : "<out of stage>"); break; case CLUTTER_LEAVE: g_print ("[%s] LEAVE (to:%s)", clutter_actor_get_name (source_actor), clutter_event_get_related (event) != NULL ? clutter_actor_get_name (clutter_event_get_related (event)) : "<out of stage>"); break; case CLUTTER_BUTTON_PRESS: g_print ("[%s] BUTTON PRESS (button:%i, click count:%i)", clutter_actor_get_name (source_actor), clutter_event_get_button (event), clutter_event_get_click_count (event)); break; case CLUTTER_BUTTON_RELEASE: g_print ("[%s] BUTTON RELEASE (button:%i, click count:%i)", clutter_actor_get_name (source_actor), clutter_event_get_button (event), clutter_event_get_click_count (event)); if (source_actor == stage) clutter_stage_set_key_focus (CLUTTER_STAGE (stage), NULL); else if (source_actor == actor && clutter_actor_get_parent (actor) == stage) clutter_stage_set_key_focus (CLUTTER_STAGE (stage), actor); break; case CLUTTER_SCROLL: g_print ("[%s] BUTTON SCROLL (direction:%s)", clutter_actor_get_name (source_actor), clutter_event_get_scroll_direction (event) == CLUTTER_SCROLL_UP ? "up" : "down"); break; case CLUTTER_STAGE_STATE: g_print ("[%s] STAGE STATE", clutter_actor_get_name (source_actor)); break; case CLUTTER_DESTROY_NOTIFY: g_print ("[%s] DESTROY NOTIFY", clutter_actor_get_name (source_actor)); break; case CLUTTER_CLIENT_MESSAGE: g_print ("[%s] CLIENT MESSAGE", clutter_actor_get_name (source_actor)); break; case CLUTTER_DELETE: g_print ("[%s] DELETE", clutter_actor_get_name (source_actor)); break; case CLUTTER_NOTHING: return FALSE; } if (source_actor == actor) g_print (" *source*"); g_print ("\n"); return FALSE; }
static gboolean debug_event_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { gchar keybuf[9], *source = (gchar*)data; int len = 0; switch (event->type) { case CLUTTER_KEY_PRESS: len = g_unichar_to_utf8 (clutter_keysym_to_unicode (event->key.keyval), keybuf); keybuf[len] = '\0'; printf ("[%s] KEY PRESS '%s'", source, keybuf); break; case CLUTTER_KEY_RELEASE: len = g_unichar_to_utf8 (clutter_keysym_to_unicode (event->key.keyval), keybuf); keybuf[len] = '\0'; printf ("[%s] KEY RELEASE '%s'", source, keybuf); break; case CLUTTER_MOTION: printf("[%s] MOTION", source); break; case CLUTTER_ENTER: printf("[%s] ENTER", source); break; case CLUTTER_LEAVE: printf("[%s] LEAVE", source); break; case CLUTTER_BUTTON_PRESS: printf("[%s] BUTTON PRESS (click count:%i)", source, event->button.click_count); break; case CLUTTER_BUTTON_RELEASE: printf("[%s] BUTTON RELEASE", source); break; case CLUTTER_SCROLL: printf("[%s] BUTTON SCROLL", source); break; case CLUTTER_STAGE_STATE: printf("[%s] STAGE STATE", source); break; case CLUTTER_DESTROY_NOTIFY: printf("[%s] DESTROY NOTIFY", source); break; case CLUTTER_CLIENT_MESSAGE: printf("[%s] CLIENT MESSAGE\n", source); break; case CLUTTER_DELETE: printf("[%s] DELETE", source); break; case CLUTTER_NOTHING: return FALSE; } if (clutter_event_get_source (event) == actor) printf(" *source*"); printf("\n"); return FALSE; }