210 lines
4.9 KiB
C
210 lines
4.9 KiB
C
/*
|
|
Fvwmbuttons v2.0.41-plural-Z-alpha, copyright 1996, Jarl Totland
|
|
|
|
* This module, and the entire GoodStuff program, and the concept for
|
|
* interfacing this module to the Window Manager, are all original work
|
|
* by Robert Nation
|
|
*
|
|
* Copyright 1993, Robert Nation. No guarantees or warantees or anything
|
|
* are provided or implied in any way whatsoever. Use this program at your
|
|
* own risk. Permission to use this program for any purpose is given,
|
|
* as long as the copyright is kept intact.
|
|
|
|
*/
|
|
/***********************************************************************
|
|
*
|
|
* Derived from fvwm icon code
|
|
*
|
|
***********************************************************************/
|
|
|
|
#include "config.h"
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <signal.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <X11/Xlib.h>
|
|
#include <X11/Xutil.h>
|
|
#include <X11/Xproto.h>
|
|
#include <X11/Xatom.h>
|
|
#include <X11/Intrinsic.h>
|
|
|
|
#ifdef HAVE_FCNTL_H
|
|
#include <fcntl.h>
|
|
#endif
|
|
|
|
#include "../../libs/fvwmlib.h"
|
|
#include "FvwmButtons.h"
|
|
|
|
#ifdef XPM
|
|
#include <X11/xpm.h>
|
|
#endif /* XPM */
|
|
|
|
#ifdef SHAPE
|
|
#include <X11/extensions/shape.h>
|
|
#endif /* SHAPE */
|
|
|
|
/****************************************************************************
|
|
*
|
|
* Creates an Icon Window
|
|
*
|
|
****************************************************************************/
|
|
void CreateIconWindow(button_info *b)
|
|
{
|
|
#ifndef NO_ICONS
|
|
unsigned long valuemask; /* mask for create windows */
|
|
XSetWindowAttributes attributes; /* attributes for create windows */
|
|
|
|
if(!(b->flags&b_Icon))
|
|
return;
|
|
|
|
if(b->IconWin != None)
|
|
{
|
|
fprintf(stderr,"%s: BUG: Iconwindow already created for 0x%lx!\n",
|
|
MyName,(unsigned long)b);
|
|
exit(2);
|
|
}
|
|
|
|
attributes.background_pixel = buttonBack(b);
|
|
attributes.event_mask = ExposureMask;
|
|
valuemask = CWEventMask | CWBackPixel;
|
|
|
|
if(b->icon->width<1 || b->icon->height<1)
|
|
{
|
|
fprintf(stderr,"%s: BUG: Illegal iconwindow tried created\n",MyName);
|
|
exit(2);
|
|
}
|
|
b->IconWin=XCreateWindow(Dpy,MyWindow,0,0,b->icon->width,b->icon->height,
|
|
0, CopyFromParent, CopyFromParent,CopyFromParent,
|
|
valuemask,&attributes);
|
|
|
|
#ifdef XPM
|
|
#ifdef SHAPE
|
|
if (b->icon->mask!=None)
|
|
XShapeCombineMask(Dpy,b->IconWin,ShapeBounding,0,0,
|
|
b->icon->mask,ShapeSet);
|
|
#endif
|
|
#endif
|
|
|
|
if(b->icon->depth==0)
|
|
{
|
|
XGCValues gcv;
|
|
unsigned long gcm=0;
|
|
Pixmap temp;
|
|
|
|
gcm = GCForeground | GCBackground;
|
|
gcv.background=buttonBack(b);
|
|
gcv.foreground=buttonFore(b);
|
|
XChangeGC(Dpy,NormalGC,gcm,&gcv);
|
|
|
|
#ifdef SHAPE
|
|
XShapeCombineMask(Dpy,b->IconWin,ShapeBounding,0,0,
|
|
b->icon->picture,ShapeSet);
|
|
#endif
|
|
|
|
temp = XCreatePixmap(Dpy,Root,b->icon->width,
|
|
b->icon->height,d_depth);
|
|
XCopyPlane(Dpy,b->icon->picture,temp,NormalGC,
|
|
0,0,b->icon->width,b->icon->height,0,0,1);
|
|
|
|
XSetWindowBackgroundPixmap(Dpy,b->IconWin,temp);
|
|
XFreePixmap(Dpy,temp);
|
|
/* We won't use the icon pixmap anymore... but we still need it for
|
|
width/height etc. so we can't destroy it. */
|
|
}
|
|
else
|
|
XSetWindowBackgroundPixmap(Dpy,b->IconWin,b->icon->picture);
|
|
|
|
return;
|
|
#endif
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
*
|
|
* Combines icon shape masks after a resize
|
|
*
|
|
****************************************************************************/
|
|
void ConfigureIconWindow(button_info *b)
|
|
{
|
|
#ifndef NO_ICONS
|
|
int x,y,w,h;
|
|
int xoff,yoff;
|
|
int framew,xpad,ypad;
|
|
XFontStruct *font;
|
|
int BW,BH;
|
|
|
|
if(!b || !(b->flags&b_Icon))
|
|
return;
|
|
|
|
if(!b->IconWin)
|
|
{
|
|
fprintf(stderr,"%s: DEBUG: Tried to configure erroneous iconwindow\n",
|
|
MyName);
|
|
exit(2);
|
|
}
|
|
|
|
buttonInfo(b,&x,&y,&xpad,&ypad,&framew);
|
|
framew=abs(framew);
|
|
|
|
font = buttonFont(b);
|
|
w = b->icon->width;
|
|
h = b->icon->height;
|
|
BW = buttonWidth(b);
|
|
BH = buttonHeight(b);
|
|
|
|
w=min(w,BW-2*(xpad+framew));
|
|
|
|
if(b->flags&b_Title && font && !(buttonJustify(b)&b_Horizontal))
|
|
h=min(h,BH-2*(ypad+framew)-font->ascent-font->descent);
|
|
else
|
|
h=min(h,BH-2*(ypad+framew));
|
|
|
|
if(w < 1 || h < 1)
|
|
{
|
|
XMoveResizeWindow(Dpy, b->IconWin, 2000,2000,1,1);
|
|
return; /* No need drawing to this */
|
|
}
|
|
|
|
if(buttonJustify(b)&b_Horizontal)
|
|
xoff=0;
|
|
else
|
|
xoff=(BW-w)>>1;
|
|
|
|
if(b->flags&b_Title && font && !(buttonJustify(b)&b_Horizontal))
|
|
yoff=(BH-(h+font->ascent+font->descent))>>1;
|
|
else
|
|
yoff=(BH-h)>>1;
|
|
|
|
if(xoff < framew+xpad)
|
|
xoff = framew+xpad;
|
|
if(yoff < framew+ypad)
|
|
yoff = framew+ypad;
|
|
|
|
x += xoff;
|
|
y += yoff;
|
|
|
|
XMoveResizeWindow(Dpy, b->IconWin, x,y,w,h);
|
|
|
|
/* Doesn't this belong above?
|
|
#ifdef XPM
|
|
#ifdef SHAPE
|
|
if (b->icon->mask!=None)
|
|
{
|
|
XShapeCombineMask(Dpy,b->IconWin,ShapeBounding,0,0,
|
|
b->icon->mask,ShapeSet);
|
|
}
|
|
#endif
|
|
#endif
|
|
if(b->icon->depth==0)
|
|
{
|
|
PixmapFromBitmap(b);
|
|
}
|
|
XSetWindowBackgroundPixmap(Dpy,b->IconWin,b->icon->picture);
|
|
*/
|
|
|
|
#endif
|
|
}
|