LINUX.ORG.RU

Знатокам Qt, которые хотят внести вклад в ядро linux

 , , ,


0

2

GUI для конфигурирования ядра: make xconfig. В нем полностью отсутствует подсветка синтаксиса. Включаем Options->Show prompt options:

Ceph core library (CEPH_LIB)

CONFIG_CEPH_LIB:

Choose Y or M here to include cephlib, which provides the
common functionality to both the Ceph filesystem and
to the rados block device (rbd).

More information at http://ceph.newdream.net/.

If unsure, say N.

Symbol: CEPH_LIB [=m]
Type : tristate
Prompt: Ceph core library
Location:
-> Networking support (NET [=y])
Defined at net/ceph/Kconfig:1
Depends on: NET [=y] && INET [=y]
Selects: LIBCRC32C [=m] && CRYPTO_AES [=y] && CRYPTO [=y] && KEYS [=y]
Selected by: BLK_DEV_RBD [=m] && BLK_DEV [=y] && INET [=y] && BLOCK [=y] || CEPH_FS [=m] && NETWORK_FILESYSTEMS [=y] && INET [=y]

Symbol, type. prompt, Location, Defined, Depends on, Selects и Selected сливаются в одно.

Было бы хорошо, если бы они как-то различались цветом.

Либо отличались цветом конфиги разных подсистем:

блочная — BLK_DEV_RBD, BLK_DEV одним, сетевая INET, CEPH_FS — другим.

Думаю, многие скажут за это спасибо.

Для этого нужно написать в linux kernel mailing list и заявить о том, что вы разработчик и хотите помочь. Узнать желания других людей (возможно, они захотеть иметь это как отдельную опцию) и реализовать.

★★★★★

Я правильно понял что всего навсего надо реализовать разукрашивание текста в описании и возможно дерева?
Ссылку бы неплохо на исходники чтоб код глянуть, что-то не очень гуглится.

V1KT0P ★★
()

Было бы хорошо, если бы они как-то различались цветом.

Меня например там другое удивляет. Что для того чтобы галочка „заработала“ необходимо вручную разгребать её зависимости а не тупо тыцнуть по этой галочке и положительно ответив на вопрос «Ок. Включаю <ФИЧУ> вместе со <СПИСОК ОТ ЧЕГО ФИЧА ЗАВИСИТ>» получить задуманное. Или хотя бы более вменяемые подсказки насчет того что там еще недовключено или с чем конфликты. И это блин 21й век.

init_6 ★★★★★
()

Для этого нужно написать в linux kernel mailing list и заявить о том, что вы разработчик и хотите помочь.

А разве не в linux-config? Как-то стремно туда писать, я еле набрался храбрости в linux-input задать вопрос.
Я не прочь помочь, постучи в v1kt0p [at] jabber.ru если больше никто не захочет.

V1KT0P ★★
()

GUI это конечно хорошо, но подсветка синтаксиса конфига ядра в виде плагина для vim была бы более широко одобрена, чем GUI на Qt.

Ибо ядро - штука такая, во-первых красноглазая и тут vim куда более религиозно правилен, во-вторых ядро часто конфигурируют на неком базовом этапе настройки системы, когда иксы, возможно, ещё не завелись и тем более не установлены дополнительные либы, типа Qt.

А ещё можно запилить такой веб-сервис, куда загружаешь конфиг ядра и он предстаёт перед тобой как няшный web-2.0 интерфейс с переключателями и как в айфоне. Расшариваешь этот конфиг и несколько бородатых админов могут его править коллективно, как таблицу в гугл-доксах.

kiverattes ★☆
()
Последнее исправление: kiverattes (всего исправлений: 1)
Ответ на: комментарий от V1KT0P

А разве не в linux-config?

В linux-config надо посылать готовые патчи. Я говорю lkml, потому что там можно спросить у других разработчиков, какая функциональность нужна им. Тогда написанный тобой патч (при должном качестве) наверняка попадет в апстрим.

Как-то стремно туда писать, я еле набрался храбрости в linux-input задать вопрос.

В этом нет ничего особенного. Там сидят живые люди, и они будут рады квалифицированной помощи. В общем, если интересно, могу рассказать, что конкретно надо делать.

ttnl ★★★★★
() автор топика
Ответ на: комментарий от kiverattes

Ибо ядро - штука такая, во-первых красноглазая и тут vim куда более религиозно правилен, во-вторых ядро часто конфигурируют на неком базовом этапе настройки системы, когда иксы, возможно, ещё не завелись и тем более не установлены дополнительные либы, типа Qt.

Я более имею ввиду удобство разработчиков.

На тему пользовательсткого удобства согласен с твоим софтом.

ttnl ★★★★★
() автор топика
Ответ на: комментарий от ttnl

Ну разработчики-то перцы удалые, без нас разберутся. Тем более, там диктатура торвальдса моральная. Он обосрёт в рассылке Qt как-нибудь по пьяни и все про Qt-программу конфигурирования ядра сразу забудут (-;

kiverattes ★☆
()
Ответ на: комментарий от kiverattes

Диктатура тут не при чем. Все обстоит намного проще, чем может показаться.

Если ты обладаешь достаточными знаниями и намерен этим заняться, то я объясню, что к чему. Если нет — извини, это не та тема, которую мне хочется обсуждать отвлеченно.

ttnl ★★★★★
() автор топика
Ответ на: комментарий от ttnl

В общем, если интересно, могу рассказать, что конкретно надо делать.

Конечно интересно. Неплохо бы иметь более подробное описание как разукрашивать. Только текст или дерево тоже. Разукрашивать просто ключевые слова или логику какую реализовать. Также где взять список всех ключевых слов.
Сам текст разукрасить большого ума не надо, там для отображения используется TextBrowser так что генерируй html код и все готово. Для дерева чуток подумать.

V1KT0P ★★
()
Ответ на: комментарий от kiverattes

Вы упускает сегмент встраиваемых систем, где ядро конфигурируется на другой машине,а дальше идёт кросс-компиляция

OldWiseCat ★★
()
Ответ на: комментарий от V1KT0P

Подпишись на LKML.org http://vger.kernel.org/vger-lists.html#linux-kernel

Напиши туда письмо, о том что ты разработчик Qt и хочешь добавить подстветку синтаксиса и вообще улучшить конфигурационную утилиту xconfig. И тебе хочется знать мнение других разработчиков, какие конкретно новшества хотелось бы видеть им.

Тема письма должна начинаться с тега [RFC]. Это значит «request for comments». Добавь в CC известных маинтейнеров, например Greg Kroah-Hartman, Alan Cox, H. Peter Anvin.

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

ttnl ★★★★★
() автор топика
Ответ на: комментарий от ttnl

Без ничего я написать не могу, еслиб было что стоящее тогда да а так это как-то не правильно.
Давай я тебе сделаю так, как ты хочешь. И если это будет не совсем примитив, тогда и напишу.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Я тут подумал, и появилось такая мысль. Вот с чего давай начнем. В xconfig есть поиск по названию опций: Edit->Find. Ты сможешь в него добавить возможность поиска не только по их названиям, но и по описаниям? Чтобы это включалось отдельной галочкой — checkbox. Если галочка выключена, то поведение поиска старое, как сейчас. Если включена, то поиск производится и по названиям опций, и по описанию:

Вот например опция:

«Cross-compiler tool prefix (CROSS_COMPILE)

CONFIG_CROSS_COMPILE:

Same as running 'make CROSS_COMPILE=prefix-' but stored for default make runs in this kernel build directory.

You don't need to set this unless you want the configured kernel build directory to select the cross-compiler automatically.

Symbol: CROSS_COMPILE [=]

Type : string

Prompt: Cross-compiler tool prefix

Location: -> General setup

Defined at init/Kconfig:48»

Если в строку вводим слова "compiler make build directory", то находим в том числе эту опцию. Причем слова могут быть не по порядку: главное, чтобы все они присутствовали в описании.

Сможешь сделать такое?

ttnl ★★★★★
() автор топика
Последнее исправление: ttnl (всего исправлений: 3)
Ответ на: комментарий от observer

Он же не программист.

У вас ядро пишут всякие докторы, а тут какая-то подсветка букв.

cipher ★★★★★
()
Ответ на: комментарий от V1KT0P

Отлично, у меня все работает. Внешне хорошо получилось.

Давай теперь вид кода приведем в соответствии с тем, как это принято в ядре. Придется немного помучиться, но это обычное дело, с кодом всегда сильно заморачиваются, там не должно быть ничего лишнего.

Удобнее всего работать с патчами. Сделай себе копию линуксового git:

$ git clone --depth=1 http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

После внесения изменений, чтобы их показать другим, выполняют следующие команды:

git diff -M --stat --summary > patch.diff
git diff --summary >> patch.diff

Вот твой патч:

 scripts/kconfig/qconf.cc |   69 +++++++++++++++++++++++++++++++++++++++------
 scripts/kconfig/qconf.h  |    4 ++
 2 files changed, 63 insertions(+), 10 deletions(-)
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
index 1500c38..c12b44d 100644
--- a/scripts/kconfig/qconf.cc
+++ b/scripts/kconfig/qconf.cc
@@ -6,7 +6,6 @@
 #include <qglobal.h>
 
 #if QT_VERSION < 0x040000
-#include <stddef.h>
 #include <qmainwindow.h>
 #include <qvbox.h>
 #include <qvaluelist.h>
@@ -996,7 +995,7 @@ void ConfigInfoView::symbolInfo(void)
 {
 	QString str;
 
-	str += "<big>Symbol: <b>";
+    str += "<big>Symbol: <b>";
 	str += print_filter(sym->name);
 	str += "</b></big><br><br>value: ";
 	str += print_filter(sym_get_string_value(sym));
@@ -1197,6 +1196,13 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
 	layout2->addWidget(searchButton);
 	layout1->addLayout(layout2);
 
+#if QT_VERSION >= 0x040000
+    searchInDescription = new QCheckBox(_("Search in all texts. (each words "
+        "separately by space, show only results containing all the words)"),
+                                        this);
+    layout1->addWidget(searchInDescription);
+#endif
+
 	split = new QSplitter(this);
 	split->setOrientation(Qt::Vertical);
 	list = new ConfigView(split, name);
@@ -1207,6 +1213,7 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
 		parent, SLOT(setMenuLink(struct menu *)));
 
+
 	layout1->addWidget(split);
 
 	if (name) {
@@ -1253,14 +1260,56 @@ void ConfigSearchWindow::search(void)
 	list->list->clear();
 	info->clear();
 
-	result = sym_re_search(editField->text().latin1());
-	if (!result)
-		return;
-	for (p = result; *p; p++) {
-		for_all_prompts((*p), prop)
-			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
-						  menu_is_visible(prop->menu));
-	}
+    symbol_hash;
+#if QT_VERSION >= 0x040000
+    if (searchInDescription->checkState() == Qt::Checked) {
+        QStringList search_list = editField->text().split(" ", QString::SkipEmptyParts);
+        result = sym_re_search(".");
+        if (!result)
+            return;
+        for (p = result; *p; p++) {
+            for_all_prompts((*p), prop) {
+                QString name;
+                QString text;
+                QString help;
+                if (prop->sym->name) {
+                    name = QString::fromUtf8(prop->sym->name);
+                }
+                if (prop->text) {
+                    text = QString::fromUtf8(prop->text);
+                }
+                if (prop->menu) {
+                    struct gstr gstr = str_new();
+                    menu_get_ext_help(prop->menu, &gstr);
+                    help = QString::fromUtf8(str_get(&gstr));
+                    str_free(&gstr);
+                }
+                QString all_text = name + "\n" + text + "\n" + help;
+                bool contain_all = true;
+                for (int i = 0; i < search_list.size(); ++i) {
+                    if (!all_text.contains(search_list.at(i), Qt::CaseInsensitive)) {
+                        contain_all = false;
+                        break;
+                    }
+                }
+                if (contain_all) {
+                    lastItem = new ConfigItem(list->list, lastItem, prop->menu,
+                                              menu_is_visible(prop->menu));
+                }
+            }
+        }
+        return;
+    }
+#endif
+    result = sym_re_search(editField->text().latin1());
+    if (!result)
+        return;
+    for (p = result; *p; p++) {
+        for_all_prompts((*p), prop)
+            lastItem = new ConfigItem(list->list, lastItem, prop->menu,
+                          menu_is_visible(prop->menu));
+    }
+
 }
 
 /*
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h
index 3715b3e..e9cddaa 100644
--- a/scripts/kconfig/qconf.h
+++ b/scripts/kconfig/qconf.h
@@ -7,6 +7,7 @@
 #include <qlistview.h>
 #else
 #include <q3listview.h>
+#include <QCheckBox>
 #endif
 #include <qsettings.h>
 
@@ -294,6 +295,9 @@ protected:
 	QSplitter* split;
 	ConfigView* list;
 	ConfigInfoView* info;
+#if QT_VERSION >= 0x040000
+    QCheckBox* searchInDescription;
+#endif
 
 	struct symbol **result;
 };

1)Удаление #include <stddef.h> из файла qconf.cc, действительно ли оно нужно?

2)Съехал «<big>Symbol: <b>», это однозначно ненужная правка.

3)result = sym_re_search(editField->text().latin1()); — тоже съехала

4)Стиль кодирования в ядре — отступы между блоками с помощью табуляции, а не с помощью 4-х пробелов. Длина строки — не больше 80 символов. Поправь, пожалуйста.

5)symbol_hash; — это наверное описка?

6)QCheckBox* searchInDescription;

Звездочка возле переменной, а не типа

Условие QT_VERSION >= 0x040000 — а для всех версий сразу сделать не получится? Наверное, не получится, если ты так написал.

ttnl ★★★★★
() автор топика
Последнее исправление: ttnl (всего исправлений: 1)
Ответ на: комментарий от ttnl

1)Удаление #include <stddef.h> из файла qconf.cc, действительно ли оно нужно?

В версии linux-source-3.8.0 этой строки нету. Именно из нее код.

2)Съехал «<big>Symbol: <b>», это однозначно ненужная правка.
3)result = sym_re_search(editField->text().latin1()); — тоже съехала

Да, я там кое-что пробовал и по прывычке автоформатирование нажал.

4)Стиль кодирования в ядре — отступы между блоками с помощью табуляции, а не с помощью 4-х пробелов. Длина строки — не больше 80 символов. Поправь, пожалуйста.

Хорошо завтра исправленное для последней версии выложу.

5)symbol_hash; — это наверное описка?

Да, я там кое-что пробовал, не получилось. По невнимательности пропустил.

6)QCheckBox* searchInDescription;
Звездочка возле переменной, а не типа

Посмотри на ConfigMainWindow там и так и так в перемешку сделано(linux-source-3.8.0). Я сделал так как у ближайших строк. Может просто как в п.1 разные версии.

Условие QT_VERSION >= 0x040000 — а для всех версий сразу сделать не получится? Наверное, не получится, если ты так написал.

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

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Прошу прощение за задержку, сегодня посмотрю

ttnl ★★★★★
() автор топика
Ответ на: комментарий от V1KT0P

Вот эта конструкция

result = sym_re_search(".");

не оптимальна. Мы в sym_re_search() выделяем память под строки, которые фактически потом не используем. Т.е. фактически осуществляем два поиска: сначала всего вообще, а потом только нужных нам.

Думаю, лучше модифицировать функцию sym_re_search() и ввести в нее второй параметр, который будет индикатором того, искать по названиям параметров или по описаниям тоже.

Превратить ее в

struct symbol **sym_re_search(const char *pattern, bool in_description)

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

При отправке патча в ядро это тоже попросят сделать. Пока давай так поработаем, а в самом конце это как-нибудь и это проверим.

ttnl ★★★★★
() автор топика
Ответ на: комментарий от V1KT0P

Если хочешь, скинь сюда свою почту, так быстрее будет.

ttnl ★★★★★
() автор топика
Ответ на: комментарий от ttnl

Думаю, лучше модифицировать функцию sym_re_search() и ввести в нее второй параметр, который будет индикатором того, искать по названиям параметров или по описаниям тоже.

sym_re_search - сишная функция, перегрузка не доступна. Изменение ее объявление поломает работу со всем кодом который ее использует. Разве что еще одну сделать для поиска, тогда надо выбрать нужна ли новой функции regexp или нет.

Если хочешь, скинь сюда свою почту, так быстрее будет.

v1kt0p [at] mail.ru

V1KT0P ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.