vdr_remote.cpp

00001 
00004 /*
00005 vdr_remote - A Graphic Remote Control Utility for Klaus Schidinger's vdr (www.cadsoft.de/vdr)
00006 
00007   Copyright (C)2006 Peter Marquardt p_marquardt@users.sourceforge.net
00008 */
00009 /*
00010  This program is free software; you can redistribute it and/or modify
00011     it under the terms of the GNU General Public License as published by
00012     the Free Software Foundation; either version 2 of the License, or
00013     (at your option) any later version.
00014 
00015     This program is distributed in the hope that it will be useful,
00016     but WITHOUT ANY WARRANTY; without even the implied warranty of
00017     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018     GNU General Public License for more details.
00019 
00020     You should have received a copy of the GNU General Public License
00021     along with this program; if not, write to the Free Software
00022     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00023 */
00024                 
00025                 
00026 
00027 #include "vdr_remote.h"
00028 #include "mytaskbaricon.h"
00029                 
00030 BEGIN_EVENT_TABLE( vdr_remoteFrame, wxFrame )
00031         EVT_MENU( wxID_EXIT, vdr_remoteFrame::OnQuit )
00032         EVT_MENU( wxID_ABOUT, vdr_remoteFrame::OnAbout )
00033         EVT_MENU(wxID_PREFERENCES,vdr_remoteFrame::OnBtnPrefs)
00034         EVT_BUTTON(wxID_PREFERENCES,vdr_remoteFrame::OnBtnPrefs)
00035         EVT_MENU_RANGE(Button_OK, Button_User9, vdr_remoteFrame::OnAccelerator)
00036         EVT_COMMAND_RANGE(Button_OK, Button_User9, wxEVT_COMMAND_BUTTON_CLICKED,vdr_remoteFrame::OnAccelerator)
00037         EVT_SOCKET(Vdr_Socket, vdr_remoteFrame::OnSocketEvent)
00038         EVT_CHECKBOX(Button_StayOnTop, vdr_remoteFrame::ToggleStayOnTop)
00039         EVT_ICONIZE(vdr_remoteFrame::OnIconize)
00040         EVT_MENU(Button_GetDiskStat, vdr_remoteFrame::GetDiskStat )
00041         EVT_MENU(wxID_HELP, vdr_remoteFrame::ShowHelpDlg )
00042         //EVT_SPINCTRL(Spin_Disk_Stat_Timeout , vdr_remoteFrame::OnSpinEvent )
00043         //EVT_SPIN(Spin_Disk_Stat_Timeout , vdr_remoteFrame::OnSpinEvent )
00044 END_EVENT_TABLE()
00045 
00046 IMPLEMENT_APP(vdr_remoteapp)
00047 
00048 
00049 vdr_remoteFrame *frame =NULL;
00050 
00051 bool 
00052 vdr_remoteapp::OnInit()
00053 {
00054           
00055         SetAppName(wxT("vdr_remote"));
00056         frame = new vdr_remoteFrame( wxT( "vdr_remote" ), wxPoint(50,50), wxSize(450,340),(long) wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN | wxWANTS_CHARS);
00057 #ifdef __WXMSW__
00058         frame->SetIcon(wxIcon(wxT("vdr_remote_icon.ico"),wxBITMAP_TYPE_ICO));
00059 #else
00060         frame->SetIcon(wxICON(vdr_remote_icon));
00061 #endif
00062         
00063 
00064         frame->Show(TRUE);
00065         SetTopWindow(frame);
00066         
00067         return TRUE;
00068 } 
00069 vdr_remoteFrame::~vdr_remoteFrame()
00070 {
00071         if (my_tb_icon) delete my_tb_icon;
00072         if (my_prefs) delete my_prefs;
00073 }
00074 
00075 vdr_remoteFrame::vdr_remoteFrame( const wxString& title, const wxPoint& pos, const wxSize& size, const long& style)
00076         : wxFrame((wxFrame *)NULL, -1, title, pos, size,style)
00077 {
00078         my_prefs = new wxConfig();
00079         my_tb_icon = new MyTaskbarIcon();
00080 #ifdef __WXMSW__
00081         my_tb_icon->SetIcon(wxIcon(wxT("vdr_remote_icon.ico"),wxBITMAP_TYPE_ICO), wxT("vdr_remote"));
00082 #else
00083         my_tb_icon->SetIcon(wxICON(vdr_remote_icon), wxT("vdr_remote"));
00084 #endif
00085         
00086         LoadPreferences();
00087         socket_data_needed = false;
00088         vdr_client = new wxSocketClient ();
00089         vdr_client->SetEventHandler(*this,Vdr_Socket);
00090         vdr_client->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG | wxSOCKET_CONNECTION_FLAG);
00091         vdr_client->Notify(true);
00092         
00093         connection_is_alive =false; 
00094         num_connection_failures = 0;
00095         socket_data_available = false;
00096         
00097         wxAcceleratorEntry entries[44];
00098         entries[0].Set(wxACCEL_NORMAL, WXK_RETURN,     Button_OK);
00099         entries[1].Set(wxACCEL_NORMAL,  WXK_BACK,    Button_Back);
00100         entries[2].Set(wxACCEL_NORMAL, WXK_F1, Button_Red);
00101         entries[3].Set(wxACCEL_NORMAL, WXK_F2, Button_Green);
00102         entries[4].Set(wxACCEL_NORMAL, WXK_F3, Button_Yellow);
00103         entries[5].Set(wxACCEL_NORMAL, WXK_F4, Button_Blue);
00104         entries[6].Set(wxACCEL_NORMAL,  (int) '1',    Button_1);
00105         entries[7].Set(wxACCEL_NORMAL,  (int) '2',    Button_2);
00106         entries[8].Set(wxACCEL_NORMAL,  (int) '3',    Button_3);
00107         entries[9].Set(wxACCEL_NORMAL,  (int) '4',    Button_4);
00108         entries[10].Set(wxACCEL_NORMAL,  (int) '5',    Button_5);
00109         entries[11].Set(wxACCEL_NORMAL,  (int) '6',    Button_6);       
00110         entries[12].Set(wxACCEL_NORMAL,  (int) '7',    Button_7);
00111         entries[13].Set(wxACCEL_NORMAL,  (int) '8',    Button_8);       
00112         entries[14].Set(wxACCEL_NORMAL,  (int) '9',    Button_9);
00113         entries[15].Set(wxACCEL_NORMAL,  (int) '0',    Button_0);
00114         entries[16].Set(wxACCEL_NORMAL, WXK_LEFT,     Button_Left);
00115         entries[17].Set(wxACCEL_NORMAL,  WXK_RIGHT,    Button_Right);   
00116         entries[18].Set(wxACCEL_NORMAL, WXK_UP,     Button_Up);
00117         entries[19].Set(wxACCEL_NORMAL,  WXK_DOWN,    Button_Down);
00118         entries[20].Set(wxACCEL_NORMAL,  (int) ',',    Button_ChDo);
00119         entries[21].Set(wxACCEL_NORMAL,  (int) '.',    Button_ChUp);    
00120         entries[22].Set(wxACCEL_SHIFT,  (int) 'Q',    Button_Power);
00121         entries[23].Set(wxACCEL_NORMAL,  (int) '+',    Button_Volup);
00122         entries[24].Set(wxACCEL_NORMAL,  (int) '-',    Button_Voldown);
00123         entries[25].Set(wxACCEL_NORMAL,  (int) 'm',   Button_Menu);
00124         entries[26].Set(wxACCEL_NORMAL,  (int) 's',     Button_Mute);
00125         entries[27].Set(wxACCEL_NORMAL,  (int) 'k',     Button_Play);
00126         entries[28].Set(wxACCEL_NORMAL,  (int) 'j',     Button_Rew);
00127         entries[29].Set(wxACCEL_NORMAL,  (int) 'l',     Button_Ffwd);
00128         entries[30].Set(wxACCEL_NORMAL,  (int) 'o',     Button_Stop);
00129         entries[31].Set(wxACCEL_NORMAL,  (int) 'u',     Button_Pause);
00130         entries[32].Set(wxACCEL_SHIFT,  (int) 'R',     Button_Rec);
00131         entries[33].Set(wxACCEL_NORMAL,  (int) 'n',     Button_Next);
00132         entries[34].Set(wxACCEL_NORMAL,  (int) 'p',     Button_Prev);
00133         entries[35].Set(wxACCEL_CTRL,  (int) '1',     Button_User1);
00134         entries[36].Set(wxACCEL_CTRL,  (int) '2',     Button_User2);
00135         entries[37].Set(wxACCEL_CTRL,  (int) '3',     Button_User3);
00136         entries[38].Set(wxACCEL_CTRL,  (int) '4',     Button_User4);
00137         entries[39].Set(wxACCEL_CTRL,  (int) '5',     Button_User5);
00138         entries[40].Set(wxACCEL_CTRL,  (int) '6',     Button_User6);
00139         entries[41].Set(wxACCEL_CTRL,  (int) '7',     Button_User7);
00140         entries[42].Set(wxACCEL_CTRL,  (int) '8',     Button_User8);
00141         entries[43].Set(wxACCEL_CTRL,  (int) '9',     Button_User9);
00142         
00143         wxAcceleratorTable accel(44, entries);
00144         this->SetAcceleratorTable(accel);
00145 
00146         main_panel = new wxPanel(this); 
00147         main_panel->SetFocus();
00148         main_panel->SetBackgroundColour(wxColour(225,225,225));
00149 
00150         
00151         wxBoxSizer *whole_win = new wxBoxSizer (wxVERTICAL);
00152         main_panel->SetSizer(whole_win);
00153         
00154          wxFlexGridSizer* numeric_box = new wxFlexGridSizer(3,4,2);
00155          AddNumberButtons(numeric_box);
00156         whole_win->Add(numeric_box);
00157         whole_win->AddSpacer(8);
00158         
00159         wxFlexGridSizer *col_box = new wxFlexGridSizer (4,1,2);
00160         AddColourButtons(col_box);
00161         whole_win->Add(col_box);
00162         whole_win->AddSpacer(8);
00163         
00164         wxFlexGridSizer *menu_box = new wxFlexGridSizer(3,4,2);
00165         AddMenuButtons(menu_box);
00166         whole_win->Add(menu_box);
00167         whole_win->AddSpacer(8);
00168         
00169         if (show_player_buttons) 
00170         {       
00171                 wxFlexGridSizer *player_box = new wxFlexGridSizer (4,2,2);
00172                 AddPlayerButtons(player_box);
00173                 whole_win->Add(player_box);
00174                 whole_win->AddSpacer(8);
00175         }
00176         
00177         wxFlexGridSizer *extended_keys_box = new wxFlexGridSizer (4,2,2);
00178         AddExtendedButtons(extended_keys_box);
00179         whole_win->Add(extended_keys_box);
00180         whole_win->AddSpacer(8);
00181         
00182         if (show_user_buttons) 
00183         {
00184                 wxFlexGridSizer *userbuttons_box = new wxFlexGridSizer (3,2,2);
00185                 AddUserButtons(userbuttons_box);
00186                 whole_win->Add(userbuttons_box);
00187                 whole_win->AddSpacer(8);
00188         }
00189         
00190         wxBoxSizer *toggles_box = new wxBoxSizer(wxVERTICAL);
00191         wxCheckBox * cb_stay_on_top = new wxCheckBox(main_panel, Button_StayOnTop, wxT("Stay on top"),  wxPoint(-1,-1),wxSize(-1,-1),0);
00192         cb_stay_on_top->SetValue(false);
00193         cb_stay_on_top->SetToolTip(_("Always stay on top of other windows"));
00194         toggles_box->Add(cb_stay_on_top);
00195         whole_win->Add(toggles_box);
00196         whole_win->AddSpacer(8);
00197 
00198 //      wxButton *key_diskstat = new wxButton(main_panel,Button_GetDiskStat,wxT("Get Diskstatus"));
00199 //      whole_win->Add(key_diskstat);
00200 //      whole_win->AddSpacer(8);
00201         
00202         if (show_socket_viewer)
00203         {
00204                 socket_viewer = new wxTextCtrl (main_panel, Socket_Viewer,_(""),wxPoint(-1,-1),wxSize(140,120),wxTE_MULTILINE | wxTE_READONLY);
00205                 whole_win->Add(socket_viewer);
00206         }
00207 
00208         wxMenu *menuFile = new wxMenu;
00209         menuFile->Append( wxID_ABOUT, wxT( "&About..." ) );
00210         menuFile->AppendSeparator();
00211         menuFile->Append(wxID_PREFERENCES,wxT("&Preferences..."));
00212         menuFile->AppendSeparator();
00213         menuFile->Append( wxID_EXIT, wxT( "E&xit" ) );
00214         
00215         wxMenu *menuExtras = new wxMenu;
00216         menuExtras->Append(Button_GetDiskStat,wxT("Show vdr &Disk Status..."));
00217         
00218         wxMenu *menuHelp = new wxMenu;
00219         menuHelp->Append(wxID_HELP,wxT("vdr_remote Usage"));
00220         
00221         wxMenuBar *menuBar = new wxMenuBar;
00222         menuBar->Append( menuFile, wxT( "&File" ));
00223         menuBar->Append(menuExtras, wxT("&Extras"));
00224         menuBar->Append(menuHelp, wxT("&Help"));
00225         SetMenuBar( menuBar );
00226         CreateStatusBar();
00227         SetStatusText( wxT( "Welcome to vdr_remote!" ) );
00228         whole_win->Fit(this);
00229         main_panel->SetFocus(); 
00230         key_ok->SetFocus(); //automatically set focus back to ok button so Return works as expected on windows
00231 
00232 }
00233 
00234 void vdr_remoteFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) )
00235 {
00236         Disconnect();
00237         if (my_prefs) delete my_prefs;
00238         if (vdr_client) delete vdr_client;
00239         if (my_tb_icon) delete my_tb_icon;
00240         if (my_socket_buffer) delete my_socket_buffer;
00241         Close(TRUE);
00242 }
00243 
00244 
00245 void vdr_remoteFrame::OnAccelerator(wxCommandEvent& event) 
00246 {
00247         
00248         switch (event.GetId())
00249         {
00250                 case  Button_ChUp:
00251                         SendMessage("chan +");
00252                         break;
00253                 case  Button_ChDo:
00254                         SendMessage("chan -");
00255                         break;
00256                 case  Button_0:
00257                         SendMessage("HITK 0");
00258                         break;
00259                 case  Button_1:
00260                         SendMessage("HITK 1");
00261                         break;
00262                 case  Button_2:
00263                         SendMessage("HITK 2");
00264                         break;
00265                 case  Button_3:
00266                         SendMessage("HITK 3");
00267                         break;
00268                 case  Button_4:
00269                         SendMessage("HITK 4");
00270                         break;
00271                 case  Button_5:
00272                         SendMessage("HITK 5");
00273                         break;
00274                 case  Button_6:
00275                         SendMessage("HITK 6");
00276                         break;
00277                 case  Button_7:
00278                         SendMessage("HITK 7");
00279                         break;
00280                 case  Button_8:
00281                         SendMessage("HITK 8");
00282                         break;
00283                 case  Button_9:
00284                         SendMessage("HITK 9");
00285                         break;
00286                 case  Button_Menu:
00287                         socket_data_needed = true;
00288                         SendMessage("HITK menu");
00289                         break;
00290                 case  Button_Back:
00291                         SendMessage("HITK back");
00292                         break;
00293                 case  Button_Red:
00294                         SendMessage("HITK red");
00295                         break;
00296                 case  Button_Green:
00297                         SendMessage("HITK green");
00298                         break;
00299                 case  Button_Yellow:
00300                         SendMessage("HITK yellow");
00301                         break;
00302                 case  Button_Blue:
00303                         SendMessage("HITK blue");
00304                         break;
00305                 case  Button_Power:
00306                         SendMessage("HITK power");
00307                         break;
00308                 case  Button_OK:
00309                         SendMessage("HITK ok");
00310                         break;
00311                 case  Button_Right:
00312                         SendMessage("HITK Right");
00313                         break;
00314                 case Button_Left:
00315                         SendMessage("HITK Left");
00316                         break;
00317                 case Button_Up:
00318                         SendMessage("HITK up");
00319                         break;
00320                 case Button_Down:
00321                         SendMessage("HITK down");
00322                         break;
00323                 case  Button_Mute:
00324                         SendMessage("volu mute");
00325                         break;
00326                 case  Button_Voldown:
00327                         SendMessage("hitk volume-");
00328                         break;
00329                 case  Button_Volup:
00330                         SendMessage("hitk volume+");
00331                         break;
00332                 case Button_Prev:
00333                         SendMessage("HITK Prev");
00334                         break;
00335                 case Button_Next:
00336                         SendMessage("HITK next");
00337                         break;
00338                 case Button_Rec:
00339                         SendMessage("HITK Record");
00340                         break;
00341                 case Button_Stop:
00342                         SendMessage("HITK Stop");
00343                         break;
00344                 case Button_Rew:
00345                         SendMessage("HITK FastRew");
00346                         break;
00347                 case Button_Ffwd:
00348                         SendMessage("HITK FastFwd");
00349                         break;
00350                 case Button_Pause:
00351                         SendMessage("HITK pause");
00352                         break;
00353                 case Button_Play:
00354                         SendMessage("HITK play");
00355                         break;
00356                 case Button_Schedule:
00357                         SendMessage("HITK schedule");
00358                         break;
00359                 case Button_Audio:
00360                         SendMessage("HITK audio");
00361                         break;
00362                 case Button_Info:
00363                         SendMessage("HITK info");
00364                         break;
00365                 case Button_Recordings:
00366                         SendMessage("HITK recordings");
00367                         break;
00368                 case Button_Timers:
00369                         SendMessage("HITK timers");
00370                         break;
00371                 case Button_Commands:
00372                         SendMessage("HITK commands");
00373                         break;
00374                 case Button_Setup:
00375                         SendMessage("HITK setup");
00376                         break;
00377                 case Button_Channels:
00378                         SendMessage("HITK channels");
00379                         break;
00380                 case Button_User1:
00381                         SendMessage("HITK User1");
00382                         break;
00383                 case Button_User2:
00384                         SendMessage("HITK User2");
00385                         break;
00386                 case Button_User3:
00387                         SendMessage("HITK User3");
00388                         break;
00389                 case Button_User4:
00390                         SendMessage("HITK User4");
00391                         break;
00392                 case Button_User5:
00393                         SendMessage("HITK User5");
00394                         break;
00395                 case Button_User6:
00396                         SendMessage("HITK User6");
00397                         break;
00398                 case Button_User7:
00399                         SendMessage("HITK User7");
00400                         break;
00401                 case Button_User8:
00402                         SendMessage("HITK User8");
00403                         break;
00404                 case Button_User9:
00405                         SendMessage("HITK User9");
00406                         break;
00407                 default:
00408                         break;
00409         }
00410         if (show_socket_viewer ) 
00411         {
00412                 // we need a little time to wait for all data to arrive in the socket buffer,
00413                 // so if we need the returned data we set a timeout of 50ms
00414                 vdr_client->WaitForRead(0,170);
00415         }
00416         Disconnect();
00417         key_ok->SetFocus(); //automatically set focus back to ok button so Return works as expected on windows
00418 }

Generated on Sun Nov 5 22:39:03 2006 for vdr_remote by  doxygen 1.4.6