|
Packit Service |
1d8f1c |
/* GTK - The GIMP Toolkit
|
|
Packit Service |
1d8f1c |
* Copyright (C) 1998, 2001 Tim Janik
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
1d8f1c |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
1d8f1c |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
1d8f1c |
* version 2 of the License, or (at your option) any later version.
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
1d8f1c |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
1d8f1c |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
1d8f1c |
* Lesser General Public License for more details.
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
1d8f1c |
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
1d8f1c |
*/
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
/*
|
|
Packit Service |
1d8f1c |
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
|
Packit Service |
1d8f1c |
* file for a list of people on the GTK+ Team. See the ChangeLog
|
|
Packit Service |
1d8f1c |
* files for a list of changes. These files are distributed with
|
|
Packit Service |
1d8f1c |
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
|
Packit Service |
1d8f1c |
*/
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
#include "config.h"
|
|
Packit Service |
1d8f1c |
#include <string.h>
|
|
Packit Service |
1d8f1c |
#include <stdlib.h>
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
#include "ibusaccelgroup.h"
|
|
Packit Service |
1d8f1c |
#include "ibuskeys.h"
|
|
Packit Service |
1d8f1c |
#include "ibuskeysyms.h"
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
/* for _gtk_get_primary_accel_mod() */
|
|
Packit Service |
1d8f1c |
#define _IBUS_GET_PRIMARY_ACCEL_MOD IBUS_CONTROL_MASK
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
/**
|
|
Packit Service |
1d8f1c |
* SECTION: ibusaccelgroup
|
|
Packit Service |
1d8f1c |
* @short_description: Groups of global keyboard accelerators for an
|
|
Packit Service |
1d8f1c |
* entire GtkWindow
|
|
Packit Service |
1d8f1c |
* @title: Accelerator Groups
|
|
Packit Service |
1d8f1c |
* @stability: Unstable
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* Provides ibus_accelerator_parse()
|
|
Packit Service |
1d8f1c |
*/
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
/**
|
|
Packit Service |
1d8f1c |
* ibus_accelerator_valid:
|
|
Packit Service |
1d8f1c |
* @keyval: a GDK keyval
|
|
Packit Service |
1d8f1c |
* @modifiers: modifier mask
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* Determines whether a given keyval and modifier mask constitute
|
|
Packit Service |
1d8f1c |
* a valid keyboard accelerator. For example, the #IBUS_KEY_a keyval
|
|
Packit Service |
1d8f1c |
* plus #IBUS_CONTROL_MASK is valid - this is a “Ctrl+a” accelerator.
|
|
Packit Service |
1d8f1c |
* But, you can't, for instance, use the #IBUS_KEY_Control_L keyval
|
|
Packit Service |
1d8f1c |
* as an accelerator.
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* Returns: %TRUE if the accelerator is valid
|
|
Packit Service |
1d8f1c |
*/
|
|
Packit Service |
1d8f1c |
gboolean
|
|
Packit Service |
1d8f1c |
ibus_accelerator_valid (guint keyval,
|
|
Packit Service |
1d8f1c |
IBusModifierType modifiers)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
static const guint invalid_accelerator_vals[] = {
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Shift_L, IBUS_KEY_Shift_R, IBUS_KEY_Shift_Lock,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Caps_Lock, IBUS_KEY_ISO_Lock, IBUS_KEY_Control_L,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Control_R, IBUS_KEY_Meta_L, IBUS_KEY_Meta_R,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Alt_L, IBUS_KEY_Alt_R, IBUS_KEY_Super_L, IBUS_KEY_Super_R,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Hyper_L, IBUS_KEY_Hyper_R, IBUS_KEY_ISO_Level3_Shift,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_ISO_Next_Group, IBUS_KEY_ISO_Prev_Group,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_ISO_First_Group, IBUS_KEY_ISO_Last_Group,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Mode_switch, IBUS_KEY_Num_Lock, IBUS_KEY_Multi_key,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Scroll_Lock, IBUS_KEY_Sys_Req,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Tab, IBUS_KEY_ISO_Left_Tab, IBUS_KEY_KP_Tab,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_First_Virtual_Screen, IBUS_KEY_Prev_Virtual_Screen,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Next_Virtual_Screen, IBUS_KEY_Last_Virtual_Screen,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Terminate_Server, IBUS_KEY_AudibleBell_Enable,
|
|
Packit Service |
1d8f1c |
0
|
|
Packit Service |
1d8f1c |
};
|
|
Packit Service |
1d8f1c |
static const guint invalid_unmodified_vals[] = {
|
|
Packit Service |
1d8f1c |
IBUS_KEY_Up, IBUS_KEY_Down, IBUS_KEY_Left, IBUS_KEY_Right,
|
|
Packit Service |
1d8f1c |
IBUS_KEY_KP_Up, IBUS_KEY_KP_Down, IBUS_KEY_KP_Left, IBUS_KEY_KP_Right,
|
|
Packit Service |
1d8f1c |
0
|
|
Packit Service |
1d8f1c |
};
|
|
Packit Service |
1d8f1c |
const guint *ac_val;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
modifiers &= IBUS_MODIFIER_MASK;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if (keyval <= 0xFF)
|
|
Packit Service |
1d8f1c |
return keyval >= 0x20;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
ac_val = invalid_accelerator_vals;
|
|
Packit Service |
1d8f1c |
while (*ac_val) {
|
|
Packit Service |
1d8f1c |
if (keyval == *ac_val++)
|
|
Packit Service |
1d8f1c |
return FALSE;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if (!modifiers) {
|
|
Packit Service |
1d8f1c |
ac_val = invalid_unmodified_vals;
|
|
Packit Service |
1d8f1c |
while (*ac_val) {
|
|
Packit Service |
1d8f1c |
if (keyval == *ac_val++)
|
|
Packit Service |
1d8f1c |
return FALSE;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
return TRUE;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_alt (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'a' || string[1] == 'A') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'l' || string[2] == 'L') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 't' || string[3] == 'T') &&
|
|
Packit Service |
1d8f1c |
(string[4] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_ctl (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'c' || string[1] == 'C') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 't' || string[2] == 'T') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'l' || string[3] == 'L') &&
|
|
Packit Service |
1d8f1c |
(string[4] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_modx (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'm' || string[1] == 'M') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'o' || string[2] == 'O') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'd' || string[3] == 'D') &&
|
|
Packit Service |
1d8f1c |
(string[4] >= '1' && string[4] <= '5') &&
|
|
Packit Service |
1d8f1c |
(string[5] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_ctrl (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'c' || string[1] == 'C') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 't' || string[2] == 'T') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'r' || string[3] == 'R') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 'l' || string[4] == 'L') &&
|
|
Packit Service |
1d8f1c |
(string[5] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_shft (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 's' || string[1] == 'S') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'h' || string[2] == 'H') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'f' || string[3] == 'F') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 't' || string[4] == 'T') &&
|
|
Packit Service |
1d8f1c |
(string[5] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_shift (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 's' || string[1] == 'S') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'h' || string[2] == 'H') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'i' || string[3] == 'I') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 'f' || string[4] == 'F') &&
|
|
Packit Service |
1d8f1c |
(string[5] == 't' || string[5] == 'T') &&
|
|
Packit Service |
1d8f1c |
(string[6] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_control (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'c' || string[1] == 'C') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'o' || string[2] == 'O') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'n' || string[3] == 'N') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 't' || string[4] == 'T') &&
|
|
Packit Service |
1d8f1c |
(string[5] == 'r' || string[5] == 'R') &&
|
|
Packit Service |
1d8f1c |
(string[6] == 'o' || string[6] == 'O') &&
|
|
Packit Service |
1d8f1c |
(string[7] == 'l' || string[7] == 'L') &&
|
|
Packit Service |
1d8f1c |
(string[8] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_release (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'r' || string[1] == 'R') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'e' || string[2] == 'E') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'l' || string[3] == 'L') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 'e' || string[4] == 'E') &&
|
|
Packit Service |
1d8f1c |
(string[5] == 'a' || string[5] == 'A') &&
|
|
Packit Service |
1d8f1c |
(string[6] == 's' || string[6] == 'S') &&
|
|
Packit Service |
1d8f1c |
(string[7] == 'e' || string[7] == 'E') &&
|
|
Packit Service |
1d8f1c |
(string[8] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_meta (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'm' || string[1] == 'M') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'e' || string[2] == 'E') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 't' || string[3] == 'T') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 'a' || string[4] == 'A') &&
|
|
Packit Service |
1d8f1c |
(string[5] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_super (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 's' || string[1] == 'S') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'u' || string[2] == 'U') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'p' || string[3] == 'P') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 'e' || string[4] == 'E') &&
|
|
Packit Service |
1d8f1c |
(string[5] == 'r' || string[5] == 'R') &&
|
|
Packit Service |
1d8f1c |
(string[6] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_hyper (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'h' || string[1] == 'H') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'y' || string[2] == 'Y') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'p' || string[3] == 'P') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 'e' || string[4] == 'E') &&
|
|
Packit Service |
1d8f1c |
(string[5] == 'r' || string[5] == 'R') &&
|
|
Packit Service |
1d8f1c |
(string[6] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_primary (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return ((string[0] == '<') &&
|
|
Packit Service |
1d8f1c |
(string[1] == 'p' || string[1] == 'P') &&
|
|
Packit Service |
1d8f1c |
(string[2] == 'r' || string[2] == 'R') &&
|
|
Packit Service |
1d8f1c |
(string[3] == 'i' || string[3] == 'I') &&
|
|
Packit Service |
1d8f1c |
(string[4] == 'm' || string[4] == 'M') &&
|
|
Packit Service |
1d8f1c |
(string[5] == 'a' || string[5] == 'A') &&
|
|
Packit Service |
1d8f1c |
(string[6] == 'r' || string[6] == 'R') &&
|
|
Packit Service |
1d8f1c |
(string[7] == 'y' || string[7] == 'Y') &&
|
|
Packit Service |
1d8f1c |
(string[8] == '>'));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static inline gboolean
|
|
Packit Service |
1d8f1c |
is_keycode (const gchar *string)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
return (string[0] == '0' &&
|
|
Packit Service |
1d8f1c |
string[1] == 'x' &&
|
|
Packit Service |
1d8f1c |
g_ascii_isxdigit (string[2]) &&
|
|
Packit Service |
1d8f1c |
g_ascii_isxdigit (string[3]));
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
/**
|
|
Packit Service |
1d8f1c |
* ibus_accelerator_parse:
|
|
Packit Service |
1d8f1c |
* @accelerator: string representing an accelerator
|
|
Packit Service |
1d8f1c |
* @accelerator_key: (out) (allow-none): return location for accelerator
|
|
Packit Service |
1d8f1c |
* keyval, or %NULL
|
|
Packit Service |
1d8f1c |
* @accelerator_mods: (out) (allow-none): return location for accelerator
|
|
Packit Service |
1d8f1c |
* modifier mask, %NULL
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* Parses a string representing an accelerator. The format looks like
|
|
Packit Service |
1d8f1c |
* “<Control>a” or “<Shift><Alt>F1” or “<Release>z” (the last one is
|
|
Packit Service |
1d8f1c |
* for key release).
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* The parser is fairly liberal and allows lower or upper case, and also
|
|
Packit Service |
1d8f1c |
* abbreviations such as “<Ctl>” and “<Ctrl>”. Key names are parsed using
|
|
Packit Service |
1d8f1c |
* gdk_keyval_from_name(). For character keys the name is not the symbol,
|
|
Packit Service |
1d8f1c |
* but the lowercase name, e.g. one would use “<Ctrl>minus” instead of
|
|
Packit Service |
1d8f1c |
* “<Ctrl>-”.
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* If the parse fails, @accelerator_key and @accelerator_mods will
|
|
Packit Service |
1d8f1c |
* be set to 0 (zero).
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* Since: 1.5.18
|
|
Packit Service |
1d8f1c |
*/
|
|
Packit Service |
1d8f1c |
void
|
|
Packit Service |
1d8f1c |
ibus_accelerator_parse (const gchar *accelerator,
|
|
Packit Service |
1d8f1c |
guint *accelerator_key,
|
|
Packit Service |
1d8f1c |
IBusModifierType *accelerator_mods)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
guint keyval;
|
|
Packit Service |
1d8f1c |
IBusModifierType mods;
|
|
Packit Service |
1d8f1c |
gint len;
|
|
Packit Service |
1d8f1c |
gboolean error;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if (accelerator_key)
|
|
Packit Service |
1d8f1c |
*accelerator_key = 0;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods)
|
|
Packit Service |
1d8f1c |
*accelerator_mods = 0;
|
|
Packit Service |
1d8f1c |
g_return_if_fail (accelerator != NULL);
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
error = FALSE;
|
|
Packit Service |
1d8f1c |
keyval = 0;
|
|
Packit Service |
1d8f1c |
mods = 0;
|
|
Packit Service |
1d8f1c |
len = strlen (accelerator);
|
|
Packit Service |
1d8f1c |
while (len) {
|
|
Packit Service |
1d8f1c |
if (*accelerator == '<') {
|
|
Packit Service |
1d8f1c |
if (len >= 9 && is_release (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 9;
|
|
Packit Service |
1d8f1c |
len -= 9;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_RELEASE_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 9 && is_primary (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 9;
|
|
Packit Service |
1d8f1c |
len -= 9;
|
|
Packit Service |
1d8f1c |
mods |= _IBUS_GET_PRIMARY_ACCEL_MOD;
|
|
Packit Service |
1d8f1c |
} else if (len >= 9 && is_control (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 9;
|
|
Packit Service |
1d8f1c |
len -= 9;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_CONTROL_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 7 && is_shift (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 7;
|
|
Packit Service |
1d8f1c |
len -= 7;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_SHIFT_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 6 && is_shft (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 6;
|
|
Packit Service |
1d8f1c |
len -= 6;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_SHIFT_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 6 && is_ctrl (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 6;
|
|
Packit Service |
1d8f1c |
len -= 6;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_CONTROL_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 6 && is_modx (accelerator)) {
|
|
Packit Service |
1d8f1c |
static const guint mod_vals[] = {
|
|
Packit Service |
1d8f1c |
IBUS_MOD1_MASK, IBUS_MOD2_MASK, IBUS_MOD3_MASK,
|
|
Packit Service |
1d8f1c |
IBUS_MOD4_MASK, IBUS_MOD5_MASK
|
|
Packit Service |
1d8f1c |
};
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
len -= 6;
|
|
Packit Service |
1d8f1c |
accelerator += 4;
|
|
Packit Service |
1d8f1c |
mods |= mod_vals[*accelerator - '1'];
|
|
Packit Service |
1d8f1c |
accelerator += 2;
|
|
Packit Service |
1d8f1c |
} else if (len >= 5 && is_ctl (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 5;
|
|
Packit Service |
1d8f1c |
len -= 5;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_CONTROL_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 5 && is_alt (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 5;
|
|
Packit Service |
1d8f1c |
len -= 5;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_MOD1_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 6 && is_meta (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 6;
|
|
Packit Service |
1d8f1c |
len -= 6;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_META_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 7 && is_hyper (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 7;
|
|
Packit Service |
1d8f1c |
len -= 7;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_HYPER_MASK;
|
|
Packit Service |
1d8f1c |
} else if (len >= 7 && is_super (accelerator)) {
|
|
Packit Service |
1d8f1c |
accelerator += 7;
|
|
Packit Service |
1d8f1c |
len -= 7;
|
|
Packit Service |
1d8f1c |
mods |= IBUS_SUPER_MASK;
|
|
Packit Service |
1d8f1c |
} else {
|
|
Packit Service |
1d8f1c |
gchar last_ch;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
last_ch = *accelerator;
|
|
Packit Service |
1d8f1c |
while (last_ch && last_ch != '>') {
|
|
Packit Service |
1d8f1c |
last_ch = *accelerator;
|
|
Packit Service |
1d8f1c |
accelerator += 1;
|
|
Packit Service |
1d8f1c |
len -= 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
} else {
|
|
Packit Service |
1d8f1c |
if (len >= 4 && is_keycode (accelerator)) {
|
|
Packit Service |
1d8f1c |
/* There was a keycode in the string, but
|
|
Packit Service |
1d8f1c |
* we cannot store it, so we have an error */
|
|
Packit Service |
1d8f1c |
error = TRUE;
|
|
Packit Service |
1d8f1c |
goto out;
|
|
Packit Service |
1d8f1c |
} else {
|
|
Packit Service |
1d8f1c |
keyval = ibus_keyval_from_name (accelerator);
|
|
Packit Service |
1d8f1c |
if (keyval == IBUS_KEY_VoidSymbol) {
|
|
Packit Service |
1d8f1c |
error = TRUE;
|
|
Packit Service |
1d8f1c |
goto out;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
accelerator += len;
|
|
Packit Service |
1d8f1c |
len -= len;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
out:
|
|
Packit Service |
1d8f1c |
if (error)
|
|
Packit Service |
1d8f1c |
keyval = mods = 0;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if (accelerator_key)
|
|
Packit Service |
1d8f1c |
*accelerator_key = ibus_keyval_to_lower (keyval);
|
|
Packit Service |
1d8f1c |
if (accelerator_mods)
|
|
Packit Service |
1d8f1c |
*accelerator_mods = mods;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
/**
|
|
Packit Service |
1d8f1c |
* ibus_accelerator_name:
|
|
Packit Service |
1d8f1c |
* @accelerator_key: accelerator keyval
|
|
Packit Service |
1d8f1c |
* @accelerator_mods: accelerator modifier mask
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* Converts an accelerator keyval and modifier mask into a string
|
|
Packit Service |
1d8f1c |
* parseable by gtk_accelerator_parse(). For example, if you pass in
|
|
Packit Service |
1d8f1c |
* #IBUS_KEY_q and #IBUS_CONTROL_MASK, this function returns “<Control>q”.
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* If you need to display accelerators in the user interface,
|
|
Packit Service |
1d8f1c |
* see gtk_accelerator_get_label().
|
|
Packit Service |
1d8f1c |
*
|
|
Packit Service |
1d8f1c |
* Returns: a newly-allocated accelerator name
|
|
Packit Service |
1d8f1c |
*/
|
|
Packit Service |
1d8f1c |
gchar*
|
|
Packit Service |
1d8f1c |
ibus_accelerator_name (guint accelerator_key,
|
|
Packit Service |
1d8f1c |
IBusModifierType accelerator_mods)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
static const gchar text_release[] = "<Release>";
|
|
Packit Service |
1d8f1c |
static const gchar text_primary[] = "<Primary>";
|
|
Packit Service |
1d8f1c |
static const gchar text_shift[] = "<Shift>";
|
|
Packit Service |
1d8f1c |
static const gchar text_control[] = "<Control>";
|
|
Packit Service |
1d8f1c |
static const gchar text_mod1[] = "<Alt>";
|
|
Packit Service |
1d8f1c |
static const gchar text_mod2[] = "<Mod2>";
|
|
Packit Service |
1d8f1c |
static const gchar text_mod3[] = "<Mod3>";
|
|
Packit Service |
1d8f1c |
static const gchar text_mod4[] = "<Mod4>";
|
|
Packit Service |
1d8f1c |
static const gchar text_mod5[] = "<Mod5>";
|
|
Packit Service |
1d8f1c |
static const gchar text_meta[] = "<Meta>";
|
|
Packit Service |
1d8f1c |
static const gchar text_super[] = "<Super>";
|
|
Packit Service |
1d8f1c |
static const gchar text_hyper[] = "<Hyper>";
|
|
Packit Service |
1d8f1c |
IBusModifierType saved_mods;
|
|
Packit Service |
1d8f1c |
guint l;
|
|
Packit Service |
1d8f1c |
const gchar *keyval_name;
|
|
Packit Service |
1d8f1c |
gchar *accelerator;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
accelerator_mods &= IBUS_MODIFIER_MASK;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
keyval_name = ibus_keyval_name (ibus_keyval_to_lower (accelerator_key));
|
|
Packit Service |
1d8f1c |
if (!keyval_name)
|
|
Packit Service |
1d8f1c |
keyval_name = "";
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
saved_mods = accelerator_mods;
|
|
Packit Service |
1d8f1c |
l = 0;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_RELEASE_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_release) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & _IBUS_GET_PRIMARY_ACCEL_MOD) {
|
|
Packit Service |
1d8f1c |
l += sizeof (text_primary) - 1;
|
|
Packit Service |
1d8f1c |
/* consume the default accel */
|
|
Packit Service |
1d8f1c |
accelerator_mods &= ~_IBUS_GET_PRIMARY_ACCEL_MOD;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_SHIFT_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_shift) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_CONTROL_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_control) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD1_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod1) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD2_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod2) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD3_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod3) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD4_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod4) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD5_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod5) - 1;
|
|
Packit Service |
1d8f1c |
l += strlen (keyval_name);
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_META_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_meta) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_HYPER_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_hyper) - 1;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_SUPER_MASK)
|
|
Packit Service |
1d8f1c |
l += sizeof (text_super) - 1;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
accelerator = g_new (gchar, l + 1);
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
accelerator_mods = saved_mods;
|
|
Packit Service |
1d8f1c |
l = 0;
|
|
Packit Service |
1d8f1c |
accelerator[l] = 0;
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_RELEASE_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_release);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_release) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & _IBUS_GET_PRIMARY_ACCEL_MOD) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_primary);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_primary) - 1;
|
|
Packit Service |
1d8f1c |
/* consume the default accel */
|
|
Packit Service |
1d8f1c |
accelerator_mods &= ~_IBUS_GET_PRIMARY_ACCEL_MOD;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_SHIFT_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_shift);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_shift) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_CONTROL_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_control);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_control) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD1_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_mod1);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod1) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD2_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_mod2);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod2) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD3_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_mod3);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod3) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD4_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_mod4);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod4) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_MOD5_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_mod5);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_mod5) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_META_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_meta);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_meta) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_HYPER_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_hyper);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_hyper) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
if (accelerator_mods & IBUS_SUPER_MASK) {
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, text_super);
|
|
Packit Service |
1d8f1c |
l += sizeof (text_super) - 1;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
strcpy (accelerator + l, keyval_name);
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
return accelerator;
|
|
Packit Service |
1d8f1c |
}
|