rework for newer player
[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
40 static gboolean on_main_window_delete_event( GtkWidget *widget, GdkEvent *event, gpointer user_data )
41 {
42 g_print ("delete event occurred [start]\n");
43 gdk_threads_leave();
44 instance_release((instance_t*)user_data);
45 gdk_threads_enter();
46 g_print ("delete event occurred [finish]\n");
47
48 return FALSE;
49 }
50
51 static void on_main_window_destroy( GtkWidget *widget, gpointer user_data )
52 {
53 g_print ("destroy occurred\n");
54 gtk_main_quit();
55 }
56
57 instance_t* instance_create(int argc, char** argv)
58 {
59 int i, c;
60 instance_t* app;
61
62 /* prepare application instance */
63 app = (instance_t*)malloc(sizeof(instance_t));
64 memset(app, 0, sizeof(instance_t));
65
66 /* load parameters from command line */
67 if(!instance_opt(argc, argv, app) && app->players.count)
68 app->window = ui_create(app);
69 else
70 instance_usage();
71
72 return app;
73 };
74
75 void instance_destroy(instance_t* app)
76 {
77 free(app);
78 };
79
80 void instance_init(instance_t* app)
81 {
82 int i;
83 pthread_mutexattr_t attr;
84
85 pthread_mutexattr_init(&attr);
86 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
87
88 gtk_signal_connect( GTK_OBJECT( app->window ), "delete-event",
89 GTK_SIGNAL_FUNC(on_main_window_delete_event), app);
90
91 gtk_signal_connect( GTK_OBJECT( app->window ), "destroy",
92 GTK_SIGNAL_FUNC(on_main_window_destroy), app);
93
94 #if 0
95 gtk_widget_add_events(app->playlist_grid, GDK_BUTTON_PRESS_MASK);
96 gtk_widget_add_events(app->playlist_grid, GDK_KEY_PRESS_MASK);
97 gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "key-press-event",
98 GTK_SIGNAL_FUNC(on_playlist_grid_key), app);
99
100 gtk_widget_add_events(app->library_grid, GDK_BUTTON_PRESS_MASK);
101 gtk_widget_add_events(app->library_grid, GDK_KEY_PRESS_MASK);
102 gtk_signal_connect(GTK_OBJECT(app->library_grid), "key-press-event",
103 GTK_SIGNAL_FUNC(on_library_grid_key), app);
104
105 gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "button-press-event",
106 GTK_SIGNAL_FUNC(on_playlist_grid_button), app);
107
108 gtk_signal_connect(GTK_OBJECT(app->library_grid), "button-press-event",
109 GTK_SIGNAL_FUNC(on_library_grid_button), app);
110 #endif
111
112 /* create lock */
113 pthread_mutex_init(&app->players.lock, &attr);
114 pthread_mutex_init(&app->playlist.lock, &attr);
115 pthread_mutex_init(&app->library.lock, &attr);
116 pthread_mutexattr_destroy(&attr);
117
118 #if 0
119 /* create a status thread */
120 for(i = 0; i < app->players.count; i++)
121 app->players.item[i].thread = g_thread_create(
122 omnplay_thread_proc, &app->players.item[i], TRUE, NULL);
123
124 /* attach buttons click */
125 for(i = 1; i < BUTTON_LAST; i++)
126 gtk_signal_connect(GTK_OBJECT(app->buttons[i]), "clicked",
127 GTK_SIGNAL_FUNC( on_button_click), app );
128
129 /* load library */
130 omnplay_library_load(app);
131 #endif
132
133 #if 0
134 /* setup drag n drop source/target */
135 static GtkTargetEntry drag_targets[] = { { (char*) "application/playlist_item_t", 0, 0 } };
136
137 gtk_drag_source_set(app->library_grid, GDK_BUTTON1_MASK,
138 drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY));
139
140 gtk_drag_source_set(app->playlist_grid, GDK_BUTTON1_MASK,
141 drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
142
143 gtk_drag_dest_set(app->playlist_grid, (GtkDestDefaults)(GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP),
144 drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE));
145
146 g_signal_connect (app->library_grid, "drag_data_get", G_CALLBACK(library_grid_drag_data_get_cb), app);
147 g_signal_connect (app->playlist_grid, "drag_data_get", G_CALLBACK(playlist_grid_drag_data_get_cb), app);
148 g_signal_connect (app->library_grid, "drag_begin", G_CALLBACK(library_grid_drag_begin_cb), app);
149 g_signal_connect (app->playlist_grid, "drag_begin", G_CALLBACK(playlist_grid_drag_begin_cb), app);
150 g_signal_connect (app->playlist_grid, "drag_data_received", G_CALLBACK (playlist_grid_drag_data_received), app);
151 g_signal_connect (app->playlist_grid, "drag_data_delete", G_CALLBACK (playlist_grid_drag_data_delete), app);
152 g_signal_connect (app->playlist_grid, "drag_motion", G_CALLBACK (playlist_grid_drag_motion), app);
153 #endif
154 };
155
156 void instance_release(instance_t* app)
157 {
158 int i;
159
160 app->f_exit = 1;
161
162 for(i = 0; i < app->players.count; i++)
163 /* create a omneon status thread */
164 g_thread_join(app->players.item[i].thread);
165
166 /* destroy lock */
167 pthread_mutex_destroy(&app->players.lock);
168
169 /* destroy lock */
170 pthread_mutex_destroy(&app->playlist.lock);
171
172 #if 0
173 /* load library */
174 omnplay_library_save(app);
175 #endif
176
177 /* destroy library lock */
178 pthread_mutex_destroy(&app->library.lock);
179 };