static void
nav_send_event (GstNavigation * navigation, GstStructure * structure)
{
  GstEvent *event = gst_event_new_navigation (structure);
  GstNavigationEventType etype = gst_navigation_event_get_type (event);
  TestElement *self = (TestElement *) (navigation);

  fail_if (etype == GST_NAVIGATION_EVENT_INVALID,
      "Received navigation event could not be parsed");
  fail_unless (etype == self->sent_type,
      "Received navigation event did not match sent");

  switch (etype) {
    case GST_NAVIGATION_EVENT_KEY_PRESS:
    case GST_NAVIGATION_EVENT_KEY_RELEASE:{
      const gchar *key;
      fail_unless (gst_navigation_event_parse_key_event (event, &key));
      fail_unless (strcmp (key, self->sent_key) == 0);
      break;
    }
    case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS:
    case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:{
      gint button;
      gdouble x, y;
      fail_unless (gst_navigation_event_parse_mouse_button_event (event,
              &button, &x, &y));
      fail_unless (button == self->sent_button);
      fail_unless (x == self->sent_x);
      fail_unless (y == self->sent_y);
      break;
    }
    case GST_NAVIGATION_EVENT_MOUSE_MOVE:{
      gdouble x, y;
      fail_unless (gst_navigation_event_parse_mouse_move_event (event, &x, &y));
      fail_unless (x == self->sent_x);
      fail_unless (y == self->sent_y);
      break;
    }
    case GST_NAVIGATION_EVENT_COMMAND:{
      GstNavigationCommand cmd;
      fail_unless (gst_navigation_event_parse_command (event, &cmd));
      fail_unless (cmd == self->sent_command);
    }
    default:
      break;
  }

  gst_event_unref (event);
}
Example #2
0
MbEvent *
handle_navigation_message (GstMessage *message)
{
  MbEvent *mb_event = NULL;
  GstNavigationMessageType nav_msg_type;
  nav_msg_type = gst_navigation_message_get_type (message);
  switch (nav_msg_type)
  {
    case GST_NAVIGATION_MESSAGE_EVENT:
    {
      GstEvent *event;
      GstNavigationEventType nav_evt_type;

      gst_navigation_message_parse_event (message, &event);
      nav_evt_type = gst_navigation_event_get_type (event);

      switch (nav_evt_type) 
      {
        case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS:
        case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:
        {
          int button;
          double x, y;
          gst_navigation_event_parse_mouse_button_event (event, &button,
              &x, &y);
          mb_event = create_mouse_button_event (
              nav_evt_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS ? 
              MB_MOUSE_BUTTON_PRESS : MB_MOUSE_BUTTON_RELEASE,
              button, (int)x, (int) y);

          if (button == MB_MOUSE_LEFT_BUTTON && 
              mb_event->type == MB_MOUSE_BUTTON_PRESS)
          {
            MbMedia *selected_media = compute_media_selection(x, y);
            if (selected_media != NULL)
            {
              MbEvent *selection_event = 
                create_media_selection_event (MB_MEDIA_SELECTION, 
                    selected_media->name);

              notify_handler (selection_event);
              free (selection_event);
            }
          }

          break;
        }
        case GST_NAVIGATION_EVENT_MOUSE_MOVE:
        {
          double x, y;
          if (gst_navigation_event_parse_mouse_move_event (event, &x, &y))
            mb_event = create_mouse_move_event (MB_MOUSE_MOVE, (int)x, 
                (int) y);

          break;
        }
        case GST_NAVIGATION_EVENT_KEY_PRESS:
        case GST_NAVIGATION_EVENT_KEY_RELEASE:
        {
          const char *key;
          if (gst_navigation_event_parse_key_event (event, &key))
            mb_event = create_keyboard_event (
              nav_evt_type == GST_NAVIGATION_EVENT_KEY_PRESS ? 
              MB_KEY_PRESS : MB_KEY_RELEASE, key);
        }
        default:
          break;  
      }
      gst_event_unref (event);
      break;
    }
    default:
      break;
  }

  return mb_event;
}