Advertisement
Guest User

Untitled

a guest
Nov 21st, 2016
1,002
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.79 KB | None | 0 0
  1. #include <stdlib.h>              
  2. #include <stdio.h>              
  3. #include <string.h>              
  4. #include <X11/Xlib.h>            
  5. #include <X11/Xutil.h>          
  6. #include <X11/Xft/Xft.h>        
  7.  
  8. #define DEFAULT_BDWIDTH 1 /* border width */
  9.  
  10. char *text = "Hello Xft";
  11.  
  12. Display *dpy;
  13.  
  14. int main( int argc, char *argv[] )
  15. {                                
  16.    int                     ytext, wtext, htext, gravity, geo_mask;
  17.    int                     htext2, wtext2;                        
  18.    int                     Done = 0, highlight = 0, force_expose = 0;
  19.    XSizeHints              xsh;                                      
  20.    XWMHints                xwmh;                                    
  21.    unsigned long           fgpix, bgpix;                            
  22.    Window                  mainW;                                    
  23.    XSetWindowAttributes    xswa;                                    
  24.    XftFont                 *font, *font2;                            
  25.    XftDraw                 *xftdraw, *xftdraw_bg;                    
  26.    XRenderColor            xrcolor;                                  
  27.    XftColor                xftcolor, hlcolor, xftcolor_bg, xftcolor_bg2;
  28.    XGlyphInfo              extents, extents2;                          
  29.    XEvent                  event;                                      
  30.    char                    user_geo[80];                                
  31.                                                                        
  32.    /* open connection to X display */                                  
  33.    dpy = XOpenDisplay( NULL );                                          
  34.                                                                        
  35.    /* set up font */                                                    
  36.    font = XftFontOpenName( dpy, DefaultScreen( dpy ), "morpheus-18" );  
  37.    font2 = XftFontOpenName( dpy, DefaultScreen( dpy ), "morpheus-24" );
  38.                                                                        
  39.    /* colors */                                                        
  40.    fgpix = BlackPixel( dpy, DefaultScreen( dpy ) );                    
  41.    bgpix = WhitePixel( dpy, DefaultScreen( dpy ) );                    
  42.                                                                        
  43.    /* position and size of top window (XSizeHints) */                  
  44.    XftTextExtentsUtf8( dpy, font, (XftChar8 *)text, strlen(text), &extents );
  45.    ytext = extents.height - extents.y;                                      
  46.    wtext = extents.width - extents.x;                                        
  47.  
  48.    XftTextExtentsUtf8( dpy, font2, (XftChar8 *)text, strlen(text), &extents2 );
  49.    htext2 = extents2.height;                                                  
  50.    wtext2 = extents2.width;                                                    
  51.  
  52.    htext = ytext + 4;  
  53.    xsh.flags = ( PPosition | PSize | PMinSize );
  54.    xsh.height = htext + 10;                    
  55.    xsh.min_height = xsh.height;                
  56.    xsh.width = wtext;                          
  57.    xsh.min_width = xsh.width;                  
  58.    xsh.x = 50;                                  
  59.    xsh.y = 50;                                  
  60.                                                
  61.    /* construct a geometry string */            
  62.    sprintf( user_geo, "%dx%d+%d+%d", xsh.width, xsh.height, xsh.x, xsh.y );
  63.                                                                            
  64.    /* process geometry specification */                                    
  65.    geo_mask = XWMGeometry( dpy, DefaultScreen(dpy), user_geo, NULL/*def_geo*/,
  66.                   DEFAULT_BDWIDTH, &xsh, &xsh.x, &xsh.y, &xsh.width, &xsh.height,
  67.                   &gravity );                                                    
  68.                                                                                  
  69.    /* check geometry bitmask and set size hints */                              
  70.    if ( geo_mask & (XValue|YValue) ) xsh.flags |= USPosition;                    
  71.    if ( geo_mask & (WidthValue|HeightValue) ) xsh.flags |= USSize;              
  72.                                                                                  
  73.    /* create top level window */                                                
  74.    mainW = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), xsh.x, xsh.y,        
  75.                xsh.width, xsh.height, DEFAULT_BDWIDTH, fgpix, bgpix );          
  76.                                                                                  
  77.    /* set window manager properties */                                          
  78.    XSetStandardProperties( dpy, mainW, "xhello", "xhello", None, argv, argc, &xsh );
  79.                                                                                    
  80.    /* set window manager hints */                                                  
  81.    xwmh.flags = (InputHint|StateHint);                                              
  82.    xwmh.input = False;                                                              
  83.    xwmh.initial_state = NormalState;                                                
  84.    XSetWMHints( dpy, mainW, &xwmh );                                                
  85.  
  86.    /* Xft draw context */
  87.    xftdraw = XftDrawCreate( dpy, mainW, DefaultVisual(dpy,DefaultScreen(dpy)),
  88.                DefaultColormap( dpy, DefaultScreen(dpy) ) );                  
  89.  
  90.    Pixmap bgpm = XCreatePixmap (dpy, mainW, wtext2 + 10, htext2 + 10, DefaultDepth(dpy, DefaultScreen(dpy)));
  91.  
  92.    xftdraw_bg = XftDrawCreate( dpy, bgpm, DefaultVisual(dpy,DefaultScreen(dpy)),
  93.                DefaultColormap( dpy, DefaultScreen(dpy) ) );                    
  94.  
  95.    /* Xft text color */
  96.    xrcolor.red = 0x0;  
  97.    xrcolor.green = 0x0;
  98.    xrcolor.blue = 0x0;
  99.    xrcolor.alpha = 0xffff;
  100.    XftColorAllocValue( dpy, DefaultVisual(dpy,DefaultScreen(dpy)),
  101.                DefaultColormap( dpy, DefaultScreen(dpy) ), &xrcolor, &xftcolor );
  102.    /* Xft highlight color */                                                    
  103.    xrcolor.red = 0xafff;                                                        
  104.    xrcolor.green = 0xafff;                                                      
  105.    xrcolor.blue = 0xffff;                                                        
  106.    xrcolor.alpha = 0xffff;                                                      
  107.    XftColorAllocValue( dpy, DefaultVisual(dpy,DefaultScreen(dpy)),              
  108.                DefaultColormap( dpy, DefaultScreen(dpy) ), &xrcolor, &hlcolor );
  109.    /* Xft background color */                                                    
  110.    xrcolor.red = 0xbfff;                                                        
  111.    xrcolor.green = 0xbfff;                                                      
  112.    xrcolor.blue = 0xbfff;                                                        
  113.    xrcolor.alpha = 0xffff;                                                      
  114.    XftColorAllocValue( dpy, DefaultVisual(dpy,DefaultScreen(dpy)),              
  115.                DefaultColormap( dpy, DefaultScreen(dpy) ), &xrcolor, &xftcolor_bg );
  116.    /* Xft background color 2 */                                                    
  117.    xrcolor.red = 0x7fff;                                                            
  118.    xrcolor.green = 0x7fff;                                                          
  119.    xrcolor.blue = 0x7fff;                                                          
  120.    xrcolor.alpha = 0xffff;                                                          
  121.    XftColorAllocValue( dpy, DefaultVisual(dpy,DefaultScreen(dpy)),                  
  122.                DefaultColormap( dpy, DefaultScreen(dpy) ), &xrcolor, &xftcolor_bg2 );
  123.  
  124.    XftDrawRect (xftdraw_bg, &xftcolor_bg, 0, 0, wtext2 + 10, htext2 + 10);
  125.    XftDrawStringUtf8(xftdraw_bg, &xftcolor_bg2, font2, 5, htext2 + 5, (XftChar8 *)text, strlen(text) );
  126.  
  127.    XSetWindowBackgroundPixmap (dpy, mainW, bgpm);
  128.  
  129.    /* set window attributes */
  130.    xswa.colormap = DefaultColormap( dpy, DefaultScreen(dpy) );
  131.    xswa.bit_gravity = CenterGravity;                          
  132.    XChangeWindowAttributes( dpy, mainW, (CWColormap|CWBitGravity), &xswa );
  133.                                                                            
  134.    /* select inputs */                                                    
  135.    XSelectInput( dpy, mainW, ExposureMask|ButtonPressMask|EnterWindowMask|LeaveWindowMask );
  136.                                                                                            
  137.    /* make window visible */                                                                
  138.    XMapWindow( dpy, mainW );                                                                
  139.    printf("click on the window to exit\n");                                                
  140.                                                                                            
  141.    /* retrieve and process events */                                                        
  142.    while ( !Done ) {                                                                        
  143.       XNextEvent( dpy, &event );                                                            
  144.       if ( event.xany.window == mainW ) {                                                  
  145.          switch ( event.type ) {
  146.             case EnterNotify:
  147.             case LeaveNotify:
  148.                if ( event.type==EnterNotify) highlight = 1;
  149.                else highlight = 0;
  150.                force_expose = 1;
  151.             case Expose:
  152.                if ( event.xexpose.count == 0 || force_expose ) {
  153.                   int            x, y, itmp;
  154.                   unsigned int   w, h, utmp;
  155.                   Window         wtmp;
  156.  
  157.                   if ( XGetGeometry( dpy, mainW, &wtmp, &itmp, &itmp, &w, &h, &utmp, &utmp )==0 )
  158.                      break;
  159.                   XClearWindow( dpy, mainW );
  160.                   x = ( w - extents.width ) / 2;
  161.                   y = htext + ( h - htext + extents.height )/2;
  162.                   if (highlight) XftDrawRect( xftdraw, &hlcolor, x, y-extents.height, wtext, extents.height  );
  163.                   XftDrawStringUtf8( xftdraw, &xftcolor, font, x, y, (XftChar8 *)text, strlen(text) );
  164.                   force_expose = 0;
  165.                }
  166.                break;
  167.             case ButtonPress:
  168.                Done = 1;
  169.                printf("good-bye!\n");
  170.                break;
  171.             default:
  172.                break;
  173.          }
  174.       }
  175.    }
  176.  
  177.    /* close connection to display */
  178.    XftDrawDestroy( xftdraw );
  179.    XftColorFree( dpy, DefaultVisual(dpy,DefaultScreen(dpy)),
  180.                DefaultColormap( dpy, DefaultScreen(dpy) ), &xftcolor );
  181.    XftColorFree( dpy, DefaultVisual(dpy,DefaultScreen(dpy)),
  182.                DefaultColormap( dpy, DefaultScreen(dpy) ), &hlcolor );
  183.    XDestroyWindow( dpy, mainW );
  184.    XFreePixmap (dpy, bgpm);
  185.    XCloseDisplay( dpy );
  186.  
  187.    return(0);
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement