This commit is contained in:
Alex Matrosov 2018-04-29 22:38:54 -07:00
parent 956a804dd5
commit a5ce9ab3d9
16 changed files with 3575 additions and 3514 deletions

View file

@ -25,8 +25,8 @@ static ISzAlloc SzAllocForLzma = { &AllocForLzma, &FreeForLzma };
SRes OnProgress(void *p, UInt64 inSize, UInt64 outSize) SRes OnProgress(void *p, UInt64 inSize, UInt64 outSize)
{ {
(void)p; (void) inSize; (void) outSize; (void)p; (void)inSize; (void)outSize;
return SZ_OK; return SZ_OK;
} }
static ICompressProgress g_ProgressCallback = { &OnProgress }; static ICompressProgress g_ProgressCallback = { &OnProgress };
@ -34,76 +34,76 @@ static ICompressProgress g_ProgressCallback = { &OnProgress };
STATIC STATIC
UINT64 UINT64
EFIAPI EFIAPI
RShiftU64( RShiftU64 (
UINT64 Operand, UINT64 Operand,
UINT32 Count UINT32 Count
) )
{ {
return Operand >> Count; return Operand >> Count;
} }
VOID VOID
SetEncodedSizeOfBuf( SetEncodedSizeOfBuf (
UINT64 EncodedSize, UINT64 EncodedSize,
UINT8 *EncodedData UINT8 *EncodedData
) )
{ {
INT32 Index; INT32 Index;
EncodedData[LZMA_PROPS_SIZE] = EncodedSize & 0xFF; EncodedData[LZMA_PROPS_SIZE] = EncodedSize & 0xFF;
for (Index = LZMA_PROPS_SIZE + 1; Index <= LZMA_PROPS_SIZE + 7; Index++) for (Index = LZMA_PROPS_SIZE + 1; Index <= LZMA_PROPS_SIZE + 7; Index++)
{ {
EncodedSize = RShiftU64(EncodedSize, 8); EncodedSize = RShiftU64(EncodedSize, 8);
EncodedData[Index] = EncodedSize & 0xFF; EncodedData[Index] = EncodedSize & 0xFF;
} }
} }
INT32 INT32
EFIAPI EFIAPI
LzmaCompress( LzmaCompress(
CONST UINT8 *Source, CONST UINT8 *Source,
UINT32 SourceSize, UINTN SourceSize,
UINT8 *Destination, UINT8 *Destination,
UINT32 *DestinationSize UINTN *DestinationSize
) )
{ {
SRes LzmaResult; SRes LzmaResult;
CLzmaEncProps props; CLzmaEncProps props;
SizeT propsSize = LZMA_PROPS_SIZE; SizeT propsSize = LZMA_PROPS_SIZE;
SizeT destLen = SourceSize + SourceSize / 3 + 128; SizeT destLen = SourceSize + SourceSize / 3 + 128;
if (*DestinationSize < destLen) if (*DestinationSize < destLen)
{ {
*DestinationSize = destLen; *DestinationSize = destLen;
return ERR_BUFFER_TOO_SMALL; return ERR_BUFFER_TOO_SMALL;
} }
LzmaEncProps_Init(&props); LzmaEncProps_Init(&props);
props.dictSize = LZMA_DICTIONARY_SIZE; props.dictSize = LZMA_DICTIONARY_SIZE;
props.level = 9; props.level = 9;
props.fb = 273; props.fb = 273;
LzmaResult = LzmaEncode( LzmaResult = LzmaEncode(
(Byte*)((UINT8*)Destination + LZMA_HEADER_SIZE), (Byte*)((UINT8*)Destination + LZMA_HEADER_SIZE),
&destLen, &destLen,
Source, Source,
SourceSize, SourceSize,
&props, &props,
(UINT8*)Destination, (UINT8*)Destination,
&propsSize, &propsSize,
props.writeEndMark, props.writeEndMark,
&g_ProgressCallback, &g_ProgressCallback,
&SzAllocForLzma, &SzAllocForLzma,
&SzAllocForLzma); &SzAllocForLzma);
*DestinationSize = destLen + LZMA_HEADER_SIZE; *DestinationSize = destLen + LZMA_HEADER_SIZE;
SetEncodedSizeOfBuf((UINT64)SourceSize, Destination); SetEncodedSizeOfBuf(SourceSize, Destination);
if (LzmaResult == SZ_OK) { if (LzmaResult == SZ_OK) {
return ERR_SUCCESS; return ERR_SUCCESS;
} }
else { else {
return ERR_INVALID_PARAMETER; return ERR_INVALID_PARAMETER;
} }
} }

View file

@ -28,9 +28,9 @@ extern "C" {
EFIAPI EFIAPI
LzmaCompress( LzmaCompress(
const UINT8 *Source, const UINT8 *Source,
UINT32 SourceSize, UINTN SourceSize,
UINT8 *Destination, UINT8 *Destination,
UINT32 *DestinationSize UINTN *DestinationSize
); );
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -20,11 +20,11 @@ WITHWARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
UINT64 UINT64
EFIAPI EFIAPI
LShiftU64( LShiftU64(
UINT64 Operand, UINT64 Operand,
UINT32 Count UINT32 Count
) )
{ {
return Operand << Count; return Operand << Count;
} }
static void * AllocForLzma(void *p, size_t size) { (void)p; return malloc(size); } static void * AllocForLzma(void *p, size_t size) { (void)p; return malloc(size); }
@ -40,18 +40,18 @@ Get the size of the uncompressed buffer by parsing EncodeData header.
*/ */
UINT64 UINT64
GetDecodedSizeOfBuf( GetDecodedSizeOfBuf(
UINT8 *EncodedData UINT8 *EncodedData
) )
{ {
UINT64 DecodedSize; UINT64 DecodedSize;
INT32 Index; INT32 Index;
// Parse header // Parse header
DecodedSize = 0; DecodedSize = 0;
for (Index = LZMA_PROPS_SIZE + 7; Index >= LZMA_PROPS_SIZE; Index--) for (Index = LZMA_PROPS_SIZE + 7; Index >= LZMA_PROPS_SIZE; Index--)
DecodedSize = LShiftU64(DecodedSize, 8) + EncodedData[Index]; DecodedSize = LShiftU64(DecodedSize, 8) + EncodedData[Index];
return DecodedSize; return DecodedSize;
} }
// //
@ -88,19 +88,15 @@ buffer was returned ScratchSize.
INT32 INT32
EFIAPI EFIAPI
LzmaGetInfo( LzmaGetInfo(
CONST VOID *Source, CONST VOID *Source,
UINT32 SourceSize, UINTN SourceSize,
UINT32 *DestinationSize UINTN *DestinationSize
) )
{ {
UInt64 DecodedSize; ASSERT(SourceSize >= LZMA_HEADER_SIZE); (void)SourceSize;
ASSERT(SourceSize >= LZMA_HEADER_SIZE); (void)SourceSize; *DestinationSize = (UINTN)GetDecodedSizeOfBuf((UINT8*)Source);
return ERR_SUCCESS;
DecodedSize = GetDecodedSizeOfBuf((UINT8*)Source);
*DestinationSize = (UINT32)DecodedSize;
return ERR_SUCCESS;
} }
/* /*
@ -125,35 +121,35 @@ The source buffer specified by Source is corrupted
INT32 INT32
EFIAPI EFIAPI
LzmaDecompress( LzmaDecompress(
CONST VOID *Source, CONST VOID *Source,
UINT32 SourceSize, UINTN SourceSize,
VOID *Destination VOID *Destination
) )
{ {
SRes LzmaResult; SRes LzmaResult;
ELzmaStatus Status; ELzmaStatus Status;
SizeT DecodedBufSize; SizeT DecodedBufSize;
SizeT EncodedDataSize; SizeT EncodedDataSize;
DecodedBufSize = (SizeT)GetDecodedSizeOfBuf((UINT8*)Source); DecodedBufSize = (SizeT)GetDecodedSizeOfBuf((UINT8*)Source);
EncodedDataSize = (SizeT)(SourceSize - LZMA_HEADER_SIZE); EncodedDataSize = (SizeT)(SourceSize - LZMA_HEADER_SIZE);
LzmaResult = LzmaDecode( LzmaResult = LzmaDecode(
(Byte*)Destination, (Byte*)Destination,
&DecodedBufSize, &DecodedBufSize,
(Byte*)((UINT8*)Source + LZMA_HEADER_SIZE), (Byte*)((UINT8*)Source + LZMA_HEADER_SIZE),
&EncodedDataSize, &EncodedDataSize,
(CONST Byte*) Source, (CONST Byte*) Source,
LZMA_PROPS_SIZE, LZMA_PROPS_SIZE,
LZMA_FINISH_END, LZMA_FINISH_END,
&Status, &Status,
&SzAllocForLzma &SzAllocForLzma
); );
if (LzmaResult == SZ_OK) { if (LzmaResult == SZ_OK) {
return ERR_SUCCESS; return ERR_SUCCESS;
} }
else { else {
return ERR_INVALID_PARAMETER; return ERR_INVALID_PARAMETER;
} }
} }

View file

@ -61,8 +61,8 @@ extern "C" {
EFIAPI EFIAPI
LzmaGetInfo( LzmaGetInfo(
const VOID *Source, const VOID *Source,
UINT32 SourceSize, UINTN SourceSize,
UINT32 *DestinationSize UINTN *DestinationSize
); );
/* /*
@ -88,8 +88,8 @@ extern "C" {
EFIAPI EFIAPI
LzmaDecompress( LzmaDecompress(
const VOID *Source, const VOID *Source,
UINT32 SourceSize, UINTN SourceSize,
VOID *Destination VOID *Destination
); );
#ifdef __cplusplus #ifdef __cplusplus

File diff suppressed because it is too large Load diff

View file

@ -32,85 +32,82 @@ Header file for compression routine.
extern "C" { extern "C" {
#endif #endif
/*++ /*++
Routine Description: Routine Description:
Tiano compression routine. Tiano compression routine.
Arguments: Arguments:
SrcBuffer - The buffer storing the source data SrcBuffer - The buffer storing the source data
SrcSize - The size of source data SrcSize - The size of source data
DstBuffer - The buffer to store the compressed data DstBuffer - The buffer to store the compressed data
DstSize - On input, the size of DstBuffer; On output, DstSize - On input, the size of DstBuffer; On output,
the size of the actual compressed data. the size of the actual compressed data.
Returns: Returns:
EFI_BUFFER_TOO_SMALL - The DstBuffer is too small. this case, EFI_BUFFER_TOO_SMALL - The DstBuffer is too small. this case,
DstSize contains the size needed. DstSize contains the size needed.
EFI_SUCCESS - Compression is successful. EFI_SUCCESS - Compression is successful.
EFI_OUT_OF_RESOURCES - No resource to complete function. EFI_OUT_OF_RESOURCES - No resource to complete function.
EFI_INVALID_PARAMETER - Parameter supplied is wrong. EFI_INVALID_PARAMETER - Parameter supplied is wrong.
--*/ --*/
EFI_STATUS EFI_STATUS
TianoCompress( TianoCompress(
CONST VOID *SrcBuffer, IN CONST VOID *SrcBuffer,
UINT32 SrcSize, IN UINT32 SrcSize,
VOID *DstBuffer, IN VOID *DstBuffer,
UINT32 *DstSize IN OUT UINT32 *DstSize
) );
;
EFI_STATUS EFI_STATUS
TianoCompressLegacy( TianoCompressLegacy(
CONST VOID *SrcBuffer, CONST VOID *SrcBuffer,
UINT32 SrcSize, UINT32 SrcSize,
VOID *DstBuffer, VOID *DstBuffer,
UINT32 *DstSize UINT32 *DstSize
) );
; /*++
/*++
Routine Description: Routine Description:
EFI 1.1 compression routine. EFI 1.1 compression routine.
Arguments: Arguments:
SrcBuffer - The buffer storing the source data SrcBuffer - The buffer storing the source data
SrcSize - The size of source data SrcSize - The size of source data
DstBuffer - The buffer to store the compressed data DstBuffer - The buffer to store the compressed data
DstSize - On input, the size of DstBuffer; On output, DstSize - On input, the size of DstBuffer; On output,
the size of the actual compressed data. the size of the actual compressed data.
Returns: Returns:
EFI_BUFFER_TOO_SMALL - The DstBuffer is too small. this case, EFI_BUFFER_TOO_SMALL - The DstBuffer is too small. this case,
DstSize contains the size needed. DstSize contains the size needed.
EFI_SUCCESS - Compression is successful. EFI_SUCCESS - Compression is successful.
EFI_OUT_OF_RESOURCES - No resource to complete function. EFI_OUT_OF_RESOURCES - No resource to complete function.
EFI_INVALID_PARAMETER - Parameter supplied is wrong. EFI_INVALID_PARAMETER - Parameter supplied is wrong.
--*/ --*/
EFI_STATUS EFI_STATUS
EfiCompress( EfiCompress(
CONST VOID *SrcBuffer, IN CONST VOID *SrcBuffer,
UINT32 SrcSize, IN UINT32 SrcSize,
VOID *DstBuffer, IN VOID *DstBuffer,
UINT32 *DstSize IN OUT UINT32 *DstSize
) );
;
EFI_STATUS EFI_STATUS
EfiCompressLegacy( EfiCompressLegacy(
CONST VOID *SrcBuffer, CONST VOID *SrcBuffer,
UINT32 SrcSize, UINT32 SrcSize,
VOID *DstBuffer, VOID *DstBuffer,
UINT32 *DstSize UINT32 *DstSize
) );
;
#ifdef __cplusplus #ifdef __cplusplus
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -37,14 +37,13 @@ extern "C" {
UINT32 OrigSize; UINT32 OrigSize;
} EFI_TIANO_HEADER; } EFI_TIANO_HEADER;
EFI_STATUS EFI_STATUS
EFIAPI EfiTianoGetInfo(
EfiTianoGetInfo( IN const VOID *Source,
const VOID *Source, IN UINT32 SrcSize,
UINT32 SrcSize, OUT UINT32 *DstSize,
UINT32 *DstSize, OUT UINT32 *ScratchSize
UINT32 *ScratchSize )
)
/*++ /*++
Routine Description: Routine Description:
@ -67,16 +66,16 @@ extern "C" {
--*/ --*/
; ;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EfiDecompress( EfiDecompress(
const VOID *Source, IN const VOID *Source,
UINT32 SrcSize, IN UINT32 SrcSize,
VOID *Destination, IN OUT VOID *Destination,
UINT32 DstSize, IN UINT32 DstSize,
VOID *Scratch, IN OUT VOID *Scratch,
UINT32 ScratchSize IN UINT32 ScratchSize
) )
/*++ /*++
Routine Description: Routine Description:
@ -101,16 +100,16 @@ extern "C" {
--*/ --*/
; ;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TianoDecompress( TianoDecompress(
const VOID *Source, IN const VOID *Source,
UINT32 SrcSize, IN UINT32 SrcSize,
VOID *Destination, IN OUT VOID *Destination,
UINT32 DstSize, IN UINT32 DstSize,
VOID *Scratch, IN OUT VOID *Scratch,
UINT32 ScratchSize IN UINT32 ScratchSize
) )
/*++ /*++
Routine Description: Routine Description:

View file

@ -52,8 +52,9 @@ F7731B4C-58A2-4DF4-8980-5645D39ECE58 10 P:0FBA6C24380F:0FBA7424380F
299D6F8B-2EC9-4E40-9EC6-DDAA7EBF5FD9 10 P:81E10080000033C1:9090909090909090 299D6F8B-2EC9-4E40-9EC6-DDAA7EBF5FD9 10 P:81E10080000033C1:9090909090909090
299D6F8B-2EC9-4E40-9EC6-DDAA7EBF5FD9 12 P:81E10080000033C1:9090909090909090 299D6F8B-2EC9-4E40-9EC6-DDAA7EBF5FD9 12 P:81E10080000033C1:9090909090909090
# PpmInitialize | Skylake-X # SiInit | Skylake-X
3FFCAE95-23CF-4967-94F5-16352F68E43B 10 P:742CB9E2000000:752CB9E2000000 D71C8BA4-4AF2-4D0D-B1BA-F2409F0C20D3 10 P:81E10080000033C1:9090909090909090
D71C8BA4-4AF2-4D0D-B1BA-F2409F0C20D3 12 P:81E10080000033C1:9090909090909090
# CpuInitPei | Skylake-X # PpmInitialize | Skylake-X, Kaby Lake-X
01359D99-9446-456D-ADA4-50A711C03ADA 12 P:BE0080000023CE0B:BE0000000023CE0B 3FFCAE95-23CF-4967-94F5-16352F68E43B 10 P:0FBAE80F:0FBAE00F

View file

@ -95,6 +95,7 @@ public:
UINT8 replace(const QModelIndex & index, const QByteArray & object, const UINT8 mode); UINT8 replace(const QModelIndex & index, const QByteArray & object, const UINT8 mode);
UINT8 remove(const QModelIndex & index); UINT8 remove(const QModelIndex & index);
UINT8 rebuild(const QModelIndex & index); UINT8 rebuild(const QModelIndex & index);
UINT8 doNotRebuild(const QModelIndex & index);
UINT8 dump(const QModelIndex & index, const QString & path, const QString & filter = QString()); UINT8 dump(const QModelIndex & index, const QString & path, const QString & filter = QString());
UINT8 patch(const QModelIndex & index, const QVector<PatchData> & patches); UINT8 patch(const QModelIndex & index, const QVector<PatchData> & patches);

View file

@ -150,6 +150,8 @@ QString actionTypeToQString(const UINT8 action)
return QObject::tr("Rebuild"); return QObject::tr("Rebuild");
case Actions::Rebase: case Actions::Rebase:
return QObject::tr("Rebase"); return QObject::tr("Rebase");
case Actions::DoNotRebuild:
return QObject::tr("Do not rebuild");
default: default:
return QObject::tr("Unknown"); return QObject::tr("Unknown");
} }

View file

@ -26,7 +26,8 @@ namespace Actions
Replace, Replace,
Remove, Remove,
Rebuild, Rebuild,
Rebase Rebase,
DoNotRebuild
}; };
} }

View file

@ -17,7 +17,7 @@
UEFITool::UEFITool(QWidget *parent) : UEFITool::UEFITool(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
ui(new Ui::UEFITool), ui(new Ui::UEFITool),
version(tr("0.22.4")) version(tr("0.23.0"))
{ {
clipboard = QApplication::clipboard(); clipboard = QApplication::clipboard();
@ -43,6 +43,7 @@ version(tr("0.22.4"))
connect(ui->actionReplaceBody, SIGNAL(triggered()), this, SLOT(replaceBody())); connect(ui->actionReplaceBody, SIGNAL(triggered()), this, SLOT(replaceBody()));
connect(ui->actionRemove, SIGNAL(triggered()), this, SLOT(remove())); connect(ui->actionRemove, SIGNAL(triggered()), this, SLOT(remove()));
connect(ui->actionRebuild, SIGNAL(triggered()), this, SLOT(rebuild())); connect(ui->actionRebuild, SIGNAL(triggered()), this, SLOT(rebuild()));
connect(ui->actionDoNotRebuild, SIGNAL(triggered()), this, SLOT(doNotRebuild()));
connect(ui->actionMessagesCopy, SIGNAL(triggered()), this, SLOT(copyMessage())); connect(ui->actionMessagesCopy, SIGNAL(triggered()), this, SLOT(copyMessage()));
connect(ui->actionMessagesCopyAll, SIGNAL(triggered()), this, SLOT(copyAllMessages())); connect(ui->actionMessagesCopyAll, SIGNAL(triggered()), this, SLOT(copyAllMessages()));
connect(ui->actionMessagesClear, SIGNAL(triggered()), this, SLOT(clearMessages())); connect(ui->actionMessagesClear, SIGNAL(triggered()), this, SLOT(clearMessages()));
@ -146,6 +147,7 @@ void UEFITool::populateUi(const QModelIndex &current)
// Enable actions // Enable actions
ui->actionExtract->setDisabled(model->hasEmptyHeader(current) && model->hasEmptyBody(current)); ui->actionExtract->setDisabled(model->hasEmptyHeader(current) && model->hasEmptyBody(current));
ui->actionRebuild->setEnabled(type == Types::Volume || type == Types::File || type == Types::Section); ui->actionRebuild->setEnabled(type == Types::Volume || type == Types::File || type == Types::Section);
ui->actionDoNotRebuild->setEnabled(type== Types::Region || type == Types::Volume || type == Types::File || type == Types::Section);
ui->actionExtractBody->setDisabled(model->hasEmptyBody(current)); ui->actionExtractBody->setDisabled(model->hasEmptyBody(current));
ui->actionRemove->setEnabled(type == Types::Volume || type == Types::File || type == Types::Section); ui->actionRemove->setEnabled(type == Types::Volume || type == Types::File || type == Types::Section);
ui->actionInsertInto->setEnabled((type == Types::Volume && subtype != Subtypes::UnknownVolume) || ui->actionInsertInto->setEnabled((type == Types::Volume && subtype != Subtypes::UnknownVolume) ||
@ -220,6 +222,18 @@ void UEFITool::rebuild()
ui->actionSaveImageFile->setEnabled(true); ui->actionSaveImageFile->setEnabled(true);
} }
void UEFITool::doNotRebuild()
{
QModelIndex index = ui->structureTreeView->selectionModel()->currentIndex();
if (!index.isValid())
return;
UINT8 result = ffsEngine->doNotRebuild(index);
if (result == ERR_SUCCESS)
ui->actionSaveImageFile->setEnabled(true);
}
void UEFITool::remove() void UEFITool::remove()
{ {
QModelIndex index = ui->structureTreeView->selectionModel()->currentIndex(); QModelIndex index = ui->structureTreeView->selectionModel()->currentIndex();

View file

@ -78,6 +78,7 @@ public:
void replaceBody(); void replaceBody();
void rebuild(); void rebuild();
void doNotRebuild();
void remove(); void remove();

View file

@ -180,7 +180,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>800</width>
<height>21</height> <height>31</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
@ -225,6 +225,8 @@
</property> </property>
<addaction name="actionExtract"/> <addaction name="actionExtract"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionDoNotRebuild"/>
<addaction name="separator"/>
<addaction name="actionReplace"/> <addaction name="actionReplace"/>
</widget> </widget>
<widget class="QMenu" name="menuPaddingActions"> <widget class="QMenu" name="menuPaddingActions">
@ -243,6 +245,7 @@
<addaction name="actionExtractBody"/> <addaction name="actionExtractBody"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionRebuild"/> <addaction name="actionRebuild"/>
<addaction name="actionDoNotRebuild"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionInsertInto"/> <addaction name="actionInsertInto"/>
<addaction name="separator"/> <addaction name="separator"/>
@ -257,6 +260,7 @@
<addaction name="actionExtractBody"/> <addaction name="actionExtractBody"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionRebuild"/> <addaction name="actionRebuild"/>
<addaction name="actionDoNotRebuild"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionInsertInto"/> <addaction name="actionInsertInto"/>
<addaction name="actionInsertBefore"/> <addaction name="actionInsertBefore"/>
@ -275,6 +279,7 @@
<addaction name="actionExtractBody"/> <addaction name="actionExtractBody"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionRebuild"/> <addaction name="actionRebuild"/>
<addaction name="actionDoNotRebuild"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionInsertInto"/> <addaction name="actionInsertInto"/>
<addaction name="actionInsertBefore"/> <addaction name="actionInsertBefore"/>
@ -284,7 +289,6 @@
<addaction name="actionReplaceBody"/> <addaction name="actionReplaceBody"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionRemove"/> <addaction name="actionRemove"/>
<addaction name="separator"/>
</widget> </widget>
<widget class="QMenu" name="menuMessages"> <widget class="QMenu" name="menuMessages">
<property name="title"> <property name="title">
@ -536,6 +540,17 @@
<string>Ctrl+Shift+O</string> <string>Ctrl+Shift+O</string>
</property> </property>
</action> </action>
<action name="actionDoNotRebuild">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Do not rebuild</string>
</property>
<property name="shortcut">
<string>Ctrl+Shift+Space</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<resources/> <resources/>