mirror of https://github.com/OpenTTD/OpenTTD.git
Feature: Add selected toolbar buttons to MacBook Pro Touch Bar
This commit is contained in:
parent
16aac9c341
commit
753b1d7e15
56
src/gfx.cpp
56
src/gfx.cpp
|
@ -1059,18 +1059,19 @@ void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub,
|
||||||
/**
|
/**
|
||||||
* The code for setting up the blitter mode and sprite information before finally drawing the sprite.
|
* The code for setting up the blitter mode and sprite information before finally drawing the sprite.
|
||||||
* @param sprite The sprite to draw.
|
* @param sprite The sprite to draw.
|
||||||
* @param x The X location to draw.
|
* @param x The X location to draw.
|
||||||
* @param y The Y location to draw.
|
* @param y The Y location to draw.
|
||||||
* @param mode The settings for the blitter to pass.
|
* @param mode The settings for the blitter to pass.
|
||||||
* @param sub Whether to only draw a sub set of the sprite.
|
* @param sub Whether to only draw a sub set of the sprite.
|
||||||
* @param zoom The zoom level at which to draw the sprites.
|
* @param zoom The zoom level at which to draw the sprites.
|
||||||
|
* @param dst Optional parameter for a different blitting destination.
|
||||||
* @tparam ZOOM_BASE The factor required to get the sub sprite information into the right size.
|
* @tparam ZOOM_BASE The factor required to get the sub sprite information into the right size.
|
||||||
* @tparam SCALED_XY Whether the X and Y are scaled or unscaled.
|
* @tparam SCALED_XY Whether the X and Y are scaled or unscaled.
|
||||||
*/
|
*/
|
||||||
template <int ZOOM_BASE, bool SCALED_XY>
|
template <int ZOOM_BASE, bool SCALED_XY>
|
||||||
static void GfxBlitter(const Sprite * const sprite, int x, int y, BlitterMode mode, const SubSprite * const sub, SpriteID sprite_id, ZoomLevel zoom)
|
static void GfxBlitter(const Sprite * const sprite, int x, int y, BlitterMode mode, const SubSprite * const sub, SpriteID sprite_id, ZoomLevel zoom, const DrawPixelInfo *dst = nullptr)
|
||||||
{
|
{
|
||||||
const DrawPixelInfo *dpi = _cur_dpi;
|
const DrawPixelInfo *dpi = (dst != nullptr) ? dst : _cur_dpi;
|
||||||
Blitter::BlitterParams bp;
|
Blitter::BlitterParams bp;
|
||||||
|
|
||||||
if (SCALED_XY) {
|
if (SCALED_XY) {
|
||||||
|
@ -1185,6 +1186,47 @@ static void GfxBlitter(const Sprite * const sprite, int x, int y, BlitterMode mo
|
||||||
BlitterFactory::GetCurrentBlitter()->Draw(&bp, mode, zoom);
|
BlitterFactory::GetCurrentBlitter()->Draw(&bp, mode, zoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws a sprite to a new RGBA buffer (see Colour union) instead of drawing to the screen.
|
||||||
|
*
|
||||||
|
* @param spriteId The sprite to draw.
|
||||||
|
* @return Pixel buffer, or nullptr if an 8bpp blitter is being used.
|
||||||
|
*/
|
||||||
|
std::unique_ptr<uint32[]> DrawSpriteToRgbaBuffer(SpriteID spriteId)
|
||||||
|
{
|
||||||
|
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
|
||||||
|
if (!blitter->Is32BppSupported()) return nullptr;
|
||||||
|
|
||||||
|
/* Gather information about the sprite to write, reserve memory */
|
||||||
|
const SpriteID real_sprite = GB(spriteId, 0, SPRITE_WIDTH);
|
||||||
|
const Sprite *sprite = GetSprite(real_sprite, ST_NORMAL);
|
||||||
|
std::unique_ptr<uint32[]> result(new uint32[sprite->width * sprite->height]);
|
||||||
|
|
||||||
|
/* Prepare new DrawPixelInfo - Normally this would be the screen but we want to draw to another buffer here.
|
||||||
|
* Normally, pitch would be scaled screen width, but in our case our "screen" is only the sprite width wide. */
|
||||||
|
DrawPixelInfo dpi;
|
||||||
|
dpi.dst_ptr = result.get();
|
||||||
|
dpi.pitch = sprite->width;
|
||||||
|
dpi.left = 0;
|
||||||
|
dpi.top = 0;
|
||||||
|
dpi.width = sprite->width;
|
||||||
|
dpi.height = sprite->height;
|
||||||
|
dpi.zoom = ZOOM_LVL_NORMAL;
|
||||||
|
|
||||||
|
/* Zero out the allocated memory, there may be garbage present. */
|
||||||
|
uint32 *writeHead = (uint32*)result.get();
|
||||||
|
for (int i = 0; i < sprite->width * sprite->height; i++) {
|
||||||
|
writeHead[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Temporarily disable screen animations while blitting - This prevents 40bpp_anim from writing to the animation buffer. */
|
||||||
|
_screen_disable_anim = true;
|
||||||
|
GfxBlitter<1, false>(sprite, 0, 0, BM_NORMAL, nullptr, real_sprite, ZOOM_LVL_NORMAL, &dpi);
|
||||||
|
_screen_disable_anim = false;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void GfxMainBlitterViewport(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub, SpriteID sprite_id)
|
static void GfxMainBlitterViewport(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub, SpriteID sprite_id)
|
||||||
{
|
{
|
||||||
GfxBlitter<ZOOM_LVL_BASE, false>(sprite, x, y, mode, sub, sprite_id, _cur_dpi->zoom);
|
GfxBlitter<ZOOM_LVL_BASE, false>(sprite, x, y, mode, sub, sprite_id, _cur_dpi->zoom);
|
||||||
|
|
|
@ -68,6 +68,7 @@ extern std::vector<Dimension> _resolutions;
|
||||||
extern Dimension _cur_resolution;
|
extern Dimension _cur_resolution;
|
||||||
extern Palette _cur_palette; ///< Current palette
|
extern Palette _cur_palette; ///< Current palette
|
||||||
|
|
||||||
|
void HandleToolbarHotkey(int hotkey);
|
||||||
void HandleKeypress(uint keycode, WChar key);
|
void HandleKeypress(uint keycode, WChar key);
|
||||||
void HandleTextInput(const char *str, bool marked = false, const char *caret = nullptr, const char *insert_location = nullptr, const char *replacement_end = nullptr);
|
void HandleTextInput(const char *str, bool marked = false, const char *caret = nullptr, const char *insert_location = nullptr, const char *replacement_end = nullptr);
|
||||||
void HandleCtrlChanged();
|
void HandleCtrlChanged();
|
||||||
|
@ -90,6 +91,7 @@ void GfxScroll(int left, int top, int width, int height, int xo, int yo);
|
||||||
Dimension GetSpriteSize(SpriteID sprid, Point *offset = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI);
|
Dimension GetSpriteSize(SpriteID sprid, Point *offset = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI);
|
||||||
void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr);
|
void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr);
|
||||||
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI);
|
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI);
|
||||||
|
std::unique_ptr<uint32[]> DrawSpriteToRgbaBuffer(SpriteID spriteId);
|
||||||
|
|
||||||
int DrawString(int left, int right, int top, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
int DrawString(int left, int right, int top, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||||
int DrawString(int left, int right, int top, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
int DrawString(int left, int right, int top, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||||
|
|
|
@ -30,6 +30,10 @@
|
||||||
#define HAVE_OSX_1012_SDK
|
#define HAVE_OSX_1012_SDK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MAC_OS_X_VERSION_10_15
|
||||||
|
#define HAVE_OSX_1015_SDK
|
||||||
|
#endif
|
||||||
|
|
||||||
/* It would seem that to ensure backward compatibility we have to ensure that we have defined MAC_OS_X_VERSION_10_x everywhere */
|
/* It would seem that to ensure backward compatibility we have to ensure that we have defined MAC_OS_X_VERSION_10_x everywhere */
|
||||||
#ifndef MAC_OS_X_VERSION_10_3
|
#ifndef MAC_OS_X_VERSION_10_3
|
||||||
#define MAC_OS_X_VERSION_10_3 1030
|
#define MAC_OS_X_VERSION_10_3 1030
|
||||||
|
|
|
@ -1944,49 +1944,6 @@ static ToolbarButtonProc * const _toolbar_button_procs[] = {
|
||||||
ToolbarSwitchClick,
|
ToolbarSwitchClick,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MainToolbarHotkeys {
|
|
||||||
MTHK_PAUSE,
|
|
||||||
MTHK_FASTFORWARD,
|
|
||||||
MTHK_SETTINGS,
|
|
||||||
MTHK_SAVEGAME,
|
|
||||||
MTHK_LOADGAME,
|
|
||||||
MTHK_SMALLMAP,
|
|
||||||
MTHK_TOWNDIRECTORY,
|
|
||||||
MTHK_SUBSIDIES,
|
|
||||||
MTHK_STATIONS,
|
|
||||||
MTHK_FINANCES,
|
|
||||||
MTHK_COMPANIES,
|
|
||||||
MTHK_STORY,
|
|
||||||
MTHK_GOAL,
|
|
||||||
MTHK_GRAPHS,
|
|
||||||
MTHK_LEAGUE,
|
|
||||||
MTHK_INDUSTRIES,
|
|
||||||
MTHK_TRAIN_LIST,
|
|
||||||
MTHK_ROADVEH_LIST,
|
|
||||||
MTHK_SHIP_LIST,
|
|
||||||
MTHK_AIRCRAFT_LIST,
|
|
||||||
MTHK_ZOOM_IN,
|
|
||||||
MTHK_ZOOM_OUT,
|
|
||||||
MTHK_BUILD_RAIL,
|
|
||||||
MTHK_BUILD_ROAD,
|
|
||||||
MTHK_BUILD_TRAM,
|
|
||||||
MTHK_BUILD_DOCKS,
|
|
||||||
MTHK_BUILD_AIRPORT,
|
|
||||||
MTHK_BUILD_TREES,
|
|
||||||
MTHK_MUSIC,
|
|
||||||
MTHK_LANDINFO,
|
|
||||||
MTHK_AI_DEBUG,
|
|
||||||
MTHK_SMALL_SCREENSHOT,
|
|
||||||
MTHK_ZOOMEDIN_SCREENSHOT,
|
|
||||||
MTHK_DEFAULTZOOM_SCREENSHOT,
|
|
||||||
MTHK_GIANT_SCREENSHOT,
|
|
||||||
MTHK_CHEATS,
|
|
||||||
MTHK_TERRAFORM,
|
|
||||||
MTHK_EXTRA_VIEWPORT,
|
|
||||||
MTHK_CLIENT_LIST,
|
|
||||||
MTHK_SIGN_LIST,
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Main toolbar. */
|
/** Main toolbar. */
|
||||||
struct MainToolbarWindow : Window {
|
struct MainToolbarWindow : Window {
|
||||||
GUITimer timer;
|
GUITimer timer;
|
||||||
|
|
|
@ -10,6 +10,49 @@
|
||||||
#ifndef TOOLBAR_GUI_H
|
#ifndef TOOLBAR_GUI_H
|
||||||
#define TOOLBAR_GUI_H
|
#define TOOLBAR_GUI_H
|
||||||
|
|
||||||
|
enum MainToolbarHotkeys {
|
||||||
|
MTHK_PAUSE,
|
||||||
|
MTHK_FASTFORWARD,
|
||||||
|
MTHK_SETTINGS,
|
||||||
|
MTHK_SAVEGAME,
|
||||||
|
MTHK_LOADGAME,
|
||||||
|
MTHK_SMALLMAP,
|
||||||
|
MTHK_TOWNDIRECTORY,
|
||||||
|
MTHK_SUBSIDIES,
|
||||||
|
MTHK_STATIONS,
|
||||||
|
MTHK_FINANCES,
|
||||||
|
MTHK_COMPANIES,
|
||||||
|
MTHK_STORY,
|
||||||
|
MTHK_GOAL,
|
||||||
|
MTHK_GRAPHS,
|
||||||
|
MTHK_LEAGUE,
|
||||||
|
MTHK_INDUSTRIES,
|
||||||
|
MTHK_TRAIN_LIST,
|
||||||
|
MTHK_ROADVEH_LIST,
|
||||||
|
MTHK_SHIP_LIST,
|
||||||
|
MTHK_AIRCRAFT_LIST,
|
||||||
|
MTHK_ZOOM_IN,
|
||||||
|
MTHK_ZOOM_OUT,
|
||||||
|
MTHK_BUILD_RAIL,
|
||||||
|
MTHK_BUILD_ROAD,
|
||||||
|
MTHK_BUILD_TRAM,
|
||||||
|
MTHK_BUILD_DOCKS,
|
||||||
|
MTHK_BUILD_AIRPORT,
|
||||||
|
MTHK_BUILD_TREES,
|
||||||
|
MTHK_MUSIC,
|
||||||
|
MTHK_LANDINFO,
|
||||||
|
MTHK_AI_DEBUG,
|
||||||
|
MTHK_SMALL_SCREENSHOT,
|
||||||
|
MTHK_ZOOMEDIN_SCREENSHOT,
|
||||||
|
MTHK_DEFAULTZOOM_SCREENSHOT,
|
||||||
|
MTHK_GIANT_SCREENSHOT,
|
||||||
|
MTHK_CHEATS,
|
||||||
|
MTHK_TERRAFORM,
|
||||||
|
MTHK_EXTRA_VIEWPORT,
|
||||||
|
MTHK_CLIENT_LIST,
|
||||||
|
MTHK_SIGN_LIST
|
||||||
|
};
|
||||||
|
|
||||||
void AllocateToolbar();
|
void AllocateToolbar();
|
||||||
void ToggleBoundingBoxes();
|
void ToggleBoundingBoxes();
|
||||||
void ToggleDirtyBlocks();
|
void ToggleDirtyBlocks();
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#define COCOA_WND_H
|
#define COCOA_WND_H
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#include "toolbar_gui.h"
|
||||||
|
#include "table/sprites.h"
|
||||||
|
|
||||||
class VideoDriver_Cocoa;
|
class VideoDriver_Cocoa;
|
||||||
|
|
||||||
|
@ -28,8 +30,67 @@ extern NSString *OTTDMainLaunchGameEngine;
|
||||||
+ (NSCursor *) clearCocoaCursor;
|
+ (NSCursor *) clearCocoaCursor;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
#ifdef HAVE_OSX_1015_SDK
|
||||||
|
/* 9 items can be displayed on the touch bar when using default buttons. */
|
||||||
|
static NSArray *touchBarButtonIdentifiers = @[
|
||||||
|
@"openttd.pause",
|
||||||
|
@"openttd.fastforward",
|
||||||
|
@"openttd.zoom_in",
|
||||||
|
@"openttd.zoom_out",
|
||||||
|
@"openttd.build_rail",
|
||||||
|
@"openttd.build_road",
|
||||||
|
@"openttd.build_tram",
|
||||||
|
@"openttd.build_docks",
|
||||||
|
@"openttd.build_airport",
|
||||||
|
NSTouchBarItemIdentifierOtherItemsProxy
|
||||||
|
];
|
||||||
|
|
||||||
|
static NSDictionary *touchBarButtonSprites = @{
|
||||||
|
@"openttd.pause": [NSNumber numberWithInt:SPR_IMG_PAUSE],
|
||||||
|
@"openttd.fastforward": [NSNumber numberWithInt:SPR_IMG_FASTFORWARD],
|
||||||
|
@"openttd.zoom_in": [NSNumber numberWithInt:SPR_IMG_ZOOMIN],
|
||||||
|
@"openttd.zoom_out": [NSNumber numberWithInt:SPR_IMG_ZOOMOUT],
|
||||||
|
@"openttd.build_rail": [NSNumber numberWithInt:SPR_IMG_BUILDRAIL],
|
||||||
|
@"openttd.build_road": [NSNumber numberWithInt:SPR_IMG_BUILDROAD],
|
||||||
|
@"openttd.build_tram": [NSNumber numberWithInt:SPR_IMG_BUILDTRAMS],
|
||||||
|
@"openttd.build_docks": [NSNumber numberWithInt:SPR_IMG_BUILDWATER],
|
||||||
|
@"openttd.build_airport": [NSNumber numberWithInt:SPR_IMG_BUILDAIR],
|
||||||
|
};
|
||||||
|
|
||||||
|
static NSDictionary *touchBarButtonActions = @{
|
||||||
|
@"openttd.pause": [NSNumber numberWithInt:MTHK_PAUSE],
|
||||||
|
@"openttd.fastforward": [NSNumber numberWithInt:MTHK_FASTFORWARD],
|
||||||
|
@"openttd.zoom_in": [NSNumber numberWithInt:MTHK_ZOOM_IN],
|
||||||
|
@"openttd.zoom_out": [NSNumber numberWithInt:MTHK_ZOOM_OUT],
|
||||||
|
@"openttd.build_rail": [NSNumber numberWithInt:MTHK_BUILD_RAIL],
|
||||||
|
@"openttd.build_road": [NSNumber numberWithInt:MTHK_BUILD_ROAD],
|
||||||
|
@"openttd.build_tram": [NSNumber numberWithInt:MTHK_BUILD_TRAM],
|
||||||
|
@"openttd.build_docks": [NSNumber numberWithInt:MTHK_BUILD_DOCKS],
|
||||||
|
@"openttd.build_airport": [NSNumber numberWithInt:MTHK_BUILD_AIRPORT],
|
||||||
|
};
|
||||||
|
|
||||||
|
static NSDictionary *touchBarFallbackText = @{
|
||||||
|
@"openttd.pause": @"Pause",
|
||||||
|
@"openttd.fastforward": @"Fast Forward",
|
||||||
|
@"openttd.zoom_in": @"Zoom In",
|
||||||
|
@"openttd.zoom_out": @"Zoom Out",
|
||||||
|
@"openttd.build_rail": @"Rail",
|
||||||
|
@"openttd.build_road": @"Road",
|
||||||
|
@"openttd.build_tram": @"Tram",
|
||||||
|
@"openttd.build_docks": @"Docks",
|
||||||
|
@"openttd.build_airport": @"Airport",
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Subclass of NSWindow to cater our special needs */
|
/** Subclass of NSWindow to cater our special needs */
|
||||||
|
#ifdef HAVE_OSX_1015_SDK
|
||||||
|
@interface OTTD_CocoaWindow : NSWindow <NSTouchBarDelegate>
|
||||||
|
@property (strong) NSSet *touchbarItems;
|
||||||
|
- (NSImage*)generateImage:(int)spriteId;
|
||||||
|
#else
|
||||||
@interface OTTD_CocoaWindow : NSWindow
|
@interface OTTD_CocoaWindow : NSWindow
|
||||||
|
#endif
|
||||||
|
|
||||||
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv;
|
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv;
|
||||||
|
|
||||||
- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
|
- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include "../../gfx_func.h"
|
#include "../../gfx_func.h"
|
||||||
#include "../../window_func.h"
|
#include "../../window_func.h"
|
||||||
#include "../../window_gui.h"
|
#include "../../window_gui.h"
|
||||||
|
#include "spritecache.h"
|
||||||
|
|
||||||
/* Table data for key mapping. */
|
/* Table data for key mapping. */
|
||||||
#include "cocoa_keys.h"
|
#include "cocoa_keys.h"
|
||||||
|
@ -405,6 +405,87 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_OSX_1015_SDK
|
||||||
|
|
||||||
|
- (void)touchBarButtonAction:(id)sender
|
||||||
|
{
|
||||||
|
if (@available(macOS 10.15, *)) {
|
||||||
|
NSButtonTouchBarItem *btn = (NSButtonTouchBarItem *)sender;
|
||||||
|
NSNumber *hotkeyIndex = [ touchBarButtonActions objectForKey:btn.identifier ];
|
||||||
|
HandleToolbarHotkey(hotkeyIndex.intValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark NSTouchBarProvider
|
||||||
|
- (nullable NSTouchBar *)makeTouchBar
|
||||||
|
{
|
||||||
|
NSTouchBar *bar = [ [ NSTouchBar alloc ] init ];
|
||||||
|
bar.delegate = self;
|
||||||
|
bar.defaultItemIdentifiers = touchBarButtonIdentifiers;
|
||||||
|
|
||||||
|
return bar;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(NSImage *)generateImage:(int)spriteId
|
||||||
|
{
|
||||||
|
if (!SpriteExists(spriteId)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fetch the sprite and create a new bitmap */
|
||||||
|
const Sprite *fullspr = GetSprite(spriteId, ST_NORMAL);
|
||||||
|
const std::unique_ptr<uint32[]> buffer = DrawSpriteToRgbaBuffer(spriteId);
|
||||||
|
if (!buffer) {
|
||||||
|
return nullptr; // failed to blit sprite or we're using an 8bpp blitter.
|
||||||
|
}
|
||||||
|
|
||||||
|
NSBitmapImageRep *bitmap = [ [ NSBitmapImageRep alloc ] initWithBitmapDataPlanes:nil pixelsWide:fullspr->width pixelsHigh:fullspr->height bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:0 bitsPerPixel:0 ];
|
||||||
|
|
||||||
|
/* Copy the sprite to the NSBitmapImageRep image buffer */
|
||||||
|
const Colour *src = (const Colour *)buffer.get();
|
||||||
|
for (int y = 0; y < fullspr->height; y++) {
|
||||||
|
for (int x = 0; x < fullspr->width; x++) {
|
||||||
|
NSUInteger pixel[4];
|
||||||
|
pixel[0] = src->r;
|
||||||
|
pixel[1] = src->g;
|
||||||
|
pixel[2] = src->b;
|
||||||
|
pixel[3] = src->a;
|
||||||
|
[ bitmap setPixel:pixel atX:x y:y ];
|
||||||
|
|
||||||
|
src += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finally, convert the NSBitmapImageRep we created to a NSimage we can put on the button and clean up. */
|
||||||
|
NSImage *outImage = [ [ NSImage alloc ] initWithSize:NSMakeSize(fullspr->width, fullspr->height) ];
|
||||||
|
[ outImage addRepresentation:bitmap ];
|
||||||
|
[ bitmap release ];
|
||||||
|
|
||||||
|
return outImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark NSTouchBarDelegate
|
||||||
|
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier
|
||||||
|
{
|
||||||
|
if (@available(macOS 10.15, *)) {
|
||||||
|
NSButtonTouchBarItem *button = [ [ NSButtonTouchBarItem alloc ] initWithIdentifier:identifier ];
|
||||||
|
button.target = self;
|
||||||
|
button.action = @selector(touchBarButtonAction:);
|
||||||
|
|
||||||
|
NSNumber *num = touchBarButtonSprites[identifier];
|
||||||
|
NSImage *generatedImage = [ self generateImage:num.unsignedIntValue ];
|
||||||
|
if (generatedImage != nullptr) {
|
||||||
|
button.image = generatedImage;
|
||||||
|
} else {
|
||||||
|
button.title = NSLocalizedString(touchBarFallbackText[identifier], @"");
|
||||||
|
}
|
||||||
|
return button;
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the rectangle we draw our window in
|
* Define the rectangle we draw our window in
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2586,6 +2586,22 @@ EventState Window::HandleEditBoxKey(int wid, WChar key, uint16 keycode)
|
||||||
return ES_HANDLED;
|
return ES_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle Toolbar hotkey events - can come from a source like the MacBook Touch Bar.
|
||||||
|
* @param hotkey Hotkey code
|
||||||
|
*/
|
||||||
|
void HandleToolbarHotkey(int hotkey)
|
||||||
|
{
|
||||||
|
assert(HasModalProgress() || IsLocalCompany());
|
||||||
|
|
||||||
|
Window *w = FindWindowById(WC_MAIN_TOOLBAR, 0);
|
||||||
|
if (w != nullptr) {
|
||||||
|
if (w->window_desc->hotkeys != nullptr) {
|
||||||
|
if (hotkey >= 0 && w->OnHotkey(hotkey) == ES_HANDLED) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle keyboard input.
|
* Handle keyboard input.
|
||||||
* @param keycode Virtual keycode of the key.
|
* @param keycode Virtual keycode of the key.
|
||||||
|
|
Loading…
Reference in New Issue