/**************************************************************************** * 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 #include #include #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 }