}
}
+/* Assign a size and position to the child widgets. This differs from the
+ super class method in that for all widgets except the scrollbars the size
+ and position are not caclulated here. This is because these widgets have
+ this function performed for them by the redisplay code (see
+ gtk_map_subwindow()). If the superclass method is called then the widgets
+ can change size and position as the two pieces of code move the widgets at
+ random.
+*/
static void
gtk_xemacs_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
{
GtkXEmacs *x = GTK_XEMACS (widget);
+ GtkFixed *fixed = GTK_FIXED (widget);
struct frame *f = GTK_XEMACS_FRAME (x);
int columns, rows;
-
- parent_class->size_allocate(widget, allocation);
+ GList *children;
+ guint16 border_width;
+
+ widget->allocation = *allocation;
+ if (GTK_WIDGET_REALIZED (widget))
+ gdk_window_move_resize (widget->window,
+ allocation->x,
+ allocation->y,
+ allocation->width,
+ allocation->height);
+
+ border_width = GTK_CONTAINER (fixed)->border_width;
+
+ children = fixed->children;
+ while (children)
+ {
+ GtkFixedChild* child = children->data;
+ children = children->next;
+
+ /*
+ Scrollbars are the only widget that is managed by GTK. See
+ comments in gtk_create_scrollbar_instance().
+ */
+ if (GTK_WIDGET_VISIBLE (child->widget) &&
+ gtk_type_is_a(GTK_OBJECT_TYPE(child->widget), GTK_TYPE_SCROLLBAR))
+ {
+ GtkAllocation child_allocation;
+ GtkRequisition child_requisition;
+
+ gtk_widget_get_child_requisition (child->widget, &child_requisition);
+ child_allocation.x = child->x + border_width;
+ child_allocation.y = child->y + border_width;
+ child_allocation.width = child_requisition.width;
+ child_allocation.height = child_requisition.height;
+ gtk_widget_size_allocate (child->widget, &child_allocation);
+ }
+ }
if (f)
{
{
GtkXEmacs *x = GTK_XEMACS (widget);
struct frame *f = GTK_XEMACS_FRAME (x);
- gtk_redraw_exposed_area (f, area->x, area->y, area->width, area->height);
+
+ if (GTK_WIDGET_DRAWABLE (widget))
+ gtk_redraw_exposed_area (f, area->x, area->y, area->width, area->height);
}
static void
gtk_fixed_paint() directly, which clears the background window,
which causes A LOT of flashing. */
- gtk_xemacs_paint (widget, area);
+ if (GTK_WIDGET_DRAWABLE (widget))
+ {
+ gtk_xemacs_paint (widget, area);
- children = fixed->children;
+ children = fixed->children;
- while (children)
- {
- child = children->data;
- children = children->next;
- /* #### This is what causes the scrollbar flickering!
- Evidently the scrollbars pretty much take care of drawing
- themselves in most cases. Then we come along and tell them
- to redraw again!
-
- But if we just leave it out, then they do not get drawn
- correctly the first time!
-
- Scrollbar flickering has been greatly helped by the
- optimizations in scrollbar-gtk.c /
- gtk_update_scrollbar_instance_status (), so this is not that
- big a deal anymore.
- */
- if (gtk_widget_intersect (child->widget, area, &child_area))
+ while (children)
{
- gtk_widget_draw (child->widget, &child_area);
+ child = children->data;
+ children = children->next;
+ /* #### This is what causes the scrollbar flickering!
+ Evidently the scrollbars pretty much take care of drawing
+ themselves in most cases. Then we come along and tell them
+ to redraw again!
+
+ But if we just leave it out, then they do not get drawn
+ correctly the first time!
+
+ Scrollbar flickering has been greatly helped by the
+ optimizations in scrollbar-gtk.c /
+ gtk_update_scrollbar_instance_status (), so this is not that
+ big a deal anymore.
+ */
+ if (gtk_widget_intersect (child->widget, area, &child_area))
+ {
+ gtk_widget_draw (child->widget, &child_area);
+ }
}
}
}
struct frame *f = GTK_XEMACS_FRAME (x);
GdkRectangle *a = &event->area;
- /* This takes care of drawing the scrollbars, etc */
- parent_class->expose_event (widget, event);
+ if (GTK_WIDGET_DRAWABLE (widget))
+ {
+ /* This takes care of drawing the scrollbars, etc */
+ parent_class->expose_event (widget, event);
+
+ /* Now draw the actual frame data */
+ if (!check_for_ignored_expose (f, a->x, a->y, a->width, a->height) &&
+ !find_matching_subwindow (f, a->x, a->y, a->width, a->height))
+ gtk_redraw_exposed_area (f, a->x, a->y, a->width, a->height);
+ return (TRUE);
+ }
- /* Now draw the actual frame data */
- if (!check_for_ignored_expose (f, a->x, a->y, a->width, a->height) &&
- !find_matching_subwindow (f, a->x, a->y, a->width, a->height))
- gtk_redraw_exposed_area (f, a->x, a->y, a->width, a->height);
- return (TRUE);
+ return FALSE;
}
Lisp_Object