diff --git a/src/save.c b/src/save.c index b047883..58649ad 100644 --- a/src/save.c +++ b/src/save.c @@ -37,9 +37,9 @@ extern int diff_load(xmlNodePtr parent); extern void menu_main_close(void); /* Static. */ static int save_data(xmlTextWriterPtr writer); -static void load_menu_close(char* str); -static void load_menu_load(char* str); -static void load_menu_delete(char* str); +static void load_menu_close(unsigned int wdw, char* str); +static void load_menu_load(unsigned int wdw, char* str); +static void load_menu_delete(unsigned wdw, char* str); static int load_game(char* file); /* Save all the game data. */ @@ -151,13 +151,13 @@ void load_game_menu(void) { window_setAccept(wid, load_menu_load); } -static void load_menu_close(char* str) { +static void load_menu_close(unsigned int wdw, char* str) { (void)str; - window_destroy(window_get("Load Game")); + window_destroy(wdw); } -static void load_menu_load(char* str) { +static void load_menu_load(unsigned int wdw, char* str) { (void)str; char* save, path[PATH_MAX]; int wid; @@ -171,11 +171,11 @@ static void load_menu_load(char* str) { snprintf(path, PATH_MAX, "%ssaves/%s.ls", lfile_basePath(), save); load_game(path); - load_menu_close(NULL); + load_menu_close(wdw, NULL); menu_main_close(); } -static void load_menu_delete(char* str) { +static void load_menu_delete(unsigned int wdw, char* str) { (void)str; char* save, path[PATH_MAX]; int wid; @@ -194,7 +194,7 @@ static void load_menu_delete(char* str) { unlink(path); /* Need to reload the menu. */ - load_menu_close(NULL); + load_menu_close(wdw, NULL); load_game_menu(); } diff --git a/src/ship.c b/src/ship.c index 0e7d898..b478983 100644 --- a/src/ship.c +++ b/src/ship.c @@ -26,7 +26,6 @@ static Ship* ship_stack = NULL; static int ship_nstack = 0; static Ship* ship_parse(xmlNodePtr parent); -static void ship_view_close(char* btn); /* Get a ship based on it's name. */ Ship* ship_get(const char* name) { @@ -393,7 +392,8 @@ void ships_free(void) { } /* Used to visualize the ships status. */ -void ship_view(char* shipname) { +void ship_view(unsigned int unused, char* shipname) { + (void) unused; Ship* s; char buf[1024]; unsigned int wid; @@ -453,10 +453,6 @@ void ship_view(char* shipname) { snprintf(buf, 37, "close%s", shipname); window_addButton(wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, - buf, "Close", ship_view_close); -} - -static void ship_view_close(char* btn) { - window_destroy(window_get(btn+5)); /* "closefoo -> Foo" */ + buf, "Close", window_close); } diff --git a/src/ship.h b/src/ship.h index ac13266..f02ffa9 100644 --- a/src/ship.h +++ b/src/ship.h @@ -88,5 +88,5 @@ int ships_load(void); void ships_free(void); /* Toolkit. */ -void ship_view(char* shipname); +void ship_view(unsigned int unused, char* shipname); diff --git a/src/toolkit.c b/src/toolkit.c index 2edd547..b26a301 100644 --- a/src/toolkit.c +++ b/src/toolkit.c @@ -47,7 +47,7 @@ typedef struct Widget_ { union { /* Widget button. */ struct { - void(*fptr) (char*); /* Active callback. */ + void(*fptr) (unsigned int, char*); /* Active callback. */ char* display; /* Stored text. */ int disabled; } btn; @@ -70,7 +70,7 @@ typedef struct Widget_ { int noptions; /* total number of options. */ int selected; /* Currently selected option. */ int pos; /* Current topmost option (in view). */ - void (*fptr) (char*); /* Modify callback. */ + void (*fptr) (unsigned int, char*); /* Modify callback. */ } lst; /* Widget rect. */ struct { @@ -81,7 +81,7 @@ typedef struct Widget_ { struct { int border; void(*render) (double bx, double by, double bw, double bh); - void(*mouse) (SDL_Event* event, double bx, double by); + void(*mouse) (unsigned int wid, SDL_Event* event, double bx, double by); } cst; struct { /* Widget input. */ @@ -98,7 +98,7 @@ typedef struct Widget_ { double pos; /**< Current y position. */ int iw; /**< Image width to use. */ int ih; /**< Image height to use. */ - void(*fptr)(char*); /**< Modify callback - triggered on selection. */ + void(*fptr)(unsigned int, char*); /**< Modify callback - triggered on selection. */ } iar; /**< WIDGET_IMAGEARRAY */ } dat; } Widget; @@ -110,9 +110,9 @@ typedef struct Window_ { int hidden; /* Is it hidden? */ int focus; /* Which window is focused. */ - void(*accept_fptr)(char*); /**< Triggered by hitting 'enter' with no widget + void(*accept_fptr)(unsigned int, char*); /**< Triggered by hitting 'enter' with no widget that catches the keypress. */ - void(*cancel_fptr)(char*); /**< Triggered by hitting 'escape' with no + void(*cancel_fptr)(unsigned int, char*); /**< Triggered by hitting 'escape' with no widget that catches the keypress. */ double x,y; /* Position. */ @@ -188,7 +188,7 @@ static void toolkit_setPos(Window* wdw, Widget* wgt, int x, int y) { /* only parameter. */ void window_addButton(const unsigned int wid, const int x, const int y, const int w, const int h, char* name, - char* display, void (*call)(char*)) { + char* display, void (*call)(unsigned int, char*)) { Window* wdw = window_wget(wid); Widget* wgt = window_newWidget(wdw); @@ -266,7 +266,7 @@ void window_addImage(const unsigned int wid, const int x, const int y, void window_addList(const unsigned int wid, const int x, const int y, const int w, const int h, char* name, char** items, int nitems, - int defitem, void(*call) (char*)) { + int defitem, void(*call) (unsigned int, char*)) { Window *wdw = window_wget(wid); Widget* wgt = window_newWidget(wdw); @@ -315,7 +315,7 @@ void window_addRect(const unsigned int wid, const int x, const int y, void window_addCust(const unsigned int wid, const int x, const int y, const int w, const int h, char* name, const int border, void(*render) (double x, double y, double w, double h), - void(*mouse) (SDL_Event* event, double x, double y)) { + void(*mouse) (unsigned int wid, SDL_Event* event, double x, double y)) { Window* wdw = window_wget(wid); Widget* wgt = window_newWidget(wdw); @@ -382,7 +382,7 @@ void window_addImageArray(const unsigned int wid, const int w, const int h, /* Size. */ char* name, const int iw, const int ih, /* Name and image sizes. */ glTexture** tex, char** caption, int nelem, /* Elements. */ - void(*call) (char*)) { + void(*call) (unsigned int, char*)) { Window* wdw = window_wget(wid); Widget* wgt = window_newWidget(wdw); @@ -532,7 +532,6 @@ unsigned int window_get(const char* wdwname) { for(i = 0; i < nwindows; i++) if(strcmp(windows[i].name, wdwname)==0) return windows[i].id; - DEBUG("Window '%s' not found in windows stack", wdwname); return 0; } @@ -596,7 +595,7 @@ unsigned int window_create(char* name, const int x, const int y, } /** - * @fn void window_setAccept(const unsigned int wid, void(*accept)(char*)) + * @fn void window_setAccept(const unsigned int wid, void(*accept)(unsigned int, char*)) * * @brief Set the default accept function of the window. * @@ -606,7 +605,7 @@ unsigned int window_create(char* name, const int x, const int y, * @param accept Function to trigger when window is "accepted". Parameter * passed is window name. */ -void window_setAccept(const unsigned int wid, void(*accept)(char*)) { +void window_setAccept(const unsigned int wid, void(*accept)(unsigned int, char*)) { Window* wdw; wdw = window_wget(wid); @@ -614,7 +613,7 @@ void window_setAccept(const unsigned int wid, void(*accept)(char*)) { } /** - * @fn void window_setCancel(const unsigned int wid, void(*cancel)(char*)) + * @fn void window_setCancel(const unsigned int wid, void(*cancel)(unsigned int, char*)) * * @brief Set the default cancel function of the window. * @@ -624,7 +623,7 @@ void window_setAccept(const unsigned int wid, void(*accept)(char*)) { * @param cancel Function to trigger when window is "cancelled". * Parameter passed is the window name. */ -void window_setCancel(const unsigned int wid, void(*cancel)(char*)) { +void window_setCancel(const unsigned int wid, void(*cancel)(unsigned int, char*)) { Window* wdw; wdw = window_wget(wid); @@ -668,6 +667,19 @@ static void widget_cleanup(Widget* widget) { } } +/** + * @fn void window_close(unsigned int wid, char* str) + * + * @brief Helper function to automatically close the window calling it. + * @param wid Window to close. + * @param str Unused. + */ +void window_close(unsigned int wid, char* str) { + (void) str; + window_destroy(wid); +} + + /* Destroy a window. */ void window_destroy(const unsigned int wid) { int i, j; @@ -1406,7 +1418,7 @@ static void toolkit_mouseEvent(SDL_Event* event) { (y > wgt->y) && (y < (wgt->y + wgt->h))) { /* Custom widgets take it from here. */ if((wgt->type == WIDGET_CUST) && wgt->dat.cst.mouse) - (*wgt->dat.cst.mouse)(event, x-wgt->x, y-wgt->y); + (*wgt->dat.cst.mouse)(w->id, event, x-wgt->x, y-wgt->y); else switch(event->type) { case SDL_MOUSEMOTION: @@ -1463,16 +1475,17 @@ static void toolkit_mouseEvent(SDL_Event* event) { break; } } + /* Otherwise custom widgets can get stuck on mousedown. */ else if((wgt->type == WIDGET_CUST) && (event->type == SDL_MOUSEBUTTONUP) && wgt->dat.cst.mouse) - (*wgt->dat.cst.mouse) (event, x-wgt->x, y-wgt->y); + (*wgt->dat.cst.mouse) (w->id, event, x-wgt->x, y-wgt->y); else if(!mouse_down) wgt->status = WIDGET_STATUS_NORMAL; } /* We trigger this at the end in case it destroys the window that is calling * this function. Otherwise ugly segfaults appear. */ - if(wgt_func) (*wgt_func->dat.btn.fptr)(wgt_func->name); + if(wgt_func) (*wgt_func->dat.btn.fptr)(w->id, wgt_func->name); } /* Handle the key events. */ @@ -1529,7 +1542,7 @@ static int toolkit_keyEvent(SDL_Event* event) { case SDLK_ESCAPE: if(event->type == SDL_KEYDOWN) if(wdw->cancel_fptr != NULL) { - (*wdw->cancel_fptr)(wdw->name); + (*wdw->cancel_fptr)(wdw->id, wdw->name); return 1; } return 0; @@ -1631,13 +1644,13 @@ static void toolkit_triggerFocus(void) { switch(wgt->type) { case WIDGET_BUTTON: - if(wgt->dat.btn.fptr)(*wgt->dat.btn.fptr)(wgt->name); + if(wgt->dat.btn.fptr)(*wgt->dat.btn.fptr)(wdw->id, wgt->name); else DEBUG("Toolkit: Button '%s' of Window '%s'" "Doesn't have a function trigger", wgt->name, wdw->name); break; default: - if(wdw->accept_fptr)(*wdw->accept_fptr)(wgt->name); + if(wdw->accept_fptr)(*wdw->accept_fptr)(wdw->id, wgt->name); break; } } @@ -1647,15 +1660,18 @@ static void toolkit_listScroll(Widget* wgt, int direction) { double w, h; int xelem, yelem; double hmax; + Window* wdw; if(wgt == NULL) return; + wdw = &windows[nwindows-1]; /* Get active window. */ + switch(wgt->type) { case WIDGET_LIST: wgt->dat.lst.selected -= direction; wgt->dat.lst.selected = MAX(0, wgt->dat.lst.selected); wgt->dat.lst.selected = MIN(wgt->dat.lst.selected, wgt->dat.lst.noptions-1); - if(wgt->dat.lst.fptr) (*wgt->dat.lst.fptr)(wgt->name); + if(wgt->dat.lst.fptr) (*wgt->dat.lst.fptr)(wdw->id, wgt->name); break; case WIDGET_IMAGEARRAY: @@ -1678,7 +1694,7 @@ static void toolkit_listScroll(Widget* wgt, int direction) { /* Boundry check. */ wgt->dat.iar.pos = MAX(wgt->dat.iar.pos, 0.); wgt->dat.iar.pos = MIN(wgt->dat.iar.pos, hmax); - if(wgt->dat.iar.fptr)(*wgt->dat.iar.fptr)(wgt->name); + if(wgt->dat.iar.fptr)(*wgt->dat.iar.fptr)(wdw->id, wgt->name); break; default: @@ -1758,6 +1774,9 @@ static void toolkit_imgarrFocus(Widget* iar, double bx, double by) { double x, y, w, h, ycurs, xcurs; double scroll_pos, hmax; int xelem, xspace, yelem; + Window* wdw; + + wdw = &windows[nwindows-1]; /* Get active window. */ /* Positions. */ x = bx + iar->x; @@ -1788,7 +1807,7 @@ static void toolkit_imgarrFocus(Widget* iar, double bx, double by) { (by > ycurs) && (by < ycurs+h-4.)) { iar->dat.iar.selected = j*xelem+i; if(iar->dat.iar.fptr != NULL) - (*iar->dat.iar.fptr)(iar->name); + (*iar->dat.iar.fptr)(wdw->id, iar->name); return; } xcurs += xspace + w; diff --git a/src/toolkit.h b/src/toolkit.h index 5f5c9a1..440867b 100644 --- a/src/toolkit.h +++ b/src/toolkit.h @@ -11,7 +11,7 @@ unsigned int window_create(char* name, const int x, const int y, void window_addButton(const unsigned int wid, const int x, const int y, const int w, const int h, char* name, char* display, - void(*call)(char*)); + void(*call)(unsigned int, char*)); void window_addText(const unsigned int wid, const int x, const int y, const int w, const int h, const int centered, char* name, @@ -24,7 +24,7 @@ void window_addList(const unsigned int wid, const int x, const int y, /* Position. */ const int w, const int h, /* Size. */ char* name, char** items, int nitems, int defitem, - void(*call)(char*)); + void(*call)(unsigned int, char*)); void window_addRect(const unsigned int wid, const int x, const int y, /* Position. */ @@ -36,7 +36,7 @@ void window_addCust(const unsigned int wid, const int w, const int h, /* Size. */ char* name, const int border, void(*render) (double x, double y, double w, double h), - void(*mouse) (SDL_Event* event, double x, double y)); + void(*mouse) (unsigned int wid, SDL_Event* event, double x, double y)); void window_addInput(const unsigned int wid, const int x, const int y, @@ -48,11 +48,11 @@ void window_addImageArray(const unsigned int wid, const int w, const int h, /* Size. */ char* name, const int iw, const int ih, /* Name and images sizes. */ glTexture** tex, char** caption, int nelem, /* Elements. */ - void(*call)(char*)); + void(*call)(unsigned int, char*)); /* Modification. */ -void window_setAccept(const unsigned int wid, void(*fptr)(char*)); -void window_setCancel(const unsigned int wid, void(*cancel)(char*)); +void window_setAccept(const unsigned int wid, void(*fptr)(unsigned int, char*)); +void window_setCancel(const unsigned int wid, void(*cancel)(unsigned int, char*)); /* Text. */ void window_modifyText(const unsigned int wid, char* name, char* newstring); /* Button. */ @@ -77,6 +77,7 @@ int toolkit_getListPos(const unsigned int wid, char* name); glTexture* window_getImage(const unsigned int wid, char* name); /* Destroy window. */ +void window_close(unsigned int wid, char* str); void window_destroy(const unsigned int wid); void window_destroyWidget(unsigned wid, const char* wgtname);