]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkwidget.c
Removed some GTK_WIDGET_DRAWABLE() tests - we need to update the value
[~andy/gtk] / gtk / gtkwidget.c
index e3ca39afb014cd3b1792f9e51dd6d344c5aa71d7..6bda63275f3f5c3031abab24c40bc0ff8db6b8d5 100644 (file)
@@ -107,6 +107,7 @@ enum {
   ARG_HAS_FOCUS,
   ARG_CAN_DEFAULT,
   ARG_HAS_DEFAULT,
+  ARG_RECEIVES_DEFAULT,
   ARG_COMPOSITE_CHILD,
   ARG_STYLE,
   ARG_EVENTS,
@@ -276,6 +277,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
   gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
   gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
+  gtk_object_add_arg_type ("GtkWidget::receives_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_RECEIVES_DEFAULT);
   gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
   gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
   gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
@@ -573,7 +575,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                    object_class->type,
                    GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_get),
                    gtk_marshal_NONE__POINTER_UINT_UINT,
-                   GTK_TYPE_NONE, 2,
+                   GTK_TYPE_NONE, 3,
                    GTK_TYPE_SELECTION_DATA,
                    GTK_TYPE_UINT,
                    GTK_TYPE_UINT);
@@ -838,6 +840,12 @@ gtk_widget_set_arg (GtkObject   *object,
       if (GTK_VALUE_BOOL (*arg))
        gtk_widget_grab_default (widget);
       break;
+    case ARG_RECEIVES_DEFAULT:
+      if (GTK_VALUE_BOOL (*arg))
+       GTK_WIDGET_SET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
+      else
+       GTK_WIDGET_UNSET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
+      break;
     case ARG_COMPOSITE_CHILD:
       if (GTK_VALUE_BOOL(*arg))
        GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
@@ -940,6 +948,9 @@ gtk_widget_get_arg (GtkObject   *object,
     case ARG_HAS_DEFAULT:
       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
       break;
+    case ARG_RECEIVES_DEFAULT:
+      GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_RECEIVES_DEFAULT (widget) != FALSE);
+      break;
     case ARG_COMPOSITE_CHILD:
       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
       break;
@@ -1797,7 +1808,8 @@ gtk_widget_queue_draw_area (GtkWidget *widget,
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  gtk_widget_queue_draw_data (widget, x, y, width, height, NULL);
+  if (widget->window && gdk_window_is_viewable (widget->window))
+    gtk_widget_queue_draw_data (widget, x, y, width, height, NULL);
 }
 
 void      
@@ -1806,7 +1818,8 @@ gtk_widget_queue_draw (GtkWidget *widget)
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  gtk_widget_queue_draw_data (widget, 0, 0, -1, -1, NULL);
+  if (widget->window && gdk_window_is_viewable (widget->window))
+    gtk_widget_queue_draw_data (widget, 0, 0, -1, -1, NULL);
 }
 
 void      
@@ -1821,6 +1834,9 @@ gtk_widget_queue_clear_area (GtkWidget *widget,
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  if (!(widget->window && gdk_window_is_viewable (widget->window)))
+    return;
+
   /* Find the correct widget */
 
   if (GTK_WIDGET_NO_WINDOW (widget))
@@ -1966,18 +1982,18 @@ gtk_widget_clip_rect (GtkWidget *widget,
       
       if (rect->x < 0)
        {
-         rect->width += rect->x;
+         rect->width = (rect->width > -rect->x) ? rect->width + rect->x : 0;
          rect->x = 0;
        }
       if (rect->y < 0)
        {
-         rect->height += rect->y;
+         rect->height = (rect->height > -rect->y) ? rect->width + rect->y : 0;
          rect->y = 0;
        }
       if (rect->x + rect->width > width)
-       rect->width = width - rect->x;
+       rect->width = (width > rect->x) ? width - rect->x : 0;
       if (rect->y + rect->height > height)
-       rect->height = height - rect->y;
+       rect->height = (height > rect->y) ? height - rect->y : 0;
     }
 
   if (!window)
@@ -2001,7 +2017,7 @@ gtk_widget_clip_rect (GtkWidget *widget,
 }
 
 static gint
-gtk_widget_idle_draw (gpointer data)
+gtk_widget_idle_draw (gpointer cb_data)
 {
   GSList *widget_list;
   GSList *old_queue;
@@ -2035,7 +2051,13 @@ gtk_widget_idle_draw (gpointer data)
       gtk_object_set_data_by_id (GTK_OBJECT (widget),
                                 draw_data_tmp_key_id,
                                 draw_data_list);
-
+     
+      /* XXX: Since we are unsetting this flag here, further
+       * down the only way we can check if a redraw is queued
+       * on a given widget is by calling gtk_object_get_data.
+       * for speed purposes we might well want a private
+       * flag GTK_REDRAW_PROCESSING or something.
+       */
       GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
 
       while (draw_data_list)
@@ -2149,8 +2171,8 @@ gtk_widget_idle_draw (gpointer data)
 
              if (parent)
                parent = parent->parent;
-             
-             if (parent && GTK_WIDGET_REDRAW_PENDING (parent))
+
+             if (parent)
                parent_list = gtk_object_get_data_by_id (GTK_OBJECT (parent),
                                                         draw_data_tmp_key_id);
              else
@@ -2191,7 +2213,8 @@ gtk_widget_idle_draw (gpointer data)
       while (draw_data_list)
        {
          GtkDrawData *data = draw_data_list->data;
-         gtk_widget_draw (widget, &data->rect);
+         if ((data->rect.width != 0) || (data->rect.height != 0))
+           gtk_widget_draw (widget, &data->rect);
          
          if (draw_data_list->next)
            draw_data_list = draw_data_list->next;
@@ -2471,22 +2494,6 @@ gtk_widget_unlock_accelerators (GtkWidget *widget)
     }
 }
 
-void
-gtk_widget_thaw_accelerators (GtkWidget *widget)
-{
-  g_message ("gtk_widget_thaw_accelerators() is deprecated");
-
-  gtk_widget_unlock_accelerators (widget);
-}
-
-void
-gtk_widget_freeze_accelerators (GtkWidget *widget)
-{
-  g_message ("gtk_widget_freeze_accelerators() is deprecated");
-
-  gtk_widget_lock_accelerators (widget);
-}
-
 void
 gtk_widget_add_accelerator (GtkWidget           *widget,
                            const gchar         *accel_signal,
@@ -2712,12 +2719,8 @@ gtk_widget_event (GtkWidget *widget,
       break;
     case GDK_EXPOSE:
       /* there is no sense in providing a widget with bogus expose events.
-       * Widgets that are going to be resized don't need to be
-       * exposed, since they will be redrawn anyways.
        */
-      if (!event->any.window ||
-         GTK_WIDGET_RESIZE_NEEDED (widget) ||
-         (widget->parent && GTK_WIDGET_RESIZE_NEEDED (widget->parent)))
+      if (!event->any.window)
        {
          gtk_widget_unref (widget);
          return TRUE;