From 6691bf3637acb31dc8bf23023fd75f1782672bbc Mon Sep 17 00:00:00 2001 From: Chris Tallon Date: Thu, 28 Dec 2006 16:32:36 +0000 Subject: [PATCH] Mouse support (part 2) --- demuxer.cc | 2 +- vaudioselector.cc | 5 +- vchannellist.cc | 5 +- vepg.cc | 5 +- vepgsettimer.cc | 43 ++ vepgsettimer.h | 1 + viewman.cc | 1 + vinfo.cc | 8 + vinfo.h | 2 + vlivebanner.cc | 34 + vlivebanner.h | 1 + voptions.cc | 46 ++ voptions.h | 1 + voptionsmenu.cc | 43 +- vquestion.cc | 42 ++ vquestion.h | 1 + vrecmove.cc | 29 + vrecmove.h | 1 + vrecordinglist.cc | 42 +- vrecordingmenu.cc | 27 +- vserverselect.cc | 19 + vserverselect.h | 1 + vtimeredit.cc | 8 + vtimeredit.h | 1 + vtimerlist.cc | 29 + vtimerlist.h | 1 + vvideolive.cc | 6 +- vvideorec.cc | 70 +- vwelcome.cc | 19 + vwelcome.h | 1 + winmain.cc | 1692 +++++++++++++++++++++++---------------------- 31 files changed, 1334 insertions(+), 852 deletions(-) diff --git a/demuxer.cc b/demuxer.cc index 87fe47e..1a78046 100644 --- a/demuxer.cc +++ b/demuxer.cc @@ -218,7 +218,7 @@ int Demuxer::PESPacket::submit() dx->avail_mpaudchan[packetType-PESTYPE_AUD0]=true; - Log::getInstance()->log("PESPacket", Log::DEBUG, "%i", dx->audio_current); + //Log::getInstance()->log("PESPacket", Log::DEBUG, "%i", dx->audio_current); if (dx->audio_current == packetType && !dx->aud_seeking) sent = dx->audiostream.put(data+submitted, size-submitted); else diff --git a/vaudioselector.cc b/vaudioselector.cc index d44dff5..d800f62 100644 --- a/vaudioselector.cc +++ b/vaudioselector.cc @@ -239,10 +239,8 @@ void VAudioSelector::processMessage(Message* m) sl.draw(); ViewMan::getInstance()->updateView(this); } - return; } - - if (m->message == Message::MOUSE_LBDOWN) + else if (m->message == Message::MOUSE_LBDOWN) { if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) { @@ -257,6 +255,5 @@ void VAudioSelector::processMessage(Message* m) ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press } } - return; } } diff --git a/vchannellist.cc b/vchannellist.cc index 424a886..e23a7f9 100644 --- a/vchannellist.cc +++ b/vchannellist.cc @@ -225,10 +225,8 @@ void VChannelList::processMessage(Message* m) doShowingBar(); ViewMan::getInstance()->updateView(this); } - return; } - - if (m->message == Message::MOUSE_LBDOWN) + else if (m->message == Message::MOUSE_LBDOWN) { if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) { @@ -243,6 +241,5 @@ void VChannelList::processMessage(Message* m) ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press } } - return; } } \ No newline at end of file diff --git a/vepg.cc b/vepg.cc index d60f194..03f293e 100644 --- a/vepg.cc +++ b/vepg.cc @@ -632,10 +632,8 @@ void VEpg::processMessage(Message* m) drawData(); ViewMan::getInstance()->updateView(this); } - return; } - - if (m->message == Message::MOUSE_LBDOWN) + else if (m->message == Message::MOUSE_LBDOWN) { if (chanListbox.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) { @@ -705,6 +703,5 @@ void VEpg::processMessage(Message* m) viewman->updateView(this); } } - return; } } diff --git a/vepgsettimer.cc b/vepgsettimer.cc index 57ef730..4e0bcef 100644 --- a/vepgsettimer.cc +++ b/vepgsettimer.cc @@ -268,3 +268,46 @@ void VEpgSetTimer::doit() m->parameter = (ULONG)vi; Command::getInstance()->postMessageNoLock(m); } + + +void VEpgSetTimer::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + if (buttonYes.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + buttonNo.setActive(0); + selectedOption = YES; + draw(); + ViewMan::getInstance()->updateView(this); + } + else if (buttonNo.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + buttonYes.setActive(0); + selectedOption = NO; + draw(); + ViewMan::getInstance()->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (buttonYes.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else if (buttonNo.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else + { + //check if press is outside this view! then simulate cancel + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } +} diff --git a/vepgsettimer.h b/vepgsettimer.h index bd13583..b2ee0f9 100644 --- a/vepgsettimer.h +++ b/vepgsettimer.h @@ -42,6 +42,7 @@ class VEpgSetTimer : public View ~VEpgSetTimer(); int handleCommand(int command); + void processMessage(Message* m); void draw(); private: diff --git a/viewman.cc b/viewman.cc index 9b03c63..0a15620 100644 --- a/viewman.cc +++ b/viewman.cc @@ -437,6 +437,7 @@ void ViewMan::processMessage(Message* m) add(toAdd); toAdd->draw(); updateView(toAdd); + break; } } } diff --git a/vinfo.cc b/vinfo.cc index 1febf92..790c451 100644 --- a/vinfo.cc +++ b/vinfo.cc @@ -112,3 +112,11 @@ void VInfo::okButton() { okbutton = true; } + +void VInfo::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_LBDOWN) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } +} diff --git a/vinfo.h b/vinfo.h index d8e7783..4f806bd 100644 --- a/vinfo.h +++ b/vinfo.h @@ -30,6 +30,7 @@ #include "colour.h" #include "wbutton.h" #include "i18n.h" +#include "viewman.h" class VInfo : public View { @@ -44,6 +45,7 @@ class VInfo : public View void okButton(); virtual int handleCommand(int command); + void processMessage(Message* m); void draw(); protected: diff --git a/vlivebanner.cc b/vlivebanner.cc index 6ab28c5..2dc9c3f 100644 --- a/vlivebanner.cc +++ b/vlivebanner.cc @@ -291,3 +291,37 @@ void VLiveBanner::drawClock() Timers::getInstance()->setTimerT(this, 2, dt); } + +void VLiveBanner::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + sl.draw(); + ViewMan::getInstance()->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + //check if press is outside this view! then simulate cancel + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + else if (y>=(int)area.h-24 && y<=(int)area.h-6) + { + //y coordinate is right! + if (x>=7 &&x<=25) + { + ViewMan::getInstance()->handleCommand(Remote::RED); //simulate red press + } + else if (x>=110 &&x<=128) + { + ViewMan::getInstance()->handleCommand(Remote::GREEN); //simulate red press + } + } + } +} diff --git a/vlivebanner.h b/vlivebanner.h index 5ea6f38..85ee138 100644 --- a/vlivebanner.h +++ b/vlivebanner.h @@ -53,6 +53,7 @@ class VLiveBanner : public View, public TimerReceiver void setChannel(Channel* channel); int handleCommand(int command); + void processMessage(Message* m); void draw(); void timercall(int clientReference); diff --git a/voptions.cc b/voptions.cc index cffacc0..719f56a 100644 --- a/voptions.cc +++ b/voptions.cc @@ -284,3 +284,49 @@ void VOptions::doSave() } + +void VOptions::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + UINT i; + for (i = 0; i < numOptions; i++) + { + if (optionBoxes[i].mouseMove(x,y)) + { + optionBoxes[selectedOption].setActive(0); + optionBoxes[i].setActive(1); + selectedOption=i; + draw(); + ViewMan::getInstance()->updateView(this); + break; + } + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + UINT i; + bool butpress=false; + for (i = 0; i < numOptions; i++) + { + if (optionBoxes[i].mouseLBDOWN(x,y)) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + butpress=true; + break; + } + } + if (!butpress) + { + //check if press is outside this view! then simulate cancel + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } +} diff --git a/voptions.h b/voptions.h index c7b959c..897b945 100644 --- a/voptions.h +++ b/voptions.h @@ -53,6 +53,7 @@ class VOptions : public View ~VOptions(); int handleCommand(int command); + void processMessage(Message* m); void draw(); private: diff --git a/voptionsmenu.cc b/voptionsmenu.cc index 0b8f040..aeea3e6 100644 --- a/voptionsmenu.cc +++ b/voptionsmenu.cc @@ -140,7 +140,48 @@ int VOptionsMenu::handleCommand(int command) void VOptionsMenu::processMessage(Message* m) { - if (m->message == Message::CHANGED_OPTIONS) + if (m->message == Message::MOUSE_MOVE) + { + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + vector::iterator i; + for (i=buttons.begin(); i!=buttons.end();i++) + { + if ((*i)->mouseMove(x,y)) + { + (*selectedButton)->setActive(0); + selectedButton=i; + draw(); + ViewMan::getInstance()->updateView(this); + break; + } + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + vector::iterator i; + bool butpress=false; + for (i=buttons.begin(); i!=buttons.end();i++) + { + if ((*i)->mouseLBDOWN(x,y)) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + butpress=true; + break; + } + } + if (!butpress) + { + //check if press is outside this view! then simulate cancel + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } + else if (m->message == Message::CHANGED_OPTIONS) { doApplyChanges((map*)m->parameter); //viewman->removeView(this); diff --git a/vquestion.cc b/vquestion.cc index ec1571e..1cf63d6 100644 --- a/vquestion.cc +++ b/vquestion.cc @@ -118,3 +118,45 @@ void VQuestion::setDefault(UCHAR option) { selectedOption = option; } + +void VQuestion::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + if (buttonYes.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + buttonNo.setActive(0); + selectedOption = YES; + draw(); + ViewMan::getInstance()->updateView(this); + } + else if (buttonNo.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + buttonYes.setActive(0); + selectedOption = NO; + draw(); + ViewMan::getInstance()->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (buttonYes.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else if (buttonNo.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else + { + //check if press is outside this view! then simulate cancel + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } +} diff --git a/vquestion.h b/vquestion.h index ccddf7f..f50c990 100644 --- a/vquestion.h +++ b/vquestion.h @@ -41,6 +41,7 @@ class VQuestion : public View void setMainText(char* title); int handleCommand(int command); + void processMessage(Message* m); void draw(); const static UCHAR NO = 0; diff --git a/vrecmove.cc b/vrecmove.cc index 7e3dc35..cfb7bc1 100644 --- a/vrecmove.cc +++ b/vrecmove.cc @@ -130,3 +130,32 @@ int VRecMove::handleCommand(int command) // stop command getting to any more views return 1; } + +void VRecMove::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + sl.draw(); + ViewMan::getInstance()->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else + { + //check if press is outside this view! then simulate cancel + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } +} diff --git a/vrecmove.h b/vrecmove.h index 816522a..183a21a 100644 --- a/vrecmove.h +++ b/vrecmove.h @@ -47,6 +47,7 @@ class VRecMove : public View int handleCommand(int command); void draw(); + void processMessage(Message* m); private: View* parent; diff --git a/vrecordinglist.cc b/vrecordinglist.cc index 943b17a..3829d35 100644 --- a/vrecordinglist.cc +++ b/vrecordinglist.cc @@ -186,30 +186,50 @@ void VRecordingList::doShowingBar() void VRecordingList::processMessage(Message* m) { Log::getInstance()->log("VRecordingList", Log::DEBUG, "Got message value %lu", m->message); - if (m->message == Message::DELETE_SELECTED_RECORDING) + + if (m->message == Message::MOUSE_MOVE) + { + if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + sl.draw(); + doShowingBar(); + viewman->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else + { + //check if press is outside this view! then simulate cancel + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } + else if (m->message == Message::DELETE_SELECTED_RECORDING) { Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing delete selected"); doDeleteSelected(); - return; } - - if (m->message == Message::MOVE_RECORDING) + else if (m->message == Message::MOVE_RECORDING) { Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing move recording"); doMoveRecording((Directory*)m->parameter); - return; } - - if (m->message == Message::PLAY_SELECTED_RECORDING) + else if (m->message == Message::PLAY_SELECTED_RECORDING) { doPlay(false); - return; } - - if (m->message == Message::RESUME_SELECTED_RECORDING) + else if (m->message == Message::RESUME_SELECTED_RECORDING) { doPlay(true); - return; } } diff --git a/vrecordingmenu.cc b/vrecordingmenu.cc index 9f53124..fb764c1 100644 --- a/vrecordingmenu.cc +++ b/vrecordingmenu.cc @@ -188,7 +188,32 @@ int VRecordingMenu::handleCommand(int command) void VRecordingMenu::processMessage(Message* m) { - if (m->message == Message::QUESTION_YES) + if (m->message == Message::MOUSE_MOVE) + { + if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + sl.draw(); + ViewMan::getInstance()->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else + { + //check if press is outside this view! then simulate cancel + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } + else if (m->message == Message::QUESTION_YES) { if (sl.getCurrentOptionData() == 5) { diff --git a/vserverselect.cc b/vserverselect.cc index 12580e7..11dc19a 100644 --- a/vserverselect.cc +++ b/vserverselect.cc @@ -98,3 +98,22 @@ int VServerSelect::handleCommand(int command) return 1; } + +void VServerSelect::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + sl.draw(); + ViewMan::getInstance()->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + } +} diff --git a/vserverselect.h b/vserverselect.h index 3aa191a..af6a68c 100644 --- a/vserverselect.h +++ b/vserverselect.h @@ -45,6 +45,7 @@ class VServerSelect : public View ~VServerSelect(); int handleCommand(int command); + void processMessage(Message* m); void draw(); private: diff --git a/vtimeredit.cc b/vtimeredit.cc index 29fe6eb..c0fec61 100644 --- a/vtimeredit.cc +++ b/vtimeredit.cc @@ -153,3 +153,11 @@ int VTimerEdit::handleCommand(int command) // stop command getting to any more views return 1; } + +void VTimerEdit::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_LBDOWN) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } +} diff --git a/vtimeredit.h b/vtimeredit.h index 0279248..259a5b3 100644 --- a/vtimeredit.h +++ b/vtimeredit.h @@ -42,6 +42,7 @@ class VTimerEdit : public View ~VTimerEdit(); int handleCommand(int command); + void processMessage(Message* m); private: RecTimer* recTimer; diff --git a/vtimerlist.cc b/vtimerlist.cc index c1e2557..d616ccc 100644 --- a/vtimerlist.cc +++ b/vtimerlist.cc @@ -285,3 +285,32 @@ int VTimerList::handleCommand(int command) // stop command getting to any more views return 1; } + +void VTimerList::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + sl.draw(); + ViewMan::getInstance()->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + else + { + //check if press is outside this view! then simulate cancel + int x=(m->parameter>>16)-getScreenX(); + int y=(m->parameter&0xFFFF)-getScreenY(); + if (x<0 || y <0 || x>getWidth() || y>getHeight()) + { + ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press + } + } + } +} diff --git a/vtimerlist.h b/vtimerlist.h index 3fa0b81..f988f79 100644 --- a/vtimerlist.h +++ b/vtimerlist.h @@ -45,6 +45,7 @@ class VTimerList : public View, public TimerReceiver int handleCommand(int command); void timercall(int clientReference); + void processMessage(Message* m); private: RecTimerList* recTimerList; diff --git a/vvideolive.cc b/vvideolive.cc index 2d5c05d..c1703f3 100644 --- a/vvideolive.cc +++ b/vvideolive.cc @@ -261,7 +261,11 @@ void VVideoLive::streamEnd() void VVideoLive::processMessage(Message* m) { - if (m->message == Message::CHANNEL_CHANGE) + if (m->message == Message::MOUSE_LBDOWN) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate rok press + } + else if (m->message == Message::CHANNEL_CHANGE) { channelChange(NUMBER, m->parameter); } diff --git a/vvideorec.cc b/vvideorec.cc index 40bc248..fc13e0c 100644 --- a/vvideorec.cc +++ b/vvideorec.cc @@ -360,7 +360,75 @@ void VVideoRec::processMessage(Message* m) { Log::getInstance()->log("VVideoRec", Log::DEBUG, "Message received"); - if (m->from == player) + if (m->message == Message::MOUSE_LBDOWN) + { + UINT x = (m->parameter>>16) - getScreenX(); + UINT y = (m->parameter&0xFFFF) - getScreenY(); + + if (!barShowing) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate rok press + } + else if (barRegion.x<=x && barRegion.y<=y && (barRegion.x+barRegion.w)>=x && (barRegion.y+barRegion.h)>=y) + { + int progBarXbase = barRegion.x + 300; + if (myRec->hasMarks()) + { + MarkList* markList = myRec->getMarkList(); + MarkList::iterator i; + Mark* loopMark = NULL; + int posPix; + ULONG lengthFrames; + if (myRec->recInfo->timerEnd > time(NULL)) + { + // chasing playback + // Work out an approximate length in frames (good to 1s...) + lengthFrames = (myRec->recInfo->timerEnd - myRec->recInfo->timerStart) * video->getFPS(); + } + else + { + lengthFrames = player->getLengthFrames(); + } + for(i = markList->begin(); i != markList->end(); i++) + { + loopMark = *i; + if (loopMark->pos) + { + posPix = 302 * loopMark->pos / lengthFrames; + rectangle(barRegion.x + progBarXbase + 2 + posPix, barRegion.y + 12 - 2, 3, 28, Colour::DANGER); + if (x>=barRegion.x + progBarXbase + 2 + posPix + && x<=barRegion.x + progBarXbase + 2 + posPix+3 + && y>=barRegion.y + 12 - 2 + && y<=barRegion.y + 12 - 2+28) + { + player->jumpToMark(loopMark->pos); + doBar(3); + return; + } + } + } + } + + if (x>=barRegion.x + progBarXbase + 24 + && x<=barRegion.x + progBarXbase + 4 + 302 + && y>=barRegion.y + 12 - 2 + && y<=barRegion.y + 12 - 2+28) + { + int cx=x-(barRegion.x + progBarXbase + 4); + double percent=((double)cx)/302.*100.; + player->jumpToPercent(percent); + doBar(3); + return; + // int progressWidth = 302 * currentFrameNum / lengthFrames; + // rectangle(barRegion.x + progBarXbase + 4, barRegion.y + 16, progressWidth, 16, Colour::SELECTHIGHLIGHT); + } + } + else + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate rok press + } + } + else if (m->from == player) { if (m->message != Message::PLAYER_EVENT) return; switch(m->parameter) diff --git a/vwelcome.cc b/vwelcome.cc index 60d322b..573b6ca 100644 --- a/vwelcome.cc +++ b/vwelcome.cc @@ -292,3 +292,22 @@ void VWelcome::redrawLang() setup(); draw(); } + +void VWelcome::processMessage(Message* m) +{ + if (m->message == Message::MOUSE_MOVE) + { + if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + sl.draw(); + viewman->updateView(this); + } + } + else if (m->message == Message::MOUSE_LBDOWN) + { + if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY())) + { + ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press + } + } +} diff --git a/vwelcome.h b/vwelcome.h index 20c91d1..d2fce20 100644 --- a/vwelcome.h +++ b/vwelcome.h @@ -52,6 +52,7 @@ class VWelcome : public View, public TimerReceiver void setup(); int handleCommand(int command); + void processMessage(Message* m); void draw(); void timercall(int clientReference); void redrawLang(); diff --git a/winmain.cc b/winmain.cc index 94a584a..a6bd03b 100644 --- a/winmain.cc +++ b/winmain.cc @@ -1,829 +1,873 @@ -/* - Copyright 2004-2005 Chris Tallon - - This file is part of VOMP. - - VOMP is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - VOMP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with VOMP; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -#ifdef WIN32 -#include -#include -#include -#include - -#define _WIN32_WINNT 0x501 -#include -#include - -#include "vompreswin.h" - -#include "defines.h" -#include "log.h" -#include "remotewin.h" -#include "ledwin.h" -#include "mtdwin.h" -#include "timers.h" -#include "videowin.h" -#include "audiowin.h" -#include "vdr.h" -#include "osdwin.h" -#include "viewman.h" -#include "command.h" - -void sighandler(int signalReceived); -void shutdown(int code); - -// Global variables -------------------------------------------------------------------------------------------------- -int debugEnabled = 0; -Log* logger; -Remote* remote; -Mtd* mtd; -Led* led; -Osd* osd; -Timers* timers; -ViewMan* viewman; -Command* command; -VDR* vdr; -Video* video; -Audio* audio; -bool wnd_fullscreen=false; -bool wnd_topmost=false; -RECT wnd_fs_rect={20,20,768+20,576+20}; -RECT wnd_fs_rect_client={0,0,768,576}; -//OSVERSIONINFO windows_ver; //attempt to distigsh windows versions -bool remotefnc=false; -HINSTANCE hinstance; -bool cmenu=false; - -HMODULE user32dll; -typedef UINT (WINAPI *GETRAWINPUTDATAFNC) (HRAWINPUT,UINT,LPVOID,PUINT,UINT); -typedef UINT (WINAPI *REGISTERRAWINPUTDEVICEFNC) (PCRAWINPUTDEVICE,UINT,UINT); - -GETRAWINPUTDATAFNC dynGetRawInputData=NULL; -REGISTERRAWINPUTDEVICEFNC dynRegisterRawInputDevices=NULL; - -DWORD lastmousemove; - +/* + Copyright 2004-2005 Chris Tallon + + This file is part of VOMP. + + VOMP is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + VOMP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with VOMP; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +#ifdef WIN32 +#include +#include +#include +#include + +#define _WIN32_WINNT 0x501 +#include +#include + +#include "vompreswin.h" + +#include "defines.h" +#include "log.h" +#include "remotewin.h" +#include "ledwin.h" +#include "mtdwin.h" +#include "timers.h" +#include "videowin.h" +#include "audiowin.h" +#include "vdr.h" +#include "osdwin.h" +#include "viewman.h" +#include "command.h" + +void sighandler(int signalReceived); +void shutdown(int code); + +// Global variables -------------------------------------------------------------------------------------------------- +int debugEnabled = 0; +Log* logger; +Remote* remote; +Mtd* mtd; +Led* led; +Osd* osd; +Timers* timers; +ViewMan* viewman; +Command* command; +VDR* vdr; +Video* video; +Audio* audio; +bool wnd_fullscreen=false; +bool wnd_topmost=false; +RECT wnd_fs_rect={20,20,768+20,576+20}; +RECT wnd_fs_rect_client={0,0,768,576}; +//OSVERSIONINFO windows_ver; //attempt to distigsh windows versions +bool remotefnc=false; +HINSTANCE hinstance; +bool cmenu=false; + +HMODULE user32dll; +typedef UINT (WINAPI *GETRAWINPUTDATAFNC) (HRAWINPUT,UINT,LPVOID,PUINT,UINT); +typedef UINT (WINAPI *REGISTERRAWINPUTDEVICEFNC) (PCRAWINPUTDEVICE,UINT,UINT); + +GETRAWINPUTDATAFNC dynGetRawInputData=NULL; +REGISTERRAWINPUTDEVICEFNC dynRegisterRawInputDevices=NULL; + +DWORD lastmousemove; + + void MILLISLEEP(ULONG a) { Sleep(a); -} - -DWORD WINAPI commandthreadStart(void *arg) -{ - command->run(); - return 0; -} - -void LoadRemoteFunctions() { - user32dll=LoadLibrary("user32.dll"); - if (user32dll!=NULL) { - dynGetRawInputData=(GETRAWINPUTDATAFNC)GetProcAddress(user32dll,"GetRawInputData"); - if (dynGetRawInputData!=NULL) { - dynRegisterRawInputDevices=(REGISTERRAWINPUTDEVICEFNC)GetProcAddress(user32dll,"RegisterRawInputDevices"); - if (dynRegisterRawInputDevices!=NULL) { - remotefnc=true; - } - } - } -} - -bool InitApp(HINSTANCE hinst,int cmdshow); - -HWND win_main;//global window handle -HWND win;//global child window handle -HACCEL acc; - -#define ERROR_MSG(str) MessageBox(win_main,str,"Error!",MB_OK|MB_ICONWARNING) -INT WINAPI WinMain( HINSTANCE hinst , HINSTANCE previnst, LPSTR cmdline, int cmdshow) -{ - hinstance=hinst; - //On Windows we have to init a window, we use DXUT - LoadRemoteFunctions(); - if (!InitApp(hinst,cmdshow)) return false; - //Starting Network support - WSADATA wsadat; - int result = WSAStartup(MAKEWORD(2,2),&wsadat); - if (result!=NO_ERROR) { - ERROR_MSG("Initialising WinSocked: Error at WSAStartup()\n"); - return 0; - } - - result= CoInitializeEx(NULL,COINIT_MULTITHREADED );//Initialize COM for DirectShow - if (result!=S_OK) { - ERROR_MSG("Initialising COM: Error at Coinitialize()\n"); - return 0; - } - - - - - // Init global vars ------------------------------------------------------------------------------------------------ - - logger = new Log(); - remote = new RemoteWin(); - mtd = new MtdWin(); - led = new LedWin(); - timers = new Timers(); - osd = new OsdWin(); - vdr = new VDR(); - video = new VideoWin(); - audio = new AudioWin(); - viewman = new ViewMan(); - command = new Command(); - - if (!logger || !remote || !mtd || !led || !osd || !video || !audio || !viewman || !command) - { - ERROR_MSG("Could not create objects. Memory problems?\n"); - shutdown(1); - WSACleanup(); - return 0; - } - - // Get logging module started -------------------------------------------------------------------------------------- - - if (!logger->init(Log::DEBUG, "vompwin.log", true)) - { - ERROR_MSG("Could not initialise log object. Aborting.\n"); - shutdown(1); - WSACleanup(); - return 0; - } - - logger->log("Core", Log::INFO, "Starting up..."); - - - - // Init modules ---------------------------------------------------------------------------------------------------- - int success; - - success = remote->init("/dev/rawir"); - if (success) - { - logger->log("Core", Log::INFO, "Remote module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "Remote module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = led->init(0); - if (success) - { - logger->log("Core", Log::INFO, "LED module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "LED module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = mtd->init("/dev/mtd1"); - if (success) - { - logger->log("Core", Log::INFO, "Mtd module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "Mtd module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = timers->init(); - if (success) - { - logger->log("Core", Log::INFO, "Timers module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "Timers module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - UCHAR videoFormat = (UCHAR)mtd->getPALorNTSC(); - if (videoFormat == Video::PAL) logger->log("Core", Log::INFO, "Read from MTD: PAL 720x576"); - else if (videoFormat == Video::NTSC) logger->log("Core", Log::INFO, "Read from MTD: NTSC 720x480"); - else logger->log("Core", Log::INFO, "No help from MTD. Assuming NTSC 720x480"); - - success = video->init(videoFormat); - if (success) - { - logger->log("Core", Log::INFO, "Video module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "Video module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = osd->init((void*)&win); - if (success) - { - logger->log("Core", Log::INFO, "OSD module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "OSD module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = audio->init(Audio::MPEG2_PES); - if (success) - { - logger->log("Core", Log::INFO, "Audio module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "Audio module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = vdr->init(3024); - if (success) - { - logger->log("Core", Log::INFO, "VDR module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "VDR module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = viewman->init(); - if (success) - { - logger->log("Core", Log::INFO, "ViewMan module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "ViewMan module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - success = command->init(); - if (success) - { - logger->log("Core", Log::INFO, "Command module initialised"); - } - else - { - logger->log("Core", Log::EMERG, "Command module failed to initialise"); - shutdown(1); - WSACleanup(); - return 0; - } - - // Other init ------------------------------------------------------------------------------------------------------ - - logger->log("Core", Log::NOTICE, "Startup successful"); - - // Run main loop --------------------------------------------------------------------------------------------------- - - // Ok, all major device components and other bits are loaded and ready - lastmousemove=timeGetTime(); - HANDLE commandthread; - commandthread= CreateThread(NULL, 0, commandthreadStart, NULL,0, - NULL); - MSG message; - message.message=WM_NULL; - bool run=true; - while(run && WaitForSingleObject(commandthread,0)==WAIT_TIMEOUT) { - if (PeekMessage(&message, NULL, 0,0,PM_REMOVE)!=0) { - if (TranslateAccelerator(win_main,acc,&message)==NULL) { - TranslateMessage(&message); - DispatchMessage(&message); - switch (message.message) { - case WM_QUIT: - run=false; //TODO post exit to command Messages - }; - } - } else { - //Render - ((OsdWin*)osd)->Render(); - } - } - // When that returns quit ------------------------------------------------------------------------------------------ - WaitForSingleObject(commandthread,INFINITE); - shutdown(0); - WSACleanup(); - if (user32dll) FreeModule(user32dll); - return 0; - -} - - - -void CalculateWindowSize(RECT * size,ULONG size_mode) { - - DWORD width, height; - DWORD adjheight,adjwidth; - if (!wnd_fullscreen) { - DWORD flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU - |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX; - RECT wnted={50,50,150,150}; - AdjustWindowRect(&wnted,flags ,false); - adjwidth=-wnted.left+wnted.right-100; - adjheight=-wnted.top+wnted.bottom-100; - } else { - adjwidth=adjheight=0; - } - width=size->right-size->left-adjwidth; - height=size->bottom-size->top-adjheight; - UCHAR mode=video->getMode(); - UCHAR aspect=((VideoWin*)video)->getAspectRatio(); - UCHAR tvsize=((VideoWin*)video)->getPseudoTVsize(); - double aspectrt=4./3.; - if (tvsize==Video::ASPECT16X9) { - if (aspect==Video::ASPECT16X9) { - aspectrt=4./3.; //looks strange, but it is a 16:9 tv - } else if (aspect==Video::ASPECT4X3) { - aspectrt=4./3./(16./9.)*(4./3.); //I hope this is correct - } - } else if (tvsize==Video::ASPECT4X3) { - if (aspect==Video::ASPECT16X9) { - if (mode!=Video::NORMAL) { - aspectrt=16./9.; - } else { - aspectrt=4./3.; - } - } else if (aspect==Video::ASPECT4X3) { - aspectrt=4./3.; - } - } - if (!wnd_fullscreen) { - switch (size_mode) { - case WMSZ_BOTTOM: - case WMSZ_BOTTOMRIGHT: - case WMSZ_TOP: - case WMSZ_TOPRIGHT: - width=(ULONG)(((double)height)*aspectrt); - size->right=size->left+width+adjwidth; - break; - case WMSZ_BOTTOMLEFT: - case WMSZ_TOPLEFT: - width=(ULONG)(((double)height)*aspectrt); - size->left=size->right-width-adjwidth; - break; - case WMSZ_LEFT: - case WMSZ_RIGHT: - height=(ULONG)(((double)width)/aspectrt); - size->bottom=size->top+height+adjheight; - break; - } - MoveWindow(win,0,0,width,height,TRUE); - } else { - RECT newrect={0,0,width,height}; - DWORD newlength; - if ((ULONG)(((double)height)*aspectrt)>width) { - newlength=(ULONG)(((double)width)/aspectrt); - newrect.top+=(height-newlength)/2; - newrect.bottom-=(height-newlength); - } else { - newlength=(ULONG)(((double)height)*aspectrt); - newrect.left+=(width-newlength)/2; - newrect.right-=(width-newlength); - } - MoveWindow(win,newrect.left,newrect.top,newrect.right,newrect.bottom,TRUE); - } - -} - -void AdjustWindow() { - if (!wnd_fullscreen) { - RECT winrect; - GetWindowRect(win_main,&winrect); - CalculateWindowSize(&winrect,WMSZ_BOTTOM); - MoveWindow(win_main,winrect.left, - winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,true); - } else { - RECT winrect; - GetWindowRect(win_main,&winrect); - CalculateWindowSize(&winrect,WMSZ_BOTTOM); - - } -} - -void ToggleFullscreen() { - if (wnd_fullscreen) { - wnd_fullscreen=false; - SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU - |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX); - SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - - SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_TOP,wnd_fs_rect.left,wnd_fs_rect.top, - wnd_fs_rect.right-wnd_fs_rect.left, - wnd_fs_rect.bottom-wnd_fs_rect.top, - SWP_DRAWFRAME | SWP_FRAMECHANGED); - MoveWindow(win,wnd_fs_rect_client.left,wnd_fs_rect_client.top, - wnd_fs_rect_client.right-wnd_fs_rect_client.left, - wnd_fs_rect_client.bottom-wnd_fs_rect_client.top,TRUE); - AdjustWindow(); - } else { - GetWindowRect(win_main,&wnd_fs_rect); - GetWindowRect(win,&wnd_fs_rect_client); - SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP ); - SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - HMONITOR monitor=MonitorFromWindow(win_main,MONITOR_DEFAULTTONEAREST); - MONITORINFO moninfo; - moninfo.cbSize=sizeof(moninfo); - wnd_fullscreen=true; - if (!GetMonitorInfo(monitor,&moninfo)) return ; - SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_TOP,moninfo.rcMonitor.left,moninfo.rcMonitor.top, - moninfo.rcMonitor.right,moninfo.rcMonitor.bottom,SWP_FRAMECHANGED); - - AdjustWindow(); - - } - - -} - -void ToggleTopmost() { - wnd_topmost=!wnd_topmost; - SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_NOTOPMOST,0,0, - 0,0,SWP_NOMOVE | SWP_NOSIZE); -} - -void CursorUpdate() { - POINT cursorpos; - GetCursorPos(&cursorpos); - HWND asswind; - asswind=WindowFromPoint(cursorpos); - if (asswind!=win_main && asswind!=win) { - return ; //not our responsibility - } - if ((timeGetTime()-lastmousemove)<4000 || cmenu) { - SetCursor(LoadCursor(NULL,IDC_ARROW)); - } else { - SetCursor(NULL); - } -} - -bool ContextMenu(HWND wind,int x,int y) { - POINT p={x,y}; - RECT clientrect; - ScreenToClient(wind,&p); - GetClientRect(wind,&clientrect); - if (!PtInRect(&clientrect,p)) return false; - ClientToScreen(wind,&p); - HMENU menu; - HMENU popup; - menu=LoadMenu(hinstance,MAKEINTRESOURCE(VOMPMENU)); - popup=GetSubMenu(menu,0); - if (wnd_fullscreen) { - CheckMenuItem(popup,VOMP_FULL_SCREEN,MF_BYCOMMAND|MF_CHECKED); - } else { - CheckMenuItem(popup,VOMP_FULL_SCREEN,MF_BYCOMMAND|MF_UNCHECKED); - } - if (wnd_topmost) { - CheckMenuItem(popup,VOMP_TOPMOST,MF_BYCOMMAND|MF_CHECKED); - } else { - CheckMenuItem(popup,VOMP_TOPMOST,MF_BYCOMMAND|MF_UNCHECKED); - } - cmenu=true; - TrackPopupMenu(popup,TPM_RIGHTBUTTON|TPM_LEFTALIGN,x,y,0,wind, NULL); - cmenu=false; - - - DestroyMenu(menu); - return true; -} - -LONG FAR PASCAL WindowProc(HWND wind, UINT msg, WPARAM wparam, LPARAM lparam) -{ - - switch (msg) { - case WM_DESTROY: { - //TODO: call command - logger->log("Core", Log::NOTICE, "Window closed, shutting down..."); - - ((RemoteWin*)Remote::getInstance())->SendPower(); - PostQuitMessage(0); - }break; - case WM_SIZING: { - CalculateWindowSize((RECT*) lparam,wparam); - return TRUE; - }break; - case WM_SIZE: { - int width = LOWORD(lparam); - int height = HIWORD(lparam); - //Call device - } - break; - case WM_PAINT: - RECT r; - PAINTSTRUCT ps; - if (GetUpdateRect(wind, &r, FALSE)) { - BeginPaint(wind, &ps); - //Call Painting Mechanism - EndPaint(wind, &ps); - } - break; - case WM_KEYDOWN: - if (((RemoteWin*)remote)->ReceiveButtonVK(wparam)) { - return 0L; //We process that Key - } else { - return DefWindowProc(wind, msg, wparam, lparam); - } - - break; - case WM_APPCOMMAND: - if (((RemoteWin*)remote)->ReceiveButtonAP(GET_APPCOMMAND_LPARAM(lparam))){ - return TRUE; //yes we process that message - } else { - return DefWindowProc(wind, msg, wparam, lparam); - } - - break; - case WM_INPUT: - if (remotefnc ) { - //only on XP! - LPRAWINPUT lpit; - UINT risize; - dynGetRawInputData((HRAWINPUT)lparam,RID_INPUT,NULL,&risize,sizeof(RAWINPUTHEADER)); - lpit=(LPRAWINPUT)malloc(risize); - dynGetRawInputData((HRAWINPUT)lparam,RID_INPUT,lpit,&risize,sizeof(RAWINPUTHEADER)); - - if (lpit->header.dwType==RIM_TYPEHID && lpit->data.hid.dwSizeHid>=2) { - DWORD button=lpit->data.hid.bRawData[1] | (lpit->data.hid.bRawData[0]<< 8); - if (((RemoteWin*)remote)->ReceiveButtonRI(button)){ - free(lpit); - return 0; //yes we process that message - } - } - free(lpit); - } - return DefWindowProc(wind, msg, wparam, lparam); - - - break; - case WM_COMMAND: - if (LOWORD(wparam)==VOMP_FULL_SCREEN) { - ToggleFullscreen(); - return 0; - } - if (LOWORD(wparam)==VOMP_TOPMOST) { - ToggleTopmost(); - return 0; - } - if (((RemoteWin*)remote)->ReceiveButtonAP(LOWORD(wparam))){ - return 0; //yes we process that message - } else { - return DefWindowProc(wind, msg, wparam, lparam); - } - - break; - case WM_SETCURSOR: - if (((HANDLE)wparam)==win) { - CursorUpdate(); - return 1; - } else { - return DefWindowProc(wind, msg, wparam, lparam); - } - break; - case WM_SYSCOMMAND: - if (wparam==SC_MAXIMIZE) { - ToggleFullscreen(); - return 0; - } else if (wparam==SC_SCREENSAVE || wparam==SC_MONITORPOWER) { - return 0; - } else { - return DefWindowProc(wind,msg,wparam, lparam); - } - break; - case WM_MOUSEMOVE: - lastmousemove=timeGetTime(); - SetCursor(LoadCursor(NULL,IDC_ARROW)); - SetTimer(wind,VOMP_CURSORUPDATE,4500,NULL); - return 0; - //return DefWindowProc(wind,msg,wparam, lparam); - break; - case WM_TIMER: - if (wparam==VOMP_CURSORUPDATE) { - CursorUpdate(); - return 0; - } - return DefWindowProc(wind, msg, wparam, lparam); - - break; - case WM_CONTEXTMENU: - if (!ContextMenu(wind,GET_X_LPARAM(lparam),GET_Y_LPARAM(lparam))) { - return DefWindowProc(wind, msg, wparam, lparam); - } else { - return 0; - } - - default: - return DefWindowProc(wind, msg, wparam, lparam); - } - return 0L; -} - - -bool InitApp(HINSTANCE hinst,int cmdshow) { - /* main window */ - WNDCLASS wcs; - DWORD flags; - wcs.style = CS_HREDRAW | CS_VREDRAW; - wcs.lpfnWndProc = WindowProc; - wcs.cbClsExtra = 0; - wcs.cbWndExtra = sizeof(DWORD); - wcs.hInstance = hinst; - wcs.hIcon = NULL; - wcs.hCursor = NULL; - wcs.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wcs.lpszMenuName = NULL; - wcs.lpszClassName = "vomp"; - acc=LoadAccelerators(hinst,MAKEINTRESOURCE(VOMPACCELERATOR)); - if (!RegisterClass(&wcs)) - return false; - flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU - |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX; - RECT wnted={50,50,768+50,576+50}; - AdjustWindowRect(&wnted,flags ,false); - win_main=CreateWindow("vomp","VOMP on Windows",flags, CW_USEDEFAULT,CW_USEDEFAULT, - wnted.right-wnted.left,wnted.bottom-wnted.top,NULL,NULL,hinst,NULL); - if (!win_main) - return FALSE; - ShowWindow(win_main,SW_SHOWNORMAL); - UpdateWindow(win_main); - /* in order to handle letterboxing we use a child window */ - WNDCLASS child_wcs; - child_wcs.style = CS_HREDRAW | CS_VREDRAW; - child_wcs.lpfnWndProc = WindowProc; - child_wcs.cbClsExtra = 0; - child_wcs.cbWndExtra = sizeof(DWORD); - child_wcs.hInstance = hinst; - child_wcs.hIcon = NULL; - child_wcs.hCursor = NULL; - child_wcs.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); - child_wcs.lpszMenuName = NULL; - child_wcs.lpszClassName = "vomp_playback"; - if (!RegisterClass(&child_wcs)) - return false; - - win=CreateWindow("vomp_playback","Vomp Playback Window",WS_VISIBLE | WS_CHILD |WS_CLIPCHILDREN, - 0,0,768,576,win_main,NULL,hinst,NULL); - if (!win) - return FALSE; - ShowWindow(win,SW_SHOWNORMAL); - UpdateWindow(win); - if (remotefnc) {//at least windows XP - /* We want to support MCE Remote controls*/ - RAWINPUTDEVICE remote_control_data[4]; - ZeroMemory(remote_control_data,sizeof(remote_control_data)); - remote_control_data[0].usUsagePage=0xFFBC; - remote_control_data[0].usUsage=0x88; - remote_control_data[0].dwFlags=0; - remote_control_data[1].usUsagePage=0x0C; - remote_control_data[1].usUsage=0x80; - remote_control_data[1].dwFlags=0; - remote_control_data[2].usUsagePage=0x0C; - remote_control_data[2].usUsage=0x01; - remote_control_data[2].dwFlags=0; - remote_control_data[3].usUsagePage=0x01; - remote_control_data[3].usUsage=0x80; - remote_control_data[3].dwFlags=0; - if (dynRegisterRawInputDevices(remote_control_data,4,sizeof(remote_control_data[0]))!=TRUE) { - MessageBox(0,"Registering remote control failed!","Aborting!",0); - return FALSE; - } - - } - return TRUE; -} - - - - - -// ------------------------------------------------------------------------------------------------------------------- - -void shutdown(int code) -{ - if (viewman) - { - viewman->shutdown(); - delete viewman; - logger->log("Core", Log::NOTICE, "ViewMan module shut down"); - } - - if (command) // shut down command here in case views have posted messages - { - command->shutdown(); - delete command; - logger->log("Core", Log::NOTICE, "Command module shut down"); - } - - if (vdr) - { - vdr->shutdown(); - delete vdr; - logger->log("Core", Log::NOTICE, "VDR module shut down"); - } - - if (osd) - { - osd->shutdown(); - delete osd; - logger->log("Core", Log::NOTICE, "OSD module shut down"); - } - - if (audio) - { - audio->shutdown(); - delete audio; - logger->log("Core", Log::NOTICE, "Audio module shut down"); - } - - if (video) - { - video->shutdown(); - delete video; - logger->log("Core", Log::NOTICE, "Video module shut down"); - } - - if (timers) - { - timers->shutdown(); - delete timers; - logger->log("Core", Log::NOTICE, "Timers module shut down"); - } - - if (mtd) - { - mtd->shutdown(); - delete mtd; - logger->log("Core", Log::NOTICE, "MTD module shut down"); - } - - if (led) - { - led->shutdown(); - delete led; - logger->log("Core", Log::NOTICE, "LED module shut down"); - } - - if (remote) - { - remote->shutdown(); - delete remote; - logger->log("Core", Log::NOTICE, "Remote module shut down"); - } - - if (logger) - { - logger->log("Core", Log::NOTICE, "Log module shutting down... bye!\n\n"); - logger->shutdown(); - delete logger; - } - ExitProcess(0); - -} - -// ------------------------------------------------------------------------------------------------------------------- - -ULLONG ntohll(ULLONG a) -{ - return htonll(a); -} - -ULLONG htonll(ULLONG a) -{ - return (((ULLONG)htonl((ULONG)((a<<32)>> 32))<<32) - |(ULONG)htonl(((ULONG) (a >> 32)))); -} -#endif +} + +DWORD WINAPI commandthreadStart(void *arg) +{ + command->run(); + return 0; +} + +void LoadRemoteFunctions() { + user32dll=LoadLibrary("user32.dll"); + if (user32dll!=NULL) { + dynGetRawInputData=(GETRAWINPUTDATAFNC)GetProcAddress(user32dll,"GetRawInputData"); + if (dynGetRawInputData!=NULL) { + dynRegisterRawInputDevices=(REGISTERRAWINPUTDEVICEFNC)GetProcAddress(user32dll,"RegisterRawInputDevices"); + if (dynRegisterRawInputDevices!=NULL) { + remotefnc=true; + } + } + } +} + +bool InitApp(HINSTANCE hinst,int cmdshow); + +HWND win_main;//global window handle +HWND win;//global child window handle +HACCEL acc; + +#define ERROR_MSG(str) MessageBox(win_main,str,"Error!",MB_OK|MB_ICONWARNING) +INT WINAPI WinMain( HINSTANCE hinst , HINSTANCE previnst, LPSTR cmdline, int cmdshow) +{ + hinstance=hinst; + //On Windows we have to init a window, we use DXUT + LoadRemoteFunctions(); + if (!InitApp(hinst,cmdshow)) return false; + //Starting Network support + WSADATA wsadat; + int result = WSAStartup(MAKEWORD(2,2),&wsadat); + if (result!=NO_ERROR) { + ERROR_MSG("Initialising WinSocked: Error at WSAStartup()\n"); + return 0; + } + + result= CoInitializeEx(NULL,COINIT_MULTITHREADED );//Initialize COM for DirectShow + if (result!=S_OK) { + ERROR_MSG("Initialising COM: Error at Coinitialize()\n"); + return 0; + } + + + + + // Init global vars ------------------------------------------------------------------------------------------------ + + logger = new Log(); + remote = new RemoteWin(); + mtd = new MtdWin(); + led = new LedWin(); + timers = new Timers(); + osd = new OsdWin(); + vdr = new VDR(); + video = new VideoWin(); + audio = new AudioWin(); + viewman = new ViewMan(); + command = new Command(); + + if (!logger || !remote || !mtd || !led || !osd || !video || !audio || !viewman || !command) + { + ERROR_MSG("Could not create objects. Memory problems?\n"); + shutdown(1); + WSACleanup(); + return 0; + } + + // Get logging module started -------------------------------------------------------------------------------------- + + if (!logger->init(Log::DEBUG, "vompwin.log", true)) + { + ERROR_MSG("Could not initialise log object. Aborting.\n"); + shutdown(1); + WSACleanup(); + return 0; + } + + logger->log("Core", Log::INFO, "Starting up..."); + + + + // Init modules ---------------------------------------------------------------------------------------------------- + int success; + + success = remote->init("/dev/rawir"); + if (success) + { + logger->log("Core", Log::INFO, "Remote module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "Remote module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = led->init(0); + if (success) + { + logger->log("Core", Log::INFO, "LED module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "LED module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = mtd->init("/dev/mtd1"); + if (success) + { + logger->log("Core", Log::INFO, "Mtd module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "Mtd module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = timers->init(); + if (success) + { + logger->log("Core", Log::INFO, "Timers module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "Timers module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + UCHAR videoFormat = (UCHAR)mtd->getPALorNTSC(); + if (videoFormat == Video::PAL) logger->log("Core", Log::INFO, "Read from MTD: PAL 720x576"); + else if (videoFormat == Video::NTSC) logger->log("Core", Log::INFO, "Read from MTD: NTSC 720x480"); + else logger->log("Core", Log::INFO, "No help from MTD. Assuming NTSC 720x480"); + + success = video->init(videoFormat); + if (success) + { + logger->log("Core", Log::INFO, "Video module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "Video module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = osd->init((void*)&win); + if (success) + { + logger->log("Core", Log::INFO, "OSD module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "OSD module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = audio->init(Audio::MPEG2_PES); + if (success) + { + logger->log("Core", Log::INFO, "Audio module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "Audio module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = vdr->init(3024); + if (success) + { + logger->log("Core", Log::INFO, "VDR module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "VDR module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = viewman->init(); + if (success) + { + logger->log("Core", Log::INFO, "ViewMan module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "ViewMan module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + success = command->init(); + if (success) + { + logger->log("Core", Log::INFO, "Command module initialised"); + } + else + { + logger->log("Core", Log::EMERG, "Command module failed to initialise"); + shutdown(1); + WSACleanup(); + return 0; + } + + // Other init ------------------------------------------------------------------------------------------------------ + + logger->log("Core", Log::NOTICE, "Startup successful"); + + // Run main loop --------------------------------------------------------------------------------------------------- + + // Ok, all major device components and other bits are loaded and ready + lastmousemove=timeGetTime(); + + HANDLE commandthread; + commandthread= CreateThread(NULL, 0, commandthreadStart, NULL,0, + NULL); + MSG message; + message.message=WM_NULL; + bool run=true; + while(run && WaitForSingleObject(commandthread,0)==WAIT_TIMEOUT) { + if (PeekMessage(&message, NULL, 0,0,PM_REMOVE)!=0) { + if (TranslateAccelerator(win_main,acc,&message)==NULL) { + TranslateMessage(&message); + DispatchMessage(&message); + switch (message.message) { + case WM_QUIT: + run=false; //TODO post exit to command Messages + }; + } + } else { + //Render + ((OsdWin*)osd)->Render(); + } + } + // When that returns quit ------------------------------------------------------------------------------------------ + WaitForSingleObject(commandthread,INFINITE); + shutdown(0); + WSACleanup(); + if (user32dll) FreeModule(user32dll); + return 0; + +} + +bool TranslateMousePosition(POINT *pos) { + + RECT clientrect; + ScreenToClient(win,pos); + GetClientRect(win,&clientrect); + if (!PtInRect(&clientrect,*pos)) return false;//Don't pass it further + pos->x=((double)pos->x)/((double) (clientrect.right-clientrect.left)) + *((double)Video::getInstance()->getScreenWidth()); + pos->y=((double)pos->y)/((double) (clientrect.bottom-clientrect.top)) + *((double)Video::getInstance()->getScreenHeight()); + return true; + +} + + + +void CalculateWindowSize(RECT * size,ULONG size_mode) { + + DWORD width, height; + DWORD adjheight,adjwidth; + if (!wnd_fullscreen) { + DWORD flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU + |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX; + RECT wnted={50,50,150,150}; + AdjustWindowRect(&wnted,flags ,false); + adjwidth=-wnted.left+wnted.right-100; + adjheight=-wnted.top+wnted.bottom-100; + } else { + adjwidth=adjheight=0; + } + width=size->right-size->left-adjwidth; + height=size->bottom-size->top-adjheight; + UCHAR mode=video->getMode(); + UCHAR aspect=((VideoWin*)video)->getAspectRatio(); + UCHAR tvsize=((VideoWin*)video)->getPseudoTVsize(); + double aspectrt=4./3.; + if (tvsize==Video::ASPECT16X9) { + if (aspect==Video::ASPECT16X9) { + aspectrt=4./3.; //looks strange, but it is a 16:9 tv + } else if (aspect==Video::ASPECT4X3) { + aspectrt=4./3./(16./9.)*(4./3.); //I hope this is correct + } + } else if (tvsize==Video::ASPECT4X3) { + if (aspect==Video::ASPECT16X9) { + if (mode!=Video::NORMAL) { + aspectrt=16./9.; + } else { + aspectrt=4./3.; + } + } else if (aspect==Video::ASPECT4X3) { + aspectrt=4./3.; + } + } + if (!wnd_fullscreen) { + switch (size_mode) { + case WMSZ_BOTTOM: + case WMSZ_BOTTOMRIGHT: + case WMSZ_TOP: + case WMSZ_TOPRIGHT: + width=(ULONG)(((double)height)*aspectrt); + size->right=size->left+width+adjwidth; + break; + case WMSZ_BOTTOMLEFT: + case WMSZ_TOPLEFT: + width=(ULONG)(((double)height)*aspectrt); + size->left=size->right-width-adjwidth; + break; + case WMSZ_LEFT: + case WMSZ_RIGHT: + height=(ULONG)(((double)width)/aspectrt); + size->bottom=size->top+height+adjheight; + break; + } + MoveWindow(win,0,0,width,height,TRUE); + } else { + RECT newrect={0,0,width,height}; + DWORD newlength; + if ((ULONG)(((double)height)*aspectrt)>width) { + newlength=(ULONG)(((double)width)/aspectrt); + newrect.top+=(height-newlength)/2; + newrect.bottom-=(height-newlength); + } else { + newlength=(ULONG)(((double)height)*aspectrt); + newrect.left+=(width-newlength)/2; + newrect.right-=(width-newlength); + } + MoveWindow(win,newrect.left,newrect.top,newrect.right,newrect.bottom,TRUE); + } + +} + +void AdjustWindow() { + if (!wnd_fullscreen) { + RECT winrect; + GetWindowRect(win_main,&winrect); + CalculateWindowSize(&winrect,WMSZ_BOTTOM); + MoveWindow(win_main,winrect.left, + winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,true); + } else { + RECT winrect; + GetWindowRect(win_main,&winrect); + CalculateWindowSize(&winrect,WMSZ_BOTTOM); + + } +} + +void ToggleFullscreen() { + if (wnd_fullscreen) { + wnd_fullscreen=false; + SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU + |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX); + SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + + SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_TOP,wnd_fs_rect.left,wnd_fs_rect.top, + wnd_fs_rect.right-wnd_fs_rect.left, + wnd_fs_rect.bottom-wnd_fs_rect.top, + SWP_DRAWFRAME | SWP_FRAMECHANGED); + MoveWindow(win,wnd_fs_rect_client.left,wnd_fs_rect_client.top, + wnd_fs_rect_client.right-wnd_fs_rect_client.left, + wnd_fs_rect_client.bottom-wnd_fs_rect_client.top,TRUE); + AdjustWindow(); + } else { + GetWindowRect(win_main,&wnd_fs_rect); + GetWindowRect(win,&wnd_fs_rect_client); + SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP ); + SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + HMONITOR monitor=MonitorFromWindow(win_main,MONITOR_DEFAULTTONEAREST); + MONITORINFO moninfo; + moninfo.cbSize=sizeof(moninfo); + wnd_fullscreen=true; + if (!GetMonitorInfo(monitor,&moninfo)) return ; + SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_TOP,moninfo.rcMonitor.left,moninfo.rcMonitor.top, + moninfo.rcMonitor.right,moninfo.rcMonitor.bottom,SWP_FRAMECHANGED); + + AdjustWindow(); + + } + + +} + +void ToggleTopmost() { + wnd_topmost=!wnd_topmost; + SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_NOTOPMOST,0,0, + 0,0,SWP_NOMOVE | SWP_NOSIZE); +} + +void CursorUpdate() { + POINT cursorpos; + GetCursorPos(&cursorpos); + HWND asswind; + asswind=WindowFromPoint(cursorpos); + if (asswind!=win_main && asswind!=win) { + return ; //not our responsibility + } + if ((timeGetTime()-lastmousemove)<4000 || cmenu) { + SetCursor(LoadCursor(NULL,IDC_ARROW)); + } else { + SetCursor(NULL); + } +} + +bool ContextMenu(HWND wind,int x,int y) { + POINT p={x,y}; + RECT clientrect; + ScreenToClient(wind,&p); + GetClientRect(wind,&clientrect); + if (!PtInRect(&clientrect,p)) return false; + ClientToScreen(wind,&p); + HMENU menu; + HMENU popup; + menu=LoadMenu(hinstance,MAKEINTRESOURCE(VOMPMENU)); + popup=GetSubMenu(menu,0); + if (wnd_fullscreen) { + CheckMenuItem(popup,VOMP_FULL_SCREEN,MF_BYCOMMAND|MF_CHECKED); + } else { + CheckMenuItem(popup,VOMP_FULL_SCREEN,MF_BYCOMMAND|MF_UNCHECKED); + } + if (wnd_topmost) { + CheckMenuItem(popup,VOMP_TOPMOST,MF_BYCOMMAND|MF_CHECKED); + } else { + CheckMenuItem(popup,VOMP_TOPMOST,MF_BYCOMMAND|MF_UNCHECKED); + } + cmenu=true; + TrackPopupMenu(popup,TPM_RIGHTBUTTON|TPM_LEFTALIGN,x,y,0,wind, NULL); + cmenu=false; + + + DestroyMenu(menu); + return true; +} + +LONG FAR PASCAL WindowProc(HWND wind, UINT msg, WPARAM wparam, LPARAM lparam) +{ + + switch (msg) { + case WM_DESTROY: { + //TODO: call command + logger->log("Core", Log::NOTICE, "Window closed, shutting down..."); + + ((RemoteWin*)Remote::getInstance())->SendPower(); + PostQuitMessage(0); + }break; + case WM_SIZING: { + CalculateWindowSize((RECT*) lparam,wparam); + return TRUE; + }break; + case WM_SIZE: { + int width = LOWORD(lparam); + int height = HIWORD(lparam); + //Call device + } + break; + case WM_PAINT: + RECT r; + PAINTSTRUCT ps; + if (GetUpdateRect(wind, &r, FALSE)) { + BeginPaint(wind, &ps); + //Call Painting Mechanism + EndPaint(wind, &ps); + } + break; + case WM_KEYDOWN: + if (((RemoteWin*)remote)->ReceiveButtonVK(wparam)) { + return 0L; //We process that Key + } else { + return DefWindowProc(wind, msg, wparam, lparam); + } + + break; + case WM_APPCOMMAND: + if (((RemoteWin*)remote)->ReceiveButtonAP(GET_APPCOMMAND_LPARAM(lparam))){ + return TRUE; //yes we process that message + } else { + return DefWindowProc(wind, msg, wparam, lparam); + } + + break; + case WM_INPUT: + if (remotefnc ) { + //only on XP! + LPRAWINPUT lpit; + UINT risize; + dynGetRawInputData((HRAWINPUT)lparam,RID_INPUT,NULL,&risize,sizeof(RAWINPUTHEADER)); + lpit=(LPRAWINPUT)malloc(risize); + dynGetRawInputData((HRAWINPUT)lparam,RID_INPUT,lpit,&risize,sizeof(RAWINPUTHEADER)); + + if (lpit->header.dwType==RIM_TYPEHID && lpit->data.hid.dwSizeHid>=2) { + DWORD button=lpit->data.hid.bRawData[1] | (lpit->data.hid.bRawData[0]<< 8); + if (((RemoteWin*)remote)->ReceiveButtonRI(button)){ + free(lpit); + return 0; //yes we process that message + } + } + free(lpit); + } + return DefWindowProc(wind, msg, wparam, lparam); + + + break; + case WM_COMMAND: + if (LOWORD(wparam)==VOMP_FULL_SCREEN) { + ToggleFullscreen(); + return 0; + } + if (LOWORD(wparam)==VOMP_TOPMOST) { + ToggleTopmost(); + return 0; + } + if (((RemoteWin*)remote)->ReceiveButtonAP(LOWORD(wparam))){ + return 0; //yes we process that message + } else { + return DefWindowProc(wind, msg, wparam, lparam); + } + + break; + case WM_SETCURSOR: + if (((HANDLE)wparam)==win) { + CursorUpdate(); + return 1; + } else { + return DefWindowProc(wind, msg, wparam, lparam); + } + break; + case WM_SYSCOMMAND: + if (wparam==SC_MAXIMIZE) { + ToggleFullscreen(); + return 0; + } else if (wparam==SC_SCREENSAVE || wparam==SC_MONITORPOWER) { + return 0; + } else { + return DefWindowProc(wind,msg,wparam, lparam); + } + break; + case WM_MOUSEMOVE: { + + lastmousemove=timeGetTime(); + SetCursor(LoadCursor(NULL,IDC_ARROW)); + SetTimer(wind,VOMP_CURSORUPDATE,4500,NULL); + POINT mpos={GET_X_LPARAM(lparam),GET_Y_LPARAM(lparam)}; + ClientToScreen(wind,&mpos); + if (TranslateMousePosition(&mpos)) { + Message *mousemes=new Message(); + mousemes->message=Message::MOUSE_MOVE; + mousemes->from=NULL; + mousemes->to=ViewMan::getInstance(); + mousemes->parameter=(mpos.x & 0xFFFF)<< 16| (mpos.y & 0xFFFF); + mousemes->tag=0; + //command->postMessageFromOuterSpace(mousemes); + command->postMessageIfNotBusy(mousemes); + } + + return 0; + //return DefWindowProc(wind,msg,wparam, lparam); + } + break; + case WM_TIMER: + if (wparam==VOMP_CURSORUPDATE) { + CursorUpdate(); + return 0; + } + return DefWindowProc(wind, msg, wparam, lparam); + + break; + case WM_CONTEXTMENU: + if (!ContextMenu(wind,GET_X_LPARAM(lparam),GET_Y_LPARAM(lparam))) { + return DefWindowProc(wind, msg, wparam, lparam); + } else { + return 0; + } + break; + case WM_LBUTTONDOWN:{ + POINT mpos={GET_X_LPARAM(lparam),GET_Y_LPARAM(lparam)}; + ClientToScreen(wind,&mpos); + if (TranslateMousePosition(&mpos)) { + Message *mousemes=new Message(); + mousemes->message=Message::MOUSE_LBDOWN; + mousemes->from=NULL; + mousemes->to=ViewMan::getInstance(); + mousemes->parameter=(mpos.x & 0xFFFF)<< 16| (mpos.y & 0xFFFF); + mousemes->tag=0; + command->postMessageFromOuterSpace(mousemes); + } + }break; + default: + return DefWindowProc(wind, msg, wparam, lparam); + } + return 0L; +} + + +bool InitApp(HINSTANCE hinst,int cmdshow) { + /* main window */ + WNDCLASS wcs; + DWORD flags; + wcs.style = CS_HREDRAW | CS_VREDRAW; + wcs.lpfnWndProc = WindowProc; + wcs.cbClsExtra = 0; + wcs.cbWndExtra = sizeof(DWORD); + wcs.hInstance = hinst; + wcs.hIcon = NULL; + wcs.hCursor = NULL; + wcs.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wcs.lpszMenuName = NULL; + wcs.lpszClassName = "vomp"; + acc=LoadAccelerators(hinst,MAKEINTRESOURCE(VOMPACCELERATOR)); + if (!RegisterClass(&wcs)) + return false; + flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU + |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX; + RECT wnted={50,50,768+50,576+50}; + AdjustWindowRect(&wnted,flags ,false); + win_main=CreateWindow("vomp","VOMP on Windows",flags, CW_USEDEFAULT,CW_USEDEFAULT, + wnted.right-wnted.left,wnted.bottom-wnted.top,NULL,NULL,hinst,NULL); + if (!win_main) + return FALSE; + ShowWindow(win_main,SW_SHOWNORMAL); + UpdateWindow(win_main); + /* in order to handle letterboxing we use a child window */ + WNDCLASS child_wcs; + child_wcs.style = CS_HREDRAW | CS_VREDRAW; + child_wcs.lpfnWndProc = WindowProc; + child_wcs.cbClsExtra = 0; + child_wcs.cbWndExtra = sizeof(DWORD); + child_wcs.hInstance = hinst; + child_wcs.hIcon = NULL; + child_wcs.hCursor = NULL; + child_wcs.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); + child_wcs.lpszMenuName = NULL; + child_wcs.lpszClassName = "vomp_playback"; + if (!RegisterClass(&child_wcs)) + return false; + + win=CreateWindow("vomp_playback","Vomp Playback Window",WS_VISIBLE | WS_CHILD |WS_CLIPCHILDREN, + 0,0,768,576,win_main,NULL,hinst,NULL); + if (!win) + return FALSE; + ShowWindow(win,SW_SHOWNORMAL); + UpdateWindow(win); + if (remotefnc) {//at least windows XP + /* We want to support MCE Remote controls*/ + RAWINPUTDEVICE remote_control_data[4]; + ZeroMemory(remote_control_data,sizeof(remote_control_data)); + remote_control_data[0].usUsagePage=0xFFBC; + remote_control_data[0].usUsage=0x88; + remote_control_data[0].dwFlags=0; + remote_control_data[1].usUsagePage=0x0C; + remote_control_data[1].usUsage=0x80; + remote_control_data[1].dwFlags=0; + remote_control_data[2].usUsagePage=0x0C; + remote_control_data[2].usUsage=0x01; + remote_control_data[2].dwFlags=0; + remote_control_data[3].usUsagePage=0x01; + remote_control_data[3].usUsage=0x80; + remote_control_data[3].dwFlags=0; + if (dynRegisterRawInputDevices(remote_control_data,4,sizeof(remote_control_data[0]))!=TRUE) { + MessageBox(0,"Registering remote control failed!","Aborting!",0); + return FALSE; + } + + } + return TRUE; +} + + + + + +// ------------------------------------------------------------------------------------------------------------------- + +void shutdown(int code) +{ + if (viewman) + { + viewman->shutdown(); + delete viewman; + logger->log("Core", Log::NOTICE, "ViewMan module shut down"); + } + + if (command) // shut down command here in case views have posted messages + { + command->shutdown(); + delete command; + logger->log("Core", Log::NOTICE, "Command module shut down"); + } + + if (vdr) + { + vdr->shutdown(); + delete vdr; + logger->log("Core", Log::NOTICE, "VDR module shut down"); + } + + if (osd) + { + osd->shutdown(); + delete osd; + logger->log("Core", Log::NOTICE, "OSD module shut down"); + } + + if (audio) + { + audio->shutdown(); + delete audio; + logger->log("Core", Log::NOTICE, "Audio module shut down"); + } + + if (video) + { + video->shutdown(); + delete video; + logger->log("Core", Log::NOTICE, "Video module shut down"); + } + + if (timers) + { + timers->shutdown(); + delete timers; + logger->log("Core", Log::NOTICE, "Timers module shut down"); + } + + if (mtd) + { + mtd->shutdown(); + delete mtd; + logger->log("Core", Log::NOTICE, "MTD module shut down"); + } + + if (led) + { + led->shutdown(); + delete led; + logger->log("Core", Log::NOTICE, "LED module shut down"); + } + + if (remote) + { + remote->shutdown(); + delete remote; + logger->log("Core", Log::NOTICE, "Remote module shut down"); + } + + if (logger) + { + logger->log("Core", Log::NOTICE, "Log module shutting down... bye!\n\n"); + logger->shutdown(); + delete logger; + } + ExitProcess(0); + +} + +// ------------------------------------------------------------------------------------------------------------------- + +ULLONG ntohll(ULLONG a) +{ + return htonll(a); +} + +ULLONG htonll(ULLONG a) +{ + return (((ULLONG)htonl((ULONG)((a<<32)>> 32))<<32) + |(ULONG)htonl(((ULONG) (a >> 32)))); +} +#endif -- 2.39.5