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

📄 gtklist.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
  if (item->state == GTK_STATE_NORMAL)    {      list->anchor_state = GTK_STATE_SELECTED;      gtk_widget_set_state (item, GTK_STATE_SELECTED);    }  else    {      list->anchor_state = GTK_STATE_NORMAL;      gtk_widget_set_state (item, GTK_STATE_NORMAL);    }}static voidgtk_list_update_extended_selection (GtkList *list,				    gint     row){  gint i;  GList *work;  gint s1 = -1;  gint s2 = -1;  gint e1 = -1;  gint e2 = -1;  gint length;  if (row < 0)    row = 0;  length = g_list_length (list->children);  if (row >= length)    row = length - 1;  if (list->selection_mode != GTK_SELECTION_EXTENDED || !list->anchor < 0)    return;  /* extending downwards */  if (row > list->drag_pos && list->anchor <= list->drag_pos)    {      s2 = list->drag_pos + 1;      e2 = row;    }  /* extending upwards */  else if (row < list->drag_pos && list->anchor >= list->drag_pos)    {      s2 = row;      e2 = list->drag_pos - 1;    }  else if (row < list->drag_pos && list->anchor < list->drag_pos)    {      e1 = list->drag_pos;      /* row and drag_pos on different sides of anchor :	 take back the selection between anchor and drag_pos,         select between anchor and row */      if (row < list->anchor)	{	  s1 = list->anchor + 1;	  s2 = row;	  e2 = list->anchor - 1;	}      /* take back the selection between anchor and drag_pos */      else	s1 = row + 1;    }  else if (row > list->drag_pos && list->anchor > list->drag_pos)    {      s1 = list->drag_pos;      /* row and drag_pos on different sides of anchor :	 take back the selection between anchor and drag_pos,         select between anchor and row */      if (row > list->anchor)	{	  e1 = list->anchor - 1;	  s2 = list->anchor + 1;	  e2 = row;	}      /* take back the selection between anchor and drag_pos */      else	e1 = row - 1;    }  list->drag_pos = row;  /* restore the elements between s1 and e1 */  if (s1 >= 0)    {      for (i = s1, work = g_list_nth (list->children, i); i <= e1;	   i++, work = work->next)	{	  if (g_list_find (list->selection, work->data))            gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_SELECTED);          else            gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_NORMAL);	}    }  /* extend the selection between s2 and e2 */  if (s2 >= 0)    {      for (i = s2, work = g_list_nth (list->children, i); i <= e2;	   i++, work = work->next)	if (GTK_WIDGET (work->data)->state != list->anchor_state)	  gtk_widget_set_state (GTK_WIDGET (work->data), list->anchor_state);    }}static voidgtk_list_reset_extended_selection (GtkList *list){   g_return_if_fail (list != 0);  g_return_if_fail (GTK_IS_LIST (list));  g_list_free (list->undo_selection);  g_list_free (list->undo_unselection);  list->undo_selection = NULL;  list->undo_unselection = NULL;  list->anchor = -1;  list->drag_pos = -1;  list->undo_focus_child = GTK_CONTAINER (list)->focus_child;}/* Public GtkList Scroll Methods : * * gtk_list_scroll_horizontal * gtk_list_scroll_vertical */voidgtk_list_scroll_horizontal (GtkList       *list,			    GtkScrollType  scroll_type,			    gfloat         position){  GtkAdjustment *adj;  g_return_if_fail (list != 0);  g_return_if_fail (GTK_IS_LIST (list));  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list))    return;  if (!(adj =	gtk_object_get_data_by_id (GTK_OBJECT (list), hadjustment_key_id)))    return;  switch (scroll_type)    {    case GTK_SCROLL_STEP_BACKWARD:      adj->value = CLAMP (adj->value - adj->step_increment, adj->lower,			  adj->upper - adj->page_size);      break;    case GTK_SCROLL_STEP_FORWARD:      adj->value = CLAMP (adj->value + adj->step_increment, adj->lower,			  adj->upper - adj->page_size);      break;    case GTK_SCROLL_PAGE_BACKWARD:      adj->value = CLAMP (adj->value - adj->page_increment, adj->lower,			  adj->upper - adj->page_size);      break;    case GTK_SCROLL_PAGE_FORWARD:      adj->value = CLAMP (adj->value + adj->page_increment, adj->lower,			  adj->upper - adj->page_size);      break;    case GTK_SCROLL_JUMP:      adj->value = CLAMP (adj->lower + (adj->upper - adj->lower) * position,			  adj->lower, adj->upper - adj->page_size);      break;    default:      break;    }  gtk_adjustment_value_changed (adj);}voidgtk_list_scroll_vertical (GtkList       *list,			  GtkScrollType  scroll_type,			  gfloat         position){  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list))    return;  if (list->selection_mode == GTK_SELECTION_EXTENDED)    {      GtkContainer *container;      if (list->anchor >= 0)	return;      container = GTK_CONTAINER (list);      list->undo_focus_child = container->focus_child;      gtk_list_move_focus_child (list, scroll_type, position);      if (container->focus_child != list->undo_focus_child && !list->add_mode)	{	  gtk_list_unselect_all (list);	  gtk_list_select_child (list, container->focus_child);	}    }  else    gtk_list_move_focus_child (list, scroll_type, position);}/* Private GtkList Scroll/Focus Functions : * * gtk_list_move_focus_child * gtk_list_horizontal_timeout * gtk_list_vertical_timeout */static voidgtk_list_move_focus_child (GtkList       *list,			   GtkScrollType  scroll_type,			   gfloat         position){  GtkContainer *container;  GList *work;  GtkWidget *item;  GtkAdjustment *adj;  gint new_value;  g_return_if_fail (list != 0);  g_return_if_fail (GTK_IS_LIST (list));  container = GTK_CONTAINER (list);  if (container->focus_child)    work = g_list_find (list->children, container->focus_child);  else    work = list->children;  if (!work)    return;  switch (scroll_type)    {    case GTK_SCROLL_STEP_BACKWARD:      work = work->prev;      if (work)	gtk_widget_grab_focus (GTK_WIDGET (work->data));      break;    case GTK_SCROLL_STEP_FORWARD:      work = work->next;      if (work)	gtk_widget_grab_focus (GTK_WIDGET (work->data));      break;    case GTK_SCROLL_PAGE_BACKWARD:      if (!work->prev)	return;      item = work->data;      adj = gtk_object_get_data_by_id (GTK_OBJECT (list), vadjustment_key_id);      if (adj)	{	  gboolean correct = FALSE;	  new_value = adj->value;	  if (item->allocation.y <= adj->value)	    {	      new_value = MAX (item->allocation.y + item->allocation.height			       - adj->page_size, adj->lower);	      correct = TRUE;	    }	  if (item->allocation.y > new_value)	    for (; work; work = work->prev)	      {		item = GTK_WIDGET (work->data);		if (item->allocation.y <= new_value &&		    item->allocation.y + item->allocation.height > new_value)		  break;	      }	  else	    for (; work; work = work->next)	      {		item = GTK_WIDGET (work->data);		if (item->allocation.y <= new_value &&		    item->allocation.y + item->allocation.height > new_value)		  break;	      }	  if (correct && work && work->next && item->allocation.y < new_value)	    item = work->next->data;	}      else	item = list->children->data;	        gtk_widget_grab_focus (item);      break;    case GTK_SCROLL_PAGE_FORWARD:      if (!work->next)	return;      item = work->data;      adj = gtk_object_get_data_by_id (GTK_OBJECT (list), vadjustment_key_id);      if (adj)	{	  gboolean correct = FALSE;	  new_value = adj->value;	  if (item->allocation.y + item->allocation.height >=	      adj->value + adj->page_size)	    {	      new_value = item->allocation.y;	      correct = TRUE;	    }	  new_value = MIN (new_value + adj->page_size, adj->upper);	  if (item->allocation.y > new_value)	    for (; work; work = work->prev)	      {		item = GTK_WIDGET (work->data);		if (item->allocation.y <= new_value &&		    item->allocation.y + item->allocation.height > new_value)		  break;	      }	  else	    for (; work; work = work->next)	      {		item = GTK_WIDGET (work->data);		if (item->allocation.y <= new_value &&		    item->allocation.y + item->allocation.height > new_value)		  break;	      }	  if (correct && work && work->prev &&	      item->allocation.y + item->allocation.height - 1 > new_value)	    item = work->prev->data;	}      else	item = g_list_last (work)->data;	        gtk_widget_grab_focus (item);      break;    case GTK_SCROLL_JUMP:      new_value = GTK_WIDGET(list)->allocation.height * CLAMP (position, 0, 1);      for (item = NULL, work = list->children; work; work =work->next)	{	  item = GTK_WIDGET (work->data);	  if (item->allocation.y <= new_value &&	      item->allocation.y + item->allocation.height > new_value)	    break;	}      gtk_widget_grab_focus (item);      break;    default:      break;    }}static gintgtk_list_horizontal_timeout (GtkWidget *list){  GdkEventMotion event = { 0 };  GDK_THREADS_ENTER ();  GTK_LIST (list)->htimer = 0;  event.type = GDK_MOTION_NOTIFY;  event.send_event = TRUE;  gtk_list_motion_notify (list, &event);  GDK_THREADS_LEAVE ();  return FALSE;}static gintgtk_list_vertical_timeout (GtkWidget *list){  GdkEventMotion event = { 0 };  GDK_THREADS_ENTER ();  GTK_LIST (list)->vtimer = 0;  event.type = GDK_MOTION_NOTIFY;  event.send_event = TRUE;  gtk_list_motion_notify (list, &event);  GDK_THREADS_LEAVE ();  return FALSE;}/* Private GtkListItem Signal Functions : * * gtk_list_signal_toggle_focus_row * gtk_list_signal_select_all * gtk_list_signal_unselect_all * gtk_list_signal_undo_selection * gtk_list_signal_start_selection * gtk_list_signal_end_selection * gtk_list_signal_extend_selection * gtk_list_signal_scroll_horizontal * gtk_list_signal_scroll_vertical * gtk_list_signal_toggle_add_mode * gtk_list_signal_item_select * gtk_list_signal_item_deselect * gtk_list_signal_item_toggle */static voidgtk_list_signal_toggle_focus_row (GtkListItem *list_item,				  GtkList     *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_toggle_focus_row (list);}static voidgtk_list_signal_select_all (GtkListItem *list_item,			    GtkList     *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_select_all (list);}static voidgtk_list_signal_unselect_all (GtkListItem *list_item,			      GtkList     *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_unselect_all (list);}static voidgtk_list_signal_undo_selection (GtkListItem *list_item,				GtkList     *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_undo_selection (list);}static voidgtk_list_signal_start_selection (GtkListItem *list_item,				 GtkList     *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_start_selection (list);}static voidgtk_list_signal_end_selection (GtkListItem *list_item,			       GtkList     *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_end_selection (list);}static voidgtk_list_signal_extend_selection (GtkListItem   *list_item,				  GtkScrollType  scroll_type,				  gfloat         position,				  gboolean       auto_start_selection,				  GtkList       *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_extend_selection (list, scroll_type, position,			     auto_start_selection);}static voidgtk_list_signal_scroll_horizontal (GtkListItem   *list_item,				   GtkScrollType  scroll_type,				   gfloat         position,				   GtkList       *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  g_return_if_fail (GTK_IS_LIST (list));  gtk_list_scroll_horizontal (list, scroll_type, position);}static voidgtk_list_signal_scroll_vertical (GtkListItem   *list_item,				 GtkScrollType  scroll_type,				 gfloat         position,				 GtkList       *list){  g_return_if_fail (list_item != 0);  g_return_if_fail (GTK_IS_LIST_ITEM (list_item));  g_return_if_fail (list != NULL);  

⌨️ 快捷键说明

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