Only in gtk+shape/: Makefile
Only in gtk+shape/: Makefile~
Only in gtk+shape/: config.cache
Only in gtk+shape/: config.h
Only in gtk+shape/: config.log
Only in gtk+shape/: config.status
Only in gtk+shape/docs: Makefile
Only in gtk+shape/gdk: Makefile
Only in gtk+shape/gdk: Makefile~
Only in gtk+shape/gdk: _libs
diff -rc gtk+971025/gdk/gdk.h gtk+shape/gdk/gdk.h
*** gtk+971025/gdk/gdk.h	Fri Oct  3 08:15:29 1997
--- gtk+shape/gdk/gdk.h	Mon Oct 27 20:37:44 1997
***************
*** 162,167 ****
--- 162,177 ----
  
  void          gdk_window_set_user_data   (GdkWindow       *window,
  					  gpointer         user_data);
+ 
+ 
+ /* This allows for making shaped (partially transparent) windows
+    - cool feature, needed for Drag and Drag for example.
+    The shape_mask can be the mask
+    from gdk_pixmap_create_from_xpm.   Stefan Wille */
+ void gdk_window_shape_combine_mask (GdkWindow       *window,
+ 				    GdkBitmap       *shape_mask,
+ 				    gint            offset_x,
+ 				    gint            offset_y);
  /* Drag & drop */
  /* Algorithm (drop source):
     A window being dragged will be sent a GDK_DRAG_BEGIN message.
Only in gtk+shape/gdk: gdk.h~
diff -rc gtk+971025/gdk/gdkwindow.c gtk+shape/gdk/gdkwindow.c
*** gtk+971025/gdk/gdkwindow.c	Fri Oct 17 20:44:27 1997
--- gtk+shape/gdk/gdkwindow.c	Mon Oct 27 20:39:27 1997
***************
*** 18,23 ****
--- 18,24 ----
  #include <X11/Xlib.h>
  #include <X11/Xutil.h>
  #include <X11/Xatom.h>
+ #include <X11/extensions/shape.h>
  #include <netinet/in.h>
  #include "gdk.h"
  #include "gdkinput.h"
***************
*** 1151,1156 ****
--- 1152,1186 ----
    if (old_windows)
      XFree (old_windows);
  }
+ 
+ 
+ /* This needs the X11 shape extension.
+    If not available, simply remove the call to
+    XShapeCombineMask. Shaped windows will look
+    ugly, but programs still work.    Stefan Wille
+ */
+ void
+ gdk_window_shape_combine_mask (GdkWindow *window,
+ 			       GdkBitmap *mask,
+ 			       gint x, gint y)
+ {
+   GdkWindowPrivate *window_private;
+   GdkWindowPrivate *pixmap_private;
+ 
+   g_return_if_fail (window != NULL);
+   g_return_if_fail (mask != NULL);
+ 
+   window_private = (GdkWindowPrivate*) window;
+   pixmap_private = (GdkWindowPrivate*) mask;
+ 	
+   XShapeCombineMask  (window_private->xdisplay,
+ 		      window_private->xwindow,
+ 		      ShapeBounding,
+ 		      x, y, /* offset */
+ 		      (Pixmap)pixmap_private->xwindow,
+ 		      ShapeSet);
+ }
+ 
  
  void gdk_dnd_drag_addwindow(GdkWindow *window)
  {
Only in gtk+shape/gdk: gdkwindow.c~
Only in gtk+shape/glib: Makefile
Only in gtk+shape/glib: _libs
Only in gtk+shape/glib: config.log
Only in gtk+shape/glib: config.status
diff -rc gtk+971025/glib/glibconfig.h gtk+shape/glib/glibconfig.h
*** gtk+971025/glib/glibconfig.h	Thu Sep 25 06:13:46 1997
--- gtk+shape/glib/glibconfig.h	Mon Oct 27 20:32:35 1997
***************
*** 44,56 ****
  #define SIZEOF_INT 4
  
  /* The number of bytes in a long.  */
! #define SIZEOF_LONG 8
  
  /* The number of bytes in a short.  */
  #define SIZEOF_SHORT 2
  
  /* The number of bytes in a void *.  */
! #define SIZEOF_VOID_P 8
  
  /* Define if you have the strerror function.  */
  #define HAVE_STRERROR 1
--- 44,56 ----
  #define SIZEOF_INT 4
  
  /* The number of bytes in a long.  */
! #define SIZEOF_LONG 4
  
  /* The number of bytes in a short.  */
  #define SIZEOF_SHORT 2
  
  /* The number of bytes in a void *.  */
! #define SIZEOF_VOID_P 4
  
  /* Define if you have the strerror function.  */
  #define HAVE_STRERROR 1
Only in gtk+shape/glib: libtool
Only in gtk+shape/glib: stamp-h
Only in gtk+shape/gtk: 3DRings.xpm
Only in gtk+shape/gtk: FilesQueue.xpm
Only in gtk+shape/gtk: Makefile
Only in gtk+shape/gtk: Makefile~
Only in gtk+shape/gtk: Modeller.xpm
Only in gtk+shape/gtk: _libs
diff -rc gtk+971025/gtk/gtkwidget.c gtk+shape/gtk/gtkwidget.c
*** gtk+971025/gtk/gtkwidget.c	Fri Oct 17 20:44:27 1997
--- gtk+shape/gtk/gtkwidget.c	Mon Oct 27 20:32:40 1997
***************
*** 152,158 ****
  static GtkWidgetAuxInfo* gtk_widget_aux_info_new     (void);
  static void              gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
  
- 
  static GtkObjectClass *parent_class = NULL;
  static gint widget_signals[LAST_SIGNAL] = { 0 };
  
--- 152,157 ----
***************
*** 174,179 ****
--- 173,179 ----
  static const char *extension_event_key = "extension_event_mode";
  static const char *redraw_handler_key = "redraw_handler_tag";
  static const char *resize_handler_key = "resize_handler_tag";
+ static const char *shape_info_key = "shape_info";
  
  
  
***************
*** 1041,1046 ****
--- 1041,1047 ----
    GtkStyle *new_style;
    gint events;
    GdkExtensionMode mode;
+   GtkWidgetShapeInfo *shape_info;
  
    g_return_if_fail (widget != NULL);
  
***************
*** 1053,1059 ****
  
        if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
  	gtk_widget_realize (widget->parent);
! 
        if (!GTK_WIDGET_USER_STYLE (widget))
  	{
  	  new_style = gtk_rc_get_style (widget);
--- 1054,1060 ----
  
        if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
  	gtk_widget_realize (widget->parent);
!       
        if (!GTK_WIDGET_USER_STYLE (widget))
  	{
  	  new_style = gtk_rc_get_style (widget);
***************
*** 1063,1068 ****
--- 1064,1080 ----
  
        gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
  
+       if (GTK_WIDGET_HAS_SHAPE_MASK(widget))
+ 	{
+  	  shape_info = gtk_object_get_data (GTK_OBJECT (widget),
+ 					    shape_info_key);
+ 	  g_assert (shape_info != 0);
+ 	  gdk_window_shape_combine_mask (widget->window,
+ 					 shape_info->shape_mask,
+ 					 shape_info->offset_x,
+ 					 shape_info->offset_y);
+ 	}
+ 
        if (!GTK_WIDGET_NO_WINDOW (widget))
  	{
  	  mode = gtk_widget_get_extension_events (widget);
***************
*** 1072,1077 ****
--- 1084,1090 ----
  	      gdk_input_set_extension_events (widget->window, events, mode);
  	    }
  	}
+       
      }
  }
  
***************
*** 3210,3215 ****
--- 3223,3267 ----
    g_return_if_fail (aux_info != NULL);
  
    g_mem_chunk_free (aux_info_mem_chunk, aux_info);
+ }
+ 
+ 
+ /* Set a shape for this widgets' gdk window.
+    This allows for transparent windows etc.
+    See gdk_window_shape_combine_mask fore more information. SW
+ */
+ void         gtk_widget_shape_combine_mask   (GtkWidget *widget,
+ 					      GdkBitmap *shape_mask,
+ 					      gint       offset_x,
+ 					      gint       offset_y)
+ {
+   GtkWidgetShapeInfo* shape_info;
+ 
+   g_return_if_fail (widget != NULL);
+   g_return_if_fail (shape_mask != NULL);
+   /* set_shape doesn't work on widgets without gdk window */
+   g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
+ 
+   /* remember shape mask for later gtk_widget_realize's */
+   shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
+   if (!shape_info)
+     {
+       shape_info = g_new (GtkWidgetShapeInfo, 1);
+       gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
+     }
+   shape_info->shape_mask = shape_mask;
+   shape_info->offset_x = offset_x;
+   shape_info->offset_y = offset_y;
+   GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_SHAPE_MASK);
+ 
+ 
+   /* set shape if widget has a gdk window allready.
+      otherwise the shape is scheduled to be set by gtk_widget_realize.
+   */
+   if (widget->window)
+     gdk_window_shape_combine_mask (widget->window, shape_mask,
+ 			  offset_x, offset_y);	
+   
  }
  
  /* When you get a DRAG_ENTER event, you can use this to tell Gtk of
Only in gtk+shape/gtk: gtkwidget.c~
diff -rc gtk+971025/gtk/gtkwidget.h gtk+shape/gtk/gtkwidget.h
*** gtk+971025/gtk/gtkwidget.h	Fri Oct  3 08:15:31 1997
--- gtk+shape/gtk/gtkwidget.h	Mon Oct 27 20:32:40 1997
***************
*** 53,59 ****
    GTK_GRAB_ALL         = 1 << 18,
    GTK_REDRAW_PENDING   = 1 << 19,
    GTK_RESIZE_PENDING   = 1 << 20,
!   GTK_RESIZE_NEEDED    = 1 << 21
  };
  
  
--- 53,60 ----
    GTK_GRAB_ALL         = 1 << 18,
    GTK_REDRAW_PENDING   = 1 << 19,
    GTK_RESIZE_PENDING   = 1 << 20,
!   GTK_RESIZE_NEEDED    = 1 << 21,
!   GTK_HAS_SHAPE_MASK   = 1 << 22
  };
  
  
***************
*** 94,99 ****
--- 95,101 ----
  #define GTK_WIDGET_REDRAW_PENDING(obj)    (GTK_OBJECT_FLAGS (obj) & GTK_REDRAW_PENDING)
  #define GTK_WIDGET_RESIZE_PENDING(obj)    (GTK_OBJECT_FLAGS (obj) & GTK_RESIZE_PENDING)
  #define GTK_WIDGET_RESIZE_NEEDED(obj)     (GTK_OBJECT_FLAGS (obj) & GTK_RESIZE_NEEDED)
+ #define GTK_WIDGET_HAS_SHAPE_MASK(obj)    (GTK_OBJECT_FLAGS (obj) & GTK_HAS_SHAPE_MASK)
  
  #define GTK_TYPE_WIDGET                   (gtk_widget_get_type ())
  
***************
*** 116,121 ****
--- 118,124 ----
  typedef struct _GtkWidget         GtkWidget;
  typedef struct _GtkWidgetClass    GtkWidgetClass;
  typedef struct _GtkWidgetAuxInfo  GtkWidgetAuxInfo;
+ typedef struct _GtkWidgetShapeInfo GtkWidgetShapeInfo;
  
  typedef void (*GtkCallback) (GtkWidget *widget,
  			     gpointer   data);
***************
*** 333,338 ****
--- 336,348 ----
    guint16 height;
  };
  
+ struct _GtkWidgetShapeInfo
+ {
+   gint16     offset_x;
+   gint16     offset_y;
+   GdkBitmap *shape_mask;
+ };
+ 
  
  guint      gtk_widget_get_type            (void);
  GtkWidget* gtk_widget_new                 (guint                type,
***************
*** 443,448 ****
--- 453,464 ----
  GdkColormap* gtk_widget_get_default_colormap (void);
  GdkVisual*   gtk_widget_get_default_visual   (void);
  GtkStyle*    gtk_widget_get_default_style    (void);
+ 
+ /* see gdk_window_shape_combine_mask.. */
+ void         gtk_widget_shape_combine_mask   (GtkWidget *widget,
+ 					      GdkBitmap *shape_mask,
+ 					      gint       offset_x,
+ 					      gint       offset_y);
  
  /* When you get a drag_enter event, you can use this to tell Gtk of other
     items that are to be dragged as well... */
Only in gtk+shape/gtk: gtkwidget.h~
diff -rc gtk+971025/gtk/testgtk.c gtk+shape/gtk/testgtk.c
*** gtk+971025/gtk/testgtk.c	Fri Oct 17 20:44:27 1997
--- gtk+shape/gtk/testgtk.c	Mon Oct 27 21:08:18 1997
***************
*** 18,23 ****
--- 18,25 ----
  #include <stdio.h>
  #include <stdlib.h>
  #include "gtk.h"
+ #include "../gdk/gdk.h"
+ #include "../gdk/gdkx.h"
  
  
  void
***************
*** 1798,1803 ****
--- 1800,1938 ----
      gtk_widget_destroy (window);
  }
  
+ 
+ 
+ /* shapes test   Stefan Wille */
+ 
+ #include "Modeller.xpm"
+ #include "3DRings.xpm"
+ #include "FilesQueue.xpm"
+ 
+ typedef struct _cursoroffset {gint x,y;} CursorOffset;
+ 
+ GdkWindow *root_win;
+ 
+ static void shape_pressed (GtkWidget *widget)
+ {
+   CursorOffset *p;
+ 
+   p = gtk_object_get_user_data(GTK_OBJECT(widget));
+   gtk_widget_get_pointer(widget, &(p->x), &(p->y));
+ 
+   gtk_grab_add (widget);
+   gdk_pointer_grab (widget->window, TRUE,
+ 		    GDK_BUTTON_RELEASE_MASK |
+ 		    GDK_BUTTON_MOTION_MASK,
+ 		    NULL, NULL, 0);
+ }
+ 
+ 
+ static void shape_released (GtkWidget *widget)
+ {
+   gtk_grab_remove (widget);
+   gdk_pointer_ungrab (0);
+ }
+ 
+ static void shape_motion (GtkWidget *widget, GdkEventMotion *event)
+ {
+   gint xp, yp;
+   CursorOffset * p;
+   GdkModifierType mask;
+ 
+   p = gtk_object_get_user_data(GTK_OBJECT(widget));
+ 
+   gdk_window_get_pointer (root_win, &xp, &yp, &mask);
+   gtk_widget_set_uposition (widget, xp  - p->x, yp  - p->y);
+ }
+ 
+ 
+ GtkWidget *shape_create_icon (char **xpm_data,
+ 			      gint x, gint y,
+ 			      gint px, gint py,
+ 			      gint window_type)
+ {
+   GtkWidget *window;
+   GtkWidget *pixmap;
+   GtkWidget *fixed;
+   CursorOffset* icon_pos;
+   GdkGC* gc;
+   GdkBitmap *gdk_pixmap_mask;
+   GdkPixmap *gdk_pixmap;
+   GtkStyle *style;
+ 
+ 
+   style = gtk_widget_get_default_style ();
+   gc = style->black_gc;	
+ 
+   /* GDK_WINDOW_TOPLEVEL works also, giving you a title border. SW */
+   window = gtk_window_new (window_type);
+ 
+   fixed = gtk_fixed_new ();
+   gtk_widget_set_usize (fixed, 100,100);
+   gtk_container_add (GTK_CONTAINER (window), fixed);
+   gtk_widget_show (fixed);
+   
+   gdk_pixmap = gdk_pixmap_create_from_xpm_d (window->window,
+ 					 &gdk_pixmap_mask,
+ 					 &style->bg[GTK_STATE_NORMAL],
+ 					 xpm_data);
+ 	
+   pixmap = gtk_pixmap_new (gdk_pixmap, gdk_pixmap_mask);
+   gtk_fixed_put (GTK_FIXED(fixed), pixmap, px,py);
+   gtk_widget_show (pixmap);
+   
+   gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, px,py);
+ 
+   gtk_widget_set_events
+     (window, gtk_widget_get_events(window) |GDK_BUTTON_MOTION_MASK
+                                            | GDK_BUTTON_PRESS_MASK);
+   gtk_signal_connect (GTK_OBJECT (window), "button_press_event",
+ 		      GTK_SIGNAL_FUNC (shape_pressed),NULL);
+   gtk_signal_connect (GTK_OBJECT (window), "button_release_event",
+ 		      GTK_SIGNAL_FUNC (shape_released),NULL);
+   gtk_signal_connect (GTK_OBJECT (window), "motion_notify_event",
+ 		      GTK_SIGNAL_FUNC (shape_motion),NULL);
+   icon_pos = g_new (CursorOffset, 1);
+   gtk_object_set_user_data(GTK_OBJECT(window), icon_pos);
+ 
+   gtk_widget_set_uposition (window, x, y);
+   gtk_widget_show (window);
+ 
+   return window;
+ }
+ 
+ 
+ GtkWidget *modeller;
+ GtkWidget *sheets;
+ GtkWidget *rings;
+ 
+ 
+ void create_shapes ()
+ {
+   if (modeller)
+     {
+       gtk_widget_destroy (modeller);
+       gtk_widget_destroy (sheets);
+       gtk_widget_destroy (rings);
+       modeller = 0;
+     }
+   else
+     {
+       root_win = gdk_window_foreign_new (GDK_ROOT_WINDOW());
+   
+       modeller = shape_create_icon (InterfaceModeller_app_2_Tile_xpm,
+ 				    440, 140, 0,0, GTK_WINDOW_POPUP);
+       
+       sheets = shape_create_icon (FilesQueue_xpm,
+ 				  580, 170, 0,0, GTK_WINDOW_POPUP);
+       
+       rings = shape_create_icon (DRings_xpm,
+ 				 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
+     }
+ }
+ 
+ 
+ 
  static int progress_timer = 0;
  
  gint
***************
*** 2477,2482 ****
--- 2612,2618 ----
        { "text", create_text },
        { "notebook", create_notebook },
        { "panes", create_panes },
+       { "shapes", create_shapes },
        { "progress bar", create_progress_bar },
        { "preview color", create_color_preview },
        { "preview gray", create_gray_preview },
Only in gtk+shape/gtk: testgtk.c~
Only in gtk+shape/: gtk+.xconfig
Only in gtk+shape/: libtool
Only in gtk+shape/: stamp-h
