Redo all the evil event handling. We still do not resize properly, but I am

getting closer.
This commit is contained in:
pavlov%pavlov.net 1998-12-23 03:31:15 +00:00
Родитель 43512d12df
Коммит 98f76e2272
24 изменённых файлов: 318 добавлений и 339 удалений

Просмотреть файл

@ -131,7 +131,7 @@ PRBool nsButton::OnPaint(nsPaintEvent &aEvent)
return PR_FALSE;
}
PRBool nsButton::OnResize(nsSizeEvent &aEvent)
PRBool nsButton::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -42,7 +42,7 @@ public:
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
virtual PRBool OnPaint(nsPaintEvent &aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
protected:
NS_METHOD CreateNative(GtkWidget *parentWindow);

Просмотреть файл

@ -155,7 +155,7 @@ PRBool nsCheckButton::OnPaint(nsPaintEvent &aEvent)
return PR_FALSE;
}
PRBool nsCheckButton::OnResize(nsSizeEvent &aEvent)
PRBool nsCheckButton::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -47,7 +47,7 @@ public:
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
virtual PRBool OnPaint(nsPaintEvent &aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
protected:
NS_IMETHOD nsCheckButton::CreateNative(GtkWidget *parentWindow);

Просмотреть файл

@ -301,7 +301,7 @@ PRBool nsComboBox::OnPaint(nsPaintEvent &aEvent)
return PR_FALSE;
}
PRBool nsComboBox::OnResize(nsSizeEvent &aEvent)
PRBool nsComboBox::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -52,7 +52,7 @@ public:
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
virtual PRBool OnPaint(nsPaintEvent & aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
// nsIComboBox interface
NS_IMETHOD SetMultipleSelection(PRBool aMultipleSelections);

Просмотреть файл

@ -139,7 +139,7 @@ PRBool nsDialog::OnPaint(nsPaintEvent &aEvent)
return PR_FALSE;
}
PRBool nsDialog::OnResize(nsSizeEvent &aEvent)
PRBool nsDialog::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -43,7 +43,7 @@ public:
NS_IMETHOD GetLabel(nsString& aBuffer);
virtual PRBool OnPaint(nsPaintEvent & aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
//virtual void PreCreateWidget(nsWidgetInitData *aInitData);

Просмотреть файл

@ -122,7 +122,7 @@ struct nsKeyConverter nsKeycodes[] = {
};
void nsGtkWidget_InitNSKeyEvent(int aEventType, nsKeyEvent& aKeyEvent,
GtkWidget *w, gpointer p, GdkEvent * event);
GtkWidget *w, gpointer p, GdkEventKey * event);
int nsConvertKey(int keysym)
{
@ -137,199 +137,243 @@ int nsConvertKey(int keysym)
}
//==============================================================
void nsGtkWidget_InitNSEvent(GdkEvent *aGev,
void InitConfigureEvent(GdkEventConfigure *aGEC,
gpointer p,
nsGUIEvent &anEvent,
nsSizeEvent &anEvent,
PRUint32 aEventType)
{
GdkEventButton *anXEv = (GdkEventButton*)aGev;
anEvent.message = aEventType;
anEvent.widget = (nsWidget *) p;
anEvent.eventStructType = NS_GUI_EVENT;
NS_ADDREF(anEvent.widget);
if (anXEv != NULL) {
anEvent.point.x = nscoord(anXEv->x);
anEvent.point.y = nscoord(anXEv->y);
anEvent.eventStructType = NS_SIZE_EVENT;
if (aGEC != NULL) {
nsRect rect(aGEC->x, aGEC->y, aGEC->width, aGEC->height);
anEvent.windowSize = ▭
anEvent.point.x = aGEC->x;
anEvent.point.y = aGEC->y;
anEvent.mWinWidth = aGEC->width;
anEvent.mWinHeight = aGEC->height;
}
anEvent.time = anXEv->time;
// this usually returns 0
anEvent.time = gdk_event_get_time((GdkEvent*)aGEC);
}
//==============================================================
void nsGtkWidget_InitNSMouseEvent(GdkEvent *aGev,
void InitMouseEvent(GdkEventButton *aGEB,
gpointer p,
nsMouseEvent &anEvent,
PRUint32 aEventType)
{
GdkEventButton *anXEv = (GdkEventButton*)aGev;
anEvent.message = aEventType;
anEvent.widget = (nsWidget *) p;
NS_ADDREF(anEvent.widget);
// Do base initialization
nsGtkWidget_InitNSEvent(aGev, p, anEvent, aEventType);
if (anXEv != NULL) { // Do Mouse Event specific intialization
anEvent.time = anXEv->time;
anEvent.isShift = (anXEv->state & ShiftMask) ? PR_TRUE : PR_FALSE;
anEvent.isControl = (anXEv->state & ControlMask) ? PR_TRUE : PR_FALSE;
anEvent.isAlt = (anXEv->state & Mod1Mask) ? PR_TRUE : PR_FALSE;
// anEvent.clickCount = anXEv->button; //XXX Fix for double-clicks
anEvent.clickCount = 1; //XXX Fix for double-clicks
anEvent.eventStructType = NS_MOUSE_EVENT;
if (aGEB != NULL) {
anEvent.point.x = nscoord(aGEB->x);
anEvent.point.y = nscoord(aGEB->y);
anEvent.isShift = (aGEB->state & ShiftMask) ? PR_TRUE : PR_FALSE;
anEvent.isControl = (aGEB->state & ControlMask) ? PR_TRUE : PR_FALSE;
anEvent.isAlt = (aGEB->state & Mod1Mask) ? PR_TRUE : PR_FALSE;
anEvent.time = aGEB->time;
}
}
//==============================================================
void InitExposeEvent(GdkEventExpose *aGEE,
gpointer p,
nsPaintEvent &anEvent,
PRUint32 aEventType)
{
anEvent.message = aEventType;
anEvent.widget = (nsWidget *) p;
NS_ADDREF(anEvent.widget);
anEvent.eventStructType = NS_PAINT_EVENT;
if (aGEE != NULL) {
nsRect rect(aGEE->area.x, aGEE->area.y, aGEE->area.width, aGEE->area.height);
anEvent.rect = ▭
anEvent.time = gdk_event_get_time((GdkEvent*)aGEE);
}
}
//==============================================================
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif
void InitMotionEvent(GdkEventMotion *aGEM,
gpointer p,
nsMouseEvent &anEvent,
PRUint32 aEventType)
{
anEvent.message = aEventType;
anEvent.widget = (nsWidget *) p;
NS_ADDREF(anEvent.widget);
#define INTERSECTS(r1_x1,r1_x2,r1_y1,r1_y2,r2_x1,r2_x2,r2_y1,r2_y2) \
!((r2_x2 <= r1_x1) ||\
(r2_y2 <= r1_y1) ||\
(r2_x1 >= r1_x2) ||\
(r2_y1 >= r1_y2))
anEvent.eventStructType = NS_MOUSE_EVENT;
if (aGEM != NULL) {
anEvent.point.x = nscoord(aGEM->x);
anEvent.point.y = nscoord(aGEM->y);
anEvent.time = aGEM->time;
}
}
//==============================================================
typedef struct COLLAPSE_INFO {
Window win;
nsRect *r;
} CollapseInfo;
void InitCrossingEvent(GdkEventCrossing *aGEC,
gpointer p,
nsMouseEvent &anEvent,
PRUint32 aEventType)
{
anEvent.message = aEventType;
anEvent.widget = (nsWidget *) p;
NS_ADDREF(anEvent.widget);
anEvent.eventStructType = NS_MOUSE_EVENT;
if (aGEC != NULL) {
anEvent.point.x = nscoord(aGEC->x);
anEvent.point.y = nscoord(aGEC->y);
anEvent.time = aGEC->time;
}
}
//==============================================================
void InitKeyEvent(GdkEventKey *aGEK,
gpointer p,
nsKeyEvent &anEvent,
PRUint32 aEventType)
{
anEvent.message = aEventType;
anEvent.widget = (nsWidget *) p;
NS_ADDREF(anEvent.widget);
anEvent.eventStructType = NS_KEY_EVENT;
if (aGEK != NULL) {
anEvent.keyCode = nsConvertKey(aGEK->keyval) & 0x00FF;
anEvent.time = aGEK->time;
anEvent.isShift = (aGEK->state & ShiftMask) ? PR_TRUE : PR_FALSE;
anEvent.isControl = (aGEK->state & ControlMask) ? PR_TRUE : PR_FALSE;
anEvent.isAlt = (aGEK->state & Mod1Mask) ? PR_TRUE : PR_FALSE;
anEvent.time = aGEK->time;
}
}
/*==============================================================
==============================================================
==============================================================
==============================================================*/
gint handle_configure_event(GtkWidget *w, GdkEventConfigure *event, gpointer p)
{
nsSizeEvent sevent;
InitConfigureEvent(event, p, sevent, NS_SIZE);
nsRect rect(event->x, event->y, event->width, event->height);
nsWindow *win = (nsWindow *)p;
win->OnResize(rect);
return PR_FALSE;
}
gint handle_expose_event(GtkWidget *w, GdkEventExpose *event, gpointer p)
{
if (event->type == GDK_NO_EXPOSE)
return PR_FALSE;
nsPaintEvent pevent;
InitExposeEvent(event, p, pevent, NS_PAINT);
nsWindow *win = (nsWindow *)p;
win->OnPaint(pevent);
return PR_FALSE;
}
//==============================================================
gint handle_button_press_event(GtkWidget *w, GdkEventButton * event, gpointer p)
{
nsMouseEvent mevent;
int b = NS_MOUSE_LEFT_BUTTON_DOWN;
#if 0
static Bool checkForExpose(Display *dpy, XEvent *evt, XtPointer client_data)
switch (event->button)
{
CollapseInfo *cinfo = (CollapseInfo*)client_data;
if ((evt->type == Expose && evt->xexpose.window == cinfo->win &&
INTERSECTS(cinfo->r->x, cinfo->r->width, cinfo->r->y, cinfo->r->height,
evt->xexpose.x, evt->xexpose.y,
evt->xexpose.x + evt->xexpose.width,
evt->xexpose.y + evt->xexpose.height)) ||
(evt->type == GraphicsExpose && evt->xgraphicsexpose.drawable == cinfo->win &&
INTERSECTS(cinfo->r->x, cinfo->r->width, cinfo->r->y, cinfo->r->height,
evt->xgraphicsexpose.x, evt->xgraphicsexpose.y,
evt->xgraphicsexpose.x + evt->xgraphicsexpose.width,
evt->xgraphicsexpose.y + evt->xgraphicsexpose.height))) {
return True;
}
return False;
case GDK_BUTTON_PRESS:
b = NS_MOUSE_LEFT_BUTTON_DOWN;
break;
case GDK_2BUTTON_PRESS:
break;
case GDK_3BUTTON_PRESS:
b = NS_MOUSE_RIGHT_BUTTON_DOWN;
break;
}
#endif
InitMouseEvent(event, p, mevent, b);
//==============================================================
gint nsGtkWidget_ExposureMask_EventHandler(GtkWidget *w, GdkEventExpose *event, gpointer p)
{
nsWindow *widgetWindow = (nsWindow *)p;
nsPaintEvent pevent;
nsRect rect;
nsGtkWidget_InitNSEvent((GdkEvent*)event, p, pevent, NS_PAINT);
pevent.rect = (nsRect *)&rect;
rect.x = event->area.x;
rect.y = event->area.y;
rect.width = event->area.width;
rect.height = event->area.height;
if (event->type == GDK_NO_EXPOSE) {
return PR_FALSE;
}
/* FIXME
Display* display = XtDisplay(w);
Window window = XtWindow(w);
XEvent xev;
XSync(display, PR_FALSE);
while (XCheckTypedWindowEvent(display, window, Expose, &xev) == PR_TRUE) {
rect.x = xev.xexpose.x;
rect.y = xev.xexpose.y;
rect.width = xev.xexpose.width;
rect.height = xev.xexpose.height;
}
*/
widgetWindow->OnPaint(pevent);
nsWindow *win = (nsWindow *)p;
win->DispatchMouseEvent(mevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_ButtonPressMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
gint handle_button_release_event(GtkWidget *w, GdkEventButton * event, gpointer p)
{
nsWindow *widgetWindow = (nsWindow *)p;
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_LEFT_BUTTON_DOWN);
widgetWindow->DispatchMouseEvent(mevent);
InitMouseEvent(event, p, mevent, NS_MOUSE_LEFT_BUTTON_UP);
nsWindow *win = (nsWindow *)p;
win->DispatchMouseEvent(mevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_ButtonReleaseMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
gint handle_motion_notify_event(GtkWidget *w, GdkEventMotion * event, gpointer p)
{
nsWindow *widgetWindow = (nsWindow *)p;
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_LEFT_BUTTON_UP);
widgetWindow->DispatchMouseEvent(mevent);
InitMotionEvent(event, p, mevent, NS_MOUSE_MOVE);
nsWindow *win = (nsWindow *)p;
win->DispatchMouseEvent(mevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_ButtonMotionMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
gint handle_enter_notify_event(GtkWidget *w, GdkEventCrossing * event, gpointer p)
{
nsPaintEvent pevent;
nsWindow *widgetWindow = (nsWindow *)p;
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_MOVE);
widgetWindow->DispatchMouseEvent(mevent);
InitCrossingEvent(event, p, mevent, NS_MOUSE_ENTER);
nsWindow *win = (nsWindow *)p;
win->DispatchMouseEvent(mevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_MotionMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
gint handle_leave_notify_event(GtkWidget *w, GdkEventCrossing * event, gpointer p)
{
nsWindow *widgetWindow = (nsWindow *)p;
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_MOVE);
widgetWindow->DispatchMouseEvent(mevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_EnterMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
{
nsWindow *widgetWindow = (nsWindow *)p;
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_ENTER);
widgetWindow->DispatchMouseEvent(mevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_LeaveMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
{
if (DBG) fprintf(stderr, "***************** nsGtkWidget_LeaveMask_EventHandler\n");
nsWindow * widgetWindow = (nsWindow *)p;
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_EXIT);
widgetWindow->DispatchMouseEvent(mevent);
InitCrossingEvent(event, p, mevent, NS_MOUSE_EXIT);
nsWindow *win = (nsWindow *)p;
win->DispatchMouseEvent(mevent);
return PR_FALSE;
}
#if 0
//==============================================================
gint nsGtkWidget_Focus_Callback(GtkWidget *w, gpointer p)
{
nsWindow *widgetWindow = (nsWindow*)gtk_object_get_user_data(GTK_OBJECT(w));
#if 0
nsWindow * widgetWindow = (nsWindow *) p ;
XmAnyCallbackStruct * cbs = (XmAnyCallbackStruct*)call_data;
@ -337,30 +381,30 @@ gint nsGtkWidget_Focus_Callback(GtkWidget *w, gpointer p)
nsGtkWidget_InitNSEvent(cbs->event, p, event,
cbs->reason == XmCR_FOCUS?NS_GOTFOCUS:NS_LOSTFOCUS);
widgetWindow->DispatchFocus(event);
#endif
return PR_FALSE;
}
#endif
#if 0
//==============================================================
gint nsGtkWidget_Toggle_Callback(GtkWidget *w, gpointer p)
{
nsWindow *widgetWindow = (nsWindow*)gtk_object_get_user_data(GTK_OBJECT(w));
#if 0
nsWindow * widgetWindow = (nsWindow *) p ;
if (DBG) fprintf(stderr, "***************** nsGtkWidget_Scrollbar_Callback\n");
nsScrollbarEvent sevent;
XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data;
#endif
return PR_FALSE;
}
#endif
#if 0
//==============================================================
gint nsGtkWidget_CheckButton_Toggle_Callback(GtkWidget *w, gpointer p)
{
#if 0
nsCheckButton *checkBtn = (nsCheckButton*)gtk_object_get_user_data(GTK_OBJECT(w));
if (GTK_TOGGLE_BUTTON(w)->active)
checkBtn->Armed();
@ -368,30 +412,30 @@ gint nsGtkWidget_CheckButton_Toggle_Callback(GtkWidget *w, gpointer p)
checkBtn->DisArmed();
return PR_FALSE;
#endif
}
#endif
#if 0
//==============================================================
gint nsGtkWidget_RadioButton_ArmCallback(GtkWidget *w, gpointer p)
{
nsWindow *widgetWindow = (nsWindow*)gtk_object_get_user_data(GTK_OBJECT(w));
#if 0
nsRadioButton * radioBtn = (nsRadioButton *) p ;
XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data;
radioBtn->Armed();
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(cbs->event, p, mevent, NS_MOUSE_LEFT_BUTTON_DOWN);
radioBtn->DispatchMouseEvent(mevent);
#endif
return PR_FALSE;
}
#endif
#if 0
//==============================================================
gint nsGtkWidget_RadioButton_DisArmCallback(GtkWidget *w, gpointer p)
{
nsWindow *widgetWindow = (nsWindow*)gtk_object_get_user_data(GTK_OBJECT(w));
#if 0
nsRadioButton * radioBtn = (nsRadioButton *) p ;
nsScrollbarEvent sevent;
XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data;
@ -399,18 +443,23 @@ gint nsGtkWidget_RadioButton_DisArmCallback(GtkWidget *w, gpointer p)
nsMouseEvent mevent;
nsGtkWidget_InitNSMouseEvent(cbs->event, p, mevent, NS_MOUSE_LEFT_BUTTON_UP);
radioBtn->DispatchMouseEvent(mevent);
#endif
return PR_FALSE;
}
#endif
//==============================================================
gint nsGtkWidget_Scrollbar_Callback(GtkWidget *w, gpointer p)
void handle_scrollbar_value_changed(GtkAdjustment *adj, gpointer p)
{
nsScrollbar *widget = (nsScrollbar*) p;
nsScrollbarEvent sevent;
sevent.message = NS_SCROLLBAR_POS;
sevent.widget = (nsWidget *) p;
sevent.eventStructType = NS_MOUSE_EVENT;
widget->OnScroll(sevent, adj->value);
/* FIXME we need to set point.* from the event stuff. */
#if 0
nsWindow * widgetWindow = (nsWindow *) p ;
XmScrollBarCallbackStruct * cbs = (XmScrollBarCallbackStruct*) call_data;
@ -454,78 +503,30 @@ gint nsGtkWidget_Scrollbar_Callback(GtkWidget *w, gpointer p)
break;
}
#endif
sevent.message = NS_SCROLLBAR_POS;
sevent.widget = (nsWidget *) p;
widget->OnScroll(sevent, GTK_ADJUSTMENT(w)->value);
return 0; /* XXX */
}
//==============================================================
gint nsGtkWidget_Expose_Callback(GtkWidget *w, gpointer p)
{
nsWindow *widgetWindow = (nsWindow*)gtk_object_get_user_data(GTK_OBJECT(w));
#if 0
nsWindow * widgetWindow = (nsWindow *) p ;
if (widgetWindow == nsnull) {
return;
}
XmDrawingAreaCallbackStruct * cbs = (XmDrawingAreaCallbackStruct *)call_data;
XEvent * event = cbs->event;
nsPaintEvent pevent;
nsRect rect;
nsGtkWidget_InitNSEvent(event, p, pevent, NS_PAINT);
pevent.rect = (nsRect *)&rect;
widgetWindow->OnPaint(pevent);
#endif
return 0; /* XXX */
}
//==============================================================
gint nsGtkWidget_Text_Callback(GtkWidget *w, GdkEvent* event, gpointer p)
gint handle_key_release_event(GtkWidget *w, GdkEventKey* event, gpointer p)
{
nsKeyEvent kevent;
nsGtkWidget_InitNSKeyEvent(NS_KEY_UP, kevent, w, p, event);
nsWindow * widgetWindow = (nsWindow *) p ;
widgetWindow->OnKey(NS_KEY_UP, kevent.keyCode, &kevent);
InitKeyEvent(event, p, kevent, NS_KEY_UP);
#if 0
nsWindow * widgetWindow = (nsWindow *) p ;
int len;
XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct *) call_data;
PasswordData * data;
XtVaGetValues(w, XmNuserData, &data, NULL);
if (data == NULL || data->mIgnore) {
return;
nsWindow * win = (nsWindow *) p;
win->OnKey(kevent);
return PR_FALSE;
}
if (cbs->reason == XmCR_ACTIVATE) {
printf ("Password: %s\n", data->mPassword.ToNewCString());
return;
}
//==============================================================
gint handle_key_press_event(GtkWidget *w, GdkEventKey* event, gpointer p)
{
nsKeyEvent kevent;
InitKeyEvent(event, p, kevent, NS_KEY_DOWN);
if (cbs->startPos < cbs->currInsert) { /* backspace */
cbs->endPos = data->mPassword.Length(); /* delete from here to end */
data->mPassword.SetLength(cbs->startPos); /* backspace--terminate */
return;
}
nsWindow * win = (nsWindow *) p;
win->OnKey(kevent);
if (cbs->startPos == cbs->currInsert && cbs->currInsert < data->mPassword.Length()) {
nsString insStr(cbs->text->ptr);
data->mPassword.Insert(insStr, cbs->currInsert, strlen(cbs->text->ptr));
} else if (cbs->startPos == cbs->currInsert && cbs->endPos != cbs->startPos) {
data->mPassword.SetLength(cbs->startPos);
printf("Setting Length [%s] at %d\n", cbs->text->ptr, cbs->currInsert);
} else if (cbs->startPos == cbs->currInsert) { /* backspace */
data->mPassword.Append(cbs->text->ptr);
}
for (len = 0; len < cbs->text->length; len++)
cbs->text->ptr[len] = '*';
#endif
return 0; /* XXX */
return PR_FALSE;
}
//==============================================================
@ -556,45 +557,6 @@ gint nsGtkWidget_FSBOk_Callback(GtkWidget *w, gpointer p)
return PR_FALSE;
}
//==============================================================
void nsGtkWidget_InitNSKeyEvent(int aEventType, nsKeyEvent& aKeyEvent,
GtkWidget *w, gpointer p, GdkEvent * event)
{
nsWindow * widgetWindow = (nsWindow *) p ;
char *res;
nsGtkWidget_InitNSEvent(event, p, aKeyEvent, aEventType);
GdkEventKey *eventKey = (GdkEventKey*)event;
aKeyEvent.keyCode = nsConvertKey(eventKey->keyval) & 0x00FF;
aKeyEvent.time = eventKey->time;
aKeyEvent.isShift = (eventKey->state & ShiftMask) ? PR_TRUE : PR_FALSE;
aKeyEvent.isControl = (eventKey->state & ControlMask) ? PR_TRUE : PR_FALSE;
aKeyEvent.isAlt = (eventKey->state & Mod1Mask) ? PR_TRUE : PR_FALSE;
}
//==============================================================
gint nsGtkWidget_KeyPressMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
{
nsKeyEvent kevent;
nsGtkWidget_InitNSKeyEvent(NS_KEY_DOWN, kevent, w, p, event);
nsWindow * widgetWindow = (nsWindow *) p ;
widgetWindow->OnKey(NS_KEY_DOWN, kevent.keyCode, &kevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_KeyReleaseMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p)
{
nsKeyEvent kevent;
nsGtkWidget_InitNSKeyEvent(NS_KEY_UP, kevent, w, p, event);
nsWindow * widgetWindow = (nsWindow *) p ;
widgetWindow->OnKey(NS_KEY_UP, kevent.keyCode, &kevent);
return PR_FALSE;
}
//==============================================================
gint nsGtkWidget_Menu_Callback(GtkWidget *w, gpointer p)
{
@ -615,38 +577,3 @@ gint nsGtkWidget_Menu_Callback(GtkWidget *w, gpointer p)
return PR_FALSE;
}
gint nsGtkWidget_Resize_EventHandler(GtkWidget *w, GtkAllocation *allocation, gpointer data)
{
nsWindow *win = (nsWindow*)data;
nsRect winBounds;
win->GetBounds(winBounds);
g_print("resize event handler:\n\tallocation->w=%d allocation->h=%d window.w=%d window.h=%d\n",
allocation->width, allocation->height, winBounds.width, winBounds.height);
if (winBounds.width != allocation->width ||
winBounds.height != allocation->height) {
g_print("\tAllocation != current window bounds. Resize.\n");
nsRect sizeBounds;
sizeBounds.x = 0;
sizeBounds.y = 0;
winBounds.width = sizeBounds.width = allocation->width;
winBounds.height = sizeBounds.height = allocation->height;
nsSizeEvent sizeEvent;
sizeEvent.eventStructType = NS_SIZE_EVENT;
sizeEvent.message = NS_SIZE;
sizeEvent.point.x = winBounds.x;
sizeEvent.point.y = winBounds.y;
sizeEvent.time = PR_IntervalNow();
sizeEvent.widget = win;
sizeEvent.nativeMsg = nsnull;
sizeEvent.windowSize = &sizeBounds;
sizeEvent.mWinWidth = winBounds.width;
sizeEvent.mWinHeight = winBounds.height;
win->OnResize(sizeEvent);
win->SetBounds(winBounds);
}
return PR_FALSE;
}

Просмотреть файл

@ -24,16 +24,19 @@
class nsIWidget;
class nsIMenuItem;
gint nsGtkWidget_KeyPressMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p);
gint nsGtkWidget_KeyReleaseMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p);
gint nsGtkWidget_ExposureMask_EventHandler(GtkWidget * w, GdkEventExpose * event, gpointer p);
gint nsGtkWidget_ButtonPressMask_EventHandler(GtkWidget * w, GdkEvent * event, gpointer p);
gint nsGtkWidget_ButtonReleaseMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p);
gint nsGtkWidget_ButtonMotionMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p);
gint nsGtkWidget_MotionMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p);
gint nsGtkWidget_EnterMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p);
gint nsGtkWidget_LeaveMask_EventHandler(GtkWidget *w, GdkEvent * event, gpointer p);
gint nsGtkWidget_Resize_EventHandler(GtkWidget *w, GtkAllocation *allocation, gpointer data);
gint handle_configure_event(GtkWidget *w, GdkEventConfigure *event, gpointer p);
gint handle_expose_event(GtkWidget *w, GdkEventExpose *event, gpointer p);
gint handle_button_press_event(GtkWidget *w, GdkEventButton * event, gpointer p);
gint handle_button_release_event(GtkWidget *w, GdkEventButton * event, gpointer p);
gint handle_motion_notify_event(GtkWidget *w, GdkEventMotion * event, gpointer p);
gint handle_enter_notify_event(GtkWidget *w, GdkEventCrossing * event, gpointer p);
gint handle_leave_notify_event(GtkWidget *w, GdkEventCrossing * event, gpointer p);
gint handle_key_release_event(GtkWidget *w, GdkEventKey* event, gpointer p);
gint handle_key_press_event(GtkWidget *w, GdkEventKey* event, gpointer p);
void handle_scrollbar_value_changed(GtkAdjustment *adjustment, gpointer p);
//----------------------------------------------------
@ -42,14 +45,15 @@ gint nsGtkWidget_FSBOk_Callback(GtkWidget *w, gpointer p);
//----------------------------------------------------
gint nsGtkWidget_Focus_Callback(GtkWidget *w, gpointer p);
gint nsGtkWidget_Scrollbar_Callback(GtkWidget *w, gpointer p);
gint CheckButton_Toggle_Callback(GtkWidget *w, gpointer p);
gint nsGtkWidget_RadioButton_ArmCallback(GtkWidget *w, gpointer p);
gint nsGtkWidget_RadioButton_DisArmCallback(GtkWidget *w, gpointer p);
gint nsGtkWidget_Text_Callback(GtkWidget *w, GdkEvent* event, gpointer p);
gint nsGtkWidget_Text_Callback(GtkWidget *w, GdkEventKey* event, gpointer p);
gint nsGtkWidget_Expose_Callback(GtkWidget *w, gpointer p);
gint nsGtkWidget_Refresh_Callback(gpointer call_data);

Просмотреть файл

@ -174,7 +174,7 @@ PRBool nsLabel::OnPaint(nsPaintEvent &aEvent)
return PR_FALSE;
}
PRBool nsLabel::OnResize(nsSizeEvent &aEvent)
PRBool nsLabel::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -49,7 +49,7 @@ public:
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
virtual PRBool OnPaint(nsPaintEvent &aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
protected:
NS_METHOD CreateNative(GtkWidget *parentWindow);

Просмотреть файл

@ -375,7 +375,7 @@ PRBool nsListBox::OnPaint(nsPaintEvent &aEvent)
return PR_FALSE;
}
PRBool nsListBox::OnResize(nsSizeEvent &aEvent)
PRBool nsListBox::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -43,7 +43,7 @@ public:
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
virtual PRBool OnPaint(nsPaintEvent & aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
// nsIListBox interface

Просмотреть файл

@ -156,7 +156,7 @@ PRBool nsRadioButton::OnPaint(nsPaintEvent &aEvent)
return PR_FALSE;
}
PRBool nsRadioButton::OnResize(nsSizeEvent &aEvent)
PRBool nsRadioButton::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -48,7 +48,7 @@ public:
// nsIRadioButton part
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
virtual PRBool OnPaint(nsPaintEvent &aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
// These are needed to Override the auto check behavior

Просмотреть файл

@ -74,7 +74,7 @@ NS_METHOD nsScrollbar::CreateNative (GtkWidget * parentWindow)
gtk_signal_connect (GTK_OBJECT (mAdjustment),
"value_changed",
GTK_SIGNAL_FUNC (nsGtkWidget_Scrollbar_Callback),
GTK_SIGNAL_FUNC (handle_scrollbar_value_changed),
this);
return NS_OK;
@ -250,7 +250,7 @@ PRBool nsScrollbar::OnPaint (nsPaintEvent & aEvent)
}
PRBool nsScrollbar::OnResize (nsSizeEvent & aEvent)
PRBool nsScrollbar::OnResize (nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -54,7 +54,7 @@ public:
virtual PRBool OnPaint(nsPaintEvent & aEvent);
virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
protected:
NS_IMETHOD CreateNative(GtkWidget *parentWindow);

Просмотреть файл

@ -97,7 +97,7 @@ PRBool nsTextAreaWidget::OnPaint(nsPaintEvent & aEvent)
//--------------------------------------------------------------
PRBool nsTextAreaWidget::OnResize(nsSizeEvent &aEvent)
PRBool nsTextAreaWidget::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -40,7 +40,7 @@ public:
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
virtual PRBool OnPaint(nsPaintEvent & aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
protected:
NS_METHOD CreateNative(GtkWidget *parentWindow);

Просмотреть файл

@ -61,7 +61,7 @@ NS_METHOD nsTextWidget::CreateNative(GtkWidget *parentWindow)
gtk_widget_set_name(mWidget, "nsTextWidget");
gtk_signal_connect(GTK_OBJECT(mWidget),
"key_release_event",
GTK_SIGNAL_FUNC(nsGtkWidget_Text_Callback),
GTK_SIGNAL_FUNC(handle_key_release_event),
this);
gtk_widget_show(mWidget);
return NS_OK;
@ -98,7 +98,7 @@ PRBool nsTextWidget::OnPaint(nsPaintEvent & aEvent)
//--------------------------------------------------------------
PRBool nsTextWidget::OnResize(nsSizeEvent &aEvent)
PRBool nsTextWidget::OnResize(nsRect &aWindowRect)
{
return PR_FALSE;
}

Просмотреть файл

@ -39,7 +39,7 @@ public:
NS_DECL_ISUPPORTS
virtual PRBool OnPaint(nsPaintEvent & aEvent);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
protected:
NS_IMETHOD CreateNative(GtkWidget *parentWindow);

Просмотреть файл

@ -191,6 +191,39 @@ static void set_icon (GdkWindow * w)
gdk_pixmap_unref(pmap);
}
void nsWindow::InitEvent(nsGUIEvent& event, PRUint32 aEventType, nsPoint* aPoint)
{
event.widget = this;
NS_IF_ADDREF(event.widget);
GdkEventConfigure *ge;
ge = (GdkEventConfigure*)gtk_get_current_event();
if (aPoint == nsnull) { // use the point from the event
// get the message position in client coordinates and in twips
if (mWidget != NULL) {
// ::ScreenToClient(mWnd, &cpos);
event.point.x = PRInt32(ge->x);
event.point.y = PRInt32(ge->y);
} else {
event.point.x = 0;
event.point.y = 0;
}
}
else { // use the point override if provided
event.point.x = aPoint->x;
event.point.y = aPoint->y;
}
event.time = gdk_event_get_time((GdkEvent*)ge);
event.message = aEventType;
// mLastPoint.x = event.point.x;
// mLastPoint.y = event.point.y;
}
//-------------------------------------------------------------------------
//
// Create the native widget
@ -201,6 +234,7 @@ NS_METHOD nsWindow::CreateNative(GtkWidget *parentWidget)
GtkWidget *mainWindow;
mWidget = gtk_layout_new(PR_FALSE, PR_FALSE);
gtk_widget_set_events (mWidget,
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
@ -219,9 +253,9 @@ NS_METHOD nsWindow::CreateNative(GtkWidget *parentWidget)
GTK_SIGNAL_FUNC(window_realize_callback),
NULL);
gtk_signal_connect(GTK_OBJECT(mWidget),
"size_allocate",
GTK_SIGNAL_FUNC(nsGtkWidget_Resize_EventHandler),
gtk_signal_connect(GTK_OBJECT(mainWindow),
"configure_event",
GTK_SIGNAL_FUNC(handle_configure_event),
this);
// VBox for the menu, etc.
@ -246,44 +280,47 @@ NS_METHOD nsWindow::CreateNative(GtkWidget *parentWidget)
//-------------------------------------------------------------------------
void nsWindow::InitCallbacks(char * aName)
{
gtk_signal_connect(GTK_OBJECT(mWidget),
"configure_event",
GTK_SIGNAL_FUNC(handle_configure_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"button_press_event",
GTK_SIGNAL_FUNC(nsGtkWidget_ButtonPressMask_EventHandler),
GTK_SIGNAL_FUNC(handle_button_press_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"button_release_event",
GTK_SIGNAL_FUNC(nsGtkWidget_ButtonReleaseMask_EventHandler),
GTK_SIGNAL_FUNC(handle_button_release_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"motion_notify_event",
GTK_SIGNAL_FUNC(nsGtkWidget_ButtonMotionMask_EventHandler),
GTK_SIGNAL_FUNC(handle_motion_notify_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"enter_notify_event",
GTK_SIGNAL_FUNC(nsGtkWidget_EnterMask_EventHandler),
GTK_SIGNAL_FUNC(handle_enter_notify_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"leave_notify_event",
GTK_SIGNAL_FUNC(nsGtkWidget_LeaveMask_EventHandler),
GTK_SIGNAL_FUNC(handle_leave_notify_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"expose_event",
GTK_SIGNAL_FUNC(nsGtkWidget_ExposureMask_EventHandler),
GTK_SIGNAL_FUNC(handle_expose_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"key_press_event",
GTK_SIGNAL_FUNC(nsGtkWidget_KeyPressMask_EventHandler),
GTK_SIGNAL_FUNC(handle_key_press_event),
this);
gtk_signal_connect(GTK_OBJECT(mWidget),
"key_release_event",
GTK_SIGNAL_FUNC(nsGtkWidget_KeyReleaseMask_EventHandler),
GTK_SIGNAL_FUNC(handle_key_release_event),
this);
}
@ -640,23 +677,32 @@ void nsWindow::OnDestroy()
// NS_IF_RELEASE(mAppShell);
}
PRBool nsWindow::OnResize(nsSizeEvent &aEvent)
PRBool nsWindow::OnResize(nsRect &aWindowRect)
{
nsRect* size = aEvent.windowSize;
if (mEventCallback) {
nsSizeEvent event;
nsRect winBounds;
if (mEventCallback && !mIgnoreResize) {
return DispatchWindowEvent(&aEvent);
InitEvent(event, NS_SIZE);
event.windowSize = &aWindowRect;
event.eventStructType = NS_SIZE_EVENT;
GetBounds(winBounds);
event.mWinWidth = winBounds.width;
event.mWinHeight = winBounds.height;
PRBool result = DispatchWindowEvent(&event);
NS_IF_RELEASE(event.widget);
return result;
}
return PR_FALSE;
}
PRBool nsWindow::OnKey(PRUint32 aEventType, PRUint32 aKeyCode, nsKeyEvent* aEvent)
PRBool nsWindow::OnKey(nsKeyEvent &aEvent)
{
if (mEventCallback) {
return DispatchWindowEvent(aEvent);
return DispatchWindowEvent(&aEvent);
}
else
return PR_FALSE;
}

Просмотреть файл

@ -66,6 +66,8 @@ public:
NS_IMETHOD GetClientBounds(nsRect &aRect);
NS_IMETHOD GetBorderSize(PRInt32 &aWidth, PRInt32 &aHeight);
void InitEvent(nsGUIEvent& event, PRUint32 aEventType, nsPoint* aPoint = nsnull);
NS_IMETHOD Invalidate(PRBool aIsSynchronous);
NS_IMETHOD Invalidate(const nsRect &aRect, PRBool aIsSynchronous);
NS_IMETHOD Update();
@ -95,13 +97,13 @@ public:
// Utility methods
virtual PRBool OnPaint(nsPaintEvent &event);
virtual void OnDestroy();
PRBool OnKey(PRUint32 aEventType, PRUint32 aKeyCode, nsKeyEvent* aEvent);
PRBool OnKey(nsKeyEvent &aEvent);
PRBool DispatchFocus(nsGUIEvent &aEvent);
virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos);
void SetIgnoreResize(PRBool aIgnore);
PRBool IgnoreResize();
PRUint32 GetYCoord(PRUint32 aNewY);
virtual PRBool OnResize(nsSizeEvent &aEvent);
virtual PRBool OnResize(nsRect &aWindowRect);
// Resize event management
void SetResizeRect(nsRect& aRect);