Kirjoittaja Aihe: Ohjelmien ikonien asettaminen (tai vaihtaminen) [RATKAISTU]  (Luettu 4500 kertaa)

aapo

  • Käyttäjä
  • Viestejä: 195
    • Profiili
Eli en puhu työpöydälle tai valikkoihin laitettavista kuvakkeista, vaan ohjelman kuvakkeesta joka näkyy taskbarissa (kicker, fspanel, pypanel, jne) sekä ATL-TAB-listassa.
Kuinka tähän ikoniin vaikutetaan?

Muutamia käyttökohteita, jotka heti ottaisin käyttöön:
1)
Kun teen oman ohjelman, kuinka saan siihen oman hienon ikonin, eikä järjestelmän omaa default-ikonia (KDE:ssä X-kirjain, openboxissa sinivalkoinen tyhjä ikkuna, jne)?

2)
Firefox3 ei kaikilta osin tyydytä, joten ajan firefox-kakkosena icecattia, ja siitä puuttuu ikoni kokonaan.

3)
vanhassa kunnon xtermissä ei ole kuvaketta ollenkaan


Jos vaikka alkuun helppo kysymys: Ladataanko ikoni ajon aikana muualta, vai onko se käännetty binaariin sisään?

Todetaan vielä, että olen lukuisien taskbar-ohjelmien lähdekoodien kanssa leikkinyt, ja KWM_WIN_ICON jutut on tuttuja. Eli osaan tehdä ohjelman, joka näyttää kaikkien käynnissä olevien ohjelmien ikonit, mutta en silti tiedä mistä ne tulee.
« Viimeksi muokattu: 13.06.08 - klo:11.54 kirjoittanut aapo »

pjotr

  • Käyttäjä
  • Viestejä: 625
    • Profiili
Vs: Ohjelmien ikonien asettaminen (tai vaihtaminen)
« Vastaus #1 : 11.05.08 - klo:19.44 »
Uusiksi:

pypanelissa editoimalla tiedostoa ~/.pypanelrc

Koodia: [Valitse]
#------------------------------------------------------------------------------
# Application Icon List: List of custom icons for specific applications
# The application name is its WM_CLASS name, use 'xprop' to find WM_CLASS
#
# The "default" entry is used for applications with no icon.  If left "",
# PyPanel will use the default icon distributed with the source.
#
# Add entries using the following format -
#     "<application name>" : "<full path to icon>",
#------------------------------------------------------------------------------
ICON_LIST       = {
                   "default" : "",
                   "example" : "/usr/share/imlib2/data/images/audio.png",
                  }
                 
www.tehotuotanto.net

The surest sign that intelligent life exists elsewhere in the Universe is that none of it has tried to contact us.

aapo

  • Käyttäjä
  • Viestejä: 195
    • Profiili
Vs: Ohjelmien ikonien asettaminen (tai vaihtaminen)
« Vastaus #2 : 12.06.08 - klo:11.05 »
Valitettavasti vastaus ei ollut se mitä toivoin. Tarvitsisin jotain yleispätevämpää. Nyt asia nousi uudelleen esiin, joten toistan kysymyksen yksinkertaisemmassa muodossa:
Otetaan aluksi esimerkki java-puolelta. Teen graafisen java-ohjelman, vaikkapa swingillä. Kun ohjelman käynnistää, niin alapalkkiin (jossakin järjestelmissä yläpalkkiin (taskbaariin kuitenkin)) ilmestyy sen ohjelman pikkukuvake. Javassa defaulttina kahvikuppi tai sitten se javan maskotti, vähän versiosta ja käyttöjärjestelmästä riippuen. Samoin kun käynnissä olevia ohjelmia selaa ALT-TAB (näin ainakin kaikissa näkemissäni graafisissa käyttöjärjestelmissä), niin listassa näkyy tuo sama kuvake.

Kun minulla on JFrame oma_ikkuna, niin sille voi asettaa kuvakkeen:
Koodia: [Valitse]
oma_ikkuna.setIconImage( (new ImageIcon("kuvake.gif")).getImage() );

Nyt kuvake vaihtuu kuvake.giffiksi. (sekä palkki, että alt-tab). Omalla silmällä juuri kokeilin, että tämä toimii ainakin KDE:llä ja windowsilla, ja nettiä selatessani sain vaikutelman, että toimii myös macillä ja millä tahansa linux-ikkunoinnilla.

 

No tällä kertaa en ole tekemässä javalla ohjelmaa, vaan c:llä. (Ikkunoita popsauttelen auki Xlibillä.) Nyt kun ohjelman käynnistää, sen kuvake on geneerinen X-kirjain. Kuinka vaihdan tilalle oman kuvakkeen?
(Näin windows puolelle ohjeen, jossa ico-tiedosto muutetaan objekti-tiedostoksi ja linkitetään käännösaikana mukaan, mutta se oli tosiaan vain windows ohje)
« Viimeksi muokattu: 13.06.08 - klo:10.32 kirjoittanut aapo »

aapo

  • Käyttäjä
  • Viestejä: 195
    • Profiili
Vs: Ohjelmien ikonien asettaminen (tai vaihtaminen)
« Vastaus #3 : 13.06.08 - klo:11.51 »
Nyt antoi tämäkin haaste periksi.  Ohjeet olivat yllättävän vaikeaselkoisia kun ne halutaan pitää lyhyinä. Pistän tähän kokonaisen kääntyvän ohjelman.
Käännnä
Koodia: [Valitse]
gcc simple.c -lX11 -lXpm
riippuvuudet: libxpm-dev libx11-dev

Tuossa koodin alussa siis tehdaan tuollainen kuvake. Esim gimpillä kun piirtää (vaikka tuon 50*50 kokoisen) kuvan ja tallentaa sen xpm-muotoon, se on tekstieditorilla luettavissa ja sisältää tuollaista. Sen voisi suoraan includata, mutta halusin, että tässä on nyt vain yksi tiedosto.
"50 50 2 1",  = x,y,värien_määrä (vai väreissä käytettyjen bittien määrä), ?
Sitten kerrotaan mikä merkki esittää mitäkin väriä. None on läpinäkyvä.

Koodia: [Valitse]
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>

#include <string.h>
#include <stdio.h>

/* perusrunko: http://www.flug.fi/ohjeita/x-ohjelmointi.html */

/* XPM */
static char * icon_xpm[] = {
"50 50 2 1",
"  c None",
". c green",
"                                                  ",
"                                                  ",
"                                                  ",
"     ....                  .........              ",
"     ............          ..............         ",
"     ...............       .................      ",
"     ...............       .................      ",
"     ...............       ....  ...........      ",
"     ....       ....       ....    .........      ",
"     ....       ....       ....         ....      ",
"     ....       ....       ....         ....      ",
"     ....       ....       ....         ....      ",
"     ....       ....       ....         ....      ",
"     ....       ....       .................      ",
"     .......... ....       .................      ",
"     ...............       .................      ",
"     ...............       .................      ",
"     ...............       ......       ....      ",
"     ....   ........       ....        .....      ",
"     ....       ....       ....        .....      ",
"     ....       ....       ....        .....      ",
"     ....       ....       ....        ....       ",
"     ....       ....       ....        ....       ",
"     ....       ....       ....        ....       ",
"                ....       ....                   ",
"                                                  ",
"                                                  ",
"                                   ........       ",
"      ..........                   ..........     ",
"     ................           .............     ",
"     ................           .............     ",
"     ................           ....    .....     ",
"     ....    ........          .....     ....     ",
"     ....        ....          .....     ....     ",
"     ....        ....          .....     ....     ",
"     ....        ....          ....      ....     ",
"    .....        ....          ....      .....    ",
"    .....        ....          ....      .....    ",
"    .................          ....      .....    ",
"    .................          ....       ....    ",
"    .................          ....       ....    ",
"    .................         .....       ....    ",
"    ....                      .....       ....    ",
"    ....                      ................    ",
"    ....                      ................    ",
"    ....                      ................    ",
"    ....                      ................    ",
"    ....                                          ",
"    ....                                          ",
"                                                  "};

Display *display;
int screen_num;

int main(int argc, char **argv){
  Window win;
  int width=200, height=200,x=0,y=0;

  char *window_name="Viiva!";
  XTextProperty windowName;
 
  XEvent report;
  char *display_name = NULL;
  Screen *screen_ptr;

  GC gc;
  XGCValues values;
  unsigned long valuemask =0;


  if ((display=XOpenDisplay(display_name))==NULL)
    {
      fprintf(stderr,"can't connect to server");
      exit(-1);
   }

  screen_num= DefaultScreen(display);
  screen_ptr= DefaultScreenOfDisplay(display);

  win=XCreateSimpleWindow(display,RootWindow(display,screen_num)\
           ,x,y,width,height,0,\
           BlackPixel(display,screen_num),\
           WhitePixel(display,screen_num));

/* Tällä kerrotaan ikkunamanagerille tärkeitä ominaisuuksia.
 * Asetetaan otsikkoon tulostettava teksti oikeaan rakenteeseen.
 */
  XStringListToTextProperty(&window_name,1,&windowName);
  XSetWMProperties(display,win,&windowName,NULL,argv,argc\
      ,NULL,NULL,NULL);

/* Valitaan ohjelmalle tapahtumapeite, eli mihin tapahtumiin
 * se reagoi.
 */
  XSelectInput(display,win,ButtonPressMask|\
  ExposureMask|PointerMotionMask);
   
/*
 * Alustetaan grafiikan viitekehys
 */
    gc=XCreateGC(display,win,valuemask,&values);     


/*
!!!!!!!!!!!!!!!Laitetaan ikoni!!!!!!!!!!!
http://newsgroups.derkeiler.com/Archive/Comp/comp.windows.x/2007-03/msg00015.html
*/
Pixmap image, shape;
XWMHints win_hints;
XpmCreatePixmapFromData(display, win,icon_xpm, &image, &shape, NULL);

//win_hints = XAllocWMHints(); /*jostakin syystä alloc ja free eivät mene läpi?*/
   win_hints.initial_state    = NormalState;
win_hints.flags = IconPixmapHint|IconMaskHint;
win_hints.icon_pixmap = image;
win_hints.icon_mask = shape;
XSetWMHints(display, win, &win_hints);
//XFree(win_hints);
//////////////////////////////////////////////////////////////


    XMapWindow(display,win);

/*main-looppi*/
  while(1)
    {
    XNextEvent(display,&report);
    switch (report.type)
      {
      case Expose:
        /* Piirtää viivan. kolmas argumentti on
         * tyypiltään Drawable, eli grafiikka-
         * viitekehys. */
   XDrawLine(display,win,gc,0,0,200,200);
   break;
      case MotionNotify:
     /* seuraa hiiren paikkaa */
   XDrawString(display, win, gc,
               report.xmotion.x,report.xmotion.y
          , window_name, strlen(window_name));
   break;
      case ButtonPress:
   exit(1);
      default:
   break;
      }
    }

  return 0;
}