diff gtk/dw.c @ 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 87db549e79bc
children 06be879f5137
line wrap: on
line diff
--- 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))
    {