mvcp protocol support embedded from melted project
[melted_gui] / src / instance.c
1 /*
2 * instance.c -- GTK+ 2 melted gui
3 * Copyright (C) 2012 Maksym Veremeyenko <verem@m1stereo.tv>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 #ifndef _GNU_SOURCE
21 #define _GNU_SOURCE
22 #endif
23
24 #ifdef HAVE_CONFIG_H
25 # include <config.h>
26 #endif
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <gtk/gtk.h>
32 #include <gdk/gdkkeysyms.h>
33 #include <pthread.h>
34
35 #include "instance.h"
36 #include "ui.h"
37 #include "opts.h"
38 #include "timecode.h"
39 #include "player.h"
40
41 static gboolean on_main_window_delete_event( GtkWidget *widget, GdkEvent *event, gpointer user_data )
42 {
43 g_print ("delete event occurred [start]\n");
44 gdk_threads_leave();
45 instance_release((instance_t*)user_data);
46 gdk_threads_enter();
47 g_print ("delete event occurred [finish]\n");
48
49 return FALSE;
50 }
51
52 static void on_main_window_destroy( GtkWidget *widget, gpointer user_data )
53 {
54 g_print ("destroy occurred\n");
55 gtk_main_quit();
56 }
57
58 instance_t* instance_create(int argc, char** argv)
59 {
60 int i, c;
61 instance_t* app;
62
63 /* prepare application instance */
64 app = (instance_t*)malloc(sizeof(instance_t));
65 memset(app, 0, sizeof(instance_t));
66
67 /* load parameters from command line */
68 if(!instance_opt(argc, argv, app) && app->players.count)
69 app->window = ui_create(app);
70 else
71 instance_usage();
72
73 return app;
74 };
75
76 void instance_destroy(instance_t* app)
77 {
78 free(app);
79 };
80
81 void instance_init(instance_t* app)
82 {
83 int i;
84 pthread_mutexattr_t attr;
85
86 pthread_mutexattr_init(&attr);
87 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
88
89 gtk_signal_connect( GTK_OBJECT( app->window ), "delete-event",
90 GTK_SIGNAL_FUNC(on_main_window_delete_event), app);
91
92 gtk_signal_connect( GTK_OBJECT( app->window ), "destroy",
93 GTK_SIGNAL_FUNC(on_main_window_destroy), app);
94
95 #if 0
96 gtk_widget_add_events(app->playlist_grid, GDK_BUTTON_PRESS_MASK);
97 gtk_widget_add_events(app->playlist_grid, GDK_KEY_PRESS_MASK);
98 gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "key-press-event",
99 GTK_SIGNAL_FUNC(on_playlist_grid_key), app);
100
101 gtk_widget_add_events(app->library_grid, GDK_BUTTON_PRESS_MASK);
102 gtk_widget_add_events(app->library_grid, GDK_KEY_PRESS_MASK);
103 gtk_signal_connect(GTK_OBJECT(app->library_grid), "key-press-event",
104 GTK_SIGNAL_FUNC(on_library_grid_key), app);
105
106 gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "button-press-event",
107 GTK_SIGNAL_FUNC(on_playlist_grid_button), app);
108
109 gtk_signal_connect(GTK_OBJECT(app->library_grid), "button-press-event",
110 GTK_SIGNAL_FUNC(on_library_grid_button), app);
111 #endif
112
113 /* create lock */
114 pthread_mutex_init(&app->players.lock, &attr);
115 pthread_mutex_init(&app->playlist.lock, &attr);
116 pthread_mutex_init(&app->library.lock, &attr);
117 pthread_mutexattr_destroy(&attr);
118
119 /* run unit monitoring threads */
120 for(i = 0; i < app->players.count; i++)
121 player_run(app, i);
122
123 #if 0
124
125 /* attach buttons click */
126 for(i = 1; i < BUTTON_LAST; i++)
127 gtk_signal_connect(GTK_OBJECT(app->buttons[i]), "clicked",
128 GTK_SIGNAL_FUNC( on_button_click), app );
129
130 /* load library */
131 omnplay_library_load(app);
132 #endif
133
134 #if 0
135 /* setup drag n drop source/target */
136 static GtkTargetEntry drag_targets[] = { { (char*) "application/playlist_item_t", 0, 0 } };
137
138 gtk_drag_source_set(app->library_grid, GDK_BUTTON1_MASK,
139 drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY));
140
141 gtk_drag_source_set(app->playlist_grid, GDK_BUTTON1_MASK,
142 drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
143
144 gtk_drag_dest_set(app->playlist_grid, (GtkDestDefaults)(GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP),
145 drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
146
147 g_signal_connect (app->library_grid, "drag_data_get", G_CALLBACK(library_grid_drag_data_get_cb), app);
148 g_signal_connect (app->playlist_grid, "drag_data_get", G_CALLBACK(playlist_grid_drag_data_get_cb), app);
149 g_signal_connect (app->library_grid, "drag_begin", G_CALLBACK(library_grid_drag_begin_cb), app);
150 g_signal_connect (app->playlist_grid, "drag_begin", G_CALLBACK(playlist_grid_drag_begin_cb), app);
151 g_signal_connect (app->playlist_grid, "drag_data_received", G_CALLBACK (playlist_grid_drag_data_received), app);
152 g_signal_connect (app->playlist_grid, "drag_data_delete", G_CALLBACK (playlist_grid_drag_data_delete), app);
153 g_signal_connect (app->playlist_grid, "drag_motion", G_CALLBACK (playlist_grid_drag_motion), app);
154 #endif
155 };
156
157 void instance_release(instance_t* app)
158 {
159 int i;
160
161 app->f_exit = 1;
162
163 /* stop unit monitoring threads */
164 for(i = 0; i < app->players.count; i++)
165 player_stop(app, i);
166
167 /* destroy lock */
168 pthread_mutex_destroy(&app->players.lock);
169
170 /* destroy lock */
171 pthread_mutex_destroy(&app->playlist.lock);
172
173 #if 0
174 /* load library */
175 omnplay_library_save(app);
176 #endif
177
178 /* destroy library lock */
179 pthread_mutex_destroy(&app->library.lock);
180 };