Merge branch 'master' of gitorious.tif.ti.com:glsdk/dual_decode
[glsdk/dual-decode.git] / include / gui.h
1 /*\r
2  *  Copyright (c) 2010-2011, Texas Instruments Incorporated\r
3  *\r
4  *  Redistribution and use in source and binary forms, with or without\r
5  *  modification, are permitted provided that the following conditions\r
6  *  are met:\r
7  *\r
8  *  *  Redistributions of source code must retain the above copyright\r
9  *     notice, this list of conditions and the following disclaimer.\r
10  *\r
11  *  *  Redistributions in binary form must reproduce the above copyright\r
12  *     notice, this list of conditions and the following disclaimer in the\r
13  *     documentation and/or other materials provided with the distribution.\r
14  *\r
15  *  *  Neither the name of Texas Instruments Incorporated nor the names of\r
16  *     its contributors may be used to endorse or promote products derived\r
17  *     from this software without specific prior written permission.\r
18  *\r
19  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
20  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
21  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
22  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
23  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
24  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
25  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
26  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
27  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
28  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
29  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
30  *\r
31  *  Contact information for paper mail:\r
32  *  Texas Instruments\r
33  *  Post Office Box 655303\r
34  *  Dallas, Texas 75265\r
35  *  Contact information:\r
36  *  http://www-k.ext.ti.com/sc/technical-support/product-information-centers.htm\r
37  *  ?DCMP=TIHomeTracking&HQS=Other+OT+home_d_contact\r
38  *  ============================================================================\r
39  *\r
40  */\r
41 \r
42 /**\r
43  * @file                gui.h\r
44  *\r
45  * @brief               Declares the data structures and the functions exported by the \r
46  *                              GUI. \r
47  */\r
48 \r
49 #ifndef __GUI_H__\r
50 #define __GUI_H__\r
51 \r
52 #include <gtk/gtk.h>\r
53 \r
54 /******************************************************************************\r
55  *      @brief                  This structure defines all the components and the signals\r
56  *                                      for a Dual-Decode GUI window. There will be two such\r
57  *                                      windows when the application is running \r
58  ******************************************************************************/\r
59 typedef struct{\r
60 \r
61         /*The Window and its delete-event signal handler*/\r
62         GtkWidget *window;\r
63         gulong windowCloseSignal;\r
64 \r
65         /*The Seekbar widget and the value-changed signal handler                       */\r
66         /*value-changed handler is called when media is seeked using seekbar*/\r
67         GtkWidget *seekScale;\r
68         gulong seekSignal;\r
69 \r
70         /*File Open button and clicked signal handler*/\r
71         GtkWidget *openButton;\r
72         gulong openSignal;\r
73 \r
74         /*media control buttons and clicked signal handlers*/\r
75         GtkWidget *playButton;\r
76         gulong playSignal;\r
77         GtkWidget *pauseButton;\r
78         gulong pauseSignal;\r
79         GtkWidget *stopButton;\r
80         gulong stopSignal;\r
81         GtkWidget *forwardButton;\r
82         gulong forwardSignal;\r
83         GtkWidget *rewindButton;\r
84         gulong rewindSignal;\r
85 \r
86         /*Help Button and clicked signal handler*/\r
87         GtkWidget *helpButton;\r
88         gulong helpSignal;\r
89 \r
90         /*The decode mode switch button and the clicked signal handler*/\r
91         GtkWidget *switchButton;\r
92         gulong switchSignal;\r
93 \r
94         /*Labels to display media playback status and position in media*/\r
95         GtkWidget *statusLabel;\r
96         GtkWidget *timeLabel;\r
97 \r
98         /*The timer signal to report position in media every*/\r
99         /*REPORT_INTERVAL seconds                                                       */\r
100         gulong timerSignal;\r
101 \r
102         /*The draw area where the video is displayed*/\r
103         GtkWidget *drawArea;\r
104 \r
105         /*The state of the controls*/\r
106         gint activeFlag;\r
107         gint modeFlag;\r
108 } GUIWindow;\r
109 \r
110 /*To index the static GUIWindow and Pipeline structures                 */\r
111 /*There are two of them, since it is a dual-decode application  */\r
112 #define DECODER_INDEX_SINGLE 0\r
113 #define DECODER_INDEX_DOUBLE 1\r
114 \r
115 /*ratio of scrren size per window*/\r
116 #define SCREEN_WIDTH_FACTOR 3\r
117 #define SCREEN_HEIGHT_FACTOR 2\r
118 \r
119 /*Whether the control buttons are active*/\r
120 #define CONTROL_MODE_ACTIVE TRUE\r
121 #define CONTROL_MODE_INACTIVE FALSE\r
122 \r
123 #define CONTROL_MODE_STOPPED 0\r
124 #define CONTROL_MODE_PLAYING 1\r
125 #define CONTROL_MODE_PAUSED 2\r
126 #define CONTROL_MODE_NO_FILE 4\r
127 \r
128 #define LABEL_TEXT_NO_FILE "No File"\r
129 #define LABEL_TEXT_PLAYING "Playing"\r
130 #define LABEL_TEXT_STOPPED "Stopped"\r
131 #define LABEL_TEXT_PAUSED "Paused"\r
132 \r
133 #define TIME_LABEL_ORIGIN "--:--:--/--:--:--"\r
134 \r
135 #define SWITCH_TEXT_SINGLE "Single Decode"\r
136 #define SWITCH_TEXT_DUAL "Dual Decode"\r
137 \r
138 #define TIMER_INTERVAL 1000\r
139 #define TIMER_SIGNAL_NONE 0\r
140 \r
141 /******************************************************************************\r
142  *      @brief                  initialises GTK if X is present\r
143  *\r
144  *      @param[in,out] argc             number of command line arguments\r
145  *      @param[in,out] argv             command line arguments\r
146  *\r
147  *      @return                 TRUE if X present, FALSE otherwise              \r
148  *\r
149  *      Called From             main()\r
150  ******************************************************************************/\r
151 gboolean DualDecode_initGUI(gint *argc, char **argv[]);\r
152 \r
153 /******************************************************************************\r
154  *      @brief                  start the application\r
155  *\r
156  *      Called From             main()\r
157  ******************************************************************************/\r
158 void DualDecode_startApplication();\r
159 \r
160 /******************************************************************************\r
161  *      @brief                  stop the application and return to main()\r
162  *\r
163  *      Called From             delete-event handlers of the windows\r
164  ******************************************************************************/\r
165 void DualDecode_exitApplication();\r
166 \r
167 /*The glade file to import widgets from*/\r
168 #define GLADE_FILE "resources/UI.glade"\r
169 \r
170 /*statically used variables per GUI component file*/\r
171 static GError *error                    = NULL;\r
172 static GtkBuilder *builder              = NULL;\r
173 \r
174 /*report and then free the error, if error is not NULL*/\r
175 /*This function is called when a NULL is returned from*/\r
176 /*an allocation function                              */\r
177 static inline void DualDecode_checkError(){\r
178         if(NULL == error){\r
179                 g_printerr("GError Report : Unknown error\n");\r
180         }else{\r
181                 g_printerr("GError Report : %s\n",error->message);\r
182                 g_error_free(error);\r
183                 error = NULL;\r
184         }\r
185 }\r
186 \r
187 /*create and close a static GtkBuilder*/\r
188 static inline void DualDecode_builderClose() {\r
189         g_object_unref(G_OBJECT(builder));\r
190         builder = NULL;\r
191 }\r
192 static inline void DualDecode_builderCreate() {\r
193         builder = gtk_builder_new();\r
194         if(0 == gtk_builder_add_from_file(builder,GLADE_FILE,&error)){\r
195                 DualDecode_checkError();\r
196                 DualDecode_builderClose();\r
197         }\r
198 }\r
199 \r
200 /*get a widget from the builder*/\r
201 static inline GtkWidget *DualDecode_getWidget(const char *widget) {\r
202         GtkWidget *retWidget = NULL;\r
203         if(NULL == builder){\r
204                 retWidget = NULL;\r
205         }else{\r
206                 retWidget = (GtkWidget *)gtk_builder_get_object(builder,widget);\r
207         }\r
208         return retWidget;\r
209 }\r
210 \r
211 /* get a widget exclusively from the builder                      */\r
212 /* this will let the application create two instances             */\r
213 /* of a widget defined in the glade file.                         */\r
214 /*                                                                */\r
215 /* For example : this macro can be used like -                    */\r
216 /*                                                                */\r
217 /* widget0 = DualDecode_getWidgetExclusive("applicationWindow")   */\r
218 /* widget1 = DualDecode_getWidgetExclusive("applicationWindow")   */\r
219 /*                                                                */\r
220 /* this will create two different widgets with the same           */\r
221 /* look and feel                                                  */\r
222 \r
223 static inline GtkWidget *DualDecode_getWidgetExclusive(const char *widget) {\r
224         GtkWidget *retWidget = NULL;\r
225         DualDecode_builderCreate();\r
226         retWidget=DualDecode_getWidget(widget);\r
227         DualDecode_builderClose();\r
228         return retWidget;\r
229 }\r
230 #endif /*__GUI_H__*/\r