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
28 #include "generator.h"
34 #define GENERATOR_CLASS_NAME "strcombo"
35 #define GENERATOR_CLASS_PATH "Controls/String Combobox"
44 typedef struct ControlData
{
47 PRIVATE
int init_instance(Generator
*g
) {
48 Data
*data
= safe_malloc(sizeof(Data
));
56 PRIVATE
void destroy_instance(Generator
*g
) {
59 g_list_free( data
->list
);
64 PRIVATE
void unpickle_instance(Generator
*g
, ObjectStoreItem
*item
, ObjectStore
*db
) {
66 Data
*data
= safe_malloc(sizeof(Data
));
68 ObjectStoreDatum
*array
= objectstore_item_get(item
, "strings");
73 int len
= objectstore_datum_array_length(array
);
74 for (i
= 0; i
< len
; i
++) {
75 ObjectStoreDatum
*datum
= objectstore_datum_array_get(array
, i
);
77 data
->list
= g_list_append(data
->list
,
78 (gpointer
) objectstore_datum_string_value(datum
));
85 PRIVATE
void pickle_instance(Generator
*g
, ObjectStoreItem
*item
, ObjectStore
*db
) {
88 int len
= g_list_length( data
->list
);
92 ObjectStoreDatum
*array
= objectstore_datum_new_array(len
);
94 objectstore_item_set(item
, "strings", array
);
96 for( i
=0, curr
=data
->list
; i
<len
; i
++, curr
=g_list_next(curr
) )
97 objectstore_datum_array_set(array
, i
, objectstore_datum_new_string((char *) curr
->data
));
101 PRIVATE
void entry_activated( GtkEntry
*entry
, Control
*control
) {
103 Generator
*g
= control
->g
;
105 gchar
*str
= gtk_editable_get_chars( GTK_EDITABLE( GTK_COMBO(control
->widget
)->entry
), 0, -1 );
108 gen_init_aevent(&event
, AE_STRING
, NULL
, 0, NULL
, 0, gen_get_sampletime() );
109 event
.d
.string
= safe_string_dup( str
);
112 gen_send_events(g
, EVT_OUTPUT
, -1, &event
);
117 PRIVATE
void init_combo( Control
*control
) {
121 cb
= GTK_COMBO( gtk_combo_new() );
122 g_assert( cb
!= NULL
);
124 gtk_combo_disable_activate( cb
);
125 if( ((Data
*)control
->g
->data
)->list
!= NULL
)
126 gtk_combo_set_popdown_strings( cb
, ((Data
*)control
->g
->data
)->list
);
128 gtk_signal_connect( GTK_OBJECT( cb
->entry
), "activate", GTK_SIGNAL_FUNC(entry_activated
), control
);
130 control
->widget
= GTK_WIDGET(cb
);
133 PRIVATE
void done_combo(Control
*control
) {
136 PRIVATE
void refresh_combo(Control
*control
) {
137 Data
*data
= control
->g
->data
;
139 if( ((Data
*)control
->g
->data
)->list
!= NULL
)
140 gtk_combo_set_popdown_strings( GTK_COMBO(control
->widget
), data
->list
);
145 PRIVATE
void evt_value_handler(Generator
*g
, AEvent
*event
) {
147 Data
*data
= g
->data
;
149 if( event
->kind
== AE_STRING
) {
151 gchar
*str
= safe_string_dup( event
->d
.string
);
152 data
->list
= g_list_append( data
->list
, str
);
155 gen_update_controls(g
, -1);
158 PRIVATE ControlDescriptor controls
[] = {
159 { CONTROL_KIND_USERDEF
, "combo", 0,0,0,0, 0,FALSE
, 0,0, init_combo
, done_combo
, refresh_combo
},
160 { CONTROL_KIND_NONE
, }
165 PRIVATE
void setup_class(void) {
166 GeneratorClass
*k
= gen_new_generatorclass(GENERATOR_CLASS_NAME
, FALSE
, 1, 1,
167 NULL
, NULL
, controls
,
168 init_instance
, destroy_instance
,
169 unpickle_instance
, pickle_instance
);
171 gen_configure_event_input(k
, EVT_VALUE
, "Value", evt_value_handler
);
172 gen_configure_event_output(k
, EVT_OUTPUT
, "Output");
174 gencomp_register_generatorclass(k
, FALSE
, GENERATOR_CLASS_PATH
, NULL
, NULL
);
177 PUBLIC
void init_plugin(void) {