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

📄 gtklist.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list))    {      gtk_list_end_drag_selection (list);      if (list->anchor != -1 && list->selection_mode == GTK_SELECTION_EXTENDED)	gtk_list_end_selection (list);    }  gdk_window_hide (widget->window);}static gintgtk_list_motion_notify (GtkWidget      *widget,			GdkEventMotion *event){  GtkList *list;  GtkWidget *item = NULL;  GtkAdjustment *adj;  GtkContainer *container;  GList *work;  gint x;  gint y;  gint row = -1;  gint focus_row = 0;  gint length = 0;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  list = GTK_LIST (widget);  if (!list->drag_selection || !list->children)    return FALSE;  container = GTK_CONTAINER (widget);  if (event->is_hint || event->window != widget->window)    gdk_window_get_pointer (widget->window, &x, &y, NULL);  adj = gtk_object_get_data_by_id (GTK_OBJECT (list), hadjustment_key_id);  /* horizontal autoscrolling */  if (adj && widget->allocation.width > adj->page_size &&      (x < adj->value || x >= adj->value + adj->page_size))    {      if (list->htimer == 0)	{	  list->htimer = gtk_timeout_add	    (SCROLL_TIME, (GtkFunction) gtk_list_horizontal_timeout, widget);	  	  if (!((x < adj->value && adj->value <= 0) ||		(x > adj->value + adj->page_size &&		 adj->value >= adj->upper - adj->page_size)))	    {	      gfloat value;	      if (x < adj->value)		value = adj->value + (x - adj->value) / 2 - 1;	      else		value = adj->value + 1 + (x - adj->value - adj->page_size) / 2;	      gtk_adjustment_set_value (adj,					CLAMP (value, 0.0,					       adj->upper - adj->page_size));	    }	}      else	return FALSE;    }    /* vertical autoscrolling */  for (work = list->children; work; length++, work = work->next)    {      if (row < 0)	{	  item = GTK_WIDGET (work->data);	  if (item->allocation.y > y || 	      (item->allocation.y <= y &&	       item->allocation.y + item->allocation.height > y))	    row = length;	}      if (work->data == container->focus_child)	focus_row = length;    }    if (row < 0)    row = length - 1;  if (list->vtimer != 0)    return FALSE;  if (!((y < 0 && focus_row == 0) ||	(y > widget->allocation.height && focus_row >= length - 1)))    list->vtimer = gtk_timeout_add (SCROLL_TIME,				    (GtkFunction) gtk_list_vertical_timeout,				    list);  if (row != focus_row)    gtk_widget_grab_focus (item);  switch (list->selection_mode)    {    case GTK_SELECTION_BROWSE:      gtk_list_select_child (list, item);      break;    case GTK_SELECTION_EXTENDED:      gtk_list_update_extended_selection (list, row);      break;    default:      break;    }  return FALSE;}static gintgtk_list_button_press (GtkWidget      *widget,		       GdkEventButton *event){  GtkList *list;  GtkWidget *item;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  if (event->button != 1)    return FALSE;  list = GTK_LIST (widget);  item = gtk_get_event_widget ((GdkEvent*) event);  while (item && !GTK_IS_LIST_ITEM (item))    item = item->parent;  if (item && (item->parent == widget))    {      gint last_focus_row;      gint focus_row;      if (event->type == GDK_BUTTON_PRESS)	{	  if (gdk_pointer_grab (widget->window, TRUE,				GDK_POINTER_MOTION_HINT_MASK |				GDK_BUTTON1_MOTION_MASK |				GDK_BUTTON_RELEASE_MASK,				NULL, NULL, event->time))	    return FALSE;	  	  gtk_grab_add (widget);	  list->drag_selection = TRUE;	}      else if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list))	gtk_list_end_drag_selection (list);	        if (!GTK_WIDGET_HAS_FOCUS(item))	gtk_widget_grab_focus (item);      if (list->add_mode)	{	  list->add_mode = FALSE;	  gtk_widget_queue_draw (item);	}            switch (list->selection_mode)	{	case GTK_SELECTION_SINGLE:	case GTK_SELECTION_MULTIPLE:	  if (event->type != GDK_BUTTON_PRESS)	    gtk_list_select_child (list, item);	  else	    list->undo_focus_child = item;	  break;	  	case GTK_SELECTION_BROWSE:	  break;	case GTK_SELECTION_EXTENDED:	  focus_row = g_list_index (list->children, item);	  if (list->last_focus_child)	    last_focus_row = g_list_index (list->children,					   list->last_focus_child);	  else	    {	      last_focus_row = focus_row;	      list->last_focus_child = item;	    }	  if (event->type != GDK_BUTTON_PRESS)	    {	      if (list->anchor >= 0)		{		  gtk_list_update_extended_selection (list, focus_row);		  gtk_list_end_selection (list);		}	      gtk_list_select_child (list, item);	      break;	    }	      	  if (event->state & GDK_CONTROL_MASK)	    {	      if (event->state & GDK_SHIFT_MASK)		{		  if (list->anchor < 0)		    {		      g_list_free (list->undo_selection);		      g_list_free (list->undo_unselection);		      list->undo_selection = NULL;		      list->undo_unselection = NULL;		      list->anchor = last_focus_row;		      list->drag_pos = last_focus_row;		      list->undo_focus_child = list->last_focus_child;		    }		  gtk_list_update_extended_selection (list, focus_row);		}	      else		{		  if (list->anchor < 0)		    gtk_list_set_anchor (list, TRUE,					 focus_row, list->last_focus_child);		  else		    gtk_list_update_extended_selection (list, focus_row);		}	      break;	    }	  if (event->state & GDK_SHIFT_MASK)	    {	      gtk_list_set_anchor (list, FALSE,				   last_focus_row, list->last_focus_child);	      gtk_list_update_extended_selection (list, focus_row);	      break;	    }	  if (list->anchor < 0)	    gtk_list_set_anchor (list, FALSE, focus_row,				 list->last_focus_child);	  else	    gtk_list_update_extended_selection (list, focus_row);	  break;	  	default:	  break;	}    }  return FALSE;}static gintgtk_list_button_release (GtkWidget	*widget,			 GdkEventButton *event){  GtkList *list;  GtkWidget *item;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  list = GTK_LIST (widget);  /* we don't handle button 2 and 3 */  if (event->button != 1)    return FALSE;  if (list->drag_selection)    {      gtk_list_end_drag_selection (list);      switch (list->selection_mode)	{	case GTK_SELECTION_EXTENDED: 	  if (!(event->state & GDK_SHIFT_MASK))	    gtk_list_end_selection (list);	  break;	case GTK_SELECTION_SINGLE:	case GTK_SELECTION_MULTIPLE:	  item = gtk_get_event_widget ((GdkEvent*) event);  	  while (item && !GTK_IS_LIST_ITEM (item))	    item = item->parent;	  	  if (item && item->parent == widget)	    {	      if (list->undo_focus_child == item)		gtk_list_toggle_row (list, item);	    }	  list->undo_focus_child = NULL;	  break;	default:	  break;	}    }    return FALSE;}static voidgtk_list_draw (GtkWidget    *widget,	       GdkRectangle *area){  GtkList *list;  GtkWidget *child;  GdkRectangle child_area;  GList *children;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LIST (widget));  g_return_if_fail (area != NULL);  if (GTK_WIDGET_DRAWABLE (widget))    {      list = GTK_LIST (widget);      children = list->children;      while (children)	{	  child = children->data;	  children = children->next;	  if (gtk_widget_intersect (child, area, &child_area))	    gtk_widget_draw (child, &child_area);	}    }}static gintgtk_list_expose (GtkWidget	*widget,		 GdkEventExpose *event){  GtkList *list;  GtkWidget *child;  GdkEventExpose child_event;  GList *children;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_LIST (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  if (GTK_WIDGET_DRAWABLE (widget))    {      list = GTK_LIST (widget);      child_event = *event;      children = list->children;      while (children)	{	  child = children->data;	  children = children->next;	  if (GTK_WIDGET_NO_WINDOW (child) &&	      gtk_widget_intersect (child, &event->area, &child_event.area))	    gtk_widget_event (child, (GdkEvent*) &child_event);	}    }  return FALSE;}static void gtk_list_style_set	(GtkWidget      *widget,			 GtkStyle       *previous_style){  g_return_if_fail (widget != NULL);  if (previous_style && GTK_WIDGET_REALIZED (widget))    gdk_window_set_background (widget->window, &widget->style->base[GTK_WIDGET_STATE (widget)]);}/* GtkContainer Methods : * gtk_list_add * gtk_list_remove * gtk_list_forall * gtk_list_child_type * gtk_list_set_focus_child * gtk_list_focus */static voidgtk_list_add (GtkContainer *container,	      GtkWidget	   *widget){  GList *item_list;  g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_LIST (container));  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LIST_ITEM (widget));  item_list = g_list_alloc ();  item_list->data = widget;    gtk_list_append_items (GTK_LIST (container), item_list);}static voidgtk_list_remove (GtkContainer *container,		 GtkWidget    *widget){  GList *item_list;    g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_LIST (container));  g_return_if_fail (widget != NULL);  g_return_if_fail (container == GTK_CONTAINER (widget->parent));    item_list = g_list_alloc ();  item_list->data = widget;    gtk_list_remove_items (GTK_LIST (container), item_list);    g_list_free (item_list);}static voidgtk_list_forall (GtkContainer  *container,		 gboolean       include_internals,		 GtkCallback	callback,		 gpointer	callback_data){  GtkList *list;  GtkWidget *child;  GList *children;  g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_LIST (container));  g_return_if_fail (callback != NULL);  list = GTK_LIST (container);  children = list->children;  while (children)    {      child = children->data;      children = children->next;      (* callback) (child, callback_data);    }}static GtkTypegtk_list_child_type (GtkContainer *container){  return GTK_TYPE_LIST_ITEM;}static voidgtk_list_set_focus_child (GtkContainer *container,			  GtkWidget    *child){  GtkList *list;  g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_LIST (container));   if (child)    g_return_if_fail (GTK_IS_WIDGET (child));  list = GTK_LIST (container);  if (child != container->focus_child)    {      if (container->focus_child)	{	  list->last_focus_child = container->focus_child;	  gtk_widget_unref (container->focus_child);	}      container->focus_child = child;      if (container->focus_child)        gtk_widget_ref (container->focus_child);    }  /* check for v adjustment */  if (container->focus_child)    {      GtkAdjustment *adjustment;      adjustment = gtk_object_get_data_by_id (GTK_OBJECT (container),					      vadjustment_key_id);      if (adjustment)        gtk_adjustment_clamp_page (adjustment,                                   container->focus_child->allocation.y,                                   (container->focus_child->allocation.y +                                    container->focus_child->allocation.height));      switch (list->selection_mode)	{	case GTK_SELECTION_BROWSE:	  gtk_list_select_child (list, child);	  break;	case GTK_SELECTION_EXTENDED:	  if (!list->last_focus_child && !list->add_mode)	    {	      list->undo_focus_child = list->last_focus_child;	      gtk_list_unselect_all (list);	      gtk_list_select_child (list, child);	    }	  break;	default:	  break;	}    }}static gintgtk_list_focus (GtkContainer     *container,		GtkDirectionType  direction){  gint return_val = FALSE;  g_return_val_if_fail (container != NULL, FALSE);  g_return_val_if_fail (GTK_IS_LIST (container), FALSE);  if (container->focus_child == NULL ||      !GTK_WIDGET_HAS_FOCUS (container->focus_child))    {

⌨️ 快捷键说明

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