LINUX.ORG.RU

Сообщения Mrak

 

[LOR] Стагнация новостей

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

Прув: http://www.linux.org.ru/news/archive/

С чем это связанно?
1. Мир OpenSource развивается медленнее
2. Модераторы стали меньше пропускать
3. Саныча забанили?
4. /0 или 2012 год на носу.

 

Mrak
()

[история успеха][наконец-то][DWA-131] linux драйвер работает лучше вантузного

Прикупил себе usb wifi адаптер DWA-131 для получения более быстрых интернетов, поскольку роутер у меня поддерживает до 300mbit/s.
Сначала решил опробовать в винде. Поставил последний драйвер с офф сайта. В XP драйвер определял скорость как 54mbit/s. Зашел на http://www.speedtest.net/ для теста. Получилось: download: ~10mbit/s, upload: ~9mbit/s.

Хорошо вернулся в debian, ядро 2.6.38-2-686. apt-get install firmware-realtek , вставил брелок. Все нашлось автоматом, network-manager показывает скорость 270mbt/s - что ни может не радовать. Далее захожу на вышеуказанный сайт и делаю тест. download: ~29mbit/s, upload: ~12mbit/s.

Прув: http://img705.imageshack.us/i/speedtestnetdwa131.png/

ЗЫ: Прув из венды не сделал, лень опять перегружаться, поверьте уж на слово.

 

Mrak
()

[google] оказывается весь мир живет по законам США ;)

Гуглил на медни и внезапно обнаружил, что из поиска удалена информация по указке США, хотя я живу в рашке и IP рашки. Какого хрена они вырезали для меня данную информацию?

Или я в танке и данная «фича» уже давно?

 

Mrak
()

[в этой стране] В чем смысл этой рекламы?

По утрам, когда завтракаю, смотрю быдлоящик минут по 10 и нарываюсь периодически на рекламу: «Газпром - национальное достояние». Кто мне может объяснить в чем смысл или суть этой рекламе в этой стране?

Mrak
()

wlan0 не видит ppp0

Что то вообще не пойму. Почему то один локальный интерфейс не видит другой :( Есть идеи?

$:~# cat /etc/debian_version 
squeeze/sid
$:~# uname -a
Linux $ 2.6.32-5-686 #1 SMP Thu Sep 30 03:56:23 UTC 2010 i686 GNU/Linux
$:~# cat /proc/sys/net/ipv4/ip_forward
1
$:~# ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol  
          inet addr:10.199.87.178  P-t-P:81.88.208.255  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:3469 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3245 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:2806714 (2.6 MiB)  TX bytes:489969 (478.4 KiB)

$:~# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr c4:17:fe:3e:62:03  
          inet addr:192.168.100.1  Bcast:192.168.100.255  Mask:255.255.255.0
          inet6 addr: fe80::c617:feff:fe3e:6203/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:79 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:11301 (11.0 KiB)

$:~# ping -I wlan0 10.199.87.178
PING 10.199.87.178 (10.199.87.178) from 192.168.100.1 wlan0: 56(84) bytes of data.
From 192.168.100.1 icmp_seq=1 Destination Host Unreachable
From 192.168.100.1 icmp_seq=2 Destination Host Unreachable
From 192.168.100.1 icmp_seq=3 Destination Host Unreachable
^C
--- 10.199.87.178 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4023ms
pipe 3

iptables все ACCEPT

Mrak
()

Скрипт «скачать всю музыку Цоя с сайта»

#!/usr/bin/perl -w

use strict;
use warnings;

use WWW::Mechanize;


my $URL = 'http://www.zipsites.ru/music/kino/';
my $BROWSER_AGENT = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)';
my $WGET = '/usr/bin/wget';
my $MP3DIR = '/tmp/kino';

my	$browser = WWW::Mechanize->new(agent => $BROWSER_AGENT, onerror => undef, stack_depth => 1);
$browser->add_header('Accept-Encoding' => undef);
my $r = $browser->get($URL);
unless ($browser->success){
	print "Can't get url\n";
	exit;
}
 
foreach($browser->links()){
	my $url = $_->url();
	if($url =~ /.+\/(.+)\/(.+)\.mp3$/i){
		mkdir($MP3DIR) if(!-e($MP3DIR));
		mkdir("$MP3DIR/$1") if(!-e("$MP3DIR/$1"));
		if(!-e("$MP3DIR/$1/$2.mp3")){
			system("$WGET --user-agent='$BROWSER_AGENT' -P \"$MP3DIR/$1\" \"$url\"");
		}
		else{
			print "\"$2\" already exists! Skip.\n";
		}
	}
}

print "DONE!\n";

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

Mrak
()

postgres + синхронизация master БД

Задача: Есть несколько postgress c базой 1C в нескольких филиалах. Бухгалтера работают каждый филиал со своей базой. Базы в идеале идентичны и синхронизируются между собой. В случае если одна база отваливается (разрыв сети), а потом воссоединяется с остальными - данные синхронизируются как из этой базы в другие, так и из остальных.
Причем, insert/update могут делать в любой из баз и данные должны синхронизироваться.

Это реально на postgres организовать?

Mrak
()

[автостопомпогалактике] Новая работа

Вышел на новую работу. Организация солидная с мировым именем.

Все нравиться, а больше нравиться заходить/выходить из туалета, расположенного рядом с IT департаментом. В общем при открытии двери раздается звук похожий как в фильме «Автостопом по галактике» (при открытии автоматических дверей на космическом корабле) - усталый выдох.

В общем символично, хорошее настроение обеспечено и всегда вспоминается 42! ;)

Mrak
()

Тема фильтр - 404

Если в любом разделе воспользоваться «Тема фильтр», то выдает 404. Возможно надо просто подправить URL в коде.

Mrak
()

debconf крутит мозги :( dpkg не настраивает пакеты

В продолжение так и не решенной проблемы Debain + dpkg непонятная ошибка 10

$ DEBCONF_DEBUG=developer apt-get -f install
...
не установлено до конца или удалено 7 пакетов.
После данной операции, объём занятого дискового пространства возрастёт на 0B.
Настраивается пакет gdm (2.20.11-1) ...
+ set -e
+ . /usr/share/debconf/confmodule
+ [ !  ]
+ PERL_DL_NONLAZY=1
+ export PERL_DL_NONLAZY
+ [  ]
+ exec /usr/share/debconf/frontend /var/lib/dpkg/info/gdm.postinst configure 
debconf (developer): frontend started
debconf (developer): frontend running, package name is gdm
debconf (developer): starting /var/lib/dpkg/info/gdm.config configure 
debconf (developer): <-- SET gdm/daemon_name /usr/sbin/gdm
debconf (developer): --> 0 value set
debconf (developer): <-- METAGET shared/default-x-display-manager owners
debconf (developer): --> 10 shared/default-x-display-manager doesn't exist
dpkg: не удалось обработать параметр gdm (--configure):
 подпроцесс установлен сценарий post-installation возвратил код ошибки 10
dpkg: зависимости пакетов не позволяют настроить пакет gdm-themes:
 gdm-themes зависит от gdm (>> 2.4), однако:
  Пакет gdm пока не настроен.
dpkg: не удалось обработать параметр gdm-themes (--configure):
 проблемы зависимостей -- оставляем не настроенным
Настраивается пакет samba-common (2:3.4.8~dfsg-2) ...
debconf (developer): frontend started
debconf (developer): frontend running, package name is samba-common
debconf (developer): starting /var/lib/dpkg/info/samba-common.config configure 
debconf (developer): <-- TITLE Samba Server
debconf (developer): --> 0
debconf (developer): <-- SET samba-common/do_debconf true
debconf (developer): --> 10 samba-common/do_debconf doesn't exist
dpkg: не удалось обработать параметр samba-common (--configure):
 подпроцесс установлен сценарий post-installation возвратил код ошибки 10
dpkg: зависимости пакетов не позволяют настроить пакет samba:
 samba зависит от samba-common (= 2:3.4.8~dfsg-2), однако:
  Пакет samba-common пока не настроен.
dpkg: не удалось обработать параметр samba (--configure):
 проблемы зависимостей -- оставляем не настроенным
dpkg: зависимости пакетов не позволяют настроить пакет samba-common-bin:
 samba-common-bin зависит от samba-common (>= 2:3.4.0~pre1-2), однако:
  Пакет samba-common пока не настроен.
dpkg: не удалось обработать параметр samba-common-bin (--configure):
 проблемы зависимостей -- оставляем не настроенным
Настраивается пакет sane-utils (1.0.21-3) ...
debconf (developer): frontend started
debconf (developer): frontend running, package name is sane-utils
debconf (developer): starting /var/lib/dpkg/info/sane-utils.config configure 
debconf (developer): <-- SET sane-utils/saned_run false
debconf (developer): --> 0 value set
debconf (developer): <-- INPUT medium sane-utils/saned_run
debconf (developer): --> 30 question skipped
debconf (developer): <-- INPUT medium sane-utils/saned_scanner_group
debconf (developer): --> 10 "sane-utils/saned_scanner_group" doesn't exist
debconf (developer): <-- GO 
debconf (developer): --> 0 ok
debconf (developer): starting /var/lib/dpkg/info/sane-utils.postinst configure 
debconf (developer): <-- GET sane-utils/saned_run
debconf (developer): --> 0 false
debconf (developer): <-- GET sane-utils/saned_scanner_group
debconf (developer): --> 10 sane-utils/saned_scanner_group doesn't exist
dpkg: не удалось обработать параметр sane-utils (--configure):
 подпроцесс установлен сценарий post-installation возвратил код ошибки 10
dpkg: зависимости пакетов не позволяют настроить пакет smbclient:
 smbclient зависит от samba-common (= 2:3.4.8~dfsg-2), однако:
  Пакет samba-common пока не настроен.
dpkg: не удалось обработать параметр smbclient (--configure):
 проблемы зависимостей -- оставляем не настроенным
При обработке следующих пакетов произошли ошибки:
 gdm
 gdm-themes
 samba-common
 samba
 samba-common-bin
 sane-utils
 smbclient
E: Sub-process /usr/bin/dpkg returned an error code (1)

Смотрю файлики /var/cache/debconf/config.dat /var/cache/debconf/templates.dat в них все эти данные есть.

Как можно решить данную проблему?

Mrak
()

Debain + dpkg непонятная ошибка 10

Странно но отвалились несколько пакетов. Пакеты рабочие это точно, но почему такая ошибка не ясно:

$ dpkg --configure gdm
Настраивается пакет gdm (2.20.11-1) ...
dpkg: не удалось обработать параметр gdm (--configure):
 подпроцесс установлен сценарий post-installation возвратил код ошибки 10
При обработке следующих пакетов произошли ошибки:
 gdm

$ dpkg-reconfigure gdm
/usr/sbin/dpkg-reconfigure: Пакет gdm сломан или установлен не полностью

$ apt-get install -f
Настраивается пакет gdm (2.20.11-1) ...
dpkg: не удалось обработать параметр gdm (--configure):
 подпроцесс установлен сценарий post-installation возвратил код ошибки 10
...

Погулил, так и не понял почему вываливается ошибка 10! Как лечить тоже не понятно... и удалял полностью и заного ставил - бестолку :(

Есть идеи?

Mrak
()

nginx - как отключить несуществующие домены?

С наступающим вас!

На сервере есть внешний ip, установлен nginx - 0.6.32

Для данного ip прописаны несколько доменов 2 уроня, причем часть описано в nginx.conf, а часть нет.

Когда я захожу на http://www.xxx.ru (который описан в nginx) все ок.

Когда захожу на http://www.yyy.ru (который НЕ описан в nginx) я попадаю все равно на http://www.xxx.ru.

Тоесть насколько я понимаю nginx проходит по конфигам, не находит описание домена и почему-то выбирает последний домен хотя server_name четко указан для каждого домена:

Конфиг ngnix.conf:

user www-data;
worker_processes  2;

#error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
        worker_connections  1024;
}

http {
        include sites-enabled/*;
}

Пример sites-enabled/xxx.ru:
server {
        server_name xxx.ru www.xxx.ru;
        access_log  /var/log/nginx/xxx.ru_a.log;
        error_log   /var/log/nginx/xxx.ru_e.log;
        client_max_body_size 10m;
        location ~* ^.+\.(html|htm|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)$ {
                root  /var/www/xxx.ru/html;
        }
        location / {
                gzip off; #gzip makes scripts feel slower since they have to complete before getting gzipped
                fastcgi_pass 127.0.0.1:5001;
                fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }
}


Как подправить конфиг чтоб небыло такой ситуации? На неописанный домен nginx должен отдавать 404 насколько я понимаю...

Mrak
()

[skylink][безлимитный][злоба] Вопрос к пользователям

Хотел было подключиться к "безлимитному" тарифу Скайлинка.. но увидел, что он не совсем безлимитный. Оказывается есть ограничение - не более 50 мб трафика в час :(
Сразу понятно что так просто не уследишь, то сессия порвется, то посидишь несколько часов и т.д.
Кто нить написал для себя какую утилитку чтоб "не вылезти" за грани "безлимитного" интернета скайлинка?

Mrak
()

Perl + Image::Imlib2 как можно вставить картинку в картинку?

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

Можно ли как вставить меньшую в большую картинку по указанным координатам используя Image::Imlib2 ?

Mrak
()

perl FCGI::GetHandles

        my $proc_manager = new FCGI::ProcManager({ n_processes => $PROCESSES});
        my $socket = FCGI::OpenSocket($SOCKET, 100);
        my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket);
        my (undef,$out,undef) = $request->GetHandles();
        $proc_manager->pm_manage();
        while($request->Accept() >= 0){
                $proc_manager->pm_pre_dispatch();
                my $cgi = CGI::Fast->new();
                print "Content-type: text/html\r\n\r\n";
                print $out "ref " . ref($out) . "fileno " . fileno($out);
                #my_print();
                $proc_manager->pm_post_dispatch();
        }
        FCGI::CloseSocket($socket);

Вот код реализации FastCGI на перл. ref($out) == GLOB fileno($out) возвращает undef. Как получить номер дискриптора потока?

Мне просто необходимо писать в поток без перловского print

Mrak
()

Perl + FastCGI + nginx

Для запуска FastCGI с помощью nginx скриптов нарыл данный скрипт в инете, но не знаю на сколько он оптимален для большого количества соединений, поэтому добавил FCGI::ProcManager модуль в скрипт. Как считаете оптимально это, либо есть более лучшая реализация для связки «Perl + FastCGI + nginx»?

ЗЫ: код FCGI::ProcManager (который я добавил) пометил тремя !!!

#!/usr/bin/perl

use FCGI;
use FCGI::ProcManager; #!!!
use Socket;
use POSIX qw(setsid);
require 'syscall.ph';

my $PROCESSES = 100;

#&daemonize;


#this keeps the program alive or something after exec'ing perl scripts
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; 
eval q{exit}; 
if ($@) { 
	exit unless $@ =~ /^fakeexit/; 
};

&main;

sub daemonize() {
    chdir '/'                 or die "Can't chdir to /: $!";
    defined(my $pid = fork)   or die "Can't fork: $!";
    exit if $pid;
    setsid                    or die "Can't start a new session: $!";
    umask 0;
}

sub main {
	$proc_manager = new FCGI::ProcManager({ n_processes => $PROCESSES, die_timeout => 10 }); #!!!
        $socket = FCGI::OpenSocket( "/var/run/nginx/perl_cgi-dispatch.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!
        $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );
        if ($request) { request_loop()};
        FCGI::CloseSocket( $socket );
}

sub request_loop {
	$proc_manager->pm_manage();
        while( $request->Accept() >= 0 ) {
           $proc_manager->pm_pre_dispatch(); #!!!
           #processing any STDIN input from WebServer (for CGI-POST actions)
           $stdin_passthrough = '';
           $req_len = 0 + $req_params{'CONTENT_LENGTH'};
           if (($req_params{'REQUEST_METHOD'} eq 'POST') && ($req_len != 0) ){ 
                my $bytes_read = 0;
                while ($bytes_read < $req_len) {
                        my $data = '';
                        my $bytes = read(STDIN, $data, ($req_len - $bytes_read));
                        last if ($bytes == 0 || !defined($bytes));
                        $stdin_passthrough .= $data;
                        $bytes_read += $bytes;
                }
            }
            #running the cgi app
            if ( (-x ($req_params{SCRIPT_FILENAME})) &&  #can I execute this?
                 (-s ($req_params{SCRIPT_FILENAME})) &&  #Is this file empty?
                 (-r ($req_params{SCRIPT_FILENAME}))     #can I read this file?
            ){
		pipe(CHILD_RD, PARENT_WR);
		my $pid = open(KID_TO_READ, "-|");
		unless(defined($pid)) {
			print("Content-type: text/plain\r\n\r\n");
                        print "Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";                        
		}
		else {
		   if ($pid > 0) {
			close(CHILD_RD);
			print PARENT_WR $stdin_passthrough;
			close(PARENT_WR);
			while(my $s = <KID_TO_READ>) { print $s; }
			close KID_TO_READ;
			waitpid($pid, 0);
		   } else {
	                foreach ( keys %req_params){
        	           $ENV{$_} = $req_params{$_};
                	}
        	        # cd to the script's local directory
	                if ($req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/) {
                        	chdir $1;
                	}
			close(PARENT_WR);
			close(STDIN);
			#fcntl(CHILD_RD, F_DUPFD, 0);
			syscall(&SYS_dup2, fileno(CHILD_RD), 0);
			#open(STDIN, "<&CHILD_RD");
			exec($req_params{SCRIPT_FILENAME});
			die("exec failed");
		   }
		}
            } 
            else {
                print("Content-type: text/plain\r\n\r\n");
                print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";
            }
            $proc_manager->pm_post_dispatch(); #!!!
        }
}
Mrak
()

nginx + fastcgi + perl

dpkg -l |grep nginx 
ii  nginx                                0.6.34-2                    small, but very powerful and efficient web s

Пытаюсь настроить сабжевую схему и использую как пример http://wiki.codemongers.com/NginxSimpleCGI

Сделал все как описано в статье... fastcgi скрипт запускается без проблем, после измениня конфига nginx.conf на это:

http {
    root  /var/www/htdocs;
    index index.html;
    location ~ ^/cgi-bin/.*\.cgi$ {
        gzip off; #gzip makes scripts feel slower since they have to complete before getting gzipped
        fastcgi_pass  unix:/var/run/nginx/cgiwrap-dispatch.sock;
        fastcgi_index index.cgi;
        fastcgi_param SCRIPT_FILENAME /var/www/cgi-bin$fastcgi_script_name;
        fastcgi_param QUERY_STRING     $query_string;
        fastcgi_param REQUEST_METHOD   $request_method;
        fastcgi_param CONTENT_TYPE     $content_type;
        fastcgi_param CONTENT_LENGTH   $content_length;
        fastcgi_param GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param SERVER_SOFTWARE    nginx;
        fastcgi_param SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param REQUEST_URI        $request_uri;
        fastcgi_param DOCUMENT_URI       $document_uri;
        fastcgi_param DOCUMENT_ROOT      $document_root;
        fastcgi_param SERVER_PROTOCOL    $server_protocol;
        fastcgi_param REMOTE_ADDR        $remote_addr;
        fastcgi_param REMOTE_PORT        $remote_port;
        fastcgi_param SERVER_ADDR        $server_addr;
        fastcgi_param SERVER_PORT        $server_port;
        fastcgi_param SERVER_NAME        $server_name;
    }
}

при запуске nginx ругается:

Restarting nginx: 2009/02/20 18:08:05 [emerg] 29891#0: "location" directive is not allowed here in /etc/nginx/nginx.conf:15
nginx.

Кто уже настраивал подобную схему?... помогите советом

Mrak
()

Снимок окна браузера

Как в Linux сделать снимок (screenshot) окна браузера, не помещающегося на экране?

Mrak
()

Есть спецы по gtk2-perl? Прозрачность окна

Нашел в официальной документации пример на Си для gtk+ прозрачность окна. Код:

#include <gtk/gtk.h>
/* The expose event handler for the event box.
 *
 * This function simply draws a transparency onto a widget on the area
 * for which it receives expose events.  This is intended to give the
 * event box a "transparent" background.
 *
 * In order for this to work properly, the widget must have an RGBA
 * colourmap.  The widget should also be set as app-paintable since it
 * doesn't make sense for GTK+ to draw a background if we are drawing it
 * (and because GTK+ might actually replace our transparency with its
 * default background colour).
 */
static gboolean
transparent_expose (GtkWidget      *widget,
                    GdkEventExpose *event)
{
  cairo_t *cr;
  cr = gdk_cairo_create (widget->window);
  cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
  gdk_cairo_region (cr, event->region);
  cairo_fill (cr);
  cairo_destroy (cr);
  return FALSE;
}
/* The expose event handler for the window.
 *
 * This function performs the actual compositing of the event box onto
 * the already-existing background of the window at 50% normal opacity.
 *
 * In this case we do not want app-paintable to be set on the widget
 * since we want it to draw its own (red) background. Because of this,
 * however, we must ensure that we use g_signal_connect_after so that
 * this handler is called after the red has been drawn. If it was
 * called before then GTK would just blindly paint over our work.
 *
 * Note: if the child window has children, then you need a cairo 1.16
 * feature to make this work correctly.
 */
static gboolean
window_expose_event (GtkWidget      *widget,
                     GdkEventExpose *event)
{
  GdkRegion *region;
  GtkWidget *child;
  cairo_t *cr;
  /* get our child (in this case, the event box) */
  child = gtk_bin_get_child (GTK_BIN (widget));
  /* create a cairo context to draw to the window */
  cr = gdk_cairo_create (widget->window);
  /* the source data is the (composited) event box */
  gdk_cairo_set_source_pixmap (cr, child->window,
                               child->allocation.x,
                               child->allocation.y);
  /* draw no more than our expose event intersects our child */
  region = gdk_region_rectangle (&child->allocation);
  gdk_region_intersect (region, event->region);
  gdk_cairo_region (cr, region);
  cairo_clip (cr);
  /* composite, with a 50% opacity */
  cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
  cairo_paint_with_alpha (cr, 0.5);
  /* we're done */
  cairo_destroy (cr);
  return FALSE;
}
int
main (int argc, char **argv)
{
  GtkWidget *window, *event, *button;
  GdkScreen *screen;
  GdkColormap *rgba;
  GdkColor red;
  gtk_init (&argc, &argv);
  /* Make the widgets */
  button = gtk_button_new_with_label ("A Button");
  event = gtk_event_box_new ();
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  /* Put a red background on the window */
  gdk_color_parse ("red", &red);
  gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
  /* Set the colourmap for the event box.
   * Must be done before the event box is realised.
   */
  screen = gtk_widget_get_screen (event);
  rgba = gdk_screen_get_rgba_colormap (screen);
  gtk_widget_set_colormap (event, rgba);
  /* Set our event box to have a fully-transparent background
   * drawn on it. Currently there is no way to simply tell GTK+
   * that "transparency" is the background colour for a widget.
   */
  gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
  g_signal_connect (event, "expose-event",
                    G_CALLBACK (transparent_expose), NULL);
  /* Put them inside one another */
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  gtk_container_add (GTK_CONTAINER (window), event);
  gtk_container_add (GTK_CONTAINER (event), button);
  /* Realise and show everything */
  gtk_widget_show_all (window);
  /* Set the event box GdkWindow to be composited.
   * Obviously must be performed after event box is realised.
   */
  gdk_window_set_composited (event->window, TRUE);
  /* Set up the compositing handler.
   * Note that we do _after_ so that the normal (red) background is drawn
   * by gtk before our compositing occurs.
   */
  g_signal_connect_after (window, "expose-event",
                          G_CALLBACK (window_expose_event), NULL);
  gtk_main ();
  return 0;
}

Захотел написать аналог на gtk2-perl но не работает :( показывает красное окошко и абсолютно не прозрачное... видимо где то ошибся. Где? Код:

#!/usr/bin/perl -w

use strict;
use warnings;
use Glib qw(TRUE FALSE);
use Gtk2 '-init';

sub transparent_expose
{
	my ($widget, $event) = @_;
	my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window);
	$cr->set_operator("clear");
	$cr->region($event->region);
	$cr->fill;
	return FALSE;
}


sub window_expose_event
{
	my ($widget, $event) = @_;
	my $region;
	my $child;
	my $cr;
	$child = $widget->get_child();
	$cr = Gtk2::Gdk::Cairo::Context->create($widget->window);	
	$cr->set_source_pixmap( Gtk2::Gdk::Pixmap->new ($child->window,$child->allocation->width,$child->allocation->height,-1),$child->allocation->x,$child->allocation->y);
#$cr->set_source_pixmap($child->window,$child->allocation->x,$child->allocation->y);
	$region = Gtk2::Gdk::Region->rectangle($child->allocation);
	$region->intersect($event->region);
	$cr->region($region);
	$cr->clip();
	$cr->set_operator("over");
	$cr->paint_with_alpha(0.5);
	return FALSE;
}


#main
{
	my $button = Gtk2::Button->new_with_label("A Button");
	my $event = Gtk2::EventBox->new();
	my $window = Gtk2::Window->new('toplevel');
	$window->modify_bg("GTK_STATE_NORMAL",Gtk2::Gdk::Color->parse('red'));
	my $screen = $event->get_screen();
	my $rgba = $screen->get_rgba_colormap();
	$event->set_colormap($rgba);
	$event->set_app_paintable(TRUE);
	$event->signal_connect("expose-event",\&transparent_expose);
	$window->set_border_width(10);
	$window->add($event);
	$event->add($button);
	$window->show_all();
	$event->window->set_composited(TRUE);
	$window->signal_connect_after("expose-event",\&window_expose_event);
	Gtk2->main;
} 

Прошу заметить, что в данном месте кода

	$cr->set_source_pixmap( Gtk2::Gdk::Pixmap->new ($child->window,$child->allocation->width,$child->allocation->height,-1),$child->allocation->x,$child->allocation->y);
#$cr->set_source_pixmap($child->window,$child->allocation->x,$child->allocation->y);

я специально оставил два варианта, поскольку на тот, что за коменчен ругается perl, говорит что

*** unhandled exception in callback:
***   Gtk2::Gdk::Window=HASH(0x840e460) is not of type Gtk2::Gdk::Pixmap at ./test5.pl line 30.
***  ignoring at ./test5.pl line 58.

хотя странно ведь вдроде Gtk2::Gdk::Window должен автоматом преобразовываться в Gtk2::Gdk::Pixmap, а может я ошибаюсь.

В общем как подправить второй исходник чтоб работала прозрачность?

Mrak
()

gtk2 - как плавно изменить размер окна?

Захотелось сделать свой тулбар, который при необходимости увеличивается/уменьшается. Оно впринципе работает, только после выполнения функции (код ниже) управление не передается в Glib::Loop на сколько я понимаю, поскольку как только ф-ия отработает главная нить зависает :( Что не правильно в функции?

sub window_hide_view
{
	my $view = shift;	
	my $screen = Gtk2::Gdk::Screen->get_default;
	my $screen_height = $screen->get_height;
	my $screen_width = $screen->get_width;
	if($view){
		for(my $i=5;$i<=$WINDOW_WIDTH;$i+=50){
			Glib::Idle->add(
				sub {
					$widgetfixed->set_size_request($WINDOW_WIDTH,$WINDOW_HEIGHT);
					$window->move($screen_width - $WINDOW_WIDTH, $screen_height - ($WINDOW_TOP + $WINDOW_HEIGHT));
					return FALSE;
				}
			);
			while( Gtk2->events_pending() ){Gtk2->main_iteration();  }
			select(undef,undef,undef,0.2);
		}
	}
	else{
		for(my $i=$WINDOW_WIDTH;$i>=5;$i-=50){
			Glib::Idle->add(
				sub {
					$widgetfixed->set_size_request($i,$WINDOW_HEIGHT);
					$window->move($screen_width - $i, $screen_height - ($WINDOW_TOP + $WINDOW_HEIGHT));
					return FALSE;
				}
			);
			while( Gtk2->events_pending() ){Gtk2->main_iteration();  }
			select(undef,undef,undef,0.2);
		}
	}
	print "ok\n";
}
Mrak
()

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