⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matchbox-keyboard-ui.c.svn-base

📁 螢幕小鍵盤,可在Windows/linux上或其他嵌入式系統如手機上使用
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
      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 + -