Merge branch 'master' into sam460ex

This commit is contained in:
François Revol
2012-12-27 15:50:06 +01:00
28 changed files with 727 additions and 255 deletions
+2 -2
View File
@@ -14,9 +14,9 @@ SYSTEM_BIN = "[" addattr base64 basename bash beep cal cat catattr checkfs
id ifconfig <bin>install isvolume join kernel_debugger kill less lessecho
lesskey link linkcatkeys listdev ln locale locate logger logname ls
makebootable md5sum mimeset mkdir mkfifo mkfs mktemp mount mountvolume
mv nl nohup notify nproc od paste patch pathchk ping pr printenv printf
mv nl nohup notify nproc od open paste patch pathchk ping pr printenv printf
ps ptx pwd query rc readlink ReadOnlyBootPrompt rm rmattr rmdir safemode
sdiff seq sha1sum shred shuf sleep sort split stat strace stty su sum sync
sdiff seq sha1sum shred shuf shutdown sleep sort split stat strace stty su sum sync
sysinfo tac tail tee test timeout touch tr true truncate tsort tty unexpand
uname uniq unlink unmount unzip <bin>updatedb waitfor wc wget whoami xargs
xres yes zdiff zforce zgrep zip zipcloak <bin>zipgrep zipnote zipsplit
+138
View File
@@ -0,0 +1,138 @@
/*
* Copyright 2012 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* John Scipione, [email protected]
*
* Corresponds to:
* src/kits/game/FileGameSound.cpp hrev45076
* src/kits/game/FileGameSound.h hrev45076
*/
/*!
\file FileGameSound.h
\brief Provides the BFileGameSound class.
*/
/*!
\class BFileGameSound
\ingroup game
\ingroup libbe
\brief Playback audio from a sound file on disk.
*/
/*!
\fn BFileGameSound::BFileGameSound(const entry_ref *file, bool looping,
BGameSoundDevice *device)
\brief Creates and initializes a BFileGameSound object from an
\c entry_ref allowing you to play the specified sound file.
If \a looping is \c true, the sound automatically replays from the
beginning once the end is reached. This is useful for playing
background music in a loop.
You can specify the sound devise to use by setting the \a device
parameter. Setting \a device to \c NULL uses the default sound device.
\param file The entry ref pointing to the sound file on disk.
\param looping Whether or not to repeat the sound in a loop.
\param device The sound device to use to play the sound, use \c NULL for
default.
*/
/*!
\fn BFileGameSound::BFileGameSound(const char *file, bool looping,
BGameSoundDevice *device)
\brief Creates and initializes a BFileGameSound object from a file path
allowing you to play the specified sound file.
If \a looping is \c true, the sound automatically replays from the
beginning once the end is reached. This is useful for playing
background music in a loop.
You can specify the sound devise to use by setting the \a device
parameter. Setting \a device to \c NULL uses the default sound device.
\param file The path of the sound file on disk.
\param looping Whether or not to repeat the sound in a loop.
\param device The sound device to use to play the sound, use \c NULL for
default.
*/
/*!
\fn BFileGameSound::~BFileGameSound()
\brief Destroys the BFileGameSound object.
*/
/*!
\fn BGameSound* BFileGameSound::Clone() const
\brief Not implemented, always returns \c NULL.
*/
/*!
\fn status_t BFileGameSound::StartPlaying()
\brief Plays the sound file.
\returns A status code, \c B_OK on success or an error code on error.
*/
/*!
\fn status_t BFileGameSound::StopPlaying()
\brief Stops playback of the sound file.
\returns A status code, \c B_OK on success or an error code on error.
*/
/*!
\fn status_t BFileGameSound::Preload()
\brief Preload the sound file into memory so that playback won't be delayed.
\returns A status code, \c B_OK on success or an error code if we were
unable to communicate with the sound port.
*/
/*!
\fn void BFileGameSound::FillBuffer(void *inBuffer, size_t inByteCount)
\brief Fill a buffer with sound data.
\param inBuffer The buffer to fill.
\param inByteCount The number of bytes to fill buffer with.
*/
/*!
\fn status_t BFileGameSound::SetPaused(bool isPaused, bigtime_t rampTime)
\brief Pauses playback if \a isPaused is \c true or resumes play if
\a isPaused is \c false.
\param isPaused \c true to pause playback, \c false to resume playback.
\param rampTime Determines how long the change in playback state should
take to complete in microseconds. Set to 0 for an instantaneous
change.
\returns A status code.
\retval B_OK The playback state was updated.
\retval EALREADY Already in the requested playback state.
*/
/*!
\fn int32 BFileGameSound::IsPaused()
\brief Returns the current playback status.
\returns An integer indicating the current playback status.
\retval B_NOT_PAUSED Sound is playing.
\retval B_PAUSE_IN_PROGRESS The sound is transitioning to or from a paused state.
\retval B_PAUSED Sound is paused.
*/
+65 -40
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2011, Haiku, Inc. All Rights Reserved.
* Copyright 2011-2012 Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@@ -8,8 +8,8 @@
* Oliver Tappe, [email protected]
*
* Corresponds to:
* /trunk/headers/os/locale/Catalog.h rev 43095
* /trunk/src/kits/locale/Catalog.cpp rev 43095
* /trunk/headers/os/locale/Catalog.h hrev45083
* /trunk/src/kits/locale/Catalog.cpp hrev45083
*/
@@ -22,7 +22,8 @@
/*!
\class BCatalog
\ingroup locale
\brief Class handling string localization.
\ingroup libbe
\brief String localization handling.
BCatalog is the class that allows you to perform string localization. This
means you give it a string in english, and it automatically returns the
@@ -31,13 +32,13 @@
Most of the time, you don't have to deal with BCatalog directly. You use
the translation macros instead. However, there are some cases where you
will have to use catalogs directly. These include :
\li Tools for managing catalogs : if you want to add, remove or edit
entries in a catalog, you need to do it using the BCatalog class.
\li Accessing catalogs other than your own : the macros only grant you
access to the catalog linked with your application. To access
other catalogs (for example if you create a script interpreter and
want to localize the scripts), you will have to open a catalog
associated with your script.
- Tools for managing catalogs : if you want to add, remove or edit
entries in a catalog, you need to do it using the BCatalog class.
- Accessing catalogs other than your own : the macros only grant you
access to the catalog linked with your application. To access
other catalogs (for example if you create a script interpreter and
want to localize the scripts), you will have to open a catalog
associated with your script.
\section macros Using the macros
You don't have to do much in your program to handle catalogs. You must
@@ -58,13 +59,13 @@
For example, if the user sets his language preferences as french(France),
spanish, english, when an application loads a catalog, the following rules
are used :
\li Try to load a french(France) catalog. If it is found, this catalog
will automatically include strings from the generic french catalog.
\li Try to load a generic french catalog.
\li Try to load a generic spanish catalog.
\li Try to load a generic english catalog.
\li If all of them failed, use the strings that are in the source code.
are used:
- Try to load a french(France) catalog. If it is found, this catalog
will automatically include strings from the generic french catalog.
- Try to load a generic french catalog.
- Try to load a generic spanish catalog.
- Try to load a generic english catalog.
- If all of them failed, use the strings that are in the source code.
Note that french(France) will failback to french, but then directly to the
language in the source code. This avoids mixing 3 or more languages in the
@@ -73,9 +74,17 @@
/*!
\fn BCatalog::Catalog(const entry_ref& catalogOwner,
const char* language = NULL, uint32 fingerprint = 0);
\brief Construct a catalog for the given \a catalogOwner.
\fn BCatalog::BCatalog()
\brief Construct an empty BCatalog object.
Should be followed by SetTo() method to set the catalog.
*/
/*!
\fn BCatalog::BCatalog(const entry_ref& catalogOwner, const char* language,
uint32 fingerprint)
\brief Construct a BCatalog object for the given \a catalogOwner.
If you don't specify a language, the system default list will be used.
The language is passed here as a 2 letter ISO code.
@@ -97,9 +106,15 @@
*/
/*!
\fn BCatalog::~BCatalog()
\brief Destroys the BCatalog object freeing memory used by it.
*/
/*!
\fn const char* BCatalog::GetString(const char* string,
const char* context = NULL, const char* comment = NULL)
const char* context, const char* comment)
\brief Get a string from the catalog.
This method access the data of the catalog and reeturns you the translated
@@ -133,6 +148,7 @@
all the catalog files under control.
\param id The identifier of the string.
\returns The translated string if found, or an empty string.
*/
@@ -150,7 +166,12 @@
\param name The name of the data to retrieve.
\param msg The BMessage to fill in with the data.
\returns An error code.
\returns A status code.
\retval B_OK Everything went fine.
\retval B_ERROR Unable to get an exclusive lock on data.
\retval B_NO_INIT Catalog is \c NULL.
\retval B_NAME_NOT_FOUND catalog with the specified \a name could not be
found.
*/
@@ -189,6 +210,10 @@
\param lang The string where to copy the language.
\returns An error code.
\retval B_OK Everything went as expected.
\retval B_ERROR Could not get exclusive lock on catalog.
\retval B_BAD_VALUE \a lang is \c NULL.
\retval B_NO_INIT Catalog data is \c NULL.
*/
@@ -202,43 +227,43 @@
\param fp The integer to set to the fingerprint value.
\returns An error code.
\retval B_OK Everything went as expected.
\retval B_ERROR Could not get exclusive lock on catalog.
\retval B_BAD_VALUE \a fp is \c NULL.
\retval B_NO_INIT Catalog data is \c NULL.
*/
/*!
\fn status_t BCatalog::SetCatalog(const entry_ref& catalogOwner,
uint32 fingerprint)
\fn status_t BCatalog::SetTo(const entry_ref& catalogOwner,
const char* language, uint32 fingerprint)
\brief Reload the string data.
This method reloads the data for the given signature and fingerprint.
\param catalogOwner The entry_ref of the catalog that you want to load.
\param catalogOwner The \c entry_ref of the catalog that you want to load.
\param language The language of the catalog to load. If \c NULL, the user
settings will be used.
\param fingerprint The fingerprint of the catalog you want to load.
\returns An error code.
\returns A status code, \c B_OK on success, \c B_ERROR on error.
*/
/*!
\fn status_t BCatalog::InitCheck() const
\brief Check if the catalog is in an useable state.
\brief Check if the catalog is in a valid and usable state.
\returns \c B_OK if the catalog is initialized properly.
\returns A status code.
\retval B_OK The catalog is initialized properly.
\retval B_ERROR Could not get exclusive lock on catalog.
\retval B_NO_INIT Catalog data is \c NULL.
*/
/*!
\fn int32 BCatalog::CountItems()
\brief Returns the number of items in the catalog.
\brief Gets the number of items in the catalog.
\returns the number of strings in the catalog.
*/
/*!
\fn BCatalogaddOn* BCatalog::CatalogAddOn()
\brief Returns the internal storage for this catalog.
\returns the internal storage class used by this catalog. You should
not have to use it.
\returns the number of strings in the catalog or 0 on error.
*/
+79 -25
View File
@@ -4,55 +4,109 @@
*
* Authors:
* Adrien Destugues, [email protected]
* John Scipione, [email protected]
*
* Corresponds to:
* /trunk/headers/os/locale/DurationFormat.h rev 42944
* /trunk/src/kits/locale/DurationFormat.cpp rev 42944
* /trunk/headers/os/locale/DurationFormat.h hrev45084
* /trunk/src/kits/locale/DurationFormat.cpp hrev45084
*/
/*!
\class BDurationFormat
\ingroup locale
\brief Formatter for time interfals
\class BDurationFormat
\ingroup locale
\ingroup libbe
\brief Formatter for time intervals.
BDurationFormat is a formatter for time intervals. A time interval is defined
by its start and end values, and the result is a string such as
"1 hour, 2 minutes, 28 seconds".
BDurationFormat is a formatter for time intervals. A time interval is
defined by its start and end values, and the result is a string such as
"1 hour, 2 minutes, 28 seconds".
*/
/*!
\fn BDurationFormat::BDurationFormat(const BString& separator)
\brief Constructor.
\fn BDurationFormat::BDurationFormat(const BString& separator)
\brief Constructor.
\warning Creating a BDurationFormat is a costly operation. Most of the time,
you most likely want to use the default one through the BLocale class.
\warning Creating a BDurationFormat is a costly operation. Most of the
time want to use the default one through the BLocale class.
The separator string will be appended between the elements of formated
durations.
\param separator String appended between the duration elements.
*/
/*!
\fn void BDurationFormat::SetSeparator(cosnt BString& separator)
\brief Replace the spearator for this formatter.
\fn BDurationFormat::BDurationFormat(const BDurationFormat& other)
\brief Copy Constructor.
\param other The BDurationFormat object to copy from.
*/
/*!
\fn status_t BDurationForamt::SetLocale(const BLocale* locale)
\brief Sets the locale for this formatter.
\fn BDurationFormat::~BDurationFormat()
\brief Destructor.
*/
/*!
\fn status_t BDurationFormat::Format(bigtime_t startValue,
bigtime_t endValue, BString* buffer, time_unit_style = B_TIME_UNIT_FULL)
const;
\brief Formats a duration defined by its start and end values.
\fn BDurationFormat&
BDurationFormat::operator=(const BDurationFormat& other)
\brief Assignment overload.
The start and end values are in milliseconds. The result is appeded to the
buffer. The full time style uses full words (hours, minuts, seconds), while the
shot one uses units (h, m, s).
\param other The BDurationFormat object to copy from.
\returns The resulting BDurationFormat object.
*/
/*!
\fn void BDurationFormat::SetSeparator(const BString& separator)
\brief Replace the separator for this formatter.
\param separator The separator string to set.
*/
/*!
\fn status_t BDurationFormat::SetLocale(const BLocale* locale)
\brief Sets the locale for this formatter.
\param locale The BLocale object to set.
\returns A status code, \c B_OK on success or an error code on error.
*/
/*!
\fn status_t BDurationFormat::SetTimeZone(const BTimeZone* timeZone)
\brief Sets the timezone for this formatter.
\param timeZone The BTimeZone object to set.
\returns A status code.
\retval B_OK Everything went fine.
\retval B_NO_INIT Format object is \c NULL.
\retval B_ERROR Other errors.
*/
/*!
\fn status_t BDurationFormat::Format(bigtime_t startValue,
bigtime_t stopValue, BString* buffer, time_unit_style style) const
\brief Formats a duration defined by its start and end values.
The start and end values are in milliseconds. The result is appended to
the buffer. The full time style uses full words (hours, minutes, seconds),
while the short one uses units (h, m, s).
\param startValue The start value in milliseconds.
\param stopValue The stop value in milliseconds.
\param buffer The buffer to fill out.
\param style The time unit style to use.
\returns A status code.
\retval B_OK Everything went fine.
\retval B_BAD_VALUE Buffer was \c NULL.
\retval B_ERROR Formatting error.
*/
+175
View File
@@ -0,0 +1,175 @@
/*
* Copyright 2012 Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* John Scipione, [email protected]
*
* Corresponds to:
* /trunk/headers/os/media/FileInterface.h hrev45081
* /trunk/src/kits/media/FileInterface.cpp hrev45081
*/
/*!
\file FileInterface.h
\brief Provides BFileInterface abstract class.
*/
/*!
\class BFileInterface
\ingroup media
\ingroup libbe
\brief A node that can read and write data to a file on disk.
You should derive your subclass from BFileInterface so that your
application may specify the file that the node will reference.
The Media Server will then call upon the node to try to identify
and work with files that are hereunto unknown to it.
Your node must also derive from BBufferConsumer or BBufferProducer,
in addition to BFileInterface.
*/
/*!
\fn BFileInterface::BFileInterface()
\brief Constructor.
*/
/*!
\fn BFileInterface::~BFileInterface()
\brief Destructor.
*/
/*!
\fn status_t BFileInterface::HandleMessage(int32 message,
const void *data, size_t size)
\brief Dispatches a message to the appropriate BMediaNode hook method
given a message received on the control port. Implement this method
to handle messages that arrive on your control port.
\param message The message identifier.
\param data The message data.
\param size The size of the message data in bytes.
\returns A status code.
\retval B_OK Message was dispatched.
\retval B_ERROR There was an error dispatching the message, possibly
because it doesn't correspond to a hook function.
\see BMediaNode::HandleMessage() for details.
*/
/*!
\fn status_t BFileInterface::GetNextFileFormat(int32* cookie,
media_file_format* _format) = 0;
\brief Implement this method to fill out information about a file format
indexed by \a cookie.
The first time this method is called \a cookie will be set to 0.
In your implementation you should set information about the first
file format you support in \a _format and set \a cookie to some
meaningful non-zero value to track your positing in the list of
supported formats, then return \c B_OK.
On successive calls return successive file format information and update
\a cookie to track your position in the list. Each time you return new
information about a file format return \c B_OK.
Once you run out of formats return \c B_ERROR.
\param cookie Index of file format to fill out.
\param _format Pointer to a preallocated \c media_file_format object to
fill out.
\return \c B_OK if a file format was filled out for \a cookie, \c B_ERROR
or an appropriate error code otherwise.
*/
/*!
\fn void BFileInterface::DisposeFileFormatCookie(int32 cookie) = 0;
\brief Implement this method to dispose of a file format supported by your
node indexed by \a cookie.
You are responsible for freeing any data blocks associated with this
\a cookie before returning.
\param cookie Index of the cookie you wish to dispose of.
*/
/*!
\fn status_t BFileInterface::GetDuration(bigtime_t* _time) = 0;
\brief Implement this method to fill out the duration in microseconds of
the media data contained in the currently referenced file in
\a _time.
\param _time The duration parameter to fill out.
\return A status code, typically \c B_OK on success and \c B_ERROR
or another error code on error.
*/
/*!
\fn status_t BFileInterface::SniffRef(const entry_ref& file,
char* _mimeType, float* _quality) = 0;
\brief Implement this method to allow the Media Roster to identify
a file format associated with this node.
If you can handle the format, set \a _mimeType to the MIME type
of the file format and set \a _quality to indicate how well you
can process the file.
A \a _quality of 0.0 means that you can't handle the file format
at all and an \a _quality of 1.0 means you have total control over
the file format.
\param file The file being sniffed.
\param _mimeType Fill this out with the appropriate MIME type.
\param _quality How well you are able to handle the file format
from 0.0 to 1.0.
\return \c B_OK if you can identify the file's contents, otherwise return
an appropriate error code. If you can't handle the file format at
all, you should return \c B_MEDIA_NO_HANDLER.
*/
/*!
\fn status_t BFileInterface::SetRef(const entry_ref& file, bool create,
bigtime_t* _time) = 0;
\brief Used when an application wants your node to use a specific file.
The file specified by \a file may or may not exist.
If create is \c false you should try to open the existing file, and if
successful you should write the running time of the file into \a _time.
If you the file does not exist you should return \c B_ENTRY_NOT_FOUND.
If \a create is \c true you should create a new file, initialize the file
for writing, and store 0 in \a _time. You should overwrite the file if
it already exists.
\return \c B_OK on success or an appropriate error code such as \c B_ERROR
or \c B_ENTRY_NOT_FOUND on error.
*/
/*!
\fn status_t BFileInterface::GetRef(entry_ref* _ref, char* _mimeType) = 0;
\brief Implement to set the \c entry_ref and the MIME type of the file
referenced by the current node.
\param _ref Set to the \c entry_ref of the file.
\param _mimeType Set to the MIME type of the current file.
\return \c B_OK on success or an appropriate error code such as \c B_ERROR
on error.
*/
@@ -36,6 +36,7 @@
#define INTEL_TYPE_IGD (INTEL_TYPE_9xx | 0x0800)
#define INTEL_TYPE_ILK (INTEL_TYPE_9xx | 0x1000)
#define INTEL_TYPE_SNB (INTEL_TYPE_9xx | 0x2000)
#define INTEL_TYPE_IVB (INTEL_TYPE_9xx | 0x4000)
// models
#define INTEL_TYPE_SERVER 0x0004
#define INTEL_TYPE_MOBILE 0x0008
@@ -55,6 +56,9 @@
#define INTEL_TYPE_SNBG (INTEL_TYPE_SNB)
#define INTEL_TYPE_SNBGM (INTEL_TYPE_SNB | INTEL_TYPE_MOBILE)
#define INTEL_TYPE_SNBGS (INTEL_TYPE_SNB | INTEL_TYPE_SERVER)
#define INTEL_TYPE_IVBG (INTEL_TYPE_IVB)
#define INTEL_TYPE_IVBGM (INTEL_TYPE_IVB | INTEL_TYPE_MOBILE)
#define INTEL_TYPE_IVBGS (INTEL_TYPE_IVB | INTEL_TYPE_SERVER)
#define DEVICE_NAME "intel_extreme"
#define INTEL_ACCELERANT_NAME "intel_extreme.accelerant"
@@ -84,7 +84,13 @@ const struct supported_device {
{0x0106, INTEL_TYPE_SNBGM, "SandyBridge Mobile GT1"},
{0x0116, INTEL_TYPE_SNBGM, "SandyBridge Mobile GT2"},
{0x0126, INTEL_TYPE_SNBGM, "SandyBridge Mobile GT2+"},
{0x010a, INTEL_TYPE_SNBGS, "SandyBridge Server"}
{0x010a, INTEL_TYPE_SNBGS, "SandyBridge Server"},
{0x0152, INTEL_TYPE_IVBG, "IvyBridge Desktop GT1"},
{0x0162, INTEL_TYPE_IVBG, "IvyBridge Desktop GT2"},
{0x0156, INTEL_TYPE_IVBGM, "IvyBridge Mobile GT1"},
{0x0166, INTEL_TYPE_IVBGM, "IvyBridge Mobile GT2"},
{0x015a, INTEL_TYPE_IVBGS, "IvyBridge Server GT1"}
};
int32 api_version = B_CUR_DRIVER_API_VERSION;
@@ -60,7 +60,7 @@ find_reg(const intel_info& info, uint32 target)
RETURN_REG(INTERRUPT_STATUS)
}
#undef RETURN_REG;
#undef RETURN_REG
panic("find_reg didn't have any matching register\n");
return target;
+7 -5
View File
@@ -94,7 +94,8 @@ Architecture::InitRegisterRules(CfaContext& context) const
status_t
Architecture::CreateStackTrace(Team* team,
ImageDebugInfoProvider* imageInfoProvider, CpuState* cpuState,
StackTrace*& _stackTrace, int32 maxStackDepth, bool useExistingTrace)
StackTrace*& _stackTrace, int32 maxStackDepth, bool useExistingTrace,
bool getFullFrameInfo)
{
BReference<CpuState> cpuStateReference(cpuState);
@@ -161,8 +162,8 @@ Architecture::CreateStackTrace(Team* team,
CpuState* previousCpuState = NULL;
if (function != NULL) {
status_t error = functionDebugInfo->GetSpecificImageDebugInfo()
->CreateFrame(image, function, cpuState, frame,
previousCpuState);
->CreateFrame(image, function, cpuState, getFullFrameInfo,
frame, previousCpuState);
if (error != B_OK && error != B_UNSUPPORTED)
break;
}
@@ -170,7 +171,8 @@ Architecture::CreateStackTrace(Team* team,
// If we have no frame yet, let the architecture create it.
if (frame == NULL) {
status_t error = CreateStackFrame(image, functionDebugInfo,
cpuState, nextFrame == NULL, frame, previousCpuState);
cpuState, nextFrame == NULL, frame,
previousCpuState);
if (error != B_OK)
break;
}
@@ -185,7 +187,7 @@ Architecture::CreateStackTrace(Team* team,
return B_NO_MEMORY;
}
frame = nextFrame;
nextFrame = frame;
cpuState = previousCpuState;
if (--maxStackDepth == 0)
break;
+2 -1
View File
@@ -109,7 +109,8 @@ public:
CpuState* cpuState,
StackTrace*& _stackTrace,
int32 maxStackDepth = -1,
bool useExistingTrace = false);
bool useExistingTrace = false,
bool getFullFrameInfo = true);
// team is not locked
virtual status_t GetWatchpointDebugCapabilities(
@@ -303,7 +303,39 @@ ArchitectureX8664::UpdateStackFrameCpuState(const StackFrame* frame,
Image* previousImage, FunctionDebugInfo* previousFunction,
CpuState* previousCpuState)
{
fprintf(stderr, "ArchitectureX8664::UpdateStackFrameCpuState: TODO\n");
// This is not a top frame, so we want to offset rip to the previous
// (calling) instruction.
CpuStateX8664* cpuState = dynamic_cast<CpuStateX8664*>(previousCpuState);
// get rip
uint64 rip = cpuState->IntRegisterValue(X86_64_REGISTER_RIP);
if (previousFunction == NULL || rip <= previousFunction->Address())
return;
target_addr_t functionAddress = previousFunction->Address();
// allocate a buffer for the function code to disassemble
size_t bufferSize = rip - functionAddress;
void* buffer = malloc(bufferSize);
if (buffer == NULL)
return;
MemoryDeleter bufferDeleter(buffer);
// read the code
ssize_t bytesRead = fTeamMemory->ReadMemory(functionAddress, buffer,
bufferSize);
if (bytesRead != (ssize_t)bufferSize)
return;
// disassemble to get the previous instruction
DisassemblerX8664 disassembler;
target_addr_t instructionAddress;
target_size_t instructionSize;
if (disassembler.Init(functionAddress, buffer, bufferSize) == B_OK
&& disassembler.GetPreviousInstruction(rip, instructionAddress,
instructionSize) == B_OK) {
rip -= instructionSize;
cpuState->SetIntRegister(X86_64_REGISTER_RIP, rip);
}
}
@@ -253,7 +253,8 @@ ThreadHandler::HandleThreadAction(uint32 action)
if (stackTrace == NULL && cpuState != NULL) {
if (fDebuggerInterface->GetArchitecture()->CreateStackTrace(
fThread->GetTeam(), this, cpuState, stackTrace, 1) == B_OK) {
fThread->GetTeam(), this, cpuState, stackTrace, 1, false,
false) == B_OK) {
stackTraceReference.SetTo(stackTrace, true);
}
}
@@ -68,7 +68,8 @@ DebuggerImageDebugInfo::GetAddressSectionType(target_addr_t address)
status_t
DebuggerImageDebugInfo::CreateFrame(Image* image,
FunctionInstance* functionInstance, CpuState* cpuState,
StackFrame*& _previousFrame, CpuState*& _previousCpuState)
bool getFullFrameInfo, StackFrame*& _previousFrame,
CpuState*& _previousCpuState)
{
return B_UNSUPPORTED;
}
@@ -35,6 +35,7 @@ public:
virtual status_t CreateFrame(Image* image,
FunctionInstance* functionInstance,
CpuState* cpuState,
bool getFullFrameInfo,
StackFrame*& _previousFrame,
CpuState*& _previousCpuState);
virtual status_t GetStatement(FunctionDebugInfo* function,
@@ -26,6 +26,7 @@
#include "DebuggerInterface.h"
#include "DebugInfoEntries.h"
#include "Demangler.h"
#include "DisassembledCode.h"
#include "Dwarf.h"
#include "DwarfFile.h"
#include "DwarfFunctionDebugInfo.h"
@@ -40,6 +41,7 @@
#include "FunctionID.h"
#include "FunctionInstance.h"
#include "GlobalTypeLookup.h"
#include "InstructionInfo.h"
#include "LocatableFile.h"
#include "Register.h"
#include "RegisterMap.h"
@@ -516,7 +518,7 @@ DwarfImageDebugInfo::GetAddressSectionType(target_addr_t address)
status_t
DwarfImageDebugInfo::CreateFrame(Image* image,
FunctionInstance* functionInstance, CpuState* cpuState,
StackFrame*& _frame, CpuState*& _previousCpuState)
bool getFullFrameInfo, StackFrame*& _frame, CpuState*& _previousCpuState)
{
DwarfFunctionDebugInfo* function = dynamic_cast<DwarfFunctionDebugInfo*>(
functionInstance->GetFunctionDebugInfo());
@@ -635,7 +637,7 @@ DwarfImageDebugInfo::CreateFrame(Image* image,
// The subprogram entry may not be available since this may be a case
// where .eh_frame was used to unwind the stack without other DWARF
// info being available.
if (subprogramEntry != NULL) {
if (subprogramEntry != NULL && getFullFrameInfo) {
// create function parameter objects
for (DebugInfoEntryList::ConstIterator it
= subprogramEntry->Parameters().GetIterator();
@@ -665,6 +667,14 @@ DwarfImageDebugInfo::CreateFrame(Image* image,
_CreateLocalVariables(unit, frame, functionID, *stackFrameDebugInfo,
instructionPointer, functionInstance->Address() - fRelocationDelta,
subprogramEntry->Variables(), subprogramEntry->Blocks());
// determine if the previously executed instruction was a function
// call to see if we need to potentially retrieve a return value
// as well
if (instructionPointer > functionInstance->Address() - fRelocationDelta) {
_CreateReturnValue(functionInstance, function, frame,
*stackFrameDebugInfo, instructionPointer);
}
}
_frame = frameReference.Detach();
@@ -1073,6 +1083,50 @@ DwarfImageDebugInfo::_CreateLocalVariables(CompilationUnit* unit,
}
status_t
DwarfImageDebugInfo::_CreateReturnValue(FunctionInstance* functionInstance,
DwarfFunctionDebugInfo* function, StackFrame* frame,
DwarfStackFrameDebugInfo& factory, target_addr_t instructionPointer)
{
DisassembledCode* sourceCode = NULL;
target_size_t bufferSize = std::min(functionInstance->Size(),
(target_size_t)64 * 1024);
void* buffer = malloc(bufferSize);
if (buffer == NULL)
return B_NO_MEMORY;
MemoryDeleter bufferDeleter(buffer);
ssize_t bytesRead = function->GetSpecificImageDebugInfo()
->ReadCode(functionInstance->Address(), buffer, bufferSize);
if (bytesRead < 0)
return bytesRead;
status_t result = fArchitecture->DisassembleCode(function, buffer,
bytesRead, sourceCode);
if (result != B_OK)
return result;
BReference<DisassembledCode> sourceCodeReference(sourceCode, true);
target_addr_t previousStatementAddress = instructionPointer + fRelocationDelta - 1;
Statement* statement = sourceCode->StatementAtAddress(
previousStatementAddress);
if (statement == NULL)
return B_BAD_VALUE;
TargetAddressRange range = statement->CoveringAddressRange();
InstructionInfo info;
if (fArchitecture->GetInstructionInfo(range.Start(), info) == B_OK
&& info.Type() == INSTRUCTION_TYPE_SUBROUTINE_CALL) {
// TODO: determine where the previous instruction actually jumps to,
// retrieve that function (could potentially be in another image),
// and use its return type to retrieve the return value (will need
// architecture support since function return value passing convention
// is arch-dependent).
}
return B_OK;
}
bool
DwarfImageDebugInfo::_EvaluateBaseTypeConstraints(DIEType* type,
const TypeLookupConstraints& constraints)
@@ -21,12 +21,14 @@ class Architecture;
class CompilationUnit;
class DebuggerInterface;
class DIEType;
class DwarfFunctionDebugInfo;
class DwarfStackFrameDebugInfo;
class DwarfFile;
class ElfSegment;
class FileManager;
class FileSourceCode;
class FunctionID;
class FunctionInstance;
class GlobalTypeCache;
class GlobalTypeLookup;
class LocatableFile;
@@ -61,6 +63,7 @@ public:
virtual status_t CreateFrame(Image* image,
FunctionInstance* functionInstance,
CpuState* cpuState,
bool getFullFrameInfo,
StackFrame*& _frame,
CpuState*& _previousCpuState);
virtual status_t GetStatement(FunctionDebugInfo* function,
@@ -100,6 +103,12 @@ private:
const EntryListWrapper& variableEntries,
const EntryListWrapper& blockEntries);
status_t _CreateReturnValue(FunctionInstance* instance,
DwarfFunctionDebugInfo* info,
StackFrame* frame,
DwarfStackFrameDebugInfo& factory,
target_addr_t instructionPointer);
bool _EvaluateBaseTypeConstraints(DIEType* type,
const TypeLookupConstraints& constraints);
@@ -576,8 +576,9 @@ printf(" -> failed to add type to cache\n");
= dynamic_cast<DIETemplateTypeParameter*>(_typeEntry);
DwarfType* templateType;
if (templateTypeEntry != NULL) {
if (CreateType(templateTypeEntry->GetType(), templateType)
!= B_OK) {
if (templateTypeEntry->GetType() == NULL
|| CreateType(templateTypeEntry->GetType(),
templateType) != B_OK) {
continue;
}
} else {
@@ -55,11 +55,15 @@ public:
virtual status_t CreateFrame(Image* image,
FunctionInstance* functionInstance,
CpuState* cpuState,
bool getFullFrameInfo,
StackFrame*& _Frame,
CpuState*& _previousCpuState) = 0;
// returns reference to previous frame
// and CPU state; returned CPU state
// can be NULL; can return B_UNSUPPORTED
// getFullFrameInfo: try to retrieve
// variables/parameters if true
// (and supported)
virtual status_t GetStatement(FunctionDebugInfo* function,
target_addr_t address,
Statement*& _statement) = 0;
+18 -26
View File
@@ -234,8 +234,11 @@ struct DwarfFile::CIEAugmentation {
:
fString(NULL),
fFlags(0),
fAddressEncoding(0)
fAddressEncoding(CFI_ADDRESS_FORMAT_ABSOLUTE)
{
// we default to absolute address format since that corresponds
// to the DWARF standard for .debug_frame. In gcc's case, however,
// .eh_frame will generally override that via augmentation 'R'
}
void Init(DataReader& dataReader)
@@ -270,11 +273,12 @@ struct DwarfFile::CIEAugmentation {
break;
case 'P':
{
char personalityEncoding = dataReader.Read<char>(0);
uint8 addressSize = EncodedAddressSize(
personalityEncoding, NULL);
dataReader.Skip(addressSize);
remaining -= addressSize + 1;
char tempEncoding = fAddressEncoding;
fAddressEncoding = dataReader.Read<char>(0);
off_t offset = dataReader.Offset();
ReadEncodedAddress(dataReader, NULL, NULL, true);
fAddressEncoding = tempEncoding;
remaining -= dataReader.Offset() - offset + 1;
break;
}
case 'R':
@@ -283,14 +287,20 @@ struct DwarfFile::CIEAugmentation {
--remaining;
break;
default:
WARNING("Encountered unsupported augmentation '%c' "
" while parsing CIE augmentation string %s\n",
*string, fString);
return B_UNSUPPORTED;
}
string++;
}
dataReader.Skip(remaining);
// we should have read through all of the augmentation data
// at this point, if not, something is wrong.
if (remaining != 0 || dataReader.HasOverflow()) {
WARNING("Error while reading CIE Augmentation\n");
WARNING("Error while reading CIE Augmentation, expected "
"%" B_PRIu64 " bytes of augmentation data, but read "
"%" B_PRIu64 " bytes.\n", length, length - remaining);
return B_BAD_DATA;
}
@@ -370,24 +380,6 @@ struct DwarfFile::CIEAugmentation {
return 0;
}
int8 EncodedAddressSize(char encoding, CompilationUnit* unit) const
{
switch (encoding & 0x07) {
case CFI_ADDRESS_FORMAT_ABSOLUTE:
return unit->AddressSize();
case CFI_ADDRESS_FORMAT_UNSIGNED_16:
return 2;
case CFI_ADDRESS_FORMAT_UNSIGNED_32:
return 4;
case CFI_ADDRESS_FORMAT_UNSIGNED_64:
return 8;
}
// TODO: gcc doesn't (currently) actually generate LEB128-formatted
// addresses. If that changes, we'll need to handle them accordingly
return 0;
}
uint8 FDEAddressType() const
{
return fAddressEncoding & 0x70;
+31 -57
View File
@@ -119,19 +119,14 @@ Unicode2UTF8(int32 c, char **out)
if (c < 0x80)
*(s++) = c;
else if (c < 0x800)
{
else if (c < 0x800) {
*(s++) = 0xc0 | (c >> 6);
*(s++) = 0x80 | (c & 0x3f);
}
else if (c < 0x10000)
{
} else if (c < 0x10000) {
*(s++) = 0xe0 | (c >> 12);
*(s++) = 0x80 | ((c >> 6) & 0x3f);
*(s++) = 0x80 | (c & 0x3f);
}
else if (c < 0x200000)
{
} else if (c < 0x200000) {
*(s++) = 0xf0 | (c >> 18);
*(s++) = 0x80 | ((c >> 12) & 0x3f);
*(s++) = 0x80 | ((c >> 6) & 0x3f);
@@ -974,15 +969,12 @@ TTextView::KeyDown(const char *key, int32 count)
msg = Window()->CurrentMessage();
mods = msg->FindInt32("modifiers");
switch (key[0])
{
switch (key[0]) {
case B_HOME:
if (IsSelectable())
{
if (IsSelectable()) {
if (IsEditable())
BTextView::KeyDown(key, count);
else
{
else {
// scroll to the beginning
Select(0, 0);
ScrollToSelection();
@@ -991,12 +983,10 @@ TTextView::KeyDown(const char *key, int32 count)
break;
case B_END:
if (IsSelectable())
{
if (IsSelectable()) {
if (IsEditable())
BTextView::KeyDown(key, count);
else
{
else {
// scroll to the end
int32 length = TextLength();
Select(length, length);
@@ -1006,19 +996,15 @@ TTextView::KeyDown(const char *key, int32 count)
break;
case 0x02: // ^b - back 1 char
if (IsSelectable())
{
if (IsSelectable()) {
GetSelection(&start, &end);
while (!IsInitialUTF8Byte(ByteAt(--start)))
{
if (start < 0)
{
while (!IsInitialUTF8Byte(ByteAt(--start))) {
if (start < 0) {
start = 0;
break;
}
}
if (start >= 0)
{
if (start >= 0) {
Select(start, start);
ScrollToSelection();
}
@@ -1026,21 +1012,16 @@ TTextView::KeyDown(const char *key, int32 count)
break;
case B_DELETE:
if (IsSelectable())
{
if ((key[0] == B_DELETE) || (mods & B_CONTROL_KEY)) // ^d
{
if (IsEditable())
{
if (IsSelectable()) {
if ((key[0] == B_DELETE) || (mods & B_CONTROL_KEY)) {
// ^d
if (IsEditable()) {
GetSelection(&start, &end);
if (start != end)
Delete();
else
{
for (end = start + 1; !IsInitialUTF8Byte(ByteAt(end)); end++)
{
if (end > textLen)
{
else {
for (end = start + 1; !IsInitialUTF8Byte(ByteAt(end)); end++) {
if (end > textLen) {
end = textLen;
break;
}
@@ -1057,12 +1038,10 @@ TTextView::KeyDown(const char *key, int32 count)
break;
case 0x05: // ^e - end of line
if ((IsSelectable()) && (mods & B_CONTROL_KEY))
{
if (IsSelectable() && (mods & B_CONTROL_KEY)) {
if (CurrentLine() == CountLines() - 1)
Select(TextLength(), TextLength());
else
{
else {
GoToLine(CurrentLine() + 1);
GetSelection(&start, &end);
Select(start - 1, start - 1);
@@ -1071,17 +1050,14 @@ TTextView::KeyDown(const char *key, int32 count)
break;
case 0x06: // ^f - forward 1 char
if (IsSelectable())
{
if (IsSelectable()) {
GetSelection(&start, &end);
if (end > start)
start = end;
else
{
for (end = start + 1; !IsInitialUTF8Byte(ByteAt(end)); end++)
{
if (end > textLen)
{
else {
for (end = start + 1; !IsInitialUTF8Byte(ByteAt(end));
end++) {
if (end > textLen) {
end = textLen;
break;
}
@@ -1094,16 +1070,14 @@ TTextView::KeyDown(const char *key, int32 count)
break;
case 0x0e: // ^n - next line
if (IsSelectable())
{
if (IsSelectable()) {
raw = B_DOWN_ARROW;
BTextView::KeyDown(&raw, 1);
}
break;
case 0x0f: // ^o - open line
if (IsEditable())
{
if (IsEditable()) {
GetSelection(&start, &end);
Delete();
@@ -1123,7 +1097,7 @@ TTextView::KeyDown(const char *key, int32 count)
fYankBuffer = NULL;
}
fLastPosition = start;
if (CurrentLine() < (CountLines() - 1)) {
if (CurrentLine() < CountLines() - 1) {
GoToLine(CurrentLine() + 1);
GetSelection(&end, &end);
end--;
@@ -1161,7 +1135,7 @@ TTextView::KeyDown(const char *key, int32 count)
break;
case 0x19: // ^y yank text
if ((IsEditable()) && (fYankBuffer)) {
if (IsEditable() && fYankBuffer) {
Delete();
Insert(fYankBuffer);
ScrollToSelection();
@@ -2256,7 +2230,7 @@ TTextView::AddAsContent(BEmailMessage *mail, bool wrap, uint32 charset, mail_enc
// add a newline to every line except for the ones
// that already end in newlines, and the last line
if ((text[endOffset - 1] != '\n') && (i < (numLines - 1))) {
if ((text[endOffset - 1] != '\n') && (i < numLines - 1)) {
content[contentLength++] = '\n';
// copy quote level of the first line
+47 -58
View File
@@ -4,39 +4,38 @@
#include "KUndoBuffer.h"
KUndoItem::KUndoItem(const char* redo_text,
int32 length,
int32 offset,
undo_type history,
int32 cursor_pos)
KUndoItem::KUndoItem(const char* redo_text, int32 length, int32 offset,
undo_type history, int32 cursor_pos)
{
Offset = offset;
Length = length;
History = history;
CursorPos = cursor_pos;
if (redo_text!=NULL) {
if (redo_text != NULL) {
RedoText = (char*)malloc(length);
memcpy(RedoText, redo_text, length);
if (RedoText!=NULL) {
if (RedoText != NULL)
fStatus = B_OK;
} else {
else
fStatus = B_ERROR;
}
}
}
KUndoItem::~KUndoItem()
{
free(RedoText);
}
status_t
KUndoItem::InitCheck()
{
return fStatus;
}
void
KUndoItem::Merge(const char* text, int32 length)
{
@@ -53,6 +52,7 @@ KUndoBuffer::KUndoBuffer():BList(1024)
fNewItem = true;
}
KUndoBuffer::~KUndoBuffer()
{
MakeEmpty();
@@ -62,34 +62,38 @@ KUndoBuffer::~KUndoBuffer()
bool
KUndoBuffer::AddItem(KUndoItem* item, int32 index)
{
for (int32 i=CountItems()-1; i>=index; i--) {
for (int32 i = CountItems() - 1; i >= index; i--)
RemoveItem(i);
}
return AddItem(item);
}
bool
KUndoBuffer::AddItem(KUndoItem* item)
{
return BList::AddItem(item);
}
void
KUndoBuffer::MakeEmpty(void)
{
for(int32 i=CountItems()-1; i>=0;i--) {
for (int32 i = CountItems() - 1; i >= 0; i--)
RemoveItem(i);
}
}
KUndoItem*
KUndoBuffer::RemoveItem(int32 index)
{
if (fIndex>=CountItems()) fIndex--;
if (fIndex >= CountItems())
fIndex--;
delete this->ItemAt(index);
return (KUndoItem*)BList::RemoveItem(index);
}
KUndoItem*
KUndoBuffer::ItemAt(int32 index) const
{
@@ -103,12 +107,14 @@ KUndoBuffer::On()
fNoTouch = false;
}
void
KUndoBuffer::Off()
{
fNoTouch = true;
}
status_t
KUndoBuffer::NewUndo(const char* text, int32 length, int32 offset,
undo_type history, int32 cursor_pos)
@@ -117,9 +123,9 @@ KUndoBuffer::NewUndo(const char* text, int32 length, int32 offset,
cursor_pos);
status_t status = NewUndoItem->InitCheck();
if ( status != B_OK) {
if (status != B_OK) {
delete NewUndoItem;
return status;
return status;
}
AddItem(NewUndoItem, fIndex);
fIndex++;
@@ -136,13 +142,13 @@ KUndoBuffer::AddUndo(const char* text, int32 length, int32 offset,
status_t status = B_OK;
if (fNewItem || (fIndex < CountItems()) || (CountItems()==0)) {
if (fNewItem || fIndex < CountItems() || CountItems() == 0) {
status = NewUndo(text, length, offset, history, cursor_pos);
fNewItem = false;
} else {
KUndoItem* CurrentUndoItem;
CurrentUndoItem = ItemAt(fIndex-1);
if (CurrentUndoItem!=NULL) {
CurrentUndoItem = ItemAt(fIndex - 1);
if (CurrentUndoItem != NULL) {
int32 c_length = CurrentUndoItem->Length;
int32 c_offset = CurrentUndoItem->Offset;
undo_type c_history = CurrentUndoItem->History;
@@ -150,9 +156,9 @@ KUndoBuffer::AddUndo(const char* text, int32 length, int32 offset,
switch(c_history) {
case K_INSERTED:
case K_REPLACED:
if ((c_offset + c_length) == offset) {
if ((c_offset + c_length) == offset)
CurrentUndoItem->Merge(text, length);
} else {
else {
status = NewUndo(text, length, offset, history,
cursor_pos);
}
@@ -162,9 +168,8 @@ KUndoBuffer::AddUndo(const char* text, int32 length, int32 offset,
cursor_pos);
break;
}
} else {
} else
status = NewUndo(text, length, offset, history, cursor_pos);
}
}
}
@@ -184,65 +189,50 @@ KUndoBuffer::MakeNewUndoItem()
status_t
KUndoBuffer::Undo(char** text,
int32* length,
int32* offset,
undo_type* history,
int32* cursor_pos)
KUndoBuffer::Undo(char** text, int32* length, int32* offset,
undo_type* history, int32* cursor_pos)
{
KUndoItem* undoItem;
status_t status;
status_t status = B_ERROR;
if (fIndex>0) {
undoItem = ItemAt(fIndex-1);
if (undoItem!=NULL) {
if (fIndex > 0) {
undoItem = ItemAt(fIndex - 1);
if (undoItem != NULL) {
*text = undoItem->RedoText;
*length = undoItem->Length;
*offset = undoItem->Offset;
*history = undoItem->History;
*cursor_pos = undoItem->CursorPos + undoItem->Length;
status = B_OK;
} else {
status = B_ERROR;
}
fIndex--;
} else {
status = B_ERROR;
}
return status;
}
status_t
KUndoBuffer::Redo(char** text,
int32* length,
int32* offset,
undo_type* history,
int32* cursor_pos,
bool* replaced)
KUndoBuffer::Redo(char** text, int32* length, int32* offset,
undo_type* history, int32* cursor_pos, bool* replaced)
{
KUndoItem* undoItem;
status_t status;
status_t status = B_ERROR;
if (fIndex < CountItems()) {
undoItem = ItemAt(fIndex);
if (undoItem!=NULL) {
if (undoItem != NULL) {
*text = undoItem->RedoText;
*length = undoItem->Length;
*offset = undoItem->Offset;
*history = undoItem->History;
*cursor_pos = undoItem->CursorPos;
if ((fIndex+1) < CountItems()) {
*replaced = ItemAt(fIndex+1)->History==K_REPLACED;
} else {
if (fIndex + 1 < CountItems())
*replaced = ItemAt(fIndex + 1)->History == K_REPLACED;
else
*replaced = false;
}
status = B_OK;
} else {
status = B_ERROR;
}
fIndex++;
} else {
status = B_ERROR;
}
return status;
}
@@ -251,10 +241,10 @@ KUndoBuffer::Redo(char** text,
void
KUndoBuffer::PrintToStream()
{
for(int32 i=0; i<CountItems(); i++) {
for (int32 i = 0; i < CountItems(); i++) {
KUndoItem* item = ItemAt(i);
printf("%3.3d ", (int)i);
switch(item->History) {
switch (item->History) {
case K_INSERTED:
printf("INSERTED ");
break;
@@ -269,13 +259,12 @@ KUndoBuffer::PrintToStream()
printf("Length = %d ", (int)item->Length);
printf("CursorPos = %d ", (int)item->CursorPos);
printf("RedoText = '");
for(int32 j=0;j<item->Length;j++) {
for (int32 j = 0; j < item->Length; j++) {
uchar c = (uchar)item->RedoText[j];
if (c >= 0x20) {
if (c >= 0x20)
printf("%c", c);
} else {
else
printf("?");
}
}
printf("'\n");
}
+1 -1
View File
@@ -1515,7 +1515,7 @@ StyledEditWindow::_ReloadDocument(BMessage* message)
bs_printf(&alertText,
B_TRANSLATE("\"%s\" has unsaved changes.\n"
"Revert it to the last saved version? "), Title());
if (_ShowAlert(alertText, B_TRANSLATE("Cancel"), B_TRANSLATE("OK"),
if (_ShowAlert(alertText, B_TRANSLATE("Cancel"), B_TRANSLATE("Revert"),
"", B_WARNING_ALERT) != 1)
return;
}
+17 -16
View File
@@ -331,27 +331,28 @@ BFileGameSound::Perform(int32 selector,
status_t
BFileGameSound::SetPaused(bool isPaused, bigtime_t rampTime)
{
if (fPaused != isPaused) {
Lock();
if (fPaused == isPaused)
return EALREADY;
// Clear any old ramping
delete fPausing;
fPausing = NULL;
Lock();
if (rampTime > 100000) {
// Setup for ramping
if (isPaused)
fPausing = InitRamp(&fPauseGain, 0.0,
Format().frame_rate, rampTime);
else
fPausing = InitRamp(&fPauseGain, 1.0,
Format().frame_rate, rampTime);
}
// Clear any old ramping
delete fPausing;
fPausing = NULL;
fPaused = isPaused;
Unlock();
if (rampTime > 100000) {
// Setup for ramping
if (isPaused)
fPausing = InitRamp(&fPauseGain, 0.0,
Format().frame_rate, rampTime);
else
fPausing = InitRamp(&fPauseGain, 1.0,
Format().frame_rate, rampTime);
}
fPaused = isPaused;
Unlock();
return B_OK;
}
+10 -6
View File
@@ -419,8 +419,8 @@ DraggableContainerIcon::MouseMoved(BPoint point, uint32 /*transit*/,
font_height fontHeight;
font.GetHeight(&fontHeight);
float height = fontHeight.ascent + fontHeight.descent + fontHeight.leading
+ 2 + Bounds().Height() + 8;
float height = ceil(fontHeight.ascent + fontHeight.descent
+ fontHeight.leading + 2 + Bounds().Height() + 8);
BRect rect(0, 0, max_c(Bounds().Width(),
font.StringWidth(model->Name()) + 4), height);
@@ -2554,10 +2554,13 @@ BContainerWindow::SetupMoveCopyMenus(const entry_ref* item_ref, BMenu* parent)
// Set the "Identify" item label
BMenuItem* identifyItem = parent->FindItem(kIdentifyEntry);
if (identifyItem != NULL) {
if (modifierKeys & B_SHIFT_KEY)
if (modifierKeys & B_SHIFT_KEY) {
identifyItem->SetLabel(B_TRANSLATE("Force identify"));
else
identifyItem->Message()->ReplaceBool("force", true);
} else {
identifyItem->SetLabel(B_TRANSLATE("Identify"));
identifyItem->Message()->ReplaceBool("force", false);
}
}
}
@@ -2778,8 +2781,9 @@ BContainerWindow::AddFileContextMenus(BMenu* menu)
#endif
menu->AddSeparatorItem();
menu->AddItem(new BMenuItem(B_TRANSLATE("Identify"),
new BMessage(kIdentifyEntry)));
BMessage* message = new BMessage(kIdentifyEntry);
message->AddBool("force", false);
menu->AddItem(new BMenuItem(B_TRANSLATE("Identify"), message));
BMenu* addOnMenuItem = new BMenu(B_TRANSLATE("Add-ons"));
addOnMenuItem->SetFont(be_plain_font);
menu->AddItem(addOnMenuItem);
+8 -4
View File
@@ -2368,8 +2368,13 @@ BPoseView::MessageReceived(BMessage* message)
break;
case kIdentifyEntry:
IdentifySelection();
{
bool force;
if (message->FindBool("force", &force) != B_OK)
force = false;
IdentifySelection(force);
break;
}
case kEditItem:
{
@@ -8360,9 +8365,8 @@ BPoseView::OpenParent()
void
BPoseView::IdentifySelection()
{
bool force = (modifiers() & B_SHIFT_KEY) != 0;
BPoseView::IdentifySelection(bool force)
{
int32 count = fSelectionList->CountItems();
for (int32 index = 0; index < count; index++) {
BPose* pose = fSelectionList->ItemAt(index);
+1 -1
View File
@@ -284,7 +284,7 @@ class BPoseView : public BView {
void OpenInfoWindows();
void SetDefaultPrinter();
void IdentifySelection();
void IdentifySelection(bool force = false);
void UnmountSelectedVolumes();
virtual void OpenParent();
+3 -3
View File
@@ -247,15 +247,15 @@ CDDBDaemon::_WriteCDData(dev_t device, QueryResponseData* diskData,
// Add relevant attributes. We consider an error here as non-fatal.
BNode node(&entry);
node.WriteAttr("Audio:Title", B_STRING_TYPE, 0, (data->title).String(),
node.WriteAttr("Media:Title", B_STRING_TYPE, 0, (data->title).String(),
(data->title).Length());
node.WriteAttr("Audio:Album", B_STRING_TYPE, 0,
(readResponse->title).String(),
(readResponse->title).Length());
node.WriteAttr("Audio:Genre", B_STRING_TYPE, 0,
node.WriteAttr("Media:Genre", B_STRING_TYPE, 0,
(readResponse->genre).String(),
(readResponse->genre).Length());
node.WriteAttr("Audio:Year", B_INT32_TYPE, 0, &(readResponse->year),
node.WriteAttr("Media:Year", B_INT32_TYPE, 0, &(readResponse->year),
sizeof(int32));
if (data->artist == "") {
+1 -1
View File
@@ -715,7 +715,7 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message)
#ifdef HANDOVER_USE_DEBUGGER
BAlert *alert = new BAlert(NULL, buffer.String(),
B_TRANSLATE("Terminate"), B_TRANSLATE("Debug"),
B_TRANSLATE("Save Report"), B_WIDTH_AS_USUAL, B_WARNING_ALERT);
B_TRANSLATE("Save report"), B_WIDTH_AS_USUAL, B_WARNING_ALERT);
alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
debugAction = alert->Go();
_NotifyRegistrar(fTeam, false, debugAction != kActionKillTeam);