📄 matchbox-keyboard-ui.c.svn-base
字号:
row_y += max_row_key_height + mb_kbd_row_spacing(ui->kbd); row_item = util_list_next(row_item); } *height = row_y; row_item = mb_kbd_layout_rows(layout); /* Now pass again allocating any extra space with have left over */ while (row_item != NULL) { MBKeyboardRow *row = row_item->data; int n_fillers = 0, free_space = 0, new_w = 0; mb_kbd_row_for_each_key(row,key_item) { if (!mb_kbd_is_extended(ui->kbd) && mb_kbd_key_get_extended(key_item->data)) continue; if (mb_kbd_key_get_fill(key_item->data) || mb_kbd_ui_display_height(ui) <= 320 || mb_kbd_ui_display_width(ui) <= 320 ) n_fillers++; } if (!n_fillers) goto next_row; free_space = max_row_width - mb_kbd_row_width(row); mb_kbd_row_for_each_key(row, key_item) { if (!mb_kbd_is_extended(ui->kbd) && mb_kbd_key_get_extended(key_item->data)) continue; if (mb_kbd_key_get_fill(key_item->data) || mb_kbd_ui_display_height(ui) <= 320 || mb_kbd_ui_display_width(ui) <= 320 ) { 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); } } } next_row: row_item = util_list_next(row_item); } /* Now center the rows */ row_item = mb_kbd_layout_rows(layout); while (row_item != NULL) { MBKeyboardRow *row = row_item->data; mb_kbd_row_set_x(row, (max_row_width - mb_kbd_row_width(row))/2); row_item = util_list_next(row_item); } *width = max_row_width;}voidmb_kbd_ui_redraw_key(MBKeyboardUI *ui, MBKeyboardKey *key){ ui->backend->redraw_key(ui, key);}static voidmb_kbd_ui_redraw_row(MBKeyboardUI *ui, MBKeyboardRow *row){ List *key_item; mb_kbd_row_for_each_key(row, key_item) { if (!mb_kbd_is_extended(ui->kbd) && mb_kbd_key_get_extended(key_item->data)) continue; mb_kbd_ui_redraw_key(ui, key_item->data); }}voidmb_kbd_ui_swap_buffers(MBKeyboardUI *ui){ XClearWindow(ui->xdpy, ui->xwin); XSync(ui->xdpy, False);}voidmb_kbd_ui_redraw(MBKeyboardUI *ui){ List *row_item; MBKeyboardLayout *layout; MARK(); /* gives backend a chance to clear everything */ ui->backend->pre_redraw(ui); layout = mb_kbd_get_selected_layout(ui->kbd); row_item = mb_kbd_layout_rows(layout); while (row_item != NULL) { MBKeyboardRow *row = row_item->data; mb_kbd_ui_redraw_row(ui, row); row_item = util_list_next(row_item); } mb_kbd_ui_swap_buffers(ui);}voidmb_kbd_ui_show(MBKeyboardUI *ui){ XMapWindow(ui->xdpy, ui->xwin);} static intmb_kbd_ui_resources_create(MBKeyboardUI *ui){#define PROP_MOTIF_WM_HINTS_ELEMENTS 5#define MWM_HINTS_DECORATIONS (1L << 1)#define MWM_DECOR_BORDER (1L << 1) typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; long inputMode; unsigned long status; } PropMotifWmHints ; Atom /* atom_wm_protocols[3], */ atom_NET_WM_WINDOW_TYPE, atom_NET_WM_WINDOW_TYPE_TOOLBAR, atom_NET_WM_WINDOW_TYPE_DOCK, atom_NET_WM_STRUT_PARTIAL, atom_NET_WM_STATE_SKIP_PAGER, atom_NET_WM_STATE_SKIP_TASKBAR, atom_NET_WM_STATE, atom_MOTIF_WM_HINTS; PropMotifWmHints *mwm_hints; XSizeHints size_hints; XWMHints *wm_hints; XSetWindowAttributes win_attr; char *wm_name; boolean have_matchbox_wm = False; boolean have_ewmh_wm = False; /* atom_wm_protocols = { XInternAtom(ui->xdpy, "WM_DELETE_WINDOW",False), XInternAtom(ui->xdpy, "WM_PROTOCOLS",False), XInternAtom(ui->xdpy, "WM_NORMAL_HINTS", False), }; */ atom_NET_WM_WINDOW_TYPE = XInternAtom(ui->xdpy, "_NET_WM_WINDOW_TYPE" , False); atom_NET_WM_WINDOW_TYPE_TOOLBAR = XInternAtom(ui->xdpy, "_NET_WM_WINDOW_TYPE_TOOLBAR", False); atom_NET_WM_WINDOW_TYPE_DOCK = XInternAtom(ui->xdpy, "_NET_WM_WINDOW_TYPE_DOCK", False); atom_MOTIF_WM_HINTS = XInternAtom(ui->xdpy, "_MOTIF_WM_HINTS", False); atom_NET_WM_STRUT_PARTIAL = XInternAtom(ui->xdpy, "_NET_WM_STRUT_PARTIAL", False); atom_NET_WM_STATE_SKIP_TASKBAR = XInternAtom(ui->xdpy, "_NET_WM_STATE_SKIP_TASKBAR", False); atom_NET_WM_STATE_SKIP_PAGER = XInternAtom(ui->xdpy, "_NET_WM_STATE_SKIP_PAGER", False); atom_NET_WM_STATE = XInternAtom(ui->xdpy, "_NET_WM_STATE", False); if ((wm_name = get_current_window_manager_name(ui)) != NULL) { have_ewmh_wm = True; /* basically assumed to be Metacity or at least only tested with mcity */ if (streq(wm_name, "matchbox")) have_matchbox_wm = True; } /*win_attr.override_redirect = True;*/ /* Set to true for extreme case */ win_attr.override_redirect = False; /* Set to true for extreme case */ win_attr.event_mask = ButtonPressMask|ButtonReleaseMask|Button1MotionMask|StructureNotifyMask; ui->xwin = XCreateWindow(ui->xdpy, ui->xwin_root, 0, 0, ui->xwin_width, ui->xwin_height, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect|CWEventMask, &win_attr); wm_hints = XAllocWMHints(); if (wm_hints) { DBG("setting no focus hint"); wm_hints->input = False; wm_hints->flags = InputHint; XSetWMHints(ui->xdpy, ui->xwin, wm_hints ); XFree(wm_hints); } size_hints.flags = PPosition | PSize | PMinSize; size_hints.x = 0; size_hints.y = 0; size_hints.width = ui->xwin_width; size_hints.height = ui->xwin_height; size_hints.min_width = ui->xwin_width; size_hints.min_height = ui->xwin_height; XSetStandardProperties(ui->xdpy, ui->xwin, "Keyboard", NULL, 0, NULL, 0, &size_hints); if (!ui->want_embedding) { mwm_hints = util_malloc0(sizeof(PropMotifWmHints)); if (mwm_hints) { mwm_hints->flags = MWM_HINTS_DECORATIONS; mwm_hints->decorations = 0; XChangeProperty(ui->xdpy, ui->xwin, atom_MOTIF_WM_HINTS, XA_ATOM, 32, PropModeReplace, (unsigned char *)mwm_hints, PROP_MOTIF_WM_HINTS_ELEMENTS); free(mwm_hints); } if (have_ewmh_wm) { /* XXX Fix this for display size */ int wm_struct_vals[] = { 0, /* left */ 0, /* right */ 0, /* top */ 0, /* bottom */ 0, /* left_start_y */ 0, /* left_end_y */ 0, /* right_start_y */ 0, /* right_end_y */ 0, /* top_start_x */ 0, /* top_end_x */ 0, /* bottom_start_x */ 1399 }; /* bottom_end_x */ Atom states[] = { atom_NET_WM_STATE_SKIP_TASKBAR, atom_NET_WM_STATE_SKIP_PAGER }; int desk_width = 0, desk_height = 0, desk_y = 0; XChangeProperty(ui->xdpy, ui->xwin, atom_NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *)states, 2); if (get_desktop_area(ui, NULL, &desk_y, &desk_width, &desk_height)) { /* Assuming we take up all available display width * ( at least true with matchbox wm ). we resize * the base ui width to this ( and height as a factor ) * to avoid the case of mapping and then the wm resizing * us, causing an ugly repaint. */ /*if ((desk_width > ui->xwin_width) && !mb_kbd_layout_realsize(ui->kbd->selected_layout)) { mb_kbd_ui_resize(ui, desk_width, ( desk_width * ui->xwin_height ) / ui->xwin_width); }*/ wm_struct_vals[2] = desk_y + desk_height - ui->xwin_height; wm_struct_vals[11] = desk_width; XChangeProperty(ui->xdpy, ui->xwin, atom_NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)wm_struct_vals , 12); DBG("desk width: %i, desk height: %i xwin_height :%i", desk_width, desk_height, ui->xwin_height); } if (have_matchbox_wm) { XChangeProperty(ui->xdpy, ui->xwin, atom_NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &atom_NET_WM_WINDOW_TYPE_TOOLBAR, 1); } else { /* XChangeProperty(ui->xdpy, ui->xwin, atom_NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &atom_NET_WM_WINDOW_TYPE_DOCK, 1); */ } } } ui->backbuffer = XCreatePixmap(ui->xdpy, ui->xwin, ui->xwin_width, ui->xwin_height, DefaultDepth(ui->xdpy, ui->xscreen)); XSetWindowBackgroundPixmap(ui->xdpy, ui->xwin, ui->backbuffer); ui->backend->resources_create(ui); /* Get root size change events for rotation */ /* XSelectInput(ui->xdpy, ui->xwin_root, StructureNotifyMask); */ return 1;}static voidmb_kbd_ui_resize(MBKeyboardUI *ui, int width, int height) { MBKeyboard *kbd = ui->kbd; MBKeyboardLayout *layout; List *row_item, *key_item; int width_diff, height_diff; int height_font_pt_size, width_font_pt_size; int next_row_y, n_rows, extra_key_height; MARK(); width_diff = width - ui->base_alloc_width; height_diff = height - ui->base_alloc_height; if (width_diff < 0 || height_diff < 0) return; /* dont go smaller than our int request - get clipped */ layout = mb_kbd_get_selected_layout(ui->kbd); row_item = mb_kbd_layout_rows(layout); /* load a bigger font ? * Only load if height and width have changed */ width_font_pt_size = ( (ui->base_font_pt_size * width) / ui->base_alloc_width ); if (util_abs(width_font_pt_size - kbd->font_pt_size) > 2) { height_font_pt_size = ( (ui->base_font_pt_size * height) / ui->base_alloc_height ); if (util_abs(height_font_pt_size - kbd->font_pt_size) > 2) { ui->kbd->font_pt_size = (height_font_pt_size > width_font_pt_size) ? width_font_pt_size : height_font_pt_size; mb_kbd_ui_load_font(ui); } } n_rows = util_list_length(row_item); extra_key_height = (height_diff / n_rows); DBG("****** extra height is %i ******", extra_key_height); next_row_y = mb_kbd_row_spacing(ui->kbd); /* allocate the extra width we have as padding to keys */ while (row_item != NULL) { int row_base_width, new_row_base_width, row_width_diff; int next_key_x = 0, n_fillers = 0, free_space = 0, new_w = 0; row_base_width = mb_kbd_row_base_width(row_item->data); new_row_base_width = ( row_base_width * width ) / ui->base_alloc_width;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -