diff --git a/src/cfgfile.cpp b/src/cfgfile.cpp index 6105ca6e..657c115b 100644 --- a/src/cfgfile.cpp +++ b/src/cfgfile.cpp @@ -478,6 +478,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) #ifdef RASPBERRY cfgfile_write (f, _T("gfx_correct_aspect"), _T("%d"), p->gfx_correct_aspect); cfgfile_write (f, _T("gfx_fullscreen_ratio"), _T("%d"), p->gfx_fullscreen_ratio); + cfgfile_write (f, _T("kbd_led_num"), _T("%d"), p->kbd_led_num); + cfgfile_write (f, _T("kbd_led_scr"), _T("%d"), p->kbd_led_scr); + cfgfile_write (f, _T("kbd_led_cap"), _T("%d"), p->kbd_led_cap); #endif cfgfile_write_bool (f, _T("immediate_blits"), p->immediate_blits); @@ -878,6 +881,12 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value) if (cfgfile_intval (option, value, "gfx_fullscreen_ratio", &p->gfx_fullscreen_ratio, 1)) return 1; + if (cfgfile_intval (option, value, "kbd_led_num", &p->kbd_led_num, 1)) + return 1; + if (cfgfile_intval (option, value, "kbd_led_scr", &p->kbd_led_scr, 1)) + return 1; + if (cfgfile_intval (option, value, "kbd_led_cap", &p->kbd_led_cap, 1)) + return 1; #endif if (cfgfile_string (option, value, _T("config_info"), p->info, sizeof p->info / sizeof (TCHAR)) @@ -2573,6 +2582,9 @@ void default_prefs (struct uae_prefs *p, int type) #ifdef RASPBERRY p->gfx_correct_aspect = 1; p->gfx_fullscreen_ratio = 100; + p->kbd_led_num = -1; // No status on numlock + p->kbd_led_scr = -1; // No status on scrollock + p->kbd_led_cap = -1; // No status on capslock #endif p->immediate_blits = 0; p->waiting_blits = 0; diff --git a/src/include/options.h b/src/include/options.h index 0488957e..01d04e18 100644 --- a/src/include/options.h +++ b/src/include/options.h @@ -143,6 +143,9 @@ struct uae_prefs { #ifdef RASPBERRY int gfx_correct_aspect; int gfx_fullscreen_ratio; + int kbd_led_num; + int kbd_led_scr; + int kbd_led_cap; #endif bool immediate_blits; diff --git a/src/od-pandora/gui/PanelMisc.cpp b/src/od-pandora/gui/PanelMisc.cpp index 59c07826..64ac4597 100644 --- a/src/od-pandora/gui/PanelMisc.cpp +++ b/src/od-pandora/gui/PanelMisc.cpp @@ -29,6 +29,42 @@ static gcn::Slider* sldPandoraSpeed; #endif static gcn::UaeCheckBox* chkBSDSocket; +#ifdef RASPBERRY +class StringListModel : public gcn::ListModel +{ + private: + std::vector values; + public: + StringListModel(const char *entries[], int count) + { + for(int i=0; i= values.size()) + return "---"; + return values[i]; + } +}; + + +static gcn::Label *lblNumLock; +static gcn::UaeDropDown* cboKBDLed_num; +static gcn::Label *lblScrLock; +static gcn::UaeDropDown* cboKBDLed_scr; +static gcn::Label *lblCapLock; +static gcn::UaeDropDown* cboKBDLed_cap; + +const char *listValues[] = { "", "POWER", "DF0", "DF1", "DF2", "DF3", "DF*", "HD" }; +StringListModel KBDLedList(listValues, 8); +#endif class MiscActionListener : public gcn::ActionListener { @@ -60,6 +96,30 @@ class MiscActionListener : public gcn::ActionListener } } #endif + +#ifdef RASPBERRY + else if (actionEvent.getSource() == cboKBDLed_num) + { + if (cboKBDLed_num->getSelected() == 0) changed_prefs.kbd_led_num = -1; // Nothing + if (cboKBDLed_num->getSelected() == 7) changed_prefs.kbd_led_num = 5; // HD + if (cboKBDLed_num->getSelected() == 6) changed_prefs.kbd_led_num = -2; // Any DFs + if (cboKBDLed_num->getSelected() >= 1 && cboKBDLed_num->getSelected() <= 4) changed_prefs.kbd_led_num = cboKBDLed_num->getSelected() - 1; // Specific DF# + } + else if (actionEvent.getSource() == cboKBDLed_cap) + { + if (cboKBDLed_cap->getSelected() == 0) changed_prefs.kbd_led_cap = -1; + if (cboKBDLed_cap->getSelected() == 7) changed_prefs.kbd_led_cap = 5; + if (cboKBDLed_cap->getSelected() == 6) changed_prefs.kbd_led_cap = -2; + if (cboKBDLed_cap->getSelected() >= 1 && cboKBDLed_cap->getSelected() <= 4) changed_prefs.kbd_led_cap = cboKBDLed_cap->getSelected() - 1; + } + else if (actionEvent.getSource() == cboKBDLed_scr) + { + if (cboKBDLed_scr->getSelected() == 0) changed_prefs.kbd_led_scr = -1; + if (cboKBDLed_scr->getSelected() == 7) changed_prefs.kbd_led_scr = 5; + if (cboKBDLed_scr->getSelected() == 6) changed_prefs.kbd_led_scr = -2; + if (cboKBDLed_scr->getSelected() >= 1 && cboKBDLed_scr->getSelected() <= 4) changed_prefs.kbd_led_scr = cboKBDLed_scr->getSelected() - 1; + } +#endif } }; MiscActionListener* miscActionListener; @@ -114,8 +174,48 @@ void InitPanelMisc(const struct _ConfigCategory& category) #endif category.panel->add(chkBSDSocket, DISTANCE_BORDER, posY); posY += chkBSDSocket->getHeight() + DISTANCE_NEXT_Y; - - RefreshPanelMisc(); + +#ifdef RASPBERRY + lblNumLock = new gcn::Label("NumLock LED"); + lblNumLock->setSize(150, LABEL_HEIGHT); + lblNumLock->setAlignment(gcn::Graphics::LEFT); + cboKBDLed_num = new gcn::UaeDropDown(&KBDLedList); + cboKBDLed_num->setSize(150, DROPDOWN_HEIGHT); + cboKBDLed_num->setBaseColor(gui_baseCol); + cboKBDLed_num->setId("numlock"); + cboKBDLed_num->addActionListener(miscActionListener); + + lblCapLock = new gcn::Label("CapsLock LED"); + lblCapLock->setSize(150, LABEL_HEIGHT); + lblCapLock->setAlignment(gcn::Graphics::LEFT); + cboKBDLed_cap = new gcn::UaeDropDown(&KBDLedList); + cboKBDLed_cap->setSize(150, DROPDOWN_HEIGHT); + cboKBDLed_cap->setBaseColor(gui_baseCol); + cboKBDLed_cap->setId("capslock"); + cboKBDLed_cap->addActionListener(miscActionListener); + + lblScrLock = new gcn::Label("ScrollLock LED"); + lblScrLock->setSize(150, LABEL_HEIGHT); + lblScrLock->setAlignment(gcn::Graphics::LEFT); + cboKBDLed_scr = new gcn::UaeDropDown(&KBDLedList); + cboKBDLed_scr->setSize(150, DROPDOWN_HEIGHT); + cboKBDLed_scr->setBaseColor(gui_baseCol); + cboKBDLed_scr->setId("scrolllock"); + cboKBDLed_scr->addActionListener(miscActionListener); + + category.panel->add(lblNumLock, DISTANCE_BORDER, posY); +// category.panel->add(lblCapLock, lblNumLock->getX() + lblNumLock->getWidth() + DISTANCE_NEXT_X, posY); + category.panel->add(lblScrLock, lblCapLock->getX() + lblCapLock->getWidth() + DISTANCE_NEXT_X, posY); + posY += lblNumLock->getHeight() + 4; + + category.panel->add(cboKBDLed_num, DISTANCE_BORDER, posY); +// category.panel->add(cboKBDLed_cap, cboKBDLed_num->getX() + cboKBDLed_num->getWidth() + DISTANCE_NEXT_X, posY); + category.panel->add(cboKBDLed_scr, cboKBDLed_cap->getX() + cboKBDLed_cap->getWidth() + DISTANCE_NEXT_X, posY); + + posY += cboKBDLed_scr->getHeight() + DISTANCE_NEXT_Y; +#endif + +RefreshPanelMisc(); } @@ -130,6 +230,15 @@ void ExitPanelMisc(void) delete lblPandoraSpeedInfo; #endif delete chkBSDSocket; + +#ifdef RASPBERRY + delete lblCapLock; + delete lblScrLock; + delete lblNumLock; + delete cboKBDLed_num; + delete cboKBDLed_cap; + delete cboKBDLed_scr; +#endif delete miscActionListener; } @@ -148,4 +257,18 @@ void RefreshPanelMisc(void) #endif chkBSDSocket->setSelected(changed_prefs.socket_emu); +#ifdef RASPBERRY + if (changed_prefs.kbd_led_num == -1) cboKBDLed_num->setSelected(0); + if (changed_prefs.kbd_led_num == -2) cboKBDLed_num->setSelected(6); + if (changed_prefs.kbd_led_num == 5) cboKBDLed_num->setSelected(7); + if (changed_prefs.kbd_led_num >= 1 && changed_prefs.kbd_led_num <= 4) cboKBDLed_num->setSelected(changed_prefs.kbd_led_num + 1); + if (changed_prefs.kbd_led_cap == -1) cboKBDLed_cap->setSelected(0); + if (changed_prefs.kbd_led_cap == -2) cboKBDLed_cap->setSelected(6); + if (changed_prefs.kbd_led_cap == 5) cboKBDLed_cap->setSelected(7); + if (changed_prefs.kbd_led_cap >= 1 && changed_prefs.kbd_led_cap <= 4) cboKBDLed_cap->setSelected(changed_prefs.kbd_led_cap + 1); + if (changed_prefs.kbd_led_scr == -1) cboKBDLed_scr->setSelected(0); + if (changed_prefs.kbd_led_scr == -2) cboKBDLed_scr->setSelected(6); + if (changed_prefs.kbd_led_scr == 5) cboKBDLed_scr->setSelected(7); + if (changed_prefs.kbd_led_scr >= 1 && changed_prefs.kbd_led_scr <= 4) cboKBDLed_scr->setSelected(changed_prefs.kbd_led_scr + 1); +#endif } diff --git a/src/od-pandora/pandora.cpp b/src/od-pandora/pandora.cpp index f642e7d5..7c587401 100644 --- a/src/od-pandora/pandora.cpp +++ b/src/od-pandora/pandora.cpp @@ -109,7 +109,10 @@ int customControlMap[SDLK_LAST]; char start_path_data[MAX_DPATH]; char currentDir[MAX_DPATH]; #ifdef CAPSLOCK_DEBIAN_WORKAROUND -static int capslock = 0; + #include + #include + unsigned long kbd_led_status; + char kbd_flags; #endif static char config_path[MAX_DPATH]; @@ -853,6 +856,24 @@ int main (int argc, char *argv[]) alloc_AmigaMem(); RescanROMs(); +#ifdef CAPSLOCK_DEBIAN_WORKAROUND + // set capslock state based upon current "real" state + ioctl(0, KDGKBLED, &kbd_flags); + ioctl(0, KDGETLED, &kbd_led_status); + if ((kbd_flags & 07) & LED_CAP) + { + // record capslock pressed + kbd_led_status |= LED_CAP; + inputdevice_do_keyboard(AK_CAPSLOCK, 1); + } else + { + // record capslock as not pressed + kbd_led_status &= ~LED_CAP; + inputdevice_do_keyboard(AK_CAPSLOCK, 0); + } + ioctl(0, KDSETLED, kbd_led_status); +#endif + //keyboard_settrans(); real_main (argc, argv); @@ -946,7 +967,15 @@ int handle_msgpump (void) inputdevice_translatekeycode(0, rEvent.key.keysym.scancode, 1); } - break; + #ifdef CAPSLOCK_DEBIAN_WORKAROUND + if (rEvent.key.keysym.sym == SDLK_CAPSLOCK) + { + ioctl(0, KDGETLED, &kbd_led_status); + kbd_led_status |= LED_CAP; + ioctl(0, KDSETLED, kbd_led_status); + } + #endif + break; } break; @@ -976,7 +1005,7 @@ int handle_msgpump (void) } else if(keycode > 0) { // Send mapped key release - inputdevice_do_keyboard(keycode, 0); + inputdevice_do_keyboard(keycode, 0); break; } } @@ -994,6 +1023,14 @@ int handle_msgpump (void) else inputdevice_translatekeycode(0, rEvent.key.keysym.scancode, 0); } + #ifdef CAPSLOCK_DEBIAN_WORKAROUND + if (rEvent.key.keysym.sym == SDLK_CAPSLOCK) + { + ioctl(0, KDGETLED, &kbd_led_status); + kbd_led_status &= ~LED_CAP; + ioctl(0, KDSETLED, kbd_led_status); + } + #endif break; } break; diff --git a/src/od-pandora/pandora_gui.cpp b/src/od-pandora/pandora_gui.cpp index 2ceaec84..a61906b9 100644 --- a/src/od-pandora/pandora_gui.cpp +++ b/src/od-pandora/pandora_gui.cpp @@ -736,19 +736,42 @@ void gui_disk_image_change (int unitnum, const char *name, bool writeprotected) void gui_led (int led, int on) { #ifdef RASPBERRY - static unsigned long kb_led_status; + #define LED_DFs -2 // Define for any DF* access - ioctl(NULL, KDGETLED, &kb_led_status); - switch(led) - { - case LED_DF0: - if(on) kb_led_status |= LED_SCR; else kb_led_status &= ~LED_SCR; - break; - case LED_HD: - if(on) kb_led_status |= LED_NUM; else kb_led_status &= ~LED_NUM; - break; - } - ioctl(NULL, KDSETLED, kb_led_status); + unsigned long kbd_led_status; + + // Check current prefs/ update if changed + if (currprefs.kbd_led_num != changed_prefs.kbd_led_num) currprefs.kbd_led_num = changed_prefs.kbd_led_num; + if (currprefs.kbd_led_scr != changed_prefs.kbd_led_scr) currprefs.kbd_led_scr = changed_prefs.kbd_led_scr; + + ioctl(0, KDGETLED, &kbd_led_status); + + // Handle floppy led status + if (led == LED_DF0 || led == LED_DF1 || led == LED_DF2 || led == LED_DF3) + { + if (currprefs.kbd_led_num == led || currprefs.kbd_led_num == LED_DFs) + { + if (on) kbd_led_status |= LED_NUM; else kbd_led_status &= ~LED_NUM; + } + if (currprefs.kbd_led_scr == led || currprefs.kbd_led_scr == LED_DFs) + { + if (on) kbd_led_status |= LED_SCR; else kbd_led_status &= ~LED_SCR; + } + } + + // Handle power, hd/cd led status + if (led == LED_POWER || led == LED_HD) + { + if (currprefs.kbd_led_num == led) + { + if (on) kbd_led_status |= LED_NUM; else kbd_led_status &= ~LED_NUM; + } + if (currprefs.kbd_led_scr == led) + { + if (on) kbd_led_status |= LED_SCR; else kbd_led_status &= ~LED_SCR; + } + } + ioctl(0, KDSETLED, kbd_led_status); #endif } @@ -764,27 +787,25 @@ void gui_flicker_led (int led, int unitnum, int status) case LED_POWER: break; - - case LED_DF0: - case LED_DF1: - case LED_DF2: - case LED_DF3: - gui_led(LED_DF0,1); - break; - - case LED_HD: + + case LED_HD: if (status == 0) { - hd_resetcounter--; - if (hd_resetcounter > 0) - return; - } + hd_resetcounter--; + if (hd_resetcounter > 0) + return; + #ifdef RASPBERRY + // HD LED off + gui_led(LED_HD, 0); + #endif + } + #ifdef RASPBERRY + // HD LED on + else gui_led(LED_HD, 1); + #endif gui_data.hd = status; hd_resetcounter = 2; - gui_led(LED_HD,1); - break; + break; } - gui_led(LED_HD,0); - gui_led(LED_DF0,0); }