diff options
author | Ian McIntosh <ian_mcintosh@linuxadvocate.org> | 2005-10-11 22:04:05 +0000 |
---|---|---|
committer | Ian McIntosh <ian_mcintosh@linuxadvocate.org> | 2005-10-11 22:04:05 +0000 |
commit | ec7720937150fc89cb721e5553d98178d15a7c2a (patch) | |
tree | a1679c94139634bb16904e267529544ec043e1f4 | |
parent | 488a4cd652a42e09058fd4b589086677e49547de (diff) |
Add checkbox to hide original line.
Fix cleanup code (remove memory leak?)
Add util_g_free_with_param, a generic g_free-like callback that takes an
(unused) user-data param.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | data/layers.xml | 16 | ||||
-rw-r--r-- | data/roadster.glade | 63 | ||||
-rw-r--r-- | src/import_tiger.c | 59 | ||||
-rw-r--r-- | src/map.c | 8 | ||||
-rw-r--r-- | src/test_poly.c | 110 | ||||
-rw-r--r-- | src/util.c | 6 | ||||
-rw-r--r-- | src/util.h | 1 |
8 files changed, 145 insertions, 124 deletions
@@ -1,3 +1,9 @@ +2005-10-12 Ian McIntosh <ian_mcintosh@linuxadvocate.org> + + * src/test_poly.c: Add checkbox to hide original line. + * src/import_tiger.c: Fix cleanup code (remove memory leak?) + * src/util.c: Add util_g_free_with_param, a generic g_free-like callback that takes an (unused) user-data param. + 2005-10-11 Ian McIntosh <ian_mcintosh@linuxadvocate.org> * src/test_poly.c: diff --git a/data/layers.xml b/data/layers.xml index 56825ad..3ae8c2f 100644 --- a/data/layers.xml +++ b/data/layers.xml @@ -110,7 +110,7 @@ <property zoom-level="1" name="line-width" value="1" /> <property zoom-level="2" name="line-width" value="1" /> <property zoom-level="3" name="line-width" value="1" /> - <property zoom-level="4" name="line-width" value="2" /> + <property zoom-level="4" name="line-width" value="1" /> <property zoom-level="5" name="line-width" value="2" /> <property zoom-level="1-5" name="line-cap" value="square" /> @@ -123,10 +123,7 @@ </layer> <layer data-source="minor-highways" draw-type="lines"> <!-- outer color line in minor highways --> - <property zoom-level="1" name="line-width" value="2" /> - <property zoom-level="2" name="line-width" value="2" /> - <property zoom-level="3" name="line-width" value="3" /> - <property zoom-level="4" name="line-width" value="4" /> + <property zoom-level="4" name="line-width" value="3" /> <property zoom-level="5" name="line-width" value="4" /> <property zoom-level="1-5" name="color" value="#DdAe31ff" /> @@ -142,12 +139,14 @@ <!-- major road top --> <property zoom-level="4-5" name="line-width" value="1" /> <property zoom-level="4-5" name="line-cap" value="square" /> + <property zoom-level="4-5" name="color" value="#EFE384FF" /> + <property zoom-level="6" name="line-width" value="4" /> <property zoom-level="7" name="line-width" value="6" /> <property zoom-level="8" name="line-width" value="8" /> <property zoom-level="9" name="line-width" value="14" /> <property zoom-level="10" name="line-width" value="24" /> - <property zoom-level="3-10" name="color" value="#FFF384FF" /> + <property zoom-level="6-10" name="color" value="#FFF384FF" /> </layer> <layer data-source="minor-highway-ramps" draw-type="lines"> <!-- minor highway ramp top --> @@ -178,8 +177,9 @@ <layer data-source="major-roads" draw-type="lines"> <!-- major roads bottom --> - <property zoom-level="4-5" name="line-width" value="3" /> - <property zoom-level="4-5" name="color" value="#d5d5b0ff" /> +<!-- <property zoom-level="4-5" name="line-width" value="3" /> --> +<!-- <property zoom-level="4-5" name="color" value="#e5e5c0ff" /> --> + <property zoom-level="6" name="line-width" value="6" /> <property zoom-level="7" name="line-width" value="8" /> <property zoom-level="8" name="line-width" value="10" /> diff --git a/data/roadster.glade b/data/roadster.glade index 7736b07..eb59457 100644 --- a/data/roadster.glade +++ b/data/roadster.glade @@ -5772,22 +5772,55 @@ review</property> </child> <child> - <widget class="GtkLabel" id="test_polylabel"> + <widget class="GtkHBox" id="hbox104"> <property name="visible">True</property> - <property name="label" translatable="yes">label92389</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="test_polylabel"> + <property name="visible">True</property> + <property name="label" translatable="yes">label92389</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="test_polyhidecheck"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Hide Line</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="test_poly_on_hidecheck_toggled" last_modification_time="Wed, 12 Oct 2005 02:30:32 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> diff --git a/src/import_tiger.c b/src/import_tiger.c index 06abd7d..97e1050 100644 --- a/src/import_tiger.c +++ b/src/import_tiger.c @@ -103,6 +103,13 @@ typedef struct tiger_record_rt2 GPtrArray* pPointsArray; } tiger_record_rt2_t; +void callback_free_rt2(gpointer p) +{ + tiger_record_rt2_t* pRT2 = (tiger_record_rt2_t*)p; + g_ptr_array_foreach(pRT2->pPointsArray, util_g_free_with_param, NULL); + g_free(pRT2); +} + #define TIGER_LANDMARK_NAME_LEN (30) typedef struct tiger_record_rt7 { @@ -125,19 +132,6 @@ typedef struct tiger_rt1_link gint nPointBTZID; // the unique # for the rt1's PointB } tiger_rt1_link_t; -typedef struct tiger_import_process { - gchar* pszFileDescription; - - GHashTable* pTableRT1; - GHashTable* pTableRT2; - GHashTable* pTableRT7; - GHashTable* pTableRT8; - GHashTable* pTableRTi; - GHashTable* pTableRTc; - - GPtrArray* pBoundaryRT1s; -} tiger_import_process_t; - typedef struct tiger_record_rti { // store a list of TLIDs for a polygonID @@ -145,6 +139,13 @@ typedef struct tiger_record_rti GPtrArray* pRT1LinksArray; } tiger_record_rti_t; +void callback_free_rti(gpointer p) +{ + tiger_record_rti_t* pRTi = (tiger_record_rti_t*)p; + g_ptr_array_foreach(pRTi->pRT1LinksArray, util_g_free_with_param, NULL); + g_free(pRTi); +} + #define TIGER_CITY_NAME_LEN (60) #define TIGER_FIPS55_LEN (5) typedef struct tiger_record_rtc @@ -155,6 +156,19 @@ typedef struct tiger_record_rtc gint nCityID; // a database ID, stored here after it is inserted } tiger_record_rtc_t; +typedef struct tiger_import_process { + gchar* pszFileDescription; + + GHashTable* pTableRT1; + GHashTable* pTableRT2; + GHashTable* pTableRT7; + GHashTable* pTableRT8; + GHashTable* pTableRTi; + GHashTable* pTableRTc; + + GPtrArray* pBoundaryRT1s; +} tiger_import_process_t; + // #define MAP_OBJECT_TYPE_NONE (0) // #define MAP_OBJECT_TYPE_MINORROAD (1) // #define MAP_OBJECT_TYPE_MAJORROAD (2) @@ -1303,7 +1317,7 @@ static gboolean import_tiger_from_buffers( importProcess.pBoundaryRT1s = g_ptr_array_new(); g_print("parsing RT1\n"); - importProcess.pTableRT1 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT1 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_1(pBufferRT1, nLengthRT1, importProcess.pTableRT1, importProcess.pBoundaryRT1s); g_print("RT1: %d records\n", g_hash_table_size(importProcess.pTableRT1)); @@ -1311,7 +1325,7 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RT2\n"); - importProcess.pTableRT2 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT2 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, callback_free_rt2); import_tiger_parse_table_2(pBufferRT2, nLengthRT2, importProcess.pTableRT2); g_print("RT2: %d records\n", g_hash_table_size(importProcess.pTableRT2)); @@ -1319,7 +1333,7 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RT7\n"); - importProcess.pTableRT7 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT7 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_7(pBufferRT7, nLengthRT7, importProcess.pTableRT7); g_print("RT7: %d records\n", g_hash_table_size(importProcess.pTableRT7)); @@ -1327,7 +1341,7 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RT8\n"); - importProcess.pTableRT8 = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRT8 = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_8(pBufferRT8, nLengthRT8, importProcess.pTableRT8); g_print("RT8: %d records\n", g_hash_table_size(importProcess.pTableRT8)); @@ -1335,12 +1349,12 @@ static gboolean import_tiger_from_buffers( importwindow_progress_pulse(); g_print("parsing RTc\n"); - importProcess.pTableRTc = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRTc = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free); import_tiger_parse_table_c(pBufferRTc, nLengthRTc, importProcess.pTableRTc); g_print("RTc: %d records\n", g_hash_table_size(importProcess.pTableRTc)); g_print("parsing RTi\n"); - importProcess.pTableRTi = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL); + importProcess.pTableRTi = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, callback_free_rti); import_tiger_parse_table_i(pBufferRTi, nLengthRTi, importProcess.pTableRTi); g_print("RTi: %d records\n", g_hash_table_size(importProcess.pTableRTi)); @@ -1385,11 +1399,12 @@ g_print("cleaning up\n"); g_hash_table_destroy(importProcess.pTableRT7); g_hash_table_destroy(importProcess.pTableRT8); g_hash_table_destroy(importProcess.pTableRTc); + // XXX: this call sometimes segfaults: - g_warning("leaking some memory due to unsolved bug in import. just restart roadster after/between imports ;)\n"); - //g_hash_table_destroy(importProcess.pTableRTi); - g_free(importProcess.pszFileDescription); + //g_warning("leaking some memory due to unsolved bug in import. just restart roadster after/between imports ;)\n"); + g_hash_table_destroy(importProcess.pTableRTi); + g_free(importProcess.pszFileDescription); return TRUE; } @@ -98,10 +98,10 @@ zoomlevel_t g_sZoomLevels[NUM_ZOOM_LEVELS] = { { 3300000, UNIT_MILES, 5, UNIT_KILOMETERS, 7, 3, 2}, // 15 { 2750000, UNIT_MILES, 5, UNIT_KILOMETERS, 7, 3, 2}, // 16 - { 2200000, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // *17 - { 1832250, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // 18 - { 1464500, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // 19 - { 1100000, UNIT_MILES, 8, UNIT_KILOMETERS, 5, 4, 1}, // 20 + { 2200000, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // *17 + { 1832250, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // 18 + { 1464500, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // 19 + { 1100000, UNIT_MILES,20, UNIT_KILOMETERS,15, 4, 1}, // 20 { 729000, UNIT_MILES,10, UNIT_KILOMETERS, 8, 5, 1}, // *21 { 607500, UNIT_MILES,10, UNIT_KILOMETERS, 8, 5, 1}, // 22 diff --git a/src/test_poly.c b/src/test_poly.c index 6208806..ff3d6f3 100644 --- a/src/test_poly.c +++ b/src/test_poly.c @@ -19,14 +19,14 @@ struct { GtkButton* pClearButton; GtkDrawingArea* pDrawingArea; GtkLabel* pLabel; + GtkCheckButton* pHideDrawingCheckButton; GArray* pPointsArray; } g_Test_Poly; -static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data); -static void test_poly_draw(); -static gboolean on_mouse_button_click(GtkWidget* w, GdkEventButton *event); -static gboolean on_clear_clicked(GtkWidget* w, GdkEventButton *event); +static gboolean test_poly_on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data); +static gboolean test_poly_on_mouse_button_click(GtkWidget* w, GdkEventButton *event); +static gboolean test_poly_on_clearbutton_clicked(GtkWidget* w, GdkEventButton *event); void test_poly_init(GladeXML* pGladeXML) { @@ -36,22 +36,23 @@ void test_poly_init(GladeXML* pGladeXML) GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pClearButton, GTK_BUTTON, "test_poly_clear_button"); GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pLabel, GTK_LABEL, "test_polylabel"); GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pDrawingArea, GTK_DRAWING_AREA, "test_polydrawingarea"); + GLADE_LINK_WIDGET(pGladeXML, g_Test_Poly.pHideDrawingCheckButton, GTK_CHECK_BUTTON, "test_polyhidecheck"); g_Test_Poly.pPointsArray = g_array_new(FALSE, FALSE, sizeof(mappoint_t)); // Drawing area gtk_widget_set_double_buffered(GTK_WIDGET(g_Test_Poly.pDrawingArea), FALSE); gtk_widget_add_events(GTK_WIDGET(g_Test_Poly.pDrawingArea), GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); - g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "expose-event", G_CALLBACK(on_time_to_update), NULL); - g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "button_press_event", G_CALLBACK(on_mouse_button_click), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "expose-event", G_CALLBACK(test_poly_on_time_to_update), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pDrawingArea), "button_press_event", G_CALLBACK(test_poly_on_mouse_button_click), NULL); // Scale - g_signal_connect(G_OBJECT(g_Test_Poly.pScale), "value-changed", G_CALLBACK(on_time_to_update), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pScale), "value-changed", G_CALLBACK(test_poly_on_time_to_update), NULL); // make it instant-change using our hacky callback //g_signal_connect(G_OBJECT(g_Test_Poly.pScale), "change-value", G_CALLBACK(util_gtk_range_instant_set_on_value_changing_callback), NULL); // "Clear" button - g_signal_connect(G_OBJECT(g_Test_Poly.pClearButton), "clicked", G_CALLBACK(on_clear_clicked), NULL); + g_signal_connect(G_OBJECT(g_Test_Poly.pClearButton), "clicked", G_CALLBACK(test_poly_on_clearbutton_clicked), NULL); // don't delete window on X, just hide it g_signal_connect(G_OBJECT(g_Test_Poly.pWindow), "delete_event", G_CALLBACK(gtk_widget_hide), NULL); @@ -62,13 +63,22 @@ void test_poly_show(GtkMenuItem *menuitem, gpointer user_data) gtk_widget_show(GTK_WIDGET(g_Test_Poly.pWindow)); } -static gboolean on_clear_clicked(GtkWidget* w, GdkEventButton *event) +// +// callbacks etc. +// +static gboolean test_poly_on_clearbutton_clicked(GtkWidget* w, GdkEventButton *event) { g_array_remove_range(g_Test_Poly.pPointsArray, 0, g_Test_Poly.pPointsArray->len); gtk_widget_queue_draw(GTK_WIDGET(g_Test_Poly.pDrawingArea)); + return TRUE; } -static gboolean on_mouse_button_click(GtkWidget* w, GdkEventButton *event) +gboolean test_poly_on_hidecheck_toggled(GtkWidget* w, GdkEventButton *event) +{ + gtk_widget_queue_draw(GTK_WIDGET(g_Test_Poly.pDrawingArea)); +} + +static gboolean test_poly_on_mouse_button_click(GtkWidget* w, GdkEventButton *event) { gint nX, nY; gdk_window_get_pointer(w->window, &nX, &nY, NULL); @@ -81,10 +91,11 @@ static gboolean on_mouse_button_click(GtkWidget* w, GdkEventButton *event) point.fLatitude = (gdouble)nY / (gdouble)nHeight; g_array_append_val(g_Test_Poly.pPointsArray, point); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_Test_Poly.pHideDrawingCheckButton), FALSE); gtk_widget_queue_draw(GTK_WIDGET(g_Test_Poly.pDrawingArea)); } -void test_poly_draw_array(cairo_t* pCairo, GArray* pArray) +static void test_poly_draw_array(cairo_t* pCairo, GArray* pArray) { if(pArray->len >= 1) { mappoint_t* pPoint; @@ -103,18 +114,16 @@ void test_poly_draw_array(cairo_t* pCairo, GArray* pArray) } } -static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data) +static gboolean test_poly_on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data) { - Display* dpy; - Drawable drawable; - dpy = gdk_x11_drawable_get_xdisplay(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); + Display* dpy = gdk_x11_drawable_get_xdisplay(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); Visual *visual = DefaultVisual (dpy, DefaultScreen (dpy)); + Drawable drawable = gdk_x11_drawable_get_xid(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); gint width, height; - drawable = gdk_x11_drawable_get_xid(GTK_WIDGET(g_Test_Poly.pDrawingArea)->window); gdk_drawable_get_size (GTK_WIDGET(g_Test_Poly.pDrawingArea)->window, &width, &height); cairo_surface_t *pSurface = cairo_xlib_surface_create (dpy, drawable, visual, width, height); - gdouble fValue = gtk_range_get_value(g_Test_Poly.pScale); + gdouble fValue = gtk_range_get_value(GTK_RANGE(g_Test_Poly.pScale)); cairo_t* pCairo = cairo_create (pSurface); @@ -125,13 +134,15 @@ static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event cairo_fill(pCairo); // Draw lines - cairo_set_line_join(pCairo, CAIRO_LINE_JOIN_ROUND); - cairo_save(pCairo); - cairo_set_line_width(pCairo, 0.02); - cairo_set_source_rgba(pCairo, 1.0, 0.0, 0.0, 1.0); - test_poly_draw_array(pCairo, g_Test_Poly.pPointsArray); - cairo_stroke(pCairo); - cairo_restore(pCairo); + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_Test_Poly.pHideDrawingCheckButton)) == FALSE) { + cairo_set_line_join(pCairo, CAIRO_LINE_JOIN_ROUND); + cairo_save(pCairo); + cairo_set_line_width(pCairo, 0.02); + cairo_set_source_rgba(pCairo, 1.0, 0.0, 0.0, 1.0); + test_poly_draw_array(pCairo, g_Test_Poly.pPointsArray); + cairo_stroke(pCairo); + cairo_restore(pCairo); + } cairo_save(pCairo); GArray* pSimplified = g_array_new(FALSE, FALSE, sizeof(mappoint_t)); @@ -156,54 +167,3 @@ static gboolean on_time_to_update(GtkWidget *pDrawingArea, GdkEventExpose *event g_array_free(pSimplified, TRUE); return TRUE; } - -// static void paint (GtkWidget *widget,GdkEventExpose *eev,gpointer data) -// { -// gint width, height; -// gint i; -// cairo_t *cr; -// -// width = widget->allocation.width; -// height = widget->allocation.height; -// -// cr = gdk_cairo_create (widget->window); -// -// /* clear background */ -// cairo_set_source_rgb (cr, 1,1,1); -// cairo_paint (cr); -// -// -// cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, -// CAIRO_FONT_WEIGHT_BOLD); -// -// /* enclosing in a save/restore pair since we alter the -// * font size -// */ -// cairo_save (cr); -// cairo_set_font_size (cr, 40); -// cairo_move_to (cr, 40, 60); -// cairo_set_source_rgb (cr, 0,0,0); -// cairo_show_text (cr, "Hello World"); -// cairo_restore (cr); -// -// cairo_set_source_rgb (cr, 1,0,0); -// cairo_set_font_size (cr, 20); -// cairo_move_to (cr, 50, 100); -// cairo_show_text (cr, "greetings from gtk and cairo"); -// -// cairo_set_source_rgb (cr, 0,0,1); -// -// cairo_move_to (cr, 0, 150); -// for (i=0; i< width/10; i++) -// { -// cairo_rel_line_to (cr, 5, 10); -// cairo_rel_line_to (cr, 5, -10); -// } -// cairo_stroke (cr); -// -// cairo_destroy (cr); -// } -// -// static gboolean on_expose_event(GtkWidget *pDrawingArea, GdkEventExpose *event, gpointer data) -// { -// } @@ -540,3 +540,9 @@ gchar* util_format_gdouble(gdouble d) g_ascii_dtostr(achBuffer, 20, d); return g_strdup(achBuffer); } + +void util_g_free_with_param(gpointer pMemory, gpointer _unused) +{ + g_assert(pMemory != NULL); + g_free(pMemory); +} @@ -87,5 +87,6 @@ gdouble util_get_percent_of_range(gint nMiddle, gint nA, gint nB); gchar* util_format_gdouble(gdouble d); +void util_g_free_with_param(gpointer pMemory, gpointer _unused); #endif |