LINUX.ORG.RU
ФорумTalks

Opensource & bydlocode

 ,


0

1

Захотел сделать свою приблуду для глобальных хоткеев, полез в сырцы xbindkeys (y u no docs, opensource?), а там...

static void
my_grab_button (Display * dpy, unsigned int button, unsigned int modifier,
		Window win)
{
  modifier &= ~(numlock_mask | capslock_mask | scrolllock_mask);

  XGrabButton (dpy, button, modifier, (win ? win : DefaultRootWindow (dpy)),
	       False, ButtonPressMask | ButtonReleaseMask,
	       GrabModeAsync, GrabModeAsync, None, None);

  if (modifier == AnyModifier)
    return;

  if (numlock_mask)
    XGrabButton (dpy, button, modifier | numlock_mask,
		 (win ? win : DefaultRootWindow (dpy)),
		 False, ButtonPressMask | ButtonReleaseMask,
		 GrabModeAsync, GrabModeAsync, None, None);


  if (capslock_mask)
    XGrabButton (dpy, button, modifier | capslock_mask,
		 (win ? win : DefaultRootWindow (dpy)),
		 False, ButtonPressMask | ButtonReleaseMask,
		 GrabModeAsync, GrabModeAsync, None, None);

  if (scrolllock_mask)
    XGrabButton (dpy, button, modifier | scrolllock_mask,
		 (win ? win : DefaultRootWindow (dpy)),
		 False, ButtonPressMask | ButtonReleaseMask,
		 GrabModeAsync, GrabModeAsync, None, None);

  if (numlock_mask && capslock_mask)
    XGrabButton (dpy, button, modifier | numlock_mask | capslock_mask,
		 (win ? win : DefaultRootWindow (dpy)),
		 False, ButtonPressMask | ButtonReleaseMask,
		 GrabModeAsync, GrabModeAsync, None, None);

  if (numlock_mask && scrolllock_mask)
    XGrabButton (dpy, button, modifier | numlock_mask | scrolllock_mask,
		 (win ? win : DefaultRootWindow (dpy)),
		 False, ButtonPressMask | ButtonReleaseMask,
		 GrabModeAsync, GrabModeAsync, None, None);

  if (capslock_mask && scrolllock_mask)
    XGrabButton (dpy, button, modifier | capslock_mask | scrolllock_mask,
		 (win ? win : DefaultRootWindow (dpy)),
		 False, ButtonPressMask | ButtonReleaseMask,
		 GrabModeAsync, GrabModeAsync, None, None);

  if (numlock_mask && capslock_mask && scrolllock_mask)
    XGrabButton (dpy, button,
		 modifier | numlock_mask | capslock_mask | scrolllock_mask,
		 (win ? win : DefaultRootWindow (dpy)), False,
		 ButtonPressMask | ButtonReleaseMask, GrabModeAsync,
		 GrabModeAsync, None, None);
}

Интересно, если бы лампочек на клавиатуре было больше трех, сдесь бы была портянка из 15 копипастнутых if'ов?

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

Так может патч выслать? Опенсорс же.

knovich
()

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

Это ты ещё коммерческого кода не видел.

Relan ★★★★★
()

Человеку было надо - он написал как умел. Опенсорс не эльфы пишут.

leave ★★★★★
()

Работает? Вот и славно. Не фапать же на код, правда?

Ghostwolf ★★★★★
()

Покажи свой код.

imul ★★★★★
()

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

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

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

Будьте добрее.

За добротой тебе на швабр. Там как раз любят добряков-криворучек. Прямо-таки эдакий хоспис для тех, кому «не дано».

kawaii_neko ★★★★
() автор топика

Что же с тобой будет, когда ты закрытый код под NDA увидишь...там боль, слезы, и поплакаться на лоре в жилетку анону лицензия не позволяет.

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

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

Ты не понимаешь сути опенсорса. Суть открытого кода в том, что если тебе чего-то не хватает, берешь и костылишь, не дожидаясь, когда там автор снизойдет. Если не лень, оформляешь и засылаешь патчик, который (если не лень), автор может и принять.

К слову, очень многие популярные продукты с открытым кодом состоят из леденящего душу ужаса. Чтобы далеко не ходить, назовем ffmeg и mplayer своими именами. И до тех пор, пока «все работает», сообщество не особо и чешется.

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

когда ты закрытый код под NDA

Детка, я себе на бутерброд с икрой как раз закрытым кодом уже не первый десяток лет зарабатываю. И смею тебя уверить, что никаких принципиальных отличие от опенсорса там нет: если продукт пишут под «хотелки эффективных медежеров», да так, чтоб «побыстрее результат получить», будет такой же лютый высер, как и 95% опенсорца.

Но иногда звезды встают на небе таким образом, что попадается адекватный сеньор/тимлид/архитектор, которые не допускают скатывания продукта в леденящий душу ужас. Случается это почти так же «часто», как в опенсорсе.

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

Доброта есть внутри каждого из нас, и каждый из нас может нести ее в окружающий мир. Я буду просвещать ЛОР. Зачем идти туда, где и так все хорошо?

PS: Просто не Хабре быдло долго не живет, вот и результат.

Ghostwolf ★★★★★
()

Перепиши так, как считаешь нужным.

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

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

Тогда чего ноешь, как маленькая девочка? Раз заявляешь что не ребенок - будь мужиком, нарисуй патч.

если продукт пишут под «хотелки эффективных медежеров», да так, чтоб «побыстрее результат получить»

Только так сейчас и делают, к сожалению, ибо либо time2market, либо все полимеры уйдут конкурентам. А потом мы разгребаем потом SDK очередного чипа с матами.

Но иногда звезды встают на небе таким образом, что попадается адекватный сеньор/тимлид/архитектор, которые не допускают скатывания продукта в леденящий душу ужас. Случается это почти так же «часто», как в опенсорсе.

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

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

Язык поощряет такой быдлокод.

Собака делает „гав”, кошка делает „мяу”, корова делает „му”, депутаты не делают нихрена, говно делают все.

h578b1bde ★☆
()

Да. Мне тоже пришлось как-то заглянуть в xprop и еще какую-то утилиту... Больше никаких иксов, пишу с тостера.

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

Ну молодец, ты познал суть опенсорца. Патчик-то высылать будешь, или ты тут так, набросить? =)

Siado ★★★★★
()

Что не так? Надо было гору фабрик, визиторов и прочих паттернов нагородить?

backburner
()
Ответ на: комментарий от buddhist

А как это еще переписать?

Банально «заменить копипасту на макрос»:

#define grab(ledmask) \
  XGrabButton (dpy, button, modifier | ledmask, (win ? win : DefaultRootWindow (dpy)),
	       False, ButtonPressMask | ButtonReleaseMask,
	       GrabModeAsync, GrabModeAsync, None, None)
#define grab_if(cond, ledmask) if (cond) do_grab(ledmask)
#define grab_if1(mod) grab_if(mod, mod)
#define grab_if2(mod1, mod2) grab_if(mod1 && mod2, mod1 | mod2)
#define grab_if3(mod1, mod2, mod3) grab_if(mod1 && mod2 && mod3, mod1 | mod2 | mod3)

grab(0);
grab_if1(numlock_mask); grab_if1(capslock_mask); grab_if1(scrolllock_mask);
grab_if2(numlock_mask, capslock_mask); grab_if2(numlock_mask, scrolllock_mask); grab_if2(capslock_mask, scrolllock_mask);
grab_if3(numlock_mask, capslock_mask, scrolllock_mask);

Портянка сразу становится намного короче и читабельней.

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от kawaii_neko
grab_if1
grab_if2
grab_if3

Это всё как-то криво, даже для меня.
Лучше хотя-бы так:

if (numlock_mask || capslock_mask || scrolllock_mask) {
   XGrabButton (dpy, button,
		(modifier | 
	        (numlock_mask ? numlock_mask : 0) |
	        (capslock_mask ? capslock_mask : 0) |
	        (scrolllock_mask ? scrolllock_mask : 0)),
		(win ? win : DefaultRootWindow (dpy)), False,
		ButtonPressMask | ButtonReleaseMask, GrabModeAsync,
		GrabModeAsync, None, None);
   }

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

modifier | (numlock_mask ? numlock_mask : 0)

numlock_mask — это какой-нибудь int ? Тогда зачем тернарный оператор? «|» и так ничего не сделает, если numlock_mask == 0.

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

Тогда зачем тернарный оператор?

Для сохранения поведения кода.

«|» и так ничего не сделает, если numlock_mask

Ну, да, логично. Тогда вообще всё просто:

if (numlock_mask || capslock_mask || scrolllock_mask) {
   XGrabButton (dpy, button,
		modifier | numlock_mask | capslock_mask | scrolllock_mask,	        
		(win ? win : DefaultRootWindow (dpy)), False,
		ButtonPressMask | ButtonReleaseMask, GrabModeAsync,
		GrabModeAsync, None, None);
   }

crutch_master ★★★★★
()

Да ладно тебе. Зато с таким кодом сразу видно, где отвечающий за определённую лампочку код находится. И вообще у тебя есть возможность предложить свой вариант покороче.

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

Я даже больше скажу - большая часть софта в принципе состоит из леденящего душу кода. И немалая часть держится на леденящей душу архитектуре. Увы, но не всегда есть время, чтобы сделать «правильно».

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

О читабельности твоего варианта поспорить вполне можно.

Quasar ★★★★★
()

А закрытый код ты просто не видишь.

Deleted
()
Ответ на: комментарий от kawaii_neko

Нынче модно быть озлобленным говном и хаять Хабр, на котором есть специалисты покруче тебя, но якобы атмосфера не понравилась?

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

Нынче модно быть озлобленным говном и хаять Хабр, на котором есть специалисты покруче тебя, но якобы атмосфера не понравилась?

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

ya-betmen ★★★★★
()
Ответ на: комментарий от Deleted

Никто ничего не запрещает.

Почему же тогда

но якобы атмосфера не понравилась?

якобы

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

ya-betmen ★★★★★
()

Один парень рассказывал, что у них в конторе одного только GUI на яве 600МБ в исходниках. Я так и не понял, хвастался он, или жаловался.

Были товарищи, которые гордились запросом (я не шучу) в 15 тыс. строк. И те, которые хвастались тем, что пишут в день не меньше тыщи строк.

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

Карма, правила, счас даже вечеринки без модераторов не обходятся. Ну их.

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

Тваюмат! Это шо за леденящий душу пздц? И этот человек тут рассказывает за быдлокод?

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

Loki13 ★★★★★
()

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

Эти хотя бы сами пишут. А другие индусы потом копипастят этот код к себе в энтерпрайз.

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

Нынче модно быть озлобленным говном и хаять Хабр, на котором есть специалисты покруче тебя, но якобы атмосфера не понравилась?

Специалисты на швабре покруче меня? Ну это если только «по программированию на HTML5 и CSS3». В среднем уровень там весьма днищный. А «покруче меня» даже в России наберется не так уж много людей.

kawaii_neko ★★★★
() автор топика

Кстати, совсем забыл

Перед этим леденящим душу кодом идет другой. Как говорится, «найди 5 отличий»:

static void
my_grab_key (Display * dpy, KeyCode keycode, unsigned int modifier,
	     Window win)
{
  modifier &= ~(numlock_mask | capslock_mask | scrolllock_mask);


  XGrabKey (dpy, keycode, modifier, (win ? win : DefaultRootWindow (dpy)),
	    False, GrabModeAsync, GrabModeAsync);

  if (modifier == AnyModifier)
    return;

  if (numlock_mask)
    XGrabKey (dpy, keycode, modifier | numlock_mask,
	      (win ? win : DefaultRootWindow (dpy)),
	      False, GrabModeAsync, GrabModeAsync);

  if (capslock_mask)
    XGrabKey (dpy, keycode, modifier | capslock_mask,
	      (win ? win : DefaultRootWindow (dpy)),
	      False, GrabModeAsync, GrabModeAsync);

  if (scrolllock_mask)
    XGrabKey (dpy, keycode, modifier | scrolllock_mask,
	      (win ? win : DefaultRootWindow (dpy)),
	      False, GrabModeAsync, GrabModeAsync);

  if (numlock_mask && capslock_mask)
    XGrabKey (dpy, keycode, modifier | numlock_mask | capslock_mask,
	      (win ? win : DefaultRootWindow (dpy)),
	      False, GrabModeAsync, GrabModeAsync);

  if (numlock_mask && scrolllock_mask)
    XGrabKey (dpy, keycode, modifier | numlock_mask | scrolllock_mask,
	      (win ? win : DefaultRootWindow (dpy)),
	      False, GrabModeAsync, GrabModeAsync);

  if (capslock_mask && scrolllock_mask)
    XGrabKey (dpy, keycode, modifier | capslock_mask | scrolllock_mask,
	      (win ? win : DefaultRootWindow (dpy)),
	      False, GrabModeAsync, GrabModeAsync);

  if (numlock_mask && capslock_mask && scrolllock_mask)
    XGrabKey (dpy, keycode,
	      modifier | numlock_mask | capslock_mask | scrolllock_mask,
	      (win ? win : DefaultRootWindow (dpy)), False, GrabModeAsync,
	      GrabModeAsync);

}

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

Ну, да, логично. Тогда вообще всё просто:

Да, все просто: тебе следует уйти прочь из профессии, как говорил Артемий Татьянович. Видимо ты не осилил понять, что приведенная простынка должна добавить захват сочетаний клавиш при всевозможных комбинациях индикаторов {num,caps,scroll}lock.

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

Банально «заменить копипасту на макрос»:

А ты специалист. Мне тот «говнокод» куда больше по душе чем твой чудокод.

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

Когда-то я был молод, горяч и не гнушался использовать yp-подход к разработке, ведь повторяющихся фрагментов в коде всегда дохрена. Но с тех пор прошло много лет, я увидел, какая жопа наступает, когда yp размножает баги, которые потом правят в некоторых местах, а в других банально не видят/забывают/не понимают. С тех пор активно использую препроцессор для безупречной и безбажной копипасты.

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