/* 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; }
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))); } }