История изменений
Исправление ttnl, (текущая версия) :
Отлично, у меня все работает. Внешне хорошо получилось.
Давай теперь вид кода приведем в соответствии с тем, как это принято в ядре. Придется немного помучиться, но это обычное дело, с кодом всегда сильно заморачиваются, там не должно быть ничего лишнего.
Удобнее всего работать с патчами. Сделай себе копию линуксового 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, :
Отлично, у меня все работает. Внешне хорошо получилось.
Давай теперь вид кода приведем в соответствии с тем, как это принято в ядре. Придется немного помучиться, но это обычное дело, с кодом всегда сильно заморачиваются, там не должно быть ничего лишнего.
Удобнее всего работать с патчами. Сделай себе копию линуксового 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 — а для всех версий сразу сделать не получится? Наверное, не получится, если ты так написал.