/****************************************************************************
* This module is all new
* by Rob Nation
* A little of it is borrowed from ctwm.
* Copyright 1993 Robert Nation. No restrictions are placed on this code,
* as long as the copyright notice is preserved
*
* later modified for BowMan
* by Bo Yang
****************************************************************************/
/***********************************************************************
*
* afterstep window-list popup code
*
***********************************************************************/
#include "../configure.h"
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include "afterstep.h"
#include "menus.h"
#include "misc.h"
#include "parse.h"
#include "screen.h"
/* I tried to include "limits.h" to get these values, but it
* didn't work for some reason */
/* Minimum and maximum values a `signed int' can hold. */
#define MY_INT_MIN (- MY_INT_MAX - 1)
#define MY_INT_MAX 2147483647
extern XContext MenuContext;
/*
* Change by PRB (pete@tecc.co.uk), 31/10/93. Prepend a hot key
* specifier to each item in the list. This means allocating the
* memory for each item (& freeing it) rather than just using the window
* title directly. */
void do_windowList(int val1, int val2)
{
#ifndef NO_WINDOWLIST
MenuRoot *mr;
MenuItem *mi,*tmp;
ASWindow *t;
char *tname=NULL;
char loc[40],*name=NULL;
int dwidth,dheight;
char tlabel[50];
int last_desk_done = MY_INT_MIN;
int next_desk;
char *t_hot; /* Menu label with hotkey added */
char scut = '0'; /* Current short cut key */
sprintf(tlabel,"CurrentDesk: %d",Scr.CurrentDesk);
mr=NewMenuRoot(tlabel);
AddToMenu(mr, tlabel, NULL,
NULL, F_TITLE,0,0,'s','s');
next_desk = 0;
while(next_desk != MY_INT_MAX)
{
/* Sort window list by desktop number */
if((val1 < 2)&&(val1 > -2))
{
next_desk = MY_INT_MAX;
for (t = Scr.ASRoot.next; t != NULL; t = t->next)
{
if((t->Desk >last_desk_done)&&(t->Desk < next_desk))
next_desk = t->Desk;
}
}
else if((val1 <4)&&(val1 > -4))
{
if(last_desk_done == MY_INT_MIN)
next_desk = Scr.CurrentDesk;
else
next_desk = MY_INT_MAX;
}
else
{
if(last_desk_done == MY_INT_MIN)
next_desk = val2;
else
next_desk = MY_INT_MAX;
}
last_desk_done = next_desk;
for (t = Scr.ASRoot.next; t != NULL; t = t->next)
{
if((t->Desk == next_desk)&&
(!(t->flags & WINDOWLISTSKIP)))
{
if (++scut == ('9' + 1)) scut = 'A'; /* Next shortcut key */
if(val1%2 != 0)
name = t->icon_name;
else
name = t->name;
t_hot = safemalloc(strlen(name) + 8);
sprintf(t_hot, "&%c%s", scut, name); /* Generate label */
AddToMenu(mr, t_hot, tname, NULL, F_RAISE_IT,
(long)t,(long)(t->w),'s','s');
}
}
}
MakeMenu(mr);
do_menu(mr);
#ifdef ENABLE_TEXTURE
/* background pixmaps should be freed, since they are realloc'ed every time
* this function is called */
if (mr->titlebg!=None)
XFreePixmap(dpy, mr->titlebg);
if (mr->itembg!=None)
XFreePixmap(dpy, mr->itembg);
#endif
XDestroyWindow(dpy,mr->w);
XDeleteContext(dpy, mr->w, MenuContext);
/* need to free the window list ? */
mi = mr->first;
while(mi != NULL)
{
tmp = mi->next;
if (mi->func != F_TITLE)
{
if (mi->item != NULL) free(mi->item);
if (mi->item2 != NULL) free(mi->item2);
}
free(mi);
mi = tmp;
}
free(mr);
#endif
}
syntax highlighted by Code2HTML, v. 0.9.1