Browse Source

Added a couple of methods to the File class: File::getLinkedTarget() and File::moveToTrash(). Also fixed a typo in QT headers, an overflow in BufferingAudioSource, removed a few linux warnings, and had another attempt at a reliable working screensaver-disabler on windows.

tags/2021-05-28
jules 17 years ago
parent
commit
c91e214808
14 changed files with 1087 additions and 681 deletions
  1. +614
    -616
      build/linux/JUCE.make
  2. +33
    -2
      build/linux/platform_specific_code/juce_linux_Files.cpp
  3. +2
    -2
      build/linux/platform_specific_code/juce_linux_SystemStats.cpp
  4. +34
    -0
      build/macosx/platform_specific_code/juce_mac_Files.mm
  5. +7
    -1
      build/macosx/platform_specific_code/juce_mac_MiscUtilities.mm
  6. +61
    -0
      build/win32/platform_specific_code/juce_win32_Files.cpp
  7. +56
    -0
      build/win32/platform_specific_code/juce_win32_Windowing.cpp
  8. +1
    -1
      extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp
  9. +48
    -44
      extras/juce demo/build/linux/JuceDemo.make
  10. +195
    -10
      juce_amalgamated.cpp
  11. +14
    -0
      juce_amalgamated.h
  12. +5
    -5
      src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.cpp
  13. +3
    -0
      src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.cpp
  14. +14
    -0
      src/juce_core/io/files/juce_File.h

+ 614
- 616
build/linux/JUCE.make
File diff suppressed because it is too large
View File


+ 33
- 2
build/linux/platform_specific_code/juce_linux_Files.cpp View File

@@ -294,6 +294,37 @@ bool File::setAsCurrentWorkingDirectory() const throw()
return chdir (getFullPathName().toUTF8()) == 0;
}
//==============================================================================
const File File::getLinkedTarget() const throw()
{
char buffer [4096];
size_t numChars = readlink ((const char*) getFullPathName().toUTF8(),
buffer, sizeof (buffer));
if (numChars > 0 && numChars <= sizeof (buffer))
return File (String::fromUTF8 ((const uint8*) buffer, (int) numChars));
return *this;
}
//==============================================================================
bool File::moveToTrash() const throw()
{
if (! exists())
return true;
File trashCan (T("~/.Trash"));
if (! trashCan.isDirectory())
trashCan = T("~/.local/share/Trash/files");
if (! trashCan.isDirectory())
return false;
return moveFileTo (trashCan.getNonexistentChildFile (getFileNameWithoutExtension(),
getFileExtension()));
}
//==============================================================================
struct FindFileStruct
{
@@ -439,7 +470,7 @@ bool juce_launchFile (const String& fileName,
if (cmdString.startsWithIgnoreCase (T("file:")))
cmdString = cmdString.substring (5);
char* const argv[4] = { "/bin/sh", "-c", (char*) cmdString.toUTF8(), 0 };
const char* const argv[4] = { "/bin/sh", "-c", (const char*) cmdString.toUTF8(), 0 };
const int cpid = fork();
@@ -448,7 +479,7 @@ bool juce_launchFile (const String& fileName,
setsid();
// Child process
execve (argv[0], argv, environ);
execve (argv[0], (char**) argv, environ);
exit (0);
}


+ 2
- 2
build/linux/platform_specific_code/juce_linux_SystemStats.cpp View File

@@ -77,8 +77,8 @@ BEGIN_JUCE_NAMESPACE
//==============================================================================
void Logger::outputDebugString (const String& text) throw()
{
fprintf (stdout, text.toUTF8());
fprintf (stdout, "\n");
fputs (text.toUTF8(), stdout);
fputs ("\n", stdout);
}
void Logger::outputDebugPrintf (const tchar* format, ...) throw()


+ 34
- 0
build/macosx/platform_specific_code/juce_mac_Files.mm View File

@@ -330,6 +330,40 @@ bool File::setAsCurrentWorkingDirectory() const throw()
return chdir (getFullPathName().toUTF8()) == 0;
}
//==============================================================================
const File File::getLinkedTarget() const throw()
{
FSRef ref;
Boolean targetIsAFolder, wasAliased;
if (PlatformUtilities::makeFSRefFromPath (&ref, getFullPathName())
&& (FSResolveAliasFileWithMountFlags (&ref, true, &targetIsAFolder, &wasAliased, 0) == noErr)
&& wasAliased)
{
return File (PlatformUtilities::makePathFromFSRef (&ref));
}
return *this;
}
//==============================================================================
bool File::moveToTrash() const throw()
{
if (! exists())
return true;
const ScopedAutoReleasePool pool;
NSString* p = juceStringToNS (getFullPathName());
return [[NSWorkspace sharedWorkspace]
performFileOperation: NSWorkspaceRecycleOperation
source: [p stringByDeletingLastPathComponent]
destination: @""
files: [NSArray arrayWithObject: [p lastPathComponent]]
tag: nil ];
}
//==============================================================================
struct FindFileStruct
{


+ 7
- 1
build/macosx/platform_specific_code/juce_mac_MiscUtilities.mm View File

@@ -171,8 +171,14 @@ static ScreenSaverDefeater* screenSaverDefeater = 0;
void Desktop::setScreenSaverEnabled (const bool isEnabled) throw()
{
if (screenSaverDefeater == 0)
if (isEnabled)
{
deleteAndZero (screenSaverDefeater);
}
else if (screenSaverDefeater == 0)
{
screenSaverDefeater = new ScreenSaverDefeater();
}
}
bool Desktop::isScreenSaverEnabled() throw()


+ 61
- 0
build/win32/platform_specific_code/juce_win32_Files.cpp View File

@@ -109,6 +109,29 @@ bool juce_deleteFile (const String& fileName) throw()
return DeleteFile (fileName) != 0;
}
bool File::moveToTrash() const throw()
{
if (! exists())
return true;
SHFILEOPSTRUCT fos;
zerostruct (fos);
// The string we pass in must be double null terminated..
String doubleNullTermPath (getFullPathName() + " ");
TCHAR* p = (TCHAR*) (const TCHAR*) doubleNullTermPath;
p [getFullPathName().length()] = 0;
fos.wFunc = FO_DELETE;
fos.hwnd = (HWND) 0;
fos.pFrom = p;
fos.pTo = NULL;
fos.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI | FOF_SILENT | FOF_NOCONFIRMATION
| FOF_NOCONFIRMMKDIR | FOF_RENAMEONCOLLISION;
return SHFileOperation (&fos) == 0;
}
bool juce_moveFile (const String& source, const String& dest) throw()
{
return MoveFile (source, dest) != 0;
@@ -501,6 +524,44 @@ bool File::setAsCurrentWorkingDirectory() const throw()
return SetCurrentDirectory (getFullPathName()) != FALSE;
}
//==============================================================================
const File File::getLinkedTarget() const throw()
{
File result (*this);
String p (getFullPathName());
if (! exists())
p += T(".lnk");
else if (getFileExtension() != T(".lnk"))
return result;
IShellLink* shellLink = 0;
if (SUCCEEDED (CoCreateInstance (CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*) &shellLink)))
{
IPersistFile* persistFile;
if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile)))
{
if (SUCCEEDED (persistFile->Load ((const WCHAR*) p, STGM_READ))
&& SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI)))
{
WIN32_FIND_DATA winFindData;
WCHAR resolvedPath [MAX_PATH];
if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY)))
result = File (resolvedPath);
}
persistFile->Release();
}
shellLink->Release();
}
return result;
}
//==============================================================================
template <class FindDataType>
static void getFindFileInfo (FindDataType& findData,


+ 56
- 0
build/win32/platform_specific_code/juce_win32_Windowing.cpp View File

@@ -2309,6 +2309,61 @@ void Desktop::setMousePosition (int x, int y) throw()
}
//==============================================================================
class ScreenSaverDefeater : public Timer,
public DeletedAtShutdown
{
public:
ScreenSaverDefeater() throw()
{
startTimer (10000);
timerCallback();
}
~ScreenSaverDefeater() {}
void timerCallback()
{
if (Process::isForegroundProcess())
{
// simulate a shift key getting pressed..
INPUT input[2];
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_SHIFT;
input[0].ki.dwFlags = 0;
input[0].ki.dwExtraInfo = 0;
input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = VK_SHIFT;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
input[1].ki.dwExtraInfo = 0;
SendInput (2, input, sizeof (INPUT));
}
}
};
static ScreenSaverDefeater* screenSaverDefeater = 0;
void Desktop::setScreenSaverEnabled (const bool isEnabled) throw()
{
if (isEnabled)
{
deleteAndZero (screenSaverDefeater);
}
else if (screenSaverDefeater == 0)
{
screenSaverDefeater = new ScreenSaverDefeater();
}
}
bool Desktop::isScreenSaverEnabled() throw()
{
return screenSaverDefeater == 0;
}
/* (The code below is the "correct" way to disable the screen saver, but it
completely fails on winXP when the saver is password-protected...)
static bool juce_screenSaverEnabled = true;
void Desktop::setScreenSaverEnabled (const bool isEnabled) throw()
@@ -2322,6 +2377,7 @@ bool Desktop::isScreenSaverEnabled() throw()
{
return juce_screenSaverEnabled;
}
*/
//==============================================================================
void juce_setKioskComponent (Component* kioskModeComponent, bool enableOrDisable)


+ 1
- 1
extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp View File

@@ -209,7 +209,7 @@ public:
{
MessageManager* const messageManager = MessageManager::getInstance();
const int64 originalThreadId = messageManager->getCurrentMessageThread();
const Thread::ThreadID originalThreadId = messageManager->getCurrentMessageThread();
messageManager->setCurrentMessageThread (Thread::getCurrentThreadId());
while ((! threadShouldExit()) && messageManager->runDispatchLoopUntil (250))


+ 48
- 44
extras/juce demo/build/linux/JuceDemo.make View File

@@ -5,19 +5,22 @@ ifndef CONFIG
CONFIG=Debug
endif

# if multiple archs are defined turn off automated dependency generation
DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)

ifeq ($(CONFIG),Debug)
BINDIR := build
LIBDIR := build
OBJDIR := build/intermediate/Debug
OUTDIR := build
CPPFLAGS := -MMD -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -I "/usr/include" -I "/usr/include/freetype2"
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -I "/usr/include" -I "/usr/include/freetype2"
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -D_DEBUG -ggdb
CXXFLAGS := $(CFLAGS)
CXXFLAGS += $(CFLAGS)
LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -mwindows -L"/usr/X11R6/lib/" -L"../../../../bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound
LDDEPS :=
RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -I "/usr/include" -I "/usr/include/freetype2"
TARGET := jucedemo
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
endif

ifeq ($(CONFIG),Release)
@@ -25,39 +28,39 @@ ifeq ($(CONFIG),Release)
LIBDIR := build
OBJDIR := build/intermediate/Release
OUTDIR := build
CPPFLAGS := -MMD -D "LINUX=1" -D "NDEBUG=1" -I "/usr/include" -I "/usr/include/freetype2"
CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -I "/usr/include" -I "/usr/include/freetype2"
CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -O2
CXXFLAGS := $(CFLAGS)
CXXFLAGS += $(CFLAGS)
LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -mwindows -s -L"/usr/X11R6/lib/" -L"../../../../bin" -lfreetype -lpthread -lrt -lX11 -lGL -lGLU -lXinerama -lasound
LDDEPS :=
RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -I "/usr/include" -I "/usr/include/freetype2"
TARGET := jucedemo
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)
endif

OBJECTS := \
$(OBJDIR)/MainDemoWindow.o \
$(OBJDIR)/ApplicationStartup.o \
$(OBJDIR)/juce_LibrarySource.o \
$(OBJDIR)/BinaryData.o \
$(OBJDIR)/PathsAndTransformsDemo.o \
$(OBJDIR)/juce_LibrarySource.o \
$(OBJDIR)/MainDemoWindow.o \
$(OBJDIR)/AudioDemo.o \
$(OBJDIR)/DragAndDropDemo.o \
$(OBJDIR)/ThreadingDemo.o \
$(OBJDIR)/FontsAndTextDemo.o \
$(OBJDIR)/InterprocessCommsDemo.o \
$(OBJDIR)/OpenGLDemo.o \
$(OBJDIR)/WidgetsDemo.o \
$(OBJDIR)/TreeViewDemo.o \
$(OBJDIR)/PathsAndTransformsDemo.o \
$(OBJDIR)/QuickTimeDemo.o \
$(OBJDIR)/InterprocessCommsDemo.o \
$(OBJDIR)/AudioDemo.o \
$(OBJDIR)/FontsAndTextDemo.o \
$(OBJDIR)/TableDemo.o \
$(OBJDIR)/ThreadingDemo.o \
$(OBJDIR)/TreeViewDemo.o \
$(OBJDIR)/WidgetsDemo.o \

MKDIR_TYPE := msdos
CMD := $(subst \,\\,$(ComSpec)$(COMSPEC))
ifeq (,$(CMD))
MKDIR_TYPE := posix
endif
ifeq (/bin/sh.exe,$(SHELL))
ifeq (/bin,$(findstring /bin,$(SHELL)))
MKDIR_TYPE := posix
endif
ifeq ($(MKDIR_TYPE),posix)
@@ -84,87 +87,88 @@ $(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES)
clean:
@echo Cleaning JuceDemo
ifeq ($(MKDIR_TYPE),posix)
-@rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR)
-@rm -f $(OUTDIR)/$(TARGET)
-@rm -rf $(OBJDIR)
else
-@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET))
-@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR))
-@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR))
endif

$(OBJDIR)/MainDemoWindow.o: ../../src/MainDemoWindow.cpp
$(OBJDIR)/ApplicationStartup.o: ../../src/ApplicationStartup.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/ApplicationStartup.o: ../../src/ApplicationStartup.cpp
$(OBJDIR)/BinaryData.o: ../../src/BinaryData.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/juce_LibrarySource.o: ../../src/juce_LibrarySource.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/BinaryData.o: ../../src/BinaryData.cpp
$(OBJDIR)/MainDemoWindow.o: ../../src/MainDemoWindow.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/PathsAndTransformsDemo.o: ../../src/demos/PathsAndTransformsDemo.cpp
$(OBJDIR)/AudioDemo.o: ../../src/demos/AudioDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/DragAndDropDemo.o: ../../src/demos/DragAndDropDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/ThreadingDemo.o: ../../src/demos/ThreadingDemo.cpp
$(OBJDIR)/FontsAndTextDemo.o: ../../src/demos/FontsAndTextDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/OpenGLDemo.o: ../../src/demos/OpenGLDemo.cpp
$(OBJDIR)/InterprocessCommsDemo.o: ../../src/demos/InterprocessCommsDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/WidgetsDemo.o: ../../src/demos/WidgetsDemo.cpp
$(OBJDIR)/OpenGLDemo.o: ../../src/demos/OpenGLDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/TreeViewDemo.o: ../../src/demos/TreeViewDemo.cpp
$(OBJDIR)/PathsAndTransformsDemo.o: ../../src/demos/PathsAndTransformsDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/QuickTimeDemo.o: ../../src/demos/QuickTimeDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/InterprocessCommsDemo.o: ../../src/demos/InterprocessCommsDemo.cpp
$(OBJDIR)/TableDemo.o: ../../src/demos/TableDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/AudioDemo.o: ../../src/demos/AudioDemo.cpp
$(OBJDIR)/ThreadingDemo.o: ../../src/demos/ThreadingDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/FontsAndTextDemo.o: ../../src/demos/FontsAndTextDemo.cpp
$(OBJDIR)/TreeViewDemo.o: ../../src/demos/TreeViewDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

$(OBJDIR)/TableDemo.o: ../../src/demos/TableDemo.cpp
$(OBJDIR)/WidgetsDemo.o: ../../src/demos/WidgetsDemo.cpp
-@$(CMD_MKOBJDIR)
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) -o $@ -c $<
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"

-include $(OBJECTS:%.o=%.d)


+ 195
- 10
juce_amalgamated.cpp View File

@@ -19240,11 +19240,11 @@ END_JUCE_NAMESPACE
#if JUCE_QUICKTIME

#if ! defined (_WIN32)
#include <Quicktime/Movies.h>
#include <Quicktime/QTML.h>
#include <Quicktime/QuickTimeComponents.h>
#include <Quicktime/MediaHandlers.h>
#include <Quicktime/ImageCodec.h>
#include <QuickTime/Movies.h>
#include <QuickTime/QTML.h>
#include <QuickTime/QuickTimeComponents.h>
#include <QuickTime/MediaHandlers.h>
#include <QuickTime/ImageCodec.h>
#else
#ifdef _MSC_VER
#pragma warning (push)
@@ -21067,6 +21067,9 @@ void BufferingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info
}

nextPlayPos += info.numSamples;

if (source->isLooping() && nextPlayPos > 0)
nextPlayPos %= source->getTotalLength();
}

SharedBufferingAudioSourceThread* const thread = SharedBufferingAudioSourceThread::getInstanceWithoutCreating();
@@ -239808,6 +239811,29 @@ bool juce_deleteFile (const String& fileName) throw()
return DeleteFile (fileName) != 0;
}

bool File::moveToTrash() const throw()
{
if (! exists())
return true;

SHFILEOPSTRUCT fos;
zerostruct (fos);

// The string we pass in must be double null terminated..
String doubleNullTermPath (getFullPathName() + " ");
TCHAR* p = (TCHAR*) (const TCHAR*) doubleNullTermPath;
p [getFullPathName().length()] = 0;

fos.wFunc = FO_DELETE;
fos.hwnd = (HWND) 0;
fos.pFrom = p;
fos.pTo = NULL;
fos.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI | FOF_SILENT | FOF_NOCONFIRMATION
| FOF_NOCONFIRMMKDIR | FOF_RENAMEONCOLLISION;

return SHFileOperation (&fos) == 0;
}

bool juce_moveFile (const String& source, const String& dest) throw()
{
return MoveFile (source, dest) != 0;
@@ -240190,6 +240216,42 @@ bool File::setAsCurrentWorkingDirectory() const throw()
return SetCurrentDirectory (getFullPathName()) != FALSE;
}

const File File::getLinkedTarget() const throw()
{
File result (*this);
String p (getFullPathName());

if (! exists())
p += T(".lnk");
else if (getFileExtension() != T(".lnk"))
return result;

IShellLink* shellLink = 0;
if (SUCCEEDED (CoCreateInstance (CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*) &shellLink)))
{
IPersistFile* persistFile;
if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile)))
{
if (SUCCEEDED (persistFile->Load ((const WCHAR*) p, STGM_READ))
&& SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI)))
{
WIN32_FIND_DATA winFindData;
WCHAR resolvedPath [MAX_PATH];

if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY)))
result = File (resolvedPath);
}

persistFile->Release();
}

shellLink->Release();
}

return result;
}

template <class FindDataType>
static void getFindFileInfo (FindDataType& findData,
String& filename, bool* const isDir, bool* const isHidden,
@@ -243556,6 +243618,61 @@ void Desktop::setMousePosition (int x, int y) throw()
SetCursorPos (x, y);
}

class ScreenSaverDefeater : public Timer,
public DeletedAtShutdown
{
public:
ScreenSaverDefeater() throw()
{
startTimer (10000);
timerCallback();
}

~ScreenSaverDefeater() {}

void timerCallback()
{
if (Process::isForegroundProcess())
{
// simulate a shift key getting pressed..
INPUT input[2];
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_SHIFT;
input[0].ki.dwFlags = 0;
input[0].ki.dwExtraInfo = 0;

input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = VK_SHIFT;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
input[1].ki.dwExtraInfo = 0;

SendInput (2, input, sizeof (INPUT));
}
}
};

static ScreenSaverDefeater* screenSaverDefeater = 0;

void Desktop::setScreenSaverEnabled (const bool isEnabled) throw()
{
if (isEnabled)
{
deleteAndZero (screenSaverDefeater);
}
else if (screenSaverDefeater == 0)
{
screenSaverDefeater = new ScreenSaverDefeater();
}
}

bool Desktop::isScreenSaverEnabled() throw()
{
return screenSaverDefeater == 0;
}

/* (The code below is the "correct" way to disable the screen saver, but it
completely fails on winXP when the saver is password-protected...)

static bool juce_screenSaverEnabled = true;

void Desktop::setScreenSaverEnabled (const bool isEnabled) throw()
@@ -243569,6 +243686,7 @@ bool Desktop::isScreenSaverEnabled() throw()
{
return juce_screenSaverEnabled;
}
*/

void juce_setKioskComponent (Component* kioskModeComponent, bool enableOrDisable)
{
@@ -254286,6 +254404,35 @@ bool File::setAsCurrentWorkingDirectory() const throw()
return chdir (getFullPathName().toUTF8()) == 0;
}

const File File::getLinkedTarget() const throw()
{
char buffer [4096];
size_t numChars = readlink ((const char*) getFullPathName().toUTF8(),
buffer, sizeof (buffer));

if (numChars > 0 && numChars <= sizeof (buffer))
return File (String::fromUTF8 ((const uint8*) buffer, (int) numChars));

return *this;
}

bool File::moveToTrash() const throw()
{
if (! exists())
return true;

File trashCan (T("~/.Trash"));

if (! trashCan.isDirectory())
trashCan = T("~/.local/share/Trash/files");

if (! trashCan.isDirectory())
return false;

return moveFileTo (trashCan.getNonexistentChildFile (getFileNameWithoutExtension(),
getFileExtension()));
}

struct FindFileStruct
{
String parentDir, wildCard;
@@ -254430,7 +254577,7 @@ bool juce_launchFile (const String& fileName,
if (cmdString.startsWithIgnoreCase (T("file:")))
cmdString = cmdString.substring (5);

char* const argv[4] = { "/bin/sh", "-c", (char*) cmdString.toUTF8(), 0 };
const char* const argv[4] = { "/bin/sh", "-c", (const char*) cmdString.toUTF8(), 0 };

const int cpid = fork();

@@ -254439,7 +254586,7 @@ bool juce_launchFile (const String& fileName,
setsid();

// Child process
execve (argv[0], argv, environ);
execve (argv[0], (char**) argv, environ);
exit (0);
}

@@ -255147,8 +255294,8 @@ BEGIN_JUCE_NAMESPACE

void Logger::outputDebugString (const String& text) throw()
{
fprintf (stdout, text.toUTF8());
fprintf (stdout, "\n");
fputs (text.toUTF8(), stdout);
fputs ("\n", stdout);
}

void Logger::outputDebugPrintf (const tchar* format, ...) throw()
@@ -264283,6 +264430,38 @@ bool File::setAsCurrentWorkingDirectory() const throw()
return chdir (getFullPathName().toUTF8()) == 0;
}

const File File::getLinkedTarget() const throw()
{
FSRef ref;
Boolean targetIsAFolder, wasAliased;

if (PlatformUtilities::makeFSRefFromPath (&ref, getFullPathName())
&& (FSResolveAliasFileWithMountFlags (&ref, true, &targetIsAFolder, &wasAliased, 0) == noErr)
&& wasAliased)
{
return File (PlatformUtilities::makePathFromFSRef (&ref));
}

return *this;
}

bool File::moveToTrash() const throw()
{
if (! exists())
return true;

const ScopedAutoReleasePool pool;

NSString* p = juceStringToNS (getFullPathName());

return [[NSWorkspace sharedWorkspace]
performFileOperation: NSWorkspaceRecycleOperation
source: [p stringByDeletingLastPathComponent]
destination: @""
files: [NSArray arrayWithObject: [p lastPathComponent]]
tag: nil ];
}

struct FindFileStruct
{
String parentDir, wildCard;
@@ -264628,8 +264807,14 @@ static ScreenSaverDefeater* screenSaverDefeater = 0;

void Desktop::setScreenSaverEnabled (const bool isEnabled) throw()
{
if (screenSaverDefeater == 0)
if (isEnabled)
{
deleteAndZero (screenSaverDefeater);
}
else if (screenSaverDefeater == 0)
{
screenSaverDefeater = new ScreenSaverDefeater();
}
}

bool Desktop::isScreenSaverEnabled() throw()


+ 14
- 0
juce_amalgamated.h View File

@@ -6341,6 +6341,12 @@ public:
*/
bool isHidden() const throw();

/** If this file is a link, this returns the file that it points to.

If this file isn't actually link, it'll just return itself.
*/
const File getLinkedTarget() const throw();

/** Returns the last modification time of this file.

@returns the time, or an invalid time if the file doesn't exist.
@@ -6431,6 +6437,14 @@ public:
*/
bool deleteRecursively() const throw();

/** Moves this file or folder to the trash.

@returns true if the operation succeeded. It could fail if the trash is full, or
if the file is write-protected, so you should check the return value
and act appropriately.
*/
bool moveToTrash() const throw();

/** Moves or renames a file.

Tries to move a file to a different location.


+ 5
- 5
src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.cpp View File

@@ -34,11 +34,11 @@
#if JUCE_QUICKTIME
#if ! defined (_WIN32)
#include <Quicktime/Movies.h>
#include <Quicktime/QTML.h>
#include <Quicktime/QuickTimeComponents.h>
#include <Quicktime/MediaHandlers.h>
#include <Quicktime/ImageCodec.h>
#include <QuickTime/Movies.h>
#include <QuickTime/QTML.h>
#include <QuickTime/QuickTimeComponents.h>
#include <QuickTime/MediaHandlers.h>
#include <QuickTime/ImageCodec.h>
#else
#ifdef _MSC_VER
#pragma warning (push)


+ 3
- 0
src/juce_appframework/audio/audio_sources/juce_BufferingAudioSource.cpp View File

@@ -244,6 +244,9 @@ void BufferingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info
}
nextPlayPos += info.numSamples;
if (source->isLooping() && nextPlayPos > 0)
nextPlayPos %= source->getTotalLength();
}
SharedBufferingAudioSourceThread* const thread = SharedBufferingAudioSourceThread::getInstanceWithoutCreating();


+ 14
- 0
src/juce_core/io/files/juce_File.h View File

@@ -352,6 +352,12 @@ public:
*/
bool isHidden() const throw();
/** If this file is a link, this returns the file that it points to.
If this file isn't actually link, it'll just return itself.
*/
const File getLinkedTarget() const throw();
//==============================================================================
/** Returns the last modification time of this file.
@@ -444,6 +450,14 @@ public:
*/
bool deleteRecursively() const throw();
/** Moves this file or folder to the trash.
@returns true if the operation succeeded. It could fail if the trash is full, or
if the file is write-protected, so you should check the return value
and act appropriately.
*/
bool moveToTrash() const throw();
/** Moves or renames a file.
Tries to move a file to a different location.


Loading…
Cancel
Save