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

📄 gtkviewport.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
  bin = GTK_BIN (widget);  viewport = GTK_VIEWPORT (widget);  GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);  attributes.x = widget->allocation.x + border_width;  attributes.y = widget->allocation.y + border_width;  attributes.width = widget->allocation.width - border_width * 2;  attributes.height = widget->allocation.height - border_width * 2;  attributes.window_type = GDK_WINDOW_CHILD;  attributes.wclass = GDK_INPUT_OUTPUT;  attributes.visual = gtk_widget_get_visual (widget);  attributes.colormap = gtk_widget_get_colormap (widget);  event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;  /* We select on button_press_mask so that button 4-5 scrolls are trapped.   */  attributes.event_mask = event_mask | GDK_BUTTON_PRESS_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, viewport);  if (viewport->shadow_type != GTK_SHADOW_NONE)    {      attributes.x = widget->style->klass->xthickness;      attributes.y = widget->style->klass->ythickness;    }  else    {      attributes.x = 0;      attributes.y = 0;    }  attributes.width = MAX (1, (gint)widget->allocation.width - attributes.x * 2 - border_width * 2);  attributes.height = MAX (1, (gint)widget->allocation.height - attributes.y * 2 - border_width * 2);  attributes.event_mask = 0;  viewport->view_window = gdk_window_new (widget->window, &attributes, attributes_mask);  gdk_window_set_user_data (viewport->view_window, viewport);  attributes.x = 0;  attributes.y = 0;  if (bin->child)    {      attributes.width = viewport->hadjustment->upper;      attributes.height = viewport->vadjustment->upper;    }    attributes.event_mask = event_mask;  viewport->bin_window = gdk_window_new (viewport->view_window, &attributes, attributes_mask);  gdk_window_set_user_data (viewport->bin_window, viewport);  if (bin->child)    gtk_widget_set_parent_window (bin->child, viewport->bin_window);  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, viewport->bin_window, GTK_STATE_NORMAL);   gtk_paint_flat_box(widget->style, viewport->bin_window, GTK_STATE_NORMAL,		      GTK_SHADOW_NONE,		      NULL, widget, "viewportbin",		      0, 0, -1, -1);     gdk_window_show (viewport->bin_window);  gdk_window_show (viewport->view_window);}static voidgtk_viewport_unrealize (GtkWidget *widget){  GtkViewport *viewport;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (widget));  viewport = GTK_VIEWPORT (widget);  gdk_window_set_user_data (viewport->view_window, NULL);  gdk_window_destroy (viewport->view_window);  viewport->view_window = NULL;  gdk_window_set_user_data (viewport->bin_window, NULL);  gdk_window_destroy (viewport->bin_window);  viewport->bin_window = NULL;  if (GTK_WIDGET_CLASS (parent_class)->unrealize)    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static voidgtk_viewport_paint (GtkWidget    *widget,		    GdkRectangle *area){  GtkViewport *viewport;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (widget));  g_return_if_fail (area != NULL);  if (GTK_WIDGET_DRAWABLE (widget))    {      viewport = GTK_VIEWPORT (widget);      gtk_draw_shadow (widget->style, widget->window,		       GTK_STATE_NORMAL, viewport->shadow_type,		       0, 0, -1, -1);    }}static voidgtk_viewport_draw (GtkWidget    *widget,		   GdkRectangle *area){  GtkViewport *viewport;  GtkBin *bin;  GdkRectangle tmp_area;  GdkRectangle child_area;  gint border_width;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (widget));  g_return_if_fail (area != NULL);  if (GTK_WIDGET_DRAWABLE (widget))    {      viewport = GTK_VIEWPORT (widget);      bin = GTK_BIN (widget);      border_width = GTK_CONTAINER (widget)->border_width;            tmp_area = *area;      tmp_area.x -= border_width;      tmp_area.y -= border_width;            gtk_viewport_paint (widget, &tmp_area);      tmp_area.x += viewport->hadjustment->value - widget->style->klass->xthickness;      tmp_area.y += viewport->vadjustment->value - widget->style->klass->ythickness;            gtk_paint_flat_box(widget->style, viewport->bin_window, 			 GTK_STATE_NORMAL, GTK_SHADOW_NONE,			 &tmp_area, widget, "viewportbin",			 0, 0, -1, -1);      if (bin->child)	{	  if (gtk_widget_intersect (bin->child, &tmp_area, &child_area))	    gtk_widget_draw (bin->child, &child_area);	}    }}static gintgtk_viewport_expose (GtkWidget      *widget,		     GdkEventExpose *event){  GtkViewport *viewport;  GtkBin *bin;  GdkEventExpose child_event;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_VIEWPORT (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  if (GTK_WIDGET_DRAWABLE (widget))    {      viewport = GTK_VIEWPORT (widget);      bin = GTK_BIN (widget);      if (event->window == widget->window)	gtk_viewport_paint (widget, &event->area);      else if (event->window == viewport->bin_window)	{	  child_event = *event;	  gtk_paint_flat_box(widget->style, viewport->bin_window, 			     GTK_STATE_NORMAL, GTK_SHADOW_NONE,			     &event->area, widget, "viewportbin",			     0, 0, -1, -1);	  	  if ((bin->child != NULL) &&	      GTK_WIDGET_NO_WINDOW (bin->child) &&	      gtk_widget_intersect (bin->child, &event->area, &child_event.area))	    gtk_widget_event (bin->child, (GdkEvent*) &child_event);	}	    }  return FALSE;}static voidgtk_viewport_add (GtkContainer *container,		  GtkWidget    *child){  GtkBin *bin;  g_return_if_fail (container != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (container));  g_return_if_fail (child != NULL);  bin = GTK_BIN (container);  g_return_if_fail (bin->child == NULL);  gtk_widget_set_parent_window (child, GTK_VIEWPORT (bin)->bin_window);  GTK_CONTAINER_CLASS (parent_class)->add (container, child);}static voidgtk_viewport_size_request (GtkWidget      *widget,			   GtkRequisition *requisition){  GtkViewport *viewport;  GtkBin *bin;  GtkRequisition child_requisition;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (widget));  g_return_if_fail (requisition != NULL);  viewport = GTK_VIEWPORT (widget);  bin = GTK_BIN (widget);  requisition->width = (GTK_CONTAINER (widget)->border_width +			GTK_WIDGET (widget)->style->klass->xthickness) * 2 + 5;  requisition->height = (GTK_CONTAINER (widget)->border_width * 2 +			 GTK_WIDGET (widget)->style->klass->ythickness) * 2 + 5;  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))    {      gtk_widget_size_request (bin->child, &child_requisition);      requisition->width += child_requisition.width;      requisition->height += child_requisition.height;    }}static voidgtk_viewport_size_allocate (GtkWidget     *widget,			    GtkAllocation *allocation){  GtkViewport *viewport;  GtkBin *bin;  GtkAllocation child_allocation;  gint hval, vval;  gint border_width;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (widget));  g_return_if_fail (allocation != NULL);  widget->allocation = *allocation;  viewport = GTK_VIEWPORT (widget);  bin = GTK_BIN (widget);  border_width = GTK_CONTAINER (widget)->border_width;  child_allocation.x = 0;  child_allocation.y = 0;  if (viewport->shadow_type != GTK_SHADOW_NONE)    {      child_allocation.x = GTK_WIDGET (viewport)->style->klass->xthickness;      child_allocation.y = GTK_WIDGET (viewport)->style->klass->ythickness;    }  child_allocation.width = MAX (1, allocation->width - child_allocation.x * 2 - border_width * 2);  child_allocation.height = MAX (1, allocation->height - child_allocation.y * 2 - border_width * 2);  if (GTK_WIDGET_REALIZED (widget))    {      gdk_window_move_resize (widget->window,			      allocation->x + border_width,			      allocation->y + border_width,			      allocation->width - border_width * 2,			      allocation->height - border_width * 2);      gdk_window_move_resize (viewport->view_window,			      child_allocation.x,			      child_allocation.y,			      child_allocation.width,			      child_allocation.height);    }  viewport->hadjustment->page_size = child_allocation.width;  viewport->hadjustment->page_increment = viewport->hadjustment->page_size / 2;  viewport->hadjustment->step_increment = 10;  viewport->vadjustment->page_size = child_allocation.height;  viewport->vadjustment->page_increment = viewport->vadjustment->page_size / 2;  viewport->vadjustment->step_increment = 10;  hval = viewport->hadjustment->value;  vval = viewport->vadjustment->value;  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))    {      GtkRequisition child_requisition;      gtk_widget_get_child_requisition (bin->child, &child_requisition);            viewport->hadjustment->lower = 0;      viewport->hadjustment->upper = MAX (child_requisition.width,					  child_allocation.width);      hval = CLAMP (hval, 0,		    viewport->hadjustment->upper -		    viewport->hadjustment->page_size);      viewport->vadjustment->lower = 0;      viewport->vadjustment->upper = MAX (child_requisition.height,					  child_allocation.height);      vval = CLAMP (vval, 0,		    viewport->vadjustment->upper -		    viewport->vadjustment->page_size);    }  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))    {      child_allocation.x = 0;      child_allocation.y = 0;      child_allocation.width = viewport->hadjustment->upper;      child_allocation.height = viewport->vadjustment->upper;      if (!GTK_WIDGET_REALIZED (widget))        gtk_widget_realize (widget);      gdk_window_resize (viewport->bin_window,			 child_allocation.width,			 child_allocation.height);      child_allocation.x = 0;      child_allocation.y = 0;      gtk_widget_size_allocate (bin->child, &child_allocation);    }  gtk_signal_emit_by_name (GTK_OBJECT (viewport->hadjustment), "changed");  gtk_signal_emit_by_name (GTK_OBJECT (viewport->vadjustment), "changed");  if (viewport->hadjustment->value != hval)    {      viewport->hadjustment->value = hval;      gtk_signal_emit_by_name (GTK_OBJECT (viewport->hadjustment), "value_changed");    }  if (viewport->vadjustment->value != vval)    {      viewport->vadjustment->value = vval;      gtk_signal_emit_by_name (GTK_OBJECT (viewport->vadjustment), "value_changed");    }}static voidgtk_viewport_adjustment_changed (GtkAdjustment *adjustment,				 gpointer       data){  GtkViewport *viewport;  g_return_if_fail (adjustment != NULL);  g_return_if_fail (data != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (data));  viewport = GTK_VIEWPORT (data);}static voidgtk_viewport_adjustment_value_changed (GtkAdjustment *adjustment,				       gpointer       data){  GtkViewport *viewport;  GtkBin *bin;  GtkAllocation child_allocation;  gint width, height;  g_return_if_fail (adjustment != NULL);  g_return_if_fail (data != NULL);  g_return_if_fail (GTK_IS_VIEWPORT (data));  viewport = GTK_VIEWPORT (data);  bin = GTK_BIN (data);  if (bin->child && GTK_WIDGET_VISIBLE (bin->child))    {      gdk_window_get_size (viewport->view_window, &width, &height);      child_allocation.x = 0;      child_allocation.y = 0;      if (viewport->hadjustment->lower != (viewport->hadjustment->upper -					   viewport->hadjustment->page_size))	child_allocation.x =  viewport->hadjustment->lower - viewport->hadjustment->value;      if (viewport->vadjustment->lower != (viewport->vadjustment->upper -					   viewport->vadjustment->page_size))	child_allocation.y = viewport->vadjustment->lower - viewport->vadjustment->value;      if (GTK_WIDGET_REALIZED (viewport))	gdk_window_move (viewport->bin_window,			 child_allocation.x,			 child_allocation.y);    }}static voidgtk_viewport_style_set (GtkWidget *widget,			GtkStyle  *previous_style){   GtkViewport *viewport;      if (GTK_WIDGET_REALIZED (widget) &&       !GTK_WIDGET_NO_WINDOW (widget))     {	viewport = GTK_VIEWPORT (widget);		gtk_style_set_background (widget->style, viewport->bin_window, GTK_STATE_NORMAL);	gtk_style_set_background (widget->style, widget->window, widget->state);     }}

⌨️ 快捷键说明

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