2011-04-27 2 views
14

J'essaie d'écrire un gestionnaire de fenêtres. (En fait, je ai écrit un OS et un compilateur, mais c'est à côté du point.)Des façons modernes d'écrire un gestionnaire de fenêtres

XLib et XCB ne sont pas exactement méchant, du moins, disons, les normes win32, mais ils sont certainement très vieux et ne se prêtent pas bien à des abstractions décentes pour rendre ma vie plus facile. Non seulement cela, mais il y a un manque flagrant de bonnes liaisons pour les langues modernes de haut niveau.

Ma question est: est-ce que tout ce matériel de bas niveau est vraiment nécessaire de nos jours? Existe-t-il des bibliothèques qui vont encapsuler toutes les choses désagréables pour moi? J'ai un vague souvenir que les Lumières avaient fait une telle chose, mais ils ne trouvaient rien. Ou est-ce que les bibliothèques de widgets modernes comme, par exemple, GDK ont assez de fonctionnalités que je n'aurais pas besoin de toucher la couche Xlib?

Toutes les bibliothèques avec des liaisons Java sont particulièrement intéressants ...

+0

Belle question. Vous n'avez pas seulement besoin de capacités de rendu pixel par pixel? Il pourrait y avoir quelques astuces, mais c'est comme ça que je commencerais. – Blender

+0

Je regarderais kwin, la métacité, compiz et/ou l'illumination. Pour ma part, j'aime le bas niveau, et j'ai seulement regardé WM en utilisant Xlib brut. Avec un peu de chance, Havoc Pennington remarquera cette question :) – ninjalj

+0

Haskell a de bonnes liaisons X11 qui ont été utilisées pour écrire le gestionnaire de fenêtres Xmonad. – wnoise

Répondre

4

Ceci est une réponse tardive Je n'ai plus beaucoup de pertinence mais je la posterai de toute façon puisque d'autres personnes pourraient la chercher ...

Je me suis posé la même question et suis arrivé à la conclusion qu'il n'existe pas de telle chose, surtout pas en Java . Alors que certains toolkits de widgets, comme qt, vous offrent la possibilité d'utiliser une structure d'affichage existante et de créer des widgets à partir des handles de fenêtres xlib existants, vous devrez toujours utiliser xlib/xcb pour faire le mauvais travail de communication avec le serveur X wm opérations spécifiques. D'autres bibliothèques, comme l'ont déclaré d'autres, comme GDK et les Lumières offrent également un assez bon travail d'abstraction de base. Pourtant, je n'étais pas heureux avec le fait que tous ceux-ci utilisent C/C++ et assis sur mon cul paresseux en attendant que quelqu'un ait fait le travail pour moi en Java n'était pas une option, j'ai commencé à écrire ma propre bibliothèque cela vous permet de construire votre propre WM modulaire, en Java. https://github.com/Zubnix/trinityshell

+0

Je suis très intéressé de voir ça. En ce moment, je suis immergé dans d'autres choses, mais je vais certainement y jeter un coup d'oeil à l'avenir. Fais nous savoir comment tu reussis! –

9

est tout ce genre de choses de bas niveau ces jours-ci vraiment nécessaire?

Si par "substance de bas niveau" vous voulez dire le langage C alors non, ce n'est pas nécessaire d'un point de vue technique; vous pouvez utiliser XML de XCB pour générer des liaisons pour n'importe quelle langue.

Cependant, si par "substance de bas niveau" vous entendez traiter au niveau du protocole X alors, oui, c'est nécessaire (si vous ne voulez pas vous tirer les cheveux). Un gestionnaire de fenêtres doit fonctionner au niveau du protocole X11, donc l'utilisation de quelque chose de «haut niveau» ne vous rendra la vie difficile. En fait, XCB a été créé précisément parce que Xlib était trop haut, masquant trop en dessous, donc il était facile de faire des erreurs, et il était difficile, voire impossible, d'avoir un contrôle total. (De plus, XCB n'est pas "très vieux" du point de vue X. C'est seulement au cours des dernières années que toutes les grandes distributions Linux ont commencé à utiliser XCB.)

+1

bonne réponse. la meilleure approche de haut niveau est probablement de commencer avec un WM existant. aussi, une option pourrait être de suivre gnome-shell en utilisant JavaScript.XCB et gobject-introspection vous fournissent tous les deux des outils pour automatiser les liaisons de langage si vous avez une autre langue en tête. –

+0

btw, puisque la direction future est qu'un WM doit aussi fonctionner comme un CM, et dans l'ensemble c'est un peu un rocket-sciencey, je pense qu'il y aurait un gros argument pour utiliser la partie C de gnome-shell et permuter le Partie JavaScript (plus ou moins), si votre objectif est une interface alternative. Les décisions de l'interface utilisateur devraient être en grande partie dans JS, mais la boucle de peinture et le gunge de bas niveau dans les anciens bits de métactivité et dans les bits C de fouillis. –

+1

Je suis respectueusement en désaccord: il ne semble pas y avoir beaucoup de choses exotiques pour les gestionnaires de fenêtres, à part les événements spéciaux de gestionnaire de fenêtres et XGrabKey(). En fait, depuis que j'ai posté ma question, j'ai piraté avec gdk, et ça * fait presque * beaucoup de choses que je veux; J'ai du code qui gère Windows (d'une manière très primitive) presque entièrement du domaine GdkWindow. Hélas, les choses qu'il ne fait pas sont plutôt désagréables. En particulier, gdk fait des choses très étranges avec l'entrée au clavier et si XInput est disponible, il ignorera KeyPress et KeyRelease. Devinez quels événements XGrabKey() envoie? Droite. –

Questions connexes