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

📄 tui-win.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	_num_to_scroll = 1;      /*         ** If we are scrolling the source or disassembly window, do a         ** "psuedo" scroll since not all of the source is in memory,         ** only what is in the viewport. If win_to_scroll is the         ** command window do nothing since the term should handle it.       */      if (win_to_scroll == TUI_SRC_WIN || win_to_scroll == TUI_DISASM_WIN)	tui_horizontal_source_scroll (win_to_scroll, LEFT_SCROLL, _num_to_scroll);    }}voidtui_scroll_right (struct tui_win_info * win_to_scroll, int num_to_scroll){  if (win_to_scroll != TUI_CMD_WIN)    {      int _num_to_scroll = num_to_scroll;      if (_num_to_scroll == 0)	_num_to_scroll = 1;      /*         ** If we are scrolling the source or disassembly window, do a         ** "psuedo" scroll since not all of the source is in memory,         ** only what is in the viewport. If win_to_scroll is the         ** command window do nothing since the term should handle it.       */      if (win_to_scroll == TUI_SRC_WIN || win_to_scroll == TUI_DISASM_WIN)	tui_horizontal_source_scroll (win_to_scroll, RIGHT_SCROLL, _num_to_scroll);    }}/* Scroll a window.  Arguments are passed through a va_list.    */voidtui_scroll (enum tui_scroll_direction direction,	    struct tui_win_info * win_to_scroll,	    int num_to_scroll){  switch (direction)    {    case FORWARD_SCROLL:      tui_scroll_forward (win_to_scroll, num_to_scroll);      break;    case BACKWARD_SCROLL:      tui_scroll_backward (win_to_scroll, num_to_scroll);      break;    case LEFT_SCROLL:      tui_scroll_left (win_to_scroll, num_to_scroll);      break;    case RIGHT_SCROLL:      tui_scroll_right (win_to_scroll, num_to_scroll);      break;    default:      break;    }}voidtui_refresh_all_win (void){  enum tui_win_type type;  clearok (curscr, TRUE);  tui_refresh_all (tui_win_list);  for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++)    {      if (tui_win_list[type] && tui_win_list[type]->generic.is_visible)	{	  switch (type)	    {	    case SRC_WIN:	    case DISASSEM_WIN:	      tui_show_source_content (tui_win_list[type]);	      tui_check_and_display_highlight_if_needed (tui_win_list[type]);	      tui_erase_exec_info_content (tui_win_list[type]);	      tui_update_exec_info (tui_win_list[type]);	      break;	    case DATA_WIN:	      tui_refresh_data_win ();	      break;	    default:	      break;	    }	}    }  tui_show_locator_content ();}/* Resize all the windows based on the the terminal size.  This   function gets called from within the readline sinwinch handler.  */voidtui_resize_all (void){  int height_diff, width_diff;  int screenheight, screenwidth;  rl_get_screen_size (&screenheight, &screenwidth);  width_diff = screenwidth - tui_term_width ();  height_diff = screenheight - tui_term_height ();  if (height_diff || width_diff)    {      enum tui_layout_type cur_layout = tui_current_layout ();      struct tui_win_info * win_with_focus = tui_win_with_focus ();      struct tui_win_info *first_win;      struct tui_win_info *second_win;      struct tui_gen_win_info * locator = tui_locator_win_info_ptr ();      enum tui_win_type win_type;      int new_height, split_diff, cmd_split_diff, num_wins_displayed = 2;#ifdef HAVE_RESIZE_TERM      resize_term (screenheight, screenwidth);#endif            /* turn keypad off while we resize */      if (win_with_focus != TUI_CMD_WIN)	keypad (TUI_CMD_WIN->generic.handle, FALSE);      tui_update_gdb_sizes ();      tui_set_term_height_to (screenheight);      tui_set_term_width_to (screenwidth);      if (cur_layout == SRC_DISASSEM_COMMAND ||	cur_layout == SRC_DATA_COMMAND || cur_layout == DISASSEM_DATA_COMMAND)	num_wins_displayed++;      split_diff = height_diff / num_wins_displayed;      cmd_split_diff = split_diff;      if (height_diff % num_wins_displayed)	{	  if (height_diff < 0)	    cmd_split_diff--;	  else	    cmd_split_diff++;	}      /* now adjust each window */      clear ();      refresh ();      switch (cur_layout)	{	case SRC_COMMAND:	case DISASSEM_COMMAND:	  first_win = (struct tui_win_info *) (tui_source_windows ())->list[0];	  first_win->generic.width += width_diff;	  locator->width += width_diff;	  /* check for invalid heights */	  if (height_diff == 0)	    new_height = first_win->generic.height;	  else if ((first_win->generic.height + split_diff) >=		   (screenheight - MIN_CMD_WIN_HEIGHT - 1))	    new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1;	  else if ((first_win->generic.height + split_diff) <= 0)	    new_height = MIN_WIN_HEIGHT;	  else	    new_height = first_win->generic.height + split_diff;	  make_invisible_and_set_new_height (first_win, new_height);	  TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;	  TUI_CMD_WIN->generic.width += width_diff;	  new_height = screenheight - TUI_CMD_WIN->generic.origin.y;	  make_invisible_and_set_new_height (TUI_CMD_WIN, new_height);	  make_visible_with_new_height (first_win);	  make_visible_with_new_height (TUI_CMD_WIN);	  if (first_win->generic.content_size <= 0)	    tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);	  break;	default:	  if (cur_layout == SRC_DISASSEM_COMMAND)	    {	      first_win = TUI_SRC_WIN;	      first_win->generic.width += width_diff;	      second_win = TUI_DISASM_WIN;	      second_win->generic.width += width_diff;	    }	  else	    {	      first_win = TUI_DATA_WIN;	      first_win->generic.width += width_diff;	      second_win = (struct tui_win_info *) (tui_source_windows ())->list[0];	      second_win->generic.width += width_diff;	    }	  /* Change the first window's height/width */	  /* check for invalid heights */	  if (height_diff == 0)	    new_height = first_win->generic.height;	  else if ((first_win->generic.height +		    second_win->generic.height + (split_diff * 2)) >=		   (screenheight - MIN_CMD_WIN_HEIGHT - 1))	    new_height = (screenheight - MIN_CMD_WIN_HEIGHT - 1) / 2;	  else if ((first_win->generic.height + split_diff) <= 0)	    new_height = MIN_WIN_HEIGHT;	  else	    new_height = first_win->generic.height + split_diff;	  make_invisible_and_set_new_height (first_win, new_height);	  locator->width += width_diff;	  /* Change the second window's height/width */	  /* check for invalid heights */	  if (height_diff == 0)	    new_height = second_win->generic.height;	  else if ((first_win->generic.height +		    second_win->generic.height + (split_diff * 2)) >=		   (screenheight - MIN_CMD_WIN_HEIGHT - 1))	    {	      new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1;	      if (new_height % 2)		new_height = (new_height / 2) + 1;	      else		new_height /= 2;	    }	  else if ((second_win->generic.height + split_diff) <= 0)	    new_height = MIN_WIN_HEIGHT;	  else	    new_height = second_win->generic.height + split_diff;	  second_win->generic.origin.y = first_win->generic.height - 1;	  make_invisible_and_set_new_height (second_win, new_height);	  /* Change the command window's height/width */	  TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;	  make_invisible_and_set_new_height (			     TUI_CMD_WIN, TUI_CMD_WIN->generic.height + cmd_split_diff);	  make_visible_with_new_height (first_win);	  make_visible_with_new_height (second_win);	  make_visible_with_new_height (TUI_CMD_WIN);	  if (first_win->generic.content_size <= 0)	    tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);	  if (second_win->generic.content_size <= 0)	    tui_erase_source_content (second_win, EMPTY_SOURCE_PROMPT);	  break;	}      /*         ** Now remove all invisible windows, and their content so that they get         ** created again when called for with the new size       */      for (win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)	{	  if (win_type != CMD_WIN && (tui_win_list[win_type] != NULL)	      && !tui_win_list[win_type]->generic.is_visible)	    {	      tui_free_window (tui_win_list[win_type]);	      tui_win_list[win_type] = (struct tui_win_info *) NULL;	    }	}      tui_set_win_resized_to (TRUE);      /* turn keypad back on, unless focus is in the command window */      if (win_with_focus != TUI_CMD_WIN)	keypad (TUI_CMD_WIN->generic.handle, TRUE);    }}/* SIGWINCH signal handler for the tui.  This signal handler is always   called, even when the readline package clears signals because it is   set as the old_sigwinch() (TUI only).  */voidtui_sigwinch_handler (int signal){  /*     ** Say that a resize was done so that the readline can do it     ** later when appropriate.   */  tui_set_win_resized_to (TRUE);}/*************************** STATIC LOCAL FUNCTIONS**************************/static voidtui_scroll_forward_command (char *arg, int from_tty){  int num_to_scroll = 1;  struct tui_win_info * win_to_scroll;  /* Make sure the curses mode is enabled.  */  tui_enable ();  if (arg == (char *) NULL)    parse_scrolling_args (arg, &win_to_scroll, (int *) NULL);  else    parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);  tui_scroll (FORWARD_SCROLL, win_to_scroll, num_to_scroll);}static voidtui_scroll_backward_command (char *arg, int from_tty){  int num_to_scroll = 1;  struct tui_win_info * win_to_scroll;  /* Make sure the curses mode is enabled.  */  tui_enable ();  if (arg == (char *) NULL)    parse_scrolling_args (arg, &win_to_scroll, (int *) NULL);  else    parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);  tui_scroll (BACKWARD_SCROLL, win_to_scroll, num_to_scroll);}static voidtui_scroll_left_command (char *arg, int from_tty){  int num_to_scroll;  struct tui_win_info * win_to_scroll;  /* Make sure the curses mode is enabled.  */  tui_enable ();  parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);  tui_scroll (LEFT_SCROLL, win_to_scroll, num_to_scroll);}static voidtui_scroll_right_command (char *arg, int from_tty){  int num_to_scroll;  struct tui_win_info * win_to_scroll;  /* Make sure the curses mode is enabled.  */  tui_enable ();  parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);  tui_scroll (RIGHT_SCROLL, win_to_scroll, num_to_scroll);}/* Set focus to the window named by 'arg'.  */static voidtui_set_focus (char *arg, int from_tty){  if (arg != (char *) NULL)    {      char *buf_ptr = (char *) xstrdup (arg);      int i;      struct tui_win_info * win_info = (struct tui_win_info *) NULL;      for (i = 0; (i < strlen (buf_ptr)); i++)	buf_ptr[i] = toupper (arg[i]);      if (subset_compare (buf_ptr, "NEXT"))	win_info = tui_next_win (tui_win_with_focus ());      else if (subset_compare (buf_ptr, "PREV"))	win_info = tui_prev_win (tui_win_with_focus ());      else	win_info = tui_partial_win_by_name (buf_ptr);      if (win_info == (struct tui_win_info *) NULL || !win_info->generic.is_visible)	warning ("Invalid window specified. \n\The window name specified must be valid and visible.\n");      else	{	  tui_set_win_focus_to (win_info);	  keypad (TUI_CMD_WIN->generic.handle, (win_info != TUI_CMD_WIN));	}      if (TUI_DATA_WIN && TUI_DATA_WIN->generic.is_visible)	tui_refresh_data_win ();      xfree (buf_ptr);      printf_filtered ("Focus set to %s window.\n",		       tui_win_name ((struct tui_gen_win_info *) tui_win_with_focus ()));    }  else    warning ("Incorrect Number of Arguments.\n%s", FOCUS_USAGE);}static voidtui_set_focus_command (char *arg, int from_tty){  /* Make sure the curses mode is enabled.  */  tui_enable ();  tui_set_focus (arg, from_tty);}static voidtui_all_windows_info (char *arg, int from_tty){  enum tui_win_type type;  struct tui_win_info * win_with_focus = tui_win_with_focus ();  for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)    if (tui_win_list[type] && tui_win_list[type]->generic.is_visible)      {	if (win_with_focus == tui_win_list[type])	  printf_filtered ("        %s\t(%d lines)  <has focus>\n",			   tui_win_name (&tui_win_list[type]->generic),			   tui_win_list[type]->generic.height);	else	  printf_filtered ("        %s\t(%d lines)\n",			   tui_win_name (&tui_win_list[type]->generic),			   tui_win_list[type]->generic.height);      }}static voidtui_refresh_all_command (char *arg, int from_tty){  /* Make sure the curses mode is enabled.  */  tui_enable ();  tui_refresh_all_win ();}/* Set the height of the specified window.   */static voidtui_set_tab_width_command (char *arg, int from_tty){  /* Make sure the curses mode is enabled.  */  tui_enable ();  if (arg != (char *) NULL)    {      int ts;      ts = atoi (arg);      if (ts > 0)	tui_set_default_tab_len (ts);      else	warning ("Tab widths greater than 0 must be specified.\n");    }}/* Set the height of the specified window.   */static voidtui_set_win_height (char *arg, int from_tty){  /* Make sure the curses mode is enabled.  */  tui_enable ();  if (arg != (char *) NULL)    {      char *buf = xstrdup (arg);      char *buf_ptr = buf;      char *wname = (char *) NULL;      int new_height, i;      struct tui_win_info * win_info;      wname = buf_ptr;      buf_ptr = strchr (buf_ptr, ' ');      if (buf_ptr != (char *) NULL)	{	  *buf_ptr = (char) 0;	  /*	     ** Validate the window name	   */	  for (i = 0; i < strlen (wname); i++)	    wname[i] = toupper (wname[i]);	  win_info = tui_partial_win_by_name (wname);	  if (win_info == (struct tui_win_info *) NULL || !win_info->generic.is_visible)	    warning ("Invalid window specified. \n\The window name specified must be valid and visible.\n");	  else	    {	      /* Process the size */	      while (*(++buf_ptr) == ' ')		;	      if (*buf_ptr != (char) 0)		{		  int negate = FALSE;		  int fixed_size = TRUE;		  int input_no;;		  if (*buf_ptr == '+' || *buf_ptr == '-')		    {		      if (*buf_ptr == '-')			negate = TRUE;		      fixed_size = FALSE;		      buf_ptr++;		    }		  input_no = atoi (buf_ptr);		  if (input_no > 0)		    {		      if (negate)			input_no *= (-1);		      if (fixed_size)			new_height = input_no;		      else			new_height = win_info->generic.height + input_no;		      /*		         ** Now change the window's height, and adjust all		         ** other windows around it		       */		      if (tui_adjust_win_heights (win_info,						new_height) == TUI_FAILURE)			warning ("Invalid window height specified.\n%s",				 WIN_HEIGHT_USAGE);		      else                        tui_update_gdb_sizes ();		    }		  else		    warning ("Invalid window height specified.\n%s",			     WIN_HEIGHT_USAGE);		}	    }	}      else	printf_filtered (WIN_HEIGHT_USAGE);      if (buf != (char *) NULL)	xfree (buf);

⌨️ 快捷键说明

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