| 1 | /* GStreamer Navigation | 
| 2 |  * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net> | 
| 3 |  * Copyright (C) 2003 David A. Schleef <ds@schleef.org> | 
| 4 |  * | 
| 5 |  * navigation.h: navigation interface design | 
| 6 |  * | 
| 7 |  * This library is free software; you can redistribute it and/or | 
| 8 |  * modify it under the terms of the GNU Library General Public | 
| 9 |  * License as published by the Free Software Foundation; either | 
| 10 |  * version 2 of the License, or (at your option) any later version. | 
| 11 |  * | 
| 12 |  * This library is distributed in the hope that it will be useful, | 
| 13 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 14 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
| 15 |  * Library General Public License for more details. | 
| 16 |  * | 
| 17 |  * You should have received a copy of the GNU Library General Public | 
| 18 |  * License along with this library; if not, write to the | 
| 19 |  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | 
| 20 |  * Boston, MA 02110-1301, USA. | 
| 21 |  */ | 
| 22 |  | 
| 23 | #ifndef __GST_NAVIGATION_H__ | 
| 24 | #define __GST_NAVIGATION_H__ | 
| 25 |  | 
| 26 | #include <gst/gst.h> | 
| 27 | #include <gst/video/video-prelude.h> | 
| 28 |  | 
| 29 | G_BEGIN_DECLS | 
| 30 |  | 
| 31 | #define GST_TYPE_NAVIGATION \ | 
| 32 |   (gst_navigation_get_type ()) | 
| 33 | #define GST_NAVIGATION(obj) \ | 
| 34 |     (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_NAVIGATION, GstNavigation)) | 
| 35 | #define GST_IS_NAVIGATION(obj) \ | 
| 36 |       (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_NAVIGATION)) | 
| 37 | #define GST_NAVIGATION_GET_INTERFACE(obj) \ | 
| 38 |     (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_NAVIGATION, GstNavigationInterface)) | 
| 39 |  | 
| 40 | typedef struct _GstNavigation GstNavigation; | 
| 41 | typedef struct _GstNavigationInterface GstNavigationInterface; | 
| 42 |  | 
| 43 | /** | 
| 44 |  * GstNavigationInterface: | 
| 45 |  * @iface: the parent interface | 
| 46 |  * @send_event: sending a navigation event | 
| 47 |  * | 
| 48 |  * Navigation interface. | 
| 49 |  */ | 
| 50 | struct _GstNavigationInterface { | 
| 51 |   GTypeInterface iface; | 
| 52 |  | 
| 53 |   /* virtual functions */ | 
| 54 |   void (*send_event) (GstNavigation *navigation, GstStructure *structure); | 
| 55 | }; | 
| 56 |  | 
| 57 | GST_VIDEO_API | 
| 58 | GType           gst_navigation_get_type (void); | 
| 59 |  | 
| 60 | /* Navigation commands */ | 
| 61 |  | 
| 62 | /** | 
| 63 |  * GstNavigationCommand: | 
| 64 |  * @GST_NAVIGATION_COMMAND_INVALID: An invalid command entry | 
| 65 |  * @GST_NAVIGATION_COMMAND_MENU1: Execute navigation menu command 1. For DVD, | 
| 66 |  * this enters the DVD root menu, or exits back to the title from the menu. | 
| 67 |  * @GST_NAVIGATION_COMMAND_MENU2: Execute navigation menu command 2. For DVD, | 
| 68 |  * this jumps to the DVD title menu. | 
| 69 |  * @GST_NAVIGATION_COMMAND_MENU3: Execute navigation menu command 3. For DVD, | 
| 70 |  * this jumps into the DVD root menu. | 
| 71 |  * @GST_NAVIGATION_COMMAND_MENU4: Execute navigation menu command 4. For DVD, | 
| 72 |  * this jumps to the Subpicture menu. | 
| 73 |  * @GST_NAVIGATION_COMMAND_MENU5: Execute navigation menu command 5. For DVD, | 
| 74 |  * the jumps to the audio menu. | 
| 75 |  * @GST_NAVIGATION_COMMAND_MENU6: Execute navigation menu command 6. For DVD, | 
| 76 |  * this jumps to the angles menu. | 
| 77 |  * @GST_NAVIGATION_COMMAND_MENU7: Execute navigation menu command 7. For DVD, | 
| 78 |  * this jumps to the chapter menu. | 
| 79 |  * @GST_NAVIGATION_COMMAND_LEFT: Select the next button to the left in a menu, | 
| 80 |  * if such a button exists. | 
| 81 |  * @GST_NAVIGATION_COMMAND_RIGHT: Select the next button to the right in a menu, | 
| 82 |  * if such a button exists. | 
| 83 |  * @GST_NAVIGATION_COMMAND_UP: Select the button above the current one in a | 
| 84 |  * menu, if such a button exists. | 
| 85 |  * @GST_NAVIGATION_COMMAND_DOWN: Select the button below the current one in a | 
| 86 |  * menu, if such a button exists. | 
| 87 |  * @GST_NAVIGATION_COMMAND_ACTIVATE: Activate (click) the currently selected | 
| 88 |  * button in a menu, if such a button exists. | 
| 89 |  * @GST_NAVIGATION_COMMAND_PREV_ANGLE: Switch to the previous angle in a | 
| 90 |  * multiangle feature. | 
| 91 |  * @GST_NAVIGATION_COMMAND_NEXT_ANGLE: Switch to the next angle in a multiangle | 
| 92 |  * feature. | 
| 93 |  * | 
| 94 |  * A set of commands that may be issued to an element providing the | 
| 95 |  * #GstNavigation interface. The available commands can be queried via | 
| 96 |  * the gst_navigation_query_new_commands() query. | 
| 97 |  * | 
| 98 |  * For convenience in handling DVD navigation, the MENU commands are aliased as: | 
| 99 |  *    GST_NAVIGATION_COMMAND_DVD_MENU            = @GST_NAVIGATION_COMMAND_MENU1 | 
| 100 |  *    GST_NAVIGATION_COMMAND_DVD_TITLE_MENU      = @GST_NAVIGATION_COMMAND_MENU2 | 
| 101 |  *    GST_NAVIGATION_COMMAND_DVD_ROOT_MENU       = @GST_NAVIGATION_COMMAND_MENU3 | 
| 102 |  *    GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU = @GST_NAVIGATION_COMMAND_MENU4 | 
| 103 |  *    GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU      = @GST_NAVIGATION_COMMAND_MENU5 | 
| 104 |  *    GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU      = @GST_NAVIGATION_COMMAND_MENU6 | 
| 105 |  *    GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU    = @GST_NAVIGATION_COMMAND_MENU7 | 
| 106 |  */ | 
| 107 | typedef enum { | 
| 108 |   GST_NAVIGATION_COMMAND_INVALID  = 0, | 
| 109 |  | 
| 110 |   GST_NAVIGATION_COMMAND_MENU1    = 1, | 
| 111 |   GST_NAVIGATION_COMMAND_MENU2    = 2, | 
| 112 |   GST_NAVIGATION_COMMAND_MENU3    = 3, | 
| 113 |   GST_NAVIGATION_COMMAND_MENU4    = 4, | 
| 114 |   GST_NAVIGATION_COMMAND_MENU5    = 5, | 
| 115 |   GST_NAVIGATION_COMMAND_MENU6    = 6, | 
| 116 |   GST_NAVIGATION_COMMAND_MENU7    = 7, | 
| 117 |  | 
| 118 |   GST_NAVIGATION_COMMAND_LEFT     = 20, | 
| 119 |   GST_NAVIGATION_COMMAND_RIGHT    = 21, | 
| 120 |   GST_NAVIGATION_COMMAND_UP       = 22, | 
| 121 |   GST_NAVIGATION_COMMAND_DOWN     = 23, | 
| 122 |   GST_NAVIGATION_COMMAND_ACTIVATE = 24, | 
| 123 |  | 
| 124 |   GST_NAVIGATION_COMMAND_PREV_ANGLE = 30, | 
| 125 |   GST_NAVIGATION_COMMAND_NEXT_ANGLE = 31 | 
| 126 | } GstNavigationCommand; | 
| 127 |  | 
| 128 | /* Some aliases for the menu command types */ | 
| 129 | #define GST_NAVIGATION_COMMAND_DVD_MENU            GST_NAVIGATION_COMMAND_MENU1 | 
| 130 | #define GST_NAVIGATION_COMMAND_DVD_TITLE_MENU      GST_NAVIGATION_COMMAND_MENU2 | 
| 131 | #define GST_NAVIGATION_COMMAND_DVD_ROOT_MENU       GST_NAVIGATION_COMMAND_MENU3 | 
| 132 | #define GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU GST_NAVIGATION_COMMAND_MENU4 | 
| 133 | #define GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU      GST_NAVIGATION_COMMAND_MENU5 | 
| 134 | #define GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU      GST_NAVIGATION_COMMAND_MENU6 | 
| 135 | #define GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU    GST_NAVIGATION_COMMAND_MENU7 | 
| 136 |  | 
| 137 | /* Queries */ | 
| 138 | /** | 
| 139 |  * GstNavigationQueryType: | 
| 140 |  * @GST_NAVIGATION_QUERY_INVALID: invalid query | 
| 141 |  * @GST_NAVIGATION_QUERY_COMMANDS: command query | 
| 142 |  * @GST_NAVIGATION_QUERY_ANGLES: viewing angle query | 
| 143 |  * | 
| 144 |  * Types of navigation interface queries. | 
| 145 |  */ | 
| 146 | typedef enum | 
| 147 | { | 
| 148 |   GST_NAVIGATION_QUERY_INVALID     = 0, | 
| 149 |   GST_NAVIGATION_QUERY_COMMANDS    = 1, | 
| 150 |   GST_NAVIGATION_QUERY_ANGLES      = 2 | 
| 151 | } GstNavigationQueryType; | 
| 152 |  | 
| 153 | GST_VIDEO_API | 
| 154 | GstNavigationQueryType gst_navigation_query_get_type (GstQuery *query); | 
| 155 |  | 
| 156 | GST_VIDEO_API | 
| 157 | GstQuery *      gst_navigation_query_new_commands       (void); | 
| 158 |  | 
| 159 | GST_VIDEO_API | 
| 160 | void            gst_navigation_query_set_commands       (GstQuery *query, gint n_cmds, ...); | 
| 161 |  | 
| 162 | GST_VIDEO_API | 
| 163 | void            gst_navigation_query_set_commandsv      (GstQuery *query, gint n_cmds, | 
| 164 |                                                          GstNavigationCommand *cmds); | 
| 165 |  | 
| 166 | GST_VIDEO_API | 
| 167 | gboolean        gst_navigation_query_parse_commands_length     (GstQuery *query, | 
| 168 |                                                                 guint *n_cmds); | 
| 169 |  | 
| 170 | GST_VIDEO_API | 
| 171 | gboolean        gst_navigation_query_parse_commands_nth        (GstQuery *query, guint nth, | 
| 172 |                                                                 GstNavigationCommand *cmd); | 
| 173 |  | 
| 174 | GST_VIDEO_API | 
| 175 | GstQuery *      gst_navigation_query_new_angles         (void); | 
| 176 |  | 
| 177 | GST_VIDEO_API | 
| 178 | void            gst_navigation_query_set_angles         (GstQuery *query, guint cur_angle, | 
| 179 |                                                          guint n_angles); | 
| 180 |  | 
| 181 | GST_VIDEO_API | 
| 182 | gboolean        gst_navigation_query_parse_angles       (GstQuery *query, guint *cur_angle, | 
| 183 |                                                          guint *n_angles); | 
| 184 |  | 
| 185 | /* Element messages */ | 
| 186 | /** | 
| 187 |  * GstNavigationMessageType: | 
| 188 |  * @GST_NAVIGATION_MESSAGE_INVALID: Returned from | 
| 189 |  * gst_navigation_message_get_type() when the passed message is not a | 
| 190 |  * navigation message. | 
| 191 |  * @GST_NAVIGATION_MESSAGE_MOUSE_OVER: Sent when the mouse moves over or leaves a | 
| 192 |  * clickable region of the output, such as a DVD menu button. | 
| 193 |  * @GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED: Sent when the set of available commands | 
| 194 |  * changes and should re-queried by interested applications. | 
| 195 |  * @GST_NAVIGATION_MESSAGE_ANGLES_CHANGED: Sent when display angles in a multi-angle | 
| 196 |  * feature (such as a multiangle DVD) change - either angles have appeared or | 
| 197 |  * disappeared. | 
| 198 |  * @GST_NAVIGATION_MESSAGE_EVENT: Sent when a navigation event was not handled | 
| 199 |  * by any element in the pipeline (Since: 1.6) | 
| 200 |  * | 
| 201 |  * A set of notifications that may be received on the bus when navigation | 
| 202 |  * related status changes. | 
| 203 |  */ | 
| 204 | typedef enum { | 
| 205 |   GST_NAVIGATION_MESSAGE_INVALID, | 
| 206 |   GST_NAVIGATION_MESSAGE_MOUSE_OVER, | 
| 207 |   GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED, | 
| 208 |   GST_NAVIGATION_MESSAGE_ANGLES_CHANGED, | 
| 209 |   GST_NAVIGATION_MESSAGE_EVENT | 
| 210 | } GstNavigationMessageType; | 
| 211 |  | 
| 212 | GST_VIDEO_API | 
| 213 | GstNavigationMessageType gst_navigation_message_get_type (GstMessage *message); | 
| 214 |  | 
| 215 | GST_VIDEO_API | 
| 216 | GstMessage *    gst_navigation_message_new_mouse_over       (GstObject *src, | 
| 217 |                                                              gboolean active); | 
| 218 |  | 
| 219 | GST_VIDEO_API | 
| 220 | gboolean        gst_navigation_message_parse_mouse_over     (GstMessage *message, | 
| 221 |                                                              gboolean *active); | 
| 222 |  | 
| 223 | GST_VIDEO_API | 
| 224 | GstMessage *    gst_navigation_message_new_commands_changed (GstObject *src); | 
| 225 |  | 
| 226 | GST_VIDEO_API | 
| 227 | GstMessage *    gst_navigation_message_new_angles_changed   (GstObject *src, | 
| 228 |                                                              guint cur_angle, | 
| 229 |                                                              guint n_angles); | 
| 230 |  | 
| 231 | GST_VIDEO_API | 
| 232 | gboolean        gst_navigation_message_parse_angles_changed (GstMessage *message, | 
| 233 |                                                              guint *cur_angle, | 
| 234 |                                                              guint *n_angles); | 
| 235 |  | 
| 236 | GST_VIDEO_API | 
| 237 | GstMessage *    gst_navigation_message_new_event            (GstObject *src, | 
| 238 | 							     GstEvent *event); | 
| 239 |  | 
| 240 | GST_VIDEO_API | 
| 241 | gboolean        gst_navigation_message_parse_event          (GstMessage *message, | 
| 242 | 							     GstEvent ** event); | 
| 243 | /* event parsing functions */ | 
| 244 | /** | 
| 245 |  * GstNavigationEventType: | 
| 246 |  * @GST_NAVIGATION_EVENT_INVALID: Returned from | 
| 247 |  * gst_navigation_event_get_type() when the passed event is not a navigation event. | 
| 248 |  * @GST_NAVIGATION_EVENT_KEY_PRESS: A key press event. Use | 
| 249 |  * gst_navigation_event_parse_key_event() to extract the details from the event. | 
| 250 |  * @GST_NAVIGATION_EVENT_KEY_RELEASE: A key release event. Use | 
| 251 |  * gst_navigation_event_parse_key_event() to extract the details from the event. | 
| 252 |  * @GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: A mouse button press event. Use | 
| 253 |  * gst_navigation_event_parse_mouse_button_event() to extract the details from the | 
| 254 |  * event. | 
| 255 |  * @GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE: A mouse button release event. Use | 
| 256 |  * gst_navigation_event_parse_mouse_button_event() to extract the details from the | 
| 257 |  * event. | 
| 258 |  * @GST_NAVIGATION_EVENT_MOUSE_MOVE: A mouse movement event. Use | 
| 259 |  * gst_navigation_event_parse_mouse_move_event() to extract the details from the | 
| 260 |  * event. | 
| 261 |  * @GST_NAVIGATION_EVENT_COMMAND: A navigation command event. Use | 
| 262 |  * gst_navigation_event_parse_command() to extract the details from the event. | 
| 263 |  * @GST_NAVIGATION_EVENT_MOUSE_SCROLL: A mouse scroll event. Use | 
| 264 |  * gst_navigation_event_parse_mouse_scroll_event() to extract the details from | 
| 265 |  * the event. (Since: 1.18) | 
| 266 |  * | 
| 267 |  * Enum values for the various events that an element implementing the | 
| 268 |  * GstNavigation interface might send up the pipeline. | 
| 269 |  */ | 
| 270 | typedef enum { | 
| 271 |   GST_NAVIGATION_EVENT_INVALID                    = 0, | 
| 272 |   GST_NAVIGATION_EVENT_KEY_PRESS                  = 1, | 
| 273 |   GST_NAVIGATION_EVENT_KEY_RELEASE                = 2, | 
| 274 |   GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS         = 3, | 
| 275 |   GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE       = 4, | 
| 276 |   GST_NAVIGATION_EVENT_MOUSE_MOVE                 = 5, | 
| 277 |   GST_NAVIGATION_EVENT_COMMAND                    = 6, | 
| 278 |  | 
| 279 |   /** | 
| 280 |    * GST_NAVIGATION_EVENT_MOUSE_SCROLL: | 
| 281 |    * | 
| 282 |    * A mouse scroll event. Use gst_navigation_event_parse_mouse_scroll_event() | 
| 283 |    * to extract the details from the event. | 
| 284 |    * | 
| 285 |    * Since: 1.18 | 
| 286 |    */ | 
| 287 |   GST_NAVIGATION_EVENT_MOUSE_SCROLL               = 7 | 
| 288 | } GstNavigationEventType; | 
| 289 |  | 
| 290 | GST_VIDEO_API | 
| 291 | GstNavigationEventType gst_navigation_event_get_type          (GstEvent *event); | 
| 292 |  | 
| 293 | GST_VIDEO_API | 
| 294 | gboolean        gst_navigation_event_parse_key_event          (GstEvent *event, | 
| 295 |                                                                const gchar **key); | 
| 296 |  | 
| 297 | GST_VIDEO_API | 
| 298 | gboolean        gst_navigation_event_parse_mouse_button_event (GstEvent *event, | 
| 299 |                                                                gint *button, gdouble *x, gdouble *y); | 
| 300 |  | 
| 301 | GST_VIDEO_API | 
| 302 | gboolean        gst_navigation_event_parse_mouse_move_event   (GstEvent *event, | 
| 303 |                                                                gdouble *x, gdouble *y); | 
| 304 |  | 
| 305 | GST_VIDEO_API | 
| 306 | gboolean        gst_navigation_event_parse_mouse_scroll_event (GstEvent *event, | 
| 307 |                                                                gdouble *x, gdouble *y, | 
| 308 |                                                                gdouble *delta_x, gdouble *delta_y); | 
| 309 |  | 
| 310 | GST_VIDEO_API | 
| 311 | gboolean        gst_navigation_event_parse_command            (GstEvent *event, | 
| 312 |                                                                GstNavigationCommand *command); | 
| 313 |  | 
| 314 | /* interface virtual function wrappers */ | 
| 315 |  | 
| 316 | GST_VIDEO_API | 
| 317 | void    gst_navigation_send_event       (GstNavigation *navigation, | 
| 318 |                                          GstStructure *structure); | 
| 319 |  | 
| 320 | GST_VIDEO_API | 
| 321 | void    gst_navigation_send_key_event   (GstNavigation *navigation, | 
| 322 |                                          const char *event, const char *key); | 
| 323 |  | 
| 324 | GST_VIDEO_API | 
| 325 | void    gst_navigation_send_mouse_event (GstNavigation *navigation, | 
| 326 |                                          const char *event, int button, double x, double y); | 
| 327 |  | 
| 328 | GST_VIDEO_API | 
| 329 | void    gst_navigation_send_mouse_scroll_event (GstNavigation *navigation, | 
| 330 |                                                 double x, double y, double delta_x, double delta_y); | 
| 331 |  | 
| 332 | GST_VIDEO_API | 
| 333 | void    gst_navigation_send_command     (GstNavigation *navigation, | 
| 334 |                                          GstNavigationCommand command); | 
| 335 |  | 
| 336 | G_END_DECLS | 
| 337 |  | 
| 338 | #endif /* __GST_NAVIGATION_H__ */ | 
| 339 |  |