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

📄 gtklayout.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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. * * GtkLayout: Widget for scrolling of arbitrary-sized areas. * * Copyright Owen Taylor, 1998 *//* * 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 "gtklayout.h"#include "gtksignal.h"#include "gtkprivate.h"#include "gdk/gdkx.h"typedef struct _GtkLayoutAdjData GtkLayoutAdjData;typedef struct _GtkLayoutChild   GtkLayoutChild;struct _GtkLayoutAdjData {  gint dx;  gint dy;};struct _GtkLayoutChild {  GtkWidget *widget;  gint x;  gint y;};#define IS_ONSCREEN(x,y) ((x >= G_MINSHORT) && (x <= G_MAXSHORT) && \                          (y >= G_MINSHORT) && (y <= G_MAXSHORT))static void     gtk_layout_class_init         (GtkLayoutClass *class);static void     gtk_layout_init               (GtkLayout      *layout);static void     gtk_layout_finalize           (GtkObject      *object);static void     gtk_layout_realize            (GtkWidget      *widget);static void     gtk_layout_unrealize          (GtkWidget      *widget);static void     gtk_layout_map                (GtkWidget      *widget);static void     gtk_layout_size_request       (GtkWidget      *widget,					       GtkRequisition *requisition);static void     gtk_layout_size_allocate      (GtkWidget      *widget,					       GtkAllocation  *allocation);static void     gtk_layout_draw               (GtkWidget      *widget, 					       GdkRectangle   *area);static gint     gtk_layout_expose             (GtkWidget      *widget, 					       GdkEventExpose *event);static void     gtk_layout_remove             (GtkContainer *container, 					       GtkWidget    *widget);static void     gtk_layout_forall             (GtkContainer *container,					       gboolean      include_internals,					       GtkCallback   callback,					       gpointer      callback_data);static void     gtk_layout_set_adjustments    (GtkLayout     *layout,					       GtkAdjustment *hadj,					       GtkAdjustment *vadj);static void     gtk_layout_position_child     (GtkLayout      *layout,					       GtkLayoutChild *child);static void     gtk_layout_allocate_child     (GtkLayout      *layout,					       GtkLayoutChild *child);static void     gtk_layout_position_children  (GtkLayout      *layout);static void     gtk_layout_adjust_allocations_recurse (GtkWidget *widget,						       gpointer   cb_data);static void     gtk_layout_adjust_allocations         (GtkLayout *layout,					               gint       dx,						       gint       dy);static void     gtk_layout_expose_area        (GtkLayout      *layout,					       gint            x, 					       gint            y, 					       gint            width, 					       gint            height);static void     gtk_layout_adjustment_changed (GtkAdjustment  *adjustment,					       GtkLayout      *layout);static GdkFilterReturn gtk_layout_filter      (GdkXEvent      *gdk_xevent,					       GdkEvent       *event,					       gpointer        data);static GdkFilterReturn gtk_layout_main_filter (GdkXEvent      *gdk_xevent,					       GdkEvent       *event,					       gpointer        data);static GtkWidgetClass *parent_class = NULL;static gboolean gravity_works;/* Public interface */  GtkWidget*    gtk_layout_new (GtkAdjustment *hadjustment,		GtkAdjustment *vadjustment){  GtkLayout *layout;  layout = gtk_type_new (GTK_TYPE_LAYOUT);  gtk_layout_set_adjustments (layout, hadjustment, vadjustment);  return GTK_WIDGET (layout);}GtkAdjustment* gtk_layout_get_hadjustment (GtkLayout     *layout){  g_return_val_if_fail (layout != NULL, NULL);  g_return_val_if_fail (GTK_IS_LAYOUT (layout), NULL);  return layout->hadjustment;}GtkAdjustment* gtk_layout_get_vadjustment (GtkLayout     *layout){  g_return_val_if_fail (layout != NULL, NULL);  g_return_val_if_fail (GTK_IS_LAYOUT (layout), NULL);  return layout->vadjustment;}static void           gtk_layout_set_adjustments (GtkLayout     *layout,			    GtkAdjustment *hadj,			    GtkAdjustment *vadj){  gboolean need_adjust = FALSE;  g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));  if (hadj)    g_return_if_fail (GTK_IS_ADJUSTMENT (hadj));  else    hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));  if (vadj)    g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));  else    vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));    if (layout->hadjustment && (layout->hadjustment != hadj))    {      gtk_signal_disconnect_by_data (GTK_OBJECT (layout->hadjustment), layout);      gtk_object_unref (GTK_OBJECT (layout->hadjustment));    }    if (layout->vadjustment && (layout->vadjustment != vadj))    {      gtk_signal_disconnect_by_data (GTK_OBJECT (layout->vadjustment), layout);      gtk_object_unref (GTK_OBJECT (layout->vadjustment));    }    if (layout->hadjustment != hadj)    {      layout->hadjustment = hadj;      gtk_object_ref (GTK_OBJECT (layout->hadjustment));      gtk_object_sink (GTK_OBJECT (layout->hadjustment));            gtk_signal_connect (GTK_OBJECT (layout->hadjustment), "value_changed",			  (GtkSignalFunc) gtk_layout_adjustment_changed,			  layout);      need_adjust = TRUE;    }    if (layout->vadjustment != vadj)    {      layout->vadjustment = vadj;      gtk_object_ref (GTK_OBJECT (layout->vadjustment));      gtk_object_sink (GTK_OBJECT (layout->vadjustment));            gtk_signal_connect (GTK_OBJECT (layout->vadjustment), "value_changed",			  (GtkSignalFunc) gtk_layout_adjustment_changed,			  layout);      need_adjust = TRUE;    }  if (need_adjust)    gtk_layout_adjustment_changed (NULL, layout);}static voidgtk_layout_finalize (GtkObject *object){  GtkLayout *layout = GTK_LAYOUT (object);  gtk_object_unref (GTK_OBJECT (layout->hadjustment));  gtk_object_unref (GTK_OBJECT (layout->vadjustment));  GTK_OBJECT_CLASS (parent_class)->finalize (object);}void           gtk_layout_set_hadjustment (GtkLayout     *layout,			    GtkAdjustment *adjustment){  g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));  gtk_layout_set_adjustments (layout, adjustment, layout->vadjustment);} void           gtk_layout_set_vadjustment (GtkLayout     *layout,			    GtkAdjustment *adjustment){  g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));    gtk_layout_set_adjustments (layout, layout->hadjustment, adjustment);}void           gtk_layout_put (GtkLayout     *layout, 		GtkWidget     *child_widget, 		gint           x, 		gint           y){  GtkLayoutChild *child;  g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));  g_return_if_fail (child_widget != NULL);  g_return_if_fail (GTK_IS_WIDGET (child_widget));    child = g_new (GtkLayoutChild, 1);  child->widget = child_widget;  child->x = x;  child->y = y;  layout->children = g_list_append (layout->children, child);    gtk_widget_set_parent (child_widget, GTK_WIDGET (layout));  if (GTK_WIDGET_REALIZED (layout))    gtk_widget_set_parent_window (child->widget, layout->bin_window);  if (!IS_ONSCREEN (x, y))    GTK_PRIVATE_SET_FLAG (child_widget, GTK_IS_OFFSCREEN);  if (GTK_WIDGET_REALIZED (layout))    gtk_widget_realize (child_widget);      if (GTK_WIDGET_VISIBLE (layout) && GTK_WIDGET_VISIBLE (child_widget))    {      if (GTK_WIDGET_MAPPED (layout))	gtk_widget_map (child_widget);      gtk_widget_queue_resize (child_widget);    }}void           gtk_layout_move (GtkLayout     *layout, 		 GtkWidget     *child_widget, 		 gint           x, 		 gint           y){  GList *tmp_list;  GtkLayoutChild *child;    g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));  tmp_list = layout->children;  while (tmp_list)    {      child = tmp_list->data;      tmp_list = tmp_list->next;      if (child->widget == child_widget)	{	  child->x = x;	  child->y = y;	  if (GTK_WIDGET_VISIBLE (child_widget) && GTK_WIDGET_VISIBLE (layout))	    gtk_widget_queue_resize (child_widget);	  return;	}    }}voidgtk_layout_set_size (GtkLayout     *layout, 		     guint          width,		     guint          height){  g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));  layout->width = width;  layout->height = height;  layout->hadjustment->upper = layout->width;  gtk_signal_emit_by_name (GTK_OBJECT (layout->hadjustment), "changed");  layout->vadjustment->upper = layout->height;  gtk_signal_emit_by_name (GTK_OBJECT (layout->vadjustment), "changed");}voidgtk_layout_freeze (GtkLayout *layout){  g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));  layout->freeze_count++;}voidgtk_layout_thaw (GtkLayout *layout){  g_return_if_fail (layout != NULL);  g_return_if_fail (GTK_IS_LAYOUT (layout));  if (layout->freeze_count)    if (!(--layout->freeze_count))      {	gtk_layout_position_children (layout);	gtk_widget_draw (GTK_WIDGET (layout), NULL);      }}/* Basic Object handling procedures */GtkTypegtk_layout_get_type (void){  static GtkType layout_type = 0;  if (!layout_type)    {      static const GtkTypeInfo layout_info =      {	"GtkLayout",	sizeof (GtkLayout),	sizeof (GtkLayoutClass),	(GtkClassInitFunc) gtk_layout_class_init,	(GtkObjectInitFunc) gtk_layout_init,	(GtkArgSetFunc) NULL,        (GtkArgGetFunc) NULL,      };      layout_type = gtk_type_unique (GTK_TYPE_CONTAINER, &layout_info);    }  return layout_type;}static voidgtk_layout_class_init (GtkLayoutClass *class){  GtkObjectClass *object_class;  GtkWidgetClass *widget_class;  GtkContainerClass *container_class;  object_class = (GtkObjectClass*) class;  widget_class = (GtkWidgetClass*) class;  container_class = (GtkContainerClass*) class;  parent_class = gtk_type_class (GTK_TYPE_CONTAINER);  object_class->finalize = gtk_layout_finalize;  widget_class->realize = gtk_layout_realize;  widget_class->unrealize = gtk_layout_unrealize;  widget_class->map = gtk_layout_map;  widget_class->size_request = gtk_layout_size_request;  widget_class->size_allocate = gtk_layout_size_allocate;  widget_class->draw = gtk_layout_draw;  widget_class->expose_event = gtk_layout_expose;  container_class->remove = gtk_layout_remove;

⌨️ 快捷键说明

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