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

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

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