changeset 636:f6f887d2c5aa

Add _dw_log() internal logging function Preliminary support for building with GTK+ on Windows with MinGW Deprecate dw_menu_item_set_check(); use dw_menu_item_set_state() Support dw_window_set_text() from groupbox Support transparent bitmaps( GTK+ already did by default)
author mhessling@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 10 Apr 2009 22:55:56 +0000
parents 6cec85b90635
children 9fa3cb5b3290
files Makefile.in config.h.in configure configure.in dwtest.c gtk/dw.c os2/dw.c
diffstat 7 files changed, 251 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.in	Fri Apr 10 10:30:54 2009 +0000
+++ b/Makefile.in	Fri Apr 10 22:55:56 2009 +0000
@@ -7,10 +7,11 @@
 DW_SRC  =	@DW_SRC@
 INCPATH	=	-I.. -I. -I$(srcdir)
 TARGET	=	dw
-SRCS	=	$(srcdir)/$(DW_SRC)/dw.c
-OBJECTS	=	dw.o browser.o
-SRCS2	=	$(srcdir)compat.c $(DW_SRC)rel2abs.c
-OBJECTS2=	compat.o rel2abs.o
+SRCS	=	$(srcdir)/$(DW_SRC)/dw.c $(DW_SRC)rel2abs.c
+BROWSER_OBJECT=@BROWSER_OBJECT@
+OBJECTS	=	dw.o rel2abs.o $(BROWSER_OBJECT)
+SRCS2	=	$(srcdir)compat.c
+OBJECTS2=	compat.o
 TARGET2 =	dwcompat
 VER_MAJ	=	@DW_MAJOR_VERSION@
 VER_MIN	=	@DW_MINOR_VERSION@
--- a/config.h.in	Fri Apr 10 10:30:54 2009 +0000
+++ b/config.h.in	Fri Apr 10 22:55:56 2009 +0000
@@ -38,3 +38,7 @@
 
 /* Define if PIXBUF is available. */
 #undef USE_PIXBUF
+
+/* Define if USING GTK (but not on X11). */
+#undef DW_USE_GTK
+
--- a/configure	Fri Apr 10 10:30:54 2009 +0000
+++ b/configure	Fri Apr 10 22:55:56 2009 +0000
@@ -690,6 +690,7 @@
 SOSUFFIX
 DW_SRC
 DW_DEFINE
+BROWSER_OBJECT
 LIBOBJS
 LTLIBOBJS'
 ac_subst_files=''
@@ -4968,6 +4969,14 @@
 
 
 OPSYSTEM=`uname -s`
+case "OPSYSTEM" in
+   MINGW32*)
+      cat >>confdefs.h <<\_ACEOF
+#define DW_USE_GTK 1
+_ACEOF
+
+   ;;
+esac
 
 if test $OPSYSTEM = "Darwin"; then
    DW_SRC=mac
@@ -6306,9 +6315,11 @@
 
 CFLAGS="$CFLAGS $GTK_CFLAGS $GDK_IMLIB_FLAGS $MOZEMBED_CFLAGS"
 
+BROWSER_OBJECT=""
 if test x"$MOZEMBED_LIBS" != x; then
    SAVE_LIBS="$LIBS"
    LIBS="$RPATH $LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS $MOZEMBED_LIBS"
+   BROWSER_OBJECT="browser.o"
    { echo "$as_me:$LINENO: checking for gtk_moz_embed_new in -lgtkembedmoz" >&5
 echo $ECHO_N "checking for gtk_moz_embed_new in -lgtkembedmoz... $ECHO_C" >&6; }
 if test "${ac_cv_lib_gtkembedmoz_gtk_moz_embed_new+set}" = set; then
@@ -6375,6 +6386,8 @@
 #define USE_GTKMOZEMBED 1
 _ACEOF
 
+else
+  BROWSER_OBJECT=""
 fi
 
    LIBS="$SAVE_LIBS"
@@ -6401,6 +6414,7 @@
 
 
 
+
 ac_config_files="$ac_config_files Makefile dw-config"
 
 cat >confcache <<\_ACEOF
@@ -7097,11 +7111,12 @@
 SOSUFFIX!$SOSUFFIX$ac_delim
 DW_SRC!$DW_SRC$ac_delim
 DW_DEFINE!$DW_DEFINE$ac_delim
+BROWSER_OBJECT!$BROWSER_OBJECT$ac_delim
 LIBOBJS!$LIBOBJS$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 79; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 80; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
--- a/configure.in	Fri Apr 10 10:30:54 2009 +0000
+++ b/configure.in	Fri Apr 10 22:55:56 2009 +0000
@@ -55,6 +55,11 @@
 AC_CHECK_LIB(resolv, gethostbyname, LIBS="$LIBS -lresolv",)
 
 OPSYSTEM=`uname -s`
+case "OPSYSTEM" in
+   MINGW32*)
+      AC_DEFINE(DW_USE_GTK)
+   ;;
+esac
 
 if test $OPSYSTEM = "Darwin"; then
    DW_SRC=mac
@@ -107,10 +112,12 @@
 
 CFLAGS="$CFLAGS $GTK_CFLAGS $GDK_IMLIB_FLAGS $MOZEMBED_CFLAGS"
 
+BROWSER_OBJECT=""
 if test x"$MOZEMBED_LIBS" != x; then
    SAVE_LIBS="$LIBS"
    LIBS="$RPATH $LIBS $GTK_LIBS $PTHREAD_LIBS $GDK_IMLIB_LIBS $MOZEMBED_LIBS"
-   AC_CHECK_LIB(gtkembedmoz,gtk_moz_embed_new,AC_DEFINE(USE_GTKMOZEMBED),)
+   BROWSER_OBJECT="browser.o"
+   AC_CHECK_LIB(gtkembedmoz,gtk_moz_embed_new,AC_DEFINE(USE_GTKMOZEMBED),BROWSER_OBJECT="")
    LIBS="$SAVE_LIBS"
 fi
 
@@ -134,6 +141,7 @@
 
 AC_SUBST(DW_SRC)
 AC_SUBST(DW_DEFINE)
+AC_SUBST(BROWSER_OBJECT)
 
 AC_CONFIG_FILES([
 Makefile
--- a/dwtest.c	Fri Apr 10 10:30:54 2009 +0000
+++ b/dwtest.c	Fri Apr 10 22:55:56 2009 +0000
@@ -489,7 +489,7 @@
    dw_window_set_pos_size(filetoolbarbox, x, y, width, height);
 #else
    dw_window_enable( window);
-   dw_menu_delete_item( changeable_menu, NONCHECKABLE_MENUITEMID );
+   dw_window_destroy( noncheckable_menuitem );
 #endif
    return 0;
 }
@@ -927,7 +927,6 @@
    char **text;
 
    /* create a box to pack into the notebook page */
-// buttonsbox = dw_scrollbox_new(BOXVERT, 2);
    buttonsbox = dw_box_new(BOXVERT, 2);
    dw_box_pack_start( notebookbox5, buttonsbox, 25, 200, TRUE, TRUE, 0);
    dw_window_set_color(buttonsbox, DW_CLR_RED, DW_CLR_RED);
@@ -1174,6 +1173,7 @@
    dw_notebook_pack( notebook, notebookpage7, notebookbox7 );
    dw_notebook_page_set_text( notebook, notebookpage7, "html");
 
+#if 1
    rawhtml = dw_html_new(1001);
    dw_box_pack_start( notebookbox7, rawhtml, 0, 100, TRUE, FALSE, 0);
    dw_html_raw(rawhtml, "<html><body><center><h1>dwtest</h1></center></body></html>");
@@ -1186,7 +1186,7 @@
     * Instead a pure HTML based web page is displayed. MHES 5/4/2008
     */
    dw_html_url(html, "http://www.rexx.org");
-
+#endif
    dw_signal_connect(mainwindow, DW_SIGNAL_DELETE, DW_SIGNAL_FUNC(exit_callback), (void *)mainwindow);
    timerid = dw_timer_connect(2000, DW_SIGNAL_FUNC(timer_callback), 0);
    dw_window_set_size(mainwindow, 640, 520);
--- a/gtk/dw.c	Fri Apr 10 10:30:54 2009 +0000
+++ b/gtk/dw.c	Fri Apr 10 22:55:56 2009 +0000
@@ -7,10 +7,16 @@
  * (C) 2003-2004 Mark Hessling <m.hessling@qut.edu.au>
  * (C) 2002 Nickolay V. Shmyrev <shmyrev@yandex.ru>
  */
+#include "config.h"
 #include "dw.h"
 #include <string.h>
 #include <stdlib.h>
-#include <sys/utsname.h>
+#if !defined(GDK_WINDOWING_WIN32)
+# include <sys/utsname.h>
+# include <sys/socket.h>
+# include <sys/un.h>
+# include <sys/mman.h>
+#endif
 #include <stdarg.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -19,12 +25,8 @@
 #include <dirent.h>
 #include <sys/stat.h>
 #include <signal.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/mman.h>
 #include <fcntl.h>
 #include <unistd.h>
-#include "config.h"
 #include <gdk/gdkkeysyms.h>
 #ifdef USE_IMLIB
 #include <gdk_imlib.h>
@@ -38,6 +40,14 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #endif
 
+#if __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+#  define __func__ __FUNCTION__
+# else
+#  define __func__ "<unknown>"
+# endif
+#endif
+
 #include "gtk/messagebox_error.xpm"
 #include "gtk/messagebox_warning.xpm"
 #include "gtk/messagebox_information.xpm"
@@ -93,6 +103,8 @@
 # define min(a,b)        (((a) < (b)) ? (a) : (b))
 #endif
 
+FILE *dbgfp = NULL;
+
 DWTID _dw_thread_list[DW_THREAD_LIMIT];
 GdkColor _foreground[DW_THREAD_LIMIT];
 GdkColor _background[DW_THREAD_LIMIT];
@@ -305,6 +317,18 @@
 
 static GtkMdiChild *get_child(GtkMdi *mdi, GtkWidget * widget);
 
+static void _dw_log( char *format, ... )
+{
+   va_list args;
+   va_start(args, format);
+   if ( dbgfp != NULL )
+   {
+      vfprintf( dbgfp, format, args );
+      fflush( dbgfp );
+   }
+   va_end(args);
+}
+
 static GtkType gtk_mdi_get_type(void)
 {
    static GType mdi_type = 0;
@@ -1211,6 +1235,7 @@
    SignalHandler work = _get_signal_handler((GtkWidget *)window, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*setfocusfunc)(HWND, void *) = work.func;
@@ -1225,6 +1250,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*buttonfunc)(HWND, int, int, int, void *) = work.func;
@@ -1245,6 +1271,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*buttonfunc)(HWND, int, int, int, void *) = work.func;
@@ -1265,6 +1292,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*motionfunc)(HWND, int, int, int, void *) = work.func;
@@ -1297,6 +1325,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*closefunc)(HWND, void *) = work.func;
@@ -1311,6 +1340,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*keypressfunc)(HWND, char, int, int, void *) = work.func;
@@ -1326,6 +1356,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*genericfunc)(HWND, void *) = work.func;
@@ -1340,11 +1371,13 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window && !_dw_ignore_click)
    {
       int (*activatefunc)(HWND, void *) = work.func;
 
       retval = activatefunc(popup ? popup : work.window, work.data);
+      popup = NULL;
    }
    return retval;
 }
@@ -1354,6 +1387,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*sizefunc)(HWND, int, int, void *) = work.func;
@@ -1368,6 +1402,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       DWExpose exp;
@@ -1388,6 +1423,7 @@
    static int _dw_recursing = 0;
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(_dw_recursing)
       return FALSE;
 
@@ -1431,6 +1467,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       if(event->button == 3)
@@ -1453,6 +1490,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       if(event->button == 3)
@@ -1509,6 +1547,7 @@
    GtkWidget *item, *widget = (GtkWidget *)gtk_tree_selection_get_tree_view(sel);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(widget)
    {
       SignalHandler work = _get_signal_handler(widget, data);
@@ -1536,6 +1575,7 @@
    SignalHandler work = _get_signal_handler((GtkWidget *)widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(!_dw_ignore_expand && work.window)
    {
       int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func;
@@ -1550,6 +1590,7 @@
    GtkWidget *treeroot = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(child), "_dw_tree");
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(treeroot && GTK_IS_TREE(treeroot))
    {
       GtkWidget *lastselect = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(treeroot), "_dw_lastselect");
@@ -1573,6 +1614,7 @@
    SignalHandler work = _get_signal_handler((GtkWidget *)treeitem, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(!_dw_ignore_expand && work.window)
    {
       int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func;
@@ -1587,6 +1629,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       if(event->button == 1 && event->type == GDK_2BUTTON_PRESS)
@@ -1610,6 +1653,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window && event->keyval == VK_RETURN)
    {
       int (*contextfunc)(HWND, char *, void *) = work.func;
@@ -1645,6 +1689,7 @@
    SignalHandler work = _get_signal_handler((GtkWidget *)notebook, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*switchpagefunc)(HWND, unsigned long, void *) = work.func;
@@ -1658,6 +1703,7 @@
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(work.window)
    {
       int (*clickcolumnfunc)(HWND, int, void *) = work.func;
@@ -1672,6 +1718,7 @@
    char *rowdata = gtk_clist_get_row_data(GTK_CLIST(widget), row);
    int (*contextfunc)(HWND, HWND, char *, void *, void *) = work.func;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(!work.window)
       return TRUE;
 
@@ -1701,6 +1748,7 @@
    GtkWidget *spinbutton = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "_dw_spinbutton");
    GtkWidget *scrollbar = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "_dw_scrollbar");
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if (slider)
    {
       SignalHandler work = _get_signal_handler((GtkWidget *)adjustment, data);
@@ -1733,6 +1781,7 @@
 {
    GtkWidget *next = (GtkWidget *)data;
 
+   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
    if(next)
    {
       if(event->keyval == GDK_Return)
@@ -1831,6 +1880,7 @@
 }
 #endif
 
+#if defined(GDK_WINDOWING_X11)
 static void _size_allocate(GtkWindow *window)
 {
   XSizeHints sizehints;
@@ -1849,6 +1899,7 @@
            &sizehints);
   gdk_flush ();
 }
+#endif
 
 /* Find the index of a given thread */
 static int _find_thread_index(DWTID tid)
@@ -1954,6 +2005,7 @@
 {
    int z;
    char *tmp;
+   char *fname;
 
    if(res)
    {
@@ -1991,6 +2043,13 @@
 #ifdef USE_GTKMOZEMBED
    init_mozembed();
 #endif
+   /*
+    * Setup logging/debugging
+    */
+   if ( (fname = getenv( "DWINDOWS_DEBUGFILE" ) ) != NULL )
+   {
+      dbgfp = fopen( fname, "w" );
+   }
 
    return TRUE;
 }
@@ -2974,6 +3033,42 @@
    return tmp;
 }
 
+#ifdef INCOMPLETE
+/*
+ * Create a new scrollable Box to be packed.
+ * Parameters:
+ *       type: Either DW_VERT (vertical) or DW_HORZ (horizontal).
+ *       pad: Number of pixels to pad around the box.
+ * This works fine under GTK+, but is incomplete on other platforms
+ */
+HWND dw_scrollbox_new( int type, int pad )
+{
+   GtkWidget *tmp, *box, *eventbox;
+   int _locked_by_me = FALSE;
+
+   DW_MUTEX_LOCK;
+   tmp = gtk_scrolled_window_new(NULL, NULL);
+   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (tmp), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+
+   box = gtk_table_new(1, 1, FALSE);
+   eventbox = gtk_event_box_new();
+
+   gtk_widget_show(eventbox);
+   gtk_object_set_data(GTK_OBJECT(box), "_dw_eventbox", (gpointer)eventbox);
+   gtk_object_set_data(GTK_OBJECT(box), "_dw_boxtype", GINT_TO_POINTER(type));
+   gtk_object_set_data(GTK_OBJECT(box), "_dw_boxpad", GINT_TO_POINTER(pad));
+   gtk_object_set_data(GTK_OBJECT(tmp), "_dw_boxhandle", (gpointer)box);
+
+   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp),box);
+   gtk_object_set_user_data(GTK_OBJECT(tmp), box);
+   gtk_widget_show(box);
+   gtk_widget_show(tmp);
+
+   DW_MUTEX_UNLOCK;
+   return tmp;
+}
+#endif
+
 /*
  * Create a new Group Box to be packed.
  * Parameters:
@@ -3320,6 +3415,7 @@
  *       menu: The handle the the existing menu.
  *       id: Menuitem id.
  *       check: TRUE for checked FALSE for not checked.
+ * deprecated: use dw_menu_item_set_state()
  */
 void dw_menu_item_set_check(HMENUI menu, unsigned long id, int check)
 {
@@ -3449,7 +3545,14 @@
    int _locked_by_me = FALSE;
 
    DW_MUTEX_LOCK;
+#if GTK_CHECK_VERSION(2,8,0)
+   gdk_display_warp_pointer( gdk_display_get_default(), gdk_screen_get_default(), x, y );
+//   gdk_display_warp_pointer( GDK_DISPLAY(), gdk_screen_get_default(), x, y );
+#else
+# if GDK_WINDOWING_X11
    XWarpPointer(GDK_DISPLAY(), None, GDK_ROOT_WINDOW(), 0,0,0,0, x, y);
+# endif
+#endif
    DW_MUTEX_UNLOCK;
 }
 
@@ -4251,11 +4354,16 @@
    }
    else if(GTK_WIDGET_TOPLEVEL(handle))
       gtk_window_set_title(GTK_WINDOW(handle), text);
-   else if(GTK_IS_FRAME(handle))
-   {
+   else if ( GTK_IS_FRAME(handle) )
+   {
+      /*
+       * This is a groupbox or status_text
+       */
       GtkWidget *tmp = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_label");
-      if(tmp && GTK_IS_LABEL(tmp))
+      if ( tmp && GTK_IS_LABEL(tmp) )
          gtk_label_set_text(GTK_LABEL(tmp), text);
+      else /* assume groupbox */
+         gtk_frame_set_label(GTK_FRAME(handle), text && *text ? text : NULL);
    }
    DW_MUTEX_UNLOCK;
 }
@@ -7253,7 +7361,7 @@
    int _locked_by_me = FALSE;
    int i;
    GdkGC *gc = NULL;
-   GdkPoint *points;
+   GdkPoint *points = NULL;
 
    DW_MUTEX_LOCK;
    if ( handle )
@@ -7487,6 +7595,8 @@
  * Creates a pixmap with given parameters.
  * Parameters:
  *       handle: Window handle the pixmap is associated with.
+ *               or zero to enable this pixmap to be written
+ *               off the screen to reduce flicker
  *       width: Width of the pixmap in pixels.
  *       height: Height of the pixmap in pixels.
  *       depth: Color depth of the pixmap.
@@ -7509,7 +7619,10 @@
 
    DW_MUTEX_LOCK;
    pixmap->handle = handle;
-   pixmap->pixmap = gdk_pixmap_new(handle->window, width, height, depth);
+   if ( handle )
+      pixmap->pixmap = gdk_pixmap_new( handle->window, width, height, depth );
+   else
+      pixmap->pixmap = gdk_pixmap_new( NULL, width, height, depth );
    DW_MUTEX_UNLOCK;
    return pixmap;
 }
@@ -7644,6 +7757,25 @@
 }
 
 /*
+ * Sets the transparent color for a pixmap
+ * Parameters:
+ *       pixmap: Handle to a pixmap returned by
+ *               dw_pixmap_new..
+ *       color:  transparent color
+ * Note: This does nothing on GTK+ as transparency
+ *       is handled automatically
+ */
+void dw_pixmap_set_transparent_color(HPIXMAP pixmap, unsigned long color)
+{
+   int _locked_by_me = FALSE;
+
+   DW_MUTEX_LOCK;
+   pixmap = pixmap;
+   color = color;
+   DW_MUTEX_UNLOCK;
+}
+
+/*
  * Creates a pixmap from internal resource graphic specified by id.
  * Parameters:
  *       handle: Window handle the pixmap is associated with.
@@ -8528,6 +8660,10 @@
  */
 void dw_exit(int exitcode)
 {
+   if ( dbgfp != NULL )
+   {
+      fclose( dbgfp );
+   }
    exit(exitcode);
 }
 
@@ -8699,7 +8835,10 @@
          default_width = -1;
       if ( height == 0 )
          default_height = -1;
+#if defined(GDK_WINDOWING_X11)
+
       _size_allocate(GTK_WINDOW(handle));
+#endif
       if(handle->window)
          gdk_window_resize(handle->window, default_width , default_height );
       gtk_window_set_default_size(GTK_WINDOW(handle), default_width , default_height );
@@ -8763,7 +8902,7 @@
  *          x: X location from the bottom left.
  *          y: Y location from the bottom left.
  */
-void dw_window_set_pos(HWND handle, unsigned long x, unsigned long y)
+void dw_window_set_pos(HWND handle, long x, long y)
 {
    int _locked_by_me = FALSE;
 #if GTK_MAJOR_VERSION > 1
@@ -8794,7 +8933,7 @@
  *          width: Width of the widget.
  *          height: Height of the widget.
  */
-void dw_window_set_pos_size(HWND handle, unsigned long x, unsigned long y, unsigned long width, unsigned long height)
+void dw_window_set_pos_size(HWND handle, long x, long y, unsigned long width, unsigned long height)
 {
    int _locked_by_me = FALSE;
 #if GTK_MAJOR_VERSION > 1
@@ -8803,7 +8942,6 @@
 
    if(!handle)
       return;
-
    DW_MUTEX_LOCK;
 #if GTK_MAJOR_VERSION > 1
    if((mdi = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_mdi")) && GTK_IS_MDI(mdi))
@@ -8836,7 +8974,7 @@
  *          width: Width of the widget.
  *          height: Height of the widget.
  */
-void dw_window_get_pos_size(HWND handle, ULONG *x, ULONG *y, ULONG *width, ULONG *height)
+void dw_window_get_pos_size(HWND handle, long *x, long *y, ULONG *width, ULONG *height)
 {
    int _locked_by_me = FALSE;
    gint gx, gy, gwidth, gheight, gdepth;
@@ -9227,6 +9365,9 @@
    GtkWidget *handle2 = handle;
    int _locked_by_me = FALSE;
 
+   if ( count == 0 )
+      return;
+
    DW_MUTEX_LOCK;
    if(GTK_IS_SCROLLED_WINDOW(handle))
    {
--- a/os2/dw.c	Fri Apr 10 10:30:54 2009 +0000
+++ b/os2/dw.c	Fri Apr 10 22:55:56 2009 +0000
@@ -7681,6 +7681,65 @@
 		WinReleasePS(hps);
 }
 
+/* Draw a polygon on a window (preferably a render window).
+ * Parameters:
+ *       handle: Handle to the window.
+ *       pixmap: Handle to the pixmap. (choose only one of these)
+ *       fill: Fill box TRUE or FALSE.
+ *       x: X coordinate.
+ *       y: Y coordinate.
+ *       width: Width of rectangle.
+ *       height: Height of rectangle.
+ */
+void API dw_draw_polygon( HWND handle, HPIXMAP pixmap, int fill, int npoints, int *x, int *y )
+{
+   HPS hps;
+   int thisheight;
+   POINTL *ptl[2];
+   POINTL start;
+
+   if(handle)
+   {
+      hps = _set_colors(handle);
+        thisheight = _get_height(handle);
+   }
+   else if(pixmap)
+   {
+      hps = _set_hps(pixmap->hps);
+      thisheight = pixmap->height;
+   }
+   else
+      return;
+   /*
+    * For a filled polygon we need to start an area
+    */
+   if ( fill )
+      GpiBeginArea( hps, 0L );
+   if ( npoints )
+   {
+      /*
+       * Move to the first point of the polygon
+       */
+      start.x = x[0];
+      start.y = y[0];
+      GpiMove( hps, &start );
+      /*
+       * Convert the remainder of the x and y points
+       */
+      for ( i = 1; i < npoints; i++ )
+      {
+         ptl[i-1].x = x[i];
+         ptl[i-1].y = y[i];
+      }
+      GpiPolyLine( hps, npoints-1, &ptl );
+
+      if ( fill )
+         GpiEndArea( hps );
+   }
+   if ( !pixmap )
+      WinReleasePS(hps);
+}
+
 /* Draw a rectangle on a window (preferably a render window).
  * Parameters:
  *       handle: Handle to the window.