LINUX.ORG.RU

Сообщения geekless

 

Вот потому и [не готов]

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

  • tuxcmd. Нет интеграции с «открыть с помощью». Совсем. Не реализован диалог свойств файлов.
  • doublecmd. Невозможно выбрать дефолтное приложение для «открыть с помощью». Нет варианта «открыть с помощью» -> выбрать приложение вручную. Тормозит.
  • thunar. Нет подменю «открыть с помощью» для каталогов. Видимо, тупо отрублен показ меню в исходнике (нахрена?!) — для обычных файлов-то реализовано.
  • xfdesktop. Перетаскивание иконок по десктопу на одном компе работает, на другом не работает. Профили идентичны. Телепаты в отпуске. Также, не реализован пункт «вставить» в контекстном меню. Просто не реализован в исходнике, код брошен на полдороге.
  • pcmanfm. Единственный, который более-менее работает. Замеченный мелкий недостаток — не реализовано открытие файлов перетаскиванием на иконку приложения на десктопе. Остановился пока на нём. Но у pcmanfm до сих пор периодически то там то сям вылазят разные глюки, и, вероятно, он еще преподнесёт сюрпризы.

Вывода и морали не будет.

 

geekless
()

[плача тред] Задолбался с этим вашим windows way-ем.

Вопросы, на которые я не знаю ответов:

1. Как из скрипта получить список объектов «Открыть с помощью», ассоциированных с заданным MIME?

2. Какое есть приложение для отображения диалога «Свойства файлов» а ля аналогичные диалоги из наутилус/тунар/pcmanfm? (Нет такого приложения)

3. Какая есть утилита, аналогичная диалогу копирования/перемещения файлов из двухпанельных ФМ. С умными вопросами типа «файл уже существует, заменить/пропустить/переименовать?» (Нет такой утилиты.)

4. Какая есть утилита — универсальный вьюер файлов. С переключением режимов текст/hex-дамп/html/картинко и т.п. С поддержкой кодировок. С поддержкой файлов произвольного размера. С поддержкой плагинов. (Нет такой утилиты.)

5. Какая есть утилита графический фронт-энд для find? (Нет такой утилиты. catfish убог чуть более, чем совсем. Уже подумываю о том, чтобы запилить собственную на Ruby и назвать dogfish.)

Ну и так далее. Смотрю на типичный софт и вижу: не линукс, а сплошная «винда-виндой, только бесплатная». Горы неюзабельного, недопиленного говна. Четыре DE. Десяток файловых менеджеров. Два десятка проигрывателей. Четыре десятка текстовых редакторов. Комбайны, архитектурно не способные к интеграции и взаимодействию. Задрало.

Выдохнул.

geekless
()

Опять некрофилия в модераторах проснулась?

08.12.2003 10:31


29.11.2006 07:36


16.09.2003 12:26


21.11.2003 10:51


Переписывают историю. Тревожат души давно умерших тредов. Ничего святого нет. Ай-яй-яй.

geekless
()

[жж][опасносте][google] И в самом деле, почему?

!Ъ: http://s018.radikal.ru/i505/1201/85/4d03a7e594ba.png

Для Ъ: гугл как бы намекает на наше светлое будущее.

 ,

geekless
()

[archlinux][штабильношть] Сломали реп community для i686

Суть:

# pacman -Syu
:: Синхронизируются базы данных пакетов...
 core не устарел
 extra не устарел
 community не устарел
 archlinuxfr не устарел
 xyne-any не устарел
 pfkernel                                                                                              7,8K  354,4K/s 00:00:00 [############################################################################] 100%
:: Запускается полное обновление системы...
предупреждение: galculator: установленная версия (1.3.4-2) новее, чем в community (1.3.4-1)
ошибка: не удалось подготовить запрос (архитектура пакета недопустима)
:: пакет aria2-1.14.1-1-x86_64 не имеет допустимой архитектуры
:: пакет gecko-mediaplayer-1.0.5-1-x86_64 не имеет допустимой архитектуры
:: пакет gnome-mplayer-1.0.5-1-x86_64 не имеет допустимой архитектуры
:: пакет gogglesmm-0.12.6-1-x86_64 не имеет допустимой архитектуры
:: пакет lshw-B.02.16-1-x86_64 не имеет допустимой архитектуры
:: пакет poedit-1.4.6.1-6-x86_64 не имеет допустимой архитектуры
:: пакет scite-3.0.2-1-x86_64 не имеет допустимой архитектуры
:: пакет sysstat-10.0.3-2-x86_64 не имеет допустимой архитектуры

Подробности: https://bbs.archlinux.org/viewtopic.php?id=133393

Отличный баг: все пользователи архитектуры i686 временно-принудительно отлучены от RR.

АААА!!! АРЧ САМ НЕ ОБНОВИТСЯ! Я НЕ ОБНОВЛЯЛ СВОЙ АРЧИК 2 ДНЯ, ПОЙДУ ОБНОВЛЮСЬ!... а не получается.

Это зависимость! Арчеводы, чувствуете ломку без новых пакетов?

 

geekless
()

[openbox] Переключать рабочие столы прямо из alt-tab-ового списка окон

Посетила указанная в заголовке юзабилити-идея. В самом деле, если по нажатию alt-tab, WM переходит в режим листания окон, то почему бы прямо оттуда же и не листать рабочие столы? Сказано — сделано. Патч добавляет опенбоксу листание столов по стрелке-влево/стрелке-вправо когда активен список окон:

diff --git a/openbox/actions/cyclewindows.c b/openbox/actions/cyclewindows.c
index 5f0db27..a3cde57 100644
--- a/openbox/actions/cyclewindows.c
+++ b/openbox/actions/cyclewindows.c
@@ -4,6 +4,7 @@
 #include "openbox/event.h"
 #include "openbox/focus_cycle.h"
 #include "openbox/openbox.h"
+#include "openbox/screen.h"
 #include "gettext.h"
 #include "obt/keyboard.h"
 
@@ -23,6 +24,8 @@ typedef struct {
     /* options for after we're done */
     gboolean cancel; /* did the user cancel or not */
     guint state;     /* keyboard state when finished */
+
+    guint screen_desktop;
 } Options;
 
 static gpointer setup_func(xmlNodePtr node,
@@ -70,6 +73,8 @@ static gpointer setup_func(xmlNodePtr node,
     o->bar = TRUE;
     o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_LIST;
 
+    o->screen_desktop = screen_desktop;
+
     if ((n = obt_xml_find_node(node, "linear")))
         o->linear = obt_xml_node_bool(n);
     if ((n = obt_xml_find_node(node, "dialog"))) {
@@ -206,6 +211,16 @@ static gboolean i_input_func(guint initial_state,
             o->state = e->xkey.state;
             return FALSE;
         }
+
+        else if ((sym == XK_Left || sym == XK_Right) ) {
+            guint d = screen_find_desktop(screen_desktop,
+                                          sym == XK_Right ? OB_DIRECTION_EAST : OB_DIRECTION_WEST, TRUE, TRUE);
+
+            screen_set_desktop(d, TRUE, FALSE);
+            run_func(NULL, options);
+            screen_show_desktop_popup(d, FALSE, FALSE);
+            return TRUE;
+        }
     }
     /* They released the modifiers */
     else if (e->type == KeyRelease && initial_state && !(mods & initial_state))
@@ -223,6 +238,8 @@ static void i_cancel_func(gpointer options)
     Options *o = options;
     o->cancel = TRUE;
     o->state = 0;
+
+    screen_set_desktop(o->screen_desktop, TRUE, TRUE);
 }
 
 static void i_post_func(gpointer options)
diff --git a/openbox/actions/desktop.c b/openbox/actions/desktop.c
index a3a1f6b..7886b7c 100644
--- a/openbox/actions/desktop.c
+++ b/openbox/actions/desktop.c
@@ -302,7 +302,7 @@ static gboolean run_func(ObActionsData *data, gpointer options)
         }
 
         if (go) {
-            screen_set_desktop(d, TRUE);
+            screen_set_desktop(d, TRUE, TRUE);
             if (data->client)
                 client_bring_helper_windows(data->client);
         }
@@ -356,7 +356,7 @@ static gboolean i_pre_func(guint initial_state, gpointer options)
         return FALSE;
     }
     else {
-        screen_show_desktop_popup(screen_desktop, TRUE);
+        screen_show_desktop_popup(screen_desktop, TRUE, TRUE);
         return TRUE;
     }
 }
diff --git a/openbox/client.c b/openbox/client.c
index f3b4bda..feff3a6 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -4029,7 +4029,7 @@ static void client_present(ObClient *self, gboolean here, gboolean raise,
         if (here)
             client_set_desktop(self, screen_desktop, FALSE, TRUE);
         else
-            screen_set_desktop(self->desktop, FALSE);
+            screen_set_desktop(self->desktop, FALSE, TRUE);
     } else if (!self->frame->visible)
         /* if its not visible for other reasons, then don't mess
            with it */
diff --git a/openbox/client_list_combined_menu.c b/openbox/client_list_combined_menu.c
index c26b6fa..f2027e4 100644
--- a/openbox/client_list_combined_menu.c
+++ b/openbox/client_list_combined_menu.c
@@ -126,10 +126,10 @@ static void menu_execute(ObMenuEntry *self, ObMenuFrame *f,
             /* if the window is omnipresent then we need to go to its
                desktop */
             if (!here && t->desktop == DESKTOP_ALL)
-                screen_set_desktop(self->id, FALSE);
+                screen_set_desktop(self->id, FALSE, TRUE);
         }
         else
-            screen_set_desktop(self->id, TRUE);
+            screen_set_desktop(self->id, TRUE, TRUE);
     }
 }
 
diff --git a/openbox/client_list_menu.c b/openbox/client_list_menu.c
index f3df2a5..0b5af55 100644
--- a/openbox/client_list_menu.c
+++ b/openbox/client_list_menu.c
@@ -106,10 +106,10 @@ static void desk_menu_execute(ObMenuEntry *self, ObMenuFrame *f,
         /* if the window is omnipresent then we need to go to its
            desktop */
         if (!here && t->desktop == DESKTOP_ALL)
-            screen_set_desktop(self->id, FALSE);
+            screen_set_desktop(self->id, FALSE, TRUE);
     }
     else
-        screen_set_desktop(self->id, TRUE);
+        screen_set_desktop(self->id, TRUE, TRUE);
 }
 
 static void desk_menu_destroy(ObMenu *menu, gpointer data)
diff --git a/openbox/event.c b/openbox/event.c
index cf089b6..d9d60a4 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -768,7 +768,7 @@ static void event_handle_root(XEvent *e)
                                   "a timestamp");
                 else
                     event_sourcetime = e->xclient.data.l[1];
-                screen_set_desktop(d, TRUE);
+                screen_set_desktop(d, TRUE, TRUE);
             }
         } else if (msgtype == OBT_PROP_ATOM(NET_NUMBER_OF_DESKTOPS)) {
             guint d = e->xclient.data.l[0];
diff --git a/openbox/moveresize.c b/openbox/moveresize.c
index 3a98db3..a776b7c 100644
--- a/openbox/moveresize.c
+++ b/openbox/moveresize.c
@@ -611,7 +611,7 @@ static gboolean edge_warp_delay_func(gpointer data)
         d = screen_find_desktop(screen_desktop, edge_warp_dir, TRUE, FALSE);
         if (d != screen_desktop) {
             if (config_mouse_screenedgewarp) edge_warp_move_ptr();
-            screen_set_desktop(d, TRUE);
+            screen_set_desktop(d, TRUE, TRUE);
         }
     }
     edge_warp_odd = !edge_warp_odd;
diff --git a/openbox/screen.c b/openbox/screen.c
index ffe74a0..5e69a32 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -433,13 +433,13 @@ void screen_startup(gboolean reconfig)
                        NET_CURRENT_DESKTOP, CARDINAL, &d) &&
         d < screen_num_desktops)
     {
-        screen_set_desktop(d, FALSE);
+        screen_set_desktop(d, FALSE, TRUE);
     } else if (session_desktop >= 0)
         screen_set_desktop(MIN((guint)session_desktop,
-                               screen_num_desktops), FALSE);
+                               screen_num_desktops), FALSE, TRUE);
     else
         screen_set_desktop(MIN(config_screen_firstdesk,
-                               screen_num_desktops) - 1, FALSE);
+                               screen_num_desktops) - 1, FALSE, TRUE);
     screen_last_desktop = screen_desktop;
 
     /* don't start in showing-desktop mode */
@@ -553,7 +553,7 @@ void screen_set_num_desktops(guint num)
 
     /* change our desktop if we're on one that no longer exists! */
     if (screen_desktop >= screen_num_desktops)
-        screen_set_desktop(num - 1, TRUE);
+        screen_set_desktop(num - 1, TRUE, TRUE);
 }
 
 static void screen_fallback_focus(void)
@@ -604,7 +604,7 @@ static gboolean last_desktop_func(gpointer data)
     return FALSE; /* don't repeat */
 }
 
-void screen_set_desktop(guint num, gboolean dofocus)
+void screen_set_desktop(guint num, gboolean dofocus, gboolean show_popup)
 {
     GList *it;
     guint previous;
@@ -689,8 +689,8 @@ void screen_set_desktop(guint num, gboolean dofocus)
 
     ob_debug("Moving to desktop %d", num+1);
 
-    if (ob_state() == OB_STATE_RUNNING)
-        screen_show_desktop_popup(screen_desktop, FALSE);
+    if (show_popup && ob_state() == OB_STATE_RUNNING)
+        screen_show_desktop_popup(screen_desktop, FALSE, TRUE);
 
     /* ignore enter events caused by the move */
     ignore_start = event_start_ignore_all_enters();
@@ -941,7 +941,7 @@ static gboolean hide_desktop_popup_func(gpointer data)
     return FALSE; /* don't repeat */
 }
 
-void screen_show_desktop_popup(guint d, gboolean perm)
+void screen_show_desktop_popup(guint d, gboolean perm, gboolean center)
 {
     const Rect *a;
 
@@ -949,8 +949,12 @@ void screen_show_desktop_popup(guint d, gboolean perm)
     if (!config_desktop_popup_time) return;
 
     a = screen_physical_area_primary(FALSE);
-    pager_popup_position(desktop_popup, CenterGravity,
-                         a->x + a->width / 2, a->y + a->height / 2);
+    if (center)
+        pager_popup_position(desktop_popup, CenterGravity,
+                             a->x + a->width / 2, a->y + a->height / 2);
+    else
+        pager_popup_position(desktop_popup, NorthGravity,
+                             a->x + a->width / 2, a->y);
     pager_popup_icon_size_multiplier(desktop_popup,
                                      (screen_desktop_layout.columns /
                                       screen_desktop_layout.rows) / 2,
diff --git a/openbox/screen.h b/openbox/screen.h
index a6a3995..af1aeb2 100644
--- a/openbox/screen.h
+++ b/openbox/screen.h
@@ -66,7 +66,7 @@ void screen_resize(void);
 /*! Change the number of available desktops */
 void screen_set_num_desktops(guint num);
 /*! Change the current desktop */
-void screen_set_desktop(guint num, gboolean dofocus);
+void screen_set_desktop(guint num, gboolean dofocus, gboolean show_popup);
 /*! Add a new desktop either at the end or inserted at the current desktop */
 void screen_add_desktop(gboolean current);
 /*! Remove a desktop, either at the end or the current desktop */
@@ -80,7 +80,7 @@ guint screen_find_desktop(guint from, ObDirection dir,
              screen_hide_desktop_popup().  Otherwise it will hide after a
              delay.
  */
-void screen_show_desktop_popup(guint d, gboolean permanent);
+void screen_show_desktop_popup(guint d, gboolean permanent, gboolean center);
 /*! Hide it */
 void screen_hide_desktop_popup(void);
 

Вроде очевидная фича, странно, что до сих пор нигде нет. Или это я в танке, и в каких-то других WM такое есть?

 

geekless
()

[когда коту делать нечего] Запуск agetty как демона

Ну по за головку вы уже поняли, что в этом треде какая-то нездоровая фигня. :) К делу: иксы-то быстро стартуют, а вот виртуальные консоли прочухиваются только после того, как все демоны поднимутся. Надоело мне это, да и в огород любителям systemd надо кинуть новый булыжник. Итак. Подопытный: Арчлинукс. Место действия: несчастный комп моей девушки. Задача: запуск agetty как службы.

Собственно, сам демон (осторожно, быдлокод) /root/agettyd:

#!/bin/bash

if [ -n "$pidfile" ] ; then
	echo -n $$ > "$pidfile"
fi

while true ; do
	coproc setsid bash <<-XXX
		exec /sbin/agetty -8 -s 38400 "$tty" linux
	XXX
	trap 'kill ${COPROC_PID} ; exit $?' INT TERM EXIT
	wait ${COPROC_PID}
	trap - INT TERM EXIT
done

Старт/стоп-скрипт /etc/rc.d/agetty:

#!/bin/bash

. /etc/rc.conf
. /etc/rc.d/functions

tty="`echo "$0" | egrep -o -- '-[a-zA-Z0-9]+$' | cut -d- -f2`"

if [[ -z "$tty" ]] ; then
	tty=tty1
fi

daemonname="agetty-${tty}"

pidfile="/run/${daemonname}.pid"
if [[ -r $pidfile ]]; then
  read -r PID < "$pidfile"
  if [[ ! -d /proc/$PID ]]; then
    # stale pidfile
    unset PID
    rm -f "$pidfile"
  fi
fi

case "$1" in
  start)
    stat_busy "Starting ${daemonname}"
    [ -z "$PID" ] && (
	export tty
	export pidfile
	/root/agettyd &
    ) &> /dev/null < /dev/null
    if [ $? -gt 0 ]; then
      stat_fail
    else
      add_daemon lxdm
      stat_done
    fi
    ;;
  stop)
    stat_busy "Stopping ${daemonname}"
    [ ! -z "$PID" ] && kill $PID &> /dev/null
    if [ $? -gt 0 ]; then
      stat_fail
    else
      rm_daemon lxdm
      stat_done
    fi
    ;;
  restart)
    $0 stop
    sleep 3
    $0 start
    ;;
  *)
    echo "usage: $0 {start|stop|restart}"
esac
exit 0

Симлинки:

# ls -l /etc/rc.d/agetty*
-rwxr-xr-x 1 root root 939 янв.   7 18:12 /etc/rc.d/agetty
lrwxrwxrwx 1 root root   6 янв.   7 17:34 /etc/rc.d/agetty-tty3 -> agetty
lrwxrwxrwx 1 root root   6 янв.   7 17:33 /etc/rc.d/agetty-tty4 -> agetty
lrwxrwxrwx 1 root root   6 янв.   7 17:34 /etc/rc.d/agetty-tty5 -> agetty
lrwxrwxrwx 1 root root   6 янв.   7 17:34 /etc/rc.d/agetty-tty6 -> agetty

Добавляем службы в /etc/rc.conf:

# grep DAEMONS /etc/rc.conf
# DAEMONS
DAEMONS=(syslog-ng @dbus @network @lxdm agetty-tty3 agetty-tty4 agetty-tty5 agetty-tty6 alsa @crond preload @ppp iptables @verynice dnsmasq @openntpd)

Убираем соответствующие строки из /etc/inittab:

# grep tty /etc/inittab 
c1:2345:respawn:/sbin/agetty -8 -s 38400 tty1 linux
c2:2345:respawn:/sbin/agetty -8 -s 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty -8 -s 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty -8 -s 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty -8 -s 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty -8 -s 38400 tty6 linux

Первые две консоли остались в inittab. Первая понятно почему — потому что там идут стартовые логи, и agetty должен запускаться только после полной инциализации системы. Ну а вторая просто так. И в целом их не стоит оттуда убирать, потому что демоны могут быть убиты, а вот процессы, порождаемые init — штука более надежная.

Выдохнул.

geekless
()

Какой командой detach-нуться от контроллирующего терминала?

Собственно, сабж.

Имею ввиду, не системный вызов, а команду командной строки. Чтобы можно было запустить как command some-command, где command - разыскиваемая команда, создающая новую сессию, чтоб отцепиться от контроллирующего терминала, а затем запускающая some-command.

geekless
()

Какие эмуляторы терминала позволяют произвольным образом переопределить keymap?

Как известно, программы, работающие в терминале, ничего не знают про модификаторы. А жаль. В связи с этим вопрос: какие эмуляторы терминала позволяют произвольным образом настроить отображение хоткей -> генерируемая последовательность?

Очень хотелось бы сделать управление рядом программ, таких как tmux, более человечным. Например, заставить терминал генерировать управляющий префикс tmux-а, если удерживается модификатор:

Mod4 + Up -> ^B^[[A
Mod4 + Down -> ^B^[[B
Mod4 + Right -> ^B^[[C
Mod4 + Left -> ^B^[[D

Потому что играть на пианино с Ctrl не айс. (Емаксеры не поймут.)

Также можно задействовать дублирующиеся сочетания клавиш. Например, Esc == ^[. Но т.к. кнопка Esc на клавиатуре уже имеется, нажатие Ctrl+[ можно переопределить под что-нибудь более полезное. Можно задействовать «пустые» сочетания, такие как Ctrl+' и т.п. Ну вы поняли идею.

geekless
()

[dolphin][nautilus][thunar][pcmanfm] Давайте унифицируем ключи запуска, что ли

Что делают ФМы со своими параметрами запуска сейчас:

  • thunar: при указании пути к файлу (не каталогу) открывает этот файл в соответствующей программе, т.е. делает xdg-open.
  • pcmanfm: аналогично.
  • nautilus: при указании пути к файлу (не каталогу) открывает ролительский каталог и ставит выделение на файл.
  • dolphin: при указании пути к файлу (не каталогу) делает xdg-open, но при этом еще и своё окно зачем-то открывает. При указании дополнительно ключа --select открывает ролительский каталог и ставит выделение на файл.

Что предлагаю: а давайте этот разнобой приведем в порядок. Пусть при указании пути к файлу все ФМ делают xdg-open, а если указан ключ --select, то открывают родительский каталог и ставят выделение на файл.

Собственно, я собираюсь патчить pcmanfm в направлении ключа --select. Подумал, что thunar-у и nautilus-у подобная функциональность тоже лишней не будет. Их ковырять я не буду, но если кто захочет...

 , , ,

geekless
()

[линуксокапец][вещества] ReactOSа тред

Навеяно очередной новостью о ReactOS. Вообще я к ReactOS скептически отношусь, но допустим... Допустим они создадут рабочее ядро и стек системных библиотек. (Уже смешно. Ну я ж сказал: «допустим»!) Драйвера работают, подсистема winapi работает.

Дальше что. Берем эту базовую систему. Ставим туда пакетный менеджер. Вроде ж были какие-то попытки прикрутить сбоку к виндам управление пакетами... Ну не суть, пакетный менеджер — не сложный софт, какой-нибудь портируют с линукса, если что. Делаем, как нормальные люди, репозиторий, собираем кучу свободного софта — его ж реально дофигища для винды, если считать и кросплатформенный, и windows-only. Фриварный софт тоже можно добавить в репы, если без фанатизма. Вместо оболочки проводника ставим кеды. Цигвин не забываем добавить в коробку для ценителей, да еще иксовый сервер.

Получаем windows-совместимую полностью свободную систему с кучей софта из коробки и с более-менее привычной средой как для виндузятника, так и для юниксойдов. Хомячки счастливы. MS в шоке. Вирусописатели хватаются за головы. Организации в срочном порядке переводят свои windows-машины на реактос, ибо 1Сы, фотошопы и автокады работают без проблем. В мире наступает светлое будущее. Джобс восстаёт из могилы и разгоняет нахрен Яббл, чтоб не позорились... хотя нет, это уже из другой истории.

Дискасс.

 ,

geekless
()

[мысль][FR] Как бороться со спамерами

Навеяно очередным плодящим треды ботом.

А давайте просто запретим постинг тредов с пустых аккаунтов, если в треде есть ссылка? (Может быть, за исключением ссылок на сайты по вайтлисту, типа пастбина, картинкохостингов и т.п.)

geekless
()

[не про +1] Передача настроек через GET-запрос.

Такие вопросы:

1. Есть ли на ЛОРе возможность устанавливать на сеанс настройки через GET-запрос к произвольной странице? Т.е. чтобы можно было зайти по ссылке типа такой:

http://www.linux.org.ru/tracker.jsp?style=black&messages=30&photos=0&showSocial=0
И сайт засунул бы эти параметры в сеансовые куки и использовал их вместо тех, что указаны в настройках профиля.

2. Если нет, то не найдётся ли желающих добавить такую возможность?

Use case, полагаю, очевиден: чтобы с мобильноо клиента юзать иные настройки, нежели те, которые удобны на нормальной системе.

Скажем, у меня настроено отображение 500 постов на странице, и на компе это удобно, но на телефоне пока такая страница прогрузится и отрендерится, можно успеть поседеть.

geekless
()

[tuxonice][linux-pf] Не работает USB мышь после выхода их suspend.

Он нечего делать настраиваю на домашнем компе suspend to disk. Проблема в следующем: после выхода из suspend не работает USB мышь. Вернее, работает неверно: положение мыши обновляется примерно раз в секунду, не чаще.

При вытаскивании мыши из порта USB и последующем втыкивании обратно, устройство не опознаётся системой (ни строчки не появляется ни в логе иксов, ни в логе ядра, будто вообще ничего не подключено в порт). Если воткнуть в другой порт, мышь нормально опознаётся и работает. При этом первый порт остётся невсприимчив только к мыши — если туда флешку воткнуть, она нормально опознаётся и работает.

Если снова выполнить suspend, то в следующий раз мышь заглючит уже во втором порте, а после перевставки в первый начнёт работать нормально.

Ядро linux-pf-p4 3.1.1-7.

Куда копать?

 ,

geekless
()

[мы идиоты][внезапно][опять] Всплывающие меню + глобальные хоткеи = ?

Господа, все мы, кто недавно рассуждал о невозможности обработки глобальных хоткеев в то время, когда открыто вплывающее меню, — у меня для нас пренеприятнейшее известие. Мы все — идиоты. Увы, но это правда.

Два факта:

  • В приложениях, написанных на Fox toolkit, всплывающие меню не захватывают клавиатуру и не блокируют работу хоткеев. При этом переключение на другое приложение оставляет меню открытым, но не реагирующим на клавиатуру. При возврате в окно приложения, открывшего меню, меню снова начинает реагировать на клавиатуру.
  • В Firefox (который, вроде бы, юзает gtk, не?) меню также не блокирует глобальные хоткеи. Видимое отличие от Fox toolkit тут в том, что при потере окном файрфокса фокуса, меню исчезает.

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

Ну что, есть желающие написать патч для gtk? :D

 ,

geekless
()

[awk][глупый вопрос] Захватить столбцы «от N и до конца строки»

Имеются данные в виде таблицы из N столбцов. При этом N-1 столбцов не могут содержать пробел и, следовательно, нормально парсятся awk. N-й же столбец может содержать пробелы (и вообще что угодно, кроме перевода строки). Таким образом, надо сказать awk «считай, что во входном потоке может быть не больше N столбцов и всё, что после N-1-го разделителя, помещай в один столбец».

Это возможно? Погрепал ман и помучил гугл, но нужную инфу найти не осилил.

 ,

geekless
()

*.so и a-x

Навеяно обсуждением.

Вопросы теоретико-исторические:

1. Почему реализация динамического линковщика в GNU/Linux не проверяет бит исполнимости на файлах разделяемых библиотек? Какие есть теоретические, практические, исторические основания для этого?

2. В каких системах такая проверка была и есть ли она в каких-то в настоящее время?

Вопрос практический:

Как запретить запускаемому процессу исполнять любой машинный код, кроме его собственного бинарника и загруженных на этапе динамической линковки библиотек? Есть какие-нибудь механизмы в подсистемах типа SELinux и т.п.?

geekless
()

[lxpanelx][openbox] Пилим дальше. Вопросы к фактическим и потенциальным пользователям.

Сегодня в lxpanelx улучшил апплет Directory Menu (aka Структура каталогов). (Лог коммитов.)

  • Апплет отображает не только дерево каталогов, но и простые файлы.
  • При щелчке по файлу запускается указанный в настройках панели файловый менеджер. Что он будет делать с файлом, зависит от конкретного ФМ. pcmanfm, например, — умница — открывает файл в ассоциированной с типом файла программе.
  • Вкл/выкл показа скрытых файлов и каталогов.
  • Вкл/выкл показа размера файлов.
  • Сортировка каталогов по имени, времени модификации или размеру. Аналогично для файлов.

Да, обычно всё, что я пишу в свободное время, я пишу для себя. Но сегодня вот решил поинтересовать мнением пользователей. Есть несколько идей, которые с одной стороны, мне не особо важны, а с другой — реализовать не сложно, и кому-нибудь пригодится. Так что хочу спросить:

  • Насколько вообще апплет Directory Menu востребован? Вы им пользуетесь?
  • Если пользуетесь, есть ли какие-то пожелание по его функциональности? Или баги? Подумываю прикрутить фильтрацию каталогов и файлов регэкспами ­— кому-нибудь это надо?
  • Может быть, для lxpanelx имеет смысл сделать апплет pipemenu, аналогичный динамическим меню openbox-а? (Можно выдрать весь необходимый код прямо из openbox-а и оформить отдельной библиотекой.)
  • А может быть pipemenu лучше оформить в виде отдельной программы, которую можно забиндить на хоткей или вызывать из командной строки? Будет очень универсальный и маложручий движок меню в стиле suckless.

 ,

geekless
()

[lorgoogle] Клиент-серверная библиотека

Что нужно:
* Клиент формирует один или несколько запросов и посылает серверу.
* Сервер принимает запросы клиентов и отвечает либо сообщением об ошибке, либо сообщением о принятии запроса на обработку.
* Сервер обрабатывает запросы и по мере готовности результатов, отсылает данные отдельными записями (которые могут идти вперемежку от разных запросов, если клиент ждет результатов для нескольких запросов).
* Клиент получает частичные результаты (и что он дальше с ними делает, в рамках этого треда уже не важно).
* После полного выполнения запроса сервер посылает сообщение клеинту, что запрос выполнен, и новых результатов не будет.
* Клиент может отметить выполнение запроса, пока запрос находится в процессе выполнения.

Пересылаемые в результатах данные — записи вида ключ-значение, где ключ — пара чисел, а значение может быть типа: число, utf8-строка, произвольный массив байт. (Фактически, результатом является двумерная матрица, а пара чисел ключа — это координаты ячейки в ней. Результирующая матрица может быть разреженной.) Эти данные необходимо эффективно сериализовывать/десериализовывать. К эффективности пересылки и сериализации запросов специфических требований нет, т.к. запросы будут пересылаться относительно редко, по сравнению с пересылкой результатов.

Соединение клиента и сервера осуществляется через сокет TCP или локальный сокет Unix.

Язык реализации — Си.

Какие есть библиотеки, которые могут помочь в реализации сервера и интерфейсной библиотеки для клиента? Может есть что-то готовое под похожую задачу, чтобы можно было перепилить под свои нужды с минимальными затратами?

 

geekless
()

Предлагаю проект: Semantic Window Management

Навеяно очередным нытик-тредом, который удачно совпал с моими давними мыслями о рзавитии десктопного линукса.

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

Итак, необходимы механизмы взаимодействия приложений и компонентов DE, которые выведут GUI в юниксе на новый уровень интеграции. Предполагается, что протокол будет реализован поверх протокола Иксов, аналогично NETWM. Впрочем, я готов выслушать вменяемую аргументацию за реализацию средствами dbus. (Аргумент «Скоро иксы умрут из-за вейланда» адекватным не является.)

Назовём это всё Semantic Window Management, ну просто потому что надо хоть как-то это назвать. :)

Ключевые фичи, как я их вижу:

1. Вкладки.

Суть: Если окно приложения использует интерфейс на основе вкладок, от окна можно получить список вкладок, включая название, иконку и флаг, указывающий может ли вкладка быть закрыта. Окну можно посылать команды переключения и закрытия вкладок, а также отображать/скрывать встроенный в окно таббар.

Для чего: возможность интеграции вкладок в заголовок окна в WM и/или в панель задач.

2. Документы.

Суть: Если окно приложения используется для открытия одного или нескольких документов, от окна можно получить список документов, включая такую информацию, как URL документа, тип MIME, название и признак «документ изменен». Окну можно посылать команды переключения и закрытия документов, а также открытия новых документов.

Для чего: Интеграция списка документов в механизмы переключения окон. Создание документо-ориентированного интерфейса. Автогруппировка или сортировка окон, отображающих один документ (например, html-страница в редакторе и она же в браузере) или отображающих документы из одного каталога. Автоназначение окон для работы с файлами разных проектов на разные рабочие столы. Интеграция открытых каталогов в ФМ и диалоговых окон открытия/сохранения файлов. (Допустим, открыт каталог ~/somedir/ в thunar-е, и в это время в medit я выбираю «Сохранить как»; в диалоге сохранения на левой панели я увижу ссылку на этот каталог. Или же можно прямо через меню: Файл -> Сохранить в -> меню с выбором каталогов) Интеграция окон файловых менеджеров между собой. Ведение учёта недавно открытых / часто используемых файлов. Возможность скриптовой связки двух окон между собой по типу «файл, открытый в редакторе, автоматически показывать в браузере», «для файла, открытого в редакторе, автоматически отображать ФМ с соответствующим каталогом».

3. Действия.

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

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

4. Окна состояния.

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

Для чего: Приложение может использовать специальное окно для отображения своего состояния. Например: RSS-клиент — заголовки самых свежих элементов фидов, email-клиент — количество непрочитанных сообщений. Приложение может использовать любое число таких окон с разными именами, если это имеет для приложения смысл. По сути, это способ показа виджетов. DE может давать пользователю возможность размещать такие окна на рабочем столе, в панели, во всплывающих контейнерах и т.п. Выглядеть это может как боковая панель, как Плазма или же как плитка Metro в Windows 8 — зависит от DE.

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

Что требуется реализовать для достижения светлого будущего:

  • протокол Semantic Window Management.
  • библиотеки, инкапсулирующие работу с протоколом.
  • поддержку этих возможностей в некотором количестве распространённых приложений, достаточном для того, чтобы этим уже заинтересовались сторонние разработчики.

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

Итак, вопрос стоит следующим образом: найдётся ли среди посетителей ЛОРа, не довольных текущим положением вещей в десктопном линуксе, 5 человек, умеющих не только болтать, но и работать? Всего 5 человек, с навыками программирования и желанием улучшить своё рабочее место. По отдельности мы — толпа анонимных аналитиков, вместе — команда разработчиков.

geekless
()

RSS подписка на новые темы