2009-03-04 13 views
5

से विंडो आईडी मैं अपने एसडब्ल्यूटी कार्यक्रम की विंडो आईडी ढूंढना चाहता हूं।जावा एसडब्ल्यूटी

मैं अपने एसडब्ल्यूटी खोल को मानक तरीके से शुरू करता हूं। फिर मुझे बनाई गई विंडो की आईडी कैसे मिलती है? प्रोग्राम कंपोज़-फ़्यूज़न विंडो मैनेजर (यदि इससे कोई फर्क पड़ता है) का उपयोग कर फेडोरा 10 पर निष्पादित किया जा रहा है।

कोड मदद करने के लिए समझाने मैं क्या मतलब है:

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(); 
    } 
    } 
} 

अद्यतन 6 मार्च 2009 देख रही है और चीजों की एक पूरी श्रृंखला से बाहर की कोशिश कर रहा (नीचे दिए गए सुझावों के लिए VonC करने के लिए धन्यवाद) के बाद, मैं भर में आया था ऐसा कुछ जो अब तक काम करता है। यह बेहद कमजोर है लेकिन कम से कम मुझे इस पल के लिए कुछ और काम करने की अनुमति देता है।

Control.embeddedHandle से लौटाई गई आईडी विंडो आईडी के करीब है। यह एक अनुमानित ऑफसेट से अलग है। तो मेरी कोड है:

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 है 5 + (विगेट्स की संख्या से पहले एम्बेडेड समग्र शैल को जोड़ा गया)।

यह अब तक मेरे सिस्टम पर विश्वसनीय लगता है। मैंने अभी तक यह देखने के लिए नहीं देखा है कि यह एक अलग वातावरण में गिरता है या नहीं।

+0

बस कुछ और सुराग के लिए मेरा जवाब अपडेट किया गया ... कुछ भी "निश्चित" अभी तक नहीं है। – VonC

उत्तर

3

यदि आप create a Composite शैली SWT.EMBEDDED शैली के साथ हैं, तो SWT/GTK + Composite.embeddedHandle के तहत एक एक्स विंडो आईडी होगी जिसका उपयोग आप XEMBED बच्चे को parenting के लिए कर सकते हैं।

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

यह XEMBED प्रोटोकॉल का उपयोग करके एम्बेडिंग का समर्थन करता है।

यह

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

code here का उदाहरण इसके हैंडल से खिड़की आईडी प्राप्त करने के लिए इस्तेमाल किया JNI कोड के समान है।

वर्ग के उदाहरण OS का उपयोग कर:

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

ओएस मैं पा सकते हैं वास्तव में org.eclipse.swt.internal.win32.OS है, जीटीके नहीं है, और यह एक आदर्श समाधान है क्योंकि आप एक आंतरिक पैकेज का उपयोग होता नहीं है, लेकिन यह आपको एक विचार दे सकता है कि कहां देखना है।

अपने मामले में, org.eclipse.swt.internal.gtk.OS सही वर्ग है, और आपको ट्री या कूलइटम स्रोतों में देखना चाहिए कि वे GetWindow फ़ंक्शन का उपयोग कैसे कर रहे हैं।
कुछ अन्य समारोह की जरूरत जीटीके में कहा जाता था, हो सकता है की तरह gtk_container_get_children(int container);

यह संदेश कि मैंने शुरू

पर बात कर रहे थे करने के लिए said in an answer है आप एक्स खिड़की की जरूरत है, वहाँ ऐसा करने के लिए कोई रास्ता नहीं है यह सार्वजनिक एसडब्ल्यूटी एपीआई (यहां तक ​​कि आंतरिक के माध्यम से भी जा रहा है) से, और इसके अलावा अगर कोई रास्ता नहीं था तो मुझे नहीं लगता कि आप इसे सभी नियंत्रणों के लिए गारंटी दे सकते हैं।मुझे यकीन है कि अगर यह काम करता है नहीं कर रहा हूँ, लेकिन करीबी आप मिल सकता है हो सकता है के लिए:

  1. Control.fixedHandle सार्वजनिक
  2. उपयोग OS.GTK_WIDGET_WINDOW (control.fixedHandle) कि अनुवाद करने के लिए एक एक्स खिड़की करने के लिए एक GdkWindow
  3. उपयोग OS.gdk_x11_drawable_get_xid (gdkWindow) प्राप्त करने के लिए बनाने के

मुझे लगता है कि दूसरी तरह Control.handle लेने के लिए, और फिर उस पर GTK_WIDGET_WINDOW() कहते हैं, या यदि वह है null रखें बुला हो सकता है यह तब तक अपने माता-पिता पर जब तक आपको GdkWindow के साथ कोई नहीं मिलता है, और फिर उसे एक्स विंडो में अनुवादित करें।

यहां कठिनाई यह है कि एसडब्ल्यूटी जीटीके + से बात करता है, जो जीडीके से बात करता है, जो तब एक्स से बात करता है। तो, आपके और एक्स विंडो के बीच तीन परतें हैं।

+0

सहायता के लिए धन्यवाद। हालांकि, मुझे org.eclipse.swt.internal.gtk.OS में GetWindow विधि या GW_CHILD प्रॉपर्टी नहीं मिल रही है - क्या यह सही पैकेज उपयोग करने के लिए है? – cursa

0

धन्यवाद, इससे मुझे बहुत मदद मिली। मेरे पास mplayer के साथ वीडियो दिखाने के लिए एक एम्बेडेड एसडब्ल्यूटी कैनवास है।

मुझे एक और उदाहरण मिला जहां कैनवास को एसडब्ल्यूटी नियंत्रण के रूप में बनाया गया था। मैं डिबगिंग करते समय एम्बेडेड हैंडल फ़ील्ड देख सकता था, लेकिन इसका उपयोग/उपयोग नहीं कर सका।

आपके उदाहरण के अनुसार मैं एसडब्ल्यूटी कंट्रोल से कंपोजिट में बदल गया, और अब मैं एम्बेडेड हैंडल तक पहुंच सकता हूं, और यह काम करता है!

3

सुनिश्चित नहीं हैं कि अगर यह अभी भी आपके लिए महत्वपूर्ण है 7 साल बाद :-), लेकिन यह मेरे लिए काम करता है:

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; 
} 

विशेष रूप से, "get_toplevel" कदम क्या जड़ विजेट/खिड़की करने के लिए कूदता है , और इसका मतलब है कि आपको "माइनस जादू विंडो ऑफ़सेट" हैक की आवश्यकता नहीं है (जिसे मैं शुरू में भी कर रहा था)।

+2

धन्यवाद :) मैंने तब से कई बार पदों/शहरों/महाद्वीपों को स्थानांतरित कर दिया है और जब मैं प्रश्न पोस्ट करता हूं तो मैं यह भी याद नहीं कर सकता कि मैं क्या करने की कोशिश कर रहा था। उम्मीद है कि यह इस समस्या के साथ किसी और की मदद करेगा। – cursa

संबंधित मुद्दे