void nsSystemTrayIconBase::DispatchEvent(const nsAString& aType, PRUint16 aButton, PRInt32 aDetail, bool aCtrlKey, bool aAltKey, bool aShiftKey, bool aMetaKey) { nsresult rv; // first, create an event... nsCOMPtr<nsIDOMNode> node(do_QueryInterface(mEventTarget, &rv)); if (NS_FAILED(rv)) return; nsCOMPtr<nsIDOMDocument> doc; rv = node->GetOwnerDocument(getter_AddRefs(doc)); if (NS_FAILED(rv)) return; nsCOMPtr<nsIDOMDocumentEvent> docEvent(do_QueryInterface(doc, &rv)); if (NS_FAILED(rv)) return; nsCOMPtr<nsIDOMEvent> event; rv = docEvent->CreateEvent(NS_LITERAL_STRING("mouseevent"), getter_AddRefs(event)); if (NS_FAILED(rv)) return; nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(event, &rv)); if (NS_FAILED(rv)) return; // get the view the event occurred on nsCOMPtr<nsIDOMDocumentView> documentView(do_QueryInterface(doc, &rv)); if (NS_FAILED(rv)) return; nsCOMPtr<nsIDOMAbstractView> view; rv = documentView->GetDefaultView(getter_AddRefs(view)); if (NS_FAILED(rv)) return; // figure out where to position the popup nsPoint position = GetPopupPosition(); // initialize the event // TODO: give useful arguments here rv = mouseEvent->InitMouseEvent(aType, PR_FALSE, PR_TRUE, view, aDetail, position.x, position.y, position.x, position.y, aCtrlKey, aAltKey, aShiftKey, aMetaKey, aButton, nsnull); if (NS_FAILED(rv)) return; // and dispatch it. (yes, return value is ignored; we can't do anything) bool result; mEventTarget->DispatchEvent(event, &result); }
// static void xgGtkElement::EventAfter (GtkWidget *widget, GdkEvent *event, gpointer userData) { static GdkEventType last_type = GDK_NOTHING; static GdkEvent *last_event = NULL; if (event == last_event && event->type == last_type) { return; } if (event->type != GDK_FOCUS_CHANGE) { return; } xgGtkElement *self = reinterpret_cast<xgGtkElement *> (userData); if (!self) { return; } nsresult rv; nsCOMPtr<nsIDOMElement> elem; rv = self->mWrapper->GetElementNode (getter_AddRefs (elem)); if (NS_FAILED (rv)) { return; } nsCOMPtr<nsIDOMDocument> doc; rv = elem->GetOwnerDocument (getter_AddRefs (doc)); if (NS_FAILED (rv)) { return; } nsCOMPtr<nsIDOMDocumentEvent> docEvent (do_QueryInterface (doc, &rv)); if (NS_FAILED (rv)) { return; } nsCOMPtr<nsIDOMEvent> evt; rv = docEvent->CreateEvent (NS_LITERAL_STRING ("UIEvent"), getter_AddRefs (evt)); if (NS_FAILED (rv)) { return; } nsCOMPtr<nsIDOMUIEvent> uiEvt (do_QueryInterface (evt, &rv)); if (NS_FAILED (rv)) { return; } rv = uiEvt->InitUIEvent (event->focus_change.in ? NS_LITERAL_STRING ("DOMFocusIn") : NS_LITERAL_STRING ("DOMFocusOut"), PR_TRUE, PR_FALSE, NULL, 0); if (NS_FAILED (rv)) { return; } last_type = event->type; last_event = event; nsCOMPtr<nsIDOMEventTarget> target (do_QueryInterface (elem, &rv)); if (NS_FAILED (rv)) { return; } PRBool doDefault; rv = target->DispatchEvent (evt, &doDefault); if (NS_FAILED (rv)) { return; } }
void xgGtkElement::Activate (GtkWidget *w, gpointer data) { xgGtkElement *self = (xgGtkElement *)data; nsresult rv; nsCOMPtr<nsIDOMElement> elem; rv = self->mWrapper->GetElementNode (getter_AddRefs (elem)); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to get element: %#x"), rv); return; } nsCOMPtr<nsIDOMDocument> doc; rv = elem->GetOwnerDocument (getter_AddRefs (doc)); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to get doc: %#x"), rv); return; } nsCOMPtr<nsIDOMDocumentEvent> docEvent (do_QueryInterface (doc, &rv)); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to get doc event: %#x"), rv); return; } nsCOMPtr<nsIDOMEvent> evt; rv = docEvent->CreateEvent (NS_LITERAL_STRING ("UIEvent"), getter_AddRefs (evt)); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to create event: %#x"), rv); return; } nsCOMPtr<nsIDOMUIEvent> uiEvt (do_QueryInterface (evt, &rv)); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to QI for ui event: %#x"), rv); return; } rv = uiEvt->InitUIEvent (NS_LITERAL_STRING ("DOMActivate"), PR_TRUE, PR_TRUE, NULL, 0); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to init UI event: %#x"), rv); return; } nsCOMPtr<nsIDOMEventTarget> target (do_QueryInterface (elem, &rv)); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to QI for an event target: %#x"), rv); return; } PRBool doDefault; rv = target->DispatchEvent (evt, &doDefault); if (NS_FAILED (rv)) { g_warning (GOM_LOC ("Failed to dispatch event: %#x"), rv); return; } g_message (GOM_LOC ("Event dispatch returned %#x"), doDefault); }
// static gboolean xgGtkElement::Event (GtkWidget *widget, GdkEvent *event, gpointer userData) { static GdkEventType last_type = GDK_NOTHING; static GdkEvent *last_event = NULL; if (event == last_event && event->type == last_type) { return FALSE; } switch (event->type) { case GDK_MOTION_NOTIFY: case GDK_BUTTON_PRESS: case GDK_BUTTON_RELEASE: case GDK_ENTER_NOTIFY: case GDK_LEAVE_NOTIFY: case GDK_KEY_PRESS: case GDK_KEY_RELEASE: break; default: return FALSE; } xgGtkElement *self = reinterpret_cast<xgGtkElement *> (userData); NS_ENSURE_TRUE (self, FALSE); nsresult rv; nsCOMPtr<nsIDOMElement> elem; rv = self->mWrapper->GetElementNode (getter_AddRefs (elem)); NS_ENSURE_SUCCESS (rv, FALSE); nsCOMPtr<nsIDOMDocument> doc; rv = elem->GetOwnerDocument (getter_AddRefs (doc)); NS_ENSURE_SUCCESS (rv, FALSE); nsCOMPtr<nsIDOMDocumentEvent> docEvent (do_QueryInterface (doc, &rv)); NS_ENSURE_SUCCESS (rv, FALSE); nsCOMPtr<nsIDOMEvent> evt; switch (event->type) { case GDK_MOTION_NOTIFY: self->mClickState = 0; INIT_MOUSE_EVENT ("mousemove", motion); break; case GDK_BUTTON_PRESS: ++self->mClickState; INIT_MOUSE_EVENT ("mousedown", button); break; case GDK_BUTTON_RELEASE: INIT_MOUSE_EVENT ("mouseup", button); break; case GDK_ENTER_NOTIFY: INIT_MOUSE_EVENT ("mouseover", crossing); break; case GDK_LEAVE_NOTIFY: INIT_MOUSE_EVENT ("mouseout", crossing); break; case GDK_KEY_PRESS: if (GTK_IS_WINDOW (widget) && GTK_WINDOW (widget)->focus_widget) { widget = GTK_WINDOW (widget)->focus_widget; self = reinterpret_cast<xgGtkElement *> (g_object_get_data (G_OBJECT (widget), "XG_GOBJECT")); NS_ENSURE_TRUE (self, FALSE); rv = self->mWrapper->GetElementNode (getter_AddRefs (elem)); NS_ENSURE_SUCCESS (rv, FALSE); } INIT_KEY_EVENT ("keydown"); break; case GDK_KEY_RELEASE: if (GTK_IS_WINDOW (widget) && GTK_WINDOW (widget)->focus_widget) { widget = GTK_WINDOW (widget)->focus_widget; self = reinterpret_cast<xgGtkElement *> (g_object_get_data (G_OBJECT (widget), "XG_GOBJECT")); NS_ENSURE_TRUE (self, FALSE); rv = self->mWrapper->GetElementNode (getter_AddRefs (elem)); NS_ENSURE_SUCCESS (rv, FALSE); } INIT_KEY_EVENT ("keyup"); break; default: g_assert_not_reached (); } g_assert (evt); last_type = event->type; last_event = event; nsCOMPtr<nsIDOMEventTarget> target (do_QueryInterface (elem, &rv)); NS_ENSURE_SUCCESS (rv, FALSE); PRBool doDefault; rv = target->DispatchEvent (evt, &doDefault); NS_ENSURE_SUCCESS (rv, FALSE); if (!doDefault) { return TRUE; } if (event->type == GDK_BUTTON_RELEASE && self->mClickState) { evt = NULL; INIT_MOUSE_EVENT ("click", button); rv = target->DispatchEvent (evt, &doDefault); NS_ENSURE_SUCCESS (rv, FALSE); if (!doDefault) { return TRUE; } } return FALSE; }