added the GtkEventHandler stuff for the gtk widget set
git-svn-id: svn://10.0.0.236/trunk@13795 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
570
mozilla/widget/src/gtk/nsGtkEventHandler.cpp
Normal file
570
mozilla/widget/src/gtk/nsGtkEventHandler.cpp
Normal file
@@ -0,0 +1,570 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include "gtk/gtk.h"
|
||||
#include "nsGtkEventHandler.h"
|
||||
#include "X11/keysym.h"
|
||||
|
||||
#include "nsWindow.h"
|
||||
#include "nsTextWidget.h"
|
||||
#include "nsCheckButton.h"
|
||||
#include "nsRadioButton.h"
|
||||
#include "nsFileWidget.h"
|
||||
#include "nsGUIEvent.h"
|
||||
#include "nsIMenuItem.h"
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
#define DBG 0
|
||||
|
||||
struct nsKeyConverter {
|
||||
int vkCode; // Platform independent key code
|
||||
XID keysym; // X keysym key code
|
||||
};
|
||||
|
||||
struct nsKeyConverter nsKeycodes[] = {
|
||||
NS_VK_CANCEL, XK_Cancel,
|
||||
NS_VK_BACK, XK_BackSpace,
|
||||
NS_VK_TAB, XK_Tab,
|
||||
NS_VK_CLEAR, XK_Clear,
|
||||
NS_VK_RETURN, XK_Return,
|
||||
NS_VK_SHIFT, XK_Shift_L,
|
||||
NS_VK_SHIFT, XK_Shift_R,
|
||||
NS_VK_CONTROL, XK_Control_L,
|
||||
NS_VK_CONTROL, XK_Control_R,
|
||||
NS_VK_ALT, XK_Alt_L,
|
||||
NS_VK_ALT, XK_Alt_R,
|
||||
NS_VK_PAUSE, XK_Pause,
|
||||
NS_VK_CAPS_LOCK, XK_Caps_Lock,
|
||||
NS_VK_ESCAPE, XK_Escape,
|
||||
NS_VK_SPACE, XK_space,
|
||||
NS_VK_PAGE_UP, XK_Page_Up,
|
||||
NS_VK_PAGE_DOWN, XK_Page_Down,
|
||||
NS_VK_END, XK_End,
|
||||
NS_VK_HOME, XK_Home,
|
||||
NS_VK_LEFT, XK_Left,
|
||||
NS_VK_UP, XK_Up,
|
||||
NS_VK_RIGHT, XK_Right,
|
||||
NS_VK_DOWN, XK_Down,
|
||||
NS_VK_PRINTSCREEN, XK_Print,
|
||||
NS_VK_INSERT, XK_Insert,
|
||||
NS_VK_DELETE, XK_Delete,
|
||||
|
||||
NS_VK_NUMPAD0, XK_KP_0,
|
||||
NS_VK_NUMPAD1, XK_KP_1,
|
||||
NS_VK_NUMPAD2, XK_KP_2,
|
||||
NS_VK_NUMPAD3, XK_KP_3,
|
||||
NS_VK_NUMPAD4, XK_KP_4,
|
||||
NS_VK_NUMPAD5, XK_KP_5,
|
||||
NS_VK_NUMPAD6, XK_KP_6,
|
||||
NS_VK_NUMPAD7, XK_KP_7,
|
||||
NS_VK_NUMPAD8, XK_KP_8,
|
||||
NS_VK_NUMPAD9, XK_KP_9,
|
||||
|
||||
NS_VK_MULTIPLY, XK_KP_Multiply,
|
||||
NS_VK_ADD, XK_KP_Add,
|
||||
NS_VK_SEPARATOR, XK_KP_Separator,
|
||||
NS_VK_SUBTRACT, XK_KP_Subtract,
|
||||
NS_VK_DECIMAL, XK_KP_Decimal,
|
||||
NS_VK_DIVIDE, XK_KP_Divide,
|
||||
NS_VK_F1, XK_F1,
|
||||
NS_VK_F2, XK_F2,
|
||||
NS_VK_F3, XK_F3,
|
||||
NS_VK_F4, XK_F4,
|
||||
NS_VK_F5, XK_F5,
|
||||
NS_VK_F6, XK_F6,
|
||||
NS_VK_F7, XK_F7,
|
||||
NS_VK_F8, XK_F8,
|
||||
NS_VK_F9, XK_F9,
|
||||
NS_VK_F10, XK_F10,
|
||||
NS_VK_F11, XK_F11,
|
||||
NS_VK_F12, XK_F12,
|
||||
NS_VK_F13, XK_F13,
|
||||
NS_VK_F14, XK_F14,
|
||||
NS_VK_F15, XK_F15,
|
||||
NS_VK_F16, XK_F16,
|
||||
NS_VK_F17, XK_F17,
|
||||
NS_VK_F18, XK_F18,
|
||||
NS_VK_F19, XK_F19,
|
||||
NS_VK_F20, XK_F20,
|
||||
NS_VK_F21, XK_F21,
|
||||
NS_VK_F22, XK_F22,
|
||||
NS_VK_F23, XK_F23,
|
||||
NS_VK_F24, XK_F24,
|
||||
|
||||
NS_VK_COMMA, XK_comma,
|
||||
NS_VK_PERIOD, XK_period,
|
||||
NS_VK_SLASH, XK_slash,
|
||||
//XXX: How do you get a BACK_QUOTE? NS_VK_BACK_QUOTE, XK_backquote,
|
||||
NS_VK_OPEN_BRACKET, XK_bracketleft,
|
||||
NS_VK_CLOSE_BRACKET, XK_bracketright,
|
||||
NS_VK_QUOTE, XK_quotedbl
|
||||
|
||||
};
|
||||
|
||||
|
||||
int nsConvertKey(XID keysym)
|
||||
{
|
||||
int i;
|
||||
int length = sizeof(nsKeycodes) / sizeof(struct nsKeyConverter);
|
||||
for (i = 0; i < length; i++) {
|
||||
if (nsKeycodes[i].keysym == keysym)
|
||||
return(nsKeycodes[i].vkCode);
|
||||
}
|
||||
|
||||
return((int)keysym);
|
||||
}
|
||||
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_InitNSEvent(XEvent * anXEv,
|
||||
XtPointer p,
|
||||
nsGUIEvent &anEvent,
|
||||
PRUint32 aEventType)
|
||||
{
|
||||
anEvent.message = aEventType;
|
||||
anEvent.widget = (nsWindow *) p;
|
||||
anEvent.eventStructType = NS_GUI_EVENT;
|
||||
|
||||
if (anXEv != NULL) {
|
||||
anEvent.point.x = anXEv->xbutton.x;
|
||||
anEvent.point.y = anXEv->xbutton.y;
|
||||
}
|
||||
|
||||
anEvent.time = 0; //XXX: Implement this
|
||||
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_InitNSMouseEvent(XEvent * anXEv,
|
||||
XtPointer p,
|
||||
nsMouseEvent &anEvent,
|
||||
PRUint32 aEventType)
|
||||
{
|
||||
// Do base initialization
|
||||
nsGtkWidget_InitNSEvent(anXEv, p, anEvent, aEventType);
|
||||
|
||||
if (anXEv != NULL) { // Do Mouse Event specific intialization
|
||||
anEvent.time = anXEv->xbutton.time;
|
||||
anEvent.isShift = (anXEv->xbutton.state & ShiftMask) ? PR_TRUE : PR_FALSE;
|
||||
anEvent.isControl = (anXEv->xbutton.state & ControlMask) ? PR_TRUE : PR_FALSE;
|
||||
anEvent.isAlt = (anXEv->xbutton.state & Mod1Mask) ? PR_TRUE : PR_FALSE;
|
||||
anEvent.clickCount = 1; //XXX Fix for double-clicks
|
||||
anEvent.eventStructType = NS_MOUSE_EVENT;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
#ifndef MIN
|
||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#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))
|
||||
|
||||
//==============================================================
|
||||
typedef struct COLLAPSE_INFO {
|
||||
Window win;
|
||||
nsRect *r;
|
||||
} CollapseInfo;
|
||||
|
||||
//==============================================================
|
||||
static Bool checkForExpose(Display *dpy, XEvent *evt, XtPointer client_data)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_ExposureMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
|
||||
nsPaintEvent pevent;
|
||||
nsRect rect;
|
||||
nsGtkWidget_InitNSEvent(event, p, pevent, NS_PAINT);
|
||||
pevent.rect = (nsRect *)▭
|
||||
XEvent xev;
|
||||
|
||||
rect.x = event->xexpose.x;
|
||||
rect.y = event->xexpose.y;
|
||||
rect.width = event->xexpose.width;
|
||||
rect.height = event->xexpose.height;
|
||||
|
||||
|
||||
if (widgetWindow->GetResized())
|
||||
return;
|
||||
|
||||
if (event->type == NoExpose) {
|
||||
return;
|
||||
}
|
||||
|
||||
Display* display = XtDisplay(w);
|
||||
Window window = XtWindow(w);
|
||||
|
||||
XSync(display, FALSE);
|
||||
|
||||
while (XCheckTypedWindowEvent(display, window, Expose, &xev) == TRUE) {
|
||||
rect.x = xev.xexpose.x;
|
||||
rect.y = xev.xexpose.y;
|
||||
rect.width = xev.xexpose.width;
|
||||
rect.height = xev.xexpose.height;
|
||||
}
|
||||
|
||||
widgetWindow->OnPaint(pevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_ButtonPressMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
nsMouseEvent mevent;
|
||||
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_LEFT_BUTTON_DOWN);
|
||||
widgetWindow->DispatchMouseEvent(mevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_ButtonReleaseMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
nsMouseEvent mevent;
|
||||
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_LEFT_BUTTON_UP);
|
||||
widgetWindow->DispatchMouseEvent(mevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_ButtonMotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsPaintEvent pevent ;
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
nsMouseEvent mevent;
|
||||
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_MOVE);
|
||||
widgetWindow->DispatchMouseEvent(mevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_MotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
nsMouseEvent mevent;
|
||||
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_MOVE);
|
||||
widgetWindow->DispatchMouseEvent(mevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_EnterMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
nsMouseEvent mevent;
|
||||
nsGtkWidget_InitNSMouseEvent(event, p, mevent, NS_MOUSE_ENTER);
|
||||
widgetWindow->DispatchMouseEvent(mevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_LeaveMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Focus_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
|
||||
XmAnyCallbackStruct * cbs = (XmAnyCallbackStruct*)call_data;
|
||||
nsGUIEvent event;
|
||||
nsGtkWidget_InitNSEvent(cbs->event, p, event,
|
||||
cbs->reason == XmCR_FOCUS?NS_GOTFOCUS:NS_LOSTFOCUS);
|
||||
widgetWindow->DispatchFocus(event);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Toggle_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
if (DBG) fprintf(stderr, "***************** nsGtkWidget_Scrollbar_Callback\n");
|
||||
|
||||
nsScrollbarEvent sevent;
|
||||
XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data;
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Toggle_ArmCallback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsCheckButton * checkBtn = (nsCheckButton *) p ;
|
||||
|
||||
XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data;
|
||||
|
||||
if (DBG) fprintf(stderr, "Callback struct 0x%x\n", cbs);fflush(stderr);
|
||||
checkBtn->Armed();
|
||||
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Toggle_DisArmCallback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsCheckButton * checkBtn = (nsCheckButton *) p ;
|
||||
nsScrollbarEvent sevent;
|
||||
XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data;
|
||||
checkBtn->DisArmed();
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_RadioButton_ArmCallback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_RadioButton_DisArmCallback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsRadioButton * radioBtn = (nsRadioButton *) p ;
|
||||
nsScrollbarEvent sevent;
|
||||
XmToggleButtonCallbackStruct * cbs = (XmToggleButtonCallbackStruct*)call_data;
|
||||
radioBtn->DisArmed();
|
||||
nsMouseEvent mevent;
|
||||
nsGtkWidget_InitNSMouseEvent(cbs->event, p, mevent, NS_MOUSE_LEFT_BUTTON_UP);
|
||||
radioBtn->DispatchMouseEvent(mevent);
|
||||
}
|
||||
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Scrollbar_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
nsScrollbarEvent sevent;
|
||||
XmScrollBarCallbackStruct * cbs = (XmScrollBarCallbackStruct*) call_data;
|
||||
sevent.widget = (nsWindow *) p;
|
||||
if (cbs->event != nsnull) {
|
||||
sevent.point.x = cbs->event->xbutton.x;
|
||||
sevent.point.y = cbs->event->xbutton.y;
|
||||
} else {
|
||||
sevent.point.x = 0;
|
||||
sevent.point.y = 0;
|
||||
}
|
||||
sevent.time = 0; //XXX Implement this
|
||||
|
||||
switch (cbs->reason) {
|
||||
|
||||
case XmCR_INCREMENT:
|
||||
sevent.message = NS_SCROLLBAR_LINE_NEXT;
|
||||
break;
|
||||
|
||||
case XmCR_DECREMENT:
|
||||
sevent.message = NS_SCROLLBAR_LINE_PREV;
|
||||
break;
|
||||
|
||||
case XmCR_PAGE_INCREMENT:
|
||||
sevent.message = NS_SCROLLBAR_PAGE_NEXT;
|
||||
break;
|
||||
|
||||
case XmCR_PAGE_DECREMENT:
|
||||
sevent.message = NS_SCROLLBAR_PAGE_PREV;
|
||||
break;
|
||||
|
||||
case XmCR_DRAG:
|
||||
sevent.message = NS_SCROLLBAR_POS;
|
||||
break;
|
||||
|
||||
case XmCR_VALUE_CHANGED:
|
||||
sevent.message = NS_SCROLLBAR_POS;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
widgetWindow->OnScroll(sevent, cbs->value);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Expose_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
|
||||
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 *)▭
|
||||
widgetWindow->OnPaint(pevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Resize_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Text_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
int len;
|
||||
XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct *) call_data;
|
||||
PasswordData * data;
|
||||
XtVaGetValues(w, XmNuserData, &data, NULL);
|
||||
if (data == NULL || data->mIgnore) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cbs->reason == XmCR_ACTIVATE) {
|
||||
printf ("Password: %s\n", data->mPassword.ToNewCString());
|
||||
return;
|
||||
}
|
||||
|
||||
if (cbs->startPos < cbs->currInsert) { /* backspace */
|
||||
cbs->endPos = data->mPassword.Length(); /* delete from here to end */
|
||||
data->mPassword.SetLength(cbs->startPos); /* backspace--terminate */
|
||||
return;
|
||||
}
|
||||
|
||||
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] = '*';
|
||||
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_FSBCancel_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsFileWidget * widgetWindow = (nsFileWidget *) p ;
|
||||
if (p != nsnull) {
|
||||
widgetWindow->OnCancel();
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_FSBOk_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
nsFileWidget * widgetWindow = (nsFileWidget *) p ;
|
||||
if (p != nsnull) {
|
||||
widgetWindow->OnOk();
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_InitNSKeyEvent(int aEventType, nsKeyEvent& aKeyEvent, Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
Modifiers modout = 0;
|
||||
KeySym res;
|
||||
|
||||
nsGtkWidget_InitNSEvent(event, p, aKeyEvent, aEventType);
|
||||
XKeyEvent* xKeyEvent = (XKeyEvent*)event;
|
||||
|
||||
// Get the modout to test for shift + control
|
||||
XtTranslateKeycode(xKeyEvent->display,xKeyEvent->keycode, xKeyEvent->state, &modout, &res);
|
||||
res = XKeycodeToKeysym(xKeyEvent->display, xKeyEvent->keycode, 0);
|
||||
|
||||
aKeyEvent.keyCode = nsConvertKey(res) & 0x00FF;
|
||||
aKeyEvent.time = xKeyEvent->time;
|
||||
aKeyEvent.isShift = (xKeyEvent->state & ShiftMask) ? PR_TRUE : PR_FALSE;
|
||||
aKeyEvent.isControl = (xKeyEvent->state & ControlMask) ? PR_TRUE : PR_FALSE;
|
||||
aKeyEvent.isAlt = (xKeyEvent->state & Mod1Mask) ? PR_TRUE : PR_FALSE;
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_KeyPressMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsKeyEvent kevent;
|
||||
nsGtkWidget_InitNSKeyEvent(NS_KEY_DOWN, kevent, w, p, event, b);
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
widgetWindow->OnKey(NS_KEY_DOWN, kevent.keyCode, &kevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_KeyReleaseMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b)
|
||||
{
|
||||
nsKeyEvent kevent;
|
||||
nsGtkWidget_InitNSKeyEvent(NS_KEY_UP, kevent, w, p, event, b);
|
||||
nsWindow * widgetWindow = (nsWindow *) p ;
|
||||
widgetWindow->OnKey(NS_KEY_UP, kevent.keyCode, &kevent);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_ResetResize_Callback(XtPointer call_data)
|
||||
{
|
||||
nsWindow* widgetWindow = (nsWindow*)call_data;
|
||||
widgetWindow->SetResized(PR_FALSE);
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
void nsGtkWidget_Menu_Callback(Widget w, XtPointer p, XtPointer call_data)
|
||||
{
|
||||
|
||||
nsIMenuItem * menuItem = (nsIMenuItem *)p;
|
||||
if (menuItem != NULL) {
|
||||
nsMenuEvent mevent;
|
||||
mevent.message = NS_MENU_SELECTED;
|
||||
mevent.eventStructType = NS_MENU_EVENT;
|
||||
mevent.point.x = 0;
|
||||
mevent.point.y = 0;
|
||||
menuItem->GetTarget(mevent.widget);
|
||||
menuItem->GetCommand(mevent.mCommand);
|
||||
mevent.mMenuItem = menuItem;
|
||||
mevent.time = 0; //XXX: Implement this
|
||||
nsEventStatus status;
|
||||
mevent.widget->DispatchEvent((nsGUIEvent *)&mevent, status);
|
||||
}
|
||||
}
|
||||
|
||||
65
mozilla/widget/src/gtk/nsGtkEventHandler.h
Normal file
65
mozilla/widget/src/gtk/nsGtkEventHandler.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef __nsXtEventHandler_h
|
||||
#define __nsXtEventHandler_h
|
||||
|
||||
#include "Xm/Xm.h"
|
||||
|
||||
class nsIWidget;
|
||||
class nsIMenuItem;
|
||||
|
||||
void nsGtkWidget_KeyPressMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_KeyReleaseMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_ExposureMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_ButtonPressMask_EventHandler(Widget w,XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_ButtonReleaseMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_ButtonMotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_MotionMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_EnterMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
void nsGtkWidget_LeaveMask_EventHandler(Widget w, XtPointer p, XEvent * event, Boolean * b);
|
||||
//----------------------------------------------------
|
||||
|
||||
void nsGtkWidget_FSBCancel_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_FSBOk_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
|
||||
//----------------------------------------------------
|
||||
void nsGtkWidget_Focus_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_Scrollbar_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_Toggle_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_Toggle_ArmCallback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_Toggle_DisArmCallback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_RadioButton_ArmCallback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_RadioButton_DisArmCallback(Widget w, XtPointer p, XtPointer call_data);
|
||||
|
||||
void nsGtkWidget_Text_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_Resize_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
void nsGtkWidget_Expose_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
|
||||
void nsGtkWidget_Refresh_Callback(XtPointer call_data);
|
||||
|
||||
void nsGtkWidget_ResetResize_Callback(XtPointer call_data);
|
||||
|
||||
void nsGtkWidget_Menu_Callback(Widget w, XtPointer p, XtPointer call_data);
|
||||
|
||||
#endif // __nsXtEventHandler.h
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user