Exemplo n.º 1
0
/**
 * Retrieve xkb values from the XKB_RULES_NAMES property and store their
 * contents in svValues.
 * If the property cannot be read, the built-in defaults are used.
 *
 * @return True.
 */
Bool
getServerValues(void)
{
    XkbRF_VarDefsRec vd;
    char *tmp = NULL;

    if (!XkbRF_GetNamesProp(dpy, &tmp, &vd) || !tmp)
    {
        VMSG1(3, "Couldn't interpret %s property\n", _XKB_RF_NAMES_PROP_ATOM);
        tmp = DFLT_XKB_RULES_FILE;
        vd.model = DFLT_XKB_MODEL;
        vd.layout = DFLT_XKB_LAYOUT;
        vd.variant = NULL;
        vd.options = NULL;
        VMSG3(3, "Use defaults: rules - '%s' model - '%s' layout - '%s'\n",
              tmp, vd.model, vd.layout);
    }
    if (tmp)
        trySetString(&settings.rules, tmp, FROM_SERVER);
    if (vd.model)
        trySetString(&settings.model, vd.model, FROM_SERVER);
    if (vd.layout)
        trySetString(&settings.layout, vd.layout, FROM_SERVER);
    if (vd.variant)
        trySetString(&settings.variant, vd.variant, FROM_SERVER);
    if ((vd.options) && (!clearOptions))
    {
        addStringToOptions(vd.options, &options);
        XFree(vd.options);
    }
    return True;
}
Exemplo n.º 2
0
const TQString
X11Helper::findXkbRulesFile(TQString x11Dir, Display *dpy)
{
	TQString rulesFile;
	XkbRF_VarDefsRec vd;
	char *tmp = NULL;

	if (XkbRF_GetNamesProp(dpy, &tmp, &vd) && tmp != NULL ) {
// 			kdDebug() << "namesprop " << tmp  << endl;
	  	rulesFile = x11Dir + TQString("xkb/rules/%1").arg(tmp);
// 			kdDebug() << "rulesF " << rulesFile  << endl;
	}
	else {
    // old way
    	for(int ii=0; ii<X11_RULES_COUNT; ii++) {
    		const char* ruleFile = rulesFileList[ii];
     		TQString xruleFilePath = x11Dir + ruleFile;
//  			kdDebug() << "trying " << xruleFilePath << endl;
		    if( TQFile(xruleFilePath).exists() ) {
				rulesFile = xruleFilePath;
			break;
		    }
    	}
    }
	
	return rulesFile;
}
Exemplo n.º 3
0
unsigned int detect_keyboard_layout_from_xkb(void *dpy)
{
	char *layout, *variant;
	unsigned int keyboard_layout = 0, group = 0;
	XkbRF_VarDefsRec rules_names;
	XKeyboardState coreKbdState;
	XkbStateRec state;

	DEBUG_KBD("display: %p", dpy);
	if (dpy && XkbRF_GetNamesProp(dpy, NULL, &rules_names))
	{
		DEBUG_KBD("layouts: %s", rules_names.layout);
		DEBUG_KBD("variants: %s", rules_names.variant);

		XGetKeyboardControl(dpy, &coreKbdState);
		if (XkbGetState(dpy, XkbUseCoreKbd, &state) == Success)
			group = state.group;
		DEBUG_KBD("group: %d", state.group);

		layout = comma_substring(rules_names.layout, group);
		variant = comma_substring(rules_names.variant, group);

		DEBUG_KBD("layout: %s", layout);
		DEBUG_KBD("variant: %s", variant);

		keyboard_layout = find_keyboard_layout_in_xorg_rules(layout, variant);

		free(rules_names.model);
		free(rules_names.layout);
		free(rules_names.variant);
		free(rules_names.options);
	}

	return keyboard_layout;
}
Exemplo n.º 4
0
// Reads the contents of the root window property _XKB_RULES_NAMES.
static PyObject * virtkey_get_rules_names(PyObject *self, PyObject *args)
{
    PyObject* result = NULL;
    virtkey * cvirt  = (virtkey *)self;
    XkbRF_VarDefsRec vd;
    char *tmp = NULL;

    Display * display = cvirt->display;

    if (XkbRF_GetNamesProp(display, &tmp, &vd) && tmp)
    {
        result = PyTuple_New(5);
        PyTuple_SetItem(result, 0, PyUnicode_FromString(tmp ? tmp : ""));
        PyTuple_SetItem(result, 1, PyUnicode_FromString(vd.model ? vd.model : ""));
        PyTuple_SetItem(result, 2, PyUnicode_FromString(vd.layout ? vd.layout : ""));
        PyTuple_SetItem(result, 3, PyUnicode_FromString(vd.variant ? vd.variant : ""));
        PyTuple_SetItem(result, 4, PyUnicode_FromString(vd.options ? vd.options : ""));
    }
    else
    {
        result = PyTuple_New(0);
    }

    return result;
}
Exemplo n.º 5
0
static bool
FcitxXkbInitDefaultLayout (QStringList& layout, QStringList& variant)
{
    Display* dpy = QX11Info::display();
    XkbRF_VarDefsRec vd;
    char *tmp = NULL;

    if (!XkbRF_GetNamesProp(dpy, &tmp, &vd) || !tmp)
        return false;
    if (!vd.model || !vd.layout)
        return false;

    QString variantString, layoutString;
    if (vd.layout)
        layoutString = vd.layout;
    else
        layoutString = QString();
    if (vd.variant)
        variantString = vd.variant;
    else
        variantString = QString();
    layout = layoutString.split(',');
    variant = variantString.split(',');
    return true;
}
Exemplo n.º 6
0
/*
 * Use XKB extension and libxkbfile to discover the type of keycodes
 * generated by the X keyboard
 */
const char *get_xkb_keycodes (Display *display)
{
    char *result = 0;
    char *rulesfile = 0;

    int32_t major = XkbMajorVersion;
    int32_t minor = XkbMinorVersion;
    int32_t error = 0;

    XkbRF_VarDefsRec vd;

    if (!XkbLibraryVersion (&major, &minor)) {
	write_log ("X11GFX: Xkb version conflict!\n");
	return 0;
    }

    if (!XkbQueryExtension (display, 0, 0, &error, &major, &minor)) {
	printf ("X11GFX: XKB error: %d\n", error);
	return 0;
    }

    if (XkbRF_GetNamesProp (display, &rulesfile, &vd) && rulesfile != 0) {

	if (rulesfile[0] == '/') {
	    char *tmp = malloc (strlen (rulesfile));

	    if (tmp) {
		strcpy (tmp, rulesfile);
		rulesfile = tmp;
	    }
	} else {
	    char *tmp = malloc (strlen (xkb_rules_path) + strlen (rulesfile) + 1);

	    if (tmp) {
		strcpy (tmp, xkb_rules_path);
		strcat (tmp, rulesfile);
		rulesfile = tmp;
	    }
	}
    }

    if (rulesfile) {
	XkbRF_RulesPtr rules;

	if ((rules = XkbRF_Load (rulesfile, 0, True, True))) {
	    XkbComponentNamesRec names;

	    XkbRF_GetComponents (rules, &vd, &names);

	    if (names.keycodes)
		result = names.keycodes;
	}
    }

    return result;
}
Exemplo n.º 7
0
static QString FcitxXkbGetRulesName()
{
    XkbRF_VarDefsRec vd;
    char *tmp = NULL;

    if (XkbRF_GetNamesProp(QX11Info::display(), &tmp, &vd) && tmp != NULL ) {
        return tmp;
    }

    return QString();
}
Exemplo n.º 8
0
void KeyLayout::do_key_layout(void) {
#ifdef HAVE_XKBRULES
	char             *tmp = NULL;
	XkbRF_VarDefsRec  vd;

	if(XkbRF_GetNamesProp(fl_display, &tmp, &vd)) {
		/* do nothing if layout do not exists or the same was catched */
		if(!vd.layout || (curr_layout == vd.layout))
			return;

		/* just store it, so update_flag() can do the rest */
		curr_layout = vd.layout;
		xkbrf_names_prop_free(vd, tmp);
	}
#endif
}
Exemplo n.º 9
0
static void fetch_current_layout(String &current) {
	char             *rules_file;
	XkbRF_VarDefsRec vd;

	/* get the layout straight from X since the layout can be changed during X session */
	if(!XkbRF_GetNamesProp(fl_display, &rules_file, &vd)) {
		/* use some values */
		current = DEFAULT_X_LAYOUT;
	} else {
		current = vd.layout;
	}

	/* free everything */
	XFree(rules_file);
	XFree(vd.layout);
	XFree(vd.model);
	XFree(vd.options);
	XFree(vd.variant);
}
Exemplo n.º 10
0
static bool
FcitxXkbInitDefaultOption (QString& model, QString& option)
{
    Display* dpy = QX11Info::display();
    XkbRF_VarDefsRec vd;
    char *tmp = NULL;

    if (!XkbRF_GetNamesProp(dpy, &tmp, &vd) || !tmp)
        return false;
    if (!vd.model || !vd.layout)
        return false;
    if (vd.model)
        model = vd.model;
    else
        model = QString();
    if (vd.options)
        option = vd.options;
    else
        option = QString();
    return true;
}
Exemplo n.º 11
0
G_MODULE_EXPORT gboolean
remmina_plugin_entry (RemminaPluginService *service)
{
    Display *dpy;
    XkbRF_VarDefsRec vd;
    gchar *s;

    remmina_plugin_nx_service = service;

    bindtextdomain (GETTEXT_PACKAGE, REMMINA_LOCALEDIR);
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");

    if ((dpy = XkbOpenDisplay (NULL, NULL, NULL, NULL, NULL, NULL)) != NULL)
    {
        if (XkbRF_GetNamesProp (dpy, NULL, &vd))
        {
            remmina_kbtype = g_strdup_printf ("%s/%s", vd.model, vd.layout);
            if (vd.layout) XFree (vd.layout);
            if (vd.model) XFree (vd.model);
            if (vd.variant) XFree (vd.variant);
            if (vd.options) XFree (vd.options);
            s = strchr (remmina_kbtype, ',');
            if (s) *s = '\0';
            g_print ("NX: detected keyboard type %s\n", remmina_kbtype);
        }
        XCloseDisplay (dpy);
    }

    if (! service->register_plugin ((RemminaPlugin *) &remmina_plugin_nx))
    {
        return FALSE;
    }

    ssh_init ();
    pthread_mutex_init (&remmina_nx_init_mutex, NULL);
    remmina_nx_window_id_array = g_array_new (FALSE, TRUE, sizeof (Window));

    return TRUE;
}
Exemplo n.º 12
0
void XKeyboard::BuildLayout(string_vector& vec) {
	XkbRF_VarDefsRec vdr;
	int i = 0;
	char str[20] = {0};
	const char s[2] = ",";
	char *token;
	char* tmp = NULL;

  	strcpy(str, (
    !_display ? NO_KEYBOARD :
    (XkbRF_GetNamesProp(_display, &tmp, &vdr) && vdr.layout) ?
    vdr.layout : DFLT_XKB_LAYOUT));

	/* get the first token */
	token = strtok(str, s);

	/* walk through other tokens */
	while( token != NULL )
	{
	  vec.push_back(token);
	  token = strtok(NULL, s);
	}
}
Exemplo n.º 13
0
static void
get_xkbrf_var_defs (Display           *xdisplay,
                    const char        *layouts,
                    const char        *variants,
                    const char        *options,
                    char             **rules_p,
                    XkbRF_VarDefsRec  *var_defs)
{
  char *rules = NULL;

  /* Get it from the X property or fallback on defaults */
  if (!XkbRF_GetNamesProp (xdisplay, &rules, var_defs) || !rules)
    {
      rules = strdup (DEFAULT_XKB_RULES_FILE);
      var_defs->model = strdup (DEFAULT_XKB_MODEL);
      var_defs->layout = NULL;
      var_defs->variant = NULL;
      var_defs->options = NULL;
    }

  /* Swap in our new options... */
  free (var_defs->layout);
  var_defs->layout = strdup (layouts);
  free (var_defs->variant);
  var_defs->variant = strdup (variants);
  free (var_defs->options);
  var_defs->options = strdup (options);

  /* Sometimes, the property is a file path, and sometimes it's
     not. Normalize it so it's always a file path. */
  if (rules[0] == '/')
    *rules_p = g_strdup (rules);
  else
    *rules_p = g_build_filename (XKB_BASE, "rules", rules, NULL);

  free (rules);
}
Exemplo n.º 14
0
/**
 * gnome_xkb_info_get_var_defs: (skip)
 * @rules: (out) (transfer full): location to store the rules file
 * path. Use g_free() when it's no longer needed
 * @var_defs: (out) (transfer full): location to store a
 * #XkbRF_VarDefsRec pointer. Use gnome_xkb_info_free_var_defs() to
 * free it
 *
 * Gets both the XKB rules file path and the current XKB parameters in
 * use by the X server.
 *
 * Since: 3.6
 */
void
gnome_xkb_info_get_var_defs (gchar            **rules,
                             XkbRF_VarDefsRec **var_defs)
{
  Display *display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
  char *tmp;

  g_return_if_fail (rules != NULL);
  g_return_if_fail (var_defs != NULL);

  *rules = NULL;
  *var_defs = g_new0 (XkbRF_VarDefsRec, 1);

  gdk_error_trap_push ();

  /* Get it from the X property or fallback on defaults */
  if (!XkbRF_GetNamesProp (display, rules, *var_defs) || !*rules)
    {
      *rules = strdup (XKB_RULES_FILE);
      (*var_defs)->model = strdup (XKB_MODEL);
      (*var_defs)->layout = strdup (XKB_LAYOUT);
      (*var_defs)->variant = NULL;
      (*var_defs)->options = NULL;
    }

  gdk_error_trap_pop_ignored ();

  tmp = *rules;

  if (*rules[0] == '/')
    *rules = g_strdup (*rules);
  else
    *rules = g_build_filename (XKB_BASE, "rules", *rules, NULL);

  free (tmp);
}