10 static GtkWidget *c_win;
28 static gboolean scrolled;
29 static gboolean ok_pushed;
30 static gboolean Esaved;
31 static gboolean Tosave;
32 static gboolean sv_wsized;
34 static void close_win(GtkWidget *,gpointer);
35 static void cancel_b(GtkWidget *,gpointer);
36 static void ok_b(GtkWidget *,gpointer);
37 static void tb_callback(GtkToggleButton *,gint *);
38 static void sl1_callback(GtkWidget *,gint,gint,GdkEventButton *,gpointer);
39 static void sl2_callback(GtkWidget *,gint,gint,GdkEventButton *,gpointer);
40 static int sel_num(GtkCList *,gint);
41 static void cread_err(gchar *,int );
42 static void chk_cfile(void);
43 static void swap_obj(s_obj_t **,s_obj_t *,s_obj_t *);
44 static s_obj_t *obj_new( s_obj_t **,s_obj_t *);
46 static void close_win(GtkWidget *w,gpointer data) {
47 gtk_grab_remove(c_win);
51 static void cancel_b(GtkWidget *w,gpointer data) {
52 gtk_widget_destroy(c_win);
54 static void ok_b(GtkWidget *w,gpointer data) {
60 Tosave=(gboolean)data;
64 for( i=0 ; i<card_num ; i++ ) {
65 for( j=0 ; j<cards[i].info.mixerdevs; j++ ) {
66 for( k=0 ; (n = g_slist_nth(ccard[i].m[j].gp,k)) != NULL ; k++ ) {
67 b=(GtkWidget *)n->data;
68 if( GTK_TOGGLE_BUTTON(b)->active ) break;
72 ccard[i].m[j].p_e=FALSE;
73 ccard[i].m[j].p_f=FALSE;
76 ccard[i].m[j].p_e=TRUE;
77 ccard[i].m[j].p_f=FALSE;
80 ccard[i].m[j].p_e=TRUE;
81 ccard[i].m[j].p_f=TRUE;
84 for( k=0 ; k<ccard[i].m[j].o_nums ; k++ ) {
85 gtk_clist_get_text(ccard[i].m[j].cl,k,0,&s);
86 ccard[i].m[j].ord_l[k]=atoi(s)-1;
90 gtk_widget_destroy(c_win);
93 gint conf_win( void ) {
97 GtkWidget *vbox,*box,*frame,*hbox,*hhbox;
99 GtkWidget *nb,*n_label;
101 unsigned char gname[40];
105 s_obj_t *obj,*obj_b,*obj2,*obj2_b;
106 gchar *cl_data[3],cl_num[6];
112 c_win=gtk_window_new(GTK_WINDOW_DIALOG);
113 gtk_signal_connect(GTK_OBJECT(c_win),"destroy",GTK_SIGNAL_FUNC(close_win),
115 //gtk_widget_show(c_win);
116 style=gtk_widget_get_style(c_win);
118 vbox=gtk_vbox_new(FALSE,10);
119 gtk_container_add(GTK_CONTAINER(c_win),vbox);
122 nb=gtk_notebook_new();
123 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(nb),GTK_POS_TOP);
124 gtk_box_pack_start(GTK_BOX(vbox),nb,FALSE,FALSE,0);
127 frame=gtk_frame_new(NULL);
128 gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN);
129 gtk_container_set_border_width(GTK_CONTAINER(frame),20);
130 box=gtk_vbox_new(FALSE,10);
131 gtk_container_set_border_width(GTK_CONTAINER(box),10);
132 gtk_container_add(GTK_CONTAINER(frame),box);
134 hbox=gtk_hbox_new(FALSE,4);
135 gtk_box_pack_start(GTK_BOX(box),hbox,FALSE,FALSE,0);
136 scrolled=conf.scroll;
137 b=gtk_toggle_button_new();
138 gtk_widget_set_usize(b,10,10);
139 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),conf.scroll);
140 gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
141 gtk_signal_connect(GTK_OBJECT(b),"toggled",GTK_SIGNAL_FUNC(tb_callback),
142 (gpointer)&scrolled);
144 n_label=gtk_label_new(_("Scroll window enable"));
145 gtk_box_pack_start(GTK_BOX(hbox),n_label,FALSE,FALSE,0);
146 gtk_widget_show(n_label);
147 gtk_widget_show(hbox);
149 hbox=gtk_hbox_new(FALSE,4);
150 gtk_box_pack_start(GTK_BOX(box),hbox,FALSE,FALSE,0);
152 b=gtk_toggle_button_new();
153 gtk_widget_set_usize(b,10,10);
154 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),conf.Esave);
155 gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
156 gtk_signal_connect(GTK_OBJECT(b),"toggled",GTK_SIGNAL_FUNC(tb_callback),
159 n_label=gtk_label_new(_("Config save when exit"));
160 gtk_box_pack_start(GTK_BOX(hbox),n_label,FALSE,FALSE,0);
161 gtk_widget_show(n_label);
162 gtk_widget_show(hbox);
164 hbox=gtk_hbox_new(FALSE,4);
165 gtk_box_pack_start(GTK_BOX(box),hbox,FALSE,FALSE,0);
166 sv_wsized=conf.sv_wsize;
167 b=gtk_toggle_button_new();
168 gtk_widget_set_usize(b,10,10);
169 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),conf.sv_wsize);
170 gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
171 gtk_signal_connect(GTK_OBJECT(b),"toggled",GTK_SIGNAL_FUNC(tb_callback),
172 (gpointer)&sv_wsized);
174 n_label=gtk_label_new(_("Save window size"));
175 gtk_box_pack_start(GTK_BOX(hbox),n_label,FALSE,FALSE,0);
176 gtk_widget_show(n_label);
177 gtk_widget_show(hbox);
179 n_label=gtk_label_new("OPT");
180 gtk_widget_show(box);
181 gtk_widget_show(frame);
182 gtk_notebook_append_page(GTK_NOTEBOOK(nb),frame,n_label);
185 ccard=(c_card *)g_malloc(card_num*sizeof(c_card));
186 if( ccard == NULL ) {
187 fprintf(stderr,nomem_msg);
190 for( i=0 ; i<card_num ; i++ ) {
191 ccard[i].m=(c_mixer *)g_malloc(cards[i].info.mixerdevs*sizeof(c_mixer));
192 if( ccard[i].m == NULL ) {
193 fprintf(stderr,nomem_msg);
196 for( j=0 ; j<cards[i].info.mixerdevs; j++ ) {
197 n_label=gtk_label_new(cards[i].mixer[j].info.name);
198 frame=gtk_frame_new(NULL);
199 gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN);
200 gtk_container_set_border_width(GTK_CONTAINER(frame),20);
201 gtk_notebook_append_page(GTK_NOTEBOOK(nb),frame,n_label);
203 box=gtk_vbox_new(FALSE,2);
204 gtk_container_set_border_width(GTK_CONTAINER(box),10);
205 gtk_container_add(GTK_CONTAINER(frame),box);
207 hbox=gtk_hbox_new(FALSE,4);
208 gtk_box_pack_start(GTK_BOX(box),hbox,FALSE,FALSE,0);
210 ccard[i].m[j].m_en=cards[i].mixer[j].enable;
211 b=gtk_toggle_button_new();
212 gtk_widget_set_usize(b,10,10);
213 gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
214 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),
216 gtk_signal_connect(GTK_OBJECT(b),"toggled",
217 GTK_SIGNAL_FUNC(tb_callback),
218 (gpointer)&ccard[i].m[j].m_en);
220 n_label=gtk_label_new(cards[i].mixer[j].info.name);
221 gtk_box_pack_start(GTK_BOX(hbox),n_label,FALSE,FALSE,0);
222 gtk_widget_show(n_label);
223 gtk_widget_show(hbox);
225 if( cards[i].mixer[j].p_e ) {
226 if( cards[i].mixer[j].p_f ) k=2; else k=1;
228 hbox=gtk_hbox_new(FALSE,4);
229 gtk_box_pack_start(GTK_BOX(box),hbox,FALSE,FALSE,0);
230 n_label=gtk_label_new(_("Spacing: "));
231 gtk_box_pack_start(GTK_BOX(hbox),n_label,FALSE,FALSE,0);
232 gtk_widget_show(n_label);
234 b=gtk_radio_button_new_with_label(NULL,_("NONE"));
235 gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
237 if( k==0 ) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),
240 gp=gtk_radio_button_group(GTK_RADIO_BUTTON(b));
242 b=gtk_radio_button_new_with_label(gp,_("space"));
243 gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
245 if( k==1 ) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),
247 gp=gtk_radio_button_group(GTK_RADIO_BUTTON(b));
249 b=gtk_radio_button_new_with_label(gp,_("expand"));
250 gtk_box_pack_start(GTK_BOX(hbox),b,FALSE,FALSE,0);
252 if( k==2 ) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),
254 ccard[i].m[j].gp=gtk_radio_button_group(GTK_RADIO_BUTTON(b));
255 gtk_widget_show(hbox);
257 clist=gtk_clist_new(3);
258 gtk_clist_freeze(GTK_CLIST(clist));
259 gtk_clist_set_selection_mode(GTK_CLIST(clist),
260 GTK_SELECTION_MULTIPLE);
261 gtk_clist_set_column_width(GTK_CLIST(clist),0,20);
262 gtk_clist_set_column_width(GTK_CLIST(clist),1,6);
263 gtk_clist_set_column_width(GTK_CLIST(clist),2,18);
264 gtk_clist_set_column_justification(GTK_CLIST(clist),
265 0,GTK_JUSTIFY_RIGHT);
266 gtk_clist_set_column_justification(GTK_CLIST(clist),
269 hhbox=gtk_scrolled_window_new(NULL,NULL);
270 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(hhbox),
272 GTK_POLICY_AUTOMATIC);
273 gtk_widget_show(hhbox);
275 ccard[i].m[j].o_nums=cards[i].mixer[j].o_nums;
276 ccard[i].m[j].obj_en=(gboolean *)g_malloc(ccard[i].m[j].o_nums
278 ccard[i].m[j].ord_l=(gint *)g_malloc(ccard[i].m[j].o_nums
280 if( ccard[i].m[j].obj_en == NULL || ccard[i].m[j].ord_l == NULL ) {
281 fprintf(stderr,nomem_msg);
288 obj=cards[i].mixer[j].obj;
289 for( k=0 ; k<ccard[i].m[j].o_nums ; k++ ) {
291 sprintf(cl_num,"%d",k+1);
293 if( obj->g->g.gid.index > 0 ) {
294 sprintf(gname,"%s %d",
296 obj->g->g.gid.index);
298 strcpy(gname,obj->g->g.gid.name);
302 if( obj->e->e.e.eid.index > 0 ) {
303 sprintf(gname,"%s %d",
304 obj->e->e.e.eid.name,
305 obj->e->e.e.eid.index);
307 strcpy(gname,obj->e->e.e.eid.name);
317 gtk_clist_append(GTK_CLIST(clist),cl_data);
319 ccard[i].m[j].obj_en[k]=obj->enable;
321 gtk_clist_select_row(GTK_CLIST(clist),k,0);
323 gtk_clist_unselect_row(GTK_CLIST(clist),k,0);
328 ccard[i].m[j].cl=GTK_CLIST(clist);
329 gtk_clist_set_reorderable(GTK_CLIST(clist),TRUE);
330 gtk_signal_connect(GTK_OBJECT(clist),"select_row",
331 GTK_SIGNAL_FUNC(sl1_callback),
332 (gpointer)&ccard[i].m[j]);
333 gtk_signal_connect(GTK_OBJECT(clist),"unselect_row",
334 GTK_SIGNAL_FUNC(sl2_callback),
335 (gpointer)&ccard[i].m[j]);
336 gtk_widget_show(clist);
337 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(hhbox),
339 gtk_container_set_border_width(GTK_CONTAINER(hhbox),8);
340 gtk_widget_size_request(hhbox,&rq);
341 gtk_widget_set_usize(hhbox,rq.width,rq.height*2);
342 gtk_box_pack_start(GTK_BOX(box),hhbox,FALSE,FALSE,0);
344 gtk_widget_show(hhbox);
345 gtk_widget_show(box);
346 gtk_widget_show(frame);
347 gtk_clist_thaw(GTK_CLIST(clist));
353 box=gtk_hbutton_box_new();
354 gtk_button_box_set_layout(GTK_BUTTON_BOX(box),GTK_BUTTONBOX_END);
355 gtk_button_box_set_spacing(GTK_BUTTON_BOX(box),5);
356 gtk_box_pack_end(GTK_BOX(vbox),box,FALSE,FALSE,0);
358 b=gtk_button_new_with_label(_("OK"));
359 gtk_box_pack_start(GTK_BOX(box),b,TRUE,TRUE,0);
360 gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(ok_b),
362 GTK_WIDGET_SET_FLAGS(b,GTK_CAN_DEFAULT);
364 gtk_widget_grab_default(b);
367 b=gtk_button_new_with_label(_("SAVE"));
368 gtk_box_pack_start(GTK_BOX(box),b,TRUE,TRUE,0);
369 gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(ok_b),
371 GTK_WIDGET_SET_FLAGS(b,GTK_CAN_DEFAULT);
374 b=gtk_button_new_with_label(_("CANCEL"));
375 gtk_box_pack_start(GTK_BOX(box),b,TRUE,TRUE,0);
376 gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(cancel_b),NULL);
377 GTK_WIDGET_SET_FLAGS(b,GTK_CAN_DEFAULT);
380 gtk_widget_show(box);
382 gtk_widget_show(vbox);
383 gtk_widget_show(c_win);
391 if ( conf.scroll != scrolled ) changed=TRUE;
392 conf.scroll=scrolled;
394 conf.sv_wsize=sv_wsized;
397 for( i=0 ; i<card_num ; i++ ) {
398 for( j=0 ; j<cards[i].info.mixerdevs ; j++ ) {
401 if( cards[i].mixer[j].enable != ccard[i].m[j].m_en )
404 cards[i].mixer[j].enable=ccard[i].m[j].m_en;
405 cards[i].mixer[j].enabled=FALSE;
407 if( cards[i].mixer[j].p_e != ccard[i].m[j].p_e ||
408 cards[i].mixer[j].p_f != ccard[i].m[j].p_f )
411 cards[i].mixer[j].p_e=ccard[i].m[j].p_e;
412 cards[i].mixer[j].p_f=ccard[i].m[j].p_f;
415 for( obj=cards[i].mixer[j].obj ; obj != NULL ;
418 if( ccard[i].m[j].ord_l[k] != k ) changed=TRUE;
419 if( obj->enable != ccard[i].m[j].obj_en[ccard[i].m[j].ord_l[k]] ) {
423 if( ccard[i].m[j].ord_l[k] != k ) sf=1;
424 obj->enable=ccard[i].m[j].obj_en[k];
429 o_l=(gint *)g_malloc(sizeof(gint)*ccard[i].m[j].o_nums);
431 for( k=0 ; k<ccard[i].m[j].o_nums ; k++ ) o_l[k]=k;
433 obj=cards[i].mixer[j].obj;
434 for( k=0 ; k<ccard[i].m[j].o_nums ; k++ ) {
435 if( ccard[i].m[j].ord_l[k] != o_l[k] ) {
437 for( l=k ; ccard[i].m[j].ord_l[k]!=o_l[l] ; l++ ) {
441 for( m=l ; m>k ; m-- ) o_l[m]=o_l[m-1];
443 if( obj_b == NULL ) {
444 cards[i].mixer[j].obj=obj2;
448 obj2_b->next=obj2->next;
459 for( obj=cards[i].mixer[j].obj ; obj != NULL ; obj=obj->next) {
461 printf("G %s %d\n",obj->g->g.gid.name,obj->g->g.gid.index);
464 printf("E '$s',%d,%d\n",obj->e->e.e.eid.name,
465 obj->e->e.e.eid.index,obj->e->e.e.eid.type);
470 g_free(ccard[i].m[j].obj_en);
471 g_free(ccard[i].m[j].ord_l);
484 static void tb_callback(GtkToggleButton *b,gint *c) {
487 static void sl1_callback(GtkWidget *w,gint row,gint col,
488 GdkEventButton *ev,gpointer data) {
491 c_mixer *m=(c_mixer *)data;
492 i=sel_num(GTK_CLIST(w),row);
495 static void sl2_callback(GtkWidget *w,gint row,gint col,
496 GdkEventButton *ev,gpointer data) {
499 c_mixer *m=(c_mixer *)data;
500 i=sel_num(GTK_CLIST(w),row);
504 static int sel_num(GtkCList *cl,gint row) {
508 gtk_clist_get_text(cl,row,0,&s);
513 void conf_read( void ) {
524 fp=fopen(conf.fna,"rt");
531 while( !feof(fp) && err>-5 ) {
538 conf.scroll=atoi(s)?TRUE:FALSE;
547 conf.sv_wsize=atoi(s)?TRUE:FALSE;
550 sscanf(s,"%d,%d\n",&conf.width,&conf.height);
553 conf.Esave=atoi(s)?TRUE:FALSE;
556 sscanf(s,"%d,%d=%d\n",&i,&j,&k);
557 if( i<0 || i>=card_num ) {
558 cread_err(_("Invalied card No."),ln);
562 if( j<0 || j>=cards[i].info.mixerdevs ) {
563 cread_err(_("Invalied mixer device No."),ln);
566 m=&cards[i].mixer[j];
567 m->enable=k?TRUE:FALSE;
572 cread_err(_("No mixer selected"),ln);
589 cread_err(_("Invalied value for X"),ln);
596 cread_err(_("No mixer selected"),ln);
600 for( i=0 ; *s!='\'' && *s>0 ; i++ ) gid.name[i]=*(s++);
603 cread_err(_("Invalied argument"),ln);
608 sscanf(s,"%d=%d\n",&gid.index,&i);
609 for( obj=m->obj ; obj != NULL ; obj=obj->next ) {
612 if( strcmp(gid.name,group->g.gid.name) == 0 &&
613 gid.index == group->g.gid.index ) {
614 obj->enable=i&1?TRUE:FALSE;
621 if( obj != obj_n ) swap_obj(&m->obj,obj_n,obj);
625 if( obj_ins_new_g(&m->obj,&obj_n,&gid) == 0 ) {
626 obj_n->enable=i&1?TRUE:FALSE;
627 obj_n->dyn_e=i&2?2:0;
634 cread_err(_("There is no such mixer group"),ln);
641 cread_err(_("No mixer selected"),ln);
645 for( i=0 ; *s!='\'' && *s>0 ; i++ ) eid.name[i]=*(s++);
648 cread_err(_("Invalied argument"),ln);
653 sscanf(s,"%d,%d=%d\n",&eid.index,&eid.type,&i);
654 for( obj=m->obj ; obj != NULL ; obj=obj->next ) {
657 if( strcmp(eid.name,ee->e.e.eid.name) == 0 &&
658 eid.index == ee->e.e.eid.index &&
659 eid.type == ee->e.e.eid.type ) {
660 obj->enable=i&1?TRUE:FALSE;
661 obj->dyn_e=i&2?TRUE:FALSE;
667 if( obj != obj_n ) swap_obj(&m->obj,obj_n,obj);
672 cread_err(_("There is no such mixer element"),ln);
678 if( err<0 ) conf.F_save=TRUE;
684 static void cread_err(gchar *s,int n ) {
685 fprintf(stderr,_("config %d:%s\n"),n,s);
688 static void swap_obj( s_obj_t **obj,s_obj_t *o1,s_obj_t *o2 ) {
691 if( o1 == NULL ) return;
694 while( q->next != o2 ) q=q->next;
701 while( p->next != o1 ) p=p->next;
707 void conf_write(void) {
715 fp=fopen(conf.fna,"wt");
718 fp=fopen(conf.fna,"wt");
721 fprintf(stderr,_("gamix: config file not saved.\n"));
724 fprintf(fp,"# OPT\n");
725 fprintf(fp,"S %d\n",conf.scroll);
726 fprintf(fp,"C %d\n",conf.wmode);
727 fprintf(fp,"A %d\n",conf.Esave);
728 gdk_window_get_size(window->window,&i,&j);
729 fprintf(fp,"Y %d\n",conf.sv_wsize);
730 if( conf.sv_wsize ) fprintf(fp,"W %d,%d\n",i,j);
731 for( i=0 ; i<card_num ; i++ ) {
732 for( j=0 ; j<cards[i].info.mixerdevs ; j++ ) {
733 m=&cards[i].mixer[j];
734 fprintf(fp,"# Card: %s\n# Mixer: %s\n",cards[i].info.name,
736 fprintf(fp,"M %d,%d=%d\n",i,j,m->enable);
738 if( m->p_f ) k=2; else k=1;
740 fprintf(fp,"X %d\n",k);
741 for( obj=m->obj ; obj != NULL ; obj=obj->next ) {
744 fprintf(fp,"G '%s',%d=%d\n",g->g.gid.name,g->g.gid.index,
745 (obj->enable?1:0)|(obj->dyn_e?2:0));
749 fprintf(fp,"E '%s',%d,%d=%d\n",
750 ee->e.e.eid.name,ee->e.e.eid.index,ee->e.e.eid.type,
759 static void chk_cfile( void ) {
763 k=strlen(g_get_home_dir());
764 name=g_strdup(conf.fna);
770 while( name[j] != '/' ) j--;
773 fprintf(stderr,"Can not make dir ~/.gamix\n");
778 while( name[j] != 0 ) j++;
781 err=mkdir(name,S_IRUSR|S_IWUSR|S_IXUSR|
782 S_IRGRP|S_IXGRP| S_IROTH|S_IXOTH);
784 if( errno == ENOENT ) {
787 fprintf(stderr,"Can not make dir %s\n",name);
797 static s_obj_t *obj_new( s_obj_t **objs,s_obj_t *o ) {
800 q=(s_obj_t *)g_malloc0(sizeof(s_obj_t));
802 fprintf(stderr,nomem_msg);
810 while( p->next != o ) p=p->next;
817 gint obj_ins_new_g( s_obj_t **objs,s_obj_t **o1,snd_mixer_gid_t *gid ) {
822 if( p == NULL ) return -1;
823 g=(s_group_t *)g_malloc0(sizeof(s_group_t));
825 fprintf(stderr,nomem_msg);
834 gint obj_ins_new_e( s_obj_t **objs,s_obj_t **o1,snd_mixer_eid_t *eid ) {
839 if( p == NULL ) return -1;
840 e=(s_eelements_t *)g_malloc0(sizeof(s_eelements_t));
842 fprintf(stderr,nomem_msg);