Мерзкое поведение g_file_set_contents

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

Исправления gtk3

поскольку вышел gtk4, и в третью версию новшества вноситься не будут, закину те правки, которые использую сам

может, кому и пригодится

К вопросу о copy&paste

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

В очередной раз скопипастив какой-то из своих композитов и наслаждаясь emacs-овой контекстной заменой (вообще прелесть, т.к. учитывает регистр заменяемого), начал подозревать, что как-то это не то и не оно. Китайчатиной пованивает, да и до черта лаж из-за собственной невнимательности вылезает. В результате накидал небольшой perl-овый скриптик для генерации шаблона виджета. скриптик здесь. в качестве единственно аргумента передается имя будущего виджета в виде MyWidget (т.е. капитализированные префикс и имя без пробелов и прочих подчеркиваний).

Moxa UPort 1450I

Попался мне такой зверь в составе последнего ПТК. Драйвер в ядре вроде есть, но работает как-то странно. Точнее вообще не работает.

После разбирательств оказалось, что хотя железка и поддерживает режимы RS232/RS422/RS485, и даже соответствующие дефайны в драйвере присутствуют, но инициализируются порты только в RS232, а возможности изменить режим через setserial или напрямую через ioctl(TIOCSSERIAL,…) нет по причине отсутствия реализации ioctl (любых) в собственно драйвере.

Драйвера, стянутые с сайта мохи мне сразу не понравились. Лапша и оверхед, который включает в себя еще и собственную похаченую реализацию usb-serial. Ну их

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

--- linux/drivers/usb/serial/mxuport.c.orig     2020-09-03 12:19:28.000000000 +0300
+++ linux/drivers/usb/serial/mxuport.c     2020-09-07 09:37:25.653498042 +0300
@@ -155,6 +155,9 @@
 #define MX_UPORT_8_PORT                       BIT(2)
 #define MX_UPORT_16_PORT              BIT(3)
 
+/* initial ports modes */
+static int modes[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
 /* This structure holds all of the local port information */
 struct mxuport_port {
       u8 mcr_state;           /* Last MCR state */
@@ -1136,10 +1139,11 @@
       if (err)
               return err;
 
-  /* Set interface (RS-232) */
+  /* Set interface mode (RS-232/RS-422/RS-485) */
+  dev_info(&serial->interface->dev, "Set port %d to mode %d\n", 
+                   port->port_number, modes[port->port_number]);
       return mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_INTERFACE,
-                               MX_INT_RS232,
-                               port->port_number);
+                               modes[port->port_number], port->port_number);
 }
 
 static int mxuport_alloc_write_urb(struct usb_serial *serial,
@@ -1398,3 +1402,6 @@
 MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
 MODULE_AUTHOR("<support@moxa.com>");
 MODULE_LICENSE("GPL");
+
+module_param_array(modes, int, NULL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+MODULE_PARM_DESC(modes, "Initial modes for ports (up to 16). 0 - RS232, 1 - RS485(2W), 2 - RS422, 3 - RS485(4W)");

GdkColor в GdkRGBA

в процессе портирования sylpheed на gtk3 понадобилось преобразовывать представление цветов из GdkColor в GdkRGBA. в результате написал небольшую тулзинку. может, кому и пригодится

    1 /*
    2  * Output GdkRGBA representation of specified color
    3  *
    4  * compile: gcc -pipe -O2 -o rgba $(pkg-config --cflags --libs gdk-3.0) rgba.c
    5  */
    6 
    7 #include <gdk/gdk.h>
    8 
    9 int
   10 main (int argc, char *argv[])
   11 {
   12   GdkRGBA color;
   13 
   14   if (argc < 2)
   15     {
   16       fprintf (stderr, "Usage: rgba <colorspec>\n");
   17       return 1;
   18     }
   19 
   20   if (!gdk_rgba_parse (&color, argv[1]))
   21     {
   22       fprintf (stderr, "Unable to parse color %s\n", argv[1]);
   23       return 1;
   24     }
   25 
   26   printf ("{%.3f, %.3f, %.3f, %.3f}\n", color.red, color.green, color.blue, color.alpha);
   27 
   28   return 0;
   29 }

Пуркуа gtk3 тормозит или уебаны дорвались…

GTK такой GTK, все скатывается и скатывается. Впрочем, как и все, к чему прикладывают свои лапки различные копрорации. Хипсетрство, помноженное на некомпетенстность и возведенное в степень внезапно возникшего спроса. Результат – пиздетс.

Попытки скрестить ежа с ужом, а десктопный look&feel с мобильным в одном api – идея изначально убогая и технически крайне сложно реализуемая, зато открывает богатые возможности для пиздобольства и рекламных заманух, что крайне любо манагерам. В случае gtk – это ебанутое баловство с css, вместо нормальных движков, отрисовывающих виджеты и отказ от каких-либо альтернатив.
Читать далее «Пуркуа gtk3 тормозит или уебаны дорвались…»

Блокировка экрана

Блокировка экрана – вещь, в принципе, архиполезная. Иногда. Для некоторых

В поисках идеала попробовал разные тулзины, в итоге остановился на xtrlock. Практически идеал. Но вот эта голубая блямба в виде замка сильно мозолила глаз. Пришлось поправлять

Читать далее «Блокировка экрана»

К вопросу о шрифтах

чудаки на букву м выпилили поддержку битмап шрифтов из pango, начиная с версии 1.44

меня это в принципе, не особо и жарило, любимый terminus используется преимущественно в urxvt и emacs, которые от pango не зависят, да еще и в консоли.
но вот конфигурялка urxvt, которая использует yad, и, как следствие, зависит от всего gtk стека, таки начала сбоить.

ну ладно. как там у высоцкого – зачем мне считаться шпаной и бандитом луддитом и ретроградом? решил сделать все стильно, модно, молодежно. но вот все эти ваши inconsolata-ы и прочие droid mono не вперли аж ни разу. голая консоль еще куда ни шло, Cyr_a8x16 решает. но в иксах заменой terminus-у может быть только terminus, для прочего хипстерства я уже слишком стар

готовые ttf варианты не канают, потому что не используют нужный/привычный мне набор патчей (dv1 ij1 ll2 td1). но шустрый гуглеж привел к mkttf, что позволило сгенерировать нужный мне шрифт без особых проблем.

результат можно взять здесь

ну и все любят картинки

Читать далее «К вопросу о шрифтах»

Иконка urxvt

Хотеть иконку. В urxvt. Согласно ewmh, а не костылями fvwm. И чтобы без всяких –enable-pixbuf и прочего свистяще-пердящего барахла, тянущего лишние зависимости типа gdk-pixbuf

Ну чо, хотеть – сделать. На то он и опенсорц. Иконки, согласно ewmh, задаются через XChangeProperty и атом _NET_WM_ICON. Собственно атом – массив чисел, описывающих иконку. Иконок в одном атоме может быть несколько. Первые два слова описания иконки – размер, дальше пиксели в формате ARGB. Основной фокус – эти числа получить

Читать далее «Иконка urxvt»

Очередные странности gtk3

Понадобилось вызывать всплывающее меню. По “горячей клавише”. Из любого места. Есть для этого такая маленькая приятная либа – keybinder. И как отдельная либа хороша, и в свой код интегрируется легко, т.к. в либе всего один файл с кодом. В общем – прелесть. Вот только меню из обработчиков хоткеев всплывать не желает, хоть ты тресни. Любое другое действие – пожалуйста. Меню – хрен тебе на воротник, а не меню. Причем, тот же самый код для вызова меню прекрасно работает, если его дергать через механизмы GApplication. Такая вот омерзительность.

Читать далее «Очередные странности gtk3»

Run dialog для FVWM

захотелось странного – нормальную запускалку в fvwm. но возникли трудности. то, что дается самим fvwm-ом – убого до безобразия. виджеты для ввода текста что в FvwmScripts, что в FvwmForm тупые до ужаса, не позволяют редактирование от слова вообще, да и ограничения по длине у них идиотские. зато есть Swallow и urxvt. первое позволяет встроить что угодно, благодаря XEmbed, второе – то, что надо для ввода. но, хочу свою историю и поменьше всякого лишнего. сначала подумывал об отдельном конфиге для zsh (bash собран без каких-либо интерактивностей, только для скриптов), но уж очень громоздкие решения. в результате нарыл rlwrap – очень годная тулза, использующая readline и history для организации ввода с историей и прочими плюшками. в результате родилось следующее

urxvt -name YRun +sb -bg "$[infostore.pr_bg]" -fg "$[infostore.pr_fg]" -fn "$[infostore.pr_fn]" -g 35x1-1500-1500 -e rlwrap -o -S "> " -pRed $[FVWM_LIBDIR]/prun.sh

Читать далее «Run dialog для FVWM»

Полезность перенаправлений

Довольно распространенная задача в скриптах – получить размер файла в различных попугаях, к примеру в строках. Для этих целей есть годная утилита wc. Вот только выхлоп у нее не очень удобный, кроме попугаев в выхлопе присутствует еще и имя файла. Чтобы эту гадость вырезать, необходимо прибегать к каким-то конвейерным конструкциям. НО! В случае, если файл подается на стандартный вход, имени никакого нет, и на выходе получается только необходимая величина. Поэтому идеал – lines=$(wc -l < /path/to/file)

  WHY, STUPID MOTHERFUCKERS, WHY ?!?!?!                                                                                                                               
  i don't need your fucking restrictions to your drug-based naming conventions                                                     
--- glib-2.54.3/gio/glib-compile-schemas.c.orig     2018-02-09 07:22:22.154862311 +0200              
+++ glib-2.54.3/gio/glib-compile-schemas.c  2018-02-09 07:23:04.773862128 +0200                      
@@ -1219,19 +1219,6 @@                                                               
       return;                                                                                                                          
     }                                                                                                                                  
                                                                                                                                        
-  if (path && (g_str_has_prefix (path, "/apps/") ||                               
-               g_str_has_prefix (path, "/desktop/") ||                                    
-               g_str_has_prefix (path, "/system/")))                                      
-    {                                                                                               
-      gchar *message = NULL;                                                                        
-      message = g_strdup_printf (_("Warning: Schema “%s” has path “%s”.  "                
-                                   "Paths starting with "                                 
-                                   "“/apps/”, “/desktop/” or “/system/” are deprecated."),
-                                 id, path);                                                         
-      g_printerr ("%s\n", message);                                                       
-      g_free (message);                                                                             
-    }                                                                                               
-                                                                                                    
   state->schema_state = schema_state_new (path, gettext_domain,                                                                     
                                           extends, extends_name, list_of);