mirror of
https://github.com/italicsjenga/rust_minifb.git
synced 2025-01-27 11:06:33 +11:00
Cleanup + shortcut work
This commit is contained in:
parent
835837286f
commit
6f47d190b6
4 changed files with 194 additions and 193 deletions
|
@ -1,7 +1,7 @@
|
||||||
extern crate minifb;
|
extern crate minifb;
|
||||||
|
|
||||||
use minifb::{Window, Key, Scale, WindowOptions, Menu, MenuItem};
|
use minifb::{Window, Key, Scale, WindowOptions, Menu, MenuItem};
|
||||||
//use minifb::{MENU_KEY_CTRL, MENU_KEY_COMMAND};
|
use minifb::{MENU_KEY_COMMAND, MENU_KEY_CTRL};
|
||||||
|
|
||||||
const WIDTH: usize = 640;
|
const WIDTH: usize = 640;
|
||||||
const HEIGHT: usize = 360;
|
const HEIGHT: usize = 360;
|
||||||
|
@ -94,7 +94,7 @@ fn main() {
|
||||||
menu.add_menu_item(&MenuItem::new("Item 2", 2));
|
menu.add_menu_item(&MenuItem::new("Item 2", 2));
|
||||||
menu.add_menu_item(&MenuItem::new("Item 3", 3));
|
menu.add_menu_item(&MenuItem::new("Item 3", 3));
|
||||||
|
|
||||||
menu.add_item("Some item", 2).shortcut(Key::Y, 0).build();
|
menu.add_item("Some item", 2).shortcut(Key::Y, MENU_KEY_CTRL).build();
|
||||||
|
|
||||||
let _ = window.add_menu(&menu);
|
let _ = window.add_menu(&menu);
|
||||||
|
|
||||||
|
|
|
@ -594,10 +594,10 @@ impl<'a> MenuItem<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn shortcut(self, key: Key, modifier: u32) -> Self {
|
pub fn shortcut(self, key: Key, modifier: usize) -> Self {
|
||||||
MenuItem {
|
MenuItem {
|
||||||
key: key,
|
key: key,
|
||||||
modifier: modifier,
|
modifier: modifier as u32,
|
||||||
.. self
|
.. self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "OSXWindow.h"
|
#include "OSXWindow.h"
|
||||||
#include "OSXWindowFrameView.h"
|
#include "OSXWindowFrameView.h"
|
||||||
#include <Cocoa/Cocoa.h>
|
#include <Cocoa/Cocoa.h>
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
static bool s_init = false;
|
static bool s_init = false;
|
||||||
|
@ -452,6 +453,195 @@ void mfb_update_menu(void* window, const char* name, void* m)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static CFStringRef create_string_for_key(CGKeyCode keyCode)
|
||||||
|
{
|
||||||
|
TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
|
||||||
|
CFDataRef layoutData = TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
|
||||||
|
|
||||||
|
if (!layoutData)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData);
|
||||||
|
|
||||||
|
UInt32 keysDown = 0;
|
||||||
|
UniChar chars[4];
|
||||||
|
UniCharCount realLength;
|
||||||
|
|
||||||
|
UCKeyTranslate(keyboardLayout,
|
||||||
|
keyCode,
|
||||||
|
kUCKeyActionDisplay,
|
||||||
|
0,
|
||||||
|
LMGetKbdType(),
|
||||||
|
kUCKeyTranslateNoDeadKeysBit,
|
||||||
|
&keysDown,
|
||||||
|
sizeof(chars) / sizeof(chars[0]),
|
||||||
|
&realLength,
|
||||||
|
chars);
|
||||||
|
CFRelease(currentKeyboard);
|
||||||
|
|
||||||
|
return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static NSString* convert_key_code_to_string(int key)
|
||||||
|
{
|
||||||
|
if (key < 128)
|
||||||
|
{
|
||||||
|
NSString* charName = (NSString*)create_string_for_key(key);
|
||||||
|
|
||||||
|
if (charName)
|
||||||
|
return charName;
|
||||||
|
|
||||||
|
return [NSString stringWithFormat:@"%c", (char)key];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [NSString stringWithFormat:@"%C", (uint16_t)key];
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
const uint32_t MENU_KEY_COMMAND = 1;
|
||||||
|
const uint32_t MENU_KEY_WIN = 2;
|
||||||
|
const uint32_t MENU_KEY_SHIFT= 4;
|
||||||
|
const uint32_t MENU_KEY_CTRL = 8;
|
||||||
|
const uint32_t MENU_KEY_ALT = 16;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
void build_submenu(NSMenu* menu, MenuDesc* desc)
|
||||||
|
{
|
||||||
|
[menu removeAllItems];
|
||||||
|
|
||||||
|
while (desc->menu_id != -2)
|
||||||
|
{
|
||||||
|
NSString* name = [NSString stringWithUTF8String: desc->name];
|
||||||
|
|
||||||
|
if (desc->menu_id == -1)
|
||||||
|
{
|
||||||
|
[menu addItem:[NSMenuItem separatorItem]];
|
||||||
|
}
|
||||||
|
else if (desc->sub_menu)
|
||||||
|
{
|
||||||
|
NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:name action:NULL keyEquivalent:@""];
|
||||||
|
NSMenu* newMenu = [[NSMenu alloc] initWithTitle:name];
|
||||||
|
[newItem setSubmenu:newMenu];
|
||||||
|
|
||||||
|
build_submenu(newMenu, desc->sub_menu);
|
||||||
|
|
||||||
|
[newMenu release];
|
||||||
|
[menu addItem:newItem];
|
||||||
|
[newItem release];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(onMenuPress:) keyEquivalent:@""];
|
||||||
|
[newItem setTag:desc->menu_id];
|
||||||
|
|
||||||
|
if (desc->modifier_mac & MENU_KEY_COMMAND) {
|
||||||
|
mask |= NSCommandKeyMask;
|
||||||
|
}
|
||||||
|
if (desc->modifier_mac & MENU_KEY_SHIFT) {
|
||||||
|
mask |= NSShiftKeyMask;
|
||||||
|
}
|
||||||
|
if (desc->modifier_mac & MENU_KEY_CTRL) {
|
||||||
|
mask |= NSControlKeyMask;
|
||||||
|
}
|
||||||
|
if (desc->modifier_mac & MENU_KEY_ALT) {
|
||||||
|
mask |= NSAlternateKeyMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (desc->key != 0x7f) {
|
||||||
|
NSString* key = convert_key_code_to_string(desc->key);
|
||||||
|
|
||||||
|
if (key) {
|
||||||
|
[newItem setKeyEquivalentModifierMask: mask];
|
||||||
|
[newItem setKeyEquivalent:key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (desc->enabled) {
|
||||||
|
[newItem setEnabled:YES];
|
||||||
|
} else {
|
||||||
|
[newItem setEnabled:NO];
|
||||||
|
}
|
||||||
|
|
||||||
|
[newItem setOnStateImage: newItem.offStateImage];
|
||||||
|
[menu addItem:newItem];
|
||||||
|
[newItem release];
|
||||||
|
}
|
||||||
|
|
||||||
|
desc++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
uint64_t mfb_add_menu_item(
|
||||||
|
void* in_menu,
|
||||||
|
int32_t menu_id,
|
||||||
|
const char* item_name,
|
||||||
|
bool enabled,
|
||||||
|
uint32_t key,
|
||||||
|
uint32_t modfier)
|
||||||
|
{
|
||||||
|
NSMenu* menu = (NSMenu*)in_menu;
|
||||||
|
|
||||||
|
const char* t = strdup(item_name);
|
||||||
|
|
||||||
|
NSString* name = [NSString stringWithUTF8String: t];
|
||||||
|
|
||||||
|
if (menu_id == -1)
|
||||||
|
{
|
||||||
|
[menu addItem:[NSMenuItem separatorItem]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int mask = 0;
|
||||||
|
NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(onMenuPress:) keyEquivalent:@""];
|
||||||
|
[newItem setTag:menu_id];
|
||||||
|
|
||||||
|
if ((modfier & MENU_KEY_COMMAND) ||
|
||||||
|
(modfier & MENU_KEY_COMMAND)) {
|
||||||
|
mask |= NSCommandKeyMask;
|
||||||
|
}
|
||||||
|
if (modfier & MENU_KEY_SHIFT) {
|
||||||
|
mask |= NSShiftKeyMask;
|
||||||
|
}
|
||||||
|
if (modfier & MENU_KEY_ALT) {
|
||||||
|
mask |= NSAlternateKeyMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key != 0x7f) {
|
||||||
|
NSString* key_string = convert_key_code_to_string(key);
|
||||||
|
|
||||||
|
if (key_string) {
|
||||||
|
[newItem setKeyEquivalentModifierMask: mask];
|
||||||
|
[newItem setKeyEquivalent:key_string];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enabled) {
|
||||||
|
[newItem setEnabled:YES];
|
||||||
|
} else {
|
||||||
|
[newItem setEnabled:NO];
|
||||||
|
}
|
||||||
|
|
||||||
|
[newItem setOnStateImage: newItem.offStateImage];
|
||||||
|
[menu addItem:newItem];
|
||||||
|
[newItem release];
|
||||||
|
|
||||||
|
return (uint64_t)newItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void* mfb_create_menu(const char* name) {
|
void* mfb_create_menu(const char* name) {
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#import "OSXWindow.h"
|
#import "OSXWindow.h"
|
||||||
#import "OSXWindowFrameView.h"
|
#import "OSXWindowFrameView.h"
|
||||||
#include <Carbon/Carbon.h>
|
|
||||||
|
|
||||||
@implementation OSXWindow
|
@implementation OSXWindow
|
||||||
|
|
||||||
|
@ -208,194 +207,6 @@
|
||||||
self->active_menu_id = menu_id;
|
self->active_menu_id = menu_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static CFStringRef create_string_for_key(CGKeyCode keyCode)
|
|
||||||
{
|
|
||||||
TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
|
|
||||||
CFDataRef layoutData = TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
|
|
||||||
|
|
||||||
if (!layoutData)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData);
|
|
||||||
|
|
||||||
UInt32 keysDown = 0;
|
|
||||||
UniChar chars[4];
|
|
||||||
UniCharCount realLength;
|
|
||||||
|
|
||||||
UCKeyTranslate(keyboardLayout,
|
|
||||||
keyCode,
|
|
||||||
kUCKeyActionDisplay,
|
|
||||||
0,
|
|
||||||
LMGetKbdType(),
|
|
||||||
kUCKeyTranslateNoDeadKeysBit,
|
|
||||||
&keysDown,
|
|
||||||
sizeof(chars) / sizeof(chars[0]),
|
|
||||||
&realLength,
|
|
||||||
chars);
|
|
||||||
CFRelease(currentKeyboard);
|
|
||||||
|
|
||||||
return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static NSString* convert_key_code_to_string(int key)
|
|
||||||
{
|
|
||||||
if (key < 128)
|
|
||||||
{
|
|
||||||
NSString* charName = (NSString*)create_string_for_key(key);
|
|
||||||
|
|
||||||
if (charName)
|
|
||||||
return charName;
|
|
||||||
|
|
||||||
return [NSString stringWithFormat:@"%c", (char)key];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [NSString stringWithFormat:@"%C", (uint16_t)key];
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
const uint32_t MENU_KEY_COMMAND = 1;
|
|
||||||
const uint32_t MENU_KEY_WIN = 2;
|
|
||||||
const uint32_t MENU_KEY_SHIFT= 4;
|
|
||||||
const uint32_t MENU_KEY_CTRL = 8;
|
|
||||||
const uint32_t MENU_KEY_ALT = 16;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/*
|
|
||||||
void build_submenu(NSMenu* menu, MenuDesc* desc)
|
|
||||||
{
|
|
||||||
[menu removeAllItems];
|
|
||||||
|
|
||||||
while (desc->menu_id != -2)
|
|
||||||
{
|
|
||||||
NSString* name = [NSString stringWithUTF8String: desc->name];
|
|
||||||
|
|
||||||
if (desc->menu_id == -1)
|
|
||||||
{
|
|
||||||
[menu addItem:[NSMenuItem separatorItem]];
|
|
||||||
}
|
|
||||||
else if (desc->sub_menu)
|
|
||||||
{
|
|
||||||
NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:name action:NULL keyEquivalent:@""];
|
|
||||||
NSMenu* newMenu = [[NSMenu alloc] initWithTitle:name];
|
|
||||||
[newItem setSubmenu:newMenu];
|
|
||||||
|
|
||||||
build_submenu(newMenu, desc->sub_menu);
|
|
||||||
|
|
||||||
[newMenu release];
|
|
||||||
[menu addItem:newItem];
|
|
||||||
[newItem release];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int mask = 0;
|
|
||||||
NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(onMenuPress:) keyEquivalent:@""];
|
|
||||||
[newItem setTag:desc->menu_id];
|
|
||||||
|
|
||||||
if (desc->modifier_mac & MENU_KEY_COMMAND) {
|
|
||||||
mask |= NSCommandKeyMask;
|
|
||||||
}
|
|
||||||
if (desc->modifier_mac & MENU_KEY_SHIFT) {
|
|
||||||
mask |= NSShiftKeyMask;
|
|
||||||
}
|
|
||||||
if (desc->modifier_mac & MENU_KEY_CTRL) {
|
|
||||||
mask |= NSControlKeyMask;
|
|
||||||
}
|
|
||||||
if (desc->modifier_mac & MENU_KEY_ALT) {
|
|
||||||
mask |= NSAlternateKeyMask;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (desc->key != 0x7f) {
|
|
||||||
NSString* key = convert_key_code_to_string(desc->key);
|
|
||||||
|
|
||||||
if (key) {
|
|
||||||
[newItem setKeyEquivalentModifierMask: mask];
|
|
||||||
[newItem setKeyEquivalent:key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (desc->enabled) {
|
|
||||||
[newItem setEnabled:YES];
|
|
||||||
} else {
|
|
||||||
[newItem setEnabled:NO];
|
|
||||||
}
|
|
||||||
|
|
||||||
[newItem setOnStateImage: newItem.offStateImage];
|
|
||||||
[menu addItem:newItem];
|
|
||||||
[newItem release];
|
|
||||||
}
|
|
||||||
|
|
||||||
desc++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
uint64_t mfb_add_menu_item(
|
|
||||||
void* in_menu,
|
|
||||||
int32_t menu_id,
|
|
||||||
const char* item_name,
|
|
||||||
bool enabled,
|
|
||||||
uint32_t key,
|
|
||||||
uint32_t modfier)
|
|
||||||
{
|
|
||||||
NSMenu* menu = (NSMenu*)in_menu;
|
|
||||||
|
|
||||||
const char* t = strdup(item_name);
|
|
||||||
|
|
||||||
NSString* name = [NSString stringWithUTF8String: t];
|
|
||||||
|
|
||||||
if (menu_id == -1)
|
|
||||||
{
|
|
||||||
[menu addItem:[NSMenuItem separatorItem]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int mask = 0;
|
|
||||||
NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(onMenuPress:) keyEquivalent:@""];
|
|
||||||
[newItem setTag:menu_id];
|
|
||||||
|
|
||||||
if ((modfier & MENU_KEY_COMMAND) ||
|
|
||||||
(modfier & MENU_KEY_COMMAND)) {
|
|
||||||
mask |= NSCommandKeyMask;
|
|
||||||
}
|
|
||||||
if (modfier & MENU_KEY_SHIFT) {
|
|
||||||
mask |= NSShiftKeyMask;
|
|
||||||
}
|
|
||||||
if (modfier & MENU_KEY_ALT) {
|
|
||||||
mask |= NSAlternateKeyMask;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (key != 0x7f) {
|
|
||||||
NSString* key_string = convert_key_code_to_string(key);
|
|
||||||
|
|
||||||
if (key_string) {
|
|
||||||
[newItem setKeyEquivalentModifierMask: mask];
|
|
||||||
[newItem setKeyEquivalent:key_string];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (enabled) {
|
|
||||||
[newItem setEnabled:YES];
|
|
||||||
} else {
|
|
||||||
[newItem setEnabled:NO];
|
|
||||||
}
|
|
||||||
|
|
||||||
[newItem setOnStateImage: newItem.offStateImage];
|
|
||||||
[menu addItem:newItem];
|
|
||||||
[newItem release];
|
|
||||||
|
|
||||||
return (uint64_t)newItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue