3
TiMidity -- Experimental MIDI to WAVE converter
4
Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
motif_interface.c: written by Vincent Pagel (pagel@loria.fr) 10/4/95
22
Policy : I choose to make a separate process for a TIMIDITY motif
23
interface for TIMIDITY (if the interface was in the same process
24
X redrawings would interfere with the audio computation. Besides
25
XtAppAddWorkProc mechanism is not easily controlable)
27
The solution : I create a pipe between Timidity and the forked interface
28
and use XtAppAddInput to watch the data arriving on the pipe.
31
- Initial working version with prev, next, and quit button and a
35
- Add timidity icon with filename displaying to play midi while
36
I work without having that big blue window in the corner of
38
- Solve the problem of concurent scale value modification
41
- Add menus, file selection box
44
- Make the visible part of file list follow the selection
57
#ifndef NeedFunctionPrototypes
58
#define NeedFunctionPrototypes
62
#include <X11/IntrinsicP.h>
71
#include <Xm/RowColumn.h>
72
#include <Xm/CascadeB.h>
73
#include <Xm/FileSB.h>
74
#include <Xm/FileSB.h>
75
#include <Xm/ToggleB.h>
87
void handle_input(XtPointer client_data, int *source, XtInputId *id);
90
XmStringCharSet char_set=XmSTRING_DEFAULT_CHARSET;
97
static XmTextPosition wpr_position=0;
101
Widget menu_bar, open_option, quit_option, auto_next_option;
102
Widget open_dialog , add_all_button;
104
Widget btnForm, backBtn,fwdBtn, restartBtn, pauseBtn, quitBtn,
107
Pixmap backPixmap, fwdPixmap, pausePixmap , restartPixmap,
108
playPixmap, prevPixmap, nextPixmap, quitPixmap,
111
Widget countFrame, countForm, counterlbl, totlbl , count_headlbl;
115
Widget file_namelbl, file_headlbl;
117
Widget volume_scale , locator_scale ;
118
Boolean locator_scale_button= ButtonRelease;
121
int file_number_to_play; /* Number of the file we're playing in the list */
124
* CREATE PIXMAPS FOR THE BUTONS
126
void CreatePixmaps(Widget parent)
132
#include "BITMAPS/back.xbm"
133
#include "BITMAPS/next.xbm"
134
#include "BITMAPS/prev.xbm"
135
#include "BITMAPS/restart.xbm"
136
#include "BITMAPS/fwd.xbm"
137
#include "BITMAPS/pause.xbm"
138
#include "BITMAPS/quit.xbm"
139
#include "BITMAPS/timidity.xbm"
146
unsigned int depth=DefaultDepthOfScreen(XtScreen(toplevel));
149
XtSetArg(al[ac], XmNbackground, &bg); ac++;
150
XtSetArg(al[ac], XmNforeground, &fg); ac++;
151
XtGetValues(parent, al, ac);
153
disp=XtDisplay(toplevel);
154
d=RootWindowOfScreen(XtScreen(toplevel));
156
backPixmap = XCreatePixmapFromBitmapData(disp, d,
157
back_bits, back_width, back_height,
159
fwdPixmap = XCreatePixmapFromBitmapData( disp, d,
160
fwd_bits, fwd_width, fwd_height,
162
pausePixmap = XCreatePixmapFromBitmapData(disp, d,
163
pause_bits, pause_width, pause_height,
166
restartPixmap = XCreatePixmapFromBitmapData(disp, d,
167
restart_bits, restart_width, restart_height,
170
nextPixmap = XCreatePixmapFromBitmapData(disp, d,
171
next_bits, next_width, next_height,
174
prevPixmap = XCreatePixmapFromBitmapData(disp, d,
175
prev_bits, prev_width, prev_height,
178
quitPixmap = XCreatePixmapFromBitmapData(disp, d,
179
quit_bits, quit_width, quit_height,
182
timidityPixmap = XCreatePixmapFromBitmapData(disp, d,
183
timidity_bits, timidity_width, timidity_height,
184
WhitePixelOfScreen(XtScreen(toplevel)),
185
BlackPixelOfScreen(XtScreen(toplevel)),depth);
189
/************************************
191
* ALL THE INTERFACE'S CALLBACKS *
193
************************************/
196
* Generic buttons callbacks ( Transport Buttons )
198
void GenericCB(Widget widget, int data, XtPointer call_data)
200
motif_pipe_int_write( data );
204
* Generic scales callbacks : VOLUME and LOCATOR
206
void Generic_scaleCB(Widget widget, int data, XtPointer call_data)
208
XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *) call_data;
210
motif_pipe_int_write( data );
211
motif_pipe_int_write(cbs->value);
215
* Detect when a mouse button is pushed or released in a scale area to
216
* avoid concurent scale value modification while holding it with the mouse
218
void Locator_btn(Widget w,XtPointer client_data,XEvent *event,Boolean *cont)
220
/* Type = ButtonPress or ButtonRelease */
221
locator_scale_button= event->xbutton.type;
225
* File List selection CALLBACK
227
void File_ListCB(Widget widget, int data, XtPointer call_data)
229
XmListCallbackStruct *cbs= (XmListCallbackStruct *) call_data;
231
int nbvisible, first_visible ;
235
/* First, check that the selected file is really visible in the list */
237
XtSetArg(al[ac],XmNtopItemPosition,&first_visible); ac++;
238
XtSetArg(al[ac],XmNvisibleItemCount,&nbvisible); ac++;
239
XtGetValues(widget, al, ac);
241
if ( ( first_visible > cbs->item_position) ||
242
((first_visible+nbvisible) <= cbs->item_position))
243
XmListSetPos(widget, cbs->item_position);
245
/* Tell the application to play the requested file */
246
XmStringGetLtoR(cbs->item,char_set,&text);
247
motif_pipe_int_write(MOTIF_PLAY_FILE);
248
motif_pipe_string_write(text);
249
file_number_to_play=cbs->item_position;
254
* Generic menu callback
256
void menuCB(Widget w,int client_data,XmAnyCallbackStruct *call_data)
262
XtManageChild(open_dialog);
267
motif_pipe_int_write(MOTIF_QUIT);
271
/* Toggle modified : for the moment , nothing to do ! */
272
/* if (XmToggleButtonGetState(w)) TRUE else FALSE */
279
* File selection box callback
281
void openCB(Widget w,int client_data,XmFileSelectionBoxCallbackStruct *call_data)
283
if (client_data==DIALOG_CANCEL)
284
{ /* do nothing if cancel is selected. */
285
XtUnmanageChild(open_dialog);
288
else if (client_data==DIALOG_ALL)
289
{ /* Add all the listed files */
297
the_list=XmFileSelectionBoxGetChild(open_dialog,XmDIALOG_LIST);
298
if (!XmIsList(the_list))
300
printf("PANIC: List are not what they used to be\n");
305
XtSetArg(al[ac], XmNitemCount, &nbfile); ac++;
306
XtSetArg(al[ac], XmNitems, &files); ac++;
307
XtGetValues(the_list, al, ac);
309
for (i=0;i<nbfile;i++)
310
XmListAddItemUnselected(file_list,files[i],0);
313
{ /* get filename from file selection box and add it to the list*/
314
XmListAddItemUnselected(file_list,call_data->value,0);
315
XtUnmanageChild(open_dialog);
320
/********************************************************
322
* Receive DATA sent by the application on the pipe *
324
********************************************************/
325
void handle_input(XtPointer client_data, int *source, XtInputId *id)
329
motif_pipe_int_read(&message);
333
case REFRESH_MESSAGE : {
334
printf("REFRESH MESSAGE IS OBSOLETE !!!\n");
338
case TOTALTIME_MESSAGE : {
341
char local_string[20];
345
motif_pipe_int_read(&cseconds);
347
seconds=cseconds/100;
350
sprintf(local_string,"/ %i:%02i",minutes,seconds);
352
XtSetArg(al[ac], XmNlabelString,
353
XmStringCreate(local_string, char_set)); ac++;
354
XtSetValues(totlbl, al, ac);
356
/* Readjust the time scale */
357
XmScaleSetValue(locator_scale,0);
359
XtSetArg(al[ac], XmNmaximum, cseconds); ac++;
360
XtSetValues(locator_scale, al, ac);
365
case MASTERVOL_MESSAGE: {
368
motif_pipe_int_read(&volume);
369
XmScaleSetValue(volume_scale,volume);
373
case FILENAME_MESSAGE : {
374
char filename[255], separator[255];
380
motif_pipe_string_read(filename);
382
/* Extract basename of the file */
383
pc=strrchr(filename,'/');
390
XtSetArg(al[ac], XmNlabelString,
391
XmStringCreate(pc, char_set)); ac++;
392
XtSetValues(file_namelbl, al, ac);
394
/* Change the icon */
396
XtSetArg(al[ac], XmNiconName,pc); ac++;
397
XtSetValues(toplevel,al,ac);
399
/* Put a separator in the text Window */
401
XtSetArg(al[ac], XmNcolumns,&nbcol); ac++;
402
XtGetValues(text,al,ac);
404
for (i=0;i<nbcol;i++)
408
XmTextInsert(text,wpr_position, separator);
409
wpr_position+= strlen(separator);
410
XmTextInsert(text,wpr_position++,"\n");
411
XtVaSetValues(text,XmNcursorPosition, wpr_position,NULL);
412
XmTextShowPosition(text,wpr_position);
416
case FILE_LIST_MESSAGE : {
418
int i, number_of_files;
421
/* reset the playing list : play from the start */
422
file_number_to_play=0;
424
motif_pipe_int_read(&number_of_files);
426
for (i=0;i<number_of_files;i++)
428
motif_pipe_string_read(filename);
429
s=XmStringCreate(filename,char_set);
430
XmListAddItemUnselected(file_list,s,0);
436
case NEXT_FILE_MESSAGE :
437
case PREV_FILE_MESSAGE :
438
case TUNE_END_MESSAGE :{
443
/* When a file ends, launch next if auto_next toggle */
444
if ((message==TUNE_END_MESSAGE) &&
445
!XmToggleButtonGetState(auto_next_option))
448
/* Total number of file to play in the list */
450
XtSetArg(al[ac], XmNitemCount, &nbfile); ac++;
451
XtGetValues(file_list, al, ac);
452
XmListDeselectAllItems(file_list);
454
if (message==PREV_FILE_MESSAGE)
455
file_number_to_play--;
457
file_number_to_play++;
459
/* Do nothing if requested file is before first one */
460
if (file_number_to_play<0)
462
file_number_to_play=1;
466
/* Stop after playing the last file */
467
if (file_number_to_play>nbfile)
469
file_number_to_play=nbfile;
473
XmListSelectPos(file_list,file_number_to_play,TRUE);
477
case CURTIME_MESSAGE : {
479
int sec,seconds, minutes;
481
char local_string[20];
485
motif_pipe_int_read(&cseconds);
486
motif_pipe_int_read(&nbvoice);
488
sec=seconds=cseconds/100;
490
/* To avoid blinking */
496
sprintf(local_string,"%2d:%02d",
500
XtSetArg(al[ac], XmNlabelString,
501
XmStringCreate(local_string, char_set)); ac++;
502
XtSetValues(counterlbl, al, ac);
507
/* Readjust the time scale if not dragging the scale */
508
if ( (locator_scale_button==ButtonRelease) &&
510
XmScaleSetValue(locator_scale, cseconds);
514
case NOTE_MESSAGE : {
518
motif_pipe_int_read(&channel);
519
motif_pipe_int_read(¬e);
520
printf("NOTE chn%i %i\n",channel,note);
524
case PROGRAM_MESSAGE :{
528
motif_pipe_int_read(&channel);
529
motif_pipe_int_read(&pgm);
530
printf("NOTE chn%i %i\n",channel,pgm);
534
case VOLUME_MESSAGE : {
538
motif_pipe_int_read(&channel);
539
motif_pipe_int_read(&volume);
540
printf("VOLUME= chn%i %i \n",channel, volume);
545
case EXPRESSION_MESSAGE : {
549
motif_pipe_int_read(&channel);
550
motif_pipe_int_read(&express);
551
printf("EXPRESSION= chn%i %i \n",channel, express);
555
case PANNING_MESSAGE : {
559
motif_pipe_int_read(&channel);
560
motif_pipe_int_read(&pan);
561
printf("PANNING= chn%i %i \n",channel, pan);
565
case SUSTAIN_MESSAGE : {
569
motif_pipe_int_read(&channel);
570
motif_pipe_int_read(&sust);
571
printf("SUSTAIN= chn%i %i \n",channel, sust);
575
case PITCH_MESSAGE : {
579
motif_pipe_int_read(&channel);
580
motif_pipe_int_read(&bend);
581
printf("PITCH BEND= chn%i %i \n",channel, bend);
585
case RESET_MESSAGE : {
586
printf("RESET_MESSAGE\n");
590
case CLOSE_MESSAGE : {
591
/* printf("CLOSE_MESSAGE\n"); */
596
case CMSG_MESSAGE : {
600
motif_pipe_int_read(&type);
601
motif_pipe_string_read(message);
603
if (*message == '~') {
604
XmTextInsert(text,wpr_position, message+1);
605
wpr_position+= strlen(message) - 1;
608
XmTextInsert(text,wpr_position, message);
609
wpr_position+= strlen(message);
610
XmTextInsert(text,wpr_position++,"\n");
612
XtVaSetValues(text,XmNcursorPosition, wpr_position,NULL);
613
XmTextShowPosition(text,wpr_position);
617
fprintf(stderr,"UNKNOWN MOTIF MESSAGE %i\n",message);
622
/* ***************************************
624
* Convenience function to create menus *
626
*****************************************/
628
/* adds an accelerator to a menu option. */
629
void add_accelerator(Widget w, const char *acc_text, const char *key)
635
XtSetArg(al[ac],XmNacceleratorText,
636
XmStringCreate((char *)acc_text,char_set)); ac++;
637
XtSetArg(al[ac],XmNaccelerator,key); ac++;
638
XtSetValues(w,al,ac);
641
/* Adds a toggle option to an existing menu. */
642
Widget make_menu_toggle(const char *item_name, int client_data, Widget menu)
649
XtSetArg(al[ac],XmNlabelString, XmStringCreateLtoR((char *)item_name,
651
item=XmCreateToggleButton(menu,(char *)item_name,al,ac);
653
XtAddCallback(item, XmNvalueChangedCallback,
654
(XtCallbackProc) menuCB,(XtPointer) client_data);
655
XtSetSensitive(item, True);
659
/* Adds an option to an existing menu. */
660
Widget make_menu_option(const char *option_name, KeySym mnemonic,
661
int client_data, Widget menu)
668
XtSetArg(al[ac], XmNlabelString,
669
XmStringCreateLtoR((char *)option_name, char_set)); ac++;
670
XtSetArg (al[ac], XmNmnemonic, mnemonic); ac++;
671
b=XtCreateManagedWidget(option_name,xmPushButtonWidgetClass,
673
XtAddCallback (b, XmNactivateCallback,
674
(XtCallbackProc) menuCB, (XtPointer) client_data);
678
/* Creates a new menu on the menu bar. */
679
Widget make_menu(const char *menu_name,KeySym mnemonic, Widget menu_bar)
683
Widget menu, cascade;
686
menu = XmCreatePulldownMenu (menu_bar, (char *)menu_name, al, ac);
689
XtSetArg (al[ac], XmNsubMenuId, menu); ac++;
690
XtSetArg (al[ac], XmNmnemonic, mnemonic); ac++;
691
XtSetArg(al[ac], XmNlabelString,
692
XmStringCreateLtoR((char *)menu_name, char_set)); ac++;
693
cascade = XmCreateCascadeButton (menu_bar, (char *)menu_name, al, ac);
694
XtManageChild (cascade);
699
/* *******************************************
701
* Interface initialisation before launching *
703
*********************************************/
705
void create_menus(Widget menu_bar)
709
menu=make_menu("File",'F',menu_bar);
710
open_option = make_menu_option("Open", 'O', MENU_OPEN, menu);
711
add_accelerator(open_option, "meta+o", "Meta<Key>o:");
713
quit_option = make_menu_option("Exit", 'E', MENU_QUIT, menu);
714
add_accelerator(quit_option, "meta+q", "Meta<Key>q:");
716
menu=make_menu("Options",'O',menu_bar);
717
auto_next_option= make_menu_toggle("Auto Next", MENU_TOGGLE, menu);
718
XmToggleButtonSetState( auto_next_option , True , False );
723
void create_dialog_boxes()
727
XmString add_all = XmStringCreateLocalized("ADD ALL");
729
/* create the file selection box used by MENU_OPEN */
731
XtSetArg(al[ac],XmNmustMatch,True); ac++;
732
XtSetArg(al[ac],XmNautoUnmanage,False); ac++;
733
XtSetArg(al[ac],XmNdialogTitle,
734
XmStringCreateLtoR("TIMIDITY: Open",char_set)); ac++;
735
open_dialog=XmCreateFileSelectionDialog(toplevel,"open_dialog",al,ac);
736
XtAddCallback(open_dialog, XmNokCallback,
737
(XtCallbackProc) openCB, (XtPointer) DIALOG_OK);
738
XtAddCallback(open_dialog, XmNcancelCallback,
739
(XtCallbackProc) openCB, (XtPointer) DIALOG_CANCEL);
740
XtUnmanageChild(XmFileSelectionBoxGetChild(open_dialog, XmDIALOG_HELP_BUTTON));
743
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
744
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
745
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
746
XtSetArg(al[ac], XmNbottomOffset, 10); ac++;
747
XtSetArg(al[ac], XmNlabelString, add_all); ac++;
748
add_all_button = XmCreatePushButton(open_dialog, "add_all",al, ac);
749
XtManageChild(add_all_button);
750
XtAddCallback(add_all_button, XmNactivateCallback,
751
(XtCallbackProc) openCB, (XtPointer) DIALOG_ALL);
754
void Launch_Motif_Process(int motif_pipe_number)
760
/* create the toplevel shell */
761
toplevel = XtAppInitialize(&context,"timidity",NULL,0,&argc,NULL,
764
/*******************/
766
/*******************/
768
XtSetArg(al[ac],XmNtopAttachment,XmATTACH_FORM); ac++;
769
XtSetArg(al[ac],XmNbottomAttachment,XmATTACH_FORM); ac++;
770
XtSetArg(al[ac],XmNrightAttachment,XmATTACH_FORM); ac++;
771
XtSetArg(al[ac],XmNleftAttachment,XmATTACH_FORM); ac++;
773
mainForm=XmCreateForm(toplevel,"form",al,ac);
774
XtManageChild(mainForm);
776
CreatePixmaps(mainForm);
779
/* create a menu bar and attach it to the form. */
781
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
782
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
783
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
784
menu_bar=XmCreateMenuBar(mainForm,"menu_bar",al,ac);
785
XtManageChild(menu_bar);
787
create_dialog_boxes();
788
create_menus(menu_bar);
790
/*******************/
792
/*******************/
795
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
796
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
797
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
798
XtSetArg(al[ac], XmNbottomOffset, 10); ac++;
799
XtSetArg(al[ac],XmNtopAttachment,XmATTACH_WIDGET); ac++;
800
XtSetArg(al[ac],XmNtopWidget, menu_bar); ac++;
801
XtSetArg(al[ac],XmNrightAttachment,XmATTACH_FORM); ac++;
802
XtSetArg(al[ac],XmNleftAttachment,XmATTACH_FORM); ac++;
803
XtSetArg(al[ac],XmNeditMode,XmMULTI_LINE_EDIT); ac++;
804
XtSetArg(al[ac],XmNrows,10); ac++;
805
XtSetArg(al[ac],XmNcolumns,10); ac++;
806
XtSetArg(al[ac],XmNeditable, False); ac++;
807
XtSetArg(al[ac],XmNwordWrap, True); ac++;
808
XtSetArg(al[ac],XmNvalue, "TIMIDIY RUNNING...\n"); ac++;
809
wpr_position+= strlen("TIMIDIY RUNNING...\n");
811
text=XmCreateScrolledText(mainForm,"text",al,ac);
813
parenttext=XtParent(text);
817
/********************/
818
/* File_name label */
819
/********************/
821
XtSetArg(al[ac], XmNleftOffset, 20); ac++;
822
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
823
XtSetArg(al[ac], XmNtopOffset, 20); ac++;
824
XtSetArg(al[ac], XmNbottomOffset, 20); ac++;
825
XtSetArg(al[ac], XmNlabelType, XmSTRING); ac++;
826
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
827
/* XtSetArg(al[ac], XmNtopWidget, text); ac++; */
828
XtSetArg(al[ac], XmNtopWidget, parenttext); ac++;
829
XtSetArg(al[ac], XmNleftAttachment,XmATTACH_FORM); ac++;
830
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
831
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
832
XtSetArg(al[ac], XmNalignment,XmALIGNMENT_END); ac++;
833
XtSetArg(al[ac], XmNlabelString,
834
XmStringCreate("Playing:",char_set)); ac++;
835
file_headlbl = XmCreateLabel(mainForm,"fileheadlbl",al,ac);
836
XtManageChild(file_headlbl);
840
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
841
XtSetArg(al[ac], XmNtopOffset, 20); ac++;
842
XtSetArg(al[ac], XmNbottomOffset, 20); ac++;
843
XtSetArg(al[ac], XmNlabelType, XmSTRING); ac++;
844
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
845
/* XtSetArg(al[ac], XmNtopWidget, text); ac++; */
846
XtSetArg(al[ac], XmNtopWidget, parenttext); ac++;
847
XtSetArg(al[ac], XmNleftAttachment,XmATTACH_WIDGET); ac++;
848
XtSetArg(al[ac], XmNleftWidget,file_headlbl); ac++;
849
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
850
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
851
XtSetArg(al[ac], XmNalignment,XmALIGNMENT_BEGINNING); ac++;
852
XtSetArg(al[ac], XmNlabelString,
853
XmStringCreate("NONE ",char_set)); ac++;
854
file_namelbl = XmCreateLabel(mainForm,"filenameLbl",al,ac);
855
XtManageChild(file_namelbl);
857
/*****************************/
858
/* TIME LABELS IN A FORM */
859
/*****************************/
863
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
864
XtSetArg(al[ac], XmNbottomOffset, 10); ac++;
865
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
866
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
867
XtSetArg(al[ac],XmNtopAttachment,XmATTACH_WIDGET); ac++;
868
/* XtSetArg(al[ac],XmNtopWidget,text); ac++; */
869
XtSetArg(al[ac],XmNtopWidget,parenttext); ac++;
870
XtSetArg(al[ac],XmNrightAttachment,XmATTACH_FORM); ac++;
872
XtSetArg(al[ac],XmNleftAttachment,XmATTACH_WIDGET); ac++;
873
XtSetArg(al[ac],XmNleftWidget,file_namelbl); ac++;
875
XtSetArg(al[ac],XmNshadowType,XmSHADOW_OUT); ac++;
876
countFrame=XmCreateFrame(mainForm,"countframe",al,ac);
877
XtManageChild(countFrame);
881
XtSetArg(al[ac],XmNtopAttachment,XmATTACH_FORM); ac++;
882
XtSetArg(al[ac],XmNbottomAttachment,XmATTACH_FORM); ac++;
883
XtSetArg(al[ac],XmNrightAttachment,XmATTACH_FORM); ac++;
884
XtSetArg(al[ac],XmNleftAttachment,XmATTACH_FORM); ac++;
885
XtSetArg(al[ac],XmNleftAttachment,XmATTACH_FORM); ac++;
887
countForm=XmCreateForm(countFrame,"countform",al,ac);
888
XtManageChild(countForm);
892
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
893
XtSetArg(al[ac], XmNlabelType, XmSTRING); ac++;
894
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
895
XtSetArg(al[ac], XmNleftAttachment,XmATTACH_FORM); ac++;
896
XtSetArg(al[ac], XmNrightAttachment,XmATTACH_FORM); ac++;
897
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
898
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
899
XtSetArg(al[ac], XmNlabelString,
900
XmStringCreate("Tempus Fugit",char_set)); ac++;
901
count_headlbl = XmCreateLabel(countForm,"countheadLbl",al,ac);
902
XtManageChild(count_headlbl);
904
/* current Time label */
906
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
907
XtSetArg(al[ac], XmNtopWidget, count_headlbl); ac++;
908
XtSetArg(al[ac], XmNleftAttachment,XmATTACH_FORM); ac++;
909
XtSetArg(al[ac], XmNbottomAttachment,XmATTACH_FORM); ac++;
910
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
911
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
912
XtSetArg(al[ac], XmNalignment,XmALIGNMENT_END); ac++;
913
XtSetArg(al[ac], XmNlabelString,
914
XmStringCreate("00:00",char_set)); ac++;
915
counterlbl = XmCreateLabel(countForm,"counterLbl",al,ac);
916
XtManageChild(counterlbl);
918
/* Total time label */
921
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
922
XtSetArg(al[ac], XmNtopWidget, count_headlbl); ac++;
923
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
924
XtSetArg(al[ac], XmNleftWidget, counterlbl); ac++;
925
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
926
XtSetArg(al[ac], XmNbottomAttachment,XmATTACH_FORM); ac++;
927
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
928
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
929
XtSetArg(al[ac], XmNalignment,XmALIGNMENT_BEGINNING); ac++;
930
XtSetArg(al[ac], XmNlabelString,
931
XmStringCreate("/ 00:00",char_set)); ac++;
932
totlbl = XmCreateLabel(countForm,"TotalTimeLbl",al,ac);
933
XtManageChild(totlbl);
939
* We need to add an xevent manager for buton pressing since
940
* locator_scale is a critical ressource that can be modified
941
* by shared by the handle input function
948
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
949
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
950
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
951
XtSetArg(al[ac], XmNbottomOffset, 10); ac++;
952
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
953
/* XtSetArg(al[ac], XmNtopWidget, countForm); ac++; */
954
XtSetArg(al[ac], XmNtopWidget, countFrame); ac++;
955
XtSetArg(al[ac], XmNleftAttachment,XmATTACH_FORM); ac++;
956
XtSetArg(al[ac], XmNrightAttachment,XmATTACH_FORM); ac++;
957
XtSetArg(al[ac], XmNmaximum, 100); ac++;
958
XtSetArg(al[ac], XmNminimum, 0); ac++;
959
XtSetArg(al[ac], XmNshowValue, True); ac++;
960
XtSetArg(al[ac], XmNdecimalPoints, 2); ac++;
961
XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
962
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
963
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
964
locator_scale = XmCreateScale(mainForm,"locator",al,ac);
965
XtManageChild(locator_scale);
966
XtAddCallback(locator_scale,XmNvalueChangedCallback,
967
(XtCallbackProc) Generic_scaleCB,
968
(XtPointer) MOTIF_CHANGE_LOCATOR);
970
/* Reach the scrollbar child in the scale */
972
XtSetArg(al[ac], XtNchildren, &WList); ac++;
973
XtSetArg(al[ac], XtNnumChildren, &Card); ac++;
974
XtGetValues(locator_scale,al,ac);
976
strcmp(XtName(WList[1]),"Scrollbar"))
977
fprintf(stderr,"PANIC: Scale has be redefined.. may cause bugs\n");
979
XtAddEventHandler(WList[1],ButtonPressMask|ButtonReleaseMask,
980
FALSE,Locator_btn,NULL);
983
/*****************************/
984
/* Control buttons in a form */
985
/*****************************/
987
/* create form for the row of control buttons */
989
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
990
XtSetArg(al[ac], XmNbottomOffset, 10); ac++;
991
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
992
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
993
XtSetArg(al[ac],XmNtopAttachment,XmATTACH_WIDGET); ac++;
994
XtSetArg(al[ac], XmNtopWidget, locator_scale); ac++;
995
btnForm = XmCreateForm(mainForm,"btnForm", al, ac);
996
XtManageChild(btnForm);
998
/* Previous Button */
1000
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
1001
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
1002
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
1003
XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
1004
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
1005
XtSetArg(al[ac], XmNlabelPixmap, prevPixmap); ac++;
1006
XtSetArg(al[ac], XmNhighlightThickness, 2); ac++;
1007
prevBtn = XmCreatePushButton(btnForm, "previous",al, ac);
1008
XtManageChild(prevBtn);
1009
XtAddCallback(prevBtn, XmNactivateCallback,
1010
(XtCallbackProc) GenericCB, (XtPointer) MOTIF_PREV);
1013
/* Backward Button */
1015
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
1016
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
1017
XtSetArg(al[ac], XmNleftWidget, prevBtn); ac++;
1018
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
1019
XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
1020
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
1021
XtSetArg(al[ac], XmNlabelPixmap, backPixmap); ac++;
1022
XtSetArg(al[ac], XmNhighlightThickness, 2); ac++;
1023
backBtn = XmCreatePushButton(btnForm, "backward",al, ac);
1024
XtManageChild(backBtn);
1025
XtAddCallback(backBtn, XmNactivateCallback,
1026
(XtCallbackProc) GenericCB, (XtPointer) MOTIF_RWD);
1028
/* Restart Button */
1030
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
1031
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
1032
XtSetArg(al[ac], XmNleftWidget, backBtn); ac++;
1033
XtSetArg(al[ac], XmNleftOffset, 2); ac++;
1034
XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
1035
XtSetArg(al[ac], XmNshadowThickness, 2); ac++;
1036
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
1037
XtSetArg(al[ac], XmNlabelPixmap, restartPixmap); ac++;
1038
XtSetArg(al[ac], XmNhighlightThickness, 2); ac++;
1039
restartBtn = XmCreatePushButton(btnForm,"restartBtn", al, ac);
1040
XtManageChild(restartBtn);
1041
XtAddCallback(restartBtn, XmNactivateCallback,
1042
(XtCallbackProc) GenericCB, (XtPointer) MOTIF_RESTART);
1046
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
1047
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
1048
XtSetArg(al[ac], XmNleftWidget, restartBtn); ac++;
1049
XtSetArg(al[ac], XmNleftOffset, 2); ac++;
1050
XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
1051
XtSetArg(al[ac], XmNshadowThickness, 2); ac++;
1052
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
1053
XtSetArg(al[ac], XmNlabelPixmap, quitPixmap); ac++;
1054
XtSetArg(al[ac], XmNhighlightThickness, 2); ac++;
1055
quitBtn = XmCreatePushButton(btnForm,"quitBtn", al, ac);
1056
XtManageChild(quitBtn);
1057
XtAddCallback(quitBtn, XmNactivateCallback,
1058
(XtCallbackProc) GenericCB, (XtPointer) MOTIF_QUIT);
1063
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
1064
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
1065
XtSetArg(al[ac], XmNleftWidget, quitBtn); ac++;
1066
XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
1067
XtSetArg(al[ac], XmNshadowThickness, 2); ac++;
1068
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
1069
XtSetArg(al[ac], XmNlabelPixmap, pausePixmap); ac++;
1070
XtSetArg(al[ac], XmNhighlightThickness, 2); ac++;
1071
pauseBtn = XmCreatePushButton(btnForm,"pauseBtn", al, ac);
1072
XtManageChild(pauseBtn);
1073
XtAddCallback(pauseBtn, XmNactivateCallback,
1074
(XtCallbackProc) GenericCB,(XtPointer) MOTIF_PAUSE);
1076
/* Forward Button */
1079
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
1080
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
1081
XtSetArg(al[ac], XmNleftWidget,pauseBtn); ac++;
1082
XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
1083
XtSetArg(al[ac], XmNshadowThickness, 2); ac++;
1084
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
1085
XtSetArg(al[ac], XmNlabelPixmap, fwdPixmap); ac++;
1086
XtSetArg(al[ac], XmNhighlightThickness, 2); ac++;
1087
fwdBtn = XmCreatePushButton(btnForm,"fwdBtn", al, ac);
1088
XtManageChild(fwdBtn);
1089
XtAddCallback(fwdBtn, XmNactivateCallback,
1090
(XtCallbackProc) GenericCB, (XtPointer) MOTIF_FWD);
1094
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
1095
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
1096
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
1097
XtSetArg(al[ac], XmNleftWidget, fwdBtn); ac++;
1098
XtSetArg(al[ac], XmNleftOffset, 2); ac++;
1099
XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
1100
XtSetArg(al[ac], XmNshadowThickness, 2); ac++;
1101
XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++;
1102
XtSetArg(al[ac], XmNlabelPixmap, nextPixmap); ac++;
1103
XtSetArg(al[ac], XmNhighlightThickness, 2); ac++;
1104
nextBtn = XmCreatePushButton(btnForm,"nextBtn", al, ac);
1105
XtManageChild(nextBtn);
1106
XtAddCallback(nextBtn, XmNactivateCallback,
1107
(XtCallbackProc) GenericCB, (XtPointer) MOTIF_NEXT);
1109
/********************/
1111
/********************/
1113
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
1114
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
1115
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
1116
XtSetArg(al[ac], XmNbottomOffset, 10); ac++;
1117
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
1118
XtSetArg(al[ac], XmNtopWidget, btnForm); ac++;
1119
XtSetArg(al[ac], XmNleftAttachment,XmATTACH_FORM); ac++;
1120
XtSetArg(al[ac], XmNbottomAttachment,XmATTACH_FORM); ac++;
1122
XtSetArg(al[ac], XmNmaximum, MAX_AMPLIFICATION); ac++;
1123
XtSetArg(al[ac], XmNminimum, 0); ac++;
1124
XtSetArg(al[ac], XmNshowValue, True); ac++;
1126
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
1127
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
1128
XtSetArg(al[ac], XmNtitleString,
1129
XmStringCreate("VOL",char_set)); ac++;
1130
volume_scale = XmCreateScale(mainForm,"volscale",al,ac);
1131
XtManageChild(volume_scale);
1132
XtAddCallback(volume_scale, XmNvalueChangedCallback,
1133
(XtCallbackProc) Generic_scaleCB,
1134
(XtPointer) MOTIF_CHANGE_VOLUME);
1137
/********************/
1139
/********************/
1142
XtSetArg(al[ac], XmNtopOffset, 10); ac++;
1143
XtSetArg(al[ac], XmNbottomOffset, 10); ac++;
1144
XtSetArg(al[ac], XmNleftOffset, 10); ac++;
1145
XtSetArg(al[ac], XmNrightOffset, 10); ac++;
1146
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
1147
XtSetArg(al[ac], XmNtopWidget, btnForm ); ac++;
1148
XtSetArg(al[ac], XmNleftAttachment,XmATTACH_WIDGET); ac++;
1149
XtSetArg(al[ac], XmNleftWidget, volume_scale); ac++;
1150
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
1151
XtSetArg(al[ac], XmNbottomAttachment,XmATTACH_FORM); ac++;
1153
XtSetArg(al[ac], XmNselectionPolicy ,XmSINGLE_SELECT); ac++;
1154
XtSetArg(al[ac], XmNscrollBarDisplayPolicy ,XmAS_NEEDED); ac++;
1155
XtSetArg(al[ac], XmNlistSizePolicy ,XmRESIZE_IF_POSSIBLE); ac++;
1157
XtSetArg(al[ac], XmNtraversalOn, False); ac++;
1158
XtSetArg(al[ac], XmNhighlightThickness,0); ac++;
1160
file_list = XmCreateScrolledList(mainForm,"File List",al,ac);
1161
XtManageChild(file_list);
1162
XtAddCallback(file_list, XmNsingleSelectionCallback,
1163
(XtCallbackProc) File_ListCB,
1167
* Last details on toplevel
1171
XtSetArg(al[ac],XmNwidth,400); ac++;
1172
XtSetArg(al[ac],XmNheight,800); ac++;
1174
XtSetArg(al[ac], XmNtitle, "Timidity 6.4f"); ac++;
1175
XtSetArg(al[ac], XmNiconName, "NONE"); ac++;
1176
XtSetArg(al[ac], XmNiconPixmap, timidityPixmap); ac++;
1177
XtSetValues(toplevel,al,ac);
1180
/*******************************************************/
1181
/* Plug the pipe ..... and heeere we go */
1182
/*******************************************************/
1184
XtAppAddInput(context,motif_pipe_number,
1185
(XtPointer) XtInputReadMask,handle_input,NULL);
1187
XtRealizeWidget(toplevel);
1188
XtAppMainLoop(context);
1190
#endif /* IA_MOTIF */