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);
}
Ejemplo n.º 2
0
// 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;
    }
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
// 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;
}