diff options
author | Branden Robinson <branden@debian.org> | 2005-11-06 00:35:41 +0000 |
---|---|---|
committer | Branden Robinson <branden@debian.org> | 2005-11-06 00:35:41 +0000 |
commit | f72ceed5dbbe14bb38e6b07adf7759e2f4c7dbe8 (patch) | |
tree | 794a31abf6e18deb779eee70ad18fe78fa194b2e /applets.c |
Import vtwm_5.4.7.orig.tar.gz
[dgit import orig vtwm_5.4.7.orig.tar.gz]
Diffstat (limited to 'applets.c')
-rw-r--r-- | applets.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/applets.c b/applets.c new file mode 100644 index 0000000..165a25b --- /dev/null +++ b/applets.c @@ -0,0 +1,209 @@ +/* + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/********************************************************************** + * + * applets.c + * + * Applet region related routines + * + * 4/26/99 D. J. Hawkey Jr. + * + **********************************************************************/ + +#include <stdio.h> +#include <string.h> +#include "twm.h" +#include "screen.h" +#include "regions.h" +#include "gram.h" +#include "parse.h" +#include "util.h" + +extern void twmrc_error_prefix(); +extern int MatchName(); + +extern void splitRegionEntry(); +extern int roundEntryUp(); +extern RegionEntry *prevRegionEntry(); +extern void mergeRegionEntries(); +extern void downRegionEntry(); +extern RootRegion *AddRegion(); + +int appletWidth(tmp_win) +TwmWindow *tmp_win; +{ + /* submitted by Tim Wiess - 8/23/02 */ + if (Scr->NoBorders || LookInList(Scr->NoBorder, tmp_win->full_name, &tmp_win->class)) + return tmp_win->attr.width; + else + return Scr->BorderWidth * 2 + tmp_win->attr.width; +} + +int appletHeight(tmp_win) +TwmWindow *tmp_win; +{ + /* submitted by Tim Wiess - 8/23/02 */ + /* added 'tmp_win->title_height +' - djhjr - 11/11/03 */ + if (Scr->NoBorders || LookInList(Scr->NoBorder, tmp_win->full_name, &tmp_win->class)) + return tmp_win->title_height + tmp_win->attr.height; + else + return Scr->BorderWidth * 2 + tmp_win->title_height + tmp_win->attr.height; +} + +int PlaceApplet(tmp_win, def_x, def_y, final_x, final_y) +TwmWindow *tmp_win; +int def_x, def_y; +int *final_x, *final_y; +{ + RootRegion *rr; + RegionEntry *re; + int matched, w, h; + + for (rr = Scr->FirstAppletRegion; rr; rr = rr->next) + { + matched = 0; + w = roundEntryUp (appletWidth (tmp_win), rr->stepx); + h = roundEntryUp (appletHeight (tmp_win), rr->stepy); + + for (re = rr->entries; re; re = re->next) + { + if (!matched) + { + /* these were 'match()' - djhjr - 10/20/01 */ + if (MatchName(tmp_win->full_name, re->u.name, &re->re, re->type)) + if (MatchName(tmp_win->class.res_name, re->u.name, &re->re, re->type)) + if (MatchName(tmp_win->class.res_class, re->u.name, &re->re, re->type)) + continue; + + matched = 1; + } + + if (re->usedby) continue; +/* don't include grid spacing - djhjr - 5/22/99 + if (re->w < w || re->h < h) continue; +*/ + if (re->w < appletWidth(tmp_win) || re->h < appletHeight(tmp_win)) + continue; + + splitRegionEntry (re, rr->grav1, rr->grav2, w, h); + re->usedby = USEDBY_TWIN; + re->u.twm_win = tmp_win; + +/* evenly spaced applet placement - djhjr - 4/24/99 + *final_x = re->x + (re->w - appletWidth (tmp_win)) / 2; + *final_y = re->y + (re->h - appletHeight (tmp_win)) / 2; +*/ + *final_x = re->x; + *final_y = re->y; + + /* adjust for region gravity - djhjr 4/26/99 */ + if (rr->grav2 == D_EAST) + *final_x += re->w - appletWidth(tmp_win); + if (rr->grav1 == D_SOUTH) + *final_y += re->h - appletHeight(tmp_win); + + return 1; + } + } + + *final_x = def_x; + *final_y = def_y; + + return 0; +} + +static RegionEntry * +FindAppletEntry (tmp_win, rrp) + TwmWindow *tmp_win; + RootRegion **rrp; +{ + RootRegion *rr; + RegionEntry *re; + + for (rr = Scr->FirstAppletRegion; rr; rr = rr->next) { + for (re = rr->entries; re; re=re->next) + if (re->u.twm_win == tmp_win) { + if (rrp) + *rrp = rr; + return re; + } + } + return 0; +} + +void +AppletDown (tmp_win) + TwmWindow *tmp_win; +{ + RegionEntry *re; + RootRegion *rr; + + re = FindAppletEntry (tmp_win, &rr); + if (re) + downRegionEntry(rr, re); +} + +RootRegion * +AddAppletRegion(geom, grav1, grav2, stepx, stepy) +char *geom; +int grav1, grav2, stepx, stepy; +{ + RootRegion *rr; + + rr = AddRegion(geom, grav1, grav2, stepx, stepy); + + if (Scr->LastAppletRegion) + Scr->LastAppletRegion->next = rr; + Scr->LastAppletRegion = rr; + if (!Scr->FirstAppletRegion) + Scr->FirstAppletRegion = rr; + + return rr; +} + +void +AddToAppletList(list_head, name, type) +RootRegion *list_head; +char *name; +short type; +{ + RegionEntry *nptr; + + if (!list_head) return; /* ignore empty inserts */ + + nptr = (RegionEntry *)malloc(sizeof(RegionEntry)); + if (nptr == NULL) + { + twmrc_error_prefix(); + fprintf (stderr, "unable to allocate %d bytes for RegionEntry\n", + sizeof(RegionEntry)); + Done(); + } + + nptr->next = list_head->entries; + /* djhjr - 10/20/01 */ + nptr->type = type; + nptr->usedby = USEDBY_NAME; + nptr->u.name = (char*)strdup(name); + list_head->entries = nptr; +} + |