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

📄 gtklayout.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 3 页
字号:
  container_class->forall = gtk_layout_forall;  class->set_scroll_adjustments = gtk_layout_set_adjustments;  widget_class->set_scroll_adjustments_signal =    gtk_signal_new ("set_scroll_adjustments",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkLayoutClass, set_scroll_adjustments),		    gtk_marshal_NONE__POINTER_POINTER,		    GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);}static voidgtk_layout_init (GtkLayout *layout){  layout->children = NULL;  layout->width = 100;  layout->height = 100;  layout->hadjustment = NULL;  layout->vadjustment = NULL;  layout->bin_window = NULL;  layout->configure_serial = 0;  layout->scroll_x = 0;  layout->scroll_y = 0;  layout->visibility = GDK_VISIBILITY_PARTIAL;  layout->freeze_count = 0;}/* Widget methods */static void gtk_layout_realize (GtkWidget *widget){  GList *tmp_list;  GtkLayout *layout;  GdkWindowAttr attributes;  gint attributes_mask;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LAYOUT (widget));  layout = GTK_LAYOUT (widget);  GTK_WIDGET_SET_FLAGS (layout, GTK_REALIZED);  attributes.window_type = GDK_WINDOW_CHILD;  attributes.x = widget->allocation.x;  attributes.y = widget->allocation.y;  attributes.width = widget->allocation.width;  attributes.height = widget->allocation.height;  attributes.wclass = GDK_INPUT_OUTPUT;  attributes.visual = gtk_widget_get_visual (widget);  attributes.colormap = gtk_widget_get_colormap (widget);  attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK;  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;  widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),				   &attributes, attributes_mask);  gdk_window_set_user_data (widget->window, widget);  attributes.x = 0;  attributes.y = 0;  attributes.event_mask = GDK_EXPOSURE_MASK |                           gtk_widget_get_events (widget);  layout->bin_window = gdk_window_new (widget->window,					&attributes, attributes_mask);  gdk_window_set_user_data (layout->bin_window, widget);  widget->style = gtk_style_attach (widget->style, widget->window);  gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);  gtk_style_set_background (widget->style, layout->bin_window, GTK_STATE_NORMAL);  gdk_window_add_filter (widget->window, gtk_layout_main_filter, layout);  gdk_window_add_filter (layout->bin_window, gtk_layout_filter, layout);  /* XXX: If we ever get multiple displays for GTK+, then gravity_works   *      will have to become a widget member. Right now we just   *      keep it as a global   */  gravity_works = gdk_window_set_static_gravities (layout->bin_window, TRUE);  tmp_list = layout->children;  while (tmp_list)    {      GtkLayoutChild *child = tmp_list->data;      tmp_list = tmp_list->next;      gtk_widget_set_parent_window (child->widget, layout->bin_window);    }}static void gtk_layout_map (GtkWidget *widget){  GList *tmp_list;  GtkLayout *layout;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LAYOUT (widget));  layout = GTK_LAYOUT (widget);  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);  tmp_list = layout->children;  while (tmp_list)    {      GtkLayoutChild *child = tmp_list->data;      tmp_list = tmp_list->next;      if (GTK_WIDGET_VISIBLE (child->widget))	{	  if (!GTK_WIDGET_MAPPED (child->widget) && 	      !GTK_WIDGET_IS_OFFSCREEN (child->widget))	    gtk_widget_map (child->widget);	}    }  gdk_window_show (layout->bin_window);  gdk_window_show (widget->window);}static void gtk_layout_unrealize (GtkWidget *widget){  GtkLayout *layout;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LAYOUT (widget));  layout = GTK_LAYOUT (widget);  gdk_window_set_user_data (layout->bin_window, NULL);  gdk_window_destroy (layout->bin_window);  layout->bin_window = NULL;  if (GTK_WIDGET_CLASS (parent_class)->unrealize)    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static void     gtk_layout_size_request (GtkWidget     *widget,			 GtkRequisition *requisition){  GList *tmp_list;  GtkLayout *layout;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LAYOUT (widget));  layout = GTK_LAYOUT (widget);  requisition->width = 0;  requisition->height = 0;  tmp_list = layout->children;  while (tmp_list)    {      GtkLayoutChild *child = tmp_list->data;      GtkRequisition child_requisition;            tmp_list = tmp_list->next;      gtk_widget_size_request (child->widget, &child_requisition);    }}static void     gtk_layout_size_allocate (GtkWidget     *widget,			  GtkAllocation *allocation){  GList *tmp_list;  GtkLayout *layout;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LAYOUT (widget));  widget->allocation = *allocation;    layout = GTK_LAYOUT (widget);  tmp_list = layout->children;  while (tmp_list)    {      GtkLayoutChild *child = tmp_list->data;      tmp_list = tmp_list->next;      gtk_layout_position_child (layout, child);      gtk_layout_allocate_child (layout, child);    }  if (GTK_WIDGET_REALIZED (widget))    {      gdk_window_move_resize (widget->window,			      allocation->x, allocation->y,			      allocation->width, allocation->height);      gdk_window_move_resize (GTK_LAYOUT(widget)->bin_window,			      0, 0,			      allocation->width, allocation->height);    }  layout->hadjustment->page_size = allocation->width;  layout->hadjustment->page_increment = allocation->width / 2;  layout->hadjustment->lower = 0;  layout->hadjustment->upper = layout->width;  gtk_signal_emit_by_name (GTK_OBJECT (layout->hadjustment), "changed");  layout->vadjustment->page_size = allocation->height;  layout->vadjustment->page_increment = allocation->height / 2;  layout->vadjustment->lower = 0;  layout->vadjustment->upper = layout->height;  gtk_signal_emit_by_name (GTK_OBJECT (layout->vadjustment), "changed");}static void gtk_layout_draw (GtkWidget *widget, GdkRectangle *area){  GList *tmp_list;  GtkLayout *layout;  GdkRectangle child_area;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_LAYOUT (widget));  layout = GTK_LAYOUT (widget);  /* We don't have any way of telling themes about this properly,   * so we just assume a background pixmap   */  if (!GTK_WIDGET_APP_PAINTABLE (widget))    gdk_window_clear_area (layout->bin_window,			   area->x, area->y, area->width, area->height);    tmp_list = layout->children;  while (tmp_list)    {      GtkLayoutChild *child = tmp_list->data;      tmp_list = tmp_list->next;      if (gtk_widget_intersect (child->widget, area, &child_area))	gtk_widget_draw (child->widget, &child_area);    }}static gint gtk_layout_expose (GtkWidget *widget, GdkEventExpose *event){  GList *tmp_list;  GtkLayout *layout;  GdkEventExpose child_event;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_LAYOUT (widget), FALSE);  layout = GTK_LAYOUT (widget);  if (event->window != layout->bin_window)    return FALSE;    tmp_list = layout->children;  while (tmp_list)    {      GtkLayoutChild *child = tmp_list->data;      tmp_list = tmp_list->next;      child_event = *event;      if (GTK_WIDGET_DRAWABLE (child->widget) &&	  GTK_WIDGET_NO_WINDOW (child->widget) &&	  gtk_widget_intersect (child->widget, &event->area, &child_event.area))	gtk_widget_event (child->widget, (GdkEvent*) &child_event);    }  return FALSE;}/* Container method */static voidgtk_layout_remove (GtkContainer *container, 		   GtkWidget    *widget){  GList *tmp_list;  GtkLayout *layout;  GtkLayoutChild *child = NULL;    g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_LAYOUT (container));    layout = GTK_LAYOUT (container);  tmp_list = layout->children;  while (tmp_list)    {      child = tmp_list->data;      if (child->widget == widget)	break;      tmp_list = tmp_list->next;    }  if (tmp_list)    {      GTK_PRIVATE_UNSET_FLAG (widget, GTK_IS_OFFSCREEN);      gtk_widget_unparent (widget);      layout->children = g_list_remove_link (layout->children, tmp_list);      g_list_free_1 (tmp_list);      g_free (child);    }}static voidgtk_layout_forall (GtkContainer *container,		   gboolean      include_internals,		   GtkCallback   callback,		   gpointer      callback_data){  GtkLayout *layout;  GtkLayoutChild *child;  GList *tmp_list;  g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_LAYOUT (container));  g_return_if_fail (callback != NULL);  layout = GTK_LAYOUT (container);  tmp_list = layout->children;  while (tmp_list)    {      child = tmp_list->data;      tmp_list = tmp_list->next;      (* callback) (child->widget, callback_data);    }}/* Operations on children */static voidgtk_layout_position_child (GtkLayout      *layout,			   GtkLayoutChild *child){  gint x;  gint y;  x = child->x - layout->xoffset;  y = child->y - layout->yoffset;  if (IS_ONSCREEN (x,y))    {      if (GTK_WIDGET_MAPPED (layout) &&	  GTK_WIDGET_VISIBLE (child->widget))	{	  if (!GTK_WIDGET_MAPPED (child->widget))	    gtk_widget_map (child->widget);	}      if (GTK_WIDGET_IS_OFFSCREEN (child->widget))	GTK_PRIVATE_UNSET_FLAG (child->widget, GTK_IS_OFFSCREEN);    }  else    {      if (!GTK_WIDGET_IS_OFFSCREEN (child->widget))	GTK_PRIVATE_SET_FLAG (child->widget, GTK_IS_OFFSCREEN);      if (GTK_WIDGET_MAPPED (child->widget))	gtk_widget_unmap (child->widget);    }}static voidgtk_layout_allocate_child (GtkLayout      *layout,			   GtkLayoutChild *child){  GtkAllocation allocation;  GtkRequisition requisition;  allocation.x = child->x - layout->xoffset;  allocation.y = child->y - layout->yoffset;  gtk_widget_get_child_requisition (child->widget, &requisition);  allocation.width = requisition.width;  allocation.height = requisition.height;    gtk_widget_size_allocate (child->widget, &allocation);

⌨️ 快捷键说明

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