diff --git a/code-of-conduct.md b/code-of-conduct.md index e969ac0..6151097 100644 --- a/code-of-conduct.md +++ b/code-of-conduct.md @@ -1,77 +1,133 @@ + # Contributor Covenant Code of Conduct ## Our Pledge -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. ## Our Standards -Examples of behavior that contributes to creating a positive environment -include: +Examples of behavior that contributes to a positive environment for our +community include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community -Examples of unacceptable behavior by participants include: +Examples of unacceptable behavior include: -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission +* Publishing others' private information, such as a physical or email address, + without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting -## Our Responsibilities +## Enforcement Responsibilities -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. ## Scope -This Code of Conduct applies within all project spaces, and it also applies when -an individual is representing the project or its community in public spaces. -Examples of representing a project or community include using an official -project e-mail address, posting via an official social media account, or acting -as an appointed representative at an online or offline event. Representation of -a project may be further defined and clarified by project maintainers. +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at . All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq - +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/src/E2wxApp.cpp b/src/E2wxApp.cpp index b68ee7c..cab635e 100644 --- a/src/E2wxApp.cpp +++ b/src/E2wxApp.cpp @@ -64,7 +64,10 @@ wxIMPLEMENT_APP_NO_MAIN(E2wxApp); #define PROJECT_VENDOR nu.mine.mosher #endif #ifndef PROJECT_NAME -#define PROJECT_NAME Epple-II +#define PROJECT_NAME epple2 +#endif +#ifndef PROJECT_DISPLAY_NAME +#define PROJECT_DISPLAY_NAME PROJECT_NAME #endif @@ -90,7 +93,6 @@ void EmuTimer::Notify() { E2wxApp::E2wxApp() : - id(wxSTRINGIZE(PROJECT_VENDOR) "." wxSTRINGIZE(PROJECT_NAME)), version(wxSTRINGIZE(PROJECT_VERSION)), frame(nullptr), emu(nullptr), @@ -121,7 +123,6 @@ static std::filesystem::path dirDocuments() { - bool E2wxApp::OnInit() { if (!wxApp::OnInit()) { return false; @@ -135,6 +136,12 @@ bool E2wxApp::OnInit() { + SetVendorName(wxSTRINGIZE(PROJECT_VENDOR)); + SetAppName(wxSTRINGIZE(PROJECT_NAME)); + SetAppDisplayName(wxSTRINGIZE(PROJECT_DISPLAY_NAME)); + + + wxStandardPaths& stdpaths = wxStandardPaths::Get(); //stdpaths.SetInstallPrefix("."); stdpaths.SetFileLayout(wxStandardPaths::FileLayout_XDG); @@ -156,19 +163,21 @@ bool E2wxApp::OnInit() { // TODO define components to turn on/off for trace level logging (disk, cassette, woz, keyboard, ram, lss, audio, etc.) // TODO why are log messages getting buffered? (It ruins the timestamp.) - BOOST_LOG_TRIVIAL(info) << "Application ID: " << this->GetID(); + BOOST_LOG_TRIVIAL(info) << "Vendor name: " << this->GetVendorName(); + BOOST_LOG_TRIVIAL(info) << "Application name: " << this->GetAppName(); BOOST_LOG_TRIVIAL(info) << "Application version: " << this->GetVersion(); + const wxString id = GetVendorName() + "." + GetAppName(); - this->confdir = dirConfig() / path_from_string(GetID()+".d"); + this->confdir = dirConfig() / path_from_string(id+".d"); std::filesystem::create_directories(this->confdir); BOOST_LOG_TRIVIAL(info) << "Configuration directory path: " << this->confdir; - this->conffile = dirConfig() / path_from_string(GetID()); + this->conffile = dirConfig() / path_from_string(id); BOOST_LOG_TRIVIAL(info) << "Configuration file path: " << this->conffile; - wxConfigBase::Set(new wxFileConfig("", "", GetID())); + wxConfigBase::Set(new wxFileConfig("", "", id)); - this->docsdir = dirDocuments() / path_from_string(GetID()); + this->docsdir = dirDocuments() / path_from_string(id); BOOST_LOG_TRIVIAL(info) << "User document directory path: " << this->docsdir; const std::filesystem::path exe = path_from_string(stdpaths.GetExecutablePath()); @@ -207,33 +216,6 @@ bool E2wxApp::OnInit() { -void E2wxApp::OnFnKeyPressed(const SDL_Keycode k) { - if (k == SDLK_F1) { - this->TogglePower(); - } else if (k == SDLK_F2) { - this->CycleMonitor(); - } else if (k == SDLK_F3) { - this->ToggleFullScreen(); - } else if (k == SDLK_F4) { - // - } else if (k == SDLK_F5) { - this->EmulatorCommand(); - } else if (k == SDLK_F6) { - this->Reset(); - } else if (k == SDLK_F7) { - this->Paste(); - } else if (k == SDLK_F8) { - this->ScreenShot(); - } else if (k == SDLK_F9) { - this->CloseMainFrame(); - } else if (k == SDLK_F10) { - // - } else if (k == SDLK_F11) { - // - } else if (k == SDLK_F12) { - this->ToggleBuffered(); - } -} bool E2wxApp::CloseMainFrame() { bool r = false; @@ -332,10 +314,6 @@ const std::filesystem::path E2wxApp::GetResDir() const { return this->resdir; } -const wxString E2wxApp::GetID() const { - return this->id; -} - const wxString E2wxApp::GetVersion() const { return this->version; } @@ -355,9 +333,11 @@ const std::filesystem::path E2wxApp::GetDocumentsDir() const { const std::filesystem::path E2wxApp::BuildLogFilePath() const { + const wxString id = GetVendorName() + "." + GetAppName(); + std::filesystem::path logfile = dirCache() / - path_from_string(GetID()) / + path_from_string(id) / std::filesystem::path("log"); std::filesystem::create_directories(logfile); @@ -462,9 +442,9 @@ void E2wxApp::ToggleBuffered() { } void E2wxApp::ToggleFullScreen() { - if (this->emu) { - this->emu->toggleFullScreen(); - } +// if (this->emu) { +// this->emu->toggleFullScreen(); +// } } static const wxString message = "Enter a command for the emulator. See https://cmosher01.github.io/Epple-II/usermanual.html"; diff --git a/src/E2wxApp.h b/src/E2wxApp.h index 72f0532..f6b011f 100644 --- a/src/E2wxApp.h +++ b/src/E2wxApp.h @@ -25,7 +25,9 @@ #include +#include #include +#include #include #include #include @@ -40,6 +42,20 @@ class Emulator; +enum E2MenuID { + ID_MENUITEM_POWER = wxID_HIGHEST+1, + ID_MENUITEM_CYCLE_MONITOR, + ID_MENUITEM_TOGGLE_FULL_SCREEN, + ID_MENUITEM_EMULATOR_COMMAND, + ID_MENUITEM_RESET, + ID_MENUITEM_SCREEN_SHOT, + ID_MENUITEM_TOGGLE_BUFFERED, + ID_MENUITEM_START_EMULATOR, + ID_MENUITEM_STOP_EMULATOR, +}; + + + class EmuTimer : public wxTimer { Emulator *emu; @@ -55,7 +71,6 @@ public: class E2wxApp : public wxApp { - const wxString id; const wxString version; std::filesystem::path logfile; std::filesystem::path resdir; @@ -75,7 +90,6 @@ public: E2wxApp(); virtual ~E2wxApp(); - const wxString GetID() const; const wxString GetVersion() const; const std::filesystem::path GetLogFile() const; const std::filesystem::path GetResDir() const; @@ -88,8 +102,6 @@ public: void StartEmulator(); void StopEmulator(); - void OnFnKeyPressed(const SDL_Keycode k); - bool CloseMainFrame(); bool EnsureCanQuit(); void Paste(); diff --git a/src/E2wxFrame.cpp b/src/E2wxFrame.cpp index 55cee7b..52ac1ad 100644 --- a/src/E2wxFrame.cpp +++ b/src/E2wxFrame.cpp @@ -34,17 +34,6 @@ #include -enum E2MenuID { - ID_MENUITEM_POWER = wxID_HIGHEST+1, - ID_MENUITEM_CYCLE_MONITOR, - ID_MENUITEM_TOGGLE_FULL_SCREEN, - ID_MENUITEM_EMULATOR_COMMAND, - ID_MENUITEM_RESET, - ID_MENUITEM_SCREEN_SHOT, - ID_MENUITEM_TOGGLE_BUFFERED, - ID_MENUITEM_START_EMULATOR, - ID_MENUITEM_STOP_EMULATOR, -}; wxBEGIN_EVENT_TABLE(E2wxFrame, wxFrame) EVT_CLOSE(E2wxFrame::HandleUserQuitRequest) @@ -136,7 +125,7 @@ void E2wxFrame::InitMenuBar() { void E2wxFrame::InitStatusBar() { CreateStatusBar(); - SetStatusText("Welcome to "+wxGetApp().GetID()); + SetStatusText("Welcome to "+wxGetApp().GetAppDisplayName()); } @@ -175,14 +164,17 @@ void E2wxFrame::OnPreferences(wxCommandEvent& event) { void E2wxFrame::OnAbout(wxCommandEvent& event) { wxString msg = ""; - msg += wxGetApp().GetID()+"\n"; + msg += wxGetApp().GetVendorName(); + msg += "."; + msg += wxGetApp().GetAppName(); + msg += "\n"; msg += "version: "+wxGetApp().GetVersion()+"\n"; msg += "Current log file:\n"; msg += wxGetApp().GetLogFile().c_str(); - wxMessageBox(msg, "About "+wxGetApp().GetID(), wxOK | wxICON_INFORMATION); + wxMessageBox(msg, "About "+wxGetApp().GetAppDisplayName(), wxOK | wxICON_INFORMATION); } @@ -196,7 +188,7 @@ void E2wxFrame::OnCycleMonitor(wxCommandEvent& event) { } void E2wxFrame::OnToggleFullScreen(wxCommandEvent& event) { - wxGetApp().ToggleFullScreen(); +// wxGetApp().ToggleFullScreen(); } void E2wxFrame::OnEmulatorCommand(wxCommandEvent& event) { diff --git a/src/emulator.cpp b/src/emulator.cpp index 89cc173..a8ac1cd 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -38,7 +38,7 @@ Emulator::Emulator() : - screenImage(keyEventHandler), + screenImage(*this, keyEventHandler), display(screenImage), videoStatic(display), apple2(keypresses, paddleButtonStates, display, buffered, screenImage), diff --git a/src/screenimage.cpp b/src/screenimage.cpp index 6129ffe..1a9c96e 100644 --- a/src/screenimage.cpp +++ b/src/screenimage.cpp @@ -23,6 +23,7 @@ #include "card.h" #include "gtkutil.h" #include "util.h" +#include "emulator.h" #include #include @@ -66,8 +67,9 @@ static const int WIDTH = AppleNTSC::H - AppleNTSC::PIC_START - 2; class ScreenException { }; -ScreenImage::ScreenImage(KeyEventHandler &k) : +ScreenImage::ScreenImage(Emulator &emulator, KeyEventHandler &k) : wxFrame(nullptr, wxID_ANY, "Emulator"), + emu(emulator), fullscreen(false), buffer(true), display(AnalogTV::TV_OLD_COLOR), @@ -79,6 +81,7 @@ ScreenImage::ScreenImage(KeyEventHandler &k) : Center(); Show(); Bind(wxEVT_IDLE, &ScreenImage::OnIdle, this); + Bind(wxEVT_CLOSE_WINDOW, &ScreenImage::HandleUserCloseWindowRequest, this); } ScreenImage::~ScreenImage() { @@ -87,12 +90,17 @@ ScreenImage::~ScreenImage() { + void ScreenImage::OnIdle(wxIdleEvent &evt) { if (!this->FindFocus() || !this->sdl->HasFocus()) { this->sdl->SetFocus(); } } +void ScreenImage::HandleUserCloseWindowRequest(wxCloseEvent& event) { + wxGetApp().StopEmulator(); +} + void ScreenImage::exitFullScreen() { // if (this->fullscreen) { // toggleFullScreen(); diff --git a/src/screenimage.h b/src/screenimage.h index d6c0e0d..f0d2f5d 100644 --- a/src/screenimage.h +++ b/src/screenimage.h @@ -30,6 +30,7 @@ #include #include +class Emulator; class Card; struct SDL_Texture; struct SDL_Renderer; @@ -37,6 +38,7 @@ struct SDL_Window; class ScreenImage : public wxFrame { private: + Emulator &emu; wxPanel *sdl; SDL_Window* window; SDL_Renderer* renderer; @@ -60,10 +62,11 @@ private: void OnIdle(wxIdleEvent &evt); void OnKeyDown(wxKeyEvent &evt); void OnKeyUp(wxKeyEvent &evt); + void HandleUserCloseWindowRequest(wxCloseEvent& event); // TODO some of these methods should be private public: - ScreenImage(KeyEventHandler &keyEventHandler); + ScreenImage(Emulator &emulator, KeyEventHandler &keyEventHandler); ~ScreenImage(); void exitFullScreen();