Use FSEvents in wxFileSystemWatcher on OS X

The FSEvents API allows for creating watches in entire trees of
directories in an efficient manner.

Closes #16969.
This commit is contained in:
Roberto Perpuly
2015-06-06 02:37:35 +04:00
committed by Dimitri Schoolwerth
parent f0e098fa06
commit aa5dbad410
14 changed files with 700 additions and 36 deletions
+30 -9
View File
@@ -2253,7 +2253,8 @@ COND_TOOLKIT_OSX_CARBON_BASE_OSX_SRC = \
src/unix/threadpsx.cpp \
src/unix/utilsunx.cpp \
src/unix/wakeuppipe.cpp \
src/unix/fswatcher_kqueue.cpp
src/unix/fswatcher_kqueue.cpp \
src/osx/fswatcher_fsevents.cpp
@COND_TOOLKIT_OSX_CARBON@BASE_OSX_SRC = $(COND_TOOLKIT_OSX_CARBON_BASE_OSX_SRC)
COND_TOOLKIT_OSX_COCOA_BASE_OSX_SRC = \
src/osx/core/mimetype.cpp \
@@ -2277,7 +2278,8 @@ COND_TOOLKIT_OSX_COCOA_BASE_OSX_SRC = \
src/unix/threadpsx.cpp \
src/unix/utilsunx.cpp \
src/unix/wakeuppipe.cpp \
src/unix/fswatcher_kqueue.cpp
src/unix/fswatcher_kqueue.cpp \
src/osx/fswatcher_fsevents.cpp
@COND_TOOLKIT_OSX_COCOA@BASE_OSX_SRC = $(COND_TOOLKIT_OSX_COCOA_BASE_OSX_SRC)
COND_TOOLKIT_OSX_IPHONE_BASE_OSX_SRC = \
src/osx/core/mimetype.cpp \
@@ -2301,7 +2303,8 @@ COND_TOOLKIT_OSX_IPHONE_BASE_OSX_SRC = \
src/unix/threadpsx.cpp \
src/unix/utilsunx.cpp \
src/unix/wakeuppipe.cpp \
src/unix/fswatcher_kqueue.cpp
src/unix/fswatcher_kqueue.cpp \
src/osx/fswatcher_fsevents.cpp
@COND_TOOLKIT_OSX_IPHONE@BASE_OSX_SRC = $(COND_TOOLKIT_OSX_IPHONE_BASE_OSX_SRC)
COND_TOOLKIT_COCOA_BASE_OSX_SRC = \
src/common/fdiodispatcher.cpp \
@@ -2442,7 +2445,8 @@ COND_TOOLKIT_OSX_CARBON_BASE_OSX_HDR = \
wx/unix/stdpaths.h \
wx/unix/stackwalk.h \
wx/unix/tls.h \
wx/unix/fswatcher_kqueue.h
wx/unix/fswatcher_kqueue.h \
wx/osx/fswatcher_fsevents.h
@COND_TOOLKIT_OSX_CARBON@BASE_OSX_HDR = $(COND_TOOLKIT_OSX_CARBON_BASE_OSX_HDR)
COND_TOOLKIT_OSX_COCOA_BASE_OSX_HDR = \
wx/osx/core/cfdataref.h \
@@ -2463,7 +2467,8 @@ COND_TOOLKIT_OSX_COCOA_BASE_OSX_HDR = \
wx/unix/stdpaths.h \
wx/unix/stackwalk.h \
wx/unix/tls.h \
wx/unix/fswatcher_kqueue.h
wx/unix/fswatcher_kqueue.h \
wx/osx/fswatcher_fsevents.h
@COND_TOOLKIT_OSX_COCOA@BASE_OSX_HDR = $(COND_TOOLKIT_OSX_COCOA_BASE_OSX_HDR)
COND_TOOLKIT_COCOA_BASE_OSX_HDR = \
wx/unix/app.h \
@@ -4513,7 +4518,8 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS = \
monodll_threadpsx.o \
monodll_utilsunx.o \
monodll_wakeuppipe.o \
monodll_fswatcher_kqueue.o
monodll_fswatcher_kqueue.o \
monodll_fswatcher_fsevents.o
@COND_PLATFORM_MACOSX_1@__BASE_PLATFORM_SRC_OBJECTS = $(COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS)
@COND_PLATFORM_MSDOS_1@__BASE_PLATFORM_SRC_OBJECTS = \
@COND_PLATFORM_MSDOS_1@ monodll_msdos_dir.o monodll_msdos_mimetype.o \
@@ -6888,7 +6894,8 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_1 = \
monolib_threadpsx.o \
monolib_utilsunx.o \
monolib_wakeuppipe.o \
monolib_fswatcher_kqueue.o
monolib_fswatcher_kqueue.o \
monolib_fswatcher_fsevents.o
@COND_PLATFORM_MACOSX_1@__BASE_PLATFORM_SRC_OBJECTS_1 = $(COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_1)
@COND_PLATFORM_MSDOS_1@__BASE_PLATFORM_SRC_OBJECTS_1 \
@COND_PLATFORM_MSDOS_1@ = monolib_msdos_dir.o monolib_msdos_mimetype.o \
@@ -9316,7 +9323,8 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_2 = \
basedll_threadpsx.o \
basedll_utilsunx.o \
basedll_wakeuppipe.o \
basedll_fswatcher_kqueue.o
basedll_fswatcher_kqueue.o \
basedll_fswatcher_fsevents.o
@COND_PLATFORM_MACOSX_1@__BASE_PLATFORM_SRC_OBJECTS_2 = $(COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_2)
@COND_PLATFORM_MSDOS_1@__BASE_PLATFORM_SRC_OBJECTS_2 \
@COND_PLATFORM_MSDOS_1@ = basedll_msdos_dir.o basedll_msdos_mimetype.o \
@@ -9404,7 +9412,8 @@ COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_3 = \
baselib_threadpsx.o \
baselib_utilsunx.o \
baselib_wakeuppipe.o \
baselib_fswatcher_kqueue.o
baselib_fswatcher_kqueue.o \
baselib_fswatcher_fsevents.o
@COND_PLATFORM_MACOSX_1@__BASE_PLATFORM_SRC_OBJECTS_3 = $(COND_PLATFORM_MACOSX_1___BASE_PLATFORM_SRC_OBJECTS_3)
@COND_PLATFORM_MSDOS_1@__BASE_PLATFORM_SRC_OBJECTS_3 \
@COND_PLATFORM_MSDOS_1@ = baselib_msdos_dir.o baselib_msdos_mimetype.o \
@@ -17740,6 +17749,9 @@ monodll_strconv_cf.o: $(srcdir)/src/osx/core/strconv_cf.cpp $(MONODLL_ODEP)
monodll_utilsexc_base.o: $(srcdir)/src/osx/core/utilsexc_base.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/osx/core/utilsexc_base.cpp
monodll_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp
monodll_msdos_dir.o: $(srcdir)/src/msdos/dir.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msdos/dir.cpp
@@ -23662,6 +23674,9 @@ monolib_strconv_cf.o: $(srcdir)/src/osx/core/strconv_cf.cpp $(MONOLIB_ODEP)
monolib_utilsexc_base.o: $(srcdir)/src/osx/core/utilsexc_base.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/osx/core/utilsexc_base.cpp
monolib_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp
monolib_msdos_dir.o: $(srcdir)/src/msdos/dir.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msdos/dir.cpp
@@ -29584,6 +29599,9 @@ basedll_strconv_cf.o: $(srcdir)/src/osx/core/strconv_cf.cpp $(BASEDLL_ODEP)
basedll_utilsexc_base.o: $(srcdir)/src/osx/core/utilsexc_base.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/osx/core/utilsexc_base.cpp
basedll_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp
basedll_msdos_dir.o: $(srcdir)/src/msdos/dir.cpp $(BASEDLL_ODEP)
$(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/msdos/dir.cpp
@@ -30064,6 +30082,9 @@ baselib_strconv_cf.o: $(srcdir)/src/osx/core/strconv_cf.cpp $(BASELIB_ODEP)
baselib_utilsexc_base.o: $(srcdir)/src/osx/core/utilsexc_base.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/osx/core/utilsexc_base.cpp
baselib_fswatcher_fsevents.o: $(srcdir)/src/osx/fswatcher_fsevents.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/osx/fswatcher_fsevents.cpp
baselib_msdos_dir.o: $(srcdir)/src/msdos/dir.cpp $(BASELIB_ODEP)
$(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/msdos/dir.cpp
+2
View File
@@ -210,10 +210,12 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/osx/core/mimetype.cpp
$(BASE_COREFOUNDATION_SRC)
$(BASE_UNIX_AND_DARWIN_SRC)
src/osx/fswatcher_fsevents.cpp
</set>
<set var="BASE_OSX_SHARED_HDR" hints="files">
$(BASE_COREFOUNDATION_HDR)
$(BASE_UNIX_AND_DARWIN_HDR)
wx/osx/fswatcher_fsevents.h
</set>
<!-- Base and GUI files used by OS X -->
<set var="BASE_AND_GUI_OSX_CARBON_SRC" hints="files">
+2
View File
@@ -151,10 +151,12 @@ BASE_COREFOUNDATION_HDR =
# Base files used by OS X ports (not Carbon)
BASE_OSX_SHARED_SRC =
src/osx/core/mimetype.cpp
src/osx/fswatcher_fsevents.cpp
$(BASE_COREFOUNDATION_SRC)
$(BASE_UNIX_AND_DARWIN_SRC)
BASE_OSX_SHARED_HDR =
wx/osx/fswatcher_fsevents.h
$(BASE_COREFOUNDATION_HDR)
$(BASE_UNIX_AND_DARWIN_HDR)
@@ -877,6 +877,8 @@
8292D346BFC33D6E8D3CDDC0 /* xh_sttxt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B3F1680BBE8331A7B745638C /* xh_sttxt.cpp */; };
82FA4AA043213728AC266700 /* wizard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F08F70E1EF239999A4D2AC4 /* wizard.cpp */; };
82FA4AA043213728AC266701 /* wizard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F08F70E1EF239999A4D2AC4 /* wizard.cpp */; };
830A61EA04FD367C9EB6A757 /* fswatcher_fsevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */; };
830A61EA04FD367C9EB6A758 /* fswatcher_fsevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */; };
834F2ADD0520313FBAC4F927 /* LexCsound.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A59A5C2305D3D1C8049BE71 /* LexCsound.cxx */; };
834F2ADD0520313FBAC4F928 /* LexCsound.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A59A5C2305D3D1C8049BE71 /* LexCsound.cxx */; };
83616D33080E3F0F9FA5FBB4 /* xh_html.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 889FFA9573A835F280A21CB4 /* xh_html.cpp */; };
@@ -2023,6 +2025,7 @@
5AACC1EC2E2A33B3ABF5EDCA /* xh_radbt.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = xh_radbt.cpp; path = ../../src/xrc/xh_radbt.cpp; sourceTree = "<group>"; };
5AFB85719CBC3D60BA2EDC2E /* CharClassify.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CharClassify.cxx; path = ../../src/stc/scintilla/src/CharClassify.cxx; sourceTree = "<group>"; };
5B32A13D5B3336098B1B9765 /* pngtrans.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngtrans.c; path = ../../src/png/pngtrans.c; sourceTree = "<group>"; };
5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fswatcher_fsevents.cpp; path = ../../src/osx/fswatcher_fsevents.cpp; sourceTree = "<group>"; };
5B9586328A1F3C4BA0390AA5 /* time.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time.cpp; path = ../../src/common/time.cpp; sourceTree = "<group>"; };
5BD6231188AB329CAA5E1171 /* evtloop_cf.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = evtloop_cf.cpp; path = ../../src/osx/core/evtloop_cf.cpp; sourceTree = "<group>"; };
5BEC6B3CAFB532CBB9F95D74 /* jutils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jutils.c; path = ../../src/jpeg/jutils.c; sourceTree = "<group>"; };
@@ -3555,6 +3558,7 @@
DC75C7251C1732B0B07C7BD3 /* utilsunx.cpp */,
B38F3D4DC6D139BA93401F7A /* wakeuppipe.cpp */,
C019CE87CF9931B0B77C0823 /* fswatcher_kqueue.cpp */,
5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */,
7A34C5BBBA543DC0A50DE1B6 /* event.cpp */,
C9A305CEC03B3085B159B617 /* fs_mem.cpp */,
E968913A9A593B258BD8EACB /* msgout.cpp */,
@@ -3908,6 +3912,7 @@
B5C7FD8C27F43F3289A77FCA /* utilsunx.cpp in Sources */,
F9C5EAC42CCF3267B4100BAF /* wakeuppipe.cpp in Sources */,
FF7DB2884F6E3C5DB4BDF61E /* fswatcher_kqueue.cpp in Sources */,
830A61EA04FD367C9EB6A758 /* fswatcher_fsevents.cpp in Sources */,
55D893FDD00633FEA82ABD82 /* event.cpp in Sources */,
131B879180AE3FB481F81CC8 /* fs_mem.cpp in Sources */,
05814571E7A83F5DBFB6E4C5 /* msgout.cpp in Sources */,
@@ -4776,6 +4781,7 @@
B5C7FD8C27F43F3289A77FC9 /* utilsunx.cpp in Sources */,
F9C5EAC42CCF3267B4100BAE /* wakeuppipe.cpp in Sources */,
FF7DB2884F6E3C5DB4BDF61D /* fswatcher_kqueue.cpp in Sources */,
830A61EA04FD367C9EB6A757 /* fswatcher_fsevents.cpp in Sources */,
55D893FDD00633FEA82ABD81 /* event.cpp in Sources */,
131B879180AE3FB481F81CC7 /* fs_mem.cpp in Sources */,
05814571E7A83F5DBFB6E4C4 /* msgout.cpp in Sources */,
+18 -10
View File
@@ -798,6 +798,10 @@
3D762A0BBF1B39B88A769632 /* helpwnd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DBD5DB511C53218B3EF1625 /* helpwnd.cpp */; };
3D762A0BBF1B39B88A769633 /* helpwnd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DBD5DB511C53218B3EF1625 /* helpwnd.cpp */; };
3D762A0BBF1B39B88A769634 /* helpwnd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DBD5DB511C53218B3EF1625 /* helpwnd.cpp */; };
3DE2CD678CEB39C2B1E09ACA /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 60DFD5962DE3379F801AF78F /* power.mm */; };
3DE2CD678CEB39C2B1E09ACB /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 60DFD5962DE3379F801AF78F /* power.mm */; };
3DE2CD678CEB39C2B1E09ACC /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 60DFD5962DE3379F801AF78F /* power.mm */; };
3DE2CD678CEB39C2B1E09ACD /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 60DFD5962DE3379F801AF78F /* power.mm */; };
3E6AA08E72A030D39D867D4B /* ScintillaWX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8E6F9D4319F639BE89E5A82F /* ScintillaWX.cpp */; };
3E6AA08E72A030D39D867D4C /* ScintillaWX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8E6F9D4319F639BE89E5A82F /* ScintillaWX.cpp */; };
3E6AA08E72A030D39D867D4D /* ScintillaWX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8E6F9D4319F639BE89E5A82F /* ScintillaWX.cpp */; };
@@ -1483,6 +1487,9 @@
82FA4AA043213728AC266700 /* wizard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F08F70E1EF239999A4D2AC4 /* wizard.cpp */; };
82FA4AA043213728AC266701 /* wizard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F08F70E1EF239999A4D2AC4 /* wizard.cpp */; };
82FA4AA043213728AC266702 /* wizard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F08F70E1EF239999A4D2AC4 /* wizard.cpp */; };
830A61EA04FD367C9EB6A757 /* fswatcher_fsevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */; };
830A61EA04FD367C9EB6A758 /* fswatcher_fsevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */; };
830A61EA04FD367C9EB6A759 /* fswatcher_fsevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */; };
834F2ADD0520313FBAC4F927 /* LexCsound.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A59A5C2305D3D1C8049BE71 /* LexCsound.cxx */; };
834F2ADD0520313FBAC4F928 /* LexCsound.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A59A5C2305D3D1C8049BE71 /* LexCsound.cxx */; };
834F2ADD0520313FBAC4F929 /* LexCsound.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A59A5C2305D3D1C8049BE71 /* LexCsound.cxx */; };
@@ -1771,10 +1778,6 @@
A1A7B833061C35B4AABD093C /* preferencesg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8F06DEA1AA339ED819B3812 /* preferencesg.cpp */; };
A1A7B833061C35B4AABD093D /* preferencesg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8F06DEA1AA339ED819B3812 /* preferencesg.cpp */; };
A1A7B833061C35B4AABD093E /* preferencesg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8F06DEA1AA339ED819B3812 /* preferencesg.cpp */; };
A1A7C58E276F6F2B247F0813 /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0714536835B5227019E29D06 /* power.mm */; };
A1A7C58E276F6F2B247F0814 /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0714536835B5227019E29D06 /* power.mm */; };
A1A7C58E276F6F2B247F0815 /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0714536835B5227019E29D06 /* power.mm */; };
A1A7C58E276F6F2B247F0816 /* power.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0714536835B5227019E29D06 /* power.mm */; };
A1A7D793B034398B8696EF33 /* utils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 789F45D14FF23E248FCFB5FA /* utils.mm */; };
A1A7D793B034398B8696EF34 /* utils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 789F45D14FF23E248FCFB5FA /* utils.mm */; };
A1A7D793B034398B8696EF35 /* utils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 789F45D14FF23E248FCFB5FA /* utils.mm */; };
@@ -4114,6 +4117,7 @@
5AACC1EC2E2A33B3ABF5EDCA /* xh_radbt.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = xh_radbt.cpp; path = ../../src/xrc/xh_radbt.cpp; sourceTree = "<group>"; };
5AFB85719CBC3D60BA2EDC2E /* CharClassify.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CharClassify.cxx; path = ../../src/stc/scintilla/src/CharClassify.cxx; sourceTree = "<group>"; };
5B32A13D5B3336098B1B9765 /* pngtrans.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngtrans.c; path = ../../src/png/pngtrans.c; sourceTree = "<group>"; };
5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fswatcher_fsevents.cpp; path = ../../src/osx/fswatcher_fsevents.cpp; sourceTree = "<group>"; };
5B9586328A1F3C4BA0390AA5 /* time.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time.cpp; path = ../../src/common/time.cpp; sourceTree = "<group>"; };
5BD6231188AB329CAA5E1171 /* evtloop_cf.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = evtloop_cf.cpp; path = ../../src/osx/core/evtloop_cf.cpp; sourceTree = "<group>"; };
5BEC6B3CAFB532CBB9F95D74 /* jutils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jutils.c; path = ../../src/jpeg/jutils.c; sourceTree = "<group>"; };
@@ -4145,6 +4149,7 @@
600740717F7E320F8CA78384 /* scrolbar_osx.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = scrolbar_osx.cpp; path = ../../src/osx/scrolbar_osx.cpp; sourceTree = "<group>"; };
604D9B79D41F32339AEC0EA0 /* libwx_osx_cocoau_xrc.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libwx_osx_cocoau_xrc.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
607EF0043E723B7B9BE101EA /* wxprintf.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wxprintf.cpp; path = ../../src/common/wxprintf.cpp; sourceTree = "<group>"; };
60DFD5962DE3379F801AF78F /* power.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = power.mm; path = ../../src/osx/cocoa/power.mm; sourceTree = "<group>"; };
60EE4448A28D38F5ADE17B5A /* xh_filectrl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = xh_filectrl.cpp; path = ../../src/xrc/xh_filectrl.cpp; sourceTree = "<group>"; };
61548D0FE1353D7C846DD721 /* menuitem.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = menuitem.mm; path = ../../src/osx/cocoa/menuitem.mm; sourceTree = "<group>"; };
61658C3EABB4341AA38C691E /* m_pre.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = m_pre.cpp; path = ../../src/html/m_pre.cpp; sourceTree = "<group>"; };
@@ -4218,7 +4223,6 @@
777385D10CCC350C90F02824 /* textentry_osx.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = textentry_osx.cpp; path = ../../src/osx/textentry_osx.cpp; sourceTree = "<group>"; };
77D6E66F72443765A2FBE263 /* aboutdlgg.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = aboutdlgg.cpp; path = ../../src/generic/aboutdlgg.cpp; sourceTree = "<group>"; };
77F5E7BCD9B2307D8DBCC052 /* font.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = font.cpp; path = ../../src/osx/carbon/font.cpp; sourceTree = "<group>"; };
0714536835B5227019E29D06 /* power.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = power.mm; path = ../../src/osx/cocoa/power.mm; sourceTree = "<group>"; };
789F45D14FF23E248FCFB5FA /* utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = utils.mm; path = ../../src/osx/cocoa/utils.mm; sourceTree = "<group>"; };
78D7866F95C73A28BB540606 /* LexBash.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LexBash.cxx; path = ../../src/stc/scintilla/lexers/LexBash.cxx; sourceTree = "<group>"; };
7906BD74118A3B4DAC515BC2 /* odcombo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = odcombo.cpp; path = ../../src/generic/odcombo.cpp; sourceTree = "<group>"; };
@@ -5964,12 +5968,13 @@
DC75C7251C1732B0B07C7BD3 /* utilsunx.cpp */,
B38F3D4DC6D139BA93401F7A /* wakeuppipe.cpp */,
C019CE87CF9931B0B77C0823 /* fswatcher_kqueue.cpp */,
5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */,
7A34C5BBBA543DC0A50DE1B6 /* event.cpp */,
C9A305CEC03B3085B159B617 /* fs_mem.cpp */,
E968913A9A593B258BD8EACB /* msgout.cpp */,
4188821BBA833CCAA678B234 /* utilscmn.cpp */,
0714536835B5227019E29D06 /* power.mm */,
789F45D14FF23E248FCFB5FA /* utils.mm */,
60DFD5962DE3379F801AF78F /* power.mm */,
);
name = base;
sourceTree = "<group>";
@@ -7365,12 +7370,13 @@
B5C7FD8C27F43F3289A77FCB /* utilsunx.cpp in Sources */,
F9C5EAC42CCF3267B4100BB0 /* wakeuppipe.cpp in Sources */,
FF7DB2884F6E3C5DB4BDF61F /* fswatcher_kqueue.cpp in Sources */,
830A61EA04FD367C9EB6A759 /* fswatcher_fsevents.cpp in Sources */,
55D893FDD00633FEA82ABD83 /* event.cpp in Sources */,
131B879180AE3FB481F81CC9 /* fs_mem.cpp in Sources */,
05814571E7A83F5DBFB6E4C6 /* msgout.cpp in Sources */,
80665EEAE8613DF8A93A7986 /* utilscmn.cpp in Sources */,
A1A7C58E276F6F2B247F0815 /* power.mm in Sources */,
A1A7D793B034398B8696EF35 /* utils.mm in Sources */,
3DE2CD678CEB39C2B1E09ACC /* power.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -7402,8 +7408,8 @@
131B879180AE3FB481F81CCA /* fs_mem.cpp in Sources */,
05814571E7A83F5DBFB6E4C7 /* msgout.cpp in Sources */,
80665EEAE8613DF8A93A7987 /* utilscmn.cpp in Sources */,
A1A7C58E276F6F2B247F0816 /* power.mm in Sources */,
A1A7D793B034398B8696EF36 /* utils.mm in Sources */,
3DE2CD678CEB39C2B1E09ACD /* power.mm in Sources */,
F4C0CEADEDC23610BF6983D8 /* artmac.cpp in Sources */,
296692A7A3783E3A83D005C8 /* brush.cpp in Sources */,
86AED49CEAFC3637B1F10539 /* dialog_osx.cpp in Sources */,
@@ -8068,12 +8074,13 @@
B5C7FD8C27F43F3289A77FCA /* utilsunx.cpp in Sources */,
F9C5EAC42CCF3267B4100BAF /* wakeuppipe.cpp in Sources */,
FF7DB2884F6E3C5DB4BDF61E /* fswatcher_kqueue.cpp in Sources */,
830A61EA04FD367C9EB6A758 /* fswatcher_fsevents.cpp in Sources */,
55D893FDD00633FEA82ABD82 /* event.cpp in Sources */,
131B879180AE3FB481F81CC8 /* fs_mem.cpp in Sources */,
05814571E7A83F5DBFB6E4C5 /* msgout.cpp in Sources */,
80665EEAE8613DF8A93A7985 /* utilscmn.cpp in Sources */,
A1A7C58E276F6F2B247F0814 /* power.mm in Sources */,
A1A7D793B034398B8696EF34 /* utils.mm in Sources */,
3DE2CD678CEB39C2B1E09ACB /* power.mm in Sources */,
F4C0CEADEDC23610BF6983D7 /* artmac.cpp in Sources */,
296692A7A3783E3A83D005C7 /* brush.cpp in Sources */,
86AED49CEAFC3637B1F10538 /* dialog_osx.cpp in Sources */,
@@ -9258,12 +9265,13 @@
B5C7FD8C27F43F3289A77FC9 /* utilsunx.cpp in Sources */,
F9C5EAC42CCF3267B4100BAE /* wakeuppipe.cpp in Sources */,
FF7DB2884F6E3C5DB4BDF61D /* fswatcher_kqueue.cpp in Sources */,
830A61EA04FD367C9EB6A757 /* fswatcher_fsevents.cpp in Sources */,
55D893FDD00633FEA82ABD81 /* event.cpp in Sources */,
131B879180AE3FB481F81CC7 /* fs_mem.cpp in Sources */,
05814571E7A83F5DBFB6E4C4 /* msgout.cpp in Sources */,
80665EEAE8613DF8A93A7984 /* utilscmn.cpp in Sources */,
A1A7C58E276F6F2B247F0813 /* power.mm in Sources */,
A1A7D793B034398B8696EF33 /* utils.mm in Sources */,
3DE2CD678CEB39C2B1E09ACA /* power.mm in Sources */,
F4C0CEADEDC23610BF6983D6 /* artmac.cpp in Sources */,
296692A7A3783E3A83D005C6 /* brush.cpp in Sources */,
86AED49CEAFC3637B1F10537 /* dialog_osx.cpp in Sources */,
@@ -432,6 +432,7 @@
825EAD51920B387DB4F8C426 /* LexAsn1.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A46D50BEBF523B3F88831086 /* LexAsn1.cxx */; };
8292D346BFC33D6E8D3CDDBF /* xh_sttxt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B3F1680BBE8331A7B745638C /* xh_sttxt.cpp */; };
82FA4AA043213728AC266700 /* wizard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F08F70E1EF239999A4D2AC4 /* wizard.cpp */; };
830A61EA04FD367C9EB6A757 /* fswatcher_fsevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */; };
834F2ADD0520313FBAC4F927 /* LexCsound.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A59A5C2305D3D1C8049BE71 /* LexCsound.cxx */; };
83616D33080E3F0F9FA5FBB4 /* xh_html.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 889FFA9573A835F280A21CB4 /* xh_html.cpp */; };
83C492B87F4A3A97930F227A /* ExternalLexer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FD6D2664C05131C3A06E98B4 /* ExternalLexer.cxx */; };
@@ -1126,6 +1127,7 @@
5AACC1EC2E2A33B3ABF5EDCA /* xh_radbt.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = xh_radbt.cpp; path = ../../src/xrc/xh_radbt.cpp; sourceTree = "<group>"; };
5AFB85719CBC3D60BA2EDC2E /* CharClassify.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CharClassify.cxx; path = ../../src/stc/scintilla/src/CharClassify.cxx; sourceTree = "<group>"; };
5B32A13D5B3336098B1B9765 /* pngtrans.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pngtrans.c; path = ../../src/png/pngtrans.c; sourceTree = "<group>"; };
5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fswatcher_fsevents.cpp; path = ../../src/osx/fswatcher_fsevents.cpp; sourceTree = "<group>"; };
5B9586328A1F3C4BA0390AA5 /* time.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = time.cpp; path = ../../src/common/time.cpp; sourceTree = "<group>"; };
5BD6231188AB329CAA5E1171 /* evtloop_cf.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = evtloop_cf.cpp; path = ../../src/osx/core/evtloop_cf.cpp; sourceTree = "<group>"; };
5BEC6B3CAFB532CBB9F95D74 /* jutils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jutils.c; path = ../../src/jpeg/jutils.c; sourceTree = "<group>"; };
@@ -2619,6 +2621,7 @@
DC75C7251C1732B0B07C7BD3 /* utilsunx.cpp */,
B38F3D4DC6D139BA93401F7A /* wakeuppipe.cpp */,
C019CE87CF9931B0B77C0823 /* fswatcher_kqueue.cpp */,
5B83407D156C3CC3A66F05A4 /* fswatcher_fsevents.cpp */,
7A34C5BBBA543DC0A50DE1B6 /* event.cpp */,
C9A305CEC03B3085B159B617 /* fs_mem.cpp */,
E968913A9A593B258BD8EACB /* msgout.cpp */,
@@ -2930,6 +2933,7 @@
B5C7FD8C27F43F3289A77FC9 /* utilsunx.cpp in Sources */,
F9C5EAC42CCF3267B4100BAE /* wakeuppipe.cpp in Sources */,
FF7DB2884F6E3C5DB4BDF61D /* fswatcher_kqueue.cpp in Sources */,
830A61EA04FD367C9EB6A757 /* fswatcher_fsevents.cpp in Sources */,
55D893FDD00633FEA82ABD81 /* event.cpp in Sources */,
131B879180AE3FB481F81CC7 /* fs_mem.cpp in Sources */,
05814571E7A83F5DBFB6E4C4 /* msgout.cpp in Sources */,
+1
View File
@@ -161,6 +161,7 @@ wxMSW:
wxOSX/Cocoa:
- Use more efficient FSEvents (10.7+) in wxFileSystemWatcher (Roberto Perpuly).
- Implement wxWindow::Disable() for non-native controls too (Steve Browne).
- Fix wxEVT_CHAR for non-BMP Unicode characters (ARATA Mizuki).
- Add support for wxEVT_COMBOBOX_DROPDOWN and wxEVT_COMBOBOX_CLOSEUP
+5 -1
View File
@@ -52,7 +52,7 @@ enum
wxFSW_EVENT_RENAME | wxFSW_EVENT_MODIFY |
wxFSW_EVENT_ACCESS | wxFSW_EVENT_ATTRIB |
wxFSW_EVENT_WARNING | wxFSW_EVENT_ERROR
#ifdef wxHAS_INOTIFY
#if defined(wxHAS_INOTIFY) || defined(wxHAVE_FSEVENTS_FILE_NOTIFICATIONS)
,wxFSW_EVENT_UNMOUNT = 0x2000
#endif
};
@@ -395,6 +395,10 @@ protected:
#ifdef wxHAS_INOTIFY
#include "wx/unix/fswatcher_inotify.h"
#define wxFileSystemWatcher wxInotifyFileSystemWatcher
#elif defined(wxHAS_KQUEUE) && defined(wxHAVE_FSEVENTS_FILE_NOTIFICATIONS)
#include "wx/unix/fswatcher_kqueue.h"
#include "wx/osx/fswatcher_fsevents.h"
#define wxFileSystemWatcher wxFsEventsFileSystemWatcher
#elif defined(wxHAS_KQUEUE)
#include "wx/unix/fswatcher_kqueue.h"
#define wxFileSystemWatcher wxKqueueFileSystemWatcher
+10
View File
@@ -50,6 +50,16 @@
#define wxOSX_USE_QUICKTIME 0
#define wxOSX_USE_AUDIOTOOLBOX 1
/*
Use the more efficient FSEvents API instead of kqueue
events for file system watcher, but only on OS X >= 10.7 since
that version introduced a flag that allows watching files as
well as sub directories.
*/
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7
#define wxHAVE_FSEVENTS_FILE_NOTIFICATIONS 1
#endif
/*
* turning off capabilities that don't work under cocoa yet
*/
+88
View File
@@ -0,0 +1,88 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/osx/fswatcher_fsevents.h
// Purpose: File System watcher that uses the FSEvents API
// of OS X to efficiently watch trees
// Author: Roberto Perpuly
// Created: 2015-04-24
// Copyright: (c) 2015 Roberto Perpuly <robertop2004@gmail.com>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_FSWATCHER_FSEVENTS_H_
#define _WX_FSWATCHER_FSEVENTS_H_
#include "wx/defs.h"
#if wxUSE_FSWATCHER
#include <CoreServices/CoreServices.h>
#include "wx/unix/fswatcher_kqueue.h"
WX_DECLARE_STRING_HASH_MAP(FSEventStreamRef, FSEventStreamRefMap);
/*
The FSEvents watcher uses the newer FSEvents service
that is available in OS X, the service allows for
efficient watching of entire directory hierarchies.
Note that adding a single file watch (or directory
watch) still use kqueue events.
We take care to only use this on OS X >= 10.7, as that
version introduced the ability to get file-level notifications.
See the following docs that outline the FSEvents API
https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/FSEvents_ProgGuide/UsingtheFSEventsFramework/UsingtheFSEventsFramework.html
https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/index.html
*/
class WXDLLIMPEXP_BASE wxFsEventsFileSystemWatcher :
public wxKqueueFileSystemWatcher
{
public:
wxFsEventsFileSystemWatcher();
wxFsEventsFileSystemWatcher(const wxFileName& path,
int events = wxFSW_EVENT_ALL);
~wxFsEventsFileSystemWatcher();
// reimplement adding a tree so that it does not use
// kqueue at all
bool AddTree(const wxFileName& path, int events = wxFSW_EVENT_ALL,
const wxString& filespec = wxEmptyString) wxOVERRIDE;
// reimplement removing a tree so that we
// cleanup the opened fs streams
bool RemoveTree(const wxFileName& path) wxOVERRIDE;
// reimplement remove all so that we cleanup
// watches from kqeueue and from FSEvents
bool RemoveAll() wxOVERRIDE;
// post an file change event to the owner
void PostChange(const wxFileName& oldFileName,
const wxFileName& newFileName, int event);
// post a warning event to the owner
void PostWarning(wxFSWWarningType warning, const wxString& msg);
// post an error event to the owner
void PostError(const wxString& msg);
// reimplement count to include the FS stream watches
int GetWatchedPathsCount() const;
// reimplement to include paths from FS stream watches
int GetWatchedPaths(wxArrayString* paths) const;
private:
// map of path => FSEventStreamRef
FSEventStreamRefMap m_streams;
};
#endif /* wxUSE_FSWATCHER */
#endif /* _WX_FSWATCHER_FSEVENTS_H_ */
+13 -9
View File
@@ -78,10 +78,11 @@ public:
Additionally a file mask can be specified to include only files
matching that particular mask.
This method is implemented efficiently on MSW, but should be used with
care on other platforms for directories with lots of children (e.g. the
root directory) as it calls Add() for each subdirectory, potentially
creating a lot of watches and taking a long time to execute.
This method is implemented efficiently on MSW and OS X >= 10.7, but
should be used with care on other platforms for directories with lots
of children (e.g. the root directory) as it calls Add() for each
subdirectory, potentially creating a lot of watches and taking a long
time to execute.
Note that on platforms that use symbolic links, you will probably want
to have called wxFileName::DontFollowLink on @a path. This is especially
@@ -242,8 +243,9 @@ enum wxFSWFlags
Notice that under MSW this event is sometimes -- although not always --
followed by a ::wxFSW_EVENT_MODIFY for the new file.
Under OS X this event is currently not detected and instead separate
::wxFSW_EVENT_CREATE and ::wxFSW_EVENT_DELETE events are.
Under OS X this event is only detected when watching entire trees. When
watching directories, separate ::wxFSW_EVENT_CREATE and
::wxFSW_EVENT_DELETE events are detected instead.
*/
wxFSW_EVENT_RENAME = 0x04,
@@ -253,7 +255,7 @@ enum wxFSWFlags
Depending on the program doing the file modification, multiple such
events can be reported for a single logical file update.
Under OS X this event is currently not detected.
Under OS X this event is only detected when watching entire trees.
*/
wxFSW_EVENT_MODIFY = 0x08,
@@ -267,7 +269,8 @@ enum wxFSWFlags
/**
The item's metadata was changed, e.g.\ its permissions or timestamps.
This event is currently only detected under Linux.
This event is currently only detected under Linux and OS X.
Under OS X this event is only detected when watching entire trees.
@since 2.9.5
*/
@@ -279,7 +282,8 @@ enum wxFSWFlags
wxFSW_EVENT_UNMOUNT cannot be set; unmount events are produced automatically. This flag
is therefore not included in wxFSW_EVENT_ALL.
This event is currently only detected under Linux.
This event is currently only detected under Linux and OS X.
Under OS X this event is only detected when watching entire trees.
@since 2.9.5
*/
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -279,8 +279,8 @@ protected:
{
wxASSERT_MSG(e.udata, "Null user data associated with kevent!");
wxLogTrace(wxTRACE_FSWATCHER, "Event: ident=%d, filter=%d, flags=%u, "
"fflags=%u, data=%d, user_data=%p",
wxLogTrace(wxTRACE_FSWATCHER, "Event: ident=%llu, filter=%d, flags=%u, "
"fflags=%u, data=%lld, user_data=%lp",
e.ident, e.filter, e.flags, e.fflags, e.data, e.udata);
// for ease of use
+10 -5
View File
@@ -831,12 +831,12 @@ void FileSystemWatcherTestCase::TestTrees()
CPPUNIT_ASSERT(m_watcher);
size_t treeitems = 1; // the trunk
#ifndef __WINDOWS__
// When there's no file mask, wxMSW sets a single watch
#if !defined(__WINDOWS__) && !defined(wxHAVE_FSEVENTS_FILE_NOTIFICATIONS)
// When there's no file mask, wxMSW and wxOSX set a single watch
// on the trunk which is implemented recursively.
// wxGTK always sets an additional watch for each subdir
treeitems += subdirs + 1; // +1 for 'child'
#endif // __WINDOWS__
#endif // !__WINDOWS__ && !wxHAVE_FSEVENTS_FILE_NOTIFICATIONS
// Store the initial count; there may already be some watches
const int initial = m_watcher->GetWatchedPathsCount();
@@ -862,9 +862,9 @@ void FileSystemWatcherTestCase::TestTrees()
// Except that in wxMSW this isn't true: each watch will be a
// single, recursive dir; so fudge the count
size_t fudge = 0;
#ifdef __WINDOWS__
#if defined(__WINDOWS__) || defined(wxHAVE_FSEVENTS_FILE_NOTIFICATIONS)
fudge = 1;
#endif // __WINDOWS__
#endif // __WINDOWS__ || wxHAVE_FSEVENTS_FILE_NOTIFICATIONS
m_watcher->AddTree(dir);
CPPUNIT_ASSERT_EQUAL(plustree + fudge, m_watcher->GetWatchedPathsCount());
m_watcher->RemoveTree(child);
@@ -900,7 +900,12 @@ void FileSystemWatcherTestCase::TestTrees()
// When we use a filter, both wxMSW and wxGTK implementations set
// an additional watch for each subdir (+1 for the root dir itself
// and another +1 for "child").
// On OS X, if we use FSEvents then we still only have 1 watch.
#ifdef wxHAVE_FSEVENTS_FILE_NOTIFICATIONS
const size_t treeitems = 1;
#else
const size_t treeitems = subdirs + 2;
#endif
m_watcher->AddTree(dir, wxFSW_EVENT_ALL, "*.txt");
const int plustree = m_watcher->GetWatchedPathsCount();