Example #1
0
static void
addkeywords_to_list(GtkWidget* widget, LPCSTR attrs, TGENSETUP *gensetup_t)
{
  char *curr, *cour;
  char *data[2];

  if (!GTK_IS_CLIST (widget))
    return;
  gtk_clist_clear (GTK_CLIST (widget));

  for (curr = (LPSTR) attrs; *curr; curr += (STRLEN (curr) + 1))
    {
      if (!strncasecmp (curr, "DSN=", STRLEN ("DSN=")) ||
	  !strncasecmp (curr, "Driver=", STRLEN ("Driver=")) ||
	  !strncasecmp (curr, "Description=", STRLEN ("Description=")))
	continue;

      if ((cour = strchr (curr, '=')))
	{
	  *cour = '\0';
	  data[0] = curr;
	  data[1] = cour + 1;
	  gtk_clist_append (GTK_CLIST (widget), data);
	  *cour = '=';
	}
      else
	{
	  data[0] = "";
	  gtk_clist_append (GTK_CLIST (widget), data);
	}
    }

  if (GTK_CLIST (widget)->rows > 0)
    gtk_clist_sort (GTK_CLIST (widget));
}
Example #2
0
File: gat.c Project: piki/gat
/** Called whenever the user clicks on any CList object.  It's a
 *  dispatcher -- it calls the function passed to it as 'd' if the click
 *  was a double-click.
 *    @param clist The widget clicked upon.
 *    @param row The row clicked (ignored).
 *    @param column The column clicked (ignored).
 *    @param ev Event information (ignored).
 *    @param d A pointer to the function to be called, if this was a
 *    double-click event.
 */
void clist_select_row_callback(GtkWidget *clist, int row, int column,
  GdkEventButton *ev, gpointer d) {
  g_return_if_fail(GTK_IS_CLIST(clist));
  if (ev)
    switch (ev->type) {
      case GDK_2BUTTON_PRESS:
        ((double_click_callback_t)d)(clist);
        break;
      default: ;
    }
}
void cl_draw_treeview_header (GtkStyle *style, GdkWindow *window,
                              GtkStateType state_type, GtkShadowType shadow_type,
                              GdkRectangle *area,
                              GtkWidget *widget, const gchar *detail,
                              gint x, gint y, gint width, gint height)
{
	ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style);
	gint columns = 0, column_index = -1, fill_width = width;
	gboolean is_etree = strcmp("ETree", G_OBJECT_TYPE_NAME(widget->parent)) == 0;
	gboolean resizable = TRUE;
	
	GdkGC *bottom = clearlooks_style->shade_gc[5];
		
	if ( width < 2 || height < 2 )
		return;
	
	if (GTK_IS_TREE_VIEW (widget->parent))
	{
		gtk_treeview_get_header_index (GTK_TREE_VIEW(widget->parent),
	                                   widget, &column_index, &columns,
	                                   &resizable);
	}
	else if (GTK_IS_CLIST (widget->parent))
	{
		gtk_clist_get_header_index (GTK_CLIST(widget->parent),
		                            widget, &column_index, &columns);
	}
	
	if (area)
	{
		gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], area);
		gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], area);
		gdk_gc_set_clip_rectangle (style->bg_gc[state_type], area);			
		gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], area);
	}
	
	if (state_type != GTK_STATE_NORMAL)
		fill_width-=2;
	
	gdk_draw_rectangle (window, style->bg_gc[state_type], TRUE, x, y, fill_width, height-(height/3)+1);
	
	draw_hgradient (window, style->bg_gc[state_type], style,
	                x, 1+y+height-(height/3), fill_width, height/3,
	                &style->bg[state_type], &clearlooks_style->inset_dark[state_type]);

	if (resizable || (column_index != columns-1))
	{
		gdk_draw_line (window, clearlooks_style->shade_gc[4], x+width-2, y+4, x+width-2, y+height-5); 
		gdk_draw_line (window, clearlooks_style->shade_gc[0], x+width-1, y+4, x+width-1, y+height-5); 
	}
	
	/* left light line */
	if (column_index == 0)
		gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y+1, x, y+height-2);
		
	/* top light line */
	gdk_draw_line (window, clearlooks_style->shade_gc[0], x, y, x+width-1, y);
	
	/* bottom dark line */
	if (state_type == GTK_STATE_INSENSITIVE)
		bottom = clearlooks_style->shade_gc[3];
	
	
	gdk_draw_line (window, bottom, x, y+height-1, x+width-1, y+height-1);
	
	if (area)
	{
		gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[0], NULL);
		gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[4], NULL);
		gdk_gc_set_clip_rectangle (style->bg_gc[state_type], NULL);
		gdk_gc_set_clip_rectangle (clearlooks_style->shade_gc[5], NULL);
	}		
}
gboolean
pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer)
{
  GtkWidget *event_widget;
  static guint32 button_click_time = 0;
  static GdkWindow *button_window = NULL;
  static guint button_number = -1;
  static jint click_count = 1;

  /* If it is not a focus change event, the widget must be realized already.
     If not, ignore the event (Gtk+ will do the same). */
  if (!(event->type == GDK_FOCUS_CHANGE || GTK_WIDGET_REALIZED(widget)))
    return FALSE;
    
  /* Do not handle propagated events.  AWT has its own propagation rules */
  gdk_window_get_user_data (event->any.window, (void **) &event_widget);
  if (event_widget != widget)
    return FALSE;

  /* We only care about input events */    
  if (!(event->type == GDK_BUTTON_PRESS
       || event->type == GDK_BUTTON_RELEASE
       || event->type == GDK_ENTER_NOTIFY
       || event->type == GDK_LEAVE_NOTIFY
       || event->type == GDK_CONFIGURE
       || event->type == GDK_EXPOSE
       || event->type == GDK_KEY_PRESS
       || event->type == GDK_KEY_RELEASE
       || event->type == GDK_FOCUS_CHANGE
       || event->type == GDK_MOTION_NOTIFY))
    {
      return FALSE;
    }
  /* g_print("event %u widget %s peer %p\n",
            event->type, gtk_widget_get_name (widget), peer); */

  /* If it has no jobject associated we can send no AWT event */
  if (!peer)
    return FALSE;

  /* for all input events, which have a window with a jobject attached,
     send the AWT input event corresponding to the Gtk event off to Java  */

  /* keep track of clickCount ourselves, since the AWT allows more
     than a triple click to occur */
  if (event->type == GDK_BUTTON_PRESS)
    {
      if ((event->button.time < (button_click_time + MULTI_CLICK_TIME))
	  && (event->button.window == button_window)
	  && (event->button.button == button_number))
	click_count++;
      else
	click_count = 1;
      
      button_click_time = event->button.time;
      button_window = event->button.window;
      button_number = event->button.button;
    }

  switch (event->type)
    {
    case GDK_BUTTON_PRESS:
      (*gdk_env)->CallVoidMethod (gdk_env, peer,
                                  postMouseEventID,
				  AWT_MOUSE_PRESSED, 
				  (jlong)event->button.time,
				  state_to_awt_mods (event->button.state) |
				  button_to_awt_mods (event->button.button), 
				  (jint)event->button.x,
				  (jint)event->button.y, 
				  click_count, 
				  (event->button.button == 3) ? JNI_TRUE :
				                                JNI_FALSE);
      break;
    case GDK_BUTTON_RELEASE:
      {
	int width, height;

	(*gdk_env)->CallVoidMethod (gdk_env, peer,
				    postMouseEventID,
				    AWT_MOUSE_RELEASED, 
				    (jlong)event->button.time,
				    state_to_awt_mods (event->button.state) |
				    button_to_awt_mods (event->button.button), 
				    (jint)event->button.x,
				    (jint)event->button.y, 
				    click_count,
				    JNI_FALSE);

	/* check to see if the release occured in the window it was pressed
	   in, and if so, generate an AWT click event */
	gdk_window_get_size (event->any.window, &width, &height);
	if (event->button.x >= 0
            && event->button.y >= 0
	    && event->button.x <= width 
	    && event->button.y <= height)
          {
	    (*gdk_env)->CallVoidMethod (gdk_env, peer,
				        postMouseEventID,
				        AWT_MOUSE_CLICKED, 
				        (jlong)event->button.time,
				        state_to_awt_mods (event->button.state) |
				        button_to_awt_mods (event->button.button), 
				        (jint)event->button.x,
				        (jint)event->button.y, 
				        click_count,
				        JNI_FALSE);
          }
      }
      break;
    case GDK_MOTION_NOTIFY:
      (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
				  AWT_MOUSE_MOVED,
				  (jlong)event->motion.time,
				  state_to_awt_mods (event->motion.state),
				  (jint)event->motion.x,
				  (jint)event->motion.y,
				  0,
				  JNI_FALSE);

      if (event->motion.state & (GDK_BUTTON1_MASK
				 | GDK_BUTTON2_MASK
				 | GDK_BUTTON3_MASK
				 | GDK_BUTTON4_MASK
				 | GDK_BUTTON5_MASK))
	{
	  (*gdk_env)->CallVoidMethod (gdk_env, peer,
			              postMouseEventID,
				      AWT_MOUSE_DRAGGED,
				      (jlong)event->motion.time,
				      state_to_awt_mods (event->motion.state),
				      (jint)event->motion.x,
				      (jint)event->motion.y,
				      0,
				      JNI_FALSE);
	}
      break;
    case GDK_ENTER_NOTIFY:
      (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
				  AWT_MOUSE_ENTERED, 
				  (jlong)event->crossing.time,
				  state_to_awt_mods (event->crossing.state), 
				  (jint)event->crossing.x,
				  (jint)event->crossing.y, 
				  0,
				  JNI_FALSE);
      break;
    case GDK_LEAVE_NOTIFY:
      if (event->crossing.mode == GDK_CROSSING_NORMAL)
	(*gdk_env)->CallVoidMethod (gdk_env, peer,
				    postMouseEventID,
				    AWT_MOUSE_EXITED, 
				    (jlong)event->crossing.time,
				    state_to_awt_mods (event->crossing.state),
				    (jint)event->crossing.x,
				    (jint)event->crossing.y, 
				    0,
				    JNI_FALSE);
      break;
    case GDK_CONFIGURE:
      {
	/* GtkWidget *widget;

	gdk_window_get_user_data (event->any.window, (void **) &widget); */
	    
	if (widget && GTK_WIDGET_TOPLEVEL (widget))
	  {
	    /* Configure events are not posted to the AWT event
	       queue, and as such, the gdk/gtk peer functions will
	       be called back before postConfigureEvent
	       returns. */
	    gdk_threads_leave ();

 	    (*gdk_env)->CallVoidMethod (gdk_env, peer,
					postConfigureEventID,
					(jint) event->configure.x,
					(jint) event->configure.y,
					(jint) event->configure.width,
					(jint) event->configure.height);
	    gdk_threads_enter ();
	  }
      }
      break;
    case GDK_EXPOSE:
      {
	(*gdk_env)->CallVoidMethod (gdk_env, peer,
				    postExposeEventID,
				    (jint)event->expose.area.x,
				    (jint)event->expose.area.y,
				    (jint)event->expose.area.width,
				    (jint)event->expose.area.height);
      }
      break;
    case GDK_FOCUS_CHANGE:
      (*gdk_env)->CallVoidMethod (gdk_env, peer,
				  postFocusEventID,
				  (jint) (event->focus_change.in) ? 
				  AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
				  JNI_FALSE);
      break;
    case GDK_KEY_PRESS:
    case GDK_KEY_RELEASE:
      {
        GdkWindow *obj_window;
        jobject *focus_obj_ptr = NULL;
	int generates_key_typed = 0;

        /* A widget with a grab will get key events */
	if (!GTK_IS_WINDOW (widget))
	  focus_obj_ptr = &peer;
	else
	  {
            GtkWindow *window;

            /* Check if we have an enabled focused widget in this window.
	       If not don't handle the event. */
	    window = GTK_WINDOW (widget);
	    if (!window->focus_widget
	        || !GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
	        || !window->focus_widget->window)
	      return FALSE;
	
            /* TextArea peers are attached to the scrolled window
               that contains the GtkTextView, not to the text view
               itself.  Same for List. */
            if (GTK_IS_TEXT_VIEW (window->focus_widget)
                || GTK_IS_CLIST (window->focus_widget))
              {
                obj_window = gtk_widget_get_parent (window->focus_widget)->window;
              }
            else if (GTK_IS_BUTTON (window->focus_widget))
	      /* GtkButton events go to the "event_window" and this is what
	         we registered when the button was created. */
              obj_window = GTK_BUTTON (window->focus_widget)->event_window;
            else
              obj_window = window->focus_widget->window;

            gdk_property_get (obj_window,
                              gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
                              gdk_atom_intern ("CARDINAL", FALSE),
                              0,
                              sizeof (jobject),
                              FALSE,
                              NULL,
                              NULL,
                              NULL,
                              (guchar **)&focus_obj_ptr);

            /* If the window has no jobject attached we can't send anything */
	    if (!focus_obj_ptr)
	      return FALSE;
	      
	    /* Should we generate an AWT_KEY_TYPED event? */
	    generates_key_typed = generates_key_typed_event (event, window->focus_widget);
	  }	

	if (event->type == GDK_KEY_PRESS)	
	  {
            (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
				        postKeyEventID,
				        (jint) AWT_KEY_PRESSED,
				        (jlong) event->key.time,
                                        keyevent_state_to_awt_mods (event),
                                        keysym_to_awt_keycode (event),
                                        keyevent_to_awt_keychar (event),
                                        keysym_to_awt_keylocation (event));

            if (generates_key_typed)
              {
                (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
                                            postKeyEventID,
                                            (jint) AWT_KEY_TYPED,
                                            (jlong) event->key.time,
                                            state_to_awt_mods (event->key.state),
                                            VK_UNDEFINED,
                                            keyevent_to_awt_keychar (event),
                                            AWT_KEY_LOCATION_UNKNOWN);
              }
          }
	else /* GDK_KEY_RELEASE */
          {
	    (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
				        postKeyEventID,
				        (jint) AWT_KEY_RELEASED,
				        (jlong) event->key.time,
			                keyevent_state_to_awt_mods (event),
			                keysym_to_awt_keycode (event),
                                        keyevent_to_awt_keychar (event),
                                        keysym_to_awt_keylocation (event));
	  }
      }
      break;
    default:
      break;
    }
  
  return FALSE;
}
Example #5
0
void
addtranslators_to_list (GtkWidget *widget, GtkWidget *dlg)
{
  char *curr, *buffer = (char *) malloc (sizeof (char) * 65536), *szDriver;
  char driver[1024], _date[1024], _size[1024];
  char *data[4];
  int len, i;
  BOOL careabout;
  UWORD confMode = ODBC_USER_DSN;
  struct stat _stat;

  if (!buffer || !GTK_IS_CLIST (widget))
    return;
  gtk_clist_clear (GTK_CLIST (widget));

  /* Get the current config mode */
  while (confMode != ODBC_SYSTEM_DSN + 1)
    {
      /* Get the list of drivers in the user context */
      SQLSetConfigMode (confMode);
#ifdef WIN32
      len =
	  SQLGetPrivateProfileString ("ODBC 32 bit Translators",
	  NULL, "", buffer, 65535, "odbcinst.ini");
#else
      len =
	  SQLGetPrivateProfileString ("ODBC Translators",
	  NULL, "", buffer, 65535, "odbcinst.ini");
#endif
      if (len)
	goto process;

      goto end;

    process:
      for (curr = buffer; *curr; curr += (STRLEN (curr) + 1))
	{
	  /* Shadowing system odbcinst.ini */
	  for (i = 0, careabout = TRUE; i < GTK_CLIST (widget)->rows; i++)
	    {
	      gtk_clist_get_text (GTK_CLIST (widget), i, 0, &szDriver);
	      if (!strcmp (szDriver, curr))
		{
		  careabout = FALSE;
		  break;
		}
	    }

	  if (!careabout)
	    continue;

	  SQLSetConfigMode (confMode);
#ifdef WIN32
	  SQLGetPrivateProfileString ("ODBC 32 bit Translators",
	      curr, "", driver, sizeof (driver), "odbcinst.ini");
#else
	  SQLGetPrivateProfileString ("ODBC Translators",
	      curr, "", driver, sizeof (driver), "odbcinst.ini");
#endif

	  /* Check if the driver is installed */
	  if (strcasecmp (driver, "Installed"))
	    goto end;

	  /* Get the driver library name */
	  SQLSetConfigMode (confMode);
	  if (!SQLGetPrivateProfileString (curr,
		  "Translator", "", driver, sizeof (driver), "odbcinst.ini"))
	    {
	      SQLSetConfigMode (confMode);
	      SQLGetPrivateProfileString ("Default",
		  "Translator", "", driver, sizeof (driver), "odbcinst.ini");
	    }

	  if (STRLEN (curr) && STRLEN (driver))
	    {
	      data[0] = curr;
	      data[1] = driver;

	      /* Get some information about the driver */
	      if (!stat (driver, &_stat))
		{
		  sprintf (_size, "%lu Kb",
		      (unsigned long) _stat.st_size / 1024L);
		  sprintf (_date, "%s", ctime (&_stat.st_mtime));
		  data[2] = _date;
		  data[3] = _size;
		  gtk_clist_append (GTK_CLIST (widget), data);
		}
	    }
	}

    end:
      if (confMode == ODBC_USER_DSN)
	confMode = ODBC_SYSTEM_DSN;
      else
	confMode = ODBC_SYSTEM_DSN + 1;
    }

  if (GTK_CLIST (widget)->rows > 0)
    {
      gtk_clist_columns_autosize (GTK_CLIST (widget));
      gtk_clist_sort (GTK_CLIST (widget));
    }

  /* Make the clean up */
  free (buffer);
}
Example #6
0
void
adddrivers_to_list (GtkWidget *widget, GtkWidget *dlg)
{
  SQLCHAR drvdesc[1024], drvattrs[1024], driver[1024], size[64];
  SQLCHAR *data[4];
  void *handle;
  struct stat _stat;
  SQLSMALLINT len, len1;
  SQLRETURN ret;
  HENV henv, drv_henv;
  HDBC drv_hdbc;
  pSQLGetInfoFunc funcHdl;
  pSQLAllocHandle allocHdl;
  pSQLAllocEnv allocEnvHdl = NULL;
  pSQLAllocConnect allocConnectHdl = NULL;
  pSQLFreeHandle freeHdl;
  pSQLFreeEnv freeEnvHdl;
  pSQLFreeConnect freeConnectHdl;

  if (!GTK_IS_CLIST (widget))
    return;
  gtk_clist_clear (GTK_CLIST (widget));

  /* Create a HENV to get the list of drivers then */
  ret = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
    {
      _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE);
      goto end;
    }

  /* Set the version ODBC API to use */
  SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3,
      SQL_IS_INTEGER);

  /* Get the list of drivers */
  ret =
      SQLDrivers (henv, SQL_FETCH_FIRST, drvdesc,
      sizeof (drvdesc) / sizeof (SQLTCHAR), &len, drvattrs,
      sizeof (drvattrs) / sizeof (SQLTCHAR), &len1);
  if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO
      && ret != SQL_NO_DATA)
    {
      _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE, SQL_NULL_HANDLE);
      goto error;
    }

  while (ret != SQL_NO_DATA)
    {
      data[0] = drvdesc;

      /* Get the driver library name */
      SQLSetConfigMode (ODBC_BOTH_DSN);
      SQLGetPrivateProfileString (drvdesc, "Driver", "", driver,
	  sizeof (driver) / sizeof (SQLTCHAR), "odbcinst.ini");
      if (driver[0] == '\0')
	SQLGetPrivateProfileString ("Default", "Driver", "", driver,
	    sizeof (driver) / sizeof (SQLTCHAR), "odbcinst.ini");
      if (driver[0] == '\0')
	{
	  data[0] = NULL;
	  goto skip;
	}

      data[1] = driver;

      drv_hdbc = NULL;
      drv_henv = NULL;

      if ((handle = (void *) DLL_OPEN (driver)) != NULL)
	{
	  if ((allocHdl =
		  (pSQLAllocHandle) DLL_PROC (handle,
		      "SQLAllocHandle")) != NULL)
	    {
	      ret = allocHdl (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &drv_henv);
	      if (ret == SQL_ERROR)
		goto nodriverver;
	      ret = allocHdl (SQL_HANDLE_DBC, drv_henv, &drv_hdbc);
	      if (ret == SQL_ERROR)
		goto nodriverver;
	    }
	  else
	    {
	      if ((allocEnvHdl =
		      (pSQLAllocEnv) DLL_PROC (handle,
			  "SQLAllocEnv")) != NULL)
		{
		  ret = allocEnvHdl (&drv_henv);
		  if (ret == SQL_ERROR)
		    goto nodriverver;
		}
	      else
		goto nodriverver;

	      if ((allocConnectHdl =
		      (pSQLAllocConnect) DLL_PROC (handle,
			  "SQLAllocConnect")) != NULL)
		{
		  ret = allocConnectHdl (drv_henv, &drv_hdbc);
		  if (ret == SQL_ERROR)
		    goto nodriverver;
		}
	      else
		goto nodriverver;
	    }

	  if ((funcHdl =
		  (pSQLGetInfoFunc) DLL_PROC (handle, "SQLGetInfo")) != NULL)
	    {
	      /* Retrieve some information */
	      ret =
		  funcHdl (drv_hdbc, SQL_DRIVER_VER, drvattrs,
		  sizeof (drvattrs), &len);
	      if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
		{
		  unsigned int z;
		  /* Drop the description if one provided */
		  for (z = 0; ((char *) drvattrs)[z]; z++)
		    if (((char *) drvattrs)[z] == ' ')
		      ((char *) drvattrs)[z] = '\0';
		  data[2] = drvattrs;
		}
	      else
		goto nodriverver;
	    }
	  else
	    goto nodriverver;
	}
      else
	{
	nodriverver:
	  data[2] = "##.##";
	}

      if (drv_hdbc || drv_henv)
	{
	  if (allocConnectHdl &&
	      (freeConnectHdl =
		  (pSQLFreeConnect) DLL_PROC (handle,
		      "SQLFreeConnect")) != NULL)
	    {
	      freeConnectHdl (drv_hdbc);
	      drv_hdbc = NULL;
	    }

	  if (allocEnvHdl &&
	      (freeEnvHdl =
		  (pSQLFreeEnv) DLL_PROC (handle, "SQLFreeEnv")) != NULL)
	    {
	      freeEnvHdl (drv_henv);
	      drv_henv = NULL;
	    }
	}

      if ((drv_hdbc || drv_henv) &&
	  (freeHdl =
	      (pSQLFreeHandle) DLL_PROC (handle, "SQLFreeHandle")) != NULL)
	{
	  if (drv_hdbc)
	    freeHdl (SQL_HANDLE_DBC, drv_hdbc);
	  if (drv_henv)
	    freeHdl (SQL_HANDLE_ENV, drv_henv);
	}

      if (handle)
        DLL_CLOSE (handle);

      /* Get the size of the driver */
      if (!stat (driver, &_stat))
	{
	  sprintf (size, "%d Kb", (int) (_stat.st_size / 1024));
	  data[3] = size;
	}
      else
	data[3] = "-";

      gtk_clist_append (GTK_CLIST (widget), data);

    skip:
      ret = SQLDrivers (henv, SQL_FETCH_NEXT, drvdesc,
	  sizeof (drvdesc) / sizeof (SQLTCHAR), &len, drvattrs,
	  sizeof (drvattrs) / sizeof (SQLTCHAR), &len1);
      if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO
	  && ret != SQL_NO_DATA)
	{
	  _iodbcdm_nativeerrorbox (dlg, henv, SQL_NULL_HANDLE,
	      SQL_NULL_HANDLE);
	  goto error;
	}
    }

error:
  /* Clean all that */
  SQLFreeHandle (SQL_HANDLE_ENV, henv);

end:
  if (GTK_CLIST (widget)->rows > 0)
    {
      gtk_clist_columns_autosize (GTK_CLIST (widget));
      gtk_clist_sort (GTK_CLIST (widget));
    }
}