среда, 29 декабря 2010 г.

RubyMine, PyCharm и всё что построено на IDEA/Swing. Некролог.

Несколько раз я пробовал это чудо. Надо сказать что по функционалу это фантастика, везде хвалят, любят, пользуют(хотя из знакомых есть всего 2 любителя IDEA, и те юзают PyCharm).
Цель сегодняшней попытки - добить это дело, довести RubyMine до "совершенства" и определить можно ли его использовать.


В первые свои попытки завести PyCharm и RubyMine, я столкнулся с проблемой рендерринга окон IDEA. Это было просто серое окно:


Гуглить по признакам было не легко, но в конце концов я дошёл до нужной ссылки:
https://awesome.naquadah.org/wiki/Problems_with_Java

Суть в чём: Awesome является одним из менеджеров окон, который не поддерживает re-parenting. Обидно, но не очень.

К слову, данная проблема не подтверждена на Java 1.7. Я использую Java HotSpot 64-Bit Server VM 1.6, где данная проблема широко известна.


Официально это считается багом, но Sun так и не удосужились пофиксить его(хотя, по ссылкам на багрепорты есть отчёты за 2008ой год, что фиксы есть и они применены, но хз).
Поэтому вендорам дистрибутивов пришлось самим вставлять патчи, которые активируются при добавлении ключа для JVM:
_JAVA_AWT_WM_NONREPARENTING=1; export _JAVA_AWT_WM_NONREPARENTING
Увы, не везде данный патч есть, поэтому есть иной вариант.
Дело в том, что Sun сами попали в свои грабли. Как? Очень просто. Дело в том, что у них есть своя WM, которая не поддерживает re-parenting - LG3D. Поэтому в Swing были встроены механизмы для определения WM и использования Swing как нужно для верного отображения на ней.
Нужно всего то дать приложению думать что у нас LG3D.
wmname LG3D && ./rubymine.sh
wmname - утилита из пакета suckless-tools.


После этого оно работает, запускается.



Первое что бросается в глаза - ШГ(да-да, шрифты - говно). Хотя, конечно, кого-то быстрее вырвет от оформления, оно здесь тоже не на много лучше чем шрифты.

На этом я заканчивал свои приключения. Однако, в венде оно выглядит лучше, да и люди используют, значит можно сделать и лучше, не так ли?

ШГ
Правится очень просто, как и во всех "жаба"-приложениях:
-Dawt.useSystemAAFontSettings=lcd
или сразу
env _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=lcd" ./rubymine.sh
Но можно и просто добавить "-Dawt.useSystemAAFontSettings=lcd" в файл rubymine.vmoptions в директории bin "идеи".

Везде советуют строчку "-Dawt.useSystemAAFontSettings=on", но, как оказалось, оно не везде работает и проще указать сразу lcd.


Оформление
Вообще, я могу посоветовать GTK+, но оформление меняется не всё, да и если и меняется, то иногда даже более уродливо становится.
Вот здесь всё... веселее.
Первое, что нужно понять, так это то, что в Swing(а это и есть графический тулкит, на котором построена "идея") нет понятия "тема оформления", но есть LAF'ы (Look And Feel менеджеры): Motif, Alloy, jGoodies, GTK+ etc. Все они дают наборы уже самих тем.

Небольшое отступление по поводу Swing
Swing имеет массу проблем рендерринга. Основная проблема, из-за которой всё тормозит и нет смысла что-то делать ещё - метод рендерринга в Java2D. А там он делается просто: все виджеты рендерятся софтварно и откладываются в память, а затем передаются менеджеру выше(Xorg) в виде битмапы. Из-за этого как-раз и происходят проблемы во время смены темы в Swing-приложениях(например, тема не полностью меняется, потому что некоторые изображения кешированы и отдаются сразу, а не ререндерятся с новой темой оформления).
Было много бесед на тему Java2D, но "знатоки" решили не трогать, так и приходится жить.
Стоит отметить что SWT(который используется в Eclipse) лишён данной проблемы.


Всё, казалось бы, очень просто: нужно найти хорошую тему для одной из LAF или найти хороший LAF с хорошей темой.
Это просто!
Вот есть офигенный LAF: https://substance.dev.java.net/
В 2005ом году его можно было использовать(история успеха), а вот сейчас уже нет. Дело в том, что IDEA:
1) Использует тучу собственных виджетов, которые просто не будут изменены через обычные LAF для Swing.
2) Использует собственные костыли-обвязки(точно сказать не могу, лучше спросить у знатоков) для стандартных LAF.
Я уже хотел смириться с тем, что придётся использовать тему Graphite из состава Substance, но оказалось что и её применить не смогу из-за двух пунктов выше.
Я бы хотел поэкспериментировать ещё немного, но понимаю что нет смысла, ведь есть даже открытые репорты, на которые есть ответы и нет решений:
http://youtrack.jetbrains.net/issue/PY-2032
http://youtrack.jetbrains.net/issue/IDEABKL-5514
http://youtrack.jetbrains.net/issue/IDEA-62247
http://devnet.jetbrains.net/thread/289737

Собственно, на этом можно и закапывать. Ответов в репортах почти нет, а значит оно и не особо нужно людям, а тем более - нам.

Справедливости ради стоит отметить что подсветка кода шикарная, есть много вариантов и все шикарны.

В принципе, меня может быть и устроит тема XP, но только в офисе.
Тем не менее, вот что получилось:



И просто чтобы было с чем сравнивать, вот скрин полностью устраивающей Aptana Studio 3(eclipse-based):

Комментариев нет:

Отправить комментарий