From 29f61952d63393d206541b62b7760e0d96135e01 Mon Sep 17 00:00:00 2001 From: edgrif <edgrif> Date: Wed, 14 Jul 2004 09:15:39 +0000 Subject: [PATCH] rearrangements to cope with new NOT_CONNECTED state, + callbacks + new viewwindow struct. --- src/zmapView/zmapView.c | 216 +++++++++++++++++++++++++++++++--------- 1 file changed, 170 insertions(+), 46 deletions(-) diff --git a/src/zmapView/zmapView.c b/src/zmapView/zmapView.c index 8e654a7e3..8f3831cd7 100755 --- a/src/zmapView/zmapView.c +++ b/src/zmapView/zmapView.c @@ -25,9 +25,9 @@ * Description: * Exported functions: See ZMap/zmapView.h * HISTORY: - * Last edited: Jul 1 15:19 2004 (rnc) + * Last edited: Jul 13 18:01 2004 (edgrif) * Created: Thu May 13 15:28:26 2004 (edgrif) - * CVS info: $Id: zmapView.c,v 1.4 2004-07-02 13:49:19 rnc Exp $ + * CVS info: $Id: zmapView.c,v 1.5 2004-07-14 09:15:39 edgrif Exp $ *------------------------------------------------------------------- */ @@ -46,13 +46,18 @@ gboolean zmap_debug_G = TRUE ; #endif /* ED_G_NEVER_INCLUDE_THIS_CODE */ -static ZMapView createZMapView(GtkWidget *parent_widget, char *sequence, - void *app_data, ZMapViewCallbackFunc destroy_cb) ; +static ZMapView createZMapView(char *sequence, void *app_data) ; static void destroyZMapView(ZMapView zmap) ; static gint zmapIdleCB(gpointer cb_data) ; + +/* I'm not sure if we need this anymore, I think we will just do it with multiple callbacks... */ static void zmapWindowCB(void *cb_data, int reason) ; +void scrollCB(ZMapWindow window, void *caller_data) ; +void buttonClickCB(ZMapWindow window, void *caller_data) ; +void destroyCB(ZMapWindow window, void *caller_data) ; + static void startStateConnectionChecking(ZMapView zmap_view) ; static void stopStateConnectionChecking(ZMapView zmap_view) ; static gboolean checkStateConnections(ZMapView zmap_view) ; @@ -69,44 +74,107 @@ static void displayDataWindows(ZMapView zmap_view, void *data) ; static void killWindows(ZMapView zmap_view) ; + +/* These callback routines are static because they are set just once for the lifetime of the + * process. */ + +/* Callbacks we make back to the level above us. */ +static ZMapViewCallbacks view_cbs_G = NULL ; + +/* Callbacks back to us from the level below, i.e. zMapWindow. */ +ZMapWindowCallbacksStruct window_cbs_G = {scrollCB, buttonClickCB, destroyCB} ; + + + /* * ------------------- External functions ------------------- * (includes callbacks) */ -/* Create a new/blank zmap with its window, has no thread connections to databases. +/* This routine must be called just once before any other views routine, it is undefined + * if the caller calls this routine more than once. The caller must supply all of the callback + * routines. + * + * Note that since this routine is called once per application we do not bother freeing it + * via some kind of views terminate routine. */ +void zMapViewInit(ZMapViewCallbacks callbacks) +{ + zMapAssert(!view_cbs_G) ; + + zMapAssert(callbacks && callbacks->button_click && callbacks->destroy) ; + + view_cbs_G = g_new0(ZMapViewCallbacksStruct, 1) ; + + view_cbs_G->button_click = callbacks->button_click ; + view_cbs_G->destroy = callbacks->destroy ; + + + /* Init windows.... */ + zMapWindowInit(&window_cbs_G) ; + + + return ; +} + + + + + +/* Create a new/blank zmap has no windows, has no thread connections to databases. * Returns NULL on failure. */ -ZMapView zMapViewCreate(GtkWidget *parent_widget, char *sequence, - void *app_data, ZMapViewCallbackFunc destroy_cb) +ZMapView zMapViewCreate(char *sequence, void *app_data) { ZMapView zmap_view = NULL ; - ZMapWindow window ; - zmap_view = createZMapView(parent_widget, sequence, app_data, destroy_cb) ; + /* No callbacks, then no view creation. */ + zMapAssert(view_cbs_G) ; + + zmap_view = createZMapView(sequence, app_data) ; + + zmap_view->state = ZMAPVIEW_INIT ; + + return zmap_view ; +} + + +/* Adds a window to a view, the view may not have a window yet. + * Returns the window on success, NULL on failure. */ +ZMapViewWindow zMapViewAddWindow(ZMapView zmap_view, GtkWidget *parent_widget) +{ + ZMapViewWindow view_window ; - /* Create the zmap window itself. */ - if ((window = zMapWindowCreate(zmap_view->parent_widget, zmap_view->sequence, - zmapWindowCB, zmap_view))) + view_window = g_new0(ZMapViewWindowStruct, 1) ; + view_window->parent_view = zmap_view ; /* back pointer. */ + + if ((view_window->window = zMapWindowCreate(parent_widget, zmap_view->sequence, view_window))) { + zmap_view->parent_widget = parent_widget ; + /* add to list of windows.... */ - zmap_view->window_list = g_list_append(zmap_view->window_list, window) ; + zmap_view->window_list = g_list_append(zmap_view->window_list, view_window) ; - zmap_view->state = ZMAPVIEW_INIT ; + /* We may be adding a a window to something that is already connected or this may be + * the first window to be added. */ + if (zmap_view->state == ZMAPVIEW_INIT) + { + zmap_view->state = ZMAPVIEW_NOT_CONNECTED ; - /* Start polling function that checks state of this view and its connections. */ - startStateConnectionChecking(zmap_view) ; + /* Start polling function that checks state of this view and its connections. */ + startStateConnectionChecking(zmap_view) ; + } } else { - destroyZMapView(zmap_view) ; - zmap_view = NULL ; + g_free(view_window) ; + view_window = NULL ; } - return zmap_view ; + return view_window ; } + /* Connect a View to its databases via threads, at this point the View is blank and waiting * to be called to load some data. */ gboolean zMapViewConnect(ZMapView zmap_view) @@ -114,7 +182,7 @@ gboolean zMapViewConnect(ZMapView zmap_view) gboolean result = TRUE ; ZMapConfigStanzaSet server_list = NULL ; - if (zmap_view->state != ZMAPVIEW_INIT) + if (zmap_view->state != ZMAPVIEW_NOT_CONNECTED) { /* Probably we should indicate to caller what the problem was here.... * e.g. if we are resetting then say we are resetting etc..... */ @@ -193,7 +261,7 @@ gboolean zMapViewConnect(ZMapView zmap_view) } else { - zmap_view->state = ZMAPVIEW_INIT ; + zmap_view->state = ZMAPVIEW_NOT_CONNECTED ; } } @@ -206,11 +274,12 @@ gboolean zMapViewLoad(ZMapView zmap_view, char *sequence) { gboolean result = TRUE ; - if (zmap_view->state == ZMAPVIEW_RESETTING || zmap_view->state == ZMAPVIEW_DYING) + if (zmap_view->state == ZMAPVIEW_INIT + || zmap_view->state == ZMAPVIEW_RESETTING || zmap_view->state == ZMAPVIEW_DYING) result = FALSE ; else { - if (zmap_view->state == ZMAPVIEW_INIT) + if (zmap_view->state == ZMAPVIEW_NOT_CONNECTED) result = zMapViewConnect(zmap_view) ; if (result) @@ -286,8 +355,8 @@ ZMapViewState zMapViewGetStatus(ZMapView zmap_view) char *zMapViewGetStatusStr(ZMapViewState state) { /* Array must be kept in synch with ZmapState enum in ZMap.h */ - static char *zmapStates[] = {"ZMAPVIEW_INIT", "ZMAPVIEW_RUNNING", "ZMAPVIEW_RESETTING", - "ZMAPVIEW_DYING"} ; + static char *zmapStates[] = {"ZMAPVIEW_INIT", "ZMAPVIEW_NOT_CONNECTED", "ZMAPVIEW_RUNNING", + "ZMAPVIEW_RESETTING", "ZMAPVIEW_DYING"} ; char *state_str ; zMapAssert(state >= ZMAPVIEW_INIT && state <= ZMAPVIEW_DYING) ; @@ -298,6 +367,21 @@ char *zMapViewGetStatusStr(ZMapViewState state) } +ZMapWindow zMapViewGetWindow(ZMapViewWindow view_window) +{ + zMapAssert(view_window) ; + + return view_window->window ; +} + + +ZMapView zMapViewGetView(ZMapViewWindow view_window) +{ + zMapAssert(view_window) ; + + return view_window->parent_view ; +} + /* Called to kill a zmap window and get the associated threads killed, note that * this call just signals everything to die, its the checkConnections() routine @@ -309,10 +393,13 @@ gboolean zMapViewDestroy(ZMapView zmap_view) if (zmap_view->state != ZMAPVIEW_DYING) { - killGUI(zmap_view) ; + /* init state has no GUI components, otherwise chop the GUI. */ + if (zmap_view->state != ZMAPVIEW_INIT) + killGUI(zmap_view) ; /* If we are in init state or resetting then the connections have already being killed. */ - if (zmap_view->state != ZMAPVIEW_INIT && zmap_view->state != ZMAPVIEW_RESETTING) + if (zmap_view->state != ZMAPVIEW_INIT && zmap_view->state != ZMAPVIEW_NOT_CONNECTED + && zmap_view->state != ZMAPVIEW_RESETTING) killConnections(zmap_view) ; /* Must set this as this will prevent any further interaction with the ZMap as @@ -350,6 +437,44 @@ static gint zmapIdleCB(gpointer cb_data) +void scrollCB(ZMapWindow window, void *caller_data) +{ + ZMapViewWindow view_window = (ZMapViewWindow)caller_data ; + + printf("In View, in window scroll callback\n") ; + + + return ; +} + + +void buttonClickCB(ZMapWindow window, void *caller_data) +{ + ZMapViewWindow view_window = (ZMapViewWindow)caller_data ; + + printf("In View, in window button click callback\n") ; + + /* Is there any focus stuff we want to do here ??? */ + + /* Pass back a ZMapViewWindow as it has both the View and the window. */ + (*(view_cbs_G->button_click))(view_window, view_window->parent_view->app_data) ; + + return ; +} + + +/* DOES THIS EVER ACTUALLY HAPPEN........... */ +/* Called when an underlying window is destroyed. */ +void destroyCB(ZMapWindow window, void *caller_data) +{ + ZMapViewWindow view_window = (ZMapViewWindow)caller_data ; + + printf("In View, in window destroyed callback\n") ; + + return ; +} + + /* This routine needs some work, with the reorganisation of the code it is no longer correct, * it depends on what the zmapWindow can return to us. */ @@ -370,7 +495,8 @@ static void zmapWindowCB(void *cb_data, int reason) #ifdef ED_G_NEVER_INCLUDE_THIS_CODE - (*(zmap_view->app_destroy_cb))(zmap_view, zmap_view->app_data) ; + /* Must come later now that destruction is deferred ??? */ + (*(view_cbs_G->destroy_cb))(zmap_view, zmap_view->app_data) ; #endif /* ED_G_NEVER_INCLUDE_THIS_CODE */ } @@ -441,23 +567,21 @@ ZMapRegion *zMapViewGetZMapRegion(ZMapView view) */ -static ZMapView createZMapView(GtkWidget *parent_widget, char *sequence, - void *app_data, ZMapViewCallbackFunc destroy_cb) +static ZMapView createZMapView(char *sequence, void *app_data) { ZMapView zmap_view = NULL ; - zmap_view = g_new(ZMapViewStruct, sizeof(ZMapViewStruct)) ; + zmap_view = g_new(ZMapViewStruct, 1) ; zmap_view->state = ZMAPVIEW_INIT ; zmap_view->sequence = g_strdup(sequence) ; - zmap_view->parent_widget = parent_widget ; + zmap_view->parent_widget = NULL ; zmap_view->window_list = zmap_view->connection_list = NULL ; zmap_view->app_data = app_data ; - zmap_view->app_destroy_cb = destroy_cb ; return zmap_view ; } @@ -628,7 +752,7 @@ static gboolean checkStateConnections(ZMapView zmap_view) * depending on whether we are dying or threads have died or whatever.... */ if (!zmap_view->connection_list) { - if (zmap_view->state == ZMAPVIEW_INIT) + if (zmap_view->state == ZMAPVIEW_INIT || zmap_view->state == ZMAPVIEW_NOT_CONNECTED) { /* Nothing to do here I think.... */ @@ -669,9 +793,9 @@ static gboolean checkStateConnections(ZMapView zmap_view) } else if (zmap_view->state == ZMAPVIEW_DYING) { - /* this is probably the place to callback to zmapcontrol.... */ - (*(zmap_view->app_destroy_cb))(zmap_view, zmap_view->app_data) ; + /* this is probably the place to callback to zmapcontrol.... */ + (*(view_cbs_G->destroy))(zmap_view, zmap_view->app_data) ; /* zmap was waiting for threads to die, now they have we can free everything and stop. */ destroyZMapView(zmap_view) ; @@ -796,11 +920,11 @@ static void resetWindows(ZMapView zmap_view) do { - ZMapWindow window ; + ZMapViewWindow view_window ; - window = list_item->data ; + view_window = list_item->data ; - zMapWindowReset(window) ; + zMapWindowReset(view_window->window) ; } while ((list_item = g_list_next(list_item))) ; @@ -818,11 +942,11 @@ static void displayDataWindows(ZMapView zmap_view, void *data) do { - ZMapWindow window ; + ZMapViewWindow view_window ; - window = list_item->data ; + view_window = list_item->data ; - zMapWindowDisplayData(window, data) ; + zMapWindowDisplayData(view_window->window, data) ; } while ((list_item = g_list_next(list_item))) ; @@ -836,13 +960,13 @@ static void killWindows(ZMapView zmap_view) while (zmap_view->window_list) { - ZMapWindow window ; + ZMapViewWindow view_window ; - window = zmap_view->window_list->data ; + view_window = zmap_view->window_list->data ; - zMapWindowDestroy(window) ; + zMapWindowDestroy(view_window->window) ; - zmap_view->window_list = g_list_remove(zmap_view->window_list, window) ; + zmap_view->window_list = g_list_remove(zmap_view->window_list, view_window) ; } -- GitLab