1 /* gAlan - Graphical Audio Language
2 * Copyright (C) 1999 Tony Garnock-Jones
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include "generator.h"
38 #define GENERATOR_CLASS_NAME "filereq"
39 #define GENERATOR_CLASS_PATH "Controls/File Requester"
43 #define EVT_FILENAME 0
52 PRIVATE
void access_output_file(GtkWidget
*widget
, GtkWidget
*fs
) {
55 Generator
*g
= gtk_object_get_data(GTK_OBJECT(fs
), "Generator");
57 const char *filename
= gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs
));
59 if (data
->filename
!= NULL
)
61 data
->filename
= safe_string_dup(filename
);
63 gtk_widget_destroy(fs
); /* %%% should this be gtk_widget_hide? uber-paranoia */
65 gen_init_aevent(&event
, AE_STRING
, NULL
, 0, NULL
, 0, gen_get_sampletime() );
66 event
.d
.string
= safe_string_dup( data
->filename
);
67 gen_send_events(g
, EVT_FILENAME
, -1, &event
);
70 PRIVATE gpointer
req_thread( Generator
*g
) {
76 gpointer ptr
= g_async_queue_pop( data
->req
);
83 fs
= gtk_file_selection_new("Select File");
85 gtk_object_set_data(GTK_OBJECT(fs
), "Generator", g
);
86 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs
)->ok_button
), "clicked",
87 GTK_SIGNAL_FUNC(access_output_file
), fs
);
88 gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(fs
)->cancel_button
), "clicked",
89 GTK_SIGNAL_FUNC(gtk_widget_destroy
), GTK_OBJECT(fs
));
91 if (data
->filename
!= NULL
)
92 gtk_file_selection_set_filename(GTK_FILE_SELECTION(fs
), data
->filename
);
94 gtk_window_set_modal(GTK_WINDOW(fs
), TRUE
);
106 PRIVATE
int init_instance(Generator
*g
) {
107 Data
*data
= safe_malloc(sizeof(Data
));
110 data
->filename
= NULL
;
112 data
->req
= g_async_queue_new();
113 data
->thread
= g_thread_create( (GThreadFunc
) req_thread
, (gpointer
) g
, TRUE
, NULL
);
118 PRIVATE
void destroy_instance(Generator
*g
) {
119 Data
*data
= g
->data
;
121 if (data
->filename
!= NULL
)
122 free(data
->filename
);
124 g_async_queue_push( data
->req
, NULL
);
130 PRIVATE
void evt_request_handler(Generator
*g
, AEvent
*event
) {
131 Data
*data
= g
->data
;
133 g_async_queue_push( data
->req
, (gpointer
) 1 );
136 PRIVATE InputSignalDescriptor input_sigs
[] = {
140 PRIVATE OutputSignalDescriptor output_sigs
[] = {
144 PRIVATE ControlDescriptor controls
[] = {
145 /* { kind, name, min,max,step,page, size,editable, is_dst,queue_number,
146 init,destroy,refresh,refresh_data }, */
147 { CONTROL_KIND_BUTTON
, "req", 0,0,0,0, 0,FALSE
, TRUE
,EVT_REQUEST
, NULL
,NULL
,NULL
},
148 { CONTROL_KIND_NONE
, }
151 PRIVATE
void setup_class(void) {
152 GeneratorClass
*k
= gen_new_generatorclass(GENERATOR_CLASS_NAME
, FALSE
, 1, 1,
153 input_sigs
, output_sigs
, controls
,
154 init_instance
, destroy_instance
,
155 (AGenerator_pickle_t
) init_instance
, NULL
);
157 gen_configure_event_input(k
, EVT_REQUEST
, "Req", evt_request_handler
);
158 gen_configure_event_output(k
, EVT_FILENAME
, "Filename");
160 gencomp_register_generatorclass(k
, FALSE
, GENERATOR_CLASS_PATH
, NULL
, NULL
);
163 PUBLIC
void init_plugin(void) {