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

📄 gtkvbox.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
字号:
/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS * file for a list of people on the GTK+ Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/.  */#include "gtkvbox.h"static void gtk_vbox_class_init    (GtkVBoxClass   *klass);static void gtk_vbox_init          (GtkVBox        *box);static void gtk_vbox_size_request  (GtkWidget      *widget,				    GtkRequisition *requisition);static void gtk_vbox_size_allocate (GtkWidget      *widget,				    GtkAllocation  *allocation);GtkTypegtk_vbox_get_type (void){  static GtkType vbox_type = 0;  if (!vbox_type)    {      static const GtkTypeInfo vbox_info =      {	"GtkVBox",	sizeof (GtkVBox),	sizeof (GtkVBoxClass),	(GtkClassInitFunc) gtk_vbox_class_init,	(GtkObjectInitFunc) gtk_vbox_init,	/* reserved_1 */ NULL,        /* reserved_2 */ NULL,        (GtkClassInitFunc) NULL,      };      vbox_type = gtk_type_unique (GTK_TYPE_BOX, &vbox_info);    }  return vbox_type;}static voidgtk_vbox_class_init (GtkVBoxClass *class){  GtkWidgetClass *widget_class;  widget_class = (GtkWidgetClass*) class;  widget_class->size_request = gtk_vbox_size_request;  widget_class->size_allocate = gtk_vbox_size_allocate;}static voidgtk_vbox_init (GtkVBox *vbox){}GtkWidget*gtk_vbox_new (gboolean homogeneous,	      gint spacing){  GtkVBox *vbox;  vbox = gtk_type_new (gtk_vbox_get_type ());  GTK_BOX (vbox)->spacing = spacing;  GTK_BOX (vbox)->homogeneous = homogeneous ? TRUE : FALSE;  return GTK_WIDGET (vbox);}static voidgtk_vbox_size_request (GtkWidget      *widget,		       GtkRequisition *requisition){  GtkBox *box;  GtkBoxChild *child;  GtkRequisition child_requisition;  GList *children;  gint nvis_children;  gint height;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_VBOX (widget));  g_return_if_fail (requisition != NULL);  box = GTK_BOX (widget);  requisition->width = 0;  requisition->height = 0;  nvis_children = 0;  children = box->children;  while (children)    {      child = children->data;      children = children->next;      if (GTK_WIDGET_VISIBLE (child->widget))	{	  gtk_widget_size_request (child->widget, &child_requisition);	  if (box->homogeneous)	    {	      height = child_requisition.height + child->padding * 2;	      requisition->height = MAX (requisition->height, height);	    }	  else	    {	      requisition->height += child_requisition.height + child->padding * 2;	    }	  requisition->width = MAX (requisition->width, child_requisition.width);	  nvis_children += 1;	}    }  if (nvis_children > 0)    {      if (box->homogeneous)	requisition->height *= nvis_children;      requisition->height += (nvis_children - 1) * box->spacing;    }  requisition->width += GTK_CONTAINER (box)->border_width * 2;  requisition->height += GTK_CONTAINER (box)->border_width * 2;}static voidgtk_vbox_size_allocate (GtkWidget     *widget,			GtkAllocation *allocation){  GtkBox *box;  GtkBoxChild *child;  GList *children;  GtkAllocation child_allocation;  gint nvis_children;  gint nexpand_children;  gint child_height;  gint height;  gint extra;  gint y;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_VBOX (widget));  g_return_if_fail (allocation != NULL);  box = GTK_BOX (widget);  widget->allocation = *allocation;  nvis_children = 0;  nexpand_children = 0;  children = box->children;  while (children)    {      child = children->data;      children = children->next;      if (GTK_WIDGET_VISIBLE (child->widget))	{	  nvis_children += 1;	  if (child->expand)	    nexpand_children += 1;	}    }  if (nvis_children > 0)    {      if (box->homogeneous)	{	  height = (allocation->height -		   GTK_CONTAINER (box)->border_width * 2 -		   (nvis_children - 1) * box->spacing);	  extra = height / nvis_children;	}      else if (nexpand_children > 0)	{	  height = (gint) allocation->height - (gint) widget->requisition.height;	  extra = height / nexpand_children;	}      else	{	  height = 0;	  extra = 0;	}      y = allocation->y + GTK_CONTAINER (box)->border_width;      child_allocation.x = allocation->x + GTK_CONTAINER (box)->border_width;      child_allocation.width = MAX (1, (gint) allocation->width - (gint) GTK_CONTAINER (box)->border_width * 2);      children = box->children;      while (children)	{	  child = children->data;	  children = children->next;	  if ((child->pack == GTK_PACK_START) && GTK_WIDGET_VISIBLE (child->widget))	    {	      if (box->homogeneous)		{		  if (nvis_children == 1)		    child_height = height;		  else		    child_height = extra;		  nvis_children -= 1;		  height -= extra;		}	      else		{		  GtkRequisition child_requisition;		  gtk_widget_get_child_requisition (child->widget, &child_requisition);		  child_height = child_requisition.height + child->padding * 2;		  if (child->expand)		    {		      if (nexpand_children == 1)			child_height += height;		      else			child_height += extra;		      nexpand_children -= 1;		      height -= extra;		    }		}	      if (child->fill)		{		  child_allocation.height = MAX (1, child_height - (gint)child->padding * 2);		  child_allocation.y = y + child->padding;		}	      else		{		  GtkRequisition child_requisition;		  gtk_widget_get_child_requisition (child->widget, &child_requisition);		  child_allocation.height = child_requisition.height;		  child_allocation.y = y + (child_height - child_allocation.height) / 2;		}	      gtk_widget_size_allocate (child->widget, &child_allocation);	      y += child_height + box->spacing;	    }	}      y = allocation->y + allocation->height - GTK_CONTAINER (box)->border_width;      children = box->children;      while (children)	{	  child = children->data;	  children = children->next;	  if ((child->pack == GTK_PACK_END) && GTK_WIDGET_VISIBLE (child->widget))	    {	      GtkRequisition child_requisition;	      gtk_widget_get_child_requisition (child->widget, &child_requisition);              if (box->homogeneous)                {                  if (nvis_children == 1)                    child_height = height;                  else                    child_height = extra;                  nvis_children -= 1;                  height -= extra;                }              else                {		  child_height = child_requisition.height + child->padding * 2;                  if (child->expand)                    {                      if (nexpand_children == 1)                        child_height += height;                      else                        child_height += extra;                      nexpand_children -= 1;                      height -= extra;                    }                }              if (child->fill)                {                  child_allocation.height = MAX (1, child_height - (gint)child->padding * 2);                  child_allocation.y = y + child->padding - child_height;                }              else                {		  child_allocation.height = child_requisition.height;                  child_allocation.y = y + (child_height - child_allocation.height) / 2 - child_height;                }              gtk_widget_size_allocate (child->widget, &child_allocation);              y -= (child_height + box->spacing);	    }	}    }}

⌨️ 快捷键说明

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