1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4     Rosegarden
5     A MIDI and audio sequencer and musical notation editor.
6     Copyright 2000-2021 the Rosegarden development team.
7 
8     This file is Copyright 2005
9         Toni Arnold         <toni__arnold@bluewin.ch>
10 
11     Other copyrights also apply to some parts of this work.  Please
12     see the AUTHORS file and individual file headers for details.
13 
14     This program is free software; you can redistribute it and/or
15     modify it under the terms of the GNU General Public License as
16     published by the Free Software Foundation; either version 2 of the
17     License, or (at your option) any later version.  See the file
18     COPYING included with this distribution for more information.
19 */
20 
21 #define RG_MODULE_STRING "[LircCommander]"
22 
23 #include "LircCommander.h"
24 #include "LircClient.h"
25 
26 #ifdef HAVE_LIRC
27 
28 #include "misc/Debug.h"
29 #include "document/RosegardenDocument.h"
30 #include "gui/editors/segment/TrackButtons.h"
31 #include "RosegardenMainWindow.h"
32 #include "RosegardenMainViewWidget.h"
33 #include "document/CommandHistory.h"
34 
35 #include <QObject>
36 #include <unistd.h>
37 
38 namespace Rosegarden
39 {
40 
LircCommander(LircClient * lirc,RosegardenMainWindow * rgGUIApp)41 LircCommander::LircCommander(LircClient *lirc, RosegardenMainWindow *rgGUIApp)
42         : QObject()
43 {
44     m_lirc = lirc;
45     m_rgGUIApp = rgGUIApp;
46     connect(m_lirc, &LircClient::buttonPressed,
47             this, &LircCommander::slotExecute );
48 
49     connect(this, &LircCommander::play,
50             m_rgGUIApp, &RosegardenMainWindow::slotPlay );
51     connect(this, &LircCommander::stop,
52             m_rgGUIApp, &RosegardenMainWindow::slotStop );
53     connect(this, &LircCommander::record,
54             m_rgGUIApp, &RosegardenMainWindow::slotRecord );
55     connect(this, &LircCommander::rewind,
56             m_rgGUIApp, &RosegardenMainWindow::slotRewind );
57     connect(this, &LircCommander::rewindToBeginning,
58             m_rgGUIApp, &RosegardenMainWindow::slotRewindToBeginning );
59     connect(this, &LircCommander::fastForward,
60             m_rgGUIApp, &RosegardenMainWindow::slotFastforward );
61     connect(this, &LircCommander::fastForwardToEnd,
62             m_rgGUIApp, &RosegardenMainWindow::slotFastForwardToEnd );
63     connect(this, &LircCommander::toggleRecord,
64             m_rgGUIApp, &RosegardenMainWindow::slotToggleRecord );
65     connect(this, &LircCommander::trackDown,
66             m_rgGUIApp, &RosegardenMainWindow::slotSelectNextTrack);
67     connect(this, &LircCommander::trackUp,
68             m_rgGUIApp, &RosegardenMainWindow::slotSelectPreviousTrack);
69     connect(this, SIGNAL(trackMute()),
70             m_rgGUIApp, SLOT(slotToggleMute()) );
71     connect(this, &LircCommander::trackRecord,
72             m_rgGUIApp, &RosegardenMainWindow::slotToggleRecordCurrentTrack );
73     connect(this, &LircCommander::undo,
74             CommandHistory::getInstance(), &CommandHistory::undo );
75     connect(this, &LircCommander::redo,
76             CommandHistory::getInstance(), &CommandHistory::redo );
77     connect(this, &LircCommander::aboutrg,
78             m_rgGUIApp, &RosegardenMainWindow::slotHelpAbout );
79     connect(this, &LircCommander::editInMatrix,
80             m_rgGUIApp, &RosegardenMainWindow::slotEditInMatrix );
81     connect(this, &LircCommander::editInPercussionMatrix,
82             m_rgGUIApp, &RosegardenMainWindow::slotEditInPercussionMatrix );
83     connect(this, &LircCommander::editInEventList,
84             m_rgGUIApp, &RosegardenMainWindow::slotEditInEventList );
85     connect(this, &LircCommander::editAsNotation,
86             m_rgGUIApp, &RosegardenMainWindow::slotEditAsNotation );
87     connect(this, &LircCommander::quit,
88             m_rgGUIApp, &RosegardenMainWindow::slotQuit );
89     connect(this, &LircCommander::closeTransport,
90             m_rgGUIApp, &RosegardenMainWindow::slotCloseTransport );
91     connect(this, &LircCommander::toggleTransportVisibility,
92             m_rgGUIApp, &RosegardenMainWindow::slotToggleTransportVisibility );
93 }
94 
95 LircCommander::command LircCommander::commands[] =
96     {
97         { "ABOUTRG",            cmd_aboutrg },
98         { "CLOSETRANSPORT",     cmd_closeTransport },
99         { "EDITEVLIST",         cmd_editInEventList },
100         { "EDITMATRIX",         cmd_editInMatrix },
101         { "EDITNOTATION",       cmd_editAsNotation },
102         { "EDITPMATRIX",        cmd_editInPercussionMatrix },
103         { "FORWARD",            cmd_fastForward },
104         { "FORWARDTOEND",       cmd_fastForwardToEnd },
105         { "PLAY",               cmd_play },
106         { "PUNCHINRECORD",      cmd_toggleRecord },
107         { "QUIT",               cmd_quit },
108         { "RECORD",             cmd_record },
109         { "REDO",               cmd_redo },
110         { "REWIND",             cmd_rewind },
111         { "REWINDTOBEGINNING",  cmd_rewindToBeginning },
112         { "STOP",               cmd_stop },
113         { "TOGGLETRANSPORT",    cmd_toggleTransportVisibility },
114         { "TRACK+",             cmd_trackUp },
115         { "TRACK-",             cmd_trackDown },
116         { "TRACK-MUTE",         cmd_trackMute },
117         { "TRACK-RECORD",       cmd_trackRecord },
118         { "UNDO",               cmd_undo },
119     };
120 
121 
compareCommandName(const void * c1,const void * c2)122 int LircCommander::compareCommandName(const void *c1, const void *c2)
123 {
124     return (strcmp(((struct command *)c1)->name, ((struct command *)c2)->name));
125 }
126 
slotExecute(const char * command)127 void LircCommander::slotExecute(const char *command)
128 {
129     struct command tmp, *res;
130 
131     RG_DEBUG << "LircCommander::slotExecute: invoking command: " << command;
132 
133     // find the function for the name
134     tmp.name = command;
135     res = (struct command *)bsearch(&tmp, commands,
136                                     sizeof(commands) / sizeof(struct command),
137                                     sizeof(struct command),
138                                     compareCommandName);
139     if (res != nullptr)
140     {
141         switch (res->code)
142         {
143         case cmd_play:
144             emit play();
145             break;
146         case cmd_stop:
147             emit stop();
148             break;
149         case cmd_record:
150             emit record();
151             break;
152         case cmd_rewind:
153             emit rewind();
154             break;
155         case cmd_rewindToBeginning:
156             emit rewindToBeginning();
157             break;
158         case cmd_fastForward:
159             emit fastForward();
160             break;
161         case cmd_fastForwardToEnd:
162             emit fastForwardToEnd();
163             break;
164         case cmd_toggleRecord:
165             emit toggleRecord();
166             break;
167         case cmd_trackDown:
168             emit trackDown();
169             break;
170         case cmd_trackUp:
171             emit trackUp();
172             break;
173         case cmd_trackMute:
174             emit trackMute();
175             break;
176         case cmd_trackRecord:
177             emit trackRecord();
178             break;
179         case cmd_undo:
180             emit undo();
181             break;
182         case cmd_redo:
183             emit redo();
184             break;
185         case cmd_aboutrg:
186             emit aboutrg();
187             break;
188         case cmd_editInEventList:
189             emit editInEventList();
190             break;
191         case cmd_editInMatrix:
192             emit editInMatrix();
193             break;
194         case cmd_editInPercussionMatrix:
195             emit editInPercussionMatrix();
196             break;
197         case cmd_editAsNotation:
198             emit editAsNotation();
199             break;
200         case cmd_quit:
201             emit quit();
202             break;
203         case cmd_closeTransport:
204             emit closeTransport();
205             break;
206         case cmd_toggleTransportVisibility:
207             emit toggleTransportVisibility();
208             break;
209         default:
210             RG_DEBUG <<  "LircCommander::slotExecute: unhandled command " << command;
211             return;
212         }
213         RG_DEBUG <<  "LircCommander::slotExecute: handled command: " << command;
214     }
215     else
216     {
217         RG_DEBUG <<  "LircCommander::slotExecute: invoking command: " << command
218                  <<  " failed (command not defined in LircCommander::commands[])";
219     };
220 }
221 
222 }
223 
224 
225 #endif
226