LinuxのX11に関する世界観(2.ツールキットとデスクトップ環境)です。
Linuxにおけるデスクトップ環境(昔は統合デスクトップ環境と呼んでいた)は、デスクトップ環境における統一されたアプリケーションや、その基盤となるさまざまなコンポーネントソフトウェアの集合体のことを言う。
X11やGTK/Qtなどのツールキットだけを用いて、twmのような原始的なウィンドウマネージャを用いても、もちろんLinuxのGUIアプリケーションを使うこともできる。このような環境を好む人も多い。
だが、KDEやGNOMEでは、たとえばWindowsやmacOSのような、「使いやすくてどのソフトウェアも同じ規則や見た目(ルック・フィール)に従って開発されているようなワークスペース環境」を提供する。
たとえば、GNOMEでは、端末アプリケーション、ファイルマネージャ、音楽再生アプリケーション、Webブラウザなどを、基本的に同じ見た目と操作性を持っていて、そして同様の規則に従って開発されているような、一貫的な環境として提供している。
また、その上で、そうしたGNOMEアプリケーション全体が従い、どのソフトウェアにとっても必要となるような、基本コンポーネントを提供している。Windowsのレジストリと同様の監視・コールバック型の設定システムであるdconfや、仮想ファイルシステム(GnomeVFS/GVfs/GIO)、CORBA(Bonobo)やD-Busを用いた分散コンポーネント技術、それからアイコンやヒューマンインターフェースガイドラインなどはこの例である。
このようにすることで、取り決めが存在しないLinuxのX11環境であっても、基本的なアプリケーションの使用感は共通し、同じように簡単に使えるようになっている。
また、Linuxにおける特徴は、「標準的ではないデスクトップ環境の選択肢がたくさんある」ということ。準標準的なのはGNOMEだが、ほかにもKDE、Xfce、MATE、Cinnamonなどが存在する。デスクトップ環境としての機能を持たない、単純なウィンドウマネージャであれば、さらに多数存在する。
これは「カスタマイズ性が高い」という意味ではWindowsなどに対する大きな優位性ではあるが、実際にはGNOMEと使用感が違うため使ったり設定や管理を行うためにはそれぞれのデスクトップ環境のスタイルを学ぶ必要があるし、下手にインストールしようとするとシステムが滅茶苦茶になってしまうリスクもある。
なので、一般的な人は準標準的なGNOMEを使ってもよい。GNOMEには拡張機能が存在するため、GNOMEを使いながらGNOMEの使用感をたとえばWindows 10風にしたりMac風のDockを導入することもできる。Linuxの使い方は人によって千差万別である。
デスクトップ環境・ウィンドウマネージャも参照のこと。
ツールキットは「道具箱」という意味で、X11でGUIプログラミングを行う際に、Xlibの上で動いてくれるさまざまなGUIの部品(パーツ)のこと。
通常、UNIXではX11の上でMotifのようなGUIツールキットを用いてGUIのアプリケーションを開発する。Moitfはフリーではなかったため、GTK+やQtのようなフリー版のツールキットが開発されている。
主にIntrinsics/Xt(正確にはツールキットではなく、ツールキットを作るために必要な基本ライブラリ)、Athena widget set(Xaw、アテナプロジェクトによるツールキット)、Motif、GTK+、Qt、Tkなどがある。
また、Windows APIのクローンとしてはWine、NeXTSTEPのクローンとしてはGNUstepなどがある。将来的な.NET CoreではWindows.Formsもオープンソースで提供される予定であり、期待が高まっている。
商用UNIXで使われる、昔支配的だったツールキット。
初期のGIMPなどは、GTK+で書かれる前はMotifを使用したコードで書かれていた。
スタイルに味があって一部では人気である。
Motifの世界観を参照のこと。
GIMPによって開発された、本当にフリーなGUIツールキット。
GNOMEで使われており、GLibによってC言語を用いながらオブジェクト指向を行い、さまざまな言語で利用できるラッパーライブラリ(バインディング)を提供する。
このため、C/C++だけではなく、C#、Java、Perl、Python、Ruby、JavaScript、Valaなどからも使うことができる。
ただし、それぞれのバインディングに開発状況の差があり、必ずしも安定して使えるとは限らないため、標準的に使われるのはC/C++によるGTK+/GTKmmである。
GTK+の世界観を参照のこと。
Trolltechという会社によって提供されたGUIツールキット。
標準的ツールキットのないLinuxのためのツールキットだったが、残念ながらフリーとは言えなかった。
KDEで使用されたが、Qtがフリーではないため、GNOMEプロジェクトが発足した。
現在では、Qtはオープンソースのライセンスを採用し、名実ともにフリーソフトウェアとなった。
Linuxの他にWindowsでも動くクロスプラットフォームなツールキットとして知られる。
開発に使用できる言語はC/C++のほか、Pythonなど。
テーマやスタイルが表現豊かで美しく、その名の通り「キュートなツールキット」として知られる。なぜか、GTK+はQtと比べてはるかに醜い。
Qtの世界観を参照のこと。
主にTcl/Tkとして使われることの多いツールキット。
昔のMozillaなどはブラウザ画面の表示にTkスタイルのボタンやテキストボックスのスタイルを採用していた。(当時のMozillaは標準では日本語の太字すら出ない、開発途上のブラウザだった。)
Tcl/Tkを参照のこと。
ツールキット。小さく、クロスプラットフォームで、どの環境でも同じルック・フィールとなる(ネイティブではない)。
Wikipedia
2023.04.26編集
FOXは、クロスプラットフォームなツールキットのひとつで、LinuxのほかWindowsなどでも動作する。
基本的にC++で書かれているが、PythonやRuby向けのバインディングも提供されている。
書籍「Ruby Way 第2版」では、FOXのRubyバインディングであるFXRubyでGUIアプリケーションを開発する方法に多くのページが割かれており、著者は「FOXの未来を信じている」と述べている(ただし、この本は古い)。
よって、RubyでGUIアプリケーションを書く際に、GTKやTk以外の選択肢としてFOXが挙げられる。
見た目は、Windows 95とよく似ている。
2023.04.26
wxWidgetsは、クロスプラットフォームの有名なGUIツールキットのひとつ。
GUIツールキットのほか、GUIアプリのクロスプラットフォーム開発をやりやすくするために、GUIツールキット以上のさまざまな機能を提供している。
基本的にC++向けだが、wxPythonやwxRubyのようなバインディングも存在する。
書籍「Ruby Way 第2版」では、Pythonの将来的な標準GUIツールキットとして、wxWidgetsを推す声が多いといったことが記述されている(ただし、この本は古い)。
wxWidgetsは昔から有名なC++のGUIツールキットであり、WindowsやUNIXやmacOSなどさまざまな環境で動作する。エミュレートではなくネイティブのAPIを使っているため、ネイティブと同様のルック・フィールとなる。
2023.04.26
ElectronはJavaScriptとWeb技術(HTML/CSSなど)でGUIアプリを開発する技術。最近はElectronによる「GUIアプリ新時代」が到来しつつある。
Electronを参照のこと。
2023.04.26
GTKやQtなどのGUIツールキットでは、テーマエンジンを搭載しており、テーマを変えることでアプリケーションの見た目を変えることができる。
ウィンドウマネージャ自作のページに、テーマの作成についての情報があります。
GTKアプリケーションとQtアプリケーションでは、テーマエンジンが異なるため、アプリケーションのルック&フィールが異なってしまう。
これについては以下のような記事が参考になる。
X11のデスクトップ環境について言えることは、「メタファーの実現」である。
メタファーとは隠喩のことで、コンピュータを現実のものに喩えた「デスクトップ」あるいは「ワークスペース環境」を提供する。
GNOMEやKDEは、既存のWindowsやmacOSのようなデスクトップOSの操作環境と基本的には同一の、デスクトップ環境を構成するGUIアプリケーションをひとまとめに開発しており、一定の共通性のあるルック・フィールでデスクトップを操作できる。
メタファーの実現は重要で、コマンドラインでは「シェルとコマンドとファイル」によって実現されていた「コマンドライン環境」が、GNOMEやKDEではファイルマネージャやランチャーやウィンドウマネージャによって全く違う「GUI環境」に変貌する。
LinuxはGUIの分野ではコマンドラインほどの目立った成果は得られていないが、そのためにかかる開発のコストや手間はコマンドラインより大きく、さまざまなGUIアプリケーションをウィンドウマネージャや基礎のアーキテクチャ(ライブラリやフレームワーク)の基に実現している。またGNOMEや最近のKDEなど一部の環境はCORBAやD-Busのような分散ネットワークシステムを基盤にしており、Plan 9のように分散ネットワーク上でGUIアプリケーションを実行できる。
Linuxで実行出来る巨大なデスクトップ環境の1つ。シンプルで使いやすい、一般ユーザーに分かりやすい操作性と、CORBAを使用したネットワークオブジェクト指向なアーキテクチャを提供する。ただし、巨大なコンポーネント指向のデスクトップであるため、昔から動作が遅く「もっさり」しており、またデザインがのっぺりとしていてダサい。動作が遅いだけではなく、何をするにも到達するまでのステップが一息遅い。だが、一般ユーザー、時にパソコン初心者のことを良く考えており、余計なものがなく簡単に使える、シンプルなデスクトップを目指している。
最近ではSunがやっていたように、UNIXワークステーションの環境でもGNOMEが使われることが多くなってきている。GNOMEがKDEよりも標準的に採用されることが多い理由は、こうしたUNIXワークステーションベンダーが会社としてGNOMEを支持する傾向が強いからである。なぜか、明らかにKDEの方が優れているのに、馬鹿なGNOMEを標準的に採用する。
だが、GNOMEが決して馬鹿なわけではなく、最近はGNOME 3はWindows 8よりも先んじて投入された、「全画面インターフェース」の先駆けであり、GNOME 3はオリジナル要素が強い。逆にKDEは個性を失い、美しくなったように見えてWindowsと全く同じものになった印象がある。
GNOMEの世界観を参照のこと。
Linuxで実行出来るもうひとつの巨大なデスクトップ環境。機能性とQt/C++による整理されたフレームワーク、美しくて使いやすくカッコいいデスクトップ環境が特徴。美しい代わりメモリを食うことで知られており、またGNOMEに比べて不安定なところがある(GNOMEは遅くても起動するが、KDEは起動すらしない場合が多い)。「本当のLinuxのデスクトップ」を目指しているが、Qtを採用しているため、FirefoxのようなGTK+アプリケーションと調和せず、「美しいようでそんなに美しくない」デスクトップ環境である。
KDEの世界観を参照のこと。
UNIXワークステーションで使われることの多い統合デスクトップ環境。Motifをツールキットとして採用する。KDEはそもそもはこのCDEを模倣して作られた。
Motifを参照のこと。
Xfceは意外と人気がある。僕は、みんなが使う時のことを考えると、UbuntuでXfceかMATEを使ってもらうのが一番良いと思う。
昔使っていたところで考えると、本当に軽くて使いやすいのだが、何かがチープで、シンプル過ぎて一人前のデスクトップ環境として使えないような、そんな印象を受ける。
UNIXのメタファーを尊重し、それぞれを単機能で小さなプログラムにする、という発想は、とても良い発想だと思う。
Xfceの世界観を参照のこと。
軽量さを目指しているデスクトップ環境。ただ、僕は機能性を考えるとMATEの方が良いと思う。
LXDE/LXQtを参照のこと。
Androidはケータイ向けで、僕はスマホで使っていますが、本当はテレビと通信させるなどでも動きます。テレビと通信させる場合は、マウスポインタを使うことも出来ます。
Androidを参照のこと。
UbuntuではGNOME 3のGNOME-Shellを拒否し、独自に開発したインターフェースであるUnityを採用していたが、最近はGNOME 3に戻ったようである。
Ubuntuを参照のこと。
UbuntuのUnityがやったことで知られていますが、GNOMEやKDEでもMac風のメニューバーを画面トップに持ってくるインターフェースにしている例が、マイナーディストリビューションで見られるようになりました。
どのディストリビューションだったかは失念しましたが、探してみてください。マイナーなディストリビューションでも、最近は技術力が高く、インターフェースを大胆に変えているものや、Mintのようにさまざまな使いやすいオマケソフトをつけているものが増えています。
最近は新しいデスクトップ環境がどんどん開発されています。CinnamonやMATEのようなGNOME 3の代替・forkだけではなく、Budgie, Pantheon, Deepinなどをディストリビューションがサポートする動きも大きくなっています。
UbuntuではUbuntu BudgieとしてBudgieを公式のフレーバーとして対応し、Fedora 30ではPantheonとDeepinに対応しました。
これからLinuxデスクトップはとても面白くなっていくと思います。もちろん、フレーバーやSpinとして対応していないデスクトップ環境やウィンドウマネージャでも、UbuntuやFedoraのパッケージから導入することができます。
2017-11-01より。
僕は、LinuxのGUI環境は、SVGとHTMLの拡張のような言語を作って、どんなグラフィックスでもテーマで描画出来るような、そういう「異次元のテーマ」をサポートするのが良いと思う。
AdobeのFlashと似ている。
アイコンは今はpngのようになっているが、どんな風にリストするのか、のようなことまでSVG-HTMLでサポートする。
そういう風にすれば、きっとデザイナーもIllustratorのような雰囲気でLinuxのテーマを作ることが出来るだろう。
出来れば、MicrosoftがWindows XPの時に裏で実装していたスキン機能や、XULなどの技術を凌ぐものになってほしい。
UIをXMLにすることで、全てのインターフェースをサポート出来るかもしれない。
だが、GTK+アプリのそれぞれの作り方と矛盾するものになってはいけない。
ある意味、SVGでHTMLにするなら、バックエンドをPHPのようなものにして、そのインタプリタ・エンジンから作っても良い。
ある意味、ブログに良くあるテーマ機能と同じものを作れば良い。
だが、GUIである以上、ページよりもインタラクティブなスキン・シェルにする必要がある。
Linuxを使いやすいものにするために必要なのは、僕が思うに以下のような方針を決めることだと思う。
1.最初から全部の情報を見せて、最も少ない手順で操作出来るようにすること
2.画面上の混乱や変化を最低限にし、驚きの少ない自然な操作を可能にすること
3.何がどの機能、どのアプリケーションを意味しているのかを明確にすること
4.きちんと美しく整理・統合されたものにすること
5.アクションに応じて出てくるメニューなどは、絶対に「自然」の範囲をはみ出さないようにすること
6.分からなくなった時は、何をすればヘルプや解説を得られるのかを明確にし、出来るだけ最初から解説を表示するようにすること
7.ヘビーユーザーのために、たくさんの操作法を可能にすると同時に、画面を整理し、初心者に必要のないインターフェースを初心者が見なくても良いようにすると同時に、どこを操作すればそうした画面の設定を変えられるのか、というボタンを一番目立たせること
8.デザインの基本と同じように、目立たせるべきものと目立たなくて良いものの優先順位をきちんと決めて、その上で良く整理され、統合されたインターフェースをすること
悪い例は、Microsoft OfficeやGIMPのようなどこに何があるのかさっぱり分からないアプリケーションで、良い例はEclipseやAdobe Illustratorのような考え抜かれたアプリケーションだ。
僕は、昔から「自然」という発想によるインターフェースを良く考える。自然に機能が配置・準備され、自然な挙動を示し、それが自然にそうデザインされるべきである、といった「自然なGUI」というものを考える。そこでは、全てのことに根拠を求めて、どんなところにどんな機能があるのか、デザイナーのようにきちんと考える。ただの機械ではなく、操作環境なのだということを意識する。
今のGNOMEは、リーナス・トーバルズが言っているように、「ユーザーを馬鹿だと見なしている」と思う。デスクトップ環境のことを何も知らない素人のことしか考えていない。本当は、Linuxはある程度慣れた人間しか使わないはずだ。だから、一般的Linuxユーザーのことを考えていない。一般的Linuxユーザーに良いようにしたいなら、もっとUNIXとの親和性を高め、そして管理が簡単にコマンドと設定ファイルで出来るような、そういうものにしなければならないはずだ。ある意味、最近は自動設定するようになったのは良いが、もし手動設定に戻したい場合にどうすれば良いのか良く分からなかったりする。そうした、一般的なLinuxユーザー、もっと言えばパソコンオタクやIT上級者のために使いやすい機能環境を作らなければ、Linuxユーザーは減るばかりで増えることは無いだろう。
GNOMEのインターフェースは簡単にし、分かりやすくするのは良いが、本当に大切な効率性や考えなければならないこと、手間の削減のようなことを見落としている。その方が初心者向けにすることよりも優先度は高いはずだ。
僕は、X11の新しい機能の提案として、GUIパイプを提案する。
UNIXではパイプを使うことで、あるプログラムの出力を別のプログラムの入力に与えることが出来る。
僕は、GUIでテキストをコピー&ペーストしたり、いったんファイルに保存して開いたりすることが、このパイプと類似していると思う。
だから、GUIでもパイプのようにテキストとコマンドを介して、処理を自動化出来ないかと思う。
このためには、GUIのプログラムの機能をコマンドから呼び出せなければならない。
そして、実現するとこのようになる:
$ cat test.txt | msoffice.sort('A_to_Z') | msoffice.creat_toc('.table') | illustrator.make_textbox('center').set_background('black').save_png('view.png')
このようにすると、GUIのアプリケーションをコマンドで自動化し、UNIXの今までのコマンドプログラムとも連携出来る。ややオブジェクト指向のコードに似ている。
まるでGUIとコマンドラインの融和を見ているようだ。
僕は、新しいデスクトップ環境のインターフェースを考えた。
まず、画面の一番上に、今開いているアプリケーションの一覧をアイコンで表示する。これは、Windows 7のタスクバーと同様。Dockのように動く。
そして、画面の上から二番目のバーに、アプリケーションのメニューバーを表示する。これは、Macでアプリケーションメニューを表示するのと同様。
一番上のアプリケーション一覧をタブのようにして、アプリケーションのアイコンをクリックすることでメニューバーの表示を切り替える。
その上で、その下の大きなスクリーン画面には、アプリケーションのウィンドウを表示する。
最後に、画面の一番下に、今開いているアプリケーションのウィンドウ一覧を表示する。これは、Windows XPのタスクバーと同様。
ウィンドウ一覧に表示されるのは、一番上のアプリケーションアイコン(アプリケーションタブ)で選択されたアプリケーションのみ。
そして、アプリケーションタブを画面左に表示したり(UbuntuのUnityと同様)、NeXTSTEPのようにウィンドウ一覧をDockのように表示することもできるようにする。
要するに、こんな感じ。
+-----------+----+-----------------+ | App1 App2 |App3| Computer System | +-----------+----+-----------------+ | File Edit View Search Tools Help | +----------------------------------+ | | | +-------------+ | | | Window2 _+x| | | +-------------+ | | | | | | | +-------------+ | | | | Window1 _+x| | | | +-------------+ | | +-------| | | | | | | | | | | | | | | | +-------------+ | | | +---------+------------------------+ | Window1 | Window2 Window3 | +---------+------------------------+
あるいは、アプリケーションアイコンからメインメニューを伸ばす感じにしてはどうだろうか。
+-----------+----+-----------------+ | App1 App2 |App3| Computer System | +-----------+----+---+-------------+ | | File | | | | Edit | | | | View | | | +--------| Window | | | | Window2+--------+ | | +-------------+ | | | | | | | +-------------+ | | | | Window1 _+x| | | | +-------------+ | | +-------| | | | | | | | | | | | | | | | +-------------+ | | | +---------+------------------------+ | Window1 | Window2 Window3 | +---------+------------------------+
これは、ウィンドウ一覧もメニューにすることで、バーをひとつだけにでき、画面を巨大なバーが占領しなくても済むようにできる。
+-----------+-------+--------------+ | App1 App2 |Windows| Place System | +-----------+-------+-+------------+ | | Window1 | | | | Window2 | | | | Window3 | | | +--------| Window4 | | | | Window2+---------+ | | +-------------+ | | | | | | | +-------------+ | | | | Window1 _+x| | | | +-------------+ | | +-------| | | | | | | | | | | | | | | | +-------------+ | | | | | | | +----------------------------------+
2017-10-28に関連する内容があります。
GUIを簡単に表示することの出来るスクリプト言語。
Wikipedia
Tcl/Tkを参照のこと。
昔のUNIXワークステーションで使われていたツールキットMotifとデスクトップ環境CDEについて。
Wikipedia
Motifを参照のこと。
MicrosoftによるDOS(ディスク・オペレーティング・システム)と、それを拡張する16bitのオペレーティング環境。この当時はまだDOSとWindowsが分離されていた。今のLinuxとX11に近い。
Wikipedia
DOSを参照のこと。
アップルによる先駆的とされたOS。最近のMac OS Xは昔のMacではなく、NeXTSTEPと言う技術を応用したUNIXの一つです。
Wikipedia
Macを参照のこと。
昔先進的だったOSです。
Wikipedia
BeOSを参照のこと。
昔のホビー向けパソコン。BASICと言う簡単な言語のインタプリタを使って、プログラミングを誰でも楽しめる。
僕の父親がこの世代のパソコンに詳しいです。父親は8bit以降の色んなコンピュータを集めていたことがあります。
Wikipedia
昔僕も好きだったテレビゲーム。最近はオンラインで行うネットゲームが流行っています。
Wikipedia
テレビゲームも参照のこと。