/* -*-c-*- */
/*
* Fvwmbuttons, 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.
*
*/
/* 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 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
*
* Derived from fvwm icon code
*
*/
#include "config.h"
#include <stdio.h>
#include <unistd.h>
#include <signal.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 "libs/FShape.h"
#include "FvwmButtons.h"
#include "libs/PictureGraphics.h"
#include "libs/Colorset.h"
#include "libs/Rectangles.h"
/*
*
* Combines icon shape masks after a resize
*
*/
Bool GetIconPosition(button_info *b,
FvwmPicture *pic, int *r_x, int *r_y, int *r_w, int *r_h)
{
#ifdef NO_ICONS
return False;
#else
int x, y, width, height;
int xoff, yoff;
int framew, xpad, ypad;
FlocaleFont *Ffont;
int BW,BH;
Bool has_title = (buttonTitle(b) != NULL ? True : False);
buttonInfo(b, &x, &y, &xpad, &ypad, &framew);
framew = abs(framew);
Ffont = buttonFont(b);
width = pic->width;
height = pic->height;
BW = buttonWidth(b);
BH = buttonHeight(b);
width = min(width, BW - 2 * (xpad + framew));
if (has_title == True && Ffont && !(buttonJustify(b) & b_Horizontal))
{
height = min(height, BH - 2 * (ypad + framew)
- Ffont->ascent - Ffont->descent);
}
else
{
height = min(height,BH-2*(ypad+framew));
}
if (b->flags.b_Right)
{
xoff = BW-framew - xpad-width;
}
else if (b->flags.b_Left)
{
xoff = framew + xpad;
}
else
{
if (buttonJustify(b) & b_Horizontal)
{
xoff = 0;
}
else
{
xoff = (BW - width) >> 1;
}
if (xoff < framew + xpad)
{
xoff = framew + xpad;
}
}
if (has_title == True && Ffont && !(buttonJustify(b) & b_Horizontal))
{
yoff = (BH - (height + Ffont->height)) >> 1;
}
else
{
yoff = (BH - height) >> 1;
}
if (yoff < framew + ypad)
{
yoff = framew + ypad;
}
x += xoff;
y += yoff;
*r_x = x;
*r_y = y;
*r_w = width;
*r_h = height;
return True;
#endif
}
void DrawForegroundIcon(button_info *b, XEvent *pev)
{
#ifndef NO_ICONS
int x, y, w, h;
int cset;
XRectangle clip;
FvwmRenderAttributes fra;
FvwmPicture *pic = buttonIcon(b);
if (!GetIconPosition(b, pic, &x, &y, &w, &h))
{
return;
}
if (w < 1 || h < 1)
{
return; /* No need drawing to this */
}
clip.x = x;
clip.y = y;
clip.width = w;
clip.height = h;
if (pev)
{
if (!frect_get_intersection(
x, y, w, h,
pev->xexpose.x, pev->xexpose.y,
pev->xexpose.width, pev->xexpose.height,
&clip))
{
return;
}
}
if (0 && !pev)
{
XClearArea(
Dpy, MyWindow, clip.x, clip.y, clip.width, clip.height,
False);
}
cset = buttonColorset(b);
fra.mask = FRAM_DEST_IS_A_WINDOW;
if (cset >= 0)
{
fra.mask |= FRAM_HAVE_ICON_CSET;
fra.colorset = &Colorset[cset];
}
PGraphicsRenderPicture(
Dpy, MyWindow, pic, &fra, MyWindow,
NormalGC, None, None,
clip.x - x, clip.y - y, clip.width, clip.height,
clip.x, clip.y, clip.width, clip.height, False);
#endif
}
syntax highlighted by Code2HTML, v. 0.9.1