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

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 работает нормально - парадокс :)


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

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 (ссылка)
спасибо большое ! теперь я буду думать :)

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


(Читать комментарии) -