📄 matchbox-keyboard-ui.c.svn-base
字号:
row_width_diff = new_row_base_width - row_base_width; DBG("row_width_diff = %i", row_width_diff); next_key_x = mb_kbd_col_spacing(ui->kbd); /* * row_base_width * -------------- X new_width = new_base_width * base_width * * key_extra_pad = key_base_width X base_width_diff * -------------------------------- * row_base_width */ mb_kbd_row_for_each_key(row_item->data, key_item) { MBKeyboardKey *key = key_item->data; int key_base_width, key_new_pad; if (!mb_kbd_is_extended(kbd) && mb_kbd_key_get_extended(key)) continue; key_base_width =( mb_kbd_key_width(key) - mb_kbd_key_get_extra_width_pad(key)); key_new_pad= ( (key_base_width + mb_kbd_col_spacing(kbd)) * row_width_diff) / row_base_width; mb_kbd_key_set_extra_width_pad (key, key_new_pad ); /* Height */ mb_kbd_key_set_extra_height_pad (key, extra_key_height); mb_kbd_key_set_geometry(key, next_key_x, -1, -1, -1); next_key_x += (mb_kbd_key_width(key) + mb_kbd_col_spacing(ui->kbd)); if (mb_kbd_key_get_fill(key)) n_fillers++; } /* The above ( likely due to rounding ) leaves a few pixels free. * This can be critical on a small handheld display. Therefore * we do a second parse deviding up any left over space between * keys marked as fill. */ if (n_fillers) { free_space = width - mb_kbd_row_width(row_item->data); mb_kbd_row_for_each_key(row_item->data, key_item) { if (!mb_kbd_is_extended(kbd) && mb_kbd_key_get_extended(key_item->data)) continue; if (mb_kbd_key_get_fill(key_item->data)) { int old_w; List *nudge_key_item = util_list_next(key_item); old_w = mb_kbd_key_width(key_item->data); new_w = old_w + (free_space/n_fillers); mb_kbd_key_set_geometry(key_item->data, -1, -1, new_w, -1); /* nudge next keys forward */ for (; nudge_key_item != NULL; nudge_key_item = util_list_next(nudge_key_item)) { if (!mb_kbd_is_extended(ui->kbd) && mb_kbd_key_get_extended(nudge_key_item->data)) continue; mb_kbd_key_set_geometry(nudge_key_item->data, mb_kbd_key_x(nudge_key_item->data) + (new_w - old_w ), -1, -1, -1); } } } } /* re-center row */ mb_kbd_row_set_x(row_item->data, (width - mb_kbd_row_width(row_item->data))/2); /* and position down */ mb_kbd_row_set_y(row_item->data, next_row_y); next_row_y += (mb_kbd_row_height(row_item->data) + mb_kbd_row_spacing(ui->kbd)); row_item = util_list_next(row_item); } /* center entire layout vertically if space left */ if (next_row_y < height) { int vspace = ( height - next_row_y ) / 2; row_item = mb_kbd_layout_rows(layout); while (row_item != NULL) { mb_kbd_row_set_y(row_item->data, mb_kbd_row_y(row_item->data) + vspace + 1); row_item = util_list_next(row_item); } } XResizeWindow(ui->xdpy, ui->xwin, width, height); ui->xwin_width = width; ui->xwin_height = height; if (ui->backbuffer) /* may get called before initialised */ { XFreePixmap(ui->xdpy, ui->backbuffer); ui->backbuffer = XCreatePixmap(ui->xdpy, ui->xwin, ui->xwin_width, ui->xwin_height, DefaultDepth(ui->xdpy, ui->xscreen)); ui->backend->resize(ui, width, height); XSetWindowBackgroundPixmap(ui->xdpy, ui->xwin, ui->backbuffer); mb_kbd_ui_redraw(ui); }}voidmb_kbd_ui_handle_configure(MBKeyboardUI *ui, int width, int height){ boolean old_state, new_state; MARK(); /* Figure out if screen size has changed - does a round trip - bad */ update_display_size(ui); old_state = mb_kbd_is_extended(ui->kbd); new_state = want_extended(ui); if (new_state == old_state) /* Not a rotation */ { mb_kbd_ui_resize(ui, width, height); return; } mb_kbd_set_extended(ui->kbd, new_state); /* realocate the layout */ mb_kbd_ui_allocate_ui_layout(ui, &ui->base_alloc_width, &ui->base_alloc_height); mb_kbd_ui_resize(ui, width, height); }voidmb_kbd_ui_event_loop(MBKeyboardUI *ui){ MBKeyboardKey *key = NULL; struct timeval tvt; /* Key repeat - values for standard xorg install ( xset q) */ int repeat_delay = 100 * 10000; int repeat_rate = 30 * 1000; int press_x = 0, press_y = 0; tvt.tv_sec = 0; tvt.tv_usec = repeat_delay; while (True) { XEvent xev; if (get_xevent_timed(ui->xdpy, &xev, &tvt)) { switch (xev.type) { case ButtonPress: press_x = xev.xbutton.x; press_y = xev.xbutton.y; DBG("got button bress at %i,%i", xev.xbutton.x, xev.xbutton.y); key = mb_kbd_locate_key(ui->kbd, xev.xbutton.x, xev.xbutton.y); if (key) { /* Hack if we never get a release event */ if (key != mb_kbd_get_held_key(ui->kbd)) { mb_kbd_key_release(ui->kbd); tvt.tv_usec = repeat_delay; } else tvt.tv_usec = repeat_rate; DBG("found key for press"); mb_kbd_key_press(key); } break; case ButtonRelease: if (mb_kbd_get_held_key(ui->kbd) != NULL) { mb_kbd_key_release(ui->kbd); tvt.tv_usec = repeat_delay; /* Gestures */ /* FIXME: check time first */ if ( (press_x - xev.xbutton.x) > ui->key_uwidth ) { /* <-- slide back ...backspace */ fakekey_press_keysym(ui->fakekey, XK_BackSpace, 0); fakekey_repeat(ui->fakekey); fakekey_release(ui->fakekey); /* FIXME: add <-- --> <-- --> support */ } else if ( (xev.xbutton.y - press_y) > ui->key_uheight ) { /* V slide down ...return */ fakekey_press_keysym(ui->fakekey, XK_BackSpace, 0); fakekey_release(ui->fakekey); fakekey_press_keysym(ui->fakekey, XK_Return, 0); fakekey_release(ui->fakekey); } /* TODO ^ caps support */ } break; case ConfigureNotify: if (xev.xconfigure.width != ui->xwin_width || xev.xconfigure.height != ui->xwin_height) mb_kbd_ui_handle_configure(ui, xev.xconfigure.width, xev.xconfigure.height); break; case MappingNotify: fakekey_reload_keysyms(ui->fakekey); XRefreshKeyboardMapping(&xev.xmapping); break; default: break; } if (ui->want_embedding) mb_kbd_xembed_process_xevents (ui, &xev); } else { /* Keyrepeat */ if (mb_kbd_get_held_key(ui->kbd) != NULL) { fakekey_repeat(ui->fakekey); tvt.tv_usec = repeat_rate; } } }}static intmb_kbd_ui_load_font(MBKeyboardUI *ui){ return ui->backend->font_load(ui);}intmb_kbd_ui_display_width(MBKeyboardUI *ui){ return ui->dpy_width;}intmb_kbd_ui_display_height(MBKeyboardUI *ui){ return ui->dpy_height;}MBKeyboardUIBackend*mb_kbd_ui_backend(MBKeyboardUI *ui){ return ui->backend;}Display*mb_kbd_ui_x_display(MBKeyboardUI *ui){ return ui->xdpy;}intmb_kbd_ui_x_screen(MBKeyboardUI *ui){ return ui->xscreen;}Windowmb_kbd_ui_x_win(MBKeyboardUI *ui){ return ui->xwin;}Windowmb_kbd_ui_x_win_root(MBKeyboardUI *ui){ return ui->xwin_root;}intmb_kbd_ui_x_win_height(MBKeyboardUI *ui){ return ui->xwin_height;}intmb_kbd_ui_x_win_width(MBKeyboardUI *ui){ return ui->xwin_width;}Pixmapmb_kbd_ui_backbuffer(MBKeyboardUI *ui){ return ui->backbuffer;}MBKeyboard*mb_kbd_ui_kbd(MBKeyboardUI *ui){ return ui->kbd;}intmb_kbd_ui_realize(MBKeyboardUI *ui){ ui->base_font_pt_size = ui->kbd->font_pt_size; if (!mb_kbd_ui_load_font(ui)) return 0; /* potrait or landscape */ if (want_extended(ui)) mb_kbd_set_extended(ui->kbd, True); /* * figure out how small this keyboard can be.. */ mb_kbd_ui_allocate_ui_layout(ui, &ui->base_alloc_width, &ui->base_alloc_height); ui->xwin_width = ui->base_alloc_width; ui->xwin_height = ui->base_alloc_height; mb_kbd_ui_resources_create(ui); unless (mb_kbd_ui_embeded(ui)) { mb_kbd_ui_show(ui); mb_kbd_ui_redraw(ui); } else mb_kbd_xembed_init (ui); return 1;}intmb_kbd_ui_init(MBKeyboard *kbd){ MBKeyboardUI *ui = NULL; ui = kbd->ui = util_malloc0(sizeof(MBKeyboardUI)); ui->kbd = kbd; if ((ui->xdpy = XOpenDisplay(getenv("DISPLAY"))) == NULL) return 0; if ((ui->fakekey = fakekey_init(ui->xdpy)) == NULL) return 0; ui->xscreen = DefaultScreen(ui->xdpy); ui->xwin_root = RootWindow(ui->xdpy, ui->xscreen); ui->backend = MB_KBD_UI_BACKEND_INIT_FUNC(ui); update_display_size(ui); return 1;}/* Embedding */voidmb_kbd_ui_set_embeded (MBKeyboardUI *ui, int embed){ ui->want_embedding = embed;} intmb_kbd_ui_embeded (MBKeyboardUI *ui){ return ui->want_embedding;}voidmb_kbd_ui_print_window (MBKeyboardUI *ui){ fprintf(stdout, "%li\n", mb_kbd_ui_x_win(ui)); fflush(stdout);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -