LINUX.ORG.RU

camell++ 1.2.0

 ,


1

4

Библиотека camell++ предназначена для объектно-ориентированного создания окон и манипулирования их содержимым через примитивы X11. Библиотека позволяет писать текст, рисовать точки, линии, дуги, прямоугольники и т. д. У библиотеки более чем десятилетняя история, за которую она несколько раз меняла своё название (первый вариант — XeeD, затем Xight, теперь camell++).

>>> Скачать

>>> SlackBuild

Ответ на: комментарий от Linfan

На остальных системах ткинтер с тиклем доставлять надо

Нет. Если только в каких-нибудь Debian'ах и Убунтах, где одну софтину разбирают на тысячи маленьких пакетиков.

$ grep -e tkinter\/$ /var/log/packages/python3-3.6.0-x86_64-1_SBo
usr/lib64/python3.6/tkinter/
usr/lib64/python3.6/tkinter/test/test_tkinter/
$ grep -e lib-tk\/$ /var/log/packages/python-2.7.13-x86_64-1
usr/lib64/python2.7/lib-tk/

А вот теперь заглянем в содержимое Debian'а 9:

$ zgrep -e \/Tkinter.py debian-9-Contents-amd64.gz
usr/lib/pypy/lib-python/2.7/lib-tk/Tkinter.py           python/pypy-lib
usr/lib/python2.7/lib-tk/Tkinter.py                     python/libpython2.7-stdlib
$ zgrep -e \/tkinter\/__main__.py debian-9-Contents-amd64.gz
usr/lib/python3.5/tkinter/__main__.py                   python/libpython3.5-stdlib
Как видно, и в Debian 9 с его тысячами мелких пакетиков Tkinter входит в libpython2.7-stdlib и libpython3.5-stdlib, а не в какие-нибудь libpython2.7-tk и libpython3.5-tk.

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

Зато это легковесные библиотеки, которые вполне можно юзать для простейших интерфейсов.

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

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

Я канешн оценил консольный вывод, но таки поверьте человеку, писавшему много на Tk - биндинг лежит в отдельном пакете python-tk:

https://packages.debian.org/ru/stretch/python-tk

Ну и всякое разное, с tk и питонов увязанное тоже по отдельным пакетам (типа PIL+tk и т.д.)

Если чо, в rpm-чатых дистрах тоже самое.

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

Ну, значит, в Debian'е всё-таки раскрошили. Но, это проблемы Debian'а. Точнее даже его юзеров. Если уж они выбрали дистрибутив в котором всё покрошили на мелкие пакетики, и им лень их доустанавливать. А в других дистрибутивах, где так не крошат, всё входит в один единственный базовый пакет с нужной версией Python'а.

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

Будет. Смотри EDE.

Изменения на простых интерфейсах

Ну не знаю. http://suckless.org предлагает не делать сложные интерфейсы, а только простые. И знаешь, мне их позиция нравится. Как говорится

And folks, let’s be honest. Sturgeon was an optimist. Way more than 90% of code is crap

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

Я бы сказал, что это особенность слаки, что там все в кучке. Ну и в генте то же самое. Причина - сборка из сорцов по месту. Но это особенность 1% юзеров среди линуксоидов. Т.е. сотые процента в общей массе десктопов.

Ткинтер «отдельно» - это нормально. Нафига с питоном тащить зависимость на тикль? Далеко не всем это требуется.

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

Это дефолтность Tkinter'а не отменяет.

И существуют десятки дистрибутивов, которые родственны Slackware и Gentoo. Включая те же Arch, Manjaro, Crux,... Во многих из них тоже нет никаких отдельных python-tk. Вот в таких дистрибутивах как Frugalware, Void,... оно запаковано в отдельные пакеты, это да.

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

Простой код, простые интерфейсы, KISS — это всё инвестиция в будущее. В то, что этот код можно будет легко понять, доработать и использовать дальше.

Но простой код, простые интерфейсы — это же думать надо.

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

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

которые родственны Slackware и Gentoo

Что-то мне подсказывает, что у них всех ткинтер собирается опционально, «по флажку». В жизни не поверю, что питон и тикль скручены намертво :)

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

Будет. Смотри EDE.

Ну и сколько составляет выигрыш? Я бы без раздумий потратил его на получение современного внешнего вида. Не стоит пара мегабайт таких мучений.

Ну не знаю. http://suckless.org предлагает не делать сложные интерфейсы, а только простые.

Попробуй организуй проект типа krita с простым интерфейсом. Так чтоб это не выглядело страшным приветом из девяностых.

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

Tcl и Tk - это разные вещи. Tk - это тулкит, биндинги которого существуют к разным языкам, а не только к Tcl.

$ ls -l /usr/lib64/libtk.so
lrwxrwxrwx 1 root root 11 ноя 13  2016 /usr/lib64/libtk.so -> libtk8.6.so
Соответственно, в других языках, включая тот же Python, всё к Tk прикручивается напрямую, а не через Tcl.

И при компиляции Python'а в числе его дефолтных модулей из коробки собирается Tkinter, который прикручивается к Tk напрямую.

Вот опции которых достаточно чтобы собрался Tkinter:

./configure \
  --prefix=/usr \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --mandir=/usr/man \
  --docdir=/usr/doc/$PRGNAM-$VERSION \
  --with-threads \
  --enable-ipv6 \
  --enable-shared \
  --with-system-expat \
  --with-system-ffi \
  --build=$ARCH-slackware-linux

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

Ну и сколько

По сравнению с чем? Насколько я помню EDE жрёт как icewm.

получение современного внешнего вида.

Нет спасибо. Такая гадость лично мне не нужна.

проект типа krita

Есть куцый основной функиционал. Остальное добавляется патчами. Вот тебе и вся организация.

чтоб это не выглядело

Как там сделали - http://suckless.org/

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

Я не говорю про интерфейс как в 90-е. Я говорю про простой интерфейс. Где нет кучи кнопочек, всё вызывается по хоткеям и через dmenu. Где нет талмудов c объяснениями какую кнопку нажимать, а есть простой и лаконичный man.

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

Tcl и Tk - это разные вещи. Tk - это тулкит, биндинги которого существуют к разным языкам, а не только к Tcl.

Позор на вашу седую слакварьную голову ))) Tk это тулкит интерпретатора tcl. Биндинг к нему (тот же tkinter) формирует стринговые команды tcl и отправляет через _tkinter.so интерпретатору tcl на исполнение.

Пруф:

$ ldd _tkinter.so
        linux-vdso.so.1 =>  (0x00007ffe63166000)                                                                                                      
        libBLT.2.5.so.8.6 => /usr/lib/libBLT.2.5.so.8.6 (0x00007f7c94880000)                                                                          
        libtk8.6.so => /usr/lib/x86_64-linux-gnu/libtk8.6.so (0x00007f7c94523000)
        libtcl8.6.so => /usr/lib/x86_64-linux-gnu/libtcl8.6.so (0x00007f7c94173000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7c93f55000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7c93b8e000)
        libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f7c93853000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7c9354a000)
        libXft.so.2 => /usr/lib/x86_64-linux-gnu/libXft.so.2 (0x00007f7c93335000)
        libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f7c930f2000)
        libXss.so.1 => /usr/lib/x86_64-linux-gnu/libXss.so.1 (0x00007f7c92eee000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7c92cea000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7c92ace000)
        /lib64/ld-linux-x86-64.so.2 (0x0000564dd2914000)
        libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f7c928ac000)
        libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f7c925ff000)
        libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f7c923f5000)
        libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f7c921cb000)
        libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f7c91fb9000)
        libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f7c91db3000)
        libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f7c91bad000)
        libpng16.so.16 => /usr/lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f7c9197b000)

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

И чтобы не было сомнений, вот исходник tkinter (питонская часть):

http://mgltools.scripps.edu/api/DejaVu/Tkinter-pysrc.html

Код напыжован конструкциями типа:

self.tk.call('option', 'add', pattern, value, priority)

Это и есть передача стринговых команд в tcl через нативный экстеншин _tkinter

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

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

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

На самом деле нет. Tcl-core есть даже в LFS'е для того, чтобы гонять тесты. Без него они не работают.

   DejaGnu is a framework for running test suites on GNU tools.
   It is written in expect, which uses Tcl (Tool
   command language).
А в BLFS'е появляется уже Tcl полностью. Там он нужен для прикручивания к vim'у, Berkeley DB, PostgreSQL (builds the PL/Tcl server-side language), GTK 2.

А в том же Debian'е 9 с libtcl слинкованы в т.ч.: antennavis, aolserver4, apt-dater, covered, deal, din, dirdiff, eggdrop, emacspeak-espeak-server, epic5, expect, fossil, foxeye, gcl, gpsmanshp, gtkwave, hping3, ibutils, irsim, isdnvboxserver, cgns-convert, magic, environment-modules, nam, ns2, oce-draw, openmsx, libpurple0, qrouter, r-base-core, rat, sauce, savi, scid, scilab-full-bin, scilab-minimal-bin, skycat, staden, svxlink-server, timidity-interfaces-extra, tk707 (drum sequencer for a sound card or MIDI device), tkdesk, tkgate, trafficserver, xdeview, vera++, vigor, vim-athena, vim-gtk, vim-gtk3, vim-nox, vkeybd, libvtk6.3, libvtk6.3-qt, vtk6, weechat-plugins, wordnet-gui, xcircuit, xcrysden и yosys.

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

Из перечисленного многие пакеты по сути legacy и не развиваются. Да и маловато будет из расчета на десятки тысяч из общей пакетной базы. Причем к tk отношение имеют далеко не все. tcl в свое время активно пользовался для всякого сетевого скриптования.

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

На самом деле, по сути, достаточно поставить vim или pidgin, чтобы они притянули libtcl в систему. А тот же expect находится в зависимостях у belier, sqwebmail, eclipse-titan, nagios-plugins-contrib и rancid.

saahriktu ★★★★ ()

Header only <camell++.hpp>&

/*
 Camell++ Lib v 1.2.0
 X-Window routines Library
 Developed by saahriktu
 released under GNU GPLv3
*/
#include <X11/Xlib.h>
#include <string.h> //for strlen

class camell {
	public:
		inline camell(int x_x, int x_y, int x_width, int x_height, int x_border_width) {
			camell_width = x_width;
			camell_height = x_height;
			camell_d = XOpenDisplay(NULL);

			if (camell_d) {
				camell_screen = XDefaultScreen(camell_d);
				camell_visual = DefaultVisual(camell_d, camell_screen);
				camell_depth = DefaultDepth(camell_d, camell_screen);
				x_cmap = DefaultColormap(camell_d, camell_screen);
				camell_w = XCreateWindow(camell_d, XRootWindow(camell_d, camell_screen), x_x,
				                  x_y, x_width, x_height, x_border_width, camell_depth,
				                  InputOutput, camell_visual, CWBackPixel, &camell_attr);
				XSelectInput(camell_d, camell_w, ExposureMask | KeyPressMask);
				xgc_values.background = 1;
				x_gc = XCreateGC(camell_d, camell_w, GCBackground + GCForeground, &xgc_values);
				XFlush(camell_d);
				XMapWindow(camell_d, camell_w);
				XFlush(camell_d);
				XSetTransientForHint(camell_d, XRootWindow(camell_d, camell_screen), camell_w);
				x_atom[0] = XInternAtom(camell_d, "WM_DELETE_WINDOW", true);
				XSetWMProtocols(camell_d, camell_w, x_atom, 1);
			}
		}
		inline ~camell() { XCloseDisplay(0);}
	public:
		inline void set_foreground(int xfg_red, int xfg_green, int xfg_blue) {
			set_pixelcolor(xfg_red, xfg_green, xfg_blue);
			XSetForeground(camell_d, x_gc, x_color.pixel);
		}
	private:
		inline void set_pixelcolor(int pc_r, int pc_g, int pc_b) {
			x_color.red = pc_r * 257;
			x_color.green = pc_g * 257;
			x_color.blue = pc_b * 257;
			x_color.flags = DoRed | DoGreen | DoBlue;
			XAllocColor(camell_d, x_cmap, &x_color);
		}
	public: //Обёртки на X11
		inline void set_font(const char *fontname) { XSetFont(camell_d, x_gc, XLoadFont(camell_d, fontname));}
		inline void puttext(int t_x, int t_y, const char *text) { XDrawString(camell_d, camell_w, x_gc, t_x, t_y, text, strlen(text));}
		inline void putpixel(int pixel_x, int pixel_y) { XDrawPoint(camell_d, camell_w, x_gc, pixel_x, pixel_y); }
		inline void putline(int pixel_x1, int pixel_y1, int pixel_x2, int pixel_y2) { XDrawLine(camell_d, camell_w, x_gc, pixel_x1, pixel_y1, pixel_x2, pixel_y2);}
		inline void putarc(int arc_x, int arc_y, unsigned int arc_width, unsigned int arc_height, int arc_angle1, int arc_angle2) { XDrawArc(camell_d, camell_w, x_gc, arc_x, arc_y, arc_width, arc_height, arc_angle1, arc_angle2);}
		inline void fillarc(int arc_x, int arc_y, unsigned int arc_width, unsigned int arc_height, int arc_angle1, int arc_angle2) { XFillArc(camell_d, camell_w, x_gc, arc_x, arc_y, arc_width, arc_height, arc_angle1, arc_angle2);}
		inline void putrectangle(int rect_x, int rect_y, unsigned int rect_width, unsigned int rect_height) { XDrawRectangle(camell_d, camell_w, x_gc, rect_x, rect_y, rect_width, rect_height);}
		inline void fillrectangle(int rect_x, int rect_y, unsigned int rect_width, unsigned int rect_height) {XFillRectangle(camell_d, camell_w, x_gc, rect_x, rect_y, rect_width, rect_height);}
		inline void graphics_refresh() { XFlushGC(camell_d, x_gc);}
	public: //Геттеры
		inline void set_wattr(XSetWindowAttributes wattr_) { camell_attr = wattr_;}
		inline Display *get_display() { return camell_d; }
		inline Window get_window() { return camell_w;}
		inline int get_screen() { return camell_screen;}
		inline GC get_gc() { return x_gc;}
		inline int get_width() { return camell_width;}
		inline int get_height() { return camell_height;}
	private:
		Display *camell_d;
		Window camell_w;
		Visual *camell_visual;
		int camell_depth;
		int camell_screen;
		XSetWindowAttributes camell_attr;
		GC x_gc;
		XColor x_color, x_color_back;
		Colormap x_cmap;
		XGCValues xgc_values;
		int camell_width, camell_height;
		Atom x_atom[0];
};

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

Но, зачем? Я так писал когда не умел собирать shared object'ы. При включении заголовка он полностью включается в исходный код. И дублируется в каждой программе. В то время как shared object'ы созданы для экономии памяти. В заголовочных файлах только объявления, а сам код компилируется один раз в отдельный shared object.

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

Есть куцый основной функиционал. Остальное добавляется патчами. Вот тебе и вся организация.

вимподобный интерфейс сделает твою программу не осваиваемой.

Нет спасибо. Такая гадость лично мне не нужна.

Что и от xfce тошнит?

Как там сделали - http://suckless.org/

Где там большая кнопка «скриншоты»? Или это илюстрация того как ради элементарного действия нужно исполнить ритуальный танец?

Насколько я помню EDE жрёт как icewm.

Как я понимаю по функциональности они не далеко ушли? К примеру там есть возможность жестом мыши развернуть окно на пол экрана?

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

вимподобный интерфейс

Ты вообще вим видел-то? Там не так сделано. Хотя идея хорошая, да.

большая кнопка «скриншоты

Не завезли. Смотри раздел нужной тебе програмы. Там есть отдельные кнопки http://dwm.suckless.org/screenshots/

илюстрация того как ради элементарного действия нужно исполнить ритуальный танец

Там не одна программа, знаешь ли. Они независимы друг от друга. Это в каком нибудь DE скрины всех программ на одной страницу. А здесь этого нет.

функциональности они не далеко ушли

Ну да, правильно понимаешь.

жестом мыши развернуть окно

Нет. А зачем? Хоткеи на клавиатуре же есть для этого.

anonymous ()