| @@ -119,7 +119,6 @@ OBJECTS := \ | |||||
| $(OBJDIR)/juce_Primes_32e6603.o \ | $(OBJDIR)/juce_Primes_32e6603.o \ | ||||
| $(OBJDIR)/juce_RSAKey_b60982ae.o \ | $(OBJDIR)/juce_RSAKey_b60982ae.o \ | ||||
| $(OBJDIR)/juce_ActionBroadcaster_7f997786.o \ | $(OBJDIR)/juce_ActionBroadcaster_7f997786.o \ | ||||
| $(OBJDIR)/juce_ActionListenerList_9e099ae4.o \ | |||||
| $(OBJDIR)/juce_AsyncUpdater_a7e1cb89.o \ | $(OBJDIR)/juce_AsyncUpdater_a7e1cb89.o \ | ||||
| $(OBJDIR)/juce_ChangeBroadcaster_3eb8fecc.o \ | $(OBJDIR)/juce_ChangeBroadcaster_3eb8fecc.o \ | ||||
| $(OBJDIR)/juce_InterprocessConnection_13086b6d.o \ | $(OBJDIR)/juce_InterprocessConnection_13086b6d.o \ | ||||
| @@ -763,11 +762,6 @@ $(OBJDIR)/juce_ActionBroadcaster_7f997786.o: ../../src/events/juce_ActionBroadca | |||||
| @echo "Compiling juce_ActionBroadcaster.cpp" | @echo "Compiling juce_ActionBroadcaster.cpp" | ||||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | ||||
| $(OBJDIR)/juce_ActionListenerList_9e099ae4.o: ../../src/events/juce_ActionListenerList.cpp | |||||
| -@mkdir -p $(OBJDIR) | |||||
| @echo "Compiling juce_ActionListenerList.cpp" | |||||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||||
| $(OBJDIR)/juce_AsyncUpdater_a7e1cb89.o: ../../src/events/juce_AsyncUpdater.cpp | $(OBJDIR)/juce_AsyncUpdater_a7e1cb89.o: ../../src/events/juce_AsyncUpdater.cpp | ||||
| -@mkdir -p $(OBJDIR) | -@mkdir -p $(OBJDIR) | ||||
| @echo "Compiling juce_AsyncUpdater.cpp" | @echo "Compiling juce_AsyncUpdater.cpp" | ||||
| @@ -88,7 +88,6 @@ | |||||
| 12E3CC31875A202D6B30F778 = { isa = PBXBuildFile; fileRef = E9E692847C14AD33CD5FB40B; }; | 12E3CC31875A202D6B30F778 = { isa = PBXBuildFile; fileRef = E9E692847C14AD33CD5FB40B; }; | ||||
| CF51988743ED2CD823DFE0B5 = { isa = PBXBuildFile; fileRef = 7AE9331938549244E27A5D0E; }; | CF51988743ED2CD823DFE0B5 = { isa = PBXBuildFile; fileRef = 7AE9331938549244E27A5D0E; }; | ||||
| 659D9CD58B6914EB420E6AEC = { isa = PBXBuildFile; fileRef = 31D985CB8646B78460E9D5A7; }; | 659D9CD58B6914EB420E6AEC = { isa = PBXBuildFile; fileRef = 31D985CB8646B78460E9D5A7; }; | ||||
| 5BE4BAA99FDC6F1B3177096F = { isa = PBXBuildFile; fileRef = 5A46476E16BA4F9DA95E9E6A; }; | |||||
| 55737E2F1817DE642AA7DA05 = { isa = PBXBuildFile; fileRef = 1617348BBF5D103619D76911; }; | 55737E2F1817DE642AA7DA05 = { isa = PBXBuildFile; fileRef = 1617348BBF5D103619D76911; }; | ||||
| 6D2C50B0A69855A7F8C062E7 = { isa = PBXBuildFile; fileRef = B80F8CD026033ACCCE11A1A4; }; | 6D2C50B0A69855A7F8C062E7 = { isa = PBXBuildFile; fileRef = B80F8CD026033ACCCE11A1A4; }; | ||||
| 70EE7A1273945B62B013DB43 = { isa = PBXBuildFile; fileRef = AE68ECB6E063BD8D4984C0B3; }; | 70EE7A1273945B62B013DB43 = { isa = PBXBuildFile; fileRef = AE68ECB6E063BD8D4984C0B3; }; | ||||
| @@ -554,8 +553,6 @@ | |||||
| 31D985CB8646B78460E9D5A7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionBroadcaster.cpp; path = ../../src/events/juce_ActionBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; | 31D985CB8646B78460E9D5A7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionBroadcaster.cpp; path = ../../src/events/juce_ActionBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 09F7685D1EFF472ECB1F5EF1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionBroadcaster.h; path = ../../src/events/juce_ActionBroadcaster.h; sourceTree = SOURCE_ROOT; }; | 09F7685D1EFF472ECB1F5EF1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionBroadcaster.h; path = ../../src/events/juce_ActionBroadcaster.h; sourceTree = SOURCE_ROOT; }; | ||||
| 4EF8BD4BF46C4BCB39F96609 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListener.h; path = ../../src/events/juce_ActionListener.h; sourceTree = SOURCE_ROOT; }; | 4EF8BD4BF46C4BCB39F96609 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListener.h; path = ../../src/events/juce_ActionListener.h; sourceTree = SOURCE_ROOT; }; | ||||
| 5A46476E16BA4F9DA95E9E6A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionListenerList.cpp; path = ../../src/events/juce_ActionListenerList.cpp; sourceTree = SOURCE_ROOT; }; | |||||
| 8269D9DFAD7923EE13E7EEC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListenerList.h; path = ../../src/events/juce_ActionListenerList.h; sourceTree = SOURCE_ROOT; }; | |||||
| 1617348BBF5D103619D76911 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AsyncUpdater.cpp; path = ../../src/events/juce_AsyncUpdater.cpp; sourceTree = SOURCE_ROOT; }; | 1617348BBF5D103619D76911 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AsyncUpdater.cpp; path = ../../src/events/juce_AsyncUpdater.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 44DB44953945417F76199479 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AsyncUpdater.h; path = ../../src/events/juce_AsyncUpdater.h; sourceTree = SOURCE_ROOT; }; | 44DB44953945417F76199479 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AsyncUpdater.h; path = ../../src/events/juce_AsyncUpdater.h; sourceTree = SOURCE_ROOT; }; | ||||
| D04B6E43A037F985434B2F5A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallbackMessage.h; path = ../../src/events/juce_CallbackMessage.h; sourceTree = SOURCE_ROOT; }; | D04B6E43A037F985434B2F5A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallbackMessage.h; path = ../../src/events/juce_CallbackMessage.h; sourceTree = SOURCE_ROOT; }; | ||||
| @@ -1282,8 +1279,6 @@ | |||||
| 31D985CB8646B78460E9D5A7, | 31D985CB8646B78460E9D5A7, | ||||
| 09F7685D1EFF472ECB1F5EF1, | 09F7685D1EFF472ECB1F5EF1, | ||||
| 4EF8BD4BF46C4BCB39F96609, | 4EF8BD4BF46C4BCB39F96609, | ||||
| 5A46476E16BA4F9DA95E9E6A, | |||||
| 8269D9DFAD7923EE13E7EEC7, | |||||
| 1617348BBF5D103619D76911, | 1617348BBF5D103619D76911, | ||||
| 44DB44953945417F76199479, | 44DB44953945417F76199479, | ||||
| D04B6E43A037F985434B2F5A, | D04B6E43A037F985434B2F5A, | ||||
| @@ -2008,7 +2003,6 @@ | |||||
| 12E3CC31875A202D6B30F778, | 12E3CC31875A202D6B30F778, | ||||
| CF51988743ED2CD823DFE0B5, | CF51988743ED2CD823DFE0B5, | ||||
| 659D9CD58B6914EB420E6AEC, | 659D9CD58B6914EB420E6AEC, | ||||
| 5BE4BAA99FDC6F1B3177096F, | |||||
| 55737E2F1817DE642AA7DA05, | 55737E2F1817DE642AA7DA05, | ||||
| 6D2C50B0A69855A7F8C062E7, | 6D2C50B0A69855A7F8C062E7, | ||||
| 70EE7A1273945B62B013DB43, | 70EE7A1273945B62B013DB43, | ||||
| @@ -422,8 +422,6 @@ | |||||
| <File RelativePath="..\..\src\events\juce_ActionBroadcaster.cpp"/> | <File RelativePath="..\..\src\events\juce_ActionBroadcaster.cpp"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionBroadcaster.h"/> | <File RelativePath="..\..\src\events\juce_ActionBroadcaster.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionListener.h"/> | <File RelativePath="..\..\src\events\juce_ActionListener.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionListenerList.cpp"/> | |||||
| <File RelativePath="..\..\src\events\juce_ActionListenerList.h"/> | |||||
| <File RelativePath="..\..\src\events\juce_AsyncUpdater.cpp"/> | <File RelativePath="..\..\src\events\juce_AsyncUpdater.cpp"/> | ||||
| <File RelativePath="..\..\src\events\juce_AsyncUpdater.h"/> | <File RelativePath="..\..\src\events\juce_AsyncUpdater.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_CallbackMessage.h"/> | <File RelativePath="..\..\src\events\juce_CallbackMessage.h"/> | ||||
| @@ -422,8 +422,6 @@ | |||||
| <File RelativePath="..\..\src\events\juce_ActionBroadcaster.cpp"/> | <File RelativePath="..\..\src\events\juce_ActionBroadcaster.cpp"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionBroadcaster.h"/> | <File RelativePath="..\..\src\events\juce_ActionBroadcaster.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionListener.h"/> | <File RelativePath="..\..\src\events\juce_ActionListener.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionListenerList.cpp"/> | |||||
| <File RelativePath="..\..\src\events\juce_ActionListenerList.h"/> | |||||
| <File RelativePath="..\..\src\events\juce_AsyncUpdater.cpp"/> | <File RelativePath="..\..\src\events\juce_AsyncUpdater.cpp"/> | ||||
| <File RelativePath="..\..\src\events\juce_AsyncUpdater.h"/> | <File RelativePath="..\..\src\events\juce_AsyncUpdater.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_CallbackMessage.h"/> | <File RelativePath="..\..\src\events\juce_CallbackMessage.h"/> | ||||
| @@ -424,8 +424,6 @@ | |||||
| <File RelativePath="..\..\src\events\juce_ActionBroadcaster.cpp"/> | <File RelativePath="..\..\src\events\juce_ActionBroadcaster.cpp"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionBroadcaster.h"/> | <File RelativePath="..\..\src\events\juce_ActionBroadcaster.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionListener.h"/> | <File RelativePath="..\..\src\events\juce_ActionListener.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_ActionListenerList.cpp"/> | |||||
| <File RelativePath="..\..\src\events\juce_ActionListenerList.h"/> | |||||
| <File RelativePath="..\..\src\events\juce_AsyncUpdater.cpp"/> | <File RelativePath="..\..\src\events\juce_AsyncUpdater.cpp"/> | ||||
| <File RelativePath="..\..\src\events\juce_AsyncUpdater.h"/> | <File RelativePath="..\..\src\events\juce_AsyncUpdater.h"/> | ||||
| <File RelativePath="..\..\src\events\juce_CallbackMessage.h"/> | <File RelativePath="..\..\src\events\juce_CallbackMessage.h"/> | ||||
| @@ -202,7 +202,6 @@ | |||||
| <ClCompile Include="..\..\src\cryptography\juce_Primes.cpp"/> | <ClCompile Include="..\..\src\cryptography\juce_Primes.cpp"/> | ||||
| <ClCompile Include="..\..\src\cryptography\juce_RSAKey.cpp"/> | <ClCompile Include="..\..\src\cryptography\juce_RSAKey.cpp"/> | ||||
| <ClCompile Include="..\..\src\events\juce_ActionBroadcaster.cpp"/> | <ClCompile Include="..\..\src\events\juce_ActionBroadcaster.cpp"/> | ||||
| <ClCompile Include="..\..\src\events\juce_ActionListenerList.cpp"/> | |||||
| <ClCompile Include="..\..\src\events\juce_AsyncUpdater.cpp"/> | <ClCompile Include="..\..\src\events\juce_AsyncUpdater.cpp"/> | ||||
| <ClCompile Include="..\..\src\events\juce_ChangeBroadcaster.cpp"/> | <ClCompile Include="..\..\src\events\juce_ChangeBroadcaster.cpp"/> | ||||
| <ClCompile Include="..\..\src\events\juce_InterprocessConnection.cpp"/> | <ClCompile Include="..\..\src\events\juce_InterprocessConnection.cpp"/> | ||||
| @@ -550,7 +549,6 @@ | |||||
| <ClInclude Include="..\..\src\cryptography\juce_RSAKey.h"/> | <ClInclude Include="..\..\src\cryptography\juce_RSAKey.h"/> | ||||
| <ClInclude Include="..\..\src\events\juce_ActionBroadcaster.h"/> | <ClInclude Include="..\..\src\events\juce_ActionBroadcaster.h"/> | ||||
| <ClInclude Include="..\..\src\events\juce_ActionListener.h"/> | <ClInclude Include="..\..\src\events\juce_ActionListener.h"/> | ||||
| <ClInclude Include="..\..\src\events\juce_ActionListenerList.h"/> | |||||
| <ClInclude Include="..\..\src\events\juce_AsyncUpdater.h"/> | <ClInclude Include="..\..\src\events\juce_AsyncUpdater.h"/> | ||||
| <ClInclude Include="..\..\src\events\juce_CallbackMessage.h"/> | <ClInclude Include="..\..\src\events\juce_CallbackMessage.h"/> | ||||
| <ClInclude Include="..\..\src\events\juce_ChangeBroadcaster.h"/> | <ClInclude Include="..\..\src\events\juce_ChangeBroadcaster.h"/> | ||||
| @@ -454,9 +454,6 @@ | |||||
| <ClCompile Include="..\..\src\events\juce_ActionBroadcaster.cpp"> | <ClCompile Include="..\..\src\events\juce_ActionBroadcaster.cpp"> | ||||
| <Filter>Juce\Source\events</Filter> | <Filter>Juce\Source\events</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| <ClCompile Include="..\..\src\events\juce_ActionListenerList.cpp"> | |||||
| <Filter>Juce\Source\events</Filter> | |||||
| </ClCompile> | |||||
| <ClCompile Include="..\..\src\events\juce_AsyncUpdater.cpp"> | <ClCompile Include="..\..\src\events\juce_AsyncUpdater.cpp"> | ||||
| <Filter>Juce\Source\events</Filter> | <Filter>Juce\Source\events</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| @@ -1572,9 +1569,6 @@ | |||||
| <ClInclude Include="..\..\src\events\juce_ActionListener.h"> | <ClInclude Include="..\..\src\events\juce_ActionListener.h"> | ||||
| <Filter>Juce\Source\events</Filter> | <Filter>Juce\Source\events</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="..\..\src\events\juce_ActionListenerList.h"> | |||||
| <Filter>Juce\Source\events</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="..\..\src\events\juce_AsyncUpdater.h"> | <ClInclude Include="..\..\src\events\juce_AsyncUpdater.h"> | ||||
| <Filter>Juce\Source\events</Filter> | <Filter>Juce\Source\events</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| @@ -88,7 +88,6 @@ | |||||
| 12E3CC31875A202D6B30F778 = { isa = PBXBuildFile; fileRef = E9E692847C14AD33CD5FB40B; }; | 12E3CC31875A202D6B30F778 = { isa = PBXBuildFile; fileRef = E9E692847C14AD33CD5FB40B; }; | ||||
| CF51988743ED2CD823DFE0B5 = { isa = PBXBuildFile; fileRef = 7AE9331938549244E27A5D0E; }; | CF51988743ED2CD823DFE0B5 = { isa = PBXBuildFile; fileRef = 7AE9331938549244E27A5D0E; }; | ||||
| 659D9CD58B6914EB420E6AEC = { isa = PBXBuildFile; fileRef = 31D985CB8646B78460E9D5A7; }; | 659D9CD58B6914EB420E6AEC = { isa = PBXBuildFile; fileRef = 31D985CB8646B78460E9D5A7; }; | ||||
| 5BE4BAA99FDC6F1B3177096F = { isa = PBXBuildFile; fileRef = 5A46476E16BA4F9DA95E9E6A; }; | |||||
| 55737E2F1817DE642AA7DA05 = { isa = PBXBuildFile; fileRef = 1617348BBF5D103619D76911; }; | 55737E2F1817DE642AA7DA05 = { isa = PBXBuildFile; fileRef = 1617348BBF5D103619D76911; }; | ||||
| 6D2C50B0A69855A7F8C062E7 = { isa = PBXBuildFile; fileRef = B80F8CD026033ACCCE11A1A4; }; | 6D2C50B0A69855A7F8C062E7 = { isa = PBXBuildFile; fileRef = B80F8CD026033ACCCE11A1A4; }; | ||||
| 70EE7A1273945B62B013DB43 = { isa = PBXBuildFile; fileRef = AE68ECB6E063BD8D4984C0B3; }; | 70EE7A1273945B62B013DB43 = { isa = PBXBuildFile; fileRef = AE68ECB6E063BD8D4984C0B3; }; | ||||
| @@ -554,8 +553,6 @@ | |||||
| 31D985CB8646B78460E9D5A7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionBroadcaster.cpp; path = ../../src/events/juce_ActionBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; | 31D985CB8646B78460E9D5A7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionBroadcaster.cpp; path = ../../src/events/juce_ActionBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 09F7685D1EFF472ECB1F5EF1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionBroadcaster.h; path = ../../src/events/juce_ActionBroadcaster.h; sourceTree = SOURCE_ROOT; }; | 09F7685D1EFF472ECB1F5EF1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionBroadcaster.h; path = ../../src/events/juce_ActionBroadcaster.h; sourceTree = SOURCE_ROOT; }; | ||||
| 4EF8BD4BF46C4BCB39F96609 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListener.h; path = ../../src/events/juce_ActionListener.h; sourceTree = SOURCE_ROOT; }; | 4EF8BD4BF46C4BCB39F96609 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListener.h; path = ../../src/events/juce_ActionListener.h; sourceTree = SOURCE_ROOT; }; | ||||
| 5A46476E16BA4F9DA95E9E6A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionListenerList.cpp; path = ../../src/events/juce_ActionListenerList.cpp; sourceTree = SOURCE_ROOT; }; | |||||
| 8269D9DFAD7923EE13E7EEC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListenerList.h; path = ../../src/events/juce_ActionListenerList.h; sourceTree = SOURCE_ROOT; }; | |||||
| 1617348BBF5D103619D76911 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AsyncUpdater.cpp; path = ../../src/events/juce_AsyncUpdater.cpp; sourceTree = SOURCE_ROOT; }; | 1617348BBF5D103619D76911 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AsyncUpdater.cpp; path = ../../src/events/juce_AsyncUpdater.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 44DB44953945417F76199479 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AsyncUpdater.h; path = ../../src/events/juce_AsyncUpdater.h; sourceTree = SOURCE_ROOT; }; | 44DB44953945417F76199479 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AsyncUpdater.h; path = ../../src/events/juce_AsyncUpdater.h; sourceTree = SOURCE_ROOT; }; | ||||
| D04B6E43A037F985434B2F5A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallbackMessage.h; path = ../../src/events/juce_CallbackMessage.h; sourceTree = SOURCE_ROOT; }; | D04B6E43A037F985434B2F5A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallbackMessage.h; path = ../../src/events/juce_CallbackMessage.h; sourceTree = SOURCE_ROOT; }; | ||||
| @@ -1282,8 +1279,6 @@ | |||||
| 31D985CB8646B78460E9D5A7, | 31D985CB8646B78460E9D5A7, | ||||
| 09F7685D1EFF472ECB1F5EF1, | 09F7685D1EFF472ECB1F5EF1, | ||||
| 4EF8BD4BF46C4BCB39F96609, | 4EF8BD4BF46C4BCB39F96609, | ||||
| 5A46476E16BA4F9DA95E9E6A, | |||||
| 8269D9DFAD7923EE13E7EEC7, | |||||
| 1617348BBF5D103619D76911, | 1617348BBF5D103619D76911, | ||||
| 44DB44953945417F76199479, | 44DB44953945417F76199479, | ||||
| D04B6E43A037F985434B2F5A, | D04B6E43A037F985434B2F5A, | ||||
| @@ -2008,7 +2003,6 @@ | |||||
| 12E3CC31875A202D6B30F778, | 12E3CC31875A202D6B30F778, | ||||
| CF51988743ED2CD823DFE0B5, | CF51988743ED2CD823DFE0B5, | ||||
| 659D9CD58B6914EB420E6AEC, | 659D9CD58B6914EB420E6AEC, | ||||
| 5BE4BAA99FDC6F1B3177096F, | |||||
| 55737E2F1817DE642AA7DA05, | 55737E2F1817DE642AA7DA05, | ||||
| 6D2C50B0A69855A7F8C062E7, | 6D2C50B0A69855A7F8C062E7, | ||||
| 70EE7A1273945B62B013DB43, | 70EE7A1273945B62B013DB43, | ||||
| @@ -491,10 +491,6 @@ | |||||
| file="src/events/juce_ActionBroadcaster.h"/> | file="src/events/juce_ActionBroadcaster.h"/> | ||||
| <FILE id="Ux4rL61r9" name="juce_ActionListener.h" compile="0" resource="0" | <FILE id="Ux4rL61r9" name="juce_ActionListener.h" compile="0" resource="0" | ||||
| file="src/events/juce_ActionListener.h"/> | file="src/events/juce_ActionListener.h"/> | ||||
| <FILE id="F703c1Yid" name="juce_ActionListenerList.cpp" compile="1" | |||||
| resource="0" file="src/events/juce_ActionListenerList.cpp"/> | |||||
| <FILE id="OTsKfiFYq" name="juce_ActionListenerList.h" compile="0" resource="0" | |||||
| file="src/events/juce_ActionListenerList.h"/> | |||||
| <FILE id="LgjeCwe5N" name="juce_AsyncUpdater.cpp" compile="1" resource="0" | <FILE id="LgjeCwe5N" name="juce_AsyncUpdater.cpp" compile="1" resource="0" | ||||
| file="src/events/juce_AsyncUpdater.cpp"/> | file="src/events/juce_AsyncUpdater.cpp"/> | ||||
| <FILE id="TABmiJS44" name="juce_AsyncUpdater.h" compile="0" resource="0" | <FILE id="TABmiJS44" name="juce_AsyncUpdater.h" compile="0" resource="0" | ||||
| @@ -214,7 +214,6 @@ | |||||
| #include "../src/audio/synthesisers/juce_Sampler.cpp" | #include "../src/audio/synthesisers/juce_Sampler.cpp" | ||||
| #include "../src/audio/synthesisers/juce_Synthesiser.cpp" | #include "../src/audio/synthesisers/juce_Synthesiser.cpp" | ||||
| #include "../src/events/juce_ActionBroadcaster.cpp" | #include "../src/events/juce_ActionBroadcaster.cpp" | ||||
| #include "../src/events/juce_ActionListenerList.cpp" | |||||
| #include "../src/events/juce_AsyncUpdater.cpp" | #include "../src/events/juce_AsyncUpdater.cpp" | ||||
| #include "../src/events/juce_ChangeBroadcaster.cpp" | #include "../src/events/juce_ChangeBroadcaster.cpp" | ||||
| #include "../src/events/juce_InterprocessConnection.cpp" | #include "../src/events/juce_InterprocessConnection.cpp" | ||||
| @@ -12159,7 +12159,7 @@ namespace NumberToStringConverters | |||||
| else | else | ||||
| { | { | ||||
| #if JUCE_WINDOWS | #if JUCE_WINDOWS | ||||
| #if JUCE_VC8_OR_EARLIER || JUCE_MINGW | |||||
| #if JUCE_VC7_OR_EARLIER || JUCE_MINGW | |||||
| len = _snwprintf (buffer, numChars, L"%.9g", n); | len = _snwprintf (buffer, numChars, L"%.9g", n); | ||||
| #else | #else | ||||
| len = _snwprintf_s (buffer, numChars, _TRUNCATE, L"%.9g", n); | len = _snwprintf_s (buffer, numChars, _TRUNCATE, L"%.9g", n); | ||||
| @@ -38287,162 +38287,143 @@ END_JUCE_NAMESPACE | |||||
| /*** Start of inlined file: juce_ActionBroadcaster.cpp ***/ | /*** Start of inlined file: juce_ActionBroadcaster.cpp ***/ | ||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| ActionBroadcaster::ActionBroadcaster() throw() | |||||
| { | |||||
| // are you trying to create this object before or after juce has been intialised?? | |||||
| jassert (MessageManager::instance != 0); | |||||
| } | |||||
| ActionBroadcaster::~ActionBroadcaster() | |||||
| { | |||||
| // all event-based objects must be deleted BEFORE juce is shut down! | |||||
| jassert (MessageManager::instance != 0); | |||||
| } | |||||
| void ActionBroadcaster::addActionListener (ActionListener* const listener) | |||||
| { | |||||
| actionListenerList.addActionListener (listener); | |||||
| } | |||||
| void ActionBroadcaster::removeActionListener (ActionListener* const listener) | |||||
| { | |||||
| jassert (actionListenerList.isValidMessageListener()); | |||||
| if (actionListenerList.isValidMessageListener()) | |||||
| actionListenerList.removeActionListener (listener); | |||||
| } | |||||
| void ActionBroadcaster::removeAllActionListeners() | |||||
| { | |||||
| actionListenerList.removeAllActionListeners(); | |||||
| } | |||||
| void ActionBroadcaster::sendActionMessage (const String& message) const | |||||
| { | |||||
| actionListenerList.sendActionMessage (message); | |||||
| } | |||||
| END_JUCE_NAMESPACE | |||||
| /*** End of inlined file: juce_ActionBroadcaster.cpp ***/ | |||||
| /*** Start of inlined file: juce_ActionListenerList.cpp ***/ | |||||
| BEGIN_JUCE_NAMESPACE | |||||
| // special message of our own with a string in it | // special message of our own with a string in it | ||||
| class ActionMessage : public Message | class ActionMessage : public Message | ||||
| { | { | ||||
| public: | public: | ||||
| const String message; | const String message; | ||||
| ActionMessage (const String& messageText, void* const listener_) throw() | |||||
| ActionMessage (const String& messageText, ActionListener* const listener_) throw() | |||||
| : message (messageText) | : message (messageText) | ||||
| { | { | ||||
| pointerParameter = listener_; | pointerParameter = listener_; | ||||
| } | } | ||||
| ~ActionMessage() throw() | |||||
| { | |||||
| } | |||||
| private: | private: | ||||
| ActionMessage (const ActionMessage&); | ActionMessage (const ActionMessage&); | ||||
| ActionMessage& operator= (const ActionMessage&); | ActionMessage& operator= (const ActionMessage&); | ||||
| }; | }; | ||||
| ActionListenerList::ActionListenerList() | |||||
| { | |||||
| } | |||||
| ActionBroadcaster::CallbackReceiver::CallbackReceiver() {} | |||||
| ActionListenerList::~ActionListenerList() | |||||
| void ActionBroadcaster::CallbackReceiver::handleMessage (const Message& message) | |||||
| { | { | ||||
| const ActionMessage& am = static_cast <const ActionMessage&> (message); | |||||
| ActionListener* const target = static_cast <ActionListener*> (am.pointerParameter); | |||||
| if (owner->actionListeners.contains (target)) | |||||
| target->actionListenerCallback (am.message); | |||||
| } | } | ||||
| void ActionListenerList::addActionListener (ActionListener* const listener) | |||||
| ActionBroadcaster::ActionBroadcaster() | |||||
| { | { | ||||
| const ScopedLock sl (actionListenerLock_); | |||||
| jassert (listener != 0); | |||||
| jassert (! actionListeners_.contains (listener)); // trying to add a listener to the list twice! | |||||
| // are you trying to create this object before or after juce has been intialised?? | |||||
| jassert (MessageManager::instance != 0); | |||||
| if (listener != 0) | |||||
| actionListeners_.add (listener); | |||||
| callback.owner = this; | |||||
| } | } | ||||
| void ActionListenerList::removeActionListener (ActionListener* const listener) | |||||
| ActionBroadcaster::~ActionBroadcaster() | |||||
| { | { | ||||
| const ScopedLock sl (actionListenerLock_); | |||||
| // all event-based objects must be deleted BEFORE juce is shut down! | |||||
| jassert (MessageManager::instance != 0); | |||||
| } | |||||
| jassert (actionListeners_.contains (listener)); // trying to remove a listener that isn't on the list! | |||||
| void ActionBroadcaster::addActionListener (ActionListener* const listener) | |||||
| { | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| actionListeners_.removeValue (listener); | |||||
| if (listener != 0) | |||||
| actionListeners.add (listener); | |||||
| } | } | ||||
| void ActionListenerList::removeAllActionListeners() | |||||
| void ActionBroadcaster::removeActionListener (ActionListener* const listener) | |||||
| { | { | ||||
| const ScopedLock sl (actionListenerLock_); | |||||
| actionListeners_.clear(); | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| actionListeners.removeValue (listener); | |||||
| } | } | ||||
| void ActionListenerList::sendActionMessage (const String& message) const | |||||
| void ActionBroadcaster::removeAllActionListeners() | |||||
| { | { | ||||
| const ScopedLock sl (actionListenerLock_); | |||||
| for (int i = actionListeners_.size(); --i >= 0;) | |||||
| postMessage (new ActionMessage (message, static_cast <ActionListener*> (actionListeners_.getUnchecked(i)))); | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| actionListeners.clear(); | |||||
| } | } | ||||
| void ActionListenerList::handleMessage (const Message& message) | |||||
| void ActionBroadcaster::sendActionMessage (const String& message) const | |||||
| { | { | ||||
| const ActionMessage& am = (const ActionMessage&) message; | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| if (actionListeners_.contains (am.pointerParameter)) | |||||
| static_cast <ActionListener*> (am.pointerParameter)->actionListenerCallback (am.message); | |||||
| for (int i = actionListeners.size(); --i >= 0;) | |||||
| callback.postMessage (new ActionMessage (message, actionListeners.getUnchecked(i))); | |||||
| } | } | ||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| /*** End of inlined file: juce_ActionListenerList.cpp ***/ | |||||
| /*** End of inlined file: juce_ActionBroadcaster.cpp ***/ | |||||
| /*** Start of inlined file: juce_AsyncUpdater.cpp ***/ | /*** Start of inlined file: juce_AsyncUpdater.cpp ***/ | ||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| class AsyncUpdater::AsyncUpdaterMessage : public CallbackMessage | |||||
| { | |||||
| public: | |||||
| AsyncUpdaterMessage (AsyncUpdater& owner_) | |||||
| : owner (owner_) | |||||
| { | |||||
| } | |||||
| void messageCallback() | |||||
| { | |||||
| if (owner.pendingMessage.compareAndSetBool (0, this)) | |||||
| owner.handleAsyncUpdate(); | |||||
| } | |||||
| AsyncUpdater& owner; | |||||
| }; | |||||
| AsyncUpdater::AsyncUpdater() throw() | AsyncUpdater::AsyncUpdater() throw() | ||||
| : asyncMessagePending (false) | |||||
| { | { | ||||
| internalAsyncHandler.owner = this; | |||||
| } | } | ||||
| AsyncUpdater::~AsyncUpdater() | AsyncUpdater::~AsyncUpdater() | ||||
| { | { | ||||
| // You're deleting this object with a background thread while there's an update | |||||
| // pending on the main event thread - that's pretty dodgy threading, as the callback could | |||||
| // happen after this destructor has finished. You should either use a MessageManagerLock while | |||||
| // deleting this object, or find some other way to avoid such a race condition. | |||||
| jassert (/*(! isUpdatePending()) ||*/ MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||||
| pendingMessage = 0; | |||||
| } | } | ||||
| void AsyncUpdater::triggerAsyncUpdate() | void AsyncUpdater::triggerAsyncUpdate() | ||||
| { | { | ||||
| if (! asyncMessagePending) | |||||
| if (pendingMessage.value == 0) | |||||
| { | { | ||||
| asyncMessagePending = true; | |||||
| internalAsyncHandler.postMessage (new Message()); | |||||
| ScopedPointer<AsyncUpdaterMessage> pending (new AsyncUpdaterMessage (*this)); | |||||
| if (pendingMessage.compareAndSetBool (pending, 0)) | |||||
| pending.release()->post(); | |||||
| } | } | ||||
| } | } | ||||
| void AsyncUpdater::cancelPendingUpdate() throw() | void AsyncUpdater::cancelPendingUpdate() throw() | ||||
| { | { | ||||
| asyncMessagePending = false; | |||||
| pendingMessage = 0; | |||||
| } | } | ||||
| void AsyncUpdater::handleUpdateNowIfNeeded() | void AsyncUpdater::handleUpdateNowIfNeeded() | ||||
| { | { | ||||
| if (asyncMessagePending) | |||||
| { | |||||
| asyncMessagePending = false; | |||||
| // This can only be called by the event thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||||
| if (pendingMessage.exchange (0) != 0) | |||||
| handleAsyncUpdate(); | handleAsyncUpdate(); | ||||
| } | |||||
| } | } | ||||
| void AsyncUpdater::AsyncUpdaterInternal::handleMessage (const Message&) | |||||
| bool AsyncUpdater::isUpdatePending() const throw() | |||||
| { | { | ||||
| owner->handleUpdateNowIfNeeded(); | |||||
| return pendingMessage.value != 0; | |||||
| } | } | ||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -38452,40 +38433,24 @@ END_JUCE_NAMESPACE | |||||
| /*** Start of inlined file: juce_ChangeBroadcaster.cpp ***/ | /*** Start of inlined file: juce_ChangeBroadcaster.cpp ***/ | ||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| class ChangeBroadcaster::ChangeBroadcasterMessage : public CallbackMessage | |||||
| { | |||||
| public: | |||||
| ChangeBroadcasterMessage (ChangeBroadcaster* const owner_) | |||||
| : owner (owner_) | |||||
| { | |||||
| } | |||||
| void messageCallback() | |||||
| { | |||||
| if (owner != 0 && owner->pendingMessage.value == this) | |||||
| owner->sendSynchronousChangeMessage(); | |||||
| } | |||||
| ChangeBroadcaster* owner; | |||||
| }; | |||||
| ChangeBroadcaster::ChangeBroadcaster() throw() | ChangeBroadcaster::ChangeBroadcaster() throw() | ||||
| { | { | ||||
| // are you trying to create this object before or after juce has been intialised?? | // are you trying to create this object before or after juce has been intialised?? | ||||
| jassert (MessageManager::instance != 0); | jassert (MessageManager::instance != 0); | ||||
| callback.owner = this; | |||||
| } | } | ||||
| ChangeBroadcaster::~ChangeBroadcaster() | ChangeBroadcaster::~ChangeBroadcaster() | ||||
| { | { | ||||
| // all event-based objects must be deleted BEFORE juce is shut down! | // all event-based objects must be deleted BEFORE juce is shut down! | ||||
| jassert (MessageManager::instance != 0); | jassert (MessageManager::instance != 0); | ||||
| invalidatePendingMessage(); | |||||
| } | } | ||||
| void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) | void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) | ||||
| { | { | ||||
| // Listeners can only be safely added when the event thread is locked... | |||||
| // Listeners can only be safely added when the event thread is locked | |||||
| // You can use a MessageManagerLock if you need to call this from another thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
| changeListeners.add (listener); | changeListeners.add (listener); | ||||
| @@ -38493,7 +38458,8 @@ void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) | |||||
| void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) | void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) | ||||
| { | { | ||||
| // Listeners can only be safely added when the event thread is locked... | |||||
| // Listeners can only be safely added when the event thread is locked | |||||
| // You can use a MessageManagerLock if you need to call this from another thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
| changeListeners.remove (listener); | changeListeners.remove (listener); | ||||
| @@ -38501,28 +38467,17 @@ void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) | |||||
| void ChangeBroadcaster::removeAllChangeListeners() | void ChangeBroadcaster::removeAllChangeListeners() | ||||
| { | { | ||||
| // Listeners can only be safely added when the event thread is locked... | |||||
| // Listeners can only be safely added when the event thread is locked | |||||
| // You can use a MessageManagerLock if you need to call this from another thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
| changeListeners.clear(); | changeListeners.clear(); | ||||
| } | } | ||||
| void ChangeBroadcaster::invalidatePendingMessage() | |||||
| { | |||||
| ChangeBroadcasterMessage* const oldMessage = pendingMessage.exchange (0); | |||||
| if (oldMessage != 0) | |||||
| oldMessage->owner = 0; | |||||
| } | |||||
| void ChangeBroadcaster::sendChangeMessage() | void ChangeBroadcaster::sendChangeMessage() | ||||
| { | { | ||||
| if (pendingMessage.value == 0 && changeListeners.size() > 0) | |||||
| { | |||||
| ScopedPointer<ChangeBroadcasterMessage> pending (new ChangeBroadcasterMessage (this)); | |||||
| if (pendingMessage.compareAndSetBool (pending, 0)) | |||||
| pending.release()->post(); | |||||
| } | |||||
| if (changeListeners.size() > 0) | |||||
| callback.triggerAsyncUpdate(); | |||||
| } | } | ||||
| void ChangeBroadcaster::sendSynchronousChangeMessage() | void ChangeBroadcaster::sendSynchronousChangeMessage() | ||||
| @@ -38530,14 +38485,29 @@ void ChangeBroadcaster::sendSynchronousChangeMessage() | |||||
| // This can only be called by the event thread. | // This can only be called by the event thread. | ||||
| jassert (MessageManager::getInstance()->isThisTheMessageThread()); | jassert (MessageManager::getInstance()->isThisTheMessageThread()); | ||||
| invalidatePendingMessage(); | |||||
| changeListeners.call (&ChangeListener::changeListenerCallback, this); | |||||
| callback.cancelPendingUpdate(); | |||||
| callListeners(); | |||||
| } | } | ||||
| void ChangeBroadcaster::dispatchPendingMessages() | void ChangeBroadcaster::dispatchPendingMessages() | ||||
| { | { | ||||
| if (pendingMessage.get() != 0) | |||||
| sendSynchronousChangeMessage(); | |||||
| callback.handleUpdateNowIfNeeded(); | |||||
| } | |||||
| void ChangeBroadcaster::callListeners() | |||||
| { | |||||
| changeListeners.call (&ChangeListener::changeListenerCallback, this); | |||||
| } | |||||
| ChangeBroadcaster::ChangeBroadcasterCallback::ChangeBroadcasterCallback() | |||||
| : owner (0) | |||||
| { | |||||
| } | |||||
| void ChangeBroadcaster::ChangeBroadcasterCallback::handleAsyncUpdate() | |||||
| { | |||||
| jassert (owner != 0); | |||||
| owner->callListeners(); | |||||
| } | } | ||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -38955,7 +38925,8 @@ Message::Message() throw() | |||||
| : intParameter1 (0), | : intParameter1 (0), | ||||
| intParameter2 (0), | intParameter2 (0), | ||||
| intParameter3 (0), | intParameter3 (0), | ||||
| pointerParameter (0) | |||||
| pointerParameter (0), | |||||
| messageRecipient (0) | |||||
| { | { | ||||
| } | } | ||||
| @@ -38966,7 +38937,8 @@ Message::Message (const int intParameter1_, | |||||
| : intParameter1 (intParameter1_), | : intParameter1 (intParameter1_), | ||||
| intParameter2 (intParameter2_), | intParameter2 (intParameter2_), | ||||
| intParameter3 (intParameter3_), | intParameter3 (intParameter3_), | ||||
| pointerParameter (pointerParameter_) | |||||
| pointerParameter (pointerParameter_), | |||||
| messageRecipient (0) | |||||
| { | { | ||||
| } | } | ||||
| @@ -39037,7 +39009,7 @@ MessageManager::MessageManager() throw() | |||||
| MessageManager::~MessageManager() throw() | MessageManager::~MessageManager() throw() | ||||
| { | { | ||||
| broadcastListeners = 0; | |||||
| broadcaster = 0; | |||||
| doPlatformSpecificShutdown(); | doPlatformSpecificShutdown(); | ||||
| @@ -39068,47 +39040,40 @@ void MessageManager::postMessageToQueue (Message* const message) | |||||
| delete message; | delete message; | ||||
| } | } | ||||
| CallbackMessage::CallbackMessage() throw() {} | |||||
| CallbackMessage::~CallbackMessage() {} | |||||
| CallbackMessage::CallbackMessage() throw() {} | |||||
| CallbackMessage::~CallbackMessage() {} | |||||
| void CallbackMessage::post() | void CallbackMessage::post() | ||||
| { | { | ||||
| if (MessageManager::instance != 0) | if (MessageManager::instance != 0) | ||||
| MessageManager::instance->postCallbackMessage (this); | |||||
| } | |||||
| void MessageManager::postCallbackMessage (Message* const message) | |||||
| { | |||||
| message->messageRecipient = 0; | |||||
| postMessageToQueue (message); | |||||
| MessageManager::instance->postMessageToQueue (this); | |||||
| } | } | ||||
| // not for public use.. | // not for public use.. | ||||
| void MessageManager::deliverMessage (Message* const message) | void MessageManager::deliverMessage (Message* const message) | ||||
| { | { | ||||
| const ScopedPointer <Message> messageDeleter (message); | |||||
| MessageListener* const recipient = message->messageRecipient; | |||||
| JUCE_TRY | JUCE_TRY | ||||
| { | { | ||||
| if (messageListeners.contains (recipient)) | |||||
| { | |||||
| recipient->handleMessage (*message); | |||||
| } | |||||
| else if (recipient == 0) | |||||
| const ScopedPointer <Message> messageDeleter (message); | |||||
| MessageListener* const recipient = message->messageRecipient; | |||||
| if (recipient == 0) | |||||
| { | { | ||||
| if (message->intParameter1 == quitMessageId) | |||||
| CallbackMessage* const callbackMessage = dynamic_cast <CallbackMessage*> (message); | |||||
| if (callbackMessage != 0) | |||||
| { | { | ||||
| quitMessageReceived = true; | |||||
| callbackMessage->messageCallback(); | |||||
| } | } | ||||
| else | |||||
| else if (message->intParameter1 == quitMessageId) | |||||
| { | { | ||||
| CallbackMessage* const cm = dynamic_cast <CallbackMessage*> (message); | |||||
| if (cm != 0) | |||||
| cm->messageCallback(); | |||||
| quitMessageReceived = true; | |||||
| } | } | ||||
| } | } | ||||
| else if (messageListeners.contains (recipient)) | |||||
| { | |||||
| recipient->handleMessage (*message); | |||||
| } | |||||
| } | } | ||||
| JUCE_CATCH_EXCEPTION | JUCE_CATCH_EXCEPTION | ||||
| } | } | ||||
| @@ -39123,10 +39088,7 @@ void MessageManager::runDispatchLoop() | |||||
| void MessageManager::stopDispatchLoop() | void MessageManager::stopDispatchLoop() | ||||
| { | { | ||||
| Message* const m = new Message (quitMessageId, 0, 0, 0); | |||||
| m->messageRecipient = 0; | |||||
| postMessageToQueue (m); | |||||
| postMessageToQueue (new Message (quitMessageId, 0, 0, 0)); | |||||
| quitMessagePosted = true; | quitMessagePosted = true; | ||||
| } | } | ||||
| @@ -39159,22 +39121,22 @@ bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) | |||||
| void MessageManager::deliverBroadcastMessage (const String& value) | void MessageManager::deliverBroadcastMessage (const String& value) | ||||
| { | { | ||||
| if (broadcastListeners != 0) | |||||
| broadcastListeners->sendActionMessage (value); | |||||
| if (broadcaster != 0) | |||||
| broadcaster->sendActionMessage (value); | |||||
| } | } | ||||
| void MessageManager::registerBroadcastListener (ActionListener* const listener) | void MessageManager::registerBroadcastListener (ActionListener* const listener) | ||||
| { | { | ||||
| if (broadcastListeners == 0) | |||||
| broadcastListeners = new ActionListenerList(); | |||||
| if (broadcaster == 0) | |||||
| broadcaster = new ActionBroadcaster(); | |||||
| broadcastListeners->addActionListener (listener); | |||||
| broadcaster->addActionListener (listener); | |||||
| } | } | ||||
| void MessageManager::deregisterBroadcastListener (ActionListener* const listener) | void MessageManager::deregisterBroadcastListener (ActionListener* const listener) | ||||
| { | { | ||||
| if (broadcastListeners != 0) | |||||
| broadcastListeners->removeActionListener (listener); | |||||
| if (broadcaster != 0) | |||||
| broadcaster->removeActionListener (listener); | |||||
| } | } | ||||
| bool MessageManager::isThisTheMessageThread() const throw() | bool MessageManager::isThisTheMessageThread() const throw() | ||||
| @@ -39213,7 +39175,6 @@ class MessageManagerLock::SharedEvents : public ReferenceCountedObject | |||||
| { | { | ||||
| public: | public: | ||||
| SharedEvents() {} | SharedEvents() {} | ||||
| ~SharedEvents() {} | |||||
| /* This class just holds a couple of events to communicate between the BlockingMessage | /* This class just holds a couple of events to communicate between the BlockingMessage | ||||
| and the MessageManagerLock. Because both of these objects may be deleted at any time, | and the MessageManagerLock. Because both of these objects may be deleted at any time, | ||||
| @@ -39229,7 +39190,6 @@ class MessageManagerLock::BlockingMessage : public CallbackMessage | |||||
| { | { | ||||
| public: | public: | ||||
| BlockingMessage (MessageManagerLock::SharedEvents* const events_) : events (events_) {} | BlockingMessage (MessageManagerLock::SharedEvents* const events_) : events (events_) {} | ||||
| ~BlockingMessage() throw() {} | |||||
| void messageCallback() | void messageCallback() | ||||
| { | { | ||||
| @@ -64,7 +64,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
| #define JUCE_BUILDNUMBER 93 | |||||
| #define JUCE_BUILDNUMBER 94 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -12281,131 +12281,6 @@ private: | |||||
| #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | ||||
| #define __JUCE_ASYNCUPDATER_JUCEHEADER__ | #define __JUCE_ASYNCUPDATER_JUCEHEADER__ | ||||
| /*** Start of inlined file: juce_MessageListener.h ***/ | |||||
| #ifndef __JUCE_MESSAGELISTENER_JUCEHEADER__ | |||||
| #define __JUCE_MESSAGELISTENER_JUCEHEADER__ | |||||
| /*** Start of inlined file: juce_Message.h ***/ | |||||
| #ifndef __JUCE_MESSAGE_JUCEHEADER__ | |||||
| #define __JUCE_MESSAGE_JUCEHEADER__ | |||||
| class MessageListener; | |||||
| class MessageManager; | |||||
| /** The base class for objects that can be delivered to a MessageListener. | |||||
| The simplest Message object contains a few integer and pointer parameters | |||||
| that the user can set, and this is enough for a lot of purposes. For passing more | |||||
| complex data, subclasses of Message can also be used. | |||||
| @see MessageListener, MessageManager, ActionListener, ChangeListener | |||||
| */ | |||||
| class JUCE_API Message | |||||
| { | |||||
| public: | |||||
| /** Creates an uninitialised message. | |||||
| The class's variables will also be left uninitialised. | |||||
| */ | |||||
| Message() throw(); | |||||
| /** Creates a message object, filling in the member variables. | |||||
| The corresponding public member variables will be set from the parameters | |||||
| passed in. | |||||
| */ | |||||
| Message (int intParameter1, | |||||
| int intParameter2, | |||||
| int intParameter3, | |||||
| void* pointerParameter) throw(); | |||||
| /** Destructor. */ | |||||
| virtual ~Message(); | |||||
| // These values can be used for carrying simple data that the application needs to | |||||
| // pass around. For more complex messages, just create a subclass. | |||||
| int intParameter1; /**< user-defined integer value. */ | |||||
| int intParameter2; /**< user-defined integer value. */ | |||||
| int intParameter3; /**< user-defined integer value. */ | |||||
| void* pointerParameter; /**< user-defined pointer value. */ | |||||
| juce_UseDebuggingNewOperator | |||||
| private: | |||||
| friend class MessageListener; | |||||
| friend class MessageManager; | |||||
| MessageListener* messageRecipient; | |||||
| Message (const Message&); | |||||
| Message& operator= (const Message&); | |||||
| }; | |||||
| #endif // __JUCE_MESSAGE_JUCEHEADER__ | |||||
| /*** End of inlined file: juce_Message.h ***/ | |||||
| /** | |||||
| MessageListener subclasses can post and receive Message objects. | |||||
| @see Message, MessageManager, ActionListener, ChangeListener | |||||
| */ | |||||
| class JUCE_API MessageListener | |||||
| { | |||||
| protected: | |||||
| /** Creates a MessageListener. */ | |||||
| MessageListener() throw(); | |||||
| public: | |||||
| /** Destructor. | |||||
| When a MessageListener is deleted, it removes itself from a global list | |||||
| of registered listeners, so that the isValidMessageListener() method | |||||
| will no longer return true. | |||||
| */ | |||||
| virtual ~MessageListener(); | |||||
| /** This is the callback method that receives incoming messages. | |||||
| This is called by the MessageManager from its dispatch loop. | |||||
| @see postMessage | |||||
| */ | |||||
| virtual void handleMessage (const Message& message) = 0; | |||||
| /** Sends a message to the message queue, for asynchronous delivery to this listener | |||||
| later on. | |||||
| This method can be called safely by any thread. | |||||
| @param message the message object to send - this will be deleted | |||||
| automatically by the message queue, so don't keep any | |||||
| references to it after calling this method. | |||||
| @see handleMessage | |||||
| */ | |||||
| void postMessage (Message* message) const throw(); | |||||
| /** Checks whether this MessageListener has been deleted. | |||||
| Although not foolproof, this method is safe to call on dangling or null | |||||
| pointers. A list of active MessageListeners is kept internally, so this | |||||
| checks whether the object is on this list or not. | |||||
| Note that it's possible to get a false-positive here, if an object is | |||||
| deleted and another is subsequently created that happens to be at the | |||||
| exact same memory location, but I can't think of a good way of avoiding | |||||
| this. | |||||
| */ | |||||
| bool isValidMessageListener() const throw(); | |||||
| }; | |||||
| #endif // __JUCE_MESSAGELISTENER_JUCEHEADER__ | |||||
| /*** End of inlined file: juce_MessageListener.h ***/ | |||||
| /** | /** | ||||
| Has a callback method that is triggered asynchronously. | Has a callback method that is triggered asynchronously. | ||||
| @@ -12454,9 +12329,15 @@ public: | |||||
| Use this as a kind of "flush" operation - if an update is pending, the | Use this as a kind of "flush" operation - if an update is pending, the | ||||
| handleAsyncUpdate() method will be called immediately; if no update is | handleAsyncUpdate() method will be called immediately; if no update is | ||||
| pending, then nothing will be done. | pending, then nothing will be done. | ||||
| Because this may invoke the callback, this method must only be called on | |||||
| the main event thread. | |||||
| */ | */ | ||||
| void handleUpdateNowIfNeeded(); | void handleUpdateNowIfNeeded(); | ||||
| /** Returns true if there's an update callback in the pipeline. */ | |||||
| bool isUpdatePending() const throw(); | |||||
| /** Called back to do whatever your class needs to do. | /** Called back to do whatever your class needs to do. | ||||
| This method is called by the message thread at the next convenient time | This method is called by the message thread at the next convenient time | ||||
| @@ -12466,23 +12347,10 @@ public: | |||||
| private: | private: | ||||
| class AsyncUpdaterInternal : public MessageListener | |||||
| { | |||||
| public: | |||||
| AsyncUpdaterInternal() {} | |||||
| ~AsyncUpdaterInternal() {} | |||||
| void handleMessage (const Message&); | |||||
| AsyncUpdater* owner; | |||||
| private: | |||||
| AsyncUpdaterInternal (const AsyncUpdaterInternal&); | |||||
| AsyncUpdaterInternal& operator= (const AsyncUpdaterInternal&); | |||||
| }; | |||||
| class AsyncUpdaterMessage; | |||||
| friend class AsyncUpdaterMessage; | |||||
| AsyncUpdaterInternal internalAsyncHandler; | |||||
| bool asyncMessagePending; | |||||
| Atomic<AsyncUpdaterMessage*> pendingMessage; | |||||
| }; | }; | ||||
| #endif // __JUCE_ASYNCUPDATER_JUCEHEADER__ | #endif // __JUCE_ASYNCUPDATER_JUCEHEADER__ | ||||
| @@ -13099,13 +12967,20 @@ public: | |||||
| private: | private: | ||||
| class ChangeBroadcasterMessage; | |||||
| friend class ChangeBroadcasterMessage; | |||||
| class ChangeBroadcasterCallback : public AsyncUpdater | |||||
| { | |||||
| public: | |||||
| ChangeBroadcasterCallback(); | |||||
| void handleAsyncUpdate(); | |||||
| ChangeBroadcaster* owner; | |||||
| }; | |||||
| Atomic<ChangeBroadcasterMessage*> pendingMessage; | |||||
| friend class ChangeBroadcasterCallback; | |||||
| ChangeBroadcasterCallback callback; | |||||
| ListenerList <ChangeListener> changeListeners; | ListenerList <ChangeListener> changeListeners; | ||||
| void invalidatePendingMessage(); | |||||
| void callListeners(); | |||||
| ChangeBroadcaster (const ChangeBroadcaster&); | ChangeBroadcaster (const ChangeBroadcaster&); | ||||
| ChangeBroadcaster& operator= (const ChangeBroadcaster&); | ChangeBroadcaster& operator= (const ChangeBroadcaster&); | ||||
| @@ -28302,6 +28177,131 @@ struct JUCE_API ApplicationCommandInfo | |||||
| #endif // __JUCE_APPLICATIONCOMMANDINFO_JUCEHEADER__ | #endif // __JUCE_APPLICATIONCOMMANDINFO_JUCEHEADER__ | ||||
| /*** End of inlined file: juce_ApplicationCommandInfo.h ***/ | /*** End of inlined file: juce_ApplicationCommandInfo.h ***/ | ||||
| /*** Start of inlined file: juce_MessageListener.h ***/ | |||||
| #ifndef __JUCE_MESSAGELISTENER_JUCEHEADER__ | |||||
| #define __JUCE_MESSAGELISTENER_JUCEHEADER__ | |||||
| /*** Start of inlined file: juce_Message.h ***/ | |||||
| #ifndef __JUCE_MESSAGE_JUCEHEADER__ | |||||
| #define __JUCE_MESSAGE_JUCEHEADER__ | |||||
| class MessageListener; | |||||
| class MessageManager; | |||||
| /** The base class for objects that can be delivered to a MessageListener. | |||||
| The simplest Message object contains a few integer and pointer parameters | |||||
| that the user can set, and this is enough for a lot of purposes. For passing more | |||||
| complex data, subclasses of Message can also be used. | |||||
| @see MessageListener, MessageManager, ActionListener, ChangeListener | |||||
| */ | |||||
| class JUCE_API Message | |||||
| { | |||||
| public: | |||||
| /** Creates an uninitialised message. | |||||
| The class's variables will also be left uninitialised. | |||||
| */ | |||||
| Message() throw(); | |||||
| /** Creates a message object, filling in the member variables. | |||||
| The corresponding public member variables will be set from the parameters | |||||
| passed in. | |||||
| */ | |||||
| Message (int intParameter1, | |||||
| int intParameter2, | |||||
| int intParameter3, | |||||
| void* pointerParameter) throw(); | |||||
| /** Destructor. */ | |||||
| virtual ~Message(); | |||||
| // These values can be used for carrying simple data that the application needs to | |||||
| // pass around. For more complex messages, just create a subclass. | |||||
| int intParameter1; /**< user-defined integer value. */ | |||||
| int intParameter2; /**< user-defined integer value. */ | |||||
| int intParameter3; /**< user-defined integer value. */ | |||||
| void* pointerParameter; /**< user-defined pointer value. */ | |||||
| juce_UseDebuggingNewOperator | |||||
| private: | |||||
| friend class MessageListener; | |||||
| friend class MessageManager; | |||||
| MessageListener* messageRecipient; | |||||
| Message (const Message&); | |||||
| Message& operator= (const Message&); | |||||
| }; | |||||
| #endif // __JUCE_MESSAGE_JUCEHEADER__ | |||||
| /*** End of inlined file: juce_Message.h ***/ | |||||
| /** | |||||
| MessageListener subclasses can post and receive Message objects. | |||||
| @see Message, MessageManager, ActionListener, ChangeListener | |||||
| */ | |||||
| class JUCE_API MessageListener | |||||
| { | |||||
| protected: | |||||
| /** Creates a MessageListener. */ | |||||
| MessageListener() throw(); | |||||
| public: | |||||
| /** Destructor. | |||||
| When a MessageListener is deleted, it removes itself from a global list | |||||
| of registered listeners, so that the isValidMessageListener() method | |||||
| will no longer return true. | |||||
| */ | |||||
| virtual ~MessageListener(); | |||||
| /** This is the callback method that receives incoming messages. | |||||
| This is called by the MessageManager from its dispatch loop. | |||||
| @see postMessage | |||||
| */ | |||||
| virtual void handleMessage (const Message& message) = 0; | |||||
| /** Sends a message to the message queue, for asynchronous delivery to this listener | |||||
| later on. | |||||
| This method can be called safely by any thread. | |||||
| @param message the message object to send - this will be deleted | |||||
| automatically by the message queue, so don't keep any | |||||
| references to it after calling this method. | |||||
| @see handleMessage | |||||
| */ | |||||
| void postMessage (Message* message) const throw(); | |||||
| /** Checks whether this MessageListener has been deleted. | |||||
| Although not foolproof, this method is safe to call on dangling or null | |||||
| pointers. A list of active MessageListeners is kept internally, so this | |||||
| checks whether the object is on this list or not. | |||||
| Note that it's possible to get a false-positive here, if an object is | |||||
| deleted and another is subsequently created that happens to be at the | |||||
| exact same memory location, but I can't think of a good way of avoiding | |||||
| this. | |||||
| */ | |||||
| bool isValidMessageListener() const throw(); | |||||
| }; | |||||
| #endif // __JUCE_MESSAGELISTENER_JUCEHEADER__ | |||||
| /*** End of inlined file: juce_MessageListener.h ***/ | |||||
| /** | /** | ||||
| A command target publishes a list of command IDs that it can perform. | A command target publishes a list of command IDs that it can perform. | ||||
| @@ -28537,7 +28537,7 @@ private: | |||||
| Used by various classes, e.g. buttons when they are pressed, to tell listeners | Used by various classes, e.g. buttons when they are pressed, to tell listeners | ||||
| about something that's happened. | about something that's happened. | ||||
| @see ActionListenerList, ActionBroadcaster, ChangeListener | |||||
| @see ActionBroadcaster, ChangeListener | |||||
| */ | */ | ||||
| class JUCE_API ActionListener | class JUCE_API ActionListener | ||||
| { | { | ||||
| @@ -28548,7 +28548,7 @@ public: | |||||
| /** Overridden by your subclass to receive the callback. | /** Overridden by your subclass to receive the callback. | ||||
| @param message the string that was specified when the event was triggered | @param message the string that was specified when the event was triggered | ||||
| by a call to ActionListenerList::sendActionMessage() | |||||
| by a call to ActionBroadcaster::sendActionMessage() | |||||
| */ | */ | ||||
| virtual void actionListenerCallback (const String& message) = 0; | virtual void actionListenerCallback (const String& message) = 0; | ||||
| }; | }; | ||||
| @@ -43380,96 +43380,29 @@ private: | |||||
| #ifndef __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | #ifndef __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | ||||
| #define __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | #define __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | ||||
| /*** Start of inlined file: juce_ActionListenerList.h ***/ | |||||
| #ifndef __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| #define __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| /** | |||||
| A set of ActionListeners. | |||||
| Listeners can be added and removed from the list, and messages can be | |||||
| broadcast to all the listeners. | |||||
| @see ActionListener, ActionBroadcaster | |||||
| */ | |||||
| class JUCE_API ActionListenerList : public MessageListener | |||||
| { | |||||
| public: | |||||
| /** Creates an empty list. */ | |||||
| ActionListenerList(); | |||||
| /** Destructor. */ | |||||
| ~ActionListenerList(); | |||||
| /** Adds a listener to the list. | |||||
| (Trying to add a listener that's already on the list will have no effect). | |||||
| */ | |||||
| void addActionListener (ActionListener* listener); | |||||
| /** Removes a listener from the list. | |||||
| If the listener isn't on the list, this won't have any effect. | |||||
| */ | |||||
| void removeActionListener (ActionListener* listener); | |||||
| /** Removes all listeners from the list. */ | |||||
| void removeAllActionListeners(); | |||||
| /** Broadcasts a message to all the registered listeners. | |||||
| This sends the message asynchronously. | |||||
| If a listener is on the list when this method is called but is removed from | |||||
| the list before the message arrives, it won't receive the message. Similarly | |||||
| listeners that are added to the list after the message is sent but before it | |||||
| arrives won't get the message either. | |||||
| */ | |||||
| void sendActionMessage (const String& message) const; | |||||
| /** @internal */ | |||||
| void handleMessage (const Message&); | |||||
| juce_UseDebuggingNewOperator | |||||
| private: | |||||
| SortedSet <void*> actionListeners_; | |||||
| CriticalSection actionListenerLock_; | |||||
| ActionListenerList (const ActionListenerList&); | |||||
| ActionListenerList& operator= (const ActionListenerList&); | |||||
| }; | |||||
| #endif // __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| /*** End of inlined file: juce_ActionListenerList.h ***/ | |||||
| /** Manages a list of ActionListeners, and can send them messages. | /** Manages a list of ActionListeners, and can send them messages. | ||||
| To quickly add methods to your class that can add/remove action | To quickly add methods to your class that can add/remove action | ||||
| listeners and broadcast to them, you can derive from this. | listeners and broadcast to them, you can derive from this. | ||||
| @see ActionListenerList, ActionListener | |||||
| @see ActionListener, ChangeListener | |||||
| */ | */ | ||||
| class JUCE_API ActionBroadcaster | class JUCE_API ActionBroadcaster | ||||
| { | { | ||||
| public: | public: | ||||
| /** Creates an ActionBroadcaster. */ | /** Creates an ActionBroadcaster. */ | ||||
| ActionBroadcaster() throw(); | |||||
| ActionBroadcaster(); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| virtual ~ActionBroadcaster(); | virtual ~ActionBroadcaster(); | ||||
| /** Adds a listener to the list. | /** Adds a listener to the list. | ||||
| (Trying to add a listener that's already on the list will have no effect). | |||||
| Trying to add a listener that's already on the list will have no effect. | |||||
| */ | */ | ||||
| void addActionListener (ActionListener* listener); | void addActionListener (ActionListener* listener); | ||||
| /** Removes a listener from the list. | /** Removes a listener from the list. | ||||
| If the listener isn't on the list, this won't have any effect. | If the listener isn't on the list, this won't have any effect. | ||||
| */ | */ | ||||
| void removeActionListener (ActionListener* listener); | void removeActionListener (ActionListener* listener); | ||||
| @@ -43478,14 +43411,25 @@ public: | |||||
| void removeAllActionListeners(); | void removeAllActionListeners(); | ||||
| /** Broadcasts a message to all the registered listeners. | /** Broadcasts a message to all the registered listeners. | ||||
| @see ActionListenerList::sendActionMessage | |||||
| @see ActionListener::actionListenerCallback | |||||
| */ | */ | ||||
| void sendActionMessage (const String& message) const; | void sendActionMessage (const String& message) const; | ||||
| private: | private: | ||||
| ActionListenerList actionListenerList; | |||||
| class CallbackReceiver : public MessageListener | |||||
| { | |||||
| public: | |||||
| CallbackReceiver(); | |||||
| void handleMessage (const Message&); | |||||
| ActionBroadcaster* owner; | |||||
| }; | |||||
| friend class CallbackReceiver; | |||||
| CallbackReceiver callback; | |||||
| SortedSet <ActionListener*> actionListeners; | |||||
| CriticalSection actionListenerLock; | |||||
| ActionBroadcaster (const ActionBroadcaster&); | ActionBroadcaster (const ActionBroadcaster&); | ||||
| ActionBroadcaster& operator= (const ActionBroadcaster&); | ActionBroadcaster& operator= (const ActionBroadcaster&); | ||||
| @@ -43498,9 +43442,6 @@ private: | |||||
| #endif | #endif | ||||
| #ifndef __JUCE_ACTIONLISTENER_JUCEHEADER__ | #ifndef __JUCE_ACTIONLISTENER_JUCEHEADER__ | ||||
| #endif | |||||
| #ifndef __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| #endif | #endif | ||||
| #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | ||||
| @@ -43980,7 +43921,7 @@ private: | |||||
| static MessageManager* instance; | static MessageManager* instance; | ||||
| SortedSet <const MessageListener*> messageListeners; | SortedSet <const MessageListener*> messageListeners; | ||||
| ScopedPointer <ActionListenerList> broadcastListeners; | |||||
| ScopedPointer <ActionBroadcaster> broadcaster; | |||||
| friend class JUCEApplication; | friend class JUCEApplication; | ||||
| bool quitMessagePosted, quitMessageReceived; | bool quitMessagePosted, quitMessageReceived; | ||||
| @@ -43989,7 +43930,6 @@ private: | |||||
| static void* exitModalLoopCallback (void*); | static void* exitModalLoopCallback (void*); | ||||
| void postMessageToQueue (Message* message); | void postMessageToQueue (Message* message); | ||||
| void postCallbackMessage (Message* message); | |||||
| static void doPlatformSpecificInitialisation(); | static void doPlatformSpecificInitialisation(); | ||||
| static void doPlatformSpecificShutdown(); | static void doPlatformSpecificShutdown(); | ||||
| @@ -28,6 +28,7 @@ | |||||
| #include "../gui/components/juce_Component.h" | #include "../gui/components/juce_Component.h" | ||||
| #include "juce_ApplicationCommandInfo.h" | #include "juce_ApplicationCommandInfo.h" | ||||
| #include "../events/juce_MessageListener.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -33,7 +33,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
| #define JUCE_BUILDNUMBER 93 | |||||
| #define JUCE_BUILDNUMBER 94 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -29,13 +29,45 @@ BEGIN_JUCE_NAMESPACE | |||||
| #include "juce_ActionBroadcaster.h" | #include "juce_ActionBroadcaster.h" | ||||
| #include "juce_MessageManager.h" | #include "juce_MessageManager.h" | ||||
| #include "../threads/juce_ScopedLock.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| ActionBroadcaster::ActionBroadcaster() throw() | |||||
| // special message of our own with a string in it | |||||
| class ActionMessage : public Message | |||||
| { | |||||
| public: | |||||
| const String message; | |||||
| ActionMessage (const String& messageText, ActionListener* const listener_) throw() | |||||
| : message (messageText) | |||||
| { | |||||
| pointerParameter = listener_; | |||||
| } | |||||
| private: | |||||
| ActionMessage (const ActionMessage&); | |||||
| ActionMessage& operator= (const ActionMessage&); | |||||
| }; | |||||
| ActionBroadcaster::CallbackReceiver::CallbackReceiver() {} | |||||
| void ActionBroadcaster::CallbackReceiver::handleMessage (const Message& message) | |||||
| { | |||||
| const ActionMessage& am = static_cast <const ActionMessage&> (message); | |||||
| ActionListener* const target = static_cast <ActionListener*> (am.pointerParameter); | |||||
| if (owner->actionListeners.contains (target)) | |||||
| target->actionListenerCallback (am.message); | |||||
| } | |||||
| //============================================================================== | |||||
| ActionBroadcaster::ActionBroadcaster() | |||||
| { | { | ||||
| // are you trying to create this object before or after juce has been intialised?? | // are you trying to create this object before or after juce has been intialised?? | ||||
| jassert (MessageManager::instance != 0); | jassert (MessageManager::instance != 0); | ||||
| callback.owner = this; | |||||
| } | } | ||||
| ActionBroadcaster::~ActionBroadcaster() | ActionBroadcaster::~ActionBroadcaster() | ||||
| @@ -46,25 +78,31 @@ ActionBroadcaster::~ActionBroadcaster() | |||||
| void ActionBroadcaster::addActionListener (ActionListener* const listener) | void ActionBroadcaster::addActionListener (ActionListener* const listener) | ||||
| { | { | ||||
| actionListenerList.addActionListener (listener); | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| if (listener != 0) | |||||
| actionListeners.add (listener); | |||||
| } | } | ||||
| void ActionBroadcaster::removeActionListener (ActionListener* const listener) | void ActionBroadcaster::removeActionListener (ActionListener* const listener) | ||||
| { | { | ||||
| jassert (actionListenerList.isValidMessageListener()); | |||||
| if (actionListenerList.isValidMessageListener()) | |||||
| actionListenerList.removeActionListener (listener); | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| actionListeners.removeValue (listener); | |||||
| } | } | ||||
| void ActionBroadcaster::removeAllActionListeners() | void ActionBroadcaster::removeAllActionListeners() | ||||
| { | { | ||||
| actionListenerList.removeAllActionListeners(); | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| actionListeners.clear(); | |||||
| } | } | ||||
| void ActionBroadcaster::sendActionMessage (const String& message) const | void ActionBroadcaster::sendActionMessage (const String& message) const | ||||
| { | { | ||||
| actionListenerList.sendActionMessage (message); | |||||
| const ScopedLock sl (actionListenerLock); | |||||
| for (int i = actionListeners.size(); --i >= 0;) | |||||
| callback.postMessage (new ActionMessage (message, actionListeners.getUnchecked(i))); | |||||
| } | } | ||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -26,7 +26,9 @@ | |||||
| #ifndef __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | #ifndef __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | ||||
| #define __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | #define __JUCE_ACTIONBROADCASTER_JUCEHEADER__ | ||||
| #include "juce_ActionListenerList.h" | |||||
| #include "juce_ActionListener.h" | |||||
| #include "juce_MessageListener.h" | |||||
| #include "../containers/juce_SortedSet.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -35,27 +37,25 @@ | |||||
| To quickly add methods to your class that can add/remove action | To quickly add methods to your class that can add/remove action | ||||
| listeners and broadcast to them, you can derive from this. | listeners and broadcast to them, you can derive from this. | ||||
| @see ActionListenerList, ActionListener | |||||
| @see ActionListener, ChangeListener | |||||
| */ | */ | ||||
| class JUCE_API ActionBroadcaster | class JUCE_API ActionBroadcaster | ||||
| { | { | ||||
| public: | public: | ||||
| //============================================================================== | //============================================================================== | ||||
| /** Creates an ActionBroadcaster. */ | /** Creates an ActionBroadcaster. */ | ||||
| ActionBroadcaster() throw(); | |||||
| ActionBroadcaster(); | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| virtual ~ActionBroadcaster(); | virtual ~ActionBroadcaster(); | ||||
| //============================================================================== | //============================================================================== | ||||
| /** Adds a listener to the list. | /** Adds a listener to the list. | ||||
| (Trying to add a listener that's already on the list will have no effect). | |||||
| Trying to add a listener that's already on the list will have no effect. | |||||
| */ | */ | ||||
| void addActionListener (ActionListener* listener); | void addActionListener (ActionListener* listener); | ||||
| /** Removes a listener from the list. | /** Removes a listener from the list. | ||||
| If the listener isn't on the list, this won't have any effect. | If the listener isn't on the list, this won't have any effect. | ||||
| */ | */ | ||||
| void removeActionListener (ActionListener* listener); | void removeActionListener (ActionListener* listener); | ||||
| @@ -65,15 +65,26 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Broadcasts a message to all the registered listeners. | /** Broadcasts a message to all the registered listeners. | ||||
| @see ActionListenerList::sendActionMessage | |||||
| @see ActionListener::actionListenerCallback | |||||
| */ | */ | ||||
| void sendActionMessage (const String& message) const; | void sendActionMessage (const String& message) const; | ||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| ActionListenerList actionListenerList; | |||||
| class CallbackReceiver : public MessageListener | |||||
| { | |||||
| public: | |||||
| CallbackReceiver(); | |||||
| void handleMessage (const Message&); | |||||
| ActionBroadcaster* owner; | |||||
| }; | |||||
| friend class CallbackReceiver; | |||||
| CallbackReceiver callback; | |||||
| SortedSet <ActionListener*> actionListeners; | |||||
| CriticalSection actionListenerLock; | |||||
| ActionBroadcaster (const ActionBroadcaster&); | ActionBroadcaster (const ActionBroadcaster&); | ||||
| ActionBroadcaster& operator= (const ActionBroadcaster&); | ActionBroadcaster& operator= (const ActionBroadcaster&); | ||||
| @@ -36,7 +36,7 @@ | |||||
| Used by various classes, e.g. buttons when they are pressed, to tell listeners | Used by various classes, e.g. buttons when they are pressed, to tell listeners | ||||
| about something that's happened. | about something that's happened. | ||||
| @see ActionListenerList, ActionBroadcaster, ChangeListener | |||||
| @see ActionBroadcaster, ChangeListener | |||||
| */ | */ | ||||
| class JUCE_API ActionListener | class JUCE_API ActionListener | ||||
| { | { | ||||
| @@ -47,7 +47,7 @@ public: | |||||
| /** Overridden by your subclass to receive the callback. | /** Overridden by your subclass to receive the callback. | ||||
| @param message the string that was specified when the event was triggered | @param message the string that was specified when the event was triggered | ||||
| by a call to ActionListenerList::sendActionMessage() | |||||
| by a call to ActionBroadcaster::sendActionMessage() | |||||
| */ | */ | ||||
| virtual void actionListenerCallback (const String& message) = 0; | virtual void actionListenerCallback (const String& message) = 0; | ||||
| }; | }; | ||||
| @@ -1,108 +0,0 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-10 by Raw Material Software Ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the GNU General | |||||
| Public License (Version 2), as published by the Free Software Foundation. | |||||
| A copy of the license is included in the JUCE distribution, or can be found | |||||
| online at www.gnu.org/licenses. | |||||
| JUCE 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. | |||||
| ------------------------------------------------------------------------------ | |||||
| To release a closed-source product which uses JUCE, commercial licenses are | |||||
| available: visit www.rawmaterialsoftware.com/juce for more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| #include "../core/juce_StandardHeader.h" | |||||
| BEGIN_JUCE_NAMESPACE | |||||
| #include "juce_ActionListenerList.h" | |||||
| #include "../threads/juce_ScopedLock.h" | |||||
| //============================================================================== | |||||
| // special message of our own with a string in it | |||||
| class ActionMessage : public Message | |||||
| { | |||||
| public: | |||||
| const String message; | |||||
| ActionMessage (const String& messageText, void* const listener_) throw() | |||||
| : message (messageText) | |||||
| { | |||||
| pointerParameter = listener_; | |||||
| } | |||||
| ~ActionMessage() throw() | |||||
| { | |||||
| } | |||||
| private: | |||||
| ActionMessage (const ActionMessage&); | |||||
| ActionMessage& operator= (const ActionMessage&); | |||||
| }; | |||||
| //============================================================================== | |||||
| ActionListenerList::ActionListenerList() | |||||
| { | |||||
| } | |||||
| ActionListenerList::~ActionListenerList() | |||||
| { | |||||
| } | |||||
| void ActionListenerList::addActionListener (ActionListener* const listener) | |||||
| { | |||||
| const ScopedLock sl (actionListenerLock_); | |||||
| jassert (listener != 0); | |||||
| jassert (! actionListeners_.contains (listener)); // trying to add a listener to the list twice! | |||||
| if (listener != 0) | |||||
| actionListeners_.add (listener); | |||||
| } | |||||
| void ActionListenerList::removeActionListener (ActionListener* const listener) | |||||
| { | |||||
| const ScopedLock sl (actionListenerLock_); | |||||
| jassert (actionListeners_.contains (listener)); // trying to remove a listener that isn't on the list! | |||||
| actionListeners_.removeValue (listener); | |||||
| } | |||||
| void ActionListenerList::removeAllActionListeners() | |||||
| { | |||||
| const ScopedLock sl (actionListenerLock_); | |||||
| actionListeners_.clear(); | |||||
| } | |||||
| void ActionListenerList::sendActionMessage (const String& message) const | |||||
| { | |||||
| const ScopedLock sl (actionListenerLock_); | |||||
| for (int i = actionListeners_.size(); --i >= 0;) | |||||
| postMessage (new ActionMessage (message, static_cast <ActionListener*> (actionListeners_.getUnchecked(i)))); | |||||
| } | |||||
| void ActionListenerList::handleMessage (const Message& message) | |||||
| { | |||||
| const ActionMessage& am = (const ActionMessage&) message; | |||||
| if (actionListeners_.contains (am.pointerParameter)) | |||||
| static_cast <ActionListener*> (am.pointerParameter)->actionListenerCallback (am.message); | |||||
| } | |||||
| END_JUCE_NAMESPACE | |||||
| @@ -1,96 +0,0 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-10 by Raw Material Software Ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the GNU General | |||||
| Public License (Version 2), as published by the Free Software Foundation. | |||||
| A copy of the license is included in the JUCE distribution, or can be found | |||||
| online at www.gnu.org/licenses. | |||||
| JUCE 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. | |||||
| ------------------------------------------------------------------------------ | |||||
| To release a closed-source product which uses JUCE, commercial licenses are | |||||
| available: visit www.rawmaterialsoftware.com/juce for more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| #ifndef __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| #define __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| #include "juce_ActionListener.h" | |||||
| #include "juce_MessageListener.h" | |||||
| #include "../containers/juce_SortedSet.h" | |||||
| #include "../threads/juce_CriticalSection.h" | |||||
| //============================================================================== | |||||
| /** | |||||
| A set of ActionListeners. | |||||
| Listeners can be added and removed from the list, and messages can be | |||||
| broadcast to all the listeners. | |||||
| @see ActionListener, ActionBroadcaster | |||||
| */ | |||||
| class JUCE_API ActionListenerList : public MessageListener | |||||
| { | |||||
| public: | |||||
| //============================================================================== | |||||
| /** Creates an empty list. */ | |||||
| ActionListenerList(); | |||||
| /** Destructor. */ | |||||
| ~ActionListenerList(); | |||||
| //============================================================================== | |||||
| /** Adds a listener to the list. | |||||
| (Trying to add a listener that's already on the list will have no effect). | |||||
| */ | |||||
| void addActionListener (ActionListener* listener); | |||||
| /** Removes a listener from the list. | |||||
| If the listener isn't on the list, this won't have any effect. | |||||
| */ | |||||
| void removeActionListener (ActionListener* listener); | |||||
| /** Removes all listeners from the list. */ | |||||
| void removeAllActionListeners(); | |||||
| /** Broadcasts a message to all the registered listeners. | |||||
| This sends the message asynchronously. | |||||
| If a listener is on the list when this method is called but is removed from | |||||
| the list before the message arrives, it won't receive the message. Similarly | |||||
| listeners that are added to the list after the message is sent but before it | |||||
| arrives won't get the message either. | |||||
| */ | |||||
| void sendActionMessage (const String& message) const; | |||||
| //============================================================================== | |||||
| /** @internal */ | |||||
| void handleMessage (const Message&); | |||||
| juce_UseDebuggingNewOperator | |||||
| private: | |||||
| SortedSet <void*> actionListeners_; | |||||
| CriticalSection actionListenerLock_; | |||||
| ActionListenerList (const ActionListenerList&); | |||||
| ActionListenerList& operator= (const ActionListenerList&); | |||||
| }; | |||||
| #endif // __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| @@ -28,45 +28,73 @@ | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| #include "juce_AsyncUpdater.h" | #include "juce_AsyncUpdater.h" | ||||
| #include "juce_CallbackMessage.h" | |||||
| #include "../containers/juce_ScopedPointer.h" | |||||
| #include "juce_MessageManager.h" | |||||
| //============================================================================== | |||||
| class AsyncUpdater::AsyncUpdaterMessage : public CallbackMessage | |||||
| { | |||||
| public: | |||||
| AsyncUpdaterMessage (AsyncUpdater& owner_) | |||||
| : owner (owner_) | |||||
| { | |||||
| } | |||||
| void messageCallback() | |||||
| { | |||||
| if (owner.pendingMessage.compareAndSetBool (0, this)) | |||||
| owner.handleAsyncUpdate(); | |||||
| } | |||||
| AsyncUpdater& owner; | |||||
| }; | |||||
| //============================================================================== | //============================================================================== | ||||
| AsyncUpdater::AsyncUpdater() throw() | AsyncUpdater::AsyncUpdater() throw() | ||||
| : asyncMessagePending (false) | |||||
| { | { | ||||
| internalAsyncHandler.owner = this; | |||||
| } | } | ||||
| AsyncUpdater::~AsyncUpdater() | AsyncUpdater::~AsyncUpdater() | ||||
| { | { | ||||
| // You're deleting this object with a background thread while there's an update | |||||
| // pending on the main event thread - that's pretty dodgy threading, as the callback could | |||||
| // happen after this destructor has finished. You should either use a MessageManagerLock while | |||||
| // deleting this object, or find some other way to avoid such a race condition. | |||||
| jassert (/*(! isUpdatePending()) ||*/ MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||||
| pendingMessage = 0; | |||||
| } | } | ||||
| void AsyncUpdater::triggerAsyncUpdate() | void AsyncUpdater::triggerAsyncUpdate() | ||||
| { | { | ||||
| if (! asyncMessagePending) | |||||
| if (pendingMessage.value == 0) | |||||
| { | { | ||||
| asyncMessagePending = true; | |||||
| internalAsyncHandler.postMessage (new Message()); | |||||
| ScopedPointer<AsyncUpdaterMessage> pending (new AsyncUpdaterMessage (*this)); | |||||
| if (pendingMessage.compareAndSetBool (pending, 0)) | |||||
| pending.release()->post(); | |||||
| } | } | ||||
| } | } | ||||
| void AsyncUpdater::cancelPendingUpdate() throw() | void AsyncUpdater::cancelPendingUpdate() throw() | ||||
| { | { | ||||
| asyncMessagePending = false; | |||||
| pendingMessage = 0; | |||||
| } | } | ||||
| void AsyncUpdater::handleUpdateNowIfNeeded() | void AsyncUpdater::handleUpdateNowIfNeeded() | ||||
| { | { | ||||
| if (asyncMessagePending) | |||||
| { | |||||
| asyncMessagePending = false; | |||||
| // This can only be called by the event thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||||
| if (pendingMessage.exchange (0) != 0) | |||||
| handleAsyncUpdate(); | handleAsyncUpdate(); | ||||
| } | |||||
| } | } | ||||
| void AsyncUpdater::AsyncUpdaterInternal::handleMessage (const Message&) | |||||
| bool AsyncUpdater::isUpdatePending() const throw() | |||||
| { | { | ||||
| owner->handleUpdateNowIfNeeded(); | |||||
| return pendingMessage.value != 0; | |||||
| } | } | ||||
| @@ -26,7 +26,7 @@ | |||||
| #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | ||||
| #define __JUCE_ASYNCUPDATER_JUCEHEADER__ | #define __JUCE_ASYNCUPDATER_JUCEHEADER__ | ||||
| #include "juce_MessageListener.h" | |||||
| #include "../core/juce_Atomic.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -79,9 +79,15 @@ public: | |||||
| Use this as a kind of "flush" operation - if an update is pending, the | Use this as a kind of "flush" operation - if an update is pending, the | ||||
| handleAsyncUpdate() method will be called immediately; if no update is | handleAsyncUpdate() method will be called immediately; if no update is | ||||
| pending, then nothing will be done. | pending, then nothing will be done. | ||||
| Because this may invoke the callback, this method must only be called on | |||||
| the main event thread. | |||||
| */ | */ | ||||
| void handleUpdateNowIfNeeded(); | void handleUpdateNowIfNeeded(); | ||||
| /** Returns true if there's an update callback in the pipeline. */ | |||||
| bool isUpdatePending() const throw(); | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Called back to do whatever your class needs to do. | /** Called back to do whatever your class needs to do. | ||||
| @@ -93,23 +99,10 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| class AsyncUpdaterInternal : public MessageListener | |||||
| { | |||||
| public: | |||||
| AsyncUpdaterInternal() {} | |||||
| ~AsyncUpdaterInternal() {} | |||||
| void handleMessage (const Message&); | |||||
| AsyncUpdater* owner; | |||||
| private: | |||||
| AsyncUpdaterInternal (const AsyncUpdaterInternal&); | |||||
| AsyncUpdaterInternal& operator= (const AsyncUpdaterInternal&); | |||||
| }; | |||||
| class AsyncUpdaterMessage; | |||||
| friend class AsyncUpdaterMessage; | |||||
| AsyncUpdaterInternal internalAsyncHandler; | |||||
| bool asyncMessagePending; | |||||
| Atomic<AsyncUpdaterMessage*> pendingMessage; | |||||
| }; | }; | ||||
| @@ -31,42 +31,25 @@ BEGIN_JUCE_NAMESPACE | |||||
| #include "juce_MessageManager.h" | #include "juce_MessageManager.h" | ||||
| //============================================================================== | |||||
| class ChangeBroadcaster::ChangeBroadcasterMessage : public CallbackMessage | |||||
| { | |||||
| public: | |||||
| ChangeBroadcasterMessage (ChangeBroadcaster* const owner_) | |||||
| : owner (owner_) | |||||
| { | |||||
| } | |||||
| void messageCallback() | |||||
| { | |||||
| if (owner != 0 && owner->pendingMessage.value == this) | |||||
| owner->sendSynchronousChangeMessage(); | |||||
| } | |||||
| ChangeBroadcaster* owner; | |||||
| }; | |||||
| //============================================================================== | //============================================================================== | ||||
| ChangeBroadcaster::ChangeBroadcaster() throw() | ChangeBroadcaster::ChangeBroadcaster() throw() | ||||
| { | { | ||||
| // are you trying to create this object before or after juce has been intialised?? | // are you trying to create this object before or after juce has been intialised?? | ||||
| jassert (MessageManager::instance != 0); | jassert (MessageManager::instance != 0); | ||||
| callback.owner = this; | |||||
| } | } | ||||
| ChangeBroadcaster::~ChangeBroadcaster() | ChangeBroadcaster::~ChangeBroadcaster() | ||||
| { | { | ||||
| // all event-based objects must be deleted BEFORE juce is shut down! | // all event-based objects must be deleted BEFORE juce is shut down! | ||||
| jassert (MessageManager::instance != 0); | jassert (MessageManager::instance != 0); | ||||
| invalidatePendingMessage(); | |||||
| } | } | ||||
| void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) | void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) | ||||
| { | { | ||||
| // Listeners can only be safely added when the event thread is locked... | |||||
| // Listeners can only be safely added when the event thread is locked | |||||
| // You can use a MessageManagerLock if you need to call this from another thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
| changeListeners.add (listener); | changeListeners.add (listener); | ||||
| @@ -74,7 +57,8 @@ void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) | |||||
| void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) | void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) | ||||
| { | { | ||||
| // Listeners can only be safely added when the event thread is locked... | |||||
| // Listeners can only be safely added when the event thread is locked | |||||
| // You can use a MessageManagerLock if you need to call this from another thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
| changeListeners.remove (listener); | changeListeners.remove (listener); | ||||
| @@ -82,28 +66,17 @@ void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) | |||||
| void ChangeBroadcaster::removeAllChangeListeners() | void ChangeBroadcaster::removeAllChangeListeners() | ||||
| { | { | ||||
| // Listeners can only be safely added when the event thread is locked... | |||||
| // Listeners can only be safely added when the event thread is locked | |||||
| // You can use a MessageManagerLock if you need to call this from another thread. | |||||
| jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
| changeListeners.clear(); | changeListeners.clear(); | ||||
| } | } | ||||
| void ChangeBroadcaster::invalidatePendingMessage() | |||||
| { | |||||
| ChangeBroadcasterMessage* const oldMessage = pendingMessage.exchange (0); | |||||
| if (oldMessage != 0) | |||||
| oldMessage->owner = 0; | |||||
| } | |||||
| void ChangeBroadcaster::sendChangeMessage() | void ChangeBroadcaster::sendChangeMessage() | ||||
| { | { | ||||
| if (pendingMessage.value == 0 && changeListeners.size() > 0) | |||||
| { | |||||
| ScopedPointer<ChangeBroadcasterMessage> pending (new ChangeBroadcasterMessage (this)); | |||||
| if (pendingMessage.compareAndSetBool (pending, 0)) | |||||
| pending.release()->post(); | |||||
| } | |||||
| if (changeListeners.size() > 0) | |||||
| callback.triggerAsyncUpdate(); | |||||
| } | } | ||||
| void ChangeBroadcaster::sendSynchronousChangeMessage() | void ChangeBroadcaster::sendSynchronousChangeMessage() | ||||
| @@ -111,14 +84,30 @@ void ChangeBroadcaster::sendSynchronousChangeMessage() | |||||
| // This can only be called by the event thread. | // This can only be called by the event thread. | ||||
| jassert (MessageManager::getInstance()->isThisTheMessageThread()); | jassert (MessageManager::getInstance()->isThisTheMessageThread()); | ||||
| invalidatePendingMessage(); | |||||
| changeListeners.call (&ChangeListener::changeListenerCallback, this); | |||||
| callback.cancelPendingUpdate(); | |||||
| callListeners(); | |||||
| } | } | ||||
| void ChangeBroadcaster::dispatchPendingMessages() | void ChangeBroadcaster::dispatchPendingMessages() | ||||
| { | { | ||||
| if (pendingMessage.get() != 0) | |||||
| sendSynchronousChangeMessage(); | |||||
| callback.handleUpdateNowIfNeeded(); | |||||
| } | |||||
| void ChangeBroadcaster::callListeners() | |||||
| { | |||||
| changeListeners.call (&ChangeListener::changeListenerCallback, this); | |||||
| } | |||||
| //============================================================================== | |||||
| ChangeBroadcaster::ChangeBroadcasterCallback::ChangeBroadcasterCallback() | |||||
| : owner (0) | |||||
| { | |||||
| } | |||||
| void ChangeBroadcaster::ChangeBroadcasterCallback::handleAsyncUpdate() | |||||
| { | |||||
| jassert (owner != 0); | |||||
| owner->callListeners(); | |||||
| } | } | ||||
| @@ -28,7 +28,7 @@ | |||||
| #include "juce_ChangeListener.h" | #include "juce_ChangeListener.h" | ||||
| #include "juce_ListenerList.h" | #include "juce_ListenerList.h" | ||||
| #include "../core/juce_Atomic.h" | |||||
| #include "juce_AsyncUpdater.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -88,13 +88,20 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| class ChangeBroadcasterMessage; | |||||
| friend class ChangeBroadcasterMessage; | |||||
| class ChangeBroadcasterCallback : public AsyncUpdater | |||||
| { | |||||
| public: | |||||
| ChangeBroadcasterCallback(); | |||||
| void handleAsyncUpdate(); | |||||
| Atomic<ChangeBroadcasterMessage*> pendingMessage; | |||||
| ChangeBroadcaster* owner; | |||||
| }; | |||||
| friend class ChangeBroadcasterCallback; | |||||
| ChangeBroadcasterCallback callback; | |||||
| ListenerList <ChangeListener> changeListeners; | ListenerList <ChangeListener> changeListeners; | ||||
| void invalidatePendingMessage(); | |||||
| void callListeners(); | |||||
| ChangeBroadcaster (const ChangeBroadcaster&); | ChangeBroadcaster (const ChangeBroadcaster&); | ||||
| ChangeBroadcaster& operator= (const ChangeBroadcaster&); | ChangeBroadcaster& operator= (const ChangeBroadcaster&); | ||||
| @@ -35,7 +35,8 @@ Message::Message() throw() | |||||
| : intParameter1 (0), | : intParameter1 (0), | ||||
| intParameter2 (0), | intParameter2 (0), | ||||
| intParameter3 (0), | intParameter3 (0), | ||||
| pointerParameter (0) | |||||
| pointerParameter (0), | |||||
| messageRecipient (0) | |||||
| { | { | ||||
| } | } | ||||
| @@ -46,7 +47,8 @@ Message::Message (const int intParameter1_, | |||||
| : intParameter1 (intParameter1_), | : intParameter1 (intParameter1_), | ||||
| intParameter2 (intParameter2_), | intParameter2 (intParameter2_), | ||||
| intParameter3 (intParameter3_), | intParameter3 (intParameter3_), | ||||
| pointerParameter (pointerParameter_) | |||||
| pointerParameter (pointerParameter_), | |||||
| messageRecipient (0) | |||||
| { | { | ||||
| } | } | ||||
| @@ -28,7 +28,7 @@ | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| #include "juce_MessageManager.h" | #include "juce_MessageManager.h" | ||||
| #include "juce_ActionListenerList.h" | |||||
| #include "juce_ActionBroadcaster.h" | |||||
| #include "../application/juce_Application.h" | #include "../application/juce_Application.h" | ||||
| #include "../gui/components/juce_Component.h" | #include "../gui/components/juce_Component.h" | ||||
| #include "../threads/juce_Thread.h" | #include "../threads/juce_Thread.h" | ||||
| @@ -56,7 +56,7 @@ MessageManager::MessageManager() throw() | |||||
| MessageManager::~MessageManager() throw() | MessageManager::~MessageManager() throw() | ||||
| { | { | ||||
| broadcastListeners = 0; | |||||
| broadcaster = 0; | |||||
| doPlatformSpecificShutdown(); | doPlatformSpecificShutdown(); | ||||
| @@ -88,48 +88,41 @@ void MessageManager::postMessageToQueue (Message* const message) | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| CallbackMessage::CallbackMessage() throw() {} | |||||
| CallbackMessage::~CallbackMessage() {} | |||||
| CallbackMessage::CallbackMessage() throw() {} | |||||
| CallbackMessage::~CallbackMessage() {} | |||||
| void CallbackMessage::post() | void CallbackMessage::post() | ||||
| { | { | ||||
| if (MessageManager::instance != 0) | if (MessageManager::instance != 0) | ||||
| MessageManager::instance->postCallbackMessage (this); | |||||
| } | |||||
| void MessageManager::postCallbackMessage (Message* const message) | |||||
| { | |||||
| message->messageRecipient = 0; | |||||
| postMessageToQueue (message); | |||||
| MessageManager::instance->postMessageToQueue (this); | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| // not for public use.. | // not for public use.. | ||||
| void MessageManager::deliverMessage (Message* const message) | void MessageManager::deliverMessage (Message* const message) | ||||
| { | { | ||||
| const ScopedPointer <Message> messageDeleter (message); | |||||
| MessageListener* const recipient = message->messageRecipient; | |||||
| JUCE_TRY | JUCE_TRY | ||||
| { | { | ||||
| if (messageListeners.contains (recipient)) | |||||
| { | |||||
| recipient->handleMessage (*message); | |||||
| } | |||||
| else if (recipient == 0) | |||||
| const ScopedPointer <Message> messageDeleter (message); | |||||
| MessageListener* const recipient = message->messageRecipient; | |||||
| if (recipient == 0) | |||||
| { | { | ||||
| if (message->intParameter1 == quitMessageId) | |||||
| CallbackMessage* const callbackMessage = dynamic_cast <CallbackMessage*> (message); | |||||
| if (callbackMessage != 0) | |||||
| { | { | ||||
| quitMessageReceived = true; | |||||
| callbackMessage->messageCallback(); | |||||
| } | } | ||||
| else | |||||
| else if (message->intParameter1 == quitMessageId) | |||||
| { | { | ||||
| CallbackMessage* const cm = dynamic_cast <CallbackMessage*> (message); | |||||
| if (cm != 0) | |||||
| cm->messageCallback(); | |||||
| quitMessageReceived = true; | |||||
| } | } | ||||
| } | } | ||||
| else if (messageListeners.contains (recipient)) | |||||
| { | |||||
| recipient->handleMessage (*message); | |||||
| } | |||||
| } | } | ||||
| JUCE_CATCH_EXCEPTION | JUCE_CATCH_EXCEPTION | ||||
| } | } | ||||
| @@ -145,10 +138,7 @@ void MessageManager::runDispatchLoop() | |||||
| void MessageManager::stopDispatchLoop() | void MessageManager::stopDispatchLoop() | ||||
| { | { | ||||
| Message* const m = new Message (quitMessageId, 0, 0, 0); | |||||
| m->messageRecipient = 0; | |||||
| postMessageToQueue (m); | |||||
| postMessageToQueue (new Message (quitMessageId, 0, 0, 0)); | |||||
| quitMessagePosted = true; | quitMessagePosted = true; | ||||
| } | } | ||||
| @@ -182,22 +172,22 @@ bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) | |||||
| //============================================================================== | //============================================================================== | ||||
| void MessageManager::deliverBroadcastMessage (const String& value) | void MessageManager::deliverBroadcastMessage (const String& value) | ||||
| { | { | ||||
| if (broadcastListeners != 0) | |||||
| broadcastListeners->sendActionMessage (value); | |||||
| if (broadcaster != 0) | |||||
| broadcaster->sendActionMessage (value); | |||||
| } | } | ||||
| void MessageManager::registerBroadcastListener (ActionListener* const listener) | void MessageManager::registerBroadcastListener (ActionListener* const listener) | ||||
| { | { | ||||
| if (broadcastListeners == 0) | |||||
| broadcastListeners = new ActionListenerList(); | |||||
| if (broadcaster == 0) | |||||
| broadcaster = new ActionBroadcaster(); | |||||
| broadcastListeners->addActionListener (listener); | |||||
| broadcaster->addActionListener (listener); | |||||
| } | } | ||||
| void MessageManager::deregisterBroadcastListener (ActionListener* const listener) | void MessageManager::deregisterBroadcastListener (ActionListener* const listener) | ||||
| { | { | ||||
| if (broadcastListeners != 0) | |||||
| broadcastListeners->removeActionListener (listener); | |||||
| if (broadcaster != 0) | |||||
| broadcaster->removeActionListener (listener); | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -239,7 +229,6 @@ class MessageManagerLock::SharedEvents : public ReferenceCountedObject | |||||
| { | { | ||||
| public: | public: | ||||
| SharedEvents() {} | SharedEvents() {} | ||||
| ~SharedEvents() {} | |||||
| /* This class just holds a couple of events to communicate between the BlockingMessage | /* This class just holds a couple of events to communicate between the BlockingMessage | ||||
| and the MessageManagerLock. Because both of these objects may be deleted at any time, | and the MessageManagerLock. Because both of these objects may be deleted at any time, | ||||
| @@ -255,7 +244,6 @@ class MessageManagerLock::BlockingMessage : public CallbackMessage | |||||
| { | { | ||||
| public: | public: | ||||
| BlockingMessage (MessageManagerLock::SharedEvents* const events_) : events (events_) {} | BlockingMessage (MessageManagerLock::SharedEvents* const events_) : events (events_) {} | ||||
| ~BlockingMessage() throw() {} | |||||
| void messageCallback() | void messageCallback() | ||||
| { | { | ||||
| @@ -31,7 +31,7 @@ | |||||
| #include "../containers/juce_ScopedPointer.h" | #include "../containers/juce_ScopedPointer.h" | ||||
| #include "../threads/juce_Thread.h" | #include "../threads/juce_Thread.h" | ||||
| #include "../threads/juce_ThreadPool.h" | #include "../threads/juce_ThreadPool.h" | ||||
| #include "juce_ActionListenerList.h" | |||||
| #include "juce_ActionBroadcaster.h" | |||||
| #include "juce_CallbackMessage.h" | #include "juce_CallbackMessage.h" | ||||
| class Component; | class Component; | ||||
| class MessageManagerLock; | class MessageManagerLock; | ||||
| @@ -175,7 +175,7 @@ private: | |||||
| static MessageManager* instance; | static MessageManager* instance; | ||||
| SortedSet <const MessageListener*> messageListeners; | SortedSet <const MessageListener*> messageListeners; | ||||
| ScopedPointer <ActionListenerList> broadcastListeners; | |||||
| ScopedPointer <ActionBroadcaster> broadcaster; | |||||
| friend class JUCEApplication; | friend class JUCEApplication; | ||||
| bool quitMessagePosted, quitMessageReceived; | bool quitMessagePosted, quitMessageReceived; | ||||
| @@ -184,7 +184,6 @@ private: | |||||
| static void* exitModalLoopCallback (void*); | static void* exitModalLoopCallback (void*); | ||||
| void postMessageToQueue (Message* message); | void postMessageToQueue (Message* message); | ||||
| void postCallbackMessage (Message* message); | |||||
| static void doPlatformSpecificInitialisation(); | static void doPlatformSpecificInitialisation(); | ||||
| static void doPlatformSpecificShutdown(); | static void doPlatformSpecificShutdown(); | ||||
| @@ -317,5 +316,4 @@ private: | |||||
| }; | }; | ||||
| #endif // __JUCE_MESSAGEMANAGER_JUCEHEADER__ | #endif // __JUCE_MESSAGEMANAGER_JUCEHEADER__ | ||||
| @@ -29,7 +29,6 @@ | |||||
| #include "../juce_Component.h" | #include "../juce_Component.h" | ||||
| #include "../mouse/juce_MouseCursor.h" | #include "../mouse/juce_MouseCursor.h" | ||||
| #include "../keyboard/juce_TextInputTarget.h" | #include "../keyboard/juce_TextInputTarget.h" | ||||
| #include "../../../events/juce_MessageListener.h" | |||||
| #include "../../../text/juce_StringArray.h" | #include "../../../text/juce_StringArray.h" | ||||
| #include "../../graphics/geometry/juce_RectangleList.h" | #include "../../graphics/geometry/juce_RectangleList.h" | ||||
| @@ -230,9 +230,6 @@ | |||||
| #ifndef __JUCE_ACTIONLISTENER_JUCEHEADER__ | #ifndef __JUCE_ACTIONLISTENER_JUCEHEADER__ | ||||
| #include "events/juce_ActionListener.h" | #include "events/juce_ActionListener.h" | ||||
| #endif | #endif | ||||
| #ifndef __JUCE_ACTIONLISTENERLIST_JUCEHEADER__ | |||||
| #include "events/juce_ActionListenerList.h" | |||||
| #endif | |||||
| #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | #ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ | ||||
| #include "events/juce_AsyncUpdater.h" | #include "events/juce_AsyncUpdater.h" | ||||
| #endif | #endif | ||||
| @@ -388,7 +388,7 @@ namespace NumberToStringConverters | |||||
| else | else | ||||
| { | { | ||||
| #if JUCE_WINDOWS | #if JUCE_WINDOWS | ||||
| #if JUCE_VC8_OR_EARLIER || JUCE_MINGW | |||||
| #if JUCE_VC7_OR_EARLIER || JUCE_MINGW | |||||
| len = _snwprintf (buffer, numChars, L"%.9g", n); | len = _snwprintf (buffer, numChars, L"%.9g", n); | ||||
| #else | #else | ||||
| len = _snwprintf_s (buffer, numChars, _TRUNCATE, L"%.9g", n); | len = _snwprintf_s (buffer, numChars, _TRUNCATE, L"%.9g", n); | ||||