2 * instance.c -- GTK+ 2 melted gui
3 * Copyright (C) 2012 Maksym Veremeyenko <verem@m1stereo.tv>
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.
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.
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.
32 #include <gdk/gdkkeysyms.h>
40 static gboolean
on_main_window_delete_event( GtkWidget
*widget
, GdkEvent
*event
, gpointer user_data
)
42 g_print ("delete event occurred [start]\n");
44 instance_release((instance_t
*)user_data
);
46 g_print ("delete event occurred [finish]\n");
51 static void on_main_window_destroy( GtkWidget
*widget
, gpointer user_data
)
53 g_print ("destroy occurred\n");
57 instance_t
* instance_create(int argc
, char** argv
)
62 /* prepare application instance */
63 app
= (instance_t
*)malloc(sizeof(instance_t
));
64 memset(app
, 0, sizeof(instance_t
));
66 /* load parameters from command line */
67 if(!instance_opt(argc
, argv
, app
) && app
->players
.count
)
68 app
->window
= ui_create(app
);
75 void instance_destroy(instance_t
* app
)
80 void instance_init(instance_t
* app
)
83 pthread_mutexattr_t attr
;
85 pthread_mutexattr_init(&attr
);
86 pthread_mutexattr_settype(&attr
, PTHREAD_MUTEX_RECURSIVE
);
88 gtk_signal_connect( GTK_OBJECT( app
->window
), "delete-event",
89 GTK_SIGNAL_FUNC(on_main_window_delete_event
), app
);
91 gtk_signal_connect( GTK_OBJECT( app
->window
), "destroy",
92 GTK_SIGNAL_FUNC(on_main_window_destroy
), app
);
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
);
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
);
105 gtk_signal_connect(GTK_OBJECT(app
->playlist_grid
), "button-press-event",
106 GTK_SIGNAL_FUNC(on_playlist_grid_button
), app
);
108 gtk_signal_connect(GTK_OBJECT(app
->library_grid
), "button-press-event",
109 GTK_SIGNAL_FUNC(on_library_grid_button
), app
);
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
);
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
);
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
);
130 omnplay_library_load(app
);
134 /* setup drag n drop source/target */
135 static GtkTargetEntry drag_targets
[] = { { (char*) "application/playlist_item_t", 0, 0 } };
137 gtk_drag_source_set(app
->library_grid
, GDK_BUTTON1_MASK
,
138 drag_targets
, 1, (GdkDragAction
)(GDK_ACTION_COPY
));
140 gtk_drag_source_set(app
->playlist_grid
, GDK_BUTTON1_MASK
,
141 drag_targets
, 1, (GdkDragAction
)(GDK_ACTION_COPY
| GDK_ACTION_MOVE
));
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
));
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
);
156 void instance_release(instance_t
* app
)
162 for(i
= 0; i
< app
->players
.count
; i
++)
163 /* create a omneon status thread */
164 g_thread_join(app
->players
.item
[i
].thread
);
167 pthread_mutex_destroy(&app
->players
.lock
);
170 pthread_mutex_destroy(&app
->playlist
.lock
);
174 omnplay_library_save(app
);
177 /* destroy library lock */
178 pthread_mutex_destroy(&app
->library
.lock
);