summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2016-10-18 13:49:24 +0200
committerDave Davenport <qball@gmpclient.org>2016-10-18 13:49:24 +0200
commit7b3b68462e039d540ad029d94c3b8fb876887472 (patch)
treeb0e15e39e0c38e2bd240a79c01ad7d9459223fdf
parent2c0c3c675aae8283d79a61d151fa0aaa9d438182 (diff)
Fix memory leak in box and listview widget, add coverage make target. (ggcov and lcov)
-rw-r--r--Makefile.am9
-rw-r--r--include/widgets/textbox.h20
-rw-r--r--include/widgets/widget.h2
-rw-r--r--source/dialogs/drun.c2
-rw-r--r--source/dialogs/ssh.c2
-rw-r--r--source/helper.c4
-rw-r--r--source/rofi.c2
-rw-r--r--source/widgets/box.c6
-rw-r--r--source/widgets/listview.c12
-rw-r--r--source/widgets/widget.c6
-rw-r--r--source/xrmoptions.c2
-rw-r--r--test/widget-test.c4
12 files changed, 46 insertions, 25 deletions
diff --git a/Makefile.am b/Makefile.am
index 42957f9d..0b40d647 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -348,5 +348,14 @@ $(top_builddir)/gitconfig.h: .FORCE
$(rofi_SOURCES): $(top_builddir)/gitconfig.h
+.PHONY: coverage
+coverage: coverage/index.html
+
+coverage.info: $(top_builddir)/test/*.gcda $(top_builddir)/source/*.gcda $(top_builddir)/source/**/*.gcda
+ lcov --capture --directory ./ --output-file coverage.info
+
+coverage/index.html: coverage.info
+ genhtml $^ --output-directory coverage/
+
.PHONY: .FORCE
.FORCE:
diff --git a/include/widgets/textbox.h b/include/widgets/textbox.h
index f467ea6c..15de87dc 100644
--- a/include/widgets/textbox.h
+++ b/include/widgets/textbox.h
@@ -46,16 +46,16 @@ typedef struct
*/
typedef enum
{
- TB_AUTOHEIGHT = 1 << 0,
- TB_AUTOWIDTH = 1 << 1,
- TB_LEFT = 1 << 16,
- TB_RIGHT = 1 << 17,
- TB_CENTER = 1 << 18,
- TB_EDITABLE = 1 << 19,
- TB_MARKUP = 1 << 20,
- TB_WRAP = 1 << 21,
- TB_PASSWORD = 1 << 22,
- TB_INDICATOR = 1 << 23,
+ TB_AUTOHEIGHT = 1 << 0,
+ TB_AUTOWIDTH = 1 << 1,
+ TB_LEFT = 1 << 16,
+ TB_RIGHT = 1 << 17,
+ TB_CENTER = 1 << 18,
+ TB_EDITABLE = 1 << 19,
+ TB_MARKUP = 1 << 20,
+ TB_WRAP = 1 << 21,
+ TB_PASSWORD = 1 << 22,
+ TB_INDICATOR = 1 << 23,
} TextboxFlags;
/**
* Flags indicating current state of the textbox.
diff --git a/include/widgets/widget.h b/include/widgets/widget.h
index 2b871ec1..2dd11aa4 100644
--- a/include/widgets/widget.h
+++ b/include/widgets/widget.h
@@ -28,7 +28,7 @@ typedef struct _widget widget;
typedef gboolean ( *widget_clicked_cb )( widget *, xcb_button_press_event_t *, void * );
/** Macro to get widget from an implementation (e.g. textbox/scrollbar) */
-#define WIDGET( a ) ( ( a ) != NULL ? (widget *) ( a ) : NULL )
+#define WIDGET( a ) ( (widget *) ( a ) )
/**
* @param widget The widget to check
diff --git a/source/dialogs/drun.c b/source/dialogs/drun.c
index e9dd16cd..da0c3c26 100644
--- a/source/dialogs/drun.c
+++ b/source/dialogs/drun.c
@@ -366,7 +366,7 @@ static void walk_dir ( DRunModePrivateData *pd, const char *root, const char *di
}
// Skip files not ending on .desktop.
if ( file->d_type != DT_DIR && !g_str_has_suffix ( file->d_name, ".desktop" ) ) {
- g_free(filename);
+ g_free ( filename );
continue;
}
diff --git a/source/dialogs/ssh.c b/source/dialogs/ssh.c
index f11ba3a1..397893dc 100644
--- a/source/dialogs/ssh.c
+++ b/source/dialogs/ssh.c
@@ -198,7 +198,7 @@ static char **read_hosts_file ( char ** retv, unsigned int *length )
// Reading one line per time.
while ( getline ( &buffer, &buffer_length, fd ) > 0 ) {
// Evaluate one line.
- unsigned int index = 0, ti = 0;
+ unsigned int index = 0, ti = 0;
char *token = buffer;
// Tokenize it.
diff --git a/source/helper.c b/source/helper.c
index 773c8fc3..7fabbcea 100644
--- a/source/helper.c
+++ b/source/helper.c
@@ -194,7 +194,7 @@ static GRegex * create_regex ( const char *input, int case_sensitive )
{
#define R( s ) g_regex_new ( s, G_REGEX_OPTIMIZE | ( ( case_sensitive ) ? 0 : G_REGEX_CASELESS ), 0, NULL )
GRegex * retv = NULL;
- gchar *r;
+ gchar *r;
switch ( config.matching_method )
{
case MM_GLOB:
@@ -234,7 +234,7 @@ GRegex **tokenize ( const char *input, int case_sensitive )
}
char *saveptr = NULL, *token;
- GRegex **retv = NULL;
+ GRegex **retv = NULL;
if ( !config.tokenize ) {
retv = g_malloc0 ( sizeof ( GRegex* ) * 2 );
retv[0] = (GRegex *) create_regex ( input, case_sensitive );
diff --git a/source/rofi.c b/source/rofi.c
index 46b81ae7..391d8f21 100644
--- a/source/rofi.c
+++ b/source/rofi.c
@@ -344,7 +344,7 @@ static int add_mode ( const char * token )
}
else
#endif // WINDOW_MODE
- // SSh dialog
+ // SSh dialog
if ( strcasecmp ( token, "ssh" ) == 0 ) {
modi[num_modi] = &ssh_mode;
num_modi++;
diff --git a/source/widgets/box.c b/source/widgets/box.c
index 6f5b12de..bb36f292 100644
--- a/source/widgets/box.c
+++ b/source/widgets/box.c
@@ -202,13 +202,15 @@ static void box_free ( widget *wid )
widget * child = (widget *) iter->data;
widget_free ( child );
}
-
+ g_list_free ( b->children );
g_free ( b );
}
void box_add ( box *box, widget *child, gboolean expand, gboolean end )
{
- if ( box == NULL ) return;
+ if ( box == NULL ) {
+ return;
+ }
child->expand = expand;
child->end = end;
child->parent = WIDGET ( box );
diff --git a/source/widgets/listview.c b/source/widgets/listview.c
index 055be2f6..ce6072e0 100644
--- a/source/widgets/listview.c
+++ b/source/widgets/listview.c
@@ -71,9 +71,15 @@ struct _listview
void *mouse_activated_data;
};
-static void listview_free ( widget *widget )
+static void listview_free ( widget *wid )
{
- listview *lv = (listview *) widget;
+ listview *lv = (listview *) wid;
+ for ( unsigned int i = 0; i < lv->cur_elements; i++ ) {
+ widget_free ( WIDGET ( lv->boxes [i] ) );
+ }
+ g_free ( lv->boxes );
+
+ widget_free ( WIDGET ( lv->scrollbar ) );
g_free ( lv );
}
static unsigned int scroll_per_page ( listview * lv )
@@ -237,7 +243,7 @@ static void listview_resize ( widget *wid, short w, short h )
lv->max_rows = ( lv->padding + lv->widget.h ) / ( lv->element_height + lv->padding );
lv->max_elements = lv->max_rows * lv->menu_columns;
- widget_move ( WIDGET ( lv->scrollbar ), lv->widget.w - widget_get_width ( WIDGET (lv->scrollbar ) ), 0 );
+ widget_move ( WIDGET ( lv->scrollbar ), lv->widget.w - widget_get_width ( WIDGET ( lv->scrollbar ) ), 0 );
widget_resize ( WIDGET ( lv->scrollbar ), widget_get_width ( WIDGET ( lv->scrollbar ) ), h );
listview_recompute_elements ( lv );
diff --git a/source/widgets/widget.c b/source/widgets/widget.c
index 48642cb7..0aee2e70 100644
--- a/source/widgets/widget.c
+++ b/source/widgets/widget.c
@@ -66,10 +66,10 @@ void widget_draw ( widget *widget, cairo_t *d )
widget->need_redraw = FALSE;
}
}
-void widget_free ( widget *widget )
+void widget_free ( widget *wid )
{
- if ( widget && widget->free ) {
- widget->free ( widget );
+ if ( wid && wid->free ) {
+ wid->free ( wid );
}
}
diff --git a/source/xrmoptions.c b/source/xrmoptions.c
index 0217833e..6d69e1d9 100644
--- a/source/xrmoptions.c
+++ b/source/xrmoptions.c
@@ -197,7 +197,7 @@ static XrmOption xrmOptions[] = {
};
/** Dynamic array of extra options */
-XrmOption *extra_options = NULL;
+XrmOption *extra_options = NULL;
/** Number of entries in extra options array */
unsigned int num_extra_options = 0;
diff --git a/test/widget-test.c b/test/widget-test.c
index 16c51c78..109197cb 100644
--- a/test/widget-test.c
+++ b/test/widget-test.c
@@ -20,6 +20,10 @@ int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv )
widget *wid= (widget*)g_malloc0(sizeof(widget));
widget_resize ( wid, 20, 40);
widget_move ( wid, 10, 10);
+ // Getter, setter x pos
+ //
+ TASSERT( widget_get_x_pos ( wid ) == 10 );
+ TASSERT( widget_get_y_pos ( wid ) == 10 );
// Left of box
TASSERT ( widget_intersect ( wid, 0, 0) == 0 );