I have spent a long time trying to find out what is wrong with this, and I have even tried doing it in different ways. I have majorly distilled my program down to the following code in an attempt to isolate the problem, but I simply cannot find the problem with the code or think of how I could further simplify this.
(edit: changed pointers think I copied wrong the first time, but the point is that they are different)
output:
0x9259000
output on key press:
test: 0x9264048
edit: confirming that it works as expected when I do it with password_entry instead of progress_bar (output in both cases is: 0x9ee3028
test: 0x9ee3028)
this is the same general story. At first I tried to link the progress bar to the password entry widget but I kept getting error telling me it is not a progress bar. So then I checked and I see that indeed the pointer is changing when trying to pass it with g_signal_connect. If I pass it normally without g_signal_connect it works fine no matter what, but then I can not associate it with a key press event.
I cannot think of what else to try. With everything other than progress bar this seems to work so far. I also found a comment from someone else on a GTK forum who was apparently having this same issue, it spontaneously fixed for him but not for me. People claimed he probably had some memory corruption going on or some other bug somewhere. I have tried very hard to debug my application but I have no idea why the pointer is corrupting in this case.
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <gtk/gtk.h>
typedef struct{
GtkGrid* grid;
GtkWidget* sibling;
int relational_position;
int pad_top;
int pad_bottom;
int pad_left;
int pad_right;
int span_rows;
int span_columns;
int hexpand;
int vexpand;
int halign;
int valign;
}drawinfo;
GtkWindow* initialize_top_window(char* title, int height, int width);
GtkWidget* add_entry(char* initial_text, int mask_text, char* path2icon, drawinfo* entry_drawinfo);
GtkWidget* add_progress_bar(int show_text, drawinfo* progress_bar_drawinfo);
void draw_widget(GtkWidget* widget, drawinfo* widget_drawinfo);
void add_stuff(GtkGrid* intro_grid);
void testf(GtkWidget* entropy_bar);
int main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
GtkWindow* top_window = initialize_top_window("Program", 1000, 500);
GtkGrid* top_grid = (GtkGrid*)gtk_grid_new();
gtk_container_add(GTK_CONTAINER(top_window), (GtkWidget*)top_grid);
gtk_widget_show( (GtkWidget*) top_grid);
add_stuff(top_grid);
gtk_main();
return 0;
}
void add_stuff(GtkGrid* intro_grid)
{
drawinfo* password_entry_di = malloc(sizeof(drawinfo));
password_entry_di->grid = intro_grid;
password_entry_di->sibling = NULL;
password_entry_di->relational_position = 0;
password_entry_di->pad_top = 10;
password_entry_di->pad_bottom = 0;
password_entry_di->pad_left = 100;
password_entry_di->pad_right = 100;
password_entry_di->span_rows = 1;
password_entry_di->span_columns = 1;
password_entry_di->hexpand = TRUE;
password_entry_di->vexpand = FALSE;
password_entry_di->halign = GTK_ALIGN_FILL;
password_entry_di->valign = GTK_ALIGN_FILL;
GtkWidget* password_entry = add_entry("Password", TRUE, "graphics/key.png", password_entry_di);
drawinfo* password_entropy_progress_bar_di = malloc(sizeof(drawinfo));
password_entropy_progress_bar_di->grid = intro_grid;
password_entropy_progress_bar_di->sibling = password_entry;
password_entropy_progress_bar_di->relational_position = GTK_POS_BOTTOM;
password_entropy_progress_bar_di->pad_top = 10;
password_entropy_progress_bar_di->pad_bottom = 0;
password_entropy_progress_bar_di->pad_left = 100;
password_entropy_progress_bar_di->pad_right = 100;
password_entropy_progress_bar_di->span_rows = 1;
password_entropy_progress_bar_di->span_columns = 1;
password_entropy_progress_bar_di->hexpand = TRUE;
password_entropy_progress_bar_di->vexpand = FALSE;
password_entropy_progress_bar_di->halign = GTK_ALIGN_FILL;
password_entropy_progress_bar_di->valign = GTK_ALIGN_FILL;
GtkWidget* progress_bar = gtk_progress_bar_new();
gtk_progress_bar_set_show_text( (GtkProgressBar*) progress_bar, 1);
draw_widget(progress_bar, password_entropy_progress_bar_di);
g_signal_connect(password_entry, "key-release-event", G_CALLBACK(testf), progress_bar);
printf("%p\n", progress_bar);
return;
}
void testf(GtkWidget* entropy_bar)
{
printf("test: %p\n", entropy_bar);
return;
}
void draw_widget(GtkWidget* widget, drawinfo* widget_drawinfo)
{
gtk_grid_attach_next_to(widget_drawinfo->grid, widget, widget_drawinfo->sibling,
widget_drawinfo->relational_position,
widget_drawinfo->span_columns,
widget_drawinfo->span_rows);
gtk_widget_set_hexpand(widget, widget_drawinfo->hexpand);
gtk_widget_set_vexpand(widget, widget_drawinfo->vexpand);
gtk_widget_set_halign(widget, widget_drawinfo->halign);
gtk_widget_set_valign(widget, widget_drawinfo->valign);
g_object_set(widget, "margin-left", widget_drawinfo->pad_left, NULL);
g_object_set(widget, "margin-right", widget_drawinfo->pad_right, NULL);
g_object_set(widget, "margin-bottom", widget_drawinfo->pad_bottom, NULL);
g_object_set(widget, "margin-top", widget_drawinfo->pad_top, NULL);
gtk_widget_show(widget);
return;
}
GtkWidget* add_progress_bar(int show_text, drawinfo* progress_bar_drawinfo)
{
GtkWidget* progress_bar = gtk_progress_bar_new();
gtk_progress_bar_set_show_text( (GtkProgressBar*) progress_bar, show_text);
draw_widget(progress_bar, progress_bar_drawinfo);
return progress_bar;
}
GtkWidget* add_entry(char* initial_text, int mask_text, char* path2icon, drawinfo* entry_drawinfo)
{
GtkWidget* entry = gtk_entry_new();
gtk_entry_set_visibility( (GtkEntry*)entry, !mask_text);
gtk_entry_set_placeholder_text( (GtkEntry*)entry, initial_text);
GdkPixbuf* entry_icon = gdk_pixbuf_new_from_file( (const char*) path2icon, NULL);
gtk_entry_set_icon_from_pixbuf( (GtkEntry*)entry, GTK_ENTRY_ICON_PRIMARY, entry_icon);
draw_widget(entry, entry_drawinfo);
return entry;
}
GtkWindow* initialize_top_window(char* title, int height, int width)
{
GtkWidget* main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title( (GtkWindow*)main_window, title);
gtk_window_set_default_size( (GtkWindow*) main_window, height, width);
g_signal_connect( (GtkWindow*)main_window, "delete-event", G_CALLBACK(exit), NULL);
gtk_widget_show(main_window);
return (GtkWindow*)main_window;
}