Pencere Yöneticisi (El yapımı, çok hafif)

Başlatan unixmania, 26 Ocak 2016 - 18:08:17

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

unixmania

Kendi yazdığım pencere yönetici(window manager)  kodlarını paylaşıyorum.

Program tam işlevsel olmayıp sadece çalışma mantığını gözönüne serer.

İsteyen derleyip test edebilir, değistirip, geliştirebilir.

Pencere Yönetici: Kısayollar:
F11: fullscreen/normal
F10: xfce4-terminal
F9: mousepad
F8: epiphany
F7: thunar
Alt+Tab: Açık Pencerelerde Gezinme
ESC: çıkış


#include <linux/sched.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <xcb/xcb.h>

int main (int argc, char **argv)
{
xcb_connection_t *c;
xcb_screen_t      *scr;
uint32_t       *childs, *atoms;
uint32_t       config[4];
xcb_generic_event_t *ev;
xcb_key_press_event_t *key;
xcb_query_tree_reply_t    *tree;
xcb_get_atom_name_reply_t *name;
xcb_get_geometry_reply_t *geom;
xcb_get_input_focus_reply_t *focus;
xcb_list_properties_reply_t *props;
xcb_get_property_reply_t *prop;
xcb_get_property_cookie_t prop_c;
xcb_translate_coordinates_reply_t  *trans;
xcb_get_window_attributes_reply_t *attr;
xcb_property_notify_event_t              *notify;
uint32_t          font, cursor, temp, temp2, quit = 0;
uint16_t      width, height;

    sleep(1);
c = xcb_connect (":0", NULL);
scr = xcb_setup_roots_iterator (xcb_get_setup (c)).data;

width = scr->width_in_pixels;
height = scr->height_in_pixels;

temp = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_PROPERTY_CHANGE;
xcb_change_window_attributes (c, scr->root, XCB_CW_EVENT_MASK, &temp);

font = xcb_generate_id (c);
xcb_open_font (c, font, strlen ("cursor"), "cursor");
cursor = xcb_generate_id (c);
xcb_create_glyph_cursor (c, cursor, font, font, 68, 68 + 1, 0, 0, 0, 0xffff, 0xffff, 0);
xcb_change_window_attributes (c, scr->root, XCB_CW_CURSOR, &cursor);

xcb_grab_key(c, 0, scr->root, 0, 9,  XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 95, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 76, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 75, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 74, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 73, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 8, 23, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);

while (!quit)
{
    focus = xcb_get_input_focus_reply (c, xcb_get_input_focus (c), 0);
    ev = xcb_wait_for_event(c);

    switch (ev->response_type & ~0x80) {

    case XCB_KEY_PRESS:
key = (xcb_key_press_event_t *) ev;
//printf("keycode  : %d modifiers: %d\n", key->detail, key->state);

if (key->detail == 9) quit = 1;
if (key->detail == 76 && !syscall(56, CLONE_IO | CLONE_FS | CLONE_FILES , 0, 0, 0, 0)) execl("/usr/bin/xfce4-terminal", "xfce4-terminal", 0);
if (key->detail == 75 && !syscall(56, CLONE_IO | CLONE_FS | CLONE_FILES , 0, 0, 0, 0)) execl("/usr/bin/mousepad", "mousepad", 0);
if (key->detail == 74 && !syscall(56, CLONE_IO | CLONE_FS | CLONE_FILES , 0, 0, 0, 0)) execl("/usr/bin/epiphany", "epiphany", 0);
if (key->detail == 73 && !syscall(56, CLONE_IO | CLONE_FS | CLONE_FILES , 0, 0, 0, 0)) execl("/usr/bin/thunar", "thunar", 0);

if (key->detail == 95){
        tree  = xcb_query_tree_reply (c, xcb_query_tree (c, scr->root), NULL);
temp = xcb_query_tree_children_length(tree);
                childs = xcb_query_tree_children(tree);
    config[0] = 0;
    config[1] = 0;
    config[2] = width;
    config[3] = height;
if(temp){
    for(int i=1;i<temp+1;i++){
    attr = xcb_get_window_attributes_reply (c, xcb_get_window_attributes (c, childs[temp-i]), NULL);
                                            if(attr->map_state==2 && attr->override_redirect==0){
                free(tree);
        tree  = xcb_query_tree_reply (c, xcb_query_tree (c, childs[temp-i]), NULL);
        geom  = xcb_get_geometry_reply (c, xcb_get_geometry (c, childs[temp-i]), NULL);
        trans = xcb_translate_coordinates_reply (c, xcb_translate_coordinates (c, childs[temp-i], tree->parent, geom->x, geom->y),NULL);
           
            if(trans->dst_x != 0 || trans->dst_y != 0 || geom->width != width || geom->height != height){
                        xcb_configure_window (c, childs[temp-i], XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, config);
            }else{
        config[1] = 20;
        config[3] = height - 20;
        xcb_configure_window (c, childs[temp-i], XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y |                           XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, config);
        }
        break;
        }
        }
                }
            }

    if (key->detail == 23 && key->state == 8){
        tree  = xcb_query_tree_reply (c, xcb_query_tree (c, scr->root), NULL);
temp = xcb_query_tree_children_length(tree);
if(temp){
                    childs = xcb_query_tree_children(tree);
                    for(int i=1;i<temp+1;i++){
                tree  = xcb_query_tree_reply (c, xcb_query_tree (c, childs[temp-i]), NULL);
    attr = xcb_get_window_attributes_reply (c, xcb_get_window_attributes (c, childs[temp-i]), NULL);
                        if(attr->map_state==2 && attr->override_redirect==0){
                            temp2 = XCB_STACK_MODE_BELOW;
                xcb_configure_window (c, childs[temp-i], XCB_CONFIG_WINDOW_STACK_MODE, &temp2);
                break;
            }
        }
    }
    }
break;

    default:
      break;
        }
        free(focus);
    free(ev);
}
xcb_ungrab_key(c, 9,  scr->root, 0);
xcb_ungrab_key(c, 95, scr->root, 0);
xcb_ungrab_key(c, 23, scr->root, 8);
xcb_ungrab_key(c, 76, scr->root, 0);
xcb_ungrab_key(c, 75, scr->root, 0);
xcb_ungrab_key(c, 74, scr->root, 0);
xcb_ungrab_key(c, 73, scr->root, 0);
xcb_disconnect (c);
return 0;
}


Derlemek için :


gcc dosya.c -lxcb -o pencereyonetici



ahmet_matematikci

♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

Sh4oTT

@unixmania hocam ben derledim ama kısayol tuslarına bastıgımda program tepkı vermıyor ?

unixmania

#3
@ShaoDownLiNuP: Programı ben archlinux'ta test etmiştim  sorun yoktu. Çalıştırdığında imleci görüyonmu, hareket ettirebiliyonmu imleci?

Bu arada alttaki:

xcb_create_glyph_cursor(c, cursor, font, font, 68, 68 + 1, R, G, B, R, G, B)


RGB'ler red, green, blue oluyor. Sırasıyla imlecin ön plan ve arka planının.

Buralara 0 ile 65535 arasında bir sayı girerek zevkine göre rengarenk imleçler yapabilirsin.

Adamakıllı test etmek için diğer window-managerleri devredışı bırakıp bunu başlangıç servisi yap. Xorg-Server'den sonra çalışacak şekilde. Ben systemd ile yapmıştım.

Oradaki

//printf("keycode  : %d modifiers: %d\n", key->detail, key->state);

çift slashı kaldırırsan tuşa basınca tuşun kodunu ve modifier tuşların (ctrl, alt falan) durumunu ekrana basar.


sleep(3);
  yapabilirsin imleci göremiyorsan.

ata1

@ShaoDownLiNuP arkadaşım  manjaro kullanıcısı arch ile test edildi ise manjaro da çalışma olasılığı yüksektir.Kendim denemedim archda yada manjaroda ama manjaro da çalışması gerektiğini düşünüyorum.

Sh4oTT

@unixmania hocam imleç gözüküyor hatta rengi sarı, bunu başlangıç servisi nasıl yapabilirim?
@ata1 abinin de dedigi gibi manjaro kullanıyorum sorun olmaması gerek heraldeki?

unixmania

#6
Burdan alıntılıyom: https://wiki.archlinux.org/index.php/Systemd/User#Automatic_login_into_Xorg_without_display_manager

/etc/systemd/user/xorg.socket

[Unit]
Description=display soket :0

[Socket]
ListenStream=/tmp/.X11-unix/X0


/etc/X11/Xwrapper.config

allowed_users=anybody
needs_root_rights=yes


/etc/systemd/user/xorg.service

[Unit]
Description=Xorg server at display 0

Requires=xorg.socket
After=xorg.socket

[Service]
Type=simple
SuccessExitStatus=0 1

ExecStart=/usr/bin/Xorg :0

FİNAL:/etc/systemd/user/seninwm.service

[Unit]
Description=Benim ozel wm'em

Requires=xorg.service
After=xorg.service

[Service]
Type=simple
SuccessExitStatus=0 1

ExecStart=/usr/bin/seninwm

[Install]
WantedBy=default.target


En son servisi aktif etmek için:

systemctl --user enable seninwm.service

Herşeyi eski haline getirmek için:

systemctl --user disable seninwm.service


Yukarda oluşan programı /usr/bin/seninwm  konumuna attığını farzettim.

slim, gdm, lxdm, sddm gibi şeyleri devredışı bırak geçici olarak.


systemctl disable sddm.service

turuncu

Ekran görüntüsü alabilme şansımız var mıdır?

unixmania

@turuncu: üzgünüm. Geçen format attım ve weston kurdum. Xorg-server kurulu değil. Evde netim yok.

wm'nin  kendinin görünen bir yeri yok, panel-manel yok. Sadece o an açık olan uygulumanın penceresi gözüküyor.

Göze hitap eden bir tarafı yok. Hafif olduğunu umuyom çünkü 50 satır kod.

Yine kendi icadım, gtk3 ile yaptığım panel uygulumasının kodlarını paylaşabilirim.

panel.c


#include <gtk/gtk.h>

void quitc (GtkToolButton *launcher, gpointer  data)
{
gtk_window_close ((GtkWindow*) data);
gtk_main_quit ();
}

void thunarc (GtkToolButton *launcher, gpointer  data)
{
if(vfork() == 0){
execl("/usr/bin/thunar", 0);
}
}

void termc (GtkToolButton *launcher, gpointer  data)
{
if(vfork() == 0){
execl("/usr/bin/xfce4-terminal", 0);
}
}

int main (int argc, char **argv)
{
  GtkWidget *panel, *toolbar;
GdkGeometry geo;
GtkToolItem *quit, *thunar, *term;

gtk_init (0, 0);

geo.min_width = 1366;
  geo.min_height = 16;
    geo.max_width = 1366;
    geo.max_height = 16;
    geo.base_width = 1366;
    geo.base_height = 16;
    geo.width_inc = 1;
    geo.height_inc = 1;
  geo.min_aspect = -1;
    geo.max_aspect = -1;
    geo.win_gravity = GDK_GRAVITY_NORTH_WEST;

panel = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_type_hint ((GtkWindow*) panel, GDK_WINDOW_TYPE_HINT_DOCK);
gtk_window_set_geometry_hints ((GtkWindow*) panel, 0, &geo, GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);

toolbar = gtk_toolbar_new ();
gtk_toolbar_set_style ((GtkToolbar*) toolbar, GTK_TOOLBAR_ICONS);
gtk_toolbar_set_icon_size ((GtkToolbar*) toolbar, GTK_ICON_SIZE_SMALL_TOOLBAR);

quit = gtk_tool_button_new (gtk_image_new_from_icon_name ("application-exit", GTK_ICON_SIZE_SMALL_TOOLBAR), 0);
thunar = gtk_tool_button_new (gtk_image_new_from_icon_name ("system-file-manager", GTK_ICON_SIZE_SMALL_TOOLBAR), 0);
term = gtk_tool_button_new (gtk_image_new_from_icon_name ("utilities-terminal", GTK_ICON_SIZE_SMALL_TOOLBAR), 0);

g_signal_connect (quit, "clicked", G_CALLBACK (quitc), panel);
g_signal_connect (thunar, "clicked", G_CALLBACK (thunarc), 0);
g_signal_connect (term, "clicked", G_CALLBACK (termc), 0);

gtk_toolbar_insert ((GtkToolbar*) toolbar, quit, -1);
gtk_toolbar_insert ((GtkToolbar*) toolbar, thunar, -1);
gtk_toolbar_insert ((GtkToolbar*) toolbar, term, -1);

gtk_container_add (GTK_CONTAINER (panel), toolbar);

gtk_widget_show_all (panel);
gtk_main ();

return 0;
}


Bu kodda sadece kendi panelinizi nasıl yapacanızı gösteren bir demo. Tepeye bir panel çizer ve içine 3 tane launcher(ikon) koyar o kadar.

Derlemek için:

gcc `pkg-config --cflags --libs gtk+-3.0` -o panel panel.c

Hiçbirşey yapmadan direkt çalıştırıp test edebilirsiniz.

EDİT: ikona tıklayınca uygulumayı başlatıyor tabii ki

ahmet_matematikci

@unixmania neden window manager!! çok feodal ve kapitalist bir isim.  ;D ;D
Biraz daha bizden bir isim olamaz mı unix manager falan ;D :)
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

turuncu

@unixmania yine de çok teşekkürler, ben de kendi basit pencere yöneticimi oluşturmak istiyordum. Güzel kaynak oldu.

if

@unixmania, tebrik ederim. X içinde pencere yönetimi yapmanın zor olduğunu okumuşumdur hep. Tam teşekküllü bir pencere yöneticisi olmasa da üstesinden gelmişsiniz. Burada paylaşmanız da başkalarına kaynaklık etmesini sağlayacaktır. Yalnız tam bir kaynak olması için bir iki eklemek yapmak gerek.

İlki, yazılımın lisansını belirtmemişsiniz. Lisansını belirtmediğiniz takdirde başkaları özgür yazlımın 4 ilkesinde belirtilen özgürlüğe sahip olamaz.

İkincisi yazılımı hazırlarken hangi kaynaklardan faydalandığınızı geçmemişsiniz. Faydalandığınız kaynakları yazdığınız takdirde bu konu üzerinde çalışacak birine kolaylık sağlamış olursunuz.

Üçüncüsü ise kodlara hiç yorum katmamışsınız. Yazılımcı olmasam da kodlara yorum yazmanın kodları okuyan birinin kodların ne iş yaptığını anlamasına yardımcı olduğunu bilirim. Belki yorum yazılmayacak kadar anlaşılabilir bir kodla karşı karşıya olduğumuzdan yazmadınız. Herhangi bir dil bilmediğim için kodların ne kadar anlaşılır olup olmadığını bilemiyorum. Sadece öneri sunuyorum:)

unixmania

@ahmet_matematikci: Programın adı "Window Manager" değilki "Pencere Yöneticisi" lafzının ingilizce karşılığını belirttim sadece;)
programın adı yok. 50 satır kodu isim koyacak kadar ciddiye almamıştım.

@if: Teşekkür.Gerçekten zor bir tarafı yok.Eğer hali hazırda yoksa, Siz Yöneticiler şöyle bir  forum kuralı koyuverin sizcede uygunsa:


Paylaşılan kodlar aksi belirtilmedikçe Kamu Malı (Public Domain) lisansına haizdir.


Public Domain yerine sizce uygun birşey olabilir. Ben uzmanı değilim.

Benim paylaştığım "50 satır" Public Domain (kamu malı)  olsun.(isteyen istediğini yapabilir)

ahmet_matematikci

@unixmania benim cahilliğime ver ;D
Forumda böyle güzel çalışmaların çıkması mutlu ediyor beni.
Size göre basit olabilir ama yeni yetişen gençlere ufak hedefler koyuyor.
Bu tür çalışmalarınızı paylaşmaya devam etmenizi dilerim. ;)
♥ Kız tavlamak için kahraman olmak gerekmez. Doğru kadın zaten sizi kahraman yapar ;)

unixmania

kodun açıklamalı/yorumlu hali:


#include <linux/sched.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <xcb/xcb.h>

int main (int argc, char **argv)
{
xcb_connection_t *c;
xcb_screen_t      *scr;
uint32_t       *childs, *atoms;
uint32_t       config[4];
xcb_generic_event_t *ev;
xcb_key_press_event_t *key;
xcb_query_tree_reply_t    *tree;
xcb_get_atom_name_reply_t *name;
xcb_get_geometry_reply_t *geom;
xcb_get_input_focus_reply_t *focus;
xcb_list_properties_reply_t *props;
xcb_get_property_reply_t *prop;
xcb_get_property_cookie_t prop_c;
xcb_translate_coordinates_reply_t  *trans;
xcb_get_window_attributes_reply_t *attr;
xcb_property_notify_event_t              *notify;
uint32_t          font, cursor, temp, temp2, quit = 0;
uint16_t      width, height;

    sleep(1);
c = xcb_connect (":0", NULL);                                        // Servera bağlan.
scr = xcb_setup_roots_iterator (xcb_get_setup (c)).data;   // Varsayılan monitörü getir

width = scr->width_in_pixels;                                       // monitörün çözünürlüğü pixel (genişlik)
height = scr->height_in_pixels;                                     // monitörün çözünürlüğü pixel (yükseklik)

temp = XCB_EVENT_MASK_KEY_PRESS;                         // Program hangi olayları dinlesin? (tuşa basma olayları)
xcb_change_window_attributes (c, scr->root, XCB_CW_EVENT_MASK, &temp);  // Program hangi olayları dinlesin? (tuşa basma olayları)

font = xcb_generate_id (c);                                       // Bir id üret, font değişkenine ata.(Bellekte yer hazırla)
xcb_open_font (c, font, strlen ("cursor"), "cursor");       // "cursor" ismindeki font'u aç, "font"  isimli değikene ata.
cursor = xcb_generate_id (c);                                   // Bir id üret.(rutin)
xcb_create_glyph_cursor (c, cursor, font, font, 68, 68 + 1, 0, 0, 0, 0xffff, 0xffff, 0);  // "font" içindeki 68 numaralı imleci(klasik çapraz ok) "cursor" a ata. 
xcb_change_window_attributes (c, scr->root, XCB_CW_CURSOR, &cursor);              //  Şeçtiğim imleci yükle.

xcb_grab_key(c, 0, scr->root, 0, 9,  XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); // ESC tuşundaki olayları(kodu 9) sadece bana yolla.
xcb_grab_key(c, 0, scr->root, 0, 95, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);// F11 tuşundaki olayları(kodu 95) sadece bana yolla.
xcb_grab_key(c, 0, scr->root, 0, 76, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 75, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 74, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 0, 73, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_grab_key(c, 0, scr->root, 8, 23, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);

while (!quit) // Ana döngü: quit=0 olduğu müddetçe dön dur.(yani program çalıssın)
{
    focus = xcb_get_input_focus_reply (c, xcb_get_input_focus (c), 0); // Aktif pencereyi getir.
    ev = xcb_wait_for_event(c);                                                     // Sıradaki olayı getir

    switch (ev->response_type & ~0x80) {                                           // Olayın tipine bak

    case XCB_KEY_PRESS:                                                                 // Eğer tuşa basma olayı ise
key = (xcb_key_press_event_t *) ev;
//printf("keycode  : %d modifiers: %d\n", key->detail, key->state);

if (key->detail == 9) quit = 1;       // eğer ESC tuşu ise quit' i 1 yap.
if (key->detail == 76 && !fork()) execl("/usr/bin/xfce4-terminal", "xfce4-terminal", 0);
if (key->detail == 75 && !fork()) execl("/usr/bin/mousepad", "mousepad", 0);
if (key->detail == 74 && !fork()) execl("/usr/bin/epiphany", "epiphany", 0);
if (key->detail == 73 && !fork()) execl("/usr/bin/thunar", "thunar", 0); //kendini kopyala.Bir bağımsız kopyan "thunar" olarak yoluna devam etsin.

if (key->detail == 95){
        tree  = xcb_query_tree_reply (c, xcb_query_tree (c, scr->root), NULL); // Tüm pencereleri getir.
temp = xcb_query_tree_children_length(tree);  // Kaç pencere varmış?
                childs = xcb_query_tree_children(tree);  // Tüm pencereler
    config[0] = 0;
    config[1] = 0;
    config[2] = width;
    config[3] = height;
if(temp){                                                                     // Pencere sayısı 0'dan büyükmü?
    for(int i=1;i<temp+1;i++){                                        // her pencere icin döngü
    attr = xcb_get_window_attributes_reply (c, xcb_get_window_attributes (c, childs[temp-i]), NULL); // Pencerenin özelliklerini getir
                                            if(attr->map_state==2 && attr->override_redirect==0){ // eğer pencere görünüyorsa
                free(tree);
        tree  = xcb_query_tree_reply (c, xcb_query_tree (c, childs[temp-i]), NULL);
        geom  = xcb_get_geometry_reply (c, xcb_get_geometry (c, childs[temp-i]), NULL);
        trans = xcb_translate_coordinates_reply (c, xcb_translate_coordinates (c, childs[temp-i], tree->parent, geom->x, geom->y),NULL);
           
            if(trans->dst_x != 0 || trans->dst_y != 0 || geom->width != width || geom->height != height){ //pencere fullscrren değilse
                        xcb_configure_window (c, childs[temp-i], XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, config);  // fullscreen yap
            }else{                                                                // pencere zaten  fullscreen ise
        config[1] = 20;
        config[3] = height - 20;
        xcb_configure_window (c, childs[temp-i], XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y |                           XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, config); // normale çevir
        }
        break;
        }
        }
                }
            }

    if (key->detail == 23 && key->state == 8){                                                     // Alt+Tab basıldıysa(23 tab, 8 alt oluyor)
        tree  = xcb_query_tree_reply (c, xcb_query_tree (c, scr->root), NULL);
temp = xcb_query_tree_children_length(tree);
if(temp){
                    childs = xcb_query_tree_children(tree); //tüm pencereler
                    for(int i=1;i<temp+1;i++){                // tüm pencereler için döngü
                tree  = xcb_query_tree_reply (c, xcb_query_tree (c, childs[temp-i]), NULL);
    attr = xcb_get_window_attributes_reply (c, xcb_get_window_attributes (c, childs[temp-i]), NULL);
                        if(attr->map_state==2 && attr->override_redirect==0){
                            temp2 = XCB_STACK_MODE_BELOW;
                xcb_configure_window (c, childs[temp-i], XCB_CONFIG_WINDOW_STACK_MODE, &temp2); // en üstteki pencereyi en alta yolla.
                break;
            }
        }
    }
    }
break;

    default:
      break;
        }
        free(focus);
    free(ev);
}
xcb_ungrab_key(c, 9,  scr->root, 0);    // ESC tuşunu serbest bırak.
xcb_ungrab_key(c, 95, scr->root, 0);
xcb_ungrab_key(c, 23, scr->root, 8);
xcb_ungrab_key(c, 76, scr->root, 0);
xcb_ungrab_key(c, 75, scr->root, 0);
xcb_ungrab_key(c, 74, scr->root, 0);
xcb_ungrab_key(c, 73, scr->root, 0);
xcb_disconnect (c);
return 0;
}


Kaynaklar:
1-) http://xcb.freedesktop.org/tutorial/  (Aynısı libxcb paketinden geliyor arch'ta; ubuntuda haricen ayrı paket olabilir. libxcb' li birşeydir.)
2-) libxcb paketinden gelen "man" sayfaları. Ubuntuda haricen gelebilir. (libxcb-doc veya libxcb-devel gibi birşeydir)

Adı geçen tüm fonksiyonların man sayfası var.Yorumsuz yerleri kısa yorum kurtarmadığı için yorumsuz bıraktım.Merak eden man sayfasına baksın veya sorsun.
Koddaki kaymalar forum altyapısından dolayıdır.

heartsmagic

Not düşeyim, forum zaten CC BY-SA lisansı altında :) Aksi belirtilmedikçe buradaki içerik aynı kategoriye girecektir. Bu bana uymaz diyen kendi lisansını belirtmeli elbette.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

if

@unixmania, önerilerimi uyguladığınız için memnun oldum. Umarım yük olmamıştır size. Bu arada, ben yönetici değilim:)

linuxomer54

Xfce ile mi? ilgili yoksa tam olarak nedir? bu sırada theme olarak GTK mı? kullandınız. benim tam araştırdığım konu

ata1

[mention=621837]@linuxomer54[/mention] openbox bir pencere yöneticisidir. pencere yöneticileri bir masa üstü değildir. Adı üzerinde pencere yöneticisi

linuxomer54

[mention=621839]@ata1[/mention]
o kadarını biliyorum acaba xfce ile mi? yoksa tüm masaüstü ortamları ile ilgili mi? onu merak ettim

ata1

Pencere Yöneticisi:
X ekranı açıldığında çalıştırılan programların pencere oluşturmasını sağlar. (Adı üstünde)

Masaüstü Ortamı:
Pencere yöneticilerinin üzerine Masaüstü, Simge Seti ve Temalar, Menü yapılanması gibi yeteneklerin kazandırılmış halidir.