ОС: Debian Squeeze
старые системы не поддерживаются
/0
Используйте самостоятельную сборку пакетов
Единственный правильный способ установки ПО.
Пользователь решил продолжить мысль 29 Апреля 2011, 07:50:28:
Патч:
Index: src/xneur.c
===================================================================
--- src/xneur.c (revision 917)
+++ src/xneur.c (working copy)
@@ -122,22 +122,17 @@
log_message(LOG, _("Keyboard layouts present in system:"));
for (int lang = 0; lang < xconfig->handle->total_languages; lang++)
{
- if ((xconfig->handle->languages[lang].dictionary->data_count == 0 &&
- xconfig->handle->languages[lang].proto->data_count == 0 &&
- xconfig->handle->languages[lang].big_proto->data_count == 0) ||
- (xconfig->handle->languages[lang].excluded))
- {
+ if (xconfig->handle->languages[lang].excluded)
log_message(LOG, _(" Excluded XKB Group '%s', layout '%s', group '%d'"), xconfig->handle->languages[lang].name, xconfig->handle->languages[lang].dir, lang);
- }
else
- log_message(LOG, _(" Encluded XKB Group '%s', layout '%s', group '%d'"), xconfig->handle->languages[lang].name, xconfig->handle->languages[lang].dir, lang);
+ log_message(LOG, _(" Included XKB Group '%s', layout '%s', group '%d'"), xconfig->handle->languages[lang].name, xconfig->handle->languages[lang].dir, lang);
char *lang_name = xconfig->handle->languages[lang].name;
log_message(DEBUG, _(" %s dictionary has %d records"), lang_name, xconfig->handle->languages[lang].dictionary->data_count);
log_message(DEBUG, _(" %s proto has %d records"), lang_name, xconfig->handle->languages[lang].proto->data_count);
log_message(DEBUG, _(" %s big proto has %d records"), lang_name, xconfig->handle->languages[lang].big_proto->data_count);
-#ifdef WITH_ASPELL
+#ifdef WITH_ASPELL
if (xconfig->handle->has_spell_checker[lang])
{
log_message(DEBUG, _(" %s aspell dictionary loaded"), lang_name);
@@ -147,7 +142,7 @@
log_message(DEBUG, _(" %s aspell dictionary not found"), lang_name);
}
#endif
-#ifdef WITH_ENCHANT
+#ifdef WITH_ENCHANT
if (xconfig->handle->enchant_dicts[lang])
{
log_message(DEBUG, _(" %s enchant wrapper dictionary loaded"), lang_name);
Index: lib/main/switchlang.c
===================================================================
--- lib/main/switchlang.c (revision 917)
+++ lib/main/switchlang.c (working copy)
@@ -38,9 +38,7 @@
int get_curr_keyboard_group(void)
{
XkbStateRec xkbState;
- Display *display = XOpenDisplay(NULL);
- XkbGetState(display, XkbUseCoreKbd, &xkbState);
- XCloseDisplay(display);
+ XkbGetState(main_window->display, XkbUseCoreKbd, &xkbState);
int group = xkbState.group;
//XFree(xkbState);
return group;
Index: lib/main/program.c
===================================================================
--- lib/main/program.c (revision 917)
+++ lib/main/program.c (working copy)
@@ -957,17 +957,18 @@
}
case ACTION_CHANGE_STRING: // User needs to change current string
{
- int next_lang = get_curr_keyboard_group();
+ int curr_lang = get_curr_keyboard_group();
+ int next_lang = curr_lang;
do
{
next_lang++;
if (next_lang >= xconfig->handle->total_languages)
next_lang = 0;
- } while (xconfig->handle->languages[next_lang].excluded && (next_lang != get_curr_keyboard_group()));
+ } while (xconfig->handle->languages[next_lang].excluded && (next_lang != curr_lang));
- if (next_lang == get_curr_keyboard_group())
+ if (next_lang == curr_lang)
break;
-
+
int action;
if (next_lang == 0)
action = CHANGE_STRING_TO_LAYOUT_0;
@@ -992,15 +993,16 @@
{
p->action_mode = action;
- int next_lang = get_curr_keyboard_group();
+ int curr_lang = get_curr_keyboard_group();
+ int next_lang = curr_lang;
do
{
next_lang++;
if (next_lang >= xconfig->handle->total_languages)
next_lang = 0;
- } while (xconfig->handle->languages[next_lang].excluded && (next_lang != get_curr_keyboard_group()));
+ } while (xconfig->handle->languages[next_lang].excluded && (next_lang != curr_lang));
- if (next_lang == get_curr_keyboard_group())
+ if (next_lang == curr_lang)
break;
if ((xconfig->educate) && (action == ACTION_CHANGE_WORD))
Index: lib/lib/xneur.h
===================================================================
--- lib/lib/xneur.h (revision 917)
+++ lib/lib/xneur.h (working copy)
@@ -40,6 +40,7 @@
char *name;
int group;
int excluded;
+ int disable_auto_detection;
struct _list_char *temp_dictionary;
struct _list_char *dictionary;
Index: lib/lib/xneurlib.c
===================================================================
--- lib/lib/xneurlib.c (revision 917)
+++ lib/lib/xneurlib.c (working copy)
@@ -204,6 +204,7 @@
handle->languages[handle->total_languages].dir[2] = NULLSYM;
handle->languages[handle->total_languages].group = group;
handle->languages[handle->total_languages].excluded = FALSE;
+ handle->languages[handle->total_languages].disable_auto_detection = FALSE;
handle->total_languages++;
//if (group_name != NULL)
@@ -260,12 +261,6 @@
if (lang_dir != NULL)
free(lang_dir);
- if (handle->languages[lang].dictionary->data_count == 0 &&
- handle->languages[lang].proto->data_count == 0 &&
- handle->languages[lang].big_proto->data_count == 0)
- {
- handle->languages[lang].excluded = TRUE;
- }
}
#ifdef WITH_ASPELL
@@ -356,19 +351,18 @@
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].dictionary->data_count == 0 &&
- handle->languages[lang].proto->data_count == 0 &&
- handle->languages[lang].big_proto->data_count == 0
+ handle->languages[lang].disable_auto_detection |=
+ handle->languages[lang].excluded || (
+ handle->languages[lang].dictionary->data_count == 0 &&
+ handle->languages[lang].proto->data_count == 0 &&
+ handle->languages[lang].big_proto->data_count == 0
#ifdef WITH_ASPELL
- && handle->has_spell_checker[lang] == 0
+ && handle->has_spell_checker[lang] == 0
#endif
#ifdef WITH_ENCHANT
- && handle->has_enchant_checker[lang] == 0
+ && handle->has_enchant_checker[lang] == 0
#endif
- )
- {
- handle->languages[lang].excluded = TRUE;
- }
+ );
}
return handle;
}
Index: lib/ai/detection.c
===================================================================
--- lib/ai/detection.c (revision 917)
+++ lib/ai/detection.c (working copy)
@@ -46,7 +46,7 @@
{
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].excluded)
+ if (handle->languages[lang].disable_auto_detection)
continue;
if (handle->languages[lang].dictionary->exist(handle->languages[lang].dictionary, word[lang], BY_REGEXP))
@@ -68,7 +68,7 @@
// check for current language first
if (handle->has_spell_checker[cur_lang])
{
- if (!handle->languages[cur_lang].excluded &&
+ if (!handle->languages[cur_lang].disable_auto_detection &&
aspell_speller_check(handle->spell_checkers[cur_lang], word[cur_lang], strlen(word[cur_lang])))
{
log_message(DEBUG, _(" [+] Found this word in %s aspell dictionary"), handle->languages[cur_lang].name);
@@ -84,7 +84,7 @@
// check for another languages
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].excluded || lang == cur_lang)
+ if (handle->languages[lang].disable_auto_detection || lang == cur_lang)
continue;
if (!handle->has_spell_checker[lang])
@@ -114,7 +114,7 @@
// check for current language first
if (handle->has_enchant_checker[cur_lang])
{
- if (!handle->languages[cur_lang].excluded &&
+ if (!handle->languages[cur_lang].disable_auto_detection &&
!enchant_dict_check(handle->enchant_dicts[cur_lang], word[cur_lang], strlen(word[cur_lang])))
{
log_message(DEBUG, _(" [+] Found this word in %s enchant wrapper dictionary"), handle->languages[cur_lang].name);
@@ -130,7 +130,7 @@
// check for another languages
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].excluded || lang == cur_lang)
+ if (handle->languages[lang].disable_auto_detection || lang == cur_lang)
continue;
if (!handle->has_enchant_checker[lang])
@@ -232,7 +232,7 @@
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if ((lang == cur_lang) || (handle->languages[lang].excluded))
+ if ((lang == cur_lang) || (handle->languages[lang].disable_auto_detection))
continue;
int hits = get_proto_hits_function(handle, word[lang], sym_len[lang], len, offset, lang);
Список изменений:
1. В get_curr_keyboard_group вызов XOpenDisplay заменён на main_window->display.
2. В program_perform_manual_action убраны избыточные вызовы get_curr_keyboard_group.
3.
r912 | crew | 2011-04-21 18:02:30 +0800 (Чтв, 21 Апр 2011) | 4 lines
Раскладка помещается в "исключенные", только если нет ни эвристических
словарей, ни словарей enchant/aspell.
Не работает из-за дублирования кода в xneur_handle_create. Исправлено.
4. В xneur_load_config ошибочно выдаёт сообщение "Excluded XKB Group". Исправлено.
5. Исправлена опечатка Encluded -> Included там же.
6. В целом исключение языков без словарей решает не ту проблему. Допустим, в программе не прогрузились вообще никакие словари. У пользователя всё равно должна остаться возможность конвертировать текст в буфере ввода, т.к. эта функция
не зависит от наличия словарей. Разделил флаг excluded на два: собственно excluded, влияющий на исключение языков из цикла переключений, и disable_auto_detection, влияющий на исключение языков при поиске языка для автокоррекции.
Пользователь решил продолжить мысль 29 Апреля 2011, 08:31:55:
Ох, протупил. xneur_handle_create ведь отрабатывает раньше, чем xneur_load_config, следовательно там еще нет значений флага exclude из конфига. Тогда так:
Index: src/xneur.c
===================================================================
--- src/xneur.c (revision 917)
+++ src/xneur.c (working copy)
@@ -122,22 +122,17 @@
log_message(LOG, _("Keyboard layouts present in system:"));
for (int lang = 0; lang < xconfig->handle->total_languages; lang++)
{
- if ((xconfig->handle->languages[lang].dictionary->data_count == 0 &&
- xconfig->handle->languages[lang].proto->data_count == 0 &&
- xconfig->handle->languages[lang].big_proto->data_count == 0) ||
- (xconfig->handle->languages[lang].excluded))
- {
+ if (xconfig->handle->languages[lang].excluded)
log_message(LOG, _(" Excluded XKB Group '%s', layout '%s', group '%d'"), xconfig->handle->languages[lang].name, xconfig->handle->languages[lang].dir, lang);
- }
else
- log_message(LOG, _(" Encluded XKB Group '%s', layout '%s', group '%d'"), xconfig->handle->languages[lang].name, xconfig->handle->languages[lang].dir, lang);
+ log_message(LOG, _(" Included XKB Group '%s', layout '%s', group '%d'"), xconfig->handle->languages[lang].name, xconfig->handle->languages[lang].dir, lang);
char *lang_name = xconfig->handle->languages[lang].name;
log_message(DEBUG, _(" %s dictionary has %d records"), lang_name, xconfig->handle->languages[lang].dictionary->data_count);
log_message(DEBUG, _(" %s proto has %d records"), lang_name, xconfig->handle->languages[lang].proto->data_count);
log_message(DEBUG, _(" %s big proto has %d records"), lang_name, xconfig->handle->languages[lang].big_proto->data_count);
-#ifdef WITH_ASPELL
+#ifdef WITH_ASPELL
if (xconfig->handle->has_spell_checker[lang])
{
log_message(DEBUG, _(" %s aspell dictionary loaded"), lang_name);
@@ -147,7 +142,7 @@
log_message(DEBUG, _(" %s aspell dictionary not found"), lang_name);
}
#endif
-#ifdef WITH_ENCHANT
+#ifdef WITH_ENCHANT
if (xconfig->handle->enchant_dicts[lang])
{
log_message(DEBUG, _(" %s enchant wrapper dictionary loaded"), lang_name);
Index: lib/main/switchlang.c
===================================================================
--- lib/main/switchlang.c (revision 917)
+++ lib/main/switchlang.c (working copy)
@@ -38,9 +38,7 @@
int get_curr_keyboard_group(void)
{
XkbStateRec xkbState;
- Display *display = XOpenDisplay(NULL);
- XkbGetState(display, XkbUseCoreKbd, &xkbState);
- XCloseDisplay(display);
+ XkbGetState(main_window->display, XkbUseCoreKbd, &xkbState);
int group = xkbState.group;
//XFree(xkbState);
return group;
Index: lib/main/program.c
===================================================================
--- lib/main/program.c (revision 917)
+++ lib/main/program.c (working copy)
@@ -957,17 +957,18 @@
}
case ACTION_CHANGE_STRING: // User needs to change current string
{
- int next_lang = get_curr_keyboard_group();
+ int curr_lang = get_curr_keyboard_group();
+ int next_lang = curr_lang;
do
{
next_lang++;
if (next_lang >= xconfig->handle->total_languages)
next_lang = 0;
- } while (xconfig->handle->languages[next_lang].excluded && (next_lang != get_curr_keyboard_group()));
+ } while (xconfig->handle->languages[next_lang].excluded && (next_lang != curr_lang));
- if (next_lang == get_curr_keyboard_group())
+ if (next_lang == curr_lang)
break;
-
+
int action;
if (next_lang == 0)
action = CHANGE_STRING_TO_LAYOUT_0;
@@ -992,15 +993,16 @@
{
p->action_mode = action;
- int next_lang = get_curr_keyboard_group();
+ int curr_lang = get_curr_keyboard_group();
+ int next_lang = curr_lang;
do
{
next_lang++;
if (next_lang >= xconfig->handle->total_languages)
next_lang = 0;
- } while (xconfig->handle->languages[next_lang].excluded && (next_lang != get_curr_keyboard_group()));
+ } while (xconfig->handle->languages[next_lang].excluded && (next_lang != curr_lang));
- if (next_lang == get_curr_keyboard_group())
+ if (next_lang == curr_lang)
break;
if ((xconfig->educate) && (action == ACTION_CHANGE_WORD))
Index: lib/lib/xneur.h
===================================================================
--- lib/lib/xneur.h (revision 917)
+++ lib/lib/xneur.h (working copy)
@@ -40,6 +40,7 @@
char *name;
int group;
int excluded;
+ int disable_auto_detection;
struct _list_char *temp_dictionary;
struct _list_char *dictionary;
Index: lib/lib/xneurlib.c
===================================================================
--- lib/lib/xneurlib.c (revision 917)
+++ lib/lib/xneurlib.c (working copy)
@@ -204,6 +204,7 @@
handle->languages[handle->total_languages].dir[2] = NULLSYM;
handle->languages[handle->total_languages].group = group;
handle->languages[handle->total_languages].excluded = FALSE;
+ handle->languages[handle->total_languages].disable_auto_detection = FALSE;
handle->total_languages++;
//if (group_name != NULL)
@@ -260,12 +261,6 @@
if (lang_dir != NULL)
free(lang_dir);
- if (handle->languages[lang].dictionary->data_count == 0 &&
- handle->languages[lang].proto->data_count == 0 &&
- handle->languages[lang].big_proto->data_count == 0)
- {
- handle->languages[lang].excluded = TRUE;
- }
}
#ifdef WITH_ASPELL
@@ -356,19 +351,18 @@
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].dictionary->data_count == 0 &&
- handle->languages[lang].proto->data_count == 0 &&
- handle->languages[lang].big_proto->data_count == 0
+ handle->languages[lang].disable_auto_detection |=
+ handle->languages[lang].excluded || (
+ handle->languages[lang].dictionary->data_count == 0 &&
+ handle->languages[lang].proto->data_count == 0 &&
+ handle->languages[lang].big_proto->data_count == 0
#ifdef WITH_ASPELL
- && handle->has_spell_checker[lang] == 0
+ && handle->has_spell_checker[lang] == 0
#endif
#ifdef WITH_ENCHANT
- && handle->has_enchant_checker[lang] == 0
+ && handle->has_enchant_checker[lang] == 0
#endif
- )
- {
- handle->languages[lang].excluded = TRUE;
- }
+ );
}
return handle;
}
Index: lib/ai/detection.c
===================================================================
--- lib/ai/detection.c (revision 917)
+++ lib/ai/detection.c (working copy)
@@ -46,7 +46,7 @@
{
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].excluded)
+ if (handle->languages[lang].disable_auto_detection || handle->languages[lang].excluded)
continue;
if (handle->languages[lang].dictionary->exist(handle->languages[lang].dictionary, word[lang], BY_REGEXP))
@@ -68,7 +68,7 @@
// check for current language first
if (handle->has_spell_checker[cur_lang])
{
- if (!handle->languages[cur_lang].excluded &&
+ if (!handle->languages[cur_lang].disable_auto_detection && !handle->languages[cur_lang].excluded &&
aspell_speller_check(handle->spell_checkers[cur_lang], word[cur_lang], strlen(word[cur_lang])))
{
log_message(DEBUG, _(" [+] Found this word in %s aspell dictionary"), handle->languages[cur_lang].name);
@@ -84,7 +84,7 @@
// check for another languages
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].excluded || lang == cur_lang)
+ if (handle->languages[lang].disable_auto_detection || handle->languages[lang].excluded || lang == cur_lang)
continue;
if (!handle->has_spell_checker[lang])
@@ -114,7 +114,7 @@
// check for current language first
if (handle->has_enchant_checker[cur_lang])
{
- if (!handle->languages[cur_lang].excluded &&
+ if (!handle->languages[cur_lang].disable_auto_detection && !handle->languages[cur_lang].excluded &&
!enchant_dict_check(handle->enchant_dicts[cur_lang], word[cur_lang], strlen(word[cur_lang])))
{
log_message(DEBUG, _(" [+] Found this word in %s enchant wrapper dictionary"), handle->languages[cur_lang].name);
@@ -130,7 +130,7 @@
// check for another languages
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if (handle->languages[lang].excluded || lang == cur_lang)
+ if (handle->languages[lang].disable_auto_detection || handle->languages[lang].excluded || lang == cur_lang)
continue;
if (!handle->has_enchant_checker[lang])
@@ -232,7 +232,7 @@
for (int lang = 0; lang < handle->total_languages; lang++)
{
- if ((lang == cur_lang) || (handle->languages[lang].excluded))
+ if ((lang == cur_lang) || (handle->languages[lang].disable_auto_detection) || (handle->languages[lang].excluded))
continue;
int hits = get_proto_hits_function(handle, word[lang], sym_len[lang], len, offset, lang);