From 702b9703734e77e57b206caba6f5355473e25359 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Oct 2011 15:59:48 +0000 Subject: moved [keyboard_layout] to the apple lib, since its Apple only svn path=/trunk/externals/apple/; revision=15530 --- keyboard_layout.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 keyboard_layout.c (limited to 'keyboard_layout.c') diff --git a/keyboard_layout.c b/keyboard_layout.c new file mode 100644 index 0000000..b51168c --- /dev/null +++ b/keyboard_layout.c @@ -0,0 +1,116 @@ +/* Copyright 2006 Fredrik Olofsson + * Copyright 2007 Free Software Foundation + * ported to Pd by Hans-Christoph Steiner from f0.keyboard_layout.c + */ + +#include "m_pd.h" +#ifdef __APPLE__ +#include +#endif + +static t_class *keyboard_layout_class; + +typedef struct _keyboard_layout { + t_object x_obj; + t_outlet* x_data_outlet; + t_outlet* x_status_outlet; +} t_keyboard_layout; + +#ifdef __APPLE__ + +//---------------------------------------------------------------------------------------------- +void keyboard_layout_bang(t_keyboard_layout *x) { + //OSStatus err; + KeyboardLayoutRef currentLayoutRef; + const void *keyboardName; + char cKeyboardName[100]; + + KLGetCurrentKeyboardLayout(¤tLayoutRef); + KLGetKeyboardLayoutProperty(currentLayoutRef, kKLName, (const void **)&keyboardName); + CFStringGetCString((CFStringRef)keyboardName, cKeyboardName, 100, kCFStringEncodingASCII); + + outlet_symbol(x->x_data_outlet, gensym(cKeyboardName)); +} + +void keyboard_layout_menu(t_keyboard_layout *x) { + //OSStatus err; + KeyboardLayoutRef currentLayoutRef; + const void *keyboardName; + char cKeyboardName[100]; + CFIndex countOfLayouts; + CFIndex i; + t_atom name; + +// TODO this should probably output [menu clear( so other messages work too + outlet_anything(x->x_status_outlet, gensym("clear"), 0, NULL); + + KLGetKeyboardLayoutCount(&countOfLayouts); + for(i= 0; ix_status_outlet, gensym("append"), 1, &name); + } +} + +void keyboard_layout_anything(t_keyboard_layout *x, t_symbol *s, short argc, t_atom *argv) { + //OSStatus err; + KeyboardLayoutRef currentLayoutRef; + const void *keyboardName; + char cKeyboardName[100]; + + keyboardName= CFStringCreateWithCString(NULL, s->s_name, kCFStringEncodingASCII); + KLGetKeyboardLayoutWithName(keyboardName, ¤tLayoutRef); + KLGetKeyboardLayoutProperty(currentLayoutRef, kKLName, (const void **)&keyboardName); + CFStringGetCString((CFStringRef)keyboardName, cKeyboardName, 100, kCFStringEncodingASCII); + KLSetCurrentKeyboardLayout(currentLayoutRef); + //outlet_anything(x->t_out, s, 0, NULL); + keyboard_layout_bang(x); +} + +void *keyboard_layout_new(void) { + t_keyboard_layout *x = (t_keyboard_layout *)pd_new(keyboard_layout_class); + + x->x_data_outlet = outlet_new(&x->x_obj, &s_float); + x->x_status_outlet = outlet_new(&x->x_obj, &s_symbol); + + return (x); +} + +//---------------------------------------------------------------------------------------------- +void keyboard_layout_setup(void) { + keyboard_layout_class = class_new(gensym("keyboard_layout"), + (t_newmethod)keyboard_layout_new, + NULL, + sizeof(t_keyboard_layout), + 0, A_GIMME, 0); + + class_addbang(keyboard_layout_class, (t_method)keyboard_layout_bang); + class_addanything(keyboard_layout_class, (t_method)keyboard_layout_anything); + + class_addmethod(keyboard_layout_class, (t_method)keyboard_layout_menu, + gensym("menu"), 0); + + post("f0.keyboard_layout v1.1-ub; distributed under GNU GPL license"); +} + + +#else /* GNU/Linux and Windows */ + + +void keyboard_layout_new(void) +{ + post("f0.keyboard_layout v1.1-ub; distributed under GNU GPL license"); + post("ERROR: this objectclass is currently only for Mac OS X"); +} + +void keyboard_layout_setup(void) +{ + keyboard_layout_class = class_new(gensym("text"), (t_method)keyboard_layout_new, + NULL, sizeof(t_keyboard_layout), 0, 0); +} + +#endif /* __APPLE__ */ -- cgit v1.2.1