mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 12:28:22 +01:00
*** empty log message ***
This commit is contained in:
@@ -207,7 +207,7 @@ WMCreateTextField(WMWidget *parent)
|
||||
WMAX((tPtr->view->size.height - WMFontHeight(tPtr->font))/2, 1);
|
||||
|
||||
WMCreateEventHandler(tPtr->view, EnterWindowMask|LeaveWindowMask
|
||||
|ButtonPressMask|KeyPressMask|Button1MotionMask,
|
||||
|ButtonReleaseMask|ButtonPressMask|KeyPressMask|Button1MotionMask,
|
||||
handleTextFieldActionEvents, tPtr);
|
||||
|
||||
tPtr->flags.cursorOn = 1;
|
||||
@@ -562,6 +562,7 @@ paintCursor(TextField *tPtr)
|
||||
XDrawRectangle(screen->display, tPtr->view->window, screen->xorGC,
|
||||
cx, tPtr->offsetWidth, 1,
|
||||
tPtr->view->size.height - 2*tPtr->offsetWidth - 1);
|
||||
printf("%d %d\n",cx,tPtr->cursorPosition);
|
||||
*/
|
||||
XDrawLine(screen->display, tPtr->view->window, screen->xorGC,
|
||||
cx, tPtr->offsetWidth, cx,
|
||||
@@ -677,9 +678,15 @@ paintTextField(TextField *tPtr)
|
||||
? tPtr->selection.position + tPtr->selection.count
|
||||
: tPtr->selection.position;
|
||||
|
||||
/*
|
||||
rx = tx + WMWidthOfString(tPtr->font,
|
||||
&(tPtr->text[tPtr->viewPosition]),
|
||||
count);
|
||||
count)
|
||||
- WMWidthOfString(tPtr->font,
|
||||
tPtr->text,tPtr->viewPosition);
|
||||
*/
|
||||
rx = tPtr->offsetWidth + 1 + WMWidthOfString(tPtr->font,tPtr->text,count)
|
||||
- WMWidthOfString(tPtr->font,tPtr->text,tPtr->viewPosition);
|
||||
|
||||
XSetBackground(screen->display, screen->textFieldGC,
|
||||
screen->gray->color.pixel);
|
||||
@@ -1060,59 +1067,117 @@ handleTextFieldActionEvents(XEvent *event, void *data)
|
||||
|
||||
switch (event->type) {
|
||||
case KeyPress:
|
||||
if (tPtr->flags.enabled && tPtr->flags.focused)
|
||||
handleTextFieldKeyPress(tPtr, event);
|
||||
break;
|
||||
if (tPtr->flags.enabled && tPtr->flags.focused)
|
||||
handleTextFieldKeyPress(tPtr, event);
|
||||
break;
|
||||
|
||||
case MotionNotify:
|
||||
if (tPtr->flags.enabled && (event->xmotion.state & Button1Mask)) {
|
||||
if (tPtr->flags.enabled && (event->xmotion.state & Button1Mask)) {
|
||||
|
||||
if (!tPtr->selection.count) {
|
||||
tPtr->selection.position = tPtr->cursorPosition;
|
||||
}
|
||||
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xmotion.x);
|
||||
if (tPtr->viewPosition < tPtr->textLen && event->xmotion.x >
|
||||
tPtr->usableWidth) {
|
||||
if (WMWidthOfString(tPtr->font,
|
||||
&(tPtr->text[tPtr->viewPosition]),
|
||||
tPtr->cursorPosition-tPtr->viewPosition)
|
||||
> tPtr->usableWidth) {
|
||||
tPtr->viewPosition++;
|
||||
}
|
||||
}
|
||||
else if (tPtr->viewPosition > 0 && event->xmotion.x < 0) {
|
||||
paintCursor(tPtr);
|
||||
tPtr->viewPosition--;
|
||||
}
|
||||
|
||||
tPtr->selection.count = tPtr->cursorPosition
|
||||
- tPtr->selection.position;
|
||||
if (!tPtr->selection.count) {
|
||||
tPtr->selection.position = tPtr->cursorPosition;
|
||||
}
|
||||
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr, event->xmotion.x);
|
||||
|
||||
tPtr->selection.count = tPtr->cursorPosition - tPtr->selection.position;
|
||||
|
||||
/*
|
||||
printf("notify %d %d\n",event->xmotion.x,tPtr->usableWidth);
|
||||
*/
|
||||
|
||||
paintCursor(tPtr);
|
||||
paintTextField(tPtr);
|
||||
|
||||
paintTextField(tPtr);
|
||||
}
|
||||
break;
|
||||
|
||||
case ButtonPress:
|
||||
if (tPtr->flags.enabled && !tPtr->flags.focused) {
|
||||
WMSetFocusToWidget(tPtr);
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x);
|
||||
paintTextField(tPtr);
|
||||
} else if (tPtr->flags.focused) {
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x);
|
||||
tPtr->selection.count = 0;
|
||||
paintTextField(tPtr);
|
||||
}
|
||||
if (event->xbutton.button == Button2 && tPtr->flags.enabled) {
|
||||
char *text;
|
||||
switch (tPtr->flags.alignment) {
|
||||
int textWidth;
|
||||
case WARight:
|
||||
textWidth = WMWidthOfString(tPtr->font, tPtr->text, tPtr->textLen);
|
||||
if (tPtr->flags.enabled && !tPtr->flags.focused) {
|
||||
WMSetFocusToWidget(tPtr);
|
||||
} else if (tPtr->flags.focused) {
|
||||
tPtr->selection.count = 0;
|
||||
}
|
||||
if(textWidth < tPtr->usableWidth){
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x - tPtr->usableWidth
|
||||
+ textWidth);
|
||||
}
|
||||
else tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x);
|
||||
/*
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x);
|
||||
tPtr->cursorPosition += tPtr->usableWidth - textWidth;
|
||||
}
|
||||
|
||||
text = W_GetTextSelection(tPtr->view->screen,
|
||||
tPtr->view->screen->clipboardAtom);
|
||||
if (!text) {
|
||||
text = W_GetTextSelection(tPtr->view->screen, XA_CUT_BUFFER0);
|
||||
}
|
||||
if (text) {
|
||||
WMInsertTextFieldText(tPtr, text, tPtr->cursorPosition);
|
||||
XFree(text);
|
||||
WMPostNotificationName(WMTextDidChangeNotification, tPtr,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x);
|
||||
*/
|
||||
paintTextField(tPtr);
|
||||
break;
|
||||
|
||||
case WALeft:
|
||||
if (tPtr->flags.enabled && !tPtr->flags.focused) {
|
||||
WMSetFocusToWidget(tPtr);
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x);
|
||||
paintTextField(tPtr);
|
||||
} else if (tPtr->flags.focused) {
|
||||
tPtr->cursorPosition = pointToCursorPosition(tPtr,
|
||||
event->xbutton.x);
|
||||
tPtr->selection.count = 0;
|
||||
paintTextField(tPtr);
|
||||
}
|
||||
if (event->xbutton.button == Button2 && tPtr->flags.enabled) {
|
||||
char *text;
|
||||
|
||||
text = W_GetTextSelection(tPtr->view->screen,
|
||||
tPtr->view->screen->clipboardAtom);
|
||||
if (!text) {
|
||||
text = W_GetTextSelection(tPtr->view->screen, XA_CUT_BUFFER0);
|
||||
}
|
||||
if (text) {
|
||||
WMInsertTextFieldText(tPtr, text, tPtr->cursorPosition);
|
||||
XFree(text);
|
||||
WMPostNotificationName(WMTextDidChangeNotification, tPtr, NULL);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ButtonRelease:
|
||||
|
||||
break;
|
||||
{
|
||||
int count;
|
||||
XSetSelectionOwner(tPtr->view->screen->display,
|
||||
XA_PRIMARY, None, CurrentTime);
|
||||
count = tPtr->selection.count < 0
|
||||
? tPtr->selection.position + tPtr->selection.count
|
||||
: tPtr->selection.position;
|
||||
XStoreBuffer(tPtr->view->screen->display,
|
||||
&tPtr->text[count] , abs(tPtr->selection.count), 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,6 +106,14 @@ wAppIconCreateForDock(WScreen *scr, char *command, char *wm_instance,
|
||||
#ifdef REDUCE_APPICONS
|
||||
dicon->num_apps = 0;
|
||||
#endif
|
||||
#ifdef DEMATERIALIZE_ICON
|
||||
{
|
||||
XSetWindowAttributes attribs;
|
||||
attribs.save_under = True;
|
||||
XChangeWindowAttributes(dpy, dicon->icon->core->window,
|
||||
CWSaveUnder, &attribs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* will be overriden by dock */
|
||||
dicon->icon->core->descriptor.handle_mousedown = appIconMouseDown;
|
||||
@@ -203,6 +211,14 @@ wAppIconCreate(WWindow *leader_win)
|
||||
#endif
|
||||
|
||||
aicon->icon = wIconCreate(leader_win);
|
||||
#ifdef DEMATERIALIZE_ICON
|
||||
{
|
||||
XSetWindowAttributes attribs;
|
||||
attribs.save_under = True;
|
||||
XChangeWindowAttributes(dpy, aicon->icon->core->window,
|
||||
CWSaveUnder, &attribs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* will be overriden if docked */
|
||||
aicon->icon->core->descriptor.handle_mousedown = appIconMouseDown;
|
||||
|
||||
453
src/usermenu.c
453
src/usermenu.c
@@ -62,9 +62,9 @@ extern proplist_t ReadProplistFromFile(char *file);
|
||||
extern WPreferences wPreferences;
|
||||
|
||||
typedef struct {
|
||||
WScreen *screen;
|
||||
WShortKey *key;
|
||||
int key_no;
|
||||
WScreen *screen;
|
||||
WShortKey *key;
|
||||
int key_no;
|
||||
} WUserMenuData;
|
||||
|
||||
|
||||
@@ -74,317 +74,276 @@ notifyClient(WMenu *menu, WMenuEntry *entry){
|
||||
WUserMenuData *data = entry->clientdata;
|
||||
WScreen *scr = data->screen;
|
||||
Window window;
|
||||
int i;
|
||||
int i;
|
||||
|
||||
window=scr->focused_window->client_win;
|
||||
|
||||
for(i=0;i<data->key_no;i++){
|
||||
event.xkey.type = KeyPress;
|
||||
event.xkey.display = dpy;
|
||||
event.xkey.window = window;
|
||||
event.xkey.subwindow = 0x0;
|
||||
event.xkey.x = 0x0;
|
||||
event.xkey.y = 0x0;
|
||||
event.xkey.x_root = 0x0;
|
||||
event.xkey.y_root = 0x0;
|
||||
event.xkey.keycode = data->key[i].keycode;
|
||||
event.xkey.state = data->key[i].modifier;
|
||||
event.xkey.same_screen = YES;
|
||||
XSendEvent(dpy, window, False, NoEventMask, &event);
|
||||
XFlush(dpy);
|
||||
/* should i release key too? */
|
||||
}
|
||||
for(i=0;i<data->key_no;i++){
|
||||
event.xkey.type = KeyPress;
|
||||
event.xkey.display = dpy;
|
||||
event.xkey.window = window;
|
||||
event.xkey.subwindow = 0x0;
|
||||
event.xkey.x = 0x0;
|
||||
event.xkey.y = 0x0;
|
||||
event.xkey.x_root = 0x0;
|
||||
event.xkey.y_root = 0x0;
|
||||
event.xkey.keycode = data->key[i].keycode;
|
||||
event.xkey.state = data->key[i].modifier;
|
||||
event.xkey.same_screen = YES;
|
||||
XSendEvent(dpy, window, False, NoEventMask, &event);
|
||||
XFlush(dpy);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
removeUserMenudata(void *menudata){
|
||||
WUserMenuData *data = menudata;
|
||||
free(data->key);
|
||||
free(data);
|
||||
WUserMenuData *data = menudata;
|
||||
if(data->key) free(data->key);
|
||||
free(data);
|
||||
}
|
||||
|
||||
static WUserMenuData*
|
||||
convertShortcut(WScreen *scr, proplist_t shortcut){
|
||||
WUserMenuData *data;
|
||||
KeySym ksym;
|
||||
char *k;
|
||||
char buf[128], *b;
|
||||
|
||||
data = malloc(sizeof(WUserMenuData));
|
||||
data->key = malloc(sizeof(WUserMenuData));
|
||||
data->key[0].modifier = 0;
|
||||
|
||||
strcpy(buf, PLGetString(shortcut));
|
||||
b = (char*)buf;
|
||||
|
||||
/* get modifiers */
|
||||
while ((k = strchr(b, '+'))!=NULL) {
|
||||
int mod;
|
||||
|
||||
*k = 0;
|
||||
mod = wXModifierFromKey(b);
|
||||
if (mod<0) {
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
data->key[0].modifier |= mod;
|
||||
|
||||
b = k+1;
|
||||
}
|
||||
|
||||
/* get key */
|
||||
ksym = XStringToKeysym(b);
|
||||
|
||||
if (ksym==NoSymbol) {
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
data->key[0].keycode = XKeysymToKeycode(dpy, ksym);
|
||||
if (data->key[0].keycode==0) {
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
data->screen = scr;
|
||||
data->key_no = 1;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static WUserMenuData*
|
||||
convertShortcuts(WScreen *scr, proplist_t shortcut){
|
||||
WUserMenuData *data;
|
||||
KeySym ksym;
|
||||
char *k;
|
||||
char *buffer;
|
||||
char buf[128], *b;
|
||||
int keycount,i,j,mod;
|
||||
WUserMenuData *data;
|
||||
KeySym ksym;
|
||||
char *k;
|
||||
char *buffer;
|
||||
char buf[128], *b;
|
||||
int keycount,i,j,mod;
|
||||
|
||||
if (PLIsString(shortcut)){
|
||||
keycount = 1;
|
||||
}
|
||||
else if (PLIsArray(shortcut)){
|
||||
keycount = PLGetNumberOfElements(shortcut);
|
||||
}
|
||||
else return NULL;
|
||||
/*for (i=0;i<keycount;i++){*/
|
||||
if (PLIsString(shortcut)){
|
||||
keycount = 1;
|
||||
}
|
||||
else if (PLIsArray(shortcut)){
|
||||
keycount = PLGetNumberOfElements(shortcut);
|
||||
}
|
||||
else return NULL;
|
||||
/*for (i=0;i<keycount;i++){*/
|
||||
|
||||
data = malloc(sizeof(WUserMenuData));
|
||||
data->key = malloc(sizeof(WShortKey)*keycount);
|
||||
data = wmalloc(sizeof(WUserMenuData));
|
||||
if (!data) return NULL;
|
||||
data->key = wmalloc(sizeof(WShortKey)*keycount);
|
||||
if (!data->key) {
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i=0,j=0;i<keycount;i++) {
|
||||
data->key[j].modifier = 0;
|
||||
if (PLIsArray(shortcut)) {
|
||||
strcpy(buf, PLGetString(PLGetArrayElement(shortcut, i)));
|
||||
}
|
||||
else {
|
||||
strcpy(buf, PLGetString(shortcut));
|
||||
}
|
||||
b = (char*)buf;
|
||||
|
||||
while ((k = strchr(b, '+'))!=NULL) {
|
||||
*k = 0;
|
||||
mod = wXModifierFromKey(b);
|
||||
if (mod<0) {
|
||||
break;
|
||||
}
|
||||
data->key[j].modifier |= mod;
|
||||
b = k+1;
|
||||
}
|
||||
if (mod<0) {
|
||||
continue;
|
||||
}
|
||||
for (i=0,j=0;i<keycount;i++) {
|
||||
data->key[j].modifier = 0;
|
||||
if (PLIsArray(shortcut)) {
|
||||
strcpy(buf, PLGetString(PLGetArrayElement(shortcut, i)));
|
||||
}
|
||||
else {
|
||||
strcpy(buf, PLGetString(shortcut));
|
||||
}
|
||||
b = (char*)buf;
|
||||
|
||||
ksym = XStringToKeysym(b);
|
||||
if (ksym==NoSymbol) {
|
||||
continue;
|
||||
}
|
||||
while ((k = strchr(b, '+'))!=NULL) {
|
||||
*k = 0;
|
||||
mod = wXModifierFromKey(b);
|
||||
if (mod<0) {
|
||||
break;
|
||||
}
|
||||
data->key[j].modifier |= mod;
|
||||
b = k+1;
|
||||
}
|
||||
|
||||
data->key[j].keycode = XKeysymToKeycode(dpy, ksym);
|
||||
if (data->key[j].keycode) {
|
||||
j++;
|
||||
}
|
||||
}
|
||||
ksym = XStringToKeysym(b);
|
||||
if (ksym==NoSymbol) {
|
||||
continue;
|
||||
}
|
||||
|
||||
data->key[j].keycode = XKeysymToKeycode(dpy, ksym);
|
||||
if (data->key[j].keycode) {
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
||||
keyover:
|
||||
|
||||
/* get key */
|
||||
if (!j) {
|
||||
free(data->key);
|
||||
free(data);
|
||||
}
|
||||
data->key_no = j;
|
||||
data->screen = scr;
|
||||
if (!j) {
|
||||
puts("fatal j");
|
||||
free(data->key);
|
||||
free(data);
|
||||
return NULL;
|
||||
}
|
||||
data->key_no = j;
|
||||
data->screen = scr;
|
||||
|
||||
return data;
|
||||
return data;
|
||||
}
|
||||
|
||||
static WMenu*
|
||||
configureUserMenu(WScreen *scr, proplist_t plum){
|
||||
char *mtitle;
|
||||
WMenu *menu=NULL;
|
||||
proplist_t elem, title, command, params;
|
||||
int count,i;
|
||||
char *mtitle;
|
||||
WMenu *menu=NULL;
|
||||
proplist_t elem, title, command, params;
|
||||
int count,i;
|
||||
WUserMenuData *data;
|
||||
|
||||
if (!plum) return NULL;
|
||||
else if (!PLIsArray(plum)){
|
||||
PLRelease(plum);
|
||||
return NULL;
|
||||
}
|
||||
if (!plum) return NULL;
|
||||
if (!PLIsArray(plum)){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
count = PLGetNumberOfElements(plum);
|
||||
if (!count) return NULL;
|
||||
count = PLGetNumberOfElements(plum);
|
||||
if (!count) return NULL;
|
||||
|
||||
elem = PLGetArrayElement(plum, 0);
|
||||
if (!PLIsString(elem)){
|
||||
return NULL;
|
||||
}
|
||||
elem = PLGetArrayElement(plum, 0);
|
||||
if (!PLIsString(elem)){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mtitle = PLGetString(elem);
|
||||
mtitle = PLGetString(elem);
|
||||
|
||||
menu=wMenuCreateForApp(scr, mtitle, True);
|
||||
menu=wMenuCreateForApp(scr, mtitle, True);
|
||||
|
||||
for(i=1; i<count; i++){
|
||||
elem = PLGetArrayElement(plum,i);
|
||||
if(PLIsArray(PLGetArrayElement(elem,1))){
|
||||
WMenu *submenu;
|
||||
WMenuEntry *mentry;
|
||||
for(i=1; i<count; i++){
|
||||
elem = PLGetArrayElement(plum,i);
|
||||
if(PLIsArray(PLGetArrayElement(elem,1))){
|
||||
WMenu *submenu;
|
||||
WMenuEntry *mentry;
|
||||
|
||||
submenu = configureUserMenu(scr,elem);
|
||||
if (submenu)
|
||||
mentry = wMenuAddCallback(menu, submenu->frame->title,NULL,NULL);
|
||||
wMenuEntrySetCascade(menu, mentry, submenu);
|
||||
}
|
||||
else {
|
||||
int idx = 0;
|
||||
proplist_t instances=0;
|
||||
submenu = configureUserMenu(scr,elem);
|
||||
if (submenu)
|
||||
mentry = wMenuAddCallback(menu, submenu->frame->title,
|
||||
NULL, NULL);
|
||||
wMenuEntrySetCascade(menu, mentry, submenu);
|
||||
}
|
||||
else {
|
||||
int idx = 0;
|
||||
proplist_t instances=0;
|
||||
|
||||
title = PLGetArrayElement(elem,idx++);
|
||||
command = PLGetArrayElement(elem,idx++);
|
||||
if (PLGetNumberOfElements(elem) >= 3)
|
||||
params = PLGetArrayElement(elem,idx++);
|
||||
title = PLGetArrayElement(elem,idx++);
|
||||
command = PLGetArrayElement(elem,idx++);
|
||||
if (PLGetNumberOfElements(elem) >= 3)
|
||||
params = PLGetArrayElement(elem,idx++);
|
||||
|
||||
if (!title || !command)
|
||||
return menu;
|
||||
if (!title || !command)
|
||||
return menu;
|
||||
|
||||
if (!strcmp("SHORTCUT",PLGetString(command))){
|
||||
WMenuEntry *entry;
|
||||
data = convertShortcuts(scr, params);
|
||||
if (data){
|
||||
entry = wMenuAddCallback(menu, PLGetString(title),
|
||||
notifyClient, data);
|
||||
if (PLIsString(params)) {
|
||||
entry->rtext = GetShortcutString(PLGetString(params));
|
||||
}
|
||||
if (entry) {
|
||||
entry->free_cdata = removeUserMenudata;
|
||||
if (!strcmp("SHORTCUT",PLGetString(command))){
|
||||
WMenuEntry *entry;
|
||||
|
||||
if (PLGetNumberOfElements(elem) >= 4){
|
||||
instances = PLGetArrayElement(elem,idx++);
|
||||
if(PLIsArray(instances))
|
||||
if (instances && PLGetNumberOfElements(instances)
|
||||
&& PLIsArray(instances)){
|
||||
entry->instances = PLRetain(instances);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* else if */
|
||||
data = convertShortcuts(scr, params);
|
||||
if (data){
|
||||
entry = wMenuAddCallback(menu, PLGetString(title),
|
||||
notifyClient, data);
|
||||
|
||||
}
|
||||
}
|
||||
return menu;
|
||||
if (entry) {
|
||||
if (PLIsString(params)) {
|
||||
entry->rtext = GetShortcutString(PLGetString(params));
|
||||
}
|
||||
entry->free_cdata = removeUserMenudata;
|
||||
|
||||
if (PLGetNumberOfElements(elem) >= 4){
|
||||
instances = PLGetArrayElement(elem,idx++);
|
||||
if(PLIsArray(instances))
|
||||
if (instances && PLGetNumberOfElements(instances)
|
||||
&& PLIsArray(instances)){
|
||||
entry->instances = PLRetain(instances);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
return menu;
|
||||
}
|
||||
|
||||
void
|
||||
wUserMenuRefreshInstances(WMenu *menu, WWindow *wwin)
|
||||
{
|
||||
WMenuEntry* entry;
|
||||
int i,j,count,paintflag;
|
||||
WMenuEntry* entry;
|
||||
int i,j,count,paintflag;
|
||||
|
||||
paintflag=0;
|
||||
paintflag=0;
|
||||
|
||||
if(!menu) return;
|
||||
if(!menu) return;
|
||||
|
||||
for (i=0; i<menu->entry_no; i++) {
|
||||
if (menu->entries[i]->instances){
|
||||
proplist_t ins;
|
||||
int oldflag;
|
||||
count = PLGetNumberOfElements(menu->entries[i]->instances);
|
||||
for (i=0; i<menu->entry_no; i++) {
|
||||
if (menu->entries[i]->instances){
|
||||
proplist_t ins;
|
||||
int oldflag;
|
||||
count = PLGetNumberOfElements(menu->entries[i]->instances);
|
||||
|
||||
oldflag = menu->entries[i]->flags.enabled;
|
||||
menu->entries[i]->flags.enabled = 0;
|
||||
for (j=0; j<count;j++){
|
||||
ins = PLGetArrayElement(menu->entries[i]->instances,j);
|
||||
if (!strcmp(wwin->wm_instance,PLGetString(ins))){
|
||||
menu->entries[i]->flags.enabled = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (oldflag != menu->entries[i]->flags.enabled)
|
||||
paintflag=1;
|
||||
}
|
||||
}
|
||||
for (i=0; i < menu->cascade_no; i++) {
|
||||
if (!menu->cascades[i]->flags.brother)
|
||||
wUserMenuRefreshInstances(menu->cascades[i], wwin);
|
||||
else
|
||||
wUserMenuRefreshInstances(menu->cascades[i]->brother, wwin);
|
||||
}
|
||||
oldflag = menu->entries[i]->flags.enabled;
|
||||
menu->entries[i]->flags.enabled = 0;
|
||||
for (j=0; j<count;j++){
|
||||
ins = PLGetArrayElement(menu->entries[i]->instances,j);
|
||||
if (!strcmp(wwin->wm_instance,PLGetString(ins))){
|
||||
menu->entries[i]->flags.enabled = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (oldflag != menu->entries[i]->flags.enabled)
|
||||
paintflag=1;
|
||||
}
|
||||
}
|
||||
for (i=0; i < menu->cascade_no; i++) {
|
||||
if (!menu->cascades[i]->flags.brother)
|
||||
wUserMenuRefreshInstances(menu->cascades[i], wwin);
|
||||
else
|
||||
wUserMenuRefreshInstances(menu->cascades[i]->brother, wwin);
|
||||
}
|
||||
|
||||
if(paintflag)
|
||||
wMenuPaint(menu);
|
||||
if(paintflag)
|
||||
wMenuPaint(menu);
|
||||
}
|
||||
|
||||
|
||||
static WMenu*
|
||||
readUserMenuFile(WScreen *scr, char *file_name)
|
||||
{
|
||||
WMenu *menu=NULL;
|
||||
char *mtitle;
|
||||
WMenu *menu;
|
||||
char *mtitle;
|
||||
proplist_t plum, elem, title, command, params;
|
||||
int count,i;
|
||||
|
||||
proplist_t plum, elem, title, command, params;
|
||||
menu=NULL;
|
||||
plum = ReadProplistFromFile(file_name);
|
||||
/**/
|
||||
|
||||
int count,i;
|
||||
|
||||
plum = ReadProplistFromFile(file_name);
|
||||
/**/
|
||||
|
||||
if(plum){
|
||||
menu = configureUserMenu(scr, plum);
|
||||
PLRelease(plum);
|
||||
}
|
||||
if(plum){
|
||||
menu = configureUserMenu(scr, plum);
|
||||
PLRelease(plum);
|
||||
}
|
||||
return menu;
|
||||
}
|
||||
|
||||
|
||||
WMenu*
|
||||
wUserMenuGet(WScreen *scr, WWindow *wwin){
|
||||
WMenu *menu = NULL;
|
||||
char buffer[100];
|
||||
char *prefix, *menufile;
|
||||
WMenu *menu = NULL;
|
||||
char buffer[100];
|
||||
char *prefix, *menufile;
|
||||
|
||||
prefix = getenv("HOME");
|
||||
if (!prefix)
|
||||
prefix = ".";
|
||||
menufile = malloc(strlen(prefix)+64);
|
||||
if (!menufile) return NULL;
|
||||
prefix = getenv("HOME");
|
||||
if (!prefix)
|
||||
prefix = ".";
|
||||
/* this file/path code will be replaced :D - ]d */
|
||||
menufile = malloc(strlen(prefix)+128);
|
||||
if (!menufile) return NULL;
|
||||
|
||||
if (wwin) {
|
||||
FILE *f;
|
||||
sprintf(menufile, "%s/%s.%s.menu",
|
||||
prefix, wwin->wm_instance, wwin->wm_class);
|
||||
f = fopen(menufile, "r");
|
||||
if (f) {
|
||||
fclose(f);
|
||||
menu = readUserMenuFile(scr, menufile);
|
||||
}
|
||||
}
|
||||
if (wwin) {
|
||||
FILE *f;
|
||||
sprintf(menufile, "%s/GNUstep/Library/WindowMaker/UserMenus/%s.%s.menu",
|
||||
prefix, wwin->wm_instance, wwin->wm_class);
|
||||
f = fopen(menufile, "r");
|
||||
if (f) {
|
||||
fclose(f);
|
||||
menu = readUserMenuFile(scr, menufile);
|
||||
}
|
||||
}
|
||||
|
||||
free(menufile);
|
||||
return menu;
|
||||
free(menufile);
|
||||
return menu;
|
||||
}
|
||||
|
||||
#endif /* USER_MENU */
|
||||
|
||||
@@ -207,6 +207,8 @@
|
||||
/*
|
||||
* Define DEMATERIALIZE_ICON if you want the undocked icon animation
|
||||
* to be a progressive disaparison animation.
|
||||
* This will cause all application icons to be created with Save Under
|
||||
* enable.
|
||||
*/
|
||||
#undef DEMATERIALIZE_ICON
|
||||
|
||||
|
||||
Reference in New Issue
Block a user