Смена раскладки клавиатуры

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Смена раскладки клавиатуры

Сообщение reeNUT » 14.06.2012 17:01:25

Добрый день, подскажите, пожалуйста - есть ли возможность менять раскладку клавиатуры под линукс? Сейчас работает вот так
Код: Выделить всё
 
{IFDEF Win32} ActivateKeyboardLayout($409, 0)  {ENDIF}

но это только при использовании модуля Windows само собой, как бы использовать это при компиляции под Linux ?
Аватара пользователя
reeNUT
новенький
 
Сообщения: 18
Зарегистрирован: 05.01.2012 23:27:49
Откуда: Астрахань

Re: Смена раскладки клавиатуры

Сообщение leo_bsv » 14.06.2012 22:58:48

паскальных решений не нашёл... но в консоли прокатывает вот такое
Код: Выделить всё
setxkbmap -layout ru
setxkbmap -layout us

но у меня например после такого хоткеи отвалились... :D
есть также автопереключалка xneur
а вообще, тема рассматривалась вот здесь...
советуют также в исходники заглянуть - софт то ведь открытый ;)
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Смена раскладки клавиатуры

Сообщение alexs » 14.06.2012 23:13:35

Вообщето за самостийное переключение саофтом раскладки клавиатуры пользователь может и по лицу надавать...
Очень не советую.
Отображать текущую раскладку - да. А вот самостоятельно её переключать без разрешения пользователя - не надо.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Смена раскладки клавиатуры

Сообщение leo_bsv » 14.06.2012 23:27:14

хороший пользователь никогда не стукнет программиста! :wink:
а если стукнул - значит плохой... а плохому можно уже и сдачи дать :D

оффтопик:
самое лучшее охлаждение тела - охлаждение от харда с двумя кулерами )))
Последний раз редактировалось leo_bsv 14.06.2012 23:28:58, всего редактировалось 1 раз.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Смена раскладки клавиатуры

Сообщение Ism » 14.06.2012 23:28:43

Где вы видели добрых пользователей ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Смена раскладки клавиатуры

Сообщение leo_bsv » 14.06.2012 23:30:08

Ism писал(а):Где вы видели добрых пользователей

вы правы - нынче добрый только сок... и это тоже ещё вопрос!
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Смена раскладки клавиатуры

Сообщение reeNUT » 15.06.2012 08:45:42

Ну в моем случае пользователь только спасибо скажет, просто есть определенные поля, где можно вводить только коды на латинице и поле ввода у меня тупо не принимает другие символы, так что юзер вынужден переключать раскладку. До этого особо не собирал проекты пол линукс, а тут вот решил переходить на свободное ПО.
вот если вариант с консольным переключением -
setxkbmap -layout ru
setxkbmap -layout us
как это реализовать?
или вот на том форуме - XKBlib XkbLockGroup() ума не приложу как это можно использовать
Аватара пользователя
reeNUT
новенький
 
Сообщения: 18
Зарегистрирован: 05.01.2012 23:27:49
Откуда: Астрахань

Re: Смена раскладки клавиатуры

Сообщение Brainenjii » 15.06.2012 08:48:40

Может обрабатывать OnUTF8KeyPress и подменять символы с русских на соответствующие латинские?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Смена раскладки клавиатуры

Сообщение reeNUT » 15.06.2012 09:03:11

Brainenjii писал(а):Может обрабатывать OnUTF8KeyPress и подменять символы с русских на соответствующие латинские?

хм, а вот это вариант

Добавлено спустя 7 минут 42 секунды:
Хотя, с другой стороны - когда пользователь стоит в полях ввода ФИО, то нужна русская раскладка, так что думаю, вариант с подменой символов - не мое решение. Нужно именно переключать клавиатуру.

вот кусок кода из xneur из модуля switchlang.c

Код: Выделить всё
extern struct _window *main_window;

int get_curr_keyboard_group(void)
{
   XkbStateRec xkbState;
   XkbGetState(main_window->display, XkbUseCoreKbd, &xkbState);
   int group = xkbState.group;
   //XFree(xkbState);
   return group;
}

void set_next_keyboard_group(struct _xneur_handle *handle)
{
   int new_layout_group = get_curr_keyboard_group() + 1;
   if (new_layout_group == handle->total_languages)
      new_layout_group = 0;
   XkbLockGroup(main_window->display, XkbUseCoreKbd, new_layout_group);
}

void set_prev_keyboard_group(struct _xneur_handle *handle)
{
   int new_layout_group = get_curr_keyboard_group() - 1;
   if (new_layout_group < 0)
      new_layout_group = handle->total_languages - 1;
   XkbLockGroup(main_window->display, XkbUseCoreKbd, new_layout_group);
}


ни у кого нет соображений - как это можно использовать?

Добавлено спустя 1 час 13 минут 35 секунд:
в общем, господа, вот такой вариант реально работает. 100% в нем дохрена недочетов, но это хоть какое-то решение

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  myproc: TProcess;
begin
  myproc := TProcess.Create(nil);
  myproc.CommandLine := 'setxkbmap -layout ''ru,us'' -option ''grp:alt_shift_toggle''';
  myproc.Options := myproc.Options + [poWaitOnExit];
  myproc.Execute;
  myproc.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  myproc: TProcess;
begin
  myproc := TProcess.Create(nil);
  myproc.CommandLine := 'setxkbmap -layout ''us,ru'' -option ''grp:alt_shift_toggle''';
  myproc.Options := myproc.Options + [poWaitOnExit];
  myproc.Execute;
  myproc.Free;
end;


ясное дело, что учитываются только 2 раскладки и переключение альт-шифт
Аватара пользователя
reeNUT
новенький
 
Сообщения: 18
Зарегистрирован: 05.01.2012 23:27:49
Откуда: Астрахань


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 240

Рейтинг@Mail.ru