मैं एक छोटे से विंडो प्रबंधक (सिर्फ मनोरंजन के लिए) बनाने के लिए कोशिश कर रहा हूँ, लेकिन मैं से निपटने फ़ायरफ़ॉक्स द्वारा बनाई खिड़कियों में समस्या आ रही है (केवल कि आवेदन के साथ, अन्य एप्लिकेशन ठीक काम करता है)Xlib और Firefox व्यवहार
समस्या यह है कि, जब मैं फ़ायरफ़ॉक्स लॉन्च करता हूं, और अपनी सजावट जोड़ता हूं, तो यह ठीक काम करता प्रतीत होता है, लेकिन यदि उदाहरण के लिए मैं मेनू बटन पर क्लिक करने का प्रयास करता हूं, तो (उप) विंडो प्रकट नहीं होती है।
क्या लगता है कि क्लिक करने के बाद, एक ClientMessage घटना के बाद मूल्यों के साथ निकाल दिया जाता है:
Data: (null)
Data: _NET_WM_STATE_HIDDEN
Data: (null)
Data: (null)
Data: (null)
अब समस्या मैं कैसे खिड़की है, जो खिड़की को दिखाने के लिए नहीं पता है कि है। मैं के साथ की कोशिश की:
- XRaiseWindow
- XMapWindow
- मैं क्षणिक खिड़की हो और यह
लेकिन सफलता नहीं मिली दिखाने की कोशिश की। जो मुझे समझ में नहीं आता है वह यह है कि यदि यह क्लाइंट संदेश मेनू सबविंडो द्वारा उत्पन्न होता है या नहीं।
मुझे _NET_WM_STATE_HIDDEN में एक विंडो कैसे दिखानी चाहिए?
एक और अजीब समस्या यह है कि क्लाइंट मैसेज प्राप्त करने के बाद, मुझे हमेशा 2 UnMapNotify ईवेंट प्राप्त होते हैं।
मैं भी अन्य प्रश्न है, अगर मैं दिखाना चाहता हूँ "फाइल, संपादन" मेनू (Firefox में यह प्रतीत होता है, अगर मैं सही ढंग से याद है, जब आप Alt बटन दबाएँ।
शायद Firefox का वह पेड़ बनाता है ? विंडोज़
इस पाश मैं कहाँ ईवेंट प्रबंधित है:
while(1){
XNextEvent(display, &local_event);
switch(local_event.type){
case ConfigureNotify:
configure_notify_handler(local_event, display);
break;
case MotionNotify:
motion_handler(local_event, display);
break;
case CreateNotify:
cur_win = local_event.xcreatewindow.window;
char *window_name;
XFetchName(display, cur_win, &window_name);
printf("Window name: %s\n", window_name);
if(window_name!=NULL){
if(!strcmp(window_name, "Parent")){
printf("Adding borders\n");
XSetWindowBorderWidth(display, cur_win, BORDER_WIDTH);
}
XFree(window_name);
}
break;
case MapNotify:
map_notify_handler(local_event,display, infos);
break;
case UnmapNotify:
printf("UnMapNotify\n");
break;
case DestroyNotify:
printf("Destroy Event\n");
destroy_notify_handler(local_event,display);
break;
case ButtonPress:
printf("Event button pressed\n");
button_handler(local_event, display, infos);
break;
case KeyPress:
printf("Keyboard key pressed\n");
keyboard_handler(local_event, display);
break;
case ClientMessage:
printf("------------ClientMessage\n");
printf("\tMessage: %s\n", XGetAtomName(display,local_event.xclient.message_type));
printf("\tFormat: %d\n", local_event.xclient.format);
Atom *atoms = (Atom *)local_event.xclient.data.l;
int i =0;
for(i=0; i<=5; i++){
printf("\t\tData %d: %s\n", i, XGetAtomName(display, atoms[i]));
}
int nchild;
Window *child_windows;
Window parent_window;
Window root_window;
XQueryTree(display, local_event.xclient.window, &root_window, &parent_window, &child_windows, &nchild);
printf("\tNumber of childs: %d\n", nchild);
break;
}
अब clientmessage वास्तव में मैं सिर्फ कुछ जानकारी एकत्रित समझने के लिए क्या हो रहा है देखने के लिए कोशिश कर रहा हूँ और क्या मैं से देख सकते हैं में। उपरोक्त कोड, यह है कि खिड़की जो वें उठाया ई घटना में एक बच्चा होता है (फिर से: वह मेनू है? या नहीं)
MapNotify घटना है, जहां मैं सजावट जोड़ने के लिए कोड निम्नलिखित है:
void map_notify_handler(XEvent local_event, Display* display, ScreenInfos infos){
printf("----------Map Notify\n");
XWindowAttributes win_attr;
char *child_name;
XGetWindowAttributes(display, local_event.xmap.window, &win_attr);
XFetchName(display, local_event.xmap.window, &child_name);
printf("\tAttributes: W: %d - H: %d - Name: %s - ID %lu\n", win_attr.width, win_attr.height, child_name, local_event.xmap.window);
Window trans = None;
XGetTransientForHint(display, local_event.xmap.window, &trans);
printf("\tIs transient: %ld\n", trans);
if(child_name!=NULL){
if(strcmp(child_name, "Parent") && local_event.xmap.override_redirect == False){
Window new_win = draw_window_with_name(display, RootWindow(display, infos.screen_num), "Parent", infos.screen_num,
win_attr.x, win_attr.y, win_attr.width, win_attr.height+DECORATION_HEIGHT, 0,
BlackPixel(display, infos.screen_num));
XMapWindow(display, new_win);
XReparentWindow(display,local_event.xmap.window, new_win,0, DECORATION_HEIGHT);
set_window_item(local_event.xmap.window, new_win);
XSelectInput(display, local_event.xmap.window, StructureNotifyMask);
printf("\tParent window id: %lu\n", new_win);
put_text(display, new_win, child_name, "9x15", 10, 10, BlackPixel(display,infos.screen_num), WhitePixel(display, infos.screen_num));
}
}
XFree(child_name);
}
अब किसी को इन समस्याओं के साथ मेरी मदद कर सकते? दुर्भाग्यवश मैं पहले से ही कई बार गुगल रहा हूं, लेकिन सफलता के बिना।
समेकित करने के लिए, मेरे मुद्दे दो हैं: 1. फ़ायरफ़ॉक्स से सबविंडो कैसे दिखाएं 2. फ़ाइल को कैसे संपादित करें, मेनू संपादित करें।
अद्यतन
मैं xev के साथ कुछ अजीब परीक्षण फ़ायरफ़ॉक्स देखा समझने के लिए घटनाओं के क्रम एक आवेदन को दिखाने के लिए में निकाल दिया जाता है। मैंने देखा कि एकता में फ़ायरफ़ॉक्स का उपयोग करके, और किसी अन्य विंडो मैनेजर में फ़ायरफ़ॉक्स का उपयोग करके, निकाले गए ईवेंट पूरी तरह से अलग हैं।एकता में मैं केवल है:
- ClientMessage
- UnmapNotify
इसके बजाय Firefox का उपयोग कर, xfce4 साथ उदाहरण के लिए, उत्पन्न xevents अधिक कर रहे हैं:
- VisiblityNotify (एक से अधिक)
- घटना का खुलासा करें (एक से अधिक)
लेकिन अगर मैं अपने wm में VisibilityChangeMask सक्षम करने के लिए प्रयास करते हैं, मैं निम्न इवेंट प्राप्त करते हैं:
- ConfigureNotify
- ClientMessage
- MapNotify
- 2 UnMapNotify
अद्यतन 2
मैं ClientMessage विंडो में XWMhints गुण (शायद मेनू विंडो) को पढ़ने के लिए कोशिश की और मान हैं:
झंडे के लिए 67 = InputHint, StateHint, WIndowGroupHint
प्रारंभिक अवस्था के लिए NormalState
अद्यतन 3
मैं कैसे एक देखने के लिए करने की कोशिश की नोटर विंडो प्रबंधक काम करता है, और मैं शांतwm के स्रोत कोड को देख रहा था। मेरी समझ क्या है कि, जब क्लाइंट मैसेज ईवेंट आता है, _NET_WM_STATE संदेश के साथ, यह इन गुणों को अपडेट करता है, और _NET_WM_STATE_HIDDEN के मामले में यह इस संपत्ति को साफ़ करता है, और नतीजा यह होगा कि संपत्ति हटा दी जाएगी। तो मैंने उस संपत्ति को हटाने के लिए अपना कोड अपडेट करने का प्रयास किया, लेकिन यह अभी भी काम नहीं कर रहा है। वैसे भी client_message_handler में प्रासंगिक अद्यतन कोड अब इस तरह दिखता है:
Atom *atoms = (Atom *)local_event.xclient.data.l;
int i =0;
for(i=0; i<=5; i++){
printf("\t\tData %d: %s\n", i, XGetAtomName(display, atoms[i]));
if(i==1){
printf("\t Deleting Property: _NET_WM_STATE_HIDDEN \n");
XDeleteProperty(display, cur_window, atoms[i]);
}
}
यह केवल एक परीक्षण है, और मुझे यकीन है कि मैं = मेरे मामले में 1 _NET_WM_STATE_HIDDEN संपत्ति है हूँ।
यहाँcalmwm स्रोत कोड के लिए एक लिंक: https://github.com/chneukirchen/cwm/blob/linux/xevents.c
तो मैं अभी भी उस बिंदु पर अटक कर रहा हूँ।
अद्यतन 4
सच मैं अगर यह मदद करता है पता नहीं है, लेकिन मैं खिड़की MapNotify घटना में जिम्मेदार बताते हैं पढ़ने के लिए करने की कोशिश की, और खिड़की map_state IsViewable है (2)।
अद्यतन 5
मैं एक ऐसी ही समस्या अतः में यहां पाया, अजगर के साथ Xlib का उपयोग कर: Xlib python: cannot map firefox menus
समाधान XSetInputFocus उपयोग करने के लिए सुझाव देते हैं, मैं करने की कोशिश की है कि मेरे XMapNotify हैंडलर:
XSetInputFocus(display, local_event.xmap.window, RevertToParent, CurrentTime);
लेकिन यह अभी भी मदद नहीं करता है, फ़ायरफ़ॉक्स मेनू अभी भी प्रकट नहीं होता है !! और मुझे राइट-क्लिक के साथ एक ही समस्या है।
अद्यतन 6
xconfigurenotify घटना और unmap घटना के साथ खेलना मैंने पाया है कि: Xconfigure अनुरोध 2 खिड़की फ़ील्ड होते हैं: खिड़की और इसके बाद के संस्करण, और जब xconfigurerequest.window मूल्य xunmap का एक ही है विन्डो मूल्य।
और यह भी कि xconfigurerequest.above हमेशा बदल रहा है, लेकिन xconfigurerequest.window हमेशा सभी घटनाओं में समान होता है।
ऐसा लगता है कि xconfigurerequest.above उस मेनू से संबंधित है जिसे मैं खोलने की कोशिश कर रहा हूं। उदाहरण के लिए:
- एक पृष्ठ मैं एक आईडी (हमेशा बाद के हर क्लिक के लिए एक ही)
- पाने पर अगर राइट क्लिक करता है, तो मैं एक टैब पर राइट-clik, ऊपर मूल्य एक और एक
- है और वैसे ही अगर मैं फ़ायरफ़ॉक्स मुख्य मेनू
पर बायाँ-क्लिक करें तो अभी भी यह नहीं पता कि इससे मदद मिलती है या नहीं।
वास्तव में किसी को भी कोई जानकारी नहीं है?
मेरे दोस्त और मैं फ़ायरफ़ॉक्स के साथ x11, gtk, gdk, और अन्य सी lib सामग्री का बहुत कुछ करता हूं। हमने '_NET_ACTIVE_WINDOW' संकेत और 'XMapRaised' सेट करके एक विंडो पर ध्यान केंद्रित किया: https://gist.github.com/Noitidart/c7be5489fd38f8ecc76b#file-_ff-addon-snippet-x11_focuswindowbynativehandle-js-L280-L283 बीमार और अधिक देखें आपकी समस्या और मेरे मित्र को भी – yatg
आपकी टिप्पणी के लिए @yatg धन्यवाद, मेरे पास कोड स्निपेट पर एक प्रश्न है जिसे आपने मुझे भेजा है, l0 फ़ील्ड एक ही फ़ील्ड है जो c में xclient.data.l0 होगा?और आप इसे 2 क्यों सेट करते हैं? – Ivan
असल में इस कोड को अपने क्लीनर को देखें: https://github.com/Noitidart/NativeShot/blob/winnt-found-workaround-for-winnt-nondpi-scale/modules/workers/MainWorker.js#L132-L159 मूल रूप से कारण 2 था क्योंकि यह यहां देखा गया है कि '_NET_WM_STATE_TOGGLE' के लिए जादू संख्या है: https://github.com/Noitidart/NativeShot/blob/winnt-found-workaround-for-winnt-nondpi-scale/modules/ ostypes_x11.jsm # L245 'XFlush'' कार्रवाई करने के लिए महत्वपूर्ण है, यदि 'एक्सफ्लश' नहीं किया जाता है, तो कम से कम हमारे प्रयोगकर्ता में यह आगे नहीं आएगा, इसलिए 'एक्सएफएलश' का उपयोग करके आपका समाधान मुझे बता सकता है कि यह कैसे plz चला जाता है। – yatg