سؤال

لقد حصلت على تطبيق Python/Linux يعرض أجزاء من المعلومات التي أحتاجها في نافذة GTK. لأغراض هذه المناقشة ، يجب أن تتصرف تمامًا مثل الرصيف - موجود على جميع أجهزة الكمبيوتر المكتبية الافتراضية ، ولا تتداخل النوافذ المكثفة.

النقطة الأولى سهلة للغاية ، لكنني قضيت أيامًا في ضرب رأسي ضد شاشتي في محاولة للحصول على النقطة الثانية - منع التداخل. لا ينبغي تغطية تطبيقي إذا تم تعظيم نافذة أخرى. لا يكفي تعيين "دائمًا في الأعلى" ، حيث تجلس النوافذ الأخرى خلف شريط المعلومات الخاص بي بدلاً من التوقف عند الحافة.

باختصار: مع نافذة نمط الرصيف/اللوحة ، كيف يمكنك منع النوافذ الأخرى من زيادة/تحتها؟

تحديث: تم حل المشكلة بفضل Vsemenov

هل كانت مفيدة؟

المحلول

يستخدم _NET_WM_STRUT و _NET_WM_STRUT_PARTIAL (للتوافق مع الوراء) خصائص لحجز المساحة على حافة سطح مكتب نظام Window.

مع Pygtk ، يمكنك تعيين هذه الخصائص مثل ذلك ، على افتراض أن Self.Window هو مثيل لـ GTK.Window:

self.window.get_toplevel().show() # must call show() before property_change()
self.window.get_toplevel().window.property_change("_NET_WM_STRUT", 
    "CARDINAL", 32, gtk.gdk.PROP_MODE_REPLACE, [0, 0, 0, bottom_width]) 

توضيح على معلمة البيانات [0, 0, 0, bottom_width] في أعلى:

تحدد هذه المعلمة عرض المساحة المحجوزة في كل حدود على شاشة سطح المكتب بالترتيب: [left, right, top, bottom]. لذا [0, 0, 0, 50] سيحتفظ 50 بكسل في أسفل شاشة سطح المكتب لعنصر واجهة المستخدم.

إليك مثال عمل بسيط:

import gtk

class PyGtkWidgetDockExample:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_default_size(100, gtk.gdk.screen_height())
        self.window.move(gtk.gdk.screen_width()-100, 0)
        self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)        
        self.window.show()          
        self.window.window.property_change("_NET_WM_STRUT", "CARDINAL", 32, 
            gtk.gdk.PROP_MODE_REPLACE, [0, 100, 0, 0])               

app = PyGtkWidgetDockExample()
gtk.main()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top