X11 kutuphanesi ile Transparant image olusturma

Başlatan SerkanK, 25 Mayıs 2013 - 20:17:08

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

SerkanK

X11 ile transparant resimli buton olusturmaya calısıyorum internetten birkac ornege baktım
pencere, olusturma
pencereden buton olusturma
Arkaplan resmi ekleme
gibi ornekler var ama transparant image button ile ilgili birsey bulamadım
Tam olarak yapmaya calıstıgım sey masa ustu iconu gibi bir buton olusturmak istiyorum
bu konuda yardımcı olabilecek varmı acaba ?

ekremsenturk

wterm, xterm, rxvt gibi Terminal emulatörleri ile bu tür işlemler mümkün. man belgelriniden kendin araştırmalısın.

SerkanK

Ben bunu C++ ile yapmaya calısıyorum.
terminal emulatoruile ilgili bir bilgim yok ama o konulardada bir arama yaparım .

sem

X11 kütüphanelerini kullanmadım hiç. O nedenle doğrudan bu konu ile ilgili tavsiye veremeyeceğim. Şunu sorayım geliştirmek istediğiniz proje için X11 kütüphaneleri şart mıdır yoksa GTK+ ya da QT vs gibi görsel uygulama geliştirme kütüphenelerini de barındıran çatılar (framwork) işinize yarar mı? 

Aslında bu soruyu yöneltmemin sebebi şu oldu, sorunuzdan sonra biraz Google'a baktım ve yabancı olarak da pek dökümana ulaşamadım. Bu şekilde döküman sıkıntısı olan konularda geliştirme yapmak zor oluyor da,  proje ilerleyip daha kmplike sorularınız olduğunuzda cevabını bulabilmek daha zor olabilir.

Ama Google'a   "C++ QT Transparent button" yazdığmızda en azından fikir verebilecek kadar yeterli konuya ulaşılaibliyor.Tabi X11 şart ise bu konuya ayrıca araştırmak belki forumlar yerine kendi dökümanlarını incelemek ve akademik bilgiler arasından istediğimizi çekip almak gerekebilir. 
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

SerkanK

x11 kutuphanesini kullanmak istememin nedeni kucuk capta bir masaustu yoneticisi gibi bir şey deniyorum.
x11 ile ilgili gercekten cok az sey var.
GTK  sanırım  gnome nin geliştirdigi bir kutuphane. aklımda boyle kalmıs..oyuzden kullanmak istemedim

ekremsenturk

X11(X)'i doğrudan kullanamazsınız, çünkü zaten çalışır durumda. X11'in doğrudan kullanılamayacağından dolayı, Terminal emilatörleri var. C++ ile sadece kopyala yapıştır yapmıyorsanız, Bir C++ programını nasıl xterm veya rxvt Terminalinden çalıştırabileceğinizin bir yolunu bulmayı deneyebilirsiniz.

sem

@ekremsenturk, X sunucusuna pencere vs gibi görseller çizdirme olarak anlıyorum X11 programlamayı. Neden doğrudan çalışılamıyor biraz daha açıklayabilir misiniz?

http://linuxgazette.net/issue78/tougher.html#1
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ekremsenturk

#7
X, gdm veya Ligthdm çalışırken, çalışır durumda. "X zaten çalışıyor" anlamına gelen hata bildirimleri almıştım, X ile doğrudan bir şeyler denemek istediğimde. Terminal emilatörlerini de daha güvenli bir alternatif ararken keşf etmiştim. xterm ve diğer grafik destekleyen terminaller de, X Terminal'in sanal olarak çalıştırlmasından ibaret. Başka, veya daha elverişli yöntemlerde vardır mutlaka.

lave:
@serkanK sanırım Cairodock gibi bir şey düşünüyorsunuz. Sdl kütüphaneleri hakkında araştırabilirisiniz.

SerkanK

#8
Cairodock seklinde degilde masaustu ortamı.. 
Gdm den veya Lightdm den unity , gnome, kde secerek oturum acınca , acılan ortam.. topbar, status bar. falan gibi...
(Bunu uğraş olarak yapıyorum , meraklıyım bu tip şeylere.. )
Aslında basit bir arayuz yaptım ama transparan olmayınca cok sacma oluyor oyuzden devam edemedim. kaldım orda...
Alıntı Yap
X11(X)'i doğrudan kullanamazsınız, çünkü zaten çalışır durumda. X11'in doğrudan kullanılamayacağından dolayı, Terminal emilatörleri var. C++ ile sadece kopyala yapıştır yapmıyorsanız, Bir C++ programını nasıl xterm veya rxvt Terminalinden çalıştırabileceğinizin bir yolunu bulmayı deneyebilirsiniz.
Tam olarak anlayamadım ama Ama Ben bunu C++ ile derleyip calıstırdıgımda hic bir sorun cıkarmadan calısıyor... 
ayrıca hicbir sorun cıkarmadan Login ekranından bu program ile login oluncada calısıyor.



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 27 Mayıs 2013 - 23:02:00

Bir Kod buldum x11 ve OpenGL ileTransparan Pencere olusturma ile ilgili.
Daha sonra bir ugrasan olur arayan olur diye burayada eklemek istedim


/*
      ____      _____
    /\__  \   /\  ___\
    \/__/\ \  \ \ \__/_
        \ \ \  \ \____ \
        _\_\ \  \/__/_\ \
      /\ _____\  /\ _____\
      \/______/  \/______/

   Copyright (C) 2011 Joerg Seebohn

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program demonstrates how an X11 window with OpenGL support
   can be drawn transparent.

   The title bar and window border drawn by the window manager are
   drawn opaque.
   Only the background of the window which is drawn with OpenGL
         glClearColor( 0.7, 0.7, 0.7, 0.7) ;
         glClear(GL_COLOR_BUFFER_BIT) ;
   is 30% transparent.

   Compile it with:
    gcc -std=gnu99 -o test testprogram.c -lX11 -lGL
*/
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>

#include <GL/gl.h>
#include <GL/glx.h>

#include <stdio.h>
#include <stdlib.h>



int main(int argc, char* argv[])
{
   Display    * display = XOpenDisplay( 0 ) ;
   const char * xserver = getenv( "DISPLAY" ) ;

   if (display == 0)
   {
      printf("Could not establish a connection to X-server '%s'\n", xserver ) ;
      exit(1) ;
   }

   // query Visual for "TrueColor" and 32 bits depth (RGBA)
   XVisualInfo visualinfo ;
   XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &visualinfo);

   // create window
   Window   win ;
   GC       gc ;
   XSetWindowAttributes attr ;
   attr.colormap   = XCreateColormap( display, DefaultRootWindow(display), visualinfo.visual, AllocNone) ;
   attr.event_mask = ExposureMask | KeyPressMask ;
   attr.background_pixmap = None ;
   attr.border_pixel      = 0 ;
   win = XCreateWindow(    display, DefaultRootWindow(display),
                           50, 300, 400, 100, // x,y,width,height : are possibly opverwriteen by window manager
                           0,
                           visualinfo.depth,
                           InputOutput,
                           visualinfo.visual,
                           CWColormap|CWEventMask|CWBackPixmap|CWBorderPixel,
                           &attr
                           ) ;
   gc = XCreateGC( display, win, 0, 0) ;

   // set title bar name of window
   XStoreName( display, win, "Transparent Window with OpenGL Support" ) ;

   // say window manager which position we would prefer
   XSizeHints sizehints ;
   sizehints.flags = PPosition | PSize ;
   sizehints.x     = 50 ;  sizehints.y = 300 ;
   sizehints.width = 400 ; sizehints.height = 100 ;
   XSetWMNormalHints( display, win, &sizehints ) ;
   // Switch On >> If user pressed close key let window manager only send notification >>
   Atom wm_delete_window = XInternAtom( display, "WM_DELETE_WINDOW", 0) ;
   XSetWMProtocols( display, win, &wm_delete_window, 1) ;

   {
      // change foreground color to brown
      XColor    xcol ;
      xcol.red   = 1 * 256 ;   // X11 uses 16 bit colors !
      xcol.green = 1 * 256 ;
      xcol.blue  = 255  * 256 ;
      XAllocColor( display, attr.colormap, &xcol) ;
      XGCValues gcvalues ;
      gcvalues.foreground = xcol.pixel ;
      XChangeGC( display, gc, GCForeground, &gcvalues) ;
   }

   // create OpenGL context
   GLXContext glcontext = glXCreateContext( display, &visualinfo, 0, True ) ;
   if (!glcontext)
   {
      printf("X11 server '%s' does not support OpenGL\n", xserver ) ;
      exit(1) ;
   }
   glXMakeCurrent( display, win, glcontext ) ;

   // now let the window appear to the user
   XMapWindow( display, win) ;

   int isUserWantsWindowToClose = 0 ;

   while( !isUserWantsWindowToClose )
   {
      int  isRedraw = 0 ;

      /* XPending returns number of already queued events.
       * If no events are queued XPending sends all queued requests to the X-server
       * and tries to read new incoming events. */

      while( XPending(display) > 0 )
      {
         // process event
         XEvent   event ;
         XNextEvent( display, &event) ;

         switch(event.type)
         {  // see 'man XAnyEvent' for a list of available events
         case ClientMessage:
                  // check if the client message was send by window manager to indicate user wants to close the window
                  if (  event.xclient.message_type  == XInternAtom( display, "WM_PROTOCOLS", 1)
                        && event.xclient.data.l[0]  == XInternAtom( display, "WM_DELETE_WINDOW", 1)
                        )
                  {
                     isUserWantsWindowToClose = 1 ;
                  }
         case KeyPress:
                  if (XLookupKeysym(&event.xkey, 0) == XK_Escape)
                  {
                     isUserWantsWindowToClose = 1 ;
                  }
                  break ;
         case Expose:
                  isRedraw = 1 ;
                  break ;
         default:
               // do no thing
               break ;
         }

      }

      // ... all events processed, now do other stuff ...

      if (isRedraw)
      {  // needs redraw
         // use opengl to clear background in (transparent) light grey
         glClearColor( 0.5, 0.5, 0.5, 0.1) ;
         glClear(GL_COLOR_BUFFER_BIT) ;
         glXSwapBuffers( display, win) ;
         glXWaitGL() ;
         // draw string with X11
         XDrawString( display, win, gc, 10, 20, "Hello ! ", 7) ;
      }

      // ... do something else ...

   }

   XDestroyWindow( display, win ) ;
   win = 0 ;
   XCloseDisplay( display ) ;
   display = 0 ;

   return 0 ;
}


ekremsenturk

Soruyu tam anlayamamışım. Masaüstü yöneticisi değişirken, X önce kapanıyor ve ardından yeniden ve yeni ayarlar ile açılıyor. Transparant resimli button oluşturmak istediğini yazdığın için, button'a dikkatim odaklandı. Bir Masaüstü yöneticisi için, Gtk veya Qt kütüphanelerinin kullanılmasıda münkün sanırım. Artık yeterince araştırabileceğin ve deneyebileceğin konu da buldun sanıyorum. Kolay gelsin.