diff options
author | pnfisher <pnfisher> | 1999-09-14 06:15:03 +0000 |
---|---|---|
committer | pnfisher <pnfisher> | 1999-09-14 06:15:03 +0000 |
commit | a70f67b0ef101cd21da0322612648880d97219cd (patch) | |
tree | 09be97a0c3fa03052bdfbb13a889ceef55ffec4f /xkb.c | |
parent | 322480a1f37e0f4e189e049fdd15a76a5c479976 (diff) | |
download | anaconda-a70f67b0ef101cd21da0322612648880d97219cd.tar.gz anaconda-a70f67b0ef101cd21da0322612648880d97219cd.tar.xz anaconda-a70f67b0ef101cd21da0322612648880d97219cd.zip |
Make keyboard select work -- default to US.
Diffstat (limited to 'xkb.c')
-rw-r--r-- | xkb.c | 113 |
1 files changed, 78 insertions, 35 deletions
@@ -4,6 +4,7 @@ #include <X11/Xlib.h> #include <X11/XKBlib.h> #include <X11/extensions/XKBrules.h> +#include <gdk/gdkx.h> #include <assert.h> #define max(a,b) ((a) > (b) ? (a) : (b)) @@ -13,98 +14,138 @@ #define XKB_XFREE86_RULES "/usr/X11R6/lib/X11/xkb/rules/xfree86" #define XKB_SUN_RULES "/usr/X11R6/lib/X11/xkb/rules/sun" +static XkbRF_RulesPtr rules; + PyObject *list_rules (); +PyObject *set_rule (PyObject *, PyObject *); +char * get_rulesbase (); static PyMethodDef _xkbMethods[] = { { "list_rules", list_rules, 1 }, + { "set_rule", set_rule, 1}, { NULL, NULL } }; +char * +get_rulesbase () +{ + char *rulesbase = XKB_XFREE86_RULES; +#ifdef __sparc__ + int fd; + + fd = open("/dev/kbd", O_RDONLY); + if (fd >= 0) { + rulesbase = XKB_SUN_RULES; + } +#endif + + return rulesbase; +} + void init_xkb () { + char *lang; PyObject *m; m = Py_InitModule ("_xkb", _xkbMethods); + lang = getenv ("LC_ALL"); + rules = XkbRF_Load (get_rulesbase (), (lang) ? lang : "C", True, True); + if (!rules) + Py_FatalError ("unable to load XKB rules database"); + if (PyErr_Occurred ()) Py_FatalError ("can't initialize module _xkb"); } +PyObject * +set_rule (PyObject *self, PyObject *args) +{ + XkbRF_VarDefsRec defs; + XkbComponentNamesRec rnames; + + if (!PyArg_ParseTuple (args, "ssss", &defs.model, &defs.layout, &defs.variant, &defs.options)) + return NULL; + + if (!strcmp (defs.model, "")) + defs.model = NULL; + if (!strcmp (defs.layout, "")) + defs.layout = NULL; + if (!strcmp (defs.variant, "")) + defs.variant = NULL; + if (!strcmp (defs.options, "")) + defs.options = NULL; + + XkbRF_GetComponents (rules, &defs, &rnames); + + XkbGetKeyboardByName (GDK_DISPLAY (), XkbUseCoreKbd, &rnames, + XkbGBN_AllComponentsMask, + XkbGBN_AllComponentsMask, True); + + XkbRF_SetNamesProp (GDK_DISPLAY (), get_rulesbase (), &defs); + + return Py_BuildValue ("i", 1); +} + PyObject * list_rules () { - PyObject *models, *layouts, *variants, *options, *rules; - XkbRF_RulesPtr list; - Bool result; + PyObject *models, *layouts, *variants, *options, *py_rules; int num_comp; int i; - char *rulesbase = XKB_XFREE86_RULES; -#ifdef __sparc__ - int fd; - - fd = open("/dev/kbd", O_RDONLY); - if (fd >= 0) { - rulesbase = XKB_SUN_RULES; - } -#endif - - list = XkbRF_Create (0,0); - result = XkbRF_LoadDescriptionsByName (rulesbase, NULL, list); models = PyDict_New (); - num_comp = min (list->models.num_desc, MAX_COMPONENTS); + num_comp = min (rules->models.num_desc, MAX_COMPONENTS); for (i = 0; i < num_comp; i++) { PyObject *desc, *name; - name = PyString_FromString (list->models.desc[i].name); - desc = PyString_FromString (list->models.desc[i].desc); + name = PyString_FromString (rules->models.desc[i].name); + desc = PyString_FromString (rules->models.desc[i].desc); PyDict_SetItem (models, name, desc); } layouts = PyDict_New (); - num_comp = min (list->layouts.num_desc, MAX_COMPONENTS); + num_comp = min (rules->layouts.num_desc, MAX_COMPONENTS); for (i = 0; i < num_comp; i++) { PyObject *desc, *name; - name = PyString_FromString (list->layouts.desc[i].name); - desc = PyString_FromString (list->layouts.desc[i].desc); + name = PyString_FromString (rules->layouts.desc[i].name); + desc = PyString_FromString (rules->layouts.desc[i].desc); PyDict_SetItem (layouts, name, desc); } variants = PyDict_New (); - num_comp = min (list->variants.num_desc, MAX_COMPONENTS); + num_comp = min (rules->variants.num_desc, MAX_COMPONENTS); for (i = 0; i < num_comp; i++) { PyObject *desc, *name; - name = PyString_FromString (list->variants.desc[i].name); - desc = PyString_FromString (list->variants.desc[i].desc); + name = PyString_FromString (rules->variants.desc[i].name); + desc = PyString_FromString (rules->variants.desc[i].desc); PyDict_SetItem (variants, name, desc); } options = PyDict_New (); - num_comp = min (list->options.num_desc, MAX_COMPONENTS); + num_comp = min (rules->options.num_desc, MAX_COMPONENTS); for (i = 0; i < num_comp; i++) { PyObject *desc, *name; - name = PyString_FromString (list->options.desc[i].name); - desc = PyString_FromString (list->options.desc[i].desc); + name = PyString_FromString (rules->options.desc[i].name); + desc = PyString_FromString (rules->options.desc[i].desc); PyDict_SetItem (options, name, desc); } - XkbRF_Free (list,True); + py_rules = PyTuple_New (4); - rules = PyTuple_New (4); + PyTuple_SET_ITEM (py_rules, 0, models); + PyTuple_SET_ITEM (py_rules, 1, layouts); + PyTuple_SET_ITEM (py_rules, 2, variants); + PyTuple_SET_ITEM (py_rules, 3, options); - PyTuple_SET_ITEM (rules, 0, models); - PyTuple_SET_ITEM (rules, 1, layouts); - PyTuple_SET_ITEM (rules, 2, variants); - PyTuple_SET_ITEM (rules, 3, options); - - return rules; + return py_rules; } int main (int argc, char **argv) @@ -143,4 +184,6 @@ int main (int argc, char **argv) /* xkb->names = NULL; */ /* XkbGetNames (dpy, XkbGeometryNameMask, xkb); */ /* printf ("%s\n", XkbAtomText (dpy, xkb->names->geometry, 3)); */ + + return 0; } |