Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет polytheme ([info]polytheme)
@ 2008-11-29 15:17:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
читаю устаревшую, но интересную книжку
Writing GNU Emacs Extensions, желая
научиться у нее уму-разуму. Начинается
книжка описанием дурацкой проблемы,
которая, по признанию автора, "многих
людей, способных стать правоверными
емаксерами, ниспровергла обратно в ад
старого доброго vi". А именно, раньше
при нажатии на Backspace в Emacs открывалось
окно помощи, обескураживая новичков
донельзя. Это происходило от того, что
код, генерируемый Baskspace - 8, что,
как понимают люди, увлекавшиеся шахматами,
в точности равно коду Control-H, на который,
очевидно, привешено это самое окно помощи.
Я прочел это, и понял, что где-то под ковром,
когда я был еще маленький, и у меня не было
своего компьютера, разыгралась драма,
в результате которой теперь в emacs и
Backspace работает, как положено, и Del
работает, как в Windows, и даже Control-H
остался на месте и выводит окно помощи.

Вопрос, в основном, к Антону Москалю, Юре или
Пете, возможно, к Диме Каледину, если ему
попадет на глаза этот текст: не поделитесь
воспоминаниями, было такое на вашей памяти ?
И как им удалось расклеить Backspace с C-h,
Backspace теперь в иксах другой код генерирует,
или как ? Кстати, describe-bindings утверждает,
что DEL генерирует backward-delete-char-untabify,
но что это за DEL ? Так как раз поступает
backspace, а Del работает нормально - парадокс :)


(Добавить комментарий)


[info]kouzdra
2008-11-29 15:34 (ссылка)
Было, причем довольно долго. Взаимоотношения Емакса с функциональными клавишами вообще были довольно сложными - если мне не изменяет память, то в стандартных поставках емакса под линукс даже стрелочки сами по себе не работали (легко настраивалось в конфиге, но...).

Как расклеили - не знаю - расклеить imho в X-ах всегда было несложно, но делать это по умолчанию было чревато - потому что в ASCII backspace - действительно Ctrl-H - и большинство терминалов его и генерили (а программы соотвественно на это рассчитывали).

(Ответить) (Ветвь дискуссии)


[info]polytheme
2008-11-29 16:37 (ссылка)
да, я даже проверил на своей Toshiba Portege G910 - это такой коммуникатор с клавиатурой -
там тоже бэкспейс генерит восьмерку (а вот под линуксом пока не удосужился посмотреть).
на самом деле emacs может смотреть значения модификаторов, нажат Control или нет
(см. комментарий Шеня ниже).
т.е. жизнь черного ящика обстоит следующим образом - на входе клавиша <---, на выходе
событие , к которому привязано DEL, к которому привязано backward-delete-char-untabify
(но не везде ! в сплэш-буфере, который приветственно машет хвостом при загрузке,
backspace замэплен на что-то другое, пойти в начало, кажется). тайна происходит
между <--- и backspace: либо на уровне X, либо на уровне emacs :)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2008-11-29 16:46 (ссылка)
Там поразбираться надо - я думаю, что скан-коды клавиш тоже доступны: /etc/X11/xkb/keycodes/ задает соотвествие скан-кодов функциям кнопок.

Но есть еще один момент - емакс же изначально-то заточен под работу на обычном текстовом терминале, у которого все не так, а иксы - это уже новейшая заморочка.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]polytheme
2008-11-29 17:48 (ссылка)
я проверил на консоли - там тоже все три кода работают, как им положено -
backspace, del и C-h.
так что вероятно емакс действительно в своих C-кишках смотрит на клавиши-модификаторы - это можно делать и в консоли и под Xами.

(Ответить) (Уровень выше)

keyboard in X
[info]a-shen.livejournal.com
2008-11-29 15:53 (ссылка)
при нажатии клавиши возникает событие, в котором есть поле KeySym, и они могут быть разными при одинаковых кодах символа (я проверил, что именно это происходит для backspace и ctrl-h на макинтоше, но в других версиях X может быть и иначе)

(Ответить) (Ветвь дискуссии)

Re: keyboard in X
[info]polytheme
2008-11-29 16:26 (ссылка)
как я понимаю (точнее, прочел вот здесь), одинаковые коды клавиш становятся разными кодами символов в зависимости от нажатых модификаторов; но ведь это не тот случай: коды h и backspace и так отличаются, и без того, чтобы смотреть, нажат control или нет.
вот определение события:
typedef struct {
int type; /* KeyPress or KeyRelease */
unsigned long serial; /* # of last request processed by server */
Bool send_event; /* true if this came from a SendEvent request */
Display *display; /* Display the event was read from */
Window window; /* ‘‘event’’ window it is reported relative to */
Window root; /* root window that the event occurred on */
Window subwindow; /* child window */
Time time; /* milliseconds */
int x, y; /* pointer x, y coordinates in event window */
int x_root, y_root; /* coordinates relative to root */
unsigned int state; /* key or button mask */
unsigned int keycode; /* detail */
Bool same_screen; /* same screen flag */
} XKeyEvent;

в нем нет поля KeySym. если тебе не трудно, скажи пожалуйста, в какой структуре оно живет (ну, или проще, если ты приведешь текст программы или имена утилит, которыми воспользовался, чтобы выяснить различие).

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: keyboard in X
[info]a-shen.livejournal.com
2008-11-29 16:43 (ссылка)
#define BOOL int
#define TRUE 1
#define FALSE 0
#include
[Error: Irreparable invalid markup ('<stdio.h>') in entry. Owner must fix manually. Raw contents below.]

#define BOOL int
#define TRUE 1
#define FALSE 0
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#define INITIAL_WIDTH 640
#define INITIAL_HEIGHT 600
#define INITIAL_X 100
#define INITIAL_Y 100
#define BORDER 2 /* outside the window */

int vz, hz;
XWMHints xwmh= {(InputHint|StateHint),True,NormalState,0,0,0,0,0,0,};
process(ev)
XEvent *ev;
{
KeySym ksr;
XComposeStatus sio;
int numch;
char buf[10]; /* buffer is 10, but probably no keys use > 1 */
int n;
numch= XLookupString(&(ev->xkey), buf, 5, &ksr, &sio);
n = (int) buf[0];
printf("numch=%d, ksr= %d, bufchr=%d\n", numch, (int) ksr, n);
}
main (argc, argv)
int argc; char *argv [];
{
Display *dpy; Window win; GC gc;
unsigned long fg, bg, bd;
unsigned long bw;
XSizeHints xsh;
XSetWindowAttributes xswa;
XGCValues gcv;
XEvent event;

if ((dpy=XOpenDisplay(NULL))==NULL)
{printf("Can not open X display");
exit(1);
}
fg= bd= BlackPixel (dpy, DefaultScreen(dpy));
bg= WhitePixel (dpy, DefaultScreen(dpy));
bw= BORDER;
xsh.flags= (PPosition|PSize|PMinSize);
xsh.height= INITIAL_HEIGHT;
xsh.width= INITIAL_WIDTH;
xsh.x= INITIAL_X;
xsh.y= INITIAL_Y;
xsh.min_width= 200;
xsh.min_height= 200;



win= XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
xsh.x, xsh.y, xsh.width, xsh.height, bw, bd, bg);
XSetStandardProperties (dpy,win,argv[0],argv[0],None,argv,argc,&xsh);
XSetWMHints (dpy, win, &xwmh);
xswa.colormap= DefaultColormap(dpy, DefaultScreen(dpy));
XChangeWindowAttributes(dpy, win, CWColormap, &xswa);
gcv.foreground= fg; gcv.background= bg;
gc= XCreateGC (dpy, win, (GCForeground|GCBackground), &gcv);
XSelectInput (dpy, win, ExposureMask|KeyPressMask);
XMapWindow (dpy, win);

/* main cycle */
while (1==1){
XNextEvent (dpy, &event);
switch (event.type){
case KeyPress:{
process (&event);
break;
}
}
}
}

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: keyboard in X
[info]polytheme
2008-11-29 17:49 (ссылка)
спасибо большое ! теперь я буду думать :)

(Ответить) (Уровень выше)