Remove redundant canvas, next and prev members in the UI_DIALOG struct

This commit is contained in:
Chris Taylor 2011-12-18 20:41:31 +08:00
parent 4366adbea9
commit 9da79266ee
5 changed files with 28 additions and 86 deletions

View file

@ -1,5 +1,9 @@
D2X-Rebirth Changelog
20111218
--------
include/ui.h, ui/dialog.c, ui/gadget.c, ui/keypad.c: Remove redundant canvas, next and prev members in the UI_DIALOG struct
20111127
--------
arch/sdl/event.c: break out of loop in event_send() in case window_send_event() closed the window to prevent invalid read on memory

View file

@ -198,13 +198,10 @@ enum dialog_flags
typedef struct _ui_window {
struct window *wind;
int (*callback)(struct _ui_window *, struct d_event *, void *);
grs_canvas * canvas;
grs_canvas * oldcanvas;
grs_bitmap * background;
UI_GADGET * gadget;
UI_GADGET * keyboard_focus_gadget;
struct _ui_window * next;
struct _ui_window * prev;
void *userdata;
short x, y;
short width, height;
@ -281,6 +278,8 @@ extern void ui_mouse_hide();
extern void ui_mouse_show();
extern UI_DIALOG * ui_create_dialog( short x, short y, short w, short h, enum dialog_flags flags, int (*callback)(UI_DIALOG *, struct d_event *, void *), void *userdata );
extern struct window *ui_dialog_get_window(UI_DIALOG *dlg);
extern void ui_dialog_set_current_canvas(UI_DIALOG *dlg);
extern void ui_close_dialog( UI_DIALOG * dlg );
extern UI_GADGET * ui_gadget_add( UI_DIALOG * dlg, short kind, short x1, short y1, short x2, short y2 );

View file

@ -38,12 +38,9 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define D_WIDTH (dlg->width)
#define D_HEIGHT (dlg->height)
#define D_OLDCANVAS (dlg->oldcanvas)
#define D_CANVAS (dlg->canvas)
#define D_GADGET (dlg->gadget)
#define D_TEXT_X (dlg->text_x)
#define D_TEXT_Y (dlg->text_y)
#define D_NEXT (dlg->next)
#define D_PREV (dlg->prev)
#ifndef __MSDOS__
#define _disable()
@ -139,65 +136,6 @@ int ui_recorder_status()
return Record;
}
void add_window_to_end( UI_DIALOG * dlg )
{
if (LastWindow) {
D_PREV = LastWindow;
LastWindow->next = dlg;
}
LastWindow = dlg;
if (!FirstWindow)
FirstWindow = dlg;
}
void add_window_to_beg( UI_DIALOG * dlg )
{
if (FirstWindow) {
D_NEXT = FirstWindow;
FirstWindow->prev = dlg;
}
FirstWindow = dlg;
if (!LastWindow)
LastWindow = dlg;
}
// Add w1 after w2
void add_window_after( UI_DIALOG * w1, UI_DIALOG * w2 )
{
w1->prev = w2;
w1->next = w2->next;
w2->next = w1;
if (w1->next == NULL )
LastWindow = w1;
else
w1->next->prev = w1;
}
void close_all()
{
UI_DIALOG *sav, *dlg = LastWindow;
while(dlg)
{
sav = D_PREV;
ui_close_dialog(dlg);
dlg = sav;
}
}
void remove_window( UI_DIALOG * dlg )
{
if (D_NEXT)
D_NEXT->prev = D_PREV;
if (D_PREV)
D_PREV->next = D_NEXT;
if (FirstWindow == dlg )
FirstWindow = D_NEXT;
if (LastWindow == dlg )
LastWindow = D_PREV;
D_NEXT = D_PREV = NULL;
}
int ui_dialog_draw(UI_DIALOG *dlg)
{
return 0;
@ -266,11 +204,6 @@ UI_DIALOG * ui_create_dialog( short x, short y, short w, short h, enum dialog_fl
dlg = (UI_DIALOG *) d_malloc(sizeof(UI_DIALOG));
if (dlg==NULL) Error("Could not create dialog: Out of memory");
D_NEXT = NULL;
D_PREV = NULL;
add_window_to_end( dlg );
sw = grd_curscreen->sc_w;
sh = grd_curscreen->sc_h;
@ -314,14 +247,9 @@ UI_DIALOG * ui_create_dialog( short x, short y, short w, short h, enum dialog_fl
if (flags & DF_BORDER)
{
D_CANVAS = gr_create_sub_canvas( &(grd_curscreen->sc_canvas), x+BORDER_WIDTH, y+BORDER_WIDTH, req_w, req_h );
gr_set_current_canvas( NULL );
ui_draw_frame( x, y, x+w-1, y+h-1 );
}
else
D_CANVAS = gr_create_sub_canvas( &(grd_curscreen->sc_canvas), x, y, req_w, req_h );
gr_set_current_canvas( D_CANVAS );
dlg->callback = callback;
dlg->userdata = userdata;
@ -329,6 +257,8 @@ UI_DIALOG * ui_create_dialog( short x, short y, short w, short h, enum dialog_fl
x + ((flags & DF_BORDER) ? BORDER_WIDTH : 0),
y + ((flags & DF_BORDER) ? BORDER_WIDTH : 0),
req_w, req_h, (int (*)(window *, d_event *, void *)) ui_dialog_handler, dlg);
ui_dialog_set_current_canvas(dlg);
if (!dlg->wind)
{
ui_close_dialog(dlg);
@ -352,6 +282,16 @@ UI_DIALOG * ui_create_dialog( short x, short y, short w, short h, enum dialog_fl
}
window *ui_dialog_get_window(UI_DIALOG *dlg)
{
return dlg->wind;
}
void ui_dialog_set_current_canvas(UI_DIALOG *dlg)
{
gr_set_current_canvas(window_get_canvas(dlg->wind));
}
void ui_close_dialog( UI_DIALOG * dlg )
{
@ -370,14 +310,10 @@ void ui_close_dialog( UI_DIALOG * dlg )
gr_rect( D_X, D_Y, D_X+D_WIDTH-1, D_Y+D_HEIGHT-1 );
}
gr_free_sub_canvas( D_CANVAS );
gr_set_current_canvas( D_OLDCANVAS );
selected_gadget = NULL;
remove_window( dlg );
if (CurWindow==dlg)
CurWindow = NULL;
@ -714,7 +650,7 @@ void ui_dprintf( UI_DIALOG * dlg, char * format, ... )
va_start(args, format );
vsprintf(buffer,format,args);
gr_set_current_canvas( D_CANVAS );
ui_dialog_set_current_canvas( dlg );
ui_mouse_hide();
D_TEXT_X = gr_string( D_TEXT_X, D_TEXT_Y, buffer );
@ -729,7 +665,7 @@ void ui_dprintf_at( UI_DIALOG * dlg, short x, short y, char * format, ... )
va_start(args, format );
vsprintf(buffer,format,args);
gr_set_current_canvas( D_CANVAS );
ui_dialog_set_current_canvas( dlg );
ui_mouse_hide();
gr_string( x, y, buffer );

View file

@ -26,6 +26,7 @@ static char rcsid[] = "$Id: gadget.c,v 1.1.1.1 2006/03/17 19:52:21 zicodxx Exp $
#include "ui.h"
#include "event.h"
#include "mouse.h"
#include "window.h"
#include "error.h"
#include "key.h"
@ -63,7 +64,7 @@ UI_GADGET * ui_gadget_add( UI_DIALOG * dlg, short kind, short x1, short y1, shor
if ( x1==0 && x2==0 && y1==0 && y2== 0 )
gadget->canvas = NULL;
else
gadget->canvas = gr_create_sub_canvas( dlg->canvas, x1, y1, x2-x1+1, y2-y1+1 );
gadget->canvas = gr_create_sub_canvas( window_get_canvas(ui_dialog_get_window( dlg )), x1, y1, x2-x1+1, y2-y1+1 );
gadget->x1 = gadget->canvas->cv_bitmap.bm_x;
gadget->y1 = gadget->canvas->cv_bitmap.bm_y;
gadget->x2 = gadget->canvas->cv_bitmap.bm_x+x2-x1+1;
@ -126,7 +127,7 @@ void ui_gadget_delete_all( UI_DIALOG * dlg )
}
#if 1
#if 0
int is_under_another_window( UI_DIALOG * dlg, UI_GADGET * gadget )
{
UI_DIALOG * temp;
@ -170,7 +171,7 @@ int ui_mouse_on_gadget( UI_GADGET * gadget )
mouse_get_pos(&x, &y, &z);
if ((x >= gadget->x1) && (x <= gadget->x2-1) && (y >= gadget->y1) && (y <= gadget->y2-1) )
{
#if 1
#if 0 // check is no longer required - if it is under another window, that dialog's handler would have returned 1
if (is_under_another_window(CurWindow, gadget))
return 0;
#endif
@ -271,7 +272,9 @@ int ui_dialog_do_gadgets(UI_DIALOG * dlg, d_event *event)
tmp = dlg->gadget;
do
{
if (!is_under_another_window( CurWindow, tmp )) // won't be a necessary check when the rval is set properly
// If it is under another dialog, that dialog's handler would have returned 1 for mouse events.
// Key events are handled in a priority depending on the window ordering.
//if (!is_under_another_window( CurWindow, tmp ))
{
UI_DIALOG *curwindow_save=CurWindow;

View file

@ -95,7 +95,7 @@ void ui_pad_activate( UI_DIALOG * dlg, int x, int y )
bw = 56; bh = 30;
gr_set_current_canvas( dlg->canvas );
ui_dialog_set_current_canvas( dlg );
ui_draw_box_in( x, y, x+(bw*4)+10 + 200, y+(bh*5)+45 );
x += 5;