From 812c2def5564f6aeb99fe6e593de6f7d21aa2a6a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 27 Nov 2007 19:05:36 +0000 Subject: ported f0.keyboard_layout to Pd, I commented out the 'assist' method because A_CANT is a mytery to me svn path=/trunk/externals/hcs/; revision=9054 --- keyboard_layout.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100755 keyboard_layout.c (limited to 'keyboard_layout.c') diff --git a/keyboard_layout.c b/keyboard_layout.c new file mode 100755 index 0000000..4c7c88e --- /dev/null +++ b/keyboard_layout.c @@ -0,0 +1,133 @@ +/* Copyright 2006 Fredrik Olofsson + * Copyright 2007 Free Software Foundation + * ported to Pd by Hans-Christoph Steiner from f0.keyboard_layout.c + */ + +#ifdef __APPLE__ + +#include "m_pd.h" +#include + +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; + +/* +void keyboard_layout_assist(t_keyboard_layout *x, Object *m, long msg, long arg, char *dst) { + if(msg==ASSIST_INLET) { + sprintf(dst, "bang to get current, symbol to set"); + } else if(msg==ASSIST_OUTLET) { + switch(arg) { + case 0: + sprintf(dst, "current keyboard layout (symbol)"); + break; + case 1: + sprintf(dst, "dump outlet (for menu)"); + break; + } + } +} +*/ + +//---------------------------------------------------------------------------------------------- +void keyboard_layout_bang(t_keyboard_layout *x) { + //OSStatus err; + KeyboardLayoutRef currentLayoutRef; + CFStringRef keyboardName; + char cKeyboardName[100]; + + KLGetCurrentKeyboardLayout(¤tLayoutRef); + KLGetKeyboardLayoutProperty(currentLayoutRef, kKLName, (const void **)&keyboardName); + CFStringGetCString(keyboardName, cKeyboardName, 100, kCFStringEncodingASCII); + + outlet_anything(x->x_data_outlet, gensym(cKeyboardName), 0, NULL); +} + +void keyboard_layout_menu(t_keyboard_layout *x) { + //OSStatus err; + KeyboardLayoutRef currentLayoutRef; + CFStringRef 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; + CFStringRef keyboardName; + char cKeyboardName[100]; + + keyboardName= CFStringCreateWithCString(NULL, s->s_name, kCFStringEncodingASCII); + KLGetKeyboardLayoutWithName(keyboardName, ¤tLayoutRef); + KLGetKeyboardLayoutProperty(currentLayoutRef, kKLName, (const void **)&keyboardName); + CFStringGetCString(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); +// class_addmethod(keyboard_layout_class, (t_method)keyboard_layout_assist, +// gensym("assist"), A_CANT, 0); + + post("f0.keyboard_layout v1.1-ub; distributed under GNU GPL license"); //target specific +} + + +#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