/* FIXME: should we schedule the event or not?
static gboolean
schedule_send_client_event (gpointer data)
{
  GdkEvent *event = (GdkEvent*) data;

  gdk_event_send_client_message (event, GDK_WINDOW_XID (event->client.window));

  gdk_event_free (event);

  return FALSE;
}
*/
static void on_size_alloc (AwnAppletProxy *proxy, GtkAllocation *alloc)
{
  AwnAppletProxyPrivate *priv;
  GtkWidget *parent;
  GtkAllocation parent_alloc;
  GdkWindow *plug_win;

  g_return_if_fail (AWN_IS_APPLET_PROXY (proxy));

  priv = proxy->priv;

  parent = gtk_widget_get_parent (GTK_WIDGET (proxy));
  gtk_widget_get_allocation (parent, &parent_alloc);

  gint pos_x = alloc->x;
  gint pos_y = alloc->y;
  gint rel_x = pos_x - parent_alloc.x;
  gint rel_y = pos_y - parent_alloc.y;
  gint parent_w = parent_alloc.width;
  gint parent_h = parent_alloc.height;

  if (pos_x == priv->old_x && pos_y == priv->old_y
      && parent_w == priv->old_w && parent_h == priv->old_h) return;

  priv->old_x = pos_x;
  priv->old_y = pos_y;
  priv->old_w = parent_w;
  priv->old_h = parent_h;

  /* Only directly access the struct member if we have to. */
  plug_win = gtk_socket_get_plug_window (GTK_SOCKET (proxy));
  if (plug_win)
  {
    GdkAtom msg_type = gdk_atom_intern("_AWN_APPLET_POS_CHANGE", FALSE);
    GdkEvent *event = gdk_event_new (GDK_CLIENT_EVENT);
    event->client.window = g_object_ref (plug_win);
    event->client.data_format = 32;
    event->client.message_type = msg_type;
    // first two longs are our relative [x, y]
    event->client.data.l[0] = rel_x;
    event->client.data.l[1] = rel_y;
    // other two longs are our parent's [w, h]
    event->client.data.l[2] = parent_w;
    event->client.data.l[3] = parent_h;

    gdk_event_send_client_message (event, GDK_WINDOW_XID (plug_win));

    gdk_event_free (event);
    /* g_idle_add (schedule_send_client_event, event); */
  }
}
// TODO: Make better use of the GDK X11 wrapper functions
GdkFilterReturn dasher_maemo_helper_handle_xevent(DasherMaemoHelper *pSelf, GdkXEvent *pXEvent) {
  DasherMaemoHelperPrivate *pPrivate = (DasherMaemoHelperPrivate *)(pSelf->private_data);
  XEvent *xev = (XEvent *) pXEvent;

  if(xev->xany.type == ClientMessage) {
//     g_message("Atom: %s %d", XGetAtomName(xev->xany.display, xev->xclient.message_type), xev->xclient.format );
    
//     for(int i(0); i < 5; ++i) {
//       g_print("%x ", (unsigned int)(xev->xclient.data.l[i]));
//     }

//     g_print("\n");
    
    if((xev->xclient.data.l[3] == 0xc) || (xev->xclient.data.l[3] == 0xd)){
      gtk_widget_show(GTK_WIDGET(pPrivate->pWindow));
      g_FRandomWindow = (Window)xev->xclient.data.l[0];
      g_FWindow = (Window)xev->xclient.data.l[1];
      g_pFocusWindow = gdk_window_foreign_new(g_FWindow);
      g_pRandomWindow = gdk_window_foreign_new(g_FRandomWindow);
#if GTK_CHECK_VERSION (2,14,0)
      gdk_window_set_transient_for(GDK_WINDOW(gtk_widget_get_window(GTK_WIDGET(pPrivate->pWindow))), g_pFocusWindow);
#else
      gdk_window_set_transient_for(GDK_WINDOW(GTK_WIDGET(pPrivate->pWindow)->window), g_pFocusWindow);
#endif
    } 

    else if((xev->xclient.data.l[3] == 0x11) || (xev->xclient.data.l[3] == 0x12))  {
      GdkEventClient sMyEvent;
      
      sMyEvent.type = GDK_CLIENT_EVENT;
      sMyEvent.window = g_pRandomWindow;
      sMyEvent.send_event = true;
      sMyEvent.message_type = gdk_atom_intern("_HILDON_IM_COM", true);
      sMyEvent.data_format = 8; // I know this is wrong...
      sMyEvent.data.l[0] = g_FRandomWindow;
      sMyEvent.data.l[1] = 0x7;
      sMyEvent.data.l[2] = 0;
      sMyEvent.data.l[3] = 0;
      sMyEvent.data.l[4] = 0;
      
      gdk_event_send_client_message((GdkEvent *)(&sMyEvent), g_FRandomWindow); 
    }
    else if(xev->xclient.data.l[3] == 0xb) {
      gtk_widget_hide(GTK_WIDGET(pPrivate->pWindow));
    }
  }
  
  return GDK_FILTER_CONTINUE;
}
示例#3
0
static VALUE
gdkeventclient_send_client_message(int argc, VALUE *argv, VALUE self)
{
    VALUE xid, display;
    rb_scan_args(argc, argv, "11", &xid, &display);
    if (NIL_P(display)){
        return CBOOL2RVAL(gdk_event_send_client_message(
                              get_gdkevent(self), RVAL2GDKNATIVEWINDOW(xid)));
    } else {
        return CBOOL2RVAL(gdk_event_send_client_message_for_display(
                              GDK_DISPLAY_OBJECT(RVAL2GOBJ(display)),
                              get_gdkevent(self),
                              RVAL2GDKNATIVEWINDOW(xid)));
    }
}