summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2015-04-07 22:46:15 -0400
committerPietro Gagliardi <[email protected]>2015-04-07 22:46:15 -0400
commit1e263930ebc6d1871c43bb70bc21c4917efaff1e (patch)
tree0c556df727301ba8a0fb2e1f991637d0ad07ceec
parentc6daf8d3086b270dba6047349b563a7b68bfbfb8 (diff)
Started working on code to monitor creation and deletion of UI objects correctly.
-rw-r--r--new/container_unix.c1
-rw-r--r--new/window_unix.c11
-rw-r--r--new/window_windows.c5
3 files changed, 14 insertions, 3 deletions
diff --git a/new/container_unix.c b/new/container_unix.c
index 099944b..f923931 100644
--- a/new/container_unix.c
+++ b/new/container_unix.c
@@ -17,6 +17,7 @@ static void uiContainer_dispose(GObject *obj)
static void uiContainer_finalize(GObject *obj)
{
+printf("in uiContainer_finalize(); freeing container\n");
G_OBJECT_CLASS(uiContainer_parent_class)->finalize(obj);
}
diff --git a/new/window_unix.c b/new/window_unix.c
index acdede7..9f61289 100644
--- a/new/window_unix.c
+++ b/new/window_unix.c
@@ -8,6 +8,14 @@ struct uiWindow {
void *onClosingData;
};
+static void onDestroy(GtkWindow *window, gpointer data)
+{
+ uiWindow *w = (uiWindow *) data;
+
+printf("destroying window; freeing uiWindow\n");
+ uiFree(w);
+}
+
uiWindow *uiNewWindow(char *title, int width, int height)
{
uiWindow *w;
@@ -16,6 +24,7 @@ uiWindow *uiNewWindow(char *title, int width, int height)
w->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(w->widget), title);
gtk_window_resize(GTK_WINDOW(w->widget), width, height);
+ g_signal_connect(w->widget, "destroy", G_CALLBACK(onDestroy), w);
w->container = newContainer();
gtk_container_add(GTK_CONTAINER(w->widget), w->container);
return w;
@@ -24,7 +33,6 @@ uiWindow *uiNewWindow(char *title, int width, int height)
void uiWindowDestroy(uiWindow *w)
{
gtk_widget_destroy(w->widget);
- uiFree(w);
}
uintptr_t uiWindowHandle(uiWindow *w)
@@ -44,7 +52,6 @@ void uiWindowHide(uiWindow *w)
gtk_widget_hide(w->widget);
}
-// TODO will not free w
static gboolean onClosing(GtkWidget *win, GdkEvent *e, gpointer data)
{
uiWindow *w = (uiWindow *) data;
diff --git a/new/window_windows.c b/new/window_windows.c
index b4d0163..1952b15 100644
--- a/new/window_windows.c
+++ b/new/window_windows.c
@@ -45,6 +45,10 @@ static LRESULT CALLBACK uiWindowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPA
if (!(*(w->onClosing))(w, w->onClosingData))
return 0;
break; // fall through to DefWindowProcW()
+ case WM_DESTROY:
+printf("destroying window; freeing uiWindow\n");
+ uiFree(w);
+ break; // fall through to DefWindowProcW()
}
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
@@ -104,7 +108,6 @@ uiWindow *uiNewWindow(char *title, int width, int height)
void uiWindowDestroy(uiWindow *w)
{
DestroyWindow(w->hwnd);
- uiFree(w);
}
uintptr_t uiWindowHandle(uiWindow *w)