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

📄 m_driver.c

📁 ncurses 库 可能有用酒用 没用就算了 我觉得还可以用
💻 C
📖 第 1 页 / 共 2 页
字号:
	case REQ_SCR_DLINE:	    /*=================*/	  if ((my_top_row + menu->arows >= menu->rows) || !(item->down))	    {	      /* only if the menu has less items than rows, we can deny the	         request. Otherwise the epilogue of this routine adjusts the	         top row if necessary */	      result = E_REQUEST_DENIED;	    }	  else	    {	      my_top_row++;	      item = item->down;	    }	  break;	case REQ_SCR_DPAGE:	    /*=================*/	  rdiff = menu->rows - (menu->arows + my_top_row);	  if (rdiff > menu->arows)	    rdiff = menu->arows;	  if (rdiff <= 0)	    result = E_REQUEST_DENIED;	  else	    {	      my_top_row += rdiff;	      while (rdiff-- > 0 && item != (ITEM *) 0)		item = item->down;	    }	  break;	case REQ_SCR_UPAGE:	    /*=================*/	  rdiff = (menu->arows < my_top_row) ? menu->arows : my_top_row;	  if (rdiff <= 0)	    result = E_REQUEST_DENIED;	  else	    {	      my_top_row -= rdiff;	      while (rdiff-- && item != (ITEM *) 0)		item = item->up;	    }	  break;	case REQ_FIRST_ITEM:	    /*==================*/	  item = menu->items[0];	  break;	case REQ_LAST_ITEM:	    /*=================*/	  item = menu->items[menu->nitems - 1];	  break;	case REQ_NEXT_ITEM:	    /*=================*/	  if ((item->index + 1) >= menu->nitems)	    {	      if (menu->opt & O_NONCYCLIC)		result = E_REQUEST_DENIED;	      else		item = menu->items[0];	    }	  else	    item = menu->items[item->index + 1];	  break;	case REQ_PREV_ITEM:	    /*=================*/	  if (item->index <= 0)	    {	      if (menu->opt & O_NONCYCLIC)		result = E_REQUEST_DENIED;	      else		item = menu->items[menu->nitems - 1];	    }	  else	    item = menu->items[item->index - 1];	  break;	case REQ_TOGGLE_ITEM:	    /*===================*/	  if (menu->opt & O_ONEVALUE)	    {	      result = E_REQUEST_DENIED;	    }	  else	    {	      if (menu->curitem->opt & O_SELECTABLE)		{		  menu->curitem->value = !menu->curitem->value;		  Move_And_Post_Item(menu, menu->curitem);		  _nc_Show_Menu(menu);		}	      else		result = E_NOT_SELECTABLE;	    }	  break;	case REQ_CLEAR_PATTERN:	    /*=====================*/	  /* already cleared in prologue */	  break;	case REQ_BACK_PATTERN:	    /*====================*/	  if (menu->pindex > 0)	    {	      assert(menu->pattern);	      Remove_Character_From_Pattern(menu);	      pos_menu_cursor(menu);	    }	  else	    result = E_REQUEST_DENIED;	  break;	case REQ_NEXT_MATCH:	    /*==================*/	  assert(menu->pattern);	  if (menu->pattern[0])	    result = _nc_Match_Next_Character_In_Item_Name(menu, 0, &item);	  else	    {	      if ((item->index + 1) < menu->nitems)		item = menu->items[item->index + 1];	      else		{		  if (menu->opt & O_NONCYCLIC)		    result = E_REQUEST_DENIED;		  else		    item = menu->items[0];		}	    }	  break;	case REQ_PREV_MATCH:	    /*==================*/	  assert(menu->pattern);	  if (menu->pattern[0])	    result = _nc_Match_Next_Character_In_Item_Name(menu, BS, &item);	  else	    {	      if (item->index)		item = menu->items[item->index - 1];	      else		{		  if (menu->opt & O_NONCYCLIC)		    result = E_REQUEST_DENIED;		  else		    item = menu->items[menu->nitems - 1];		}	    }	  break;	default:	    /*======*/	  result = E_UNKNOWN_COMMAND;	  break;	}    }  else    {				/* not a command */      if (!(c & ~((int)MAX_REGULAR_CHARACTER)) && isprint(UChar(c)))	result = _nc_Match_Next_Character_In_Item_Name(menu, c, &item);#ifdef NCURSES_MOUSE_VERSION      else if (KEY_MOUSE == c)	{	  MEVENT event;	  WINDOW *uwin = Get_Menu_UserWin(menu);	  getmouse(&event);	  if ((event.bstate & (BUTTON1_CLICKED |			       BUTTON1_DOUBLE_CLICKED |			       BUTTON1_TRIPLE_CLICKED))	      && wenclose(uwin, event.y, event.x))	    {			/* we react only if the click was in the userwin, that means				 * inside the menu display area or at the decoration window.				 */	      WINDOW *sub = Get_Menu_Window(menu);	      int ry = event.y, rx = event.x;	/* screen coordinates */	      result = E_REQUEST_DENIED;	      if (mouse_trafo(&ry, &rx, FALSE))		{		/* rx, ry are now "curses" coordinates */		  if (ry < sub->_begy)		    {		/* we clicked above the display region; this is				 * interpreted as "scroll up" request				 */		      if (event.bstate & BUTTON1_CLICKED)			result = menu_driver(menu, REQ_SCR_ULINE);		      else if (event.bstate & BUTTON1_DOUBLE_CLICKED)			result = menu_driver(menu, REQ_SCR_UPAGE);		      else if (event.bstate & BUTTON1_TRIPLE_CLICKED)			result = menu_driver(menu, REQ_FIRST_ITEM);		      RETURN(result);		    }		  else if (ry > sub->_begy + sub->_maxy)		    {		/* we clicked below the display region; this is				 * interpreted as "scroll down" request				 */		      if (event.bstate & BUTTON1_CLICKED)			result = menu_driver(menu, REQ_SCR_DLINE);		      else if (event.bstate & BUTTON1_DOUBLE_CLICKED)			result = menu_driver(menu, REQ_SCR_DPAGE);		      else if (event.bstate & BUTTON1_TRIPLE_CLICKED)			result = menu_driver(menu, REQ_LAST_ITEM);		      RETURN(result);		    }		  else if (wenclose(sub, event.y, event.x))		    {		/* Inside the area we try to find the hit item */		      int i, x, y, err;		      ry = event.y;		      rx = event.x;		      if (wmouse_trafo(sub, &ry, &rx, FALSE))			{			  for (i = 0; i < menu->nitems; i++)			    {			      err = _nc_menu_cursor_pos(menu, menu->items[i],							&y, &x);			      if (E_OK == err)				{				  if ((ry == y) &&				      (rx >= x) &&				      (rx < x + menu->itemlen))				    {				      item = menu->items[i];				      result = E_OK;				      break;				    }				}			    }			  if (E_OK == result)			    {	/* We found an item, now we can handle the click.				 * A single click just positions the menu cursor				 * to the clicked item. A double click toggles				 * the item.				 */			      if (event.bstate & BUTTON1_DOUBLE_CLICKED)				{				  _nc_New_TopRow_and_CurrentItem(menu,								 my_top_row,								 item);				  menu_driver(menu, REQ_TOGGLE_ITEM);				  result = E_UNKNOWN_COMMAND;				}			    }			}		    }		}	    }	  else	    result = E_REQUEST_DENIED;	}#endif /* NCURSES_MOUSE_VERSION */      else	result = E_UNKNOWN_COMMAND;    }  if (E_OK == result)    {      /* Adjust the top row if it turns out that the current item unfortunately         doesn't appear in the menu window */      if (item->y < my_top_row)	my_top_row = item->y;      else if (item->y >= (my_top_row + menu->arows))	my_top_row = item->y - menu->arows + 1;      _nc_New_TopRow_and_CurrentItem(menu, my_top_row, item);    }  RETURN(result);}/* m_driver.c ends here */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -