summaryrefslogtreecommitdiffstats
path: root/xkb.c
diff options
context:
space:
mode:
authorpnfisher <pnfisher>1999-09-14 06:15:03 +0000
committerpnfisher <pnfisher>1999-09-14 06:15:03 +0000
commita70f67b0ef101cd21da0322612648880d97219cd (patch)
tree09be97a0c3fa03052bdfbb13a889ceef55ffec4f /xkb.c
parent322480a1f37e0f4e189e049fdd15a76a5c479976 (diff)
downloadanaconda-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.c113
1 files changed, 78 insertions, 35 deletions
diff --git a/xkb.c b/xkb.c
index 9c2b1a2c9..3ecc8b5f7 100644
--- a/xkb.c
+++ b/xkb.c
@@ -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;
}