Remove redundant canvas, next and prev members in the UI_DIALOG struct
This commit is contained in:
parent
4366adbea9
commit
9da79266ee
|
@ -1,5 +1,9 @@
|
||||||
D2X-Rebirth Changelog
|
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
|
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
|
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
|
||||||
|
|
|
@ -198,13 +198,10 @@ enum dialog_flags
|
||||||
typedef struct _ui_window {
|
typedef struct _ui_window {
|
||||||
struct window *wind;
|
struct window *wind;
|
||||||
int (*callback)(struct _ui_window *, struct d_event *, void *);
|
int (*callback)(struct _ui_window *, struct d_event *, void *);
|
||||||
grs_canvas * canvas;
|
|
||||||
grs_canvas * oldcanvas;
|
grs_canvas * oldcanvas;
|
||||||
grs_bitmap * background;
|
grs_bitmap * background;
|
||||||
UI_GADGET * gadget;
|
UI_GADGET * gadget;
|
||||||
UI_GADGET * keyboard_focus_gadget;
|
UI_GADGET * keyboard_focus_gadget;
|
||||||
struct _ui_window * next;
|
|
||||||
struct _ui_window * prev;
|
|
||||||
void *userdata;
|
void *userdata;
|
||||||
short x, y;
|
short x, y;
|
||||||
short width, height;
|
short width, height;
|
||||||
|
@ -281,6 +278,8 @@ extern void ui_mouse_hide();
|
||||||
extern void ui_mouse_show();
|
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 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 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 );
|
extern UI_GADGET * ui_gadget_add( UI_DIALOG * dlg, short kind, short x1, short y1, short x2, short y2 );
|
||||||
|
|
92
ui/dialog.c
92
ui/dialog.c
|
@ -38,12 +38,9 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
||||||
#define D_WIDTH (dlg->width)
|
#define D_WIDTH (dlg->width)
|
||||||
#define D_HEIGHT (dlg->height)
|
#define D_HEIGHT (dlg->height)
|
||||||
#define D_OLDCANVAS (dlg->oldcanvas)
|
#define D_OLDCANVAS (dlg->oldcanvas)
|
||||||
#define D_CANVAS (dlg->canvas)
|
|
||||||
#define D_GADGET (dlg->gadget)
|
#define D_GADGET (dlg->gadget)
|
||||||
#define D_TEXT_X (dlg->text_x)
|
#define D_TEXT_X (dlg->text_x)
|
||||||
#define D_TEXT_Y (dlg->text_y)
|
#define D_TEXT_Y (dlg->text_y)
|
||||||
#define D_NEXT (dlg->next)
|
|
||||||
#define D_PREV (dlg->prev)
|
|
||||||
|
|
||||||
#ifndef __MSDOS__
|
#ifndef __MSDOS__
|
||||||
#define _disable()
|
#define _disable()
|
||||||
|
@ -139,65 +136,6 @@ int ui_recorder_status()
|
||||||
return Record;
|
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)
|
int ui_dialog_draw(UI_DIALOG *dlg)
|
||||||
{
|
{
|
||||||
return 0;
|
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));
|
dlg = (UI_DIALOG *) d_malloc(sizeof(UI_DIALOG));
|
||||||
if (dlg==NULL) Error("Could not create dialog: Out of memory");
|
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;
|
sw = grd_curscreen->sc_w;
|
||||||
sh = grd_curscreen->sc_h;
|
sh = grd_curscreen->sc_h;
|
||||||
|
|
||||||
|
@ -314,21 +247,18 @@ UI_DIALOG * ui_create_dialog( short x, short y, short w, short h, enum dialog_fl
|
||||||
|
|
||||||
if (flags & DF_BORDER)
|
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 );
|
gr_set_current_canvas( NULL );
|
||||||
ui_draw_frame( x, y, x+w-1, y+h-1 );
|
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->callback = callback;
|
||||||
dlg->userdata = userdata;
|
dlg->userdata = userdata;
|
||||||
dlg->wind = window_create(&grd_curscreen->sc_canvas,
|
dlg->wind = window_create(&grd_curscreen->sc_canvas,
|
||||||
x + ((flags & DF_BORDER) ? BORDER_WIDTH : 0),
|
x + ((flags & DF_BORDER) ? BORDER_WIDTH : 0),
|
||||||
y + ((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);
|
req_w, req_h, (int (*)(window *, d_event *, void *)) ui_dialog_handler, dlg);
|
||||||
|
ui_dialog_set_current_canvas(dlg);
|
||||||
|
|
||||||
if (!dlg->wind)
|
if (!dlg->wind)
|
||||||
{
|
{
|
||||||
ui_close_dialog(dlg);
|
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 )
|
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_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 );
|
gr_set_current_canvas( D_OLDCANVAS );
|
||||||
|
|
||||||
selected_gadget = NULL;
|
selected_gadget = NULL;
|
||||||
|
|
||||||
remove_window( dlg );
|
|
||||||
|
|
||||||
if (CurWindow==dlg)
|
if (CurWindow==dlg)
|
||||||
CurWindow = NULL;
|
CurWindow = NULL;
|
||||||
|
|
||||||
|
@ -714,7 +650,7 @@ void ui_dprintf( UI_DIALOG * dlg, char * format, ... )
|
||||||
va_start(args, format );
|
va_start(args, format );
|
||||||
vsprintf(buffer,format,args);
|
vsprintf(buffer,format,args);
|
||||||
|
|
||||||
gr_set_current_canvas( D_CANVAS );
|
ui_dialog_set_current_canvas( dlg );
|
||||||
|
|
||||||
ui_mouse_hide();
|
ui_mouse_hide();
|
||||||
D_TEXT_X = gr_string( D_TEXT_X, D_TEXT_Y, buffer );
|
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 );
|
va_start(args, format );
|
||||||
vsprintf(buffer,format,args);
|
vsprintf(buffer,format,args);
|
||||||
|
|
||||||
gr_set_current_canvas( D_CANVAS );
|
ui_dialog_set_current_canvas( dlg );
|
||||||
|
|
||||||
ui_mouse_hide();
|
ui_mouse_hide();
|
||||||
gr_string( x, y, buffer );
|
gr_string( x, y, buffer );
|
||||||
|
|
11
ui/gadget.c
11
ui/gadget.c
|
@ -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 "ui.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
|
#include "window.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
#include "key.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 )
|
if ( x1==0 && x2==0 && y1==0 && y2== 0 )
|
||||||
gadget->canvas = NULL;
|
gadget->canvas = NULL;
|
||||||
else
|
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->x1 = gadget->canvas->cv_bitmap.bm_x;
|
||||||
gadget->y1 = gadget->canvas->cv_bitmap.bm_y;
|
gadget->y1 = gadget->canvas->cv_bitmap.bm_y;
|
||||||
gadget->x2 = gadget->canvas->cv_bitmap.bm_x+x2-x1+1;
|
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 )
|
int is_under_another_window( UI_DIALOG * dlg, UI_GADGET * gadget )
|
||||||
{
|
{
|
||||||
UI_DIALOG * temp;
|
UI_DIALOG * temp;
|
||||||
|
@ -170,7 +171,7 @@ int ui_mouse_on_gadget( UI_GADGET * gadget )
|
||||||
mouse_get_pos(&x, &y, &z);
|
mouse_get_pos(&x, &y, &z);
|
||||||
if ((x >= gadget->x1) && (x <= gadget->x2-1) && (y >= gadget->y1) && (y <= gadget->y2-1) )
|
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))
|
if (is_under_another_window(CurWindow, gadget))
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -271,7 +272,9 @@ int ui_dialog_do_gadgets(UI_DIALOG * dlg, d_event *event)
|
||||||
tmp = dlg->gadget;
|
tmp = dlg->gadget;
|
||||||
do
|
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;
|
UI_DIALOG *curwindow_save=CurWindow;
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ void ui_pad_activate( UI_DIALOG * dlg, int x, int y )
|
||||||
|
|
||||||
bw = 56; bh = 30;
|
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 );
|
ui_draw_box_in( x, y, x+(bw*4)+10 + 200, y+(bh*5)+45 );
|
||||||
|
|
||||||
x += 5;
|
x += 5;
|
||||||
|
|
Loading…
Reference in a new issue