X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0b3ef556f5a44615423d1793faed5ca53234ac92..f46e6a1ef9541a3d13c38a114870658d3b4e004b:/samples/fswatcher/fswatcher.cpp diff --git a/samples/fswatcher/fswatcher.cpp b/samples/fswatcher/fswatcher.cpp index 25e7e2cc5c..824f4c94e2 100644 --- a/samples/fswatcher/fswatcher.cpp +++ b/samples/fswatcher/fswatcher.cpp @@ -46,11 +46,13 @@ private: void OnClear(wxCommandEvent& WXUNUSED(event)) { m_evtConsole->Clear(); } void OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); } void OnWatch(wxCommandEvent& event); + void OnFollowLinks(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); void OnAdd(wxCommandEvent& event); void OnAddTree(wxCommandEvent& event); void OnRemove(wxCommandEvent& event); + void OnRemoveUpdateUI(wxUpdateUIEvent& event); void OnFileSystemEvent(wxFileSystemWatcherEvent& event); void LogEvent(const wxFileSystemWatcherEvent& event); @@ -58,6 +60,7 @@ private: wxTextCtrl *m_evtConsole; // events console wxListView *m_filesList; // list of watched paths wxFileSystemWatcher* m_watcher; // file system watcher + bool m_followLinks; // should symlinks be dereferenced const static wxString LOG_FORMAT; // how to format events }; @@ -135,7 +138,7 @@ IMPLEMENT_APP(MyApp) // frame constructor MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title), - m_watcher(NULL) + m_watcher(NULL), m_followLinks(false) { SetIcon(wxICON(sample)); @@ -145,6 +148,7 @@ MyFrame::MyFrame(const wxString& title) MENU_ID_QUIT = wxID_EXIT, MENU_ID_CLEAR = wxID_CLEAR, MENU_ID_WATCH = 101, + MENU_ID_DEREFERENCE, BTN_ID_ADD = 200, BTN_ID_ADD_TREE, @@ -166,6 +170,18 @@ MyFrame::MyFrame(const wxString& title) // started by default, because file system watcher is started by default it->Check(true); +#if defined(__UNIX__) + // Let the user decide whether to dereference symlinks. If he makes the + // wrong choice, asserts will occur if the symlink target is also watched + it = menuMon->AppendCheckItem(MENU_ID_DEREFERENCE, + "&Follow symlinks\tCtrl-F", + _("If checked, dereference symlinks") + ); + it->Check(false); + Connect(MENU_ID_DEREFERENCE, wxEVT_MENU, + wxCommandEventHandler(MyFrame::OnFollowLinks)); +#endif // __UNIX__ + // the "About" item should be in the help menu wxMenu *menuHelp = new wxMenu; menuHelp->Append(wxID_ABOUT, "&About\tF1", "Show about dialog"); @@ -247,22 +263,24 @@ MyFrame::MyFrame(const wxString& title) // event handlers & show // menu - Connect(MENU_ID_CLEAR, wxEVT_COMMAND_MENU_SELECTED, + Connect(MENU_ID_CLEAR, wxEVT_MENU, wxCommandEventHandler(MyFrame::OnClear)); - Connect(MENU_ID_QUIT, wxEVT_COMMAND_MENU_SELECTED, + Connect(MENU_ID_QUIT, wxEVT_MENU, wxCommandEventHandler(MyFrame::OnQuit)); - Connect(MENU_ID_WATCH, wxEVT_COMMAND_MENU_SELECTED, + Connect(MENU_ID_WATCH, wxEVT_MENU, wxCommandEventHandler(MyFrame::OnWatch)); - Connect(wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, + Connect(wxID_ABOUT, wxEVT_MENU, wxCommandEventHandler(MyFrame::OnAbout)); // buttons - Connect(BTN_ID_ADD, wxEVT_COMMAND_BUTTON_CLICKED, + Connect(BTN_ID_ADD, wxEVT_BUTTON, wxCommandEventHandler(MyFrame::OnAdd)); - Connect(BTN_ID_ADD_TREE, wxEVT_COMMAND_BUTTON_CLICKED, + Connect(BTN_ID_ADD_TREE, wxEVT_BUTTON, wxCommandEventHandler(MyFrame::OnAddTree)); - Connect(BTN_ID_REMOVE, wxEVT_COMMAND_BUTTON_CLICKED, + Connect(BTN_ID_REMOVE, wxEVT_BUTTON, wxCommandEventHandler(MyFrame::OnRemove)); + Connect(BTN_ID_REMOVE, wxEVT_UPDATE_UI, + wxUpdateUIEventHandler(MyFrame::OnRemoveUpdateUI)); // and show itself (the frames, unlike simple controls, are not shown when // created initially) @@ -324,6 +342,11 @@ void MyFrame::OnWatch(wxCommandEvent& event) } } +void MyFrame::OnFollowLinks(wxCommandEvent& event) +{ + m_followLinks = event.IsChecked(); +} + void MyFrame::OnAdd(wxCommandEvent& WXUNUSED(event)) { AddEntry(wxFSWPath_Dir); @@ -353,15 +376,23 @@ void MyFrame::AddEntry(wxFSWPathType type, wxString filename) wxString prefix; bool ok = false; + + // This will tell wxFileSystemWatcher whether to dereference symlinks + wxFileName fn = wxFileName::DirName(filename); + if (!m_followLinks) + { + fn.DontFollowLink(); + } + switch ( type ) { case wxFSWPath_Dir: - ok = m_watcher->Add(wxFileName::DirName(filename)); + ok = m_watcher->Add(fn); prefix = "Dir: "; break; case wxFSWPath_Tree: - ok = m_watcher->AddTree(wxFileName::DirName(filename)); + ok = m_watcher->AddTree(fn); prefix = "Tree: "; break; @@ -389,16 +420,24 @@ void MyFrame::OnRemove(wxCommandEvent& WXUNUSED(event)) if (idx == -1) return; - bool ret; - wxString path; + bool ret = false; + wxString path = m_filesList->GetItemText(idx).Mid(6); + + // This will tell wxFileSystemWatcher whether to dereference symlinks + wxFileName fn = wxFileName::DirName(path); + if (!m_followLinks) + { + fn.DontFollowLink(); + } + // TODO we know it is a dir, but it doesn't have to be - if (m_filesList->GetItemText(idx).StartsWith("Dir: ", &path)) + if (m_filesList->GetItemText(idx).StartsWith("Dir: ")) { - ret = m_watcher->Remove(wxFileName::DirName(path)); + ret = m_watcher->Remove(fn); } - else if (m_filesList->GetItemText(idx).StartsWith("Tree: ", &path)) + else if (m_filesList->GetItemText(idx).StartsWith("Tree: ")) { - ret = m_watcher->RemoveTree(wxFileName::DirName(path)); + ret = m_watcher->RemoveTree(fn); } else { @@ -415,6 +454,11 @@ void MyFrame::OnRemove(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnRemoveUpdateUI(wxUpdateUIEvent& event) +{ + event.Enable(m_filesList->GetFirstSelected() != wxNOT_FOUND); +} + void MyFrame::OnFileSystemEvent(wxFileSystemWatcherEvent& event) { // TODO remove when code is rock-solid @@ -491,6 +535,16 @@ static wxString GetFSWEventChangeTypeName(int changeType) return "MODIFY"; case wxFSW_EVENT_ACCESS: return "ACCESS"; + case wxFSW_EVENT_ATTRIB: // Currently this is wxGTK-only + return "ATTRIBUTE"; +#ifdef wxHAS_INOTIFY + case wxFSW_EVENT_UNMOUNT: // Currently this is wxGTK-only + return "UNMOUNT"; +#endif + case wxFSW_EVENT_WARNING: + return "WARNING"; + case wxFSW_EVENT_ERROR: + return "ERROR"; } return "INVALID_TYPE";