Jedy Wang wrote:
> Hi all,
>
> The following application starts up a ???Run Application" dialog. If I use
> X11 api, the application works fine. But if I use gdk api, the dialog
> can not be started. Does anyone know if there is something wrong with
> the code? Thanks in advance.
>
> BTW:
> You can run 'cc [source] -g `pkg-config --cflags --libs gdk-2.0`' to
> build the source.
> Jedy
> ----------------------------------------------------------------->8
> #include <stdio.h>
> #include <stdlib.h>
> #include <X11/Xlib.h>
> #include <gdk/gdk.h>
> #include <gdk/gdkx.h>
>
> int main(int argc, char* argv[])
> {
>       Atom gnome_panel_atom, run_atom;
>
>       gdk_init(&argc, &argv);
>       gnome_panel_atom = gdk_x11_get_xatom_by_name("_GNOME_PANEL_ACTION");
>       run_atom = gdk_x11_get_xatom_by_name("_GNOME_PANEL_ACTION_RUN_DIALOG");
>
>       if (gnome_panel_atom != None && run_atom != None) {
> #if 0
>               Display *display;
>               XClientMessageEvent event;
>
>               display = XOpenDisplay(NULL);
>               if (display == NULL)
>                       return 0;
>               event.type = ClientMessage;
>               event.window = DefaultRootWindow(display);
>               event.message_type = gnome_panel_atom;
>               event.format = 32;
>               event.data.l[0] = run_atom;
>               event.data.l[1] = (Time)(time(NULL) * 1000);
>
>               XSendEvent(display, event.window, False, StructureNotifyMask,
>                               (XEvent *)&event);
>   
The event is sent to every clients on the root window according to the 
man page.
>               XCloseDisplay(display);
> #else
>               gint ret;
>               GdkEvent *event = gdk_event_new (GDK_CLIENT_EVENT); 
>               ((GdkEventAny *)event)->window = gdk_get_default_root_window();
>               ((GdkEventAny *)event)->send_event = TRUE; 
>               ((GdkEventClient *)event)->message_type = 
>                       gdk_x11_xatom_to_atom (gnome_panel_atom); 
>               ((GdkEventClient *)event)->data_format = 32; 
>               ((GdkEventClient *)event)->data.l[0] = run_atom;
>               ((GdkEventClient *)event)->data.l[1] = (Time)(time(NULL) * 
> 1000);
>
>               ret = gdk_event_send_client_message (event, 
>                               GDK_WINDOW_XID 
> (gdk_get_default_root_window())); 
>   
According to API doc, the event is only sent to the specific window. So 
if you changes the code like:

...
((GdkEventClient *)event)->window = gdk_window_lookup(GDK_ROOT_WINDOW());
g_assert(((GdkEventClient *)event)->window);
((GdkEventClient *)event)->send_event = TRUE;
((GdkEventClient *)event)->message_type =
gdk_x11_xatom_to_atom (gnome_panel_atom);
((GdkEventClient *)event)->data_format = 32;
((GdkEventClient *)event)->data.l[0] = run_atom;
((GdkEventClient *)event)->data.l[1] = (Time)(time(NULL) * 1000);
gdk_event_send_clientmessage_toall(event);
...

It works.

lin

>               fprintf(stderr, "%d\n", ret);
>               gdk_event_free (event);
> #endif
>       }
>
>       return 0;
> }
>
>
>   
> ------------------------------------------------------------------------
>
> _______________________________________________
> desktop-discuss mailing list
> desktop-discuss at opensolaris.org
>   


-- 
x82120 / +86 10 82618200


Reply via email to