Skip to content

Commit

Permalink
Fix window appear and disappear interaction with clearing. Addresses #56
Browse files Browse the repository at this point in the history


Aplite requires an app chrome refresh hack that falsely triggers the
appear and disappear handlers. This causes all resources on-screen to be
deallocated. Fix the appear and disappear handling to only clear
resources when it is a true apppear or disappear.
  • Loading branch information
Meiguro committed May 15, 2015
1 parent 3af9382 commit 94a3c13
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 16 deletions.
8 changes: 4 additions & 4 deletions src/simply/simply_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,10 +383,10 @@ static void window_appear(Window *window) {

static void window_disappear(Window *window) {
SimplyMenu *self = window_get_user_data(window);
simply_window_disappear(&self->window);

simply_res_clear(self->window.simply->res);
simply_menu_clear(self);
if (simply_window_disappear(&self->window)) {
simply_res_clear(self->window.simply->res);
simply_menu_clear(self);
}
}

static void window_unload(Window *window) {
Expand Down
8 changes: 4 additions & 4 deletions src/simply/simply_stage.c
Original file line number Diff line number Diff line change
Expand Up @@ -447,10 +447,10 @@ static void window_appear(Window *window) {

static void window_disappear(Window *window) {
SimplyStage *self = window_get_user_data(window);
simply_window_disappear(&self->window);

simply_res_clear(self->window.simply->res);
simply_stage_clear(self);
if (simply_window_disappear(&self->window)) {
simply_res_clear(self->window.simply->res);
simply_stage_clear(self);
}
}

static void window_unload(Window *window) {
Expand Down
6 changes: 3 additions & 3 deletions src/simply/simply_ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,9 +317,9 @@ static void window_appear(Window *window) {

static void window_disappear(Window *window) {
SimplyUi *self = window_get_user_data(window);
simply_window_disappear(&self->window);

simply_res_clear(self->window.simply->res);
if (simply_window_disappear(&self->window)) {
simply_res_clear(self->window.simply->res);
}
}

static void window_unload(Window *window) {
Expand Down
18 changes: 15 additions & 3 deletions src/simply/simply_window.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,18 @@ void simply_window_set_scrollable(SimplyWindow *self, bool is_scrollable) {
}

void simply_window_set_fullscreen(SimplyWindow *self, bool is_fullscreen) {
bool changed = false;
if (is_fullscreen && self->is_status_bar) {
status_bar_layer_remove_from_window(self->window, self->status_bar_layer);
self->is_status_bar = false;
changed = true;
} else if (!is_fullscreen && !self->is_status_bar) {
status_bar_layer_add_to_window(self->window, self->status_bar_layer);
self->is_status_bar = true;
changed = true;
}

if (!self->layer) {
if (!changed || !self->layer) {
return;
}

Expand Down Expand Up @@ -267,16 +270,25 @@ void simply_window_load(SimplyWindow *self) {
simply_window_set_action_bar(self, self->is_action_bar);
}

void simply_window_appear(SimplyWindow *self) {
bool simply_window_appear(SimplyWindow *self) {
if (!self->id) {
return false;
}
simply_window_stack_send_show(self->simply->window_stack, self);
return true;
}

void simply_window_disappear(SimplyWindow *self) {
bool simply_window_disappear(SimplyWindow *self) {
if (!self->id) {
return false;
}
simply_window_stack_send_hide(self->simply->window_stack, self);

#ifdef PBL_PLATFORM_BASALT
simply_window_set_fullscreen(self, true);
#endif

return true;
}

void simply_window_unload(SimplyWindow *self) {
Expand Down
4 changes: 2 additions & 2 deletions src/simply/simply_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ void simply_window_hide(SimplyWindow *self);

void simply_window_load(SimplyWindow *self);
void simply_window_unload(SimplyWindow *self);
void simply_window_appear(SimplyWindow *self);
void simply_window_disappear(SimplyWindow *self);
bool simply_window_appear(SimplyWindow *self);
bool simply_window_disappear(SimplyWindow *self);

void simply_window_single_click_handler(ClickRecognizerRef recognizer, void *context);

Expand Down

0 comments on commit 94a3c13

Please sign in to comment.