#!/usr/bin/env python
import dbus
remote_bus = dbus.SessionBus()
out_connection = remote_bus.get_object('com.Skype.API', '/com/Skype')
out_connection.Invoke('NAME SkypeToggler')
out_connection.Invoke('PROTOCOL 5')
wnd_state = out_connection.Invoke('GET WINDOWSTATE')
if 'WINDOWSTATE NORMAL' == wnd_state:
print 'Hide'
out_connection.Invoke('MINIMIZE')
elif 'WINDOWSTATE HIDDEN' == wnd_state:
print 'Show'
out_connection.Invoke('FOCUS')
простой IPC на Perl
я в перл не очень много что понимаю, поэтому большая просьба объяснить подробнее :)
я хочу сделать утилиту, которая будет вешаться демоном (при первом запуске) при последующих запусках новый instance этой же утилиты должен послать эому демону какое-то уведомление (оно будет всего одного, не будет "разных типов команд"), после чего новый instance завершает работу, а демон неким образом на уведомление реагирует.
в принципе, как сделать всё, кроме обнаружения демона и посылки ему сообщения, я представляю. хотелось бы как-то попроще реализовать механизм IPC
я в перл новичёк, поэтому просьба не пинать, а хотя бы послать по более-менее конкретным урлам в гугль
так вот - чем это всё навеяно и зачем оно надо:
навеяно http://forum.skype.com/index.php?showtopic=109715&hl=package+SkypeAPI
а надо для того, чтобы повесить открыте\сворачивание окна скайпа на горячую клавишу :) уж сильно мне этого в линуксе не хватает! (а под форточками привык уже)
есть вот такой вот скрипт на питоне (наполовину содраный, наполовину написаный мной)
Код:
он делает то что нужно - смотрит, если скайп свёрнут, показывает его, если не свёрнут, прячет. одно НО - каждый отдельный запуск этого скрипта - новое подключение к Skype API, поэтому скайпина каждый раз спрашивает "разрешить\отклонить". вот именно, чтобы вопрос задавался один раз и хочется повесить демон.
штуку skype4python видел, но мне не хочется брать какие-то ещё сторонии либы для такой плёвой задачи. и почему-то мне всё-таки больше нравиться perl ))
подскажите, плииииз! 1- очень уж интересно, 2- очень привык к хоткеям :)
Код:
sub daemonize()
{
open STDIN, '/dev/null' or die "Daemon: can't read /dev/null: $!";
open STDOUT, ">>$logfile"
or die "Daemon: can't write to $logfile: $!";
defined(my $pid = fork) or die "Daemon: can't fork: $!";
if($pid) {
# parent
open PIDFILE, ">$pidfile"
or die "Daemon: can't write to $pidfile: $!\n";
print PIDFILE "$pid\n";
close(PIDFILE);
exit;
}
# child
setsid() or die "Daemon: can't start a new session: $!";
open STDERR, '>&STDOUT' or die "Daemon: can't dup stdout: $!";
}
{
open STDIN, '/dev/null' or die "Daemon: can't read /dev/null: $!";
open STDOUT, ">>$logfile"
or die "Daemon: can't write to $logfile: $!";
defined(my $pid = fork) or die "Daemon: can't fork: $!";
if($pid) {
# parent
open PIDFILE, ">$pidfile"
or die "Daemon: can't write to $pidfile: $!\n";
print PIDFILE "$pid\n";
close(PIDFILE);
exit;
}
# child
setsid() or die "Daemon: can't start a new session: $!";
open STDERR, '>&STDOUT' or die "Daemon: can't dup stdout: $!";
}
после вызова которой программа "демонизируется". если надо выполнять проверку - запущен ли уже демон - проверяй наличие $pidfile.
НО! это всё фигня, потому что оно работает и так :) вот тот скрипт, который я написал в предыдущем моём посте вешается на любимый хоткей в любимом оконном менеджере, в скайпине после первого нажатия хоткея можно смело ставить галочку "запомнить" и пользоваться этой приблудиной )) (видать я сначала просто что-то провтыкал - сразу чёт не работало.....)