Instead of creating the Modifiers bitmaps on demand, for every DrawItem invocation,
for every BMenuItem, have them created in _init_interface_kit(), and keep them cached. This required some reorganisation of the code in Menu and MenuItem. Also has the side effect that BMenuItem doesn't have to know about the alt/ctrl/command keys stuff. Added a comment in BMenu::AttachedToWindow(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31962 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+150
-3
@@ -14,6 +14,7 @@
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <Bitmap.h>
|
||||
#include <ControlLook.h>
|
||||
#include <Debug.h>
|
||||
#include <File.h>
|
||||
@@ -76,6 +77,11 @@ public:
|
||||
};
|
||||
|
||||
|
||||
BBitmap *gMenuItemAlt;
|
||||
BBitmap *gMenuItemControl;
|
||||
BBitmap *gMenuItemOption;
|
||||
BBitmap *gMenuItemShift;
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
|
||||
@@ -83,6 +89,66 @@ menu_info BMenu::sMenuInfo;
|
||||
bool BMenu::sAltAsCommandKey;
|
||||
|
||||
|
||||
const unsigned char kCtrlBits[] = {
|
||||
0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
|
||||
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
|
||||
};
|
||||
|
||||
|
||||
const unsigned char kAltBits[] = {
|
||||
0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
|
||||
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
|
||||
};
|
||||
|
||||
|
||||
const unsigned char kOptBits[] = {
|
||||
0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
|
||||
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
|
||||
};
|
||||
|
||||
|
||||
const unsigned char kShiftBits[] = {
|
||||
0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14,
|
||||
0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,
|
||||
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14
|
||||
};
|
||||
|
||||
|
||||
static property_info sPropList[] = {
|
||||
{ "Enabled", { B_GET_PROPERTY, 0 },
|
||||
{ B_DIRECT_SPECIFIER, 0 }, "Returns true if menu or menu item is enabled; false "
|
||||
@@ -348,16 +414,20 @@ BMenu::AttachedToWindow()
|
||||
{
|
||||
BView::AttachedToWindow();
|
||||
|
||||
sAltAsCommandKey = true;
|
||||
// TODO: Move into init_interface_kit().
|
||||
// Currently we can't do that, as get_key_map() blocks forever
|
||||
// when called there. Probably because the BApplication isn't yet
|
||||
// initialized, or running.
|
||||
BMenu::sAltAsCommandKey = true;
|
||||
key_map *keys = NULL;
|
||||
char *chars = NULL;
|
||||
get_key_map(&keys, &chars);
|
||||
if (keys == NULL || keys->left_command_key != 0x5d
|
||||
|| keys->left_control_key != 0x5c)
|
||||
sAltAsCommandKey = false;
|
||||
BMenu::sAltAsCommandKey = false;
|
||||
free(chars);
|
||||
free(keys);
|
||||
|
||||
|
||||
BMenuItem *superItem = Superitem();
|
||||
BMenu *superMenu = Supermenu();
|
||||
if (AddDynamicItem(B_INITIAL_ADD)) {
|
||||
@@ -2256,12 +2326,14 @@ BMenu::_CalcFrame(BPoint where, bool *scrollOn)
|
||||
void
|
||||
BMenu::_DrawItems(BRect updateRect)
|
||||
{
|
||||
bigtime_t start = system_time();
|
||||
int32 itemCount = fItems.CountItems();
|
||||
for (int32 i = 0; i < itemCount; i++) {
|
||||
BMenuItem *item = ItemAt(i);
|
||||
if (item->Frame().Intersects(updateRect))
|
||||
item->Draw();
|
||||
}
|
||||
printf("BMenu::_DrawItems() took %lld usecs\n", system_time() - start);
|
||||
}
|
||||
|
||||
|
||||
@@ -2879,4 +2951,79 @@ MenuPrivate::QuitTracking(bool thisMenuOnly)
|
||||
fMenu->_QuitTracking(thisMenuOnly);
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
status_t
|
||||
MenuPrivate::CreateBitmaps()
|
||||
{
|
||||
BRect smallRect(0, 0, 16, 10);
|
||||
BRect largeRect(0, 0, 21, 10);
|
||||
|
||||
gMenuItemAlt = new BBitmap(smallRect, B_CMAP8);
|
||||
gMenuItemControl = new BBitmap(smallRect, B_CMAP8);
|
||||
gMenuItemOption = new BBitmap(smallRect, B_CMAP8);
|
||||
gMenuItemShift = new BBitmap(largeRect, B_CMAP8);
|
||||
|
||||
gMenuItemAlt->ImportBits(kAltBits, sizeof(kAltBits),
|
||||
17, 0, B_CMAP8);
|
||||
gMenuItemControl->ImportBits(kCtrlBits, sizeof(kCtrlBits),
|
||||
17, 0, B_CMAP8);
|
||||
gMenuItemOption->ImportBits(kOptBits, sizeof(kOptBits),
|
||||
17, 0, B_CMAP8);
|
||||
gMenuItemShift->ImportBits(kShiftBits, sizeof(kShiftBits),
|
||||
22, 0, B_CMAP8);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
void
|
||||
MenuPrivate::DeleteBitmaps()
|
||||
{
|
||||
delete gMenuItemAlt;
|
||||
delete gMenuItemControl;
|
||||
delete gMenuItemOption;
|
||||
delete gMenuItemShift;
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
const BBitmap *
|
||||
MenuPrivate::MenuItemCommand()
|
||||
{
|
||||
if (BMenu::sAltAsCommandKey)
|
||||
return gMenuItemAlt;
|
||||
|
||||
return gMenuItemControl;
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
const BBitmap *
|
||||
MenuPrivate::MenuItemControl()
|
||||
{
|
||||
if (BMenu::sAltAsCommandKey)
|
||||
return gMenuItemControl;
|
||||
|
||||
return gMenuItemAlt;
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
const BBitmap *
|
||||
MenuPrivate::MenuItemOption()
|
||||
{
|
||||
return gMenuItemOption;
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
const BBitmap *
|
||||
MenuPrivate::MenuItemShift()
|
||||
{
|
||||
return gMenuItemShift;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
Reference in New Issue
Block a user