2009-03-04 790 views
5

Me gustaría encontrar la ID de ventana de mi programa SWT.ID de ventana de Java SWT

Arranco mi shell SWT de la manera estándar. ¿Cómo puedo encontrar la ID de la ventana que se ha creado? El programa se está ejecutando en Fedora 10 usando el administrador de ventanas de Compiz-Fusion (si eso hace la diferencia).

Código para ayudar a explicar lo que quiero decir:

public static void main(String[] args) { 
    Display display = new Display(); 
    Shell shell = new Shell(); 

    // find window ID here?? 

    shell.open(); 

    while (!shell.isDisposed()) { 
    if(!display.readAndDispatch()) { 
     display.sleep(); 
    } 
    } 
} 

actualización 6 Mar 2009 Después de mirar y probar toda una serie de cosas (gracias a VonC por las sugerencias abajo), me encontré algo que ha funcionado hasta ahora. Es supremamente dudoso, pero al menos me permite seguir con otro trabajo por el momento.

La ID devuelta desde Control.embeddedHandle está cerca de la identificación de la ventana. Es diferente por una compensación predecible. Así que mi código es:

public static void main(String[] args) { 
    ... 
    Shell shell = new shell(display, SWT.NONE); 

    Composite e = new Composite(shell, SWT.EMBEDDED); 
    long windowID = e.embeddedHandle - WINDOW_ID_MAGIC_NUMBER; 
    e.dispose(); 
    .... 

WINDOW_ID_MAGIC_NUMBER es 5+ (número de widgets añadió que pagar antes de que el compuesto incorporado).

Parece confiable en mi sistema hasta el momento. Todavía tengo que ver si se cae en un entorno diferente.

+0

Acabo de actualizar mi respuesta para obtener algunas pistas más ... sin embargo, nada "definitivo". – VonC

Respuesta

3

Si tiene create a Composite estilo SWT.EMBEDDED estilo, entonces bajo SWT/GTK + Composite.embeddedHandle será una identificación de ventana X que puede utilizar para criar a un hijo XEMBED.

Composite embed = new Composite(shell, SWT.EMBEDDED); 
System.out.println ("X window ID: " + embed.embeddedHandle); 
int hwndChild = OS.GetWindow (c.handle, OS.GW_CHILD); 

Esto admite la incrustación utilizando el protocolo XEMBED.

Esto es similar al código JNI utilizado para obtener el ID de ventana desde su mango

GtkWidget *widget = (GtkWidget *) handle; 
GdkWindow *window = widget->window; 
xwinid = GDK_WINDOW_XWINDOW(window); 

Ejemplo de code here.

Ejemplo de clase utilizando OS:

org.eclipse.swt.widgets.Tree, org.eclipse.swt.widgets.CoolItem,

OS que puedo encontrar es de hecho org.eclipse.swt.internal.win32.OS, no GTK, y no es una solución perfecta, ya que tendría acceso a un paquete interno, pero eso puede darte una idea de dónde buscar.

En su caso, org.eclipse.swt.internal.gtk.OS es la clase correcta, y debe buscar en fuentes Tree o CoolItem cómo están utilizando la función GetWindow.
alguna otra necesidad función a ser llamada en GTK, como puede ser gtk_container_get_children(int container);

Es said in an answer al mensaje que me refería al principio

Si necesita la ventana X, no hay manera de hacerlo esto desde la API pública de SWT (incluso pasando por las internas), y aún más si hubiera una manera en la que no creo que puedas garantizarla para todos los controles.No estoy seguro de si esto funciona, pero lo más cerca que podía conseguir podría ser:

  1. hacen Control.fixedHandle pública
  2. Uso OS.GTK_WIDGET_WINDOW (control.fixedHandle) para conseguir un GdkWindow
  3. Uso OS.gdk_x11_drawable_get_xid (gdkWindow) traducir eso a una ventana X

supongo que la otra forma podría ser tomar Control.handle, y luego llamar a GTK_WIDGET_WINDOW() en él, o si eso es llamar null torreón en sus padres hasta que encuentre uno con un GdkWindow, y luego traduzca eso a una ventana X.

La dificultad aquí es que SWT habla con GTK +, que habla con GDK, que luego habla con X. Entonces, hay tres capas entre usted y la ventana de X.

+0

Gracias por la ayuda. Sin embargo, no puedo encontrar el método GetWindow o la propiedad GW_CHILD en org.eclipse.swt.internal.gtk.OS: ¿es el paquete correcto para usar? – cursa

0

Gracias, esto me ayudó mucho. Tengo un lienzo SWT integrado para mostrar videos con mplayer.

Encontré otro ejemplo en el que el lienzo se creó como control SWT. Pude ver el campo embeddedHandle al depurar, pero no pude acceder ni usarlo.

De acuerdo con su ejemplo, cambié de SWT Control a Composite, y ahora puedo acceder al embeddedHandle, ¡y funciona!

3

No estoy seguro si esto todavía te importa, 7 años más tarde :-), pero esto funciona para mí:

private static long getWindowIdFromShell(Shell shell) { 
    long handle = shell.handle; 
    long topWidget = OS._gtk_widget_get_toplevel(handle); 
    long topWindow = OS._gtk_widget_get_window(topWidget); 
    long topXid = OS._gdk_x11_window_get_xid(topWindow); 
    return topXid; 
} 

En particular, el "get_toplevel" paso es lo que salta al widget raíz/ventana , y eso significa que no necesitas el hack de "corrección de ventana mágica negativa" (que inicialmente también estaba bloqueado).

+2

Gracias :) He movido posiciones/ciudades/continentes varias veces desde entonces y ni siquiera puedo recordar lo que estaba tratando de hacer cuando publiqué la pregunta. Sin embargo, ayudará a alguien más con este problema. – cursa

Cuestiones relacionadas