diff --git a/WINGs/wtextfield.c b/WINGs/wtextfield.c index cf07da44..70108ea5 100644 --- a/WINGs/wtextfield.c +++ b/WINGs/wtextfield.c @@ -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; } } diff --git a/src/appicon.c b/src/appicon.c index f79072be..076f3e66 100644 --- a/src/appicon.c +++ b/src/appicon.c @@ -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; diff --git a/src/usermenu.c b/src/usermenu.c index 07af4564..c60fe132 100644 --- a/src/usermenu.c +++ b/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;ikey_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;ikey_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; - - if (PLIsString(shortcut)){ - keycount = 1; - } - else if (PLIsArray(shortcut)){ - keycount = PLGetNumberOfElements(shortcut); - } - else return NULL; - /*for (i=0;ikey = malloc(sizeof(WShortKey)*keycount); - - for (i=0,j=0;ikey[j].modifier = 0; - if (PLIsArray(shortcut)) { - strcpy(buf, PLGetString(PLGetArrayElement(shortcut, i))); - } - else { - strcpy(buf, PLGetString(shortcut)); - } - b = (char*)buf; + WUserMenuData *data; + KeySym ksym; + char *k; + char *buffer; + char buf[128], *b; + int keycount,i,j,mod; - 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; - } + if (PLIsString(shortcut)){ + keycount = 1; + } + else if (PLIsArray(shortcut)){ + keycount = PLGetNumberOfElements(shortcut); + } + else return NULL; + /*for (i=0;ikey[j].keycode = XKeysymToKeycode(dpy, ksym); - if (data->key[j].keycode) { - j++; - } - } + 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;ikey[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; + } + + 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; - - return data; + if (!j) { + puts("fatal j"); + free(data->key); + free(data); + return NULL; + } + data->key_no = j; + data->screen = scr; + + 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; - } - - mtitle = PLGetString(elem); - - menu=wMenuCreateForApp(scr, mtitle, True); - - for(i=1; iframe->title,NULL,NULL); - wMenuEntrySetCascade(menu, mentry, submenu); - } - else { - int idx = 0; - proplist_t instances=0; + elem = PLGetArrayElement(plum, 0); + if (!PLIsString(elem)){ + return NULL; + } + + mtitle = PLGetString(elem); + + menu=wMenuCreateForApp(scr, mtitle, True); + + for(i=1; iframe->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++); - - if (!title || !command) - return menu; + title = PLGetArrayElement(elem,idx++); + command = PLGetArrayElement(elem,idx++); + if (PLGetNumberOfElements(elem) >= 3) + params = PLGetArrayElement(elem,idx++); + + 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; - - paintflag=0; - - if(!menu) return; + WMenuEntry* entry; + int i,j,count,paintflag; + + paintflag=0; + + if(!menu) return; - for (i=0; ientry_no; i++) { - if (menu->entries[i]->instances){ - proplist_t ins; - int oldflag; - count = PLGetNumberOfElements(menu->entries[i]->instances); + for (i=0; ientry_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; jentries[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; jentries[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; - - proplist_t plum, elem, title, command, params; - - int count,i; + WMenu *menu; + char *mtitle; + proplist_t plum, elem, title, command, params; + int count,i; - plum = ReadProplistFromFile(file_name); - /**/ - - if(plum){ - menu = configureUserMenu(scr, plum); - PLRelease(plum); - } + menu=NULL; + plum = ReadProplistFromFile(file_name); + /**/ + + 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; - - 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); - } - } + 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/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 */ diff --git a/src/wconfig.h.in b/src/wconfig.h.in index 1c59284c..77d8c7bc 100644 --- a/src/wconfig.h.in +++ b/src/wconfig.h.in @@ -206,7 +206,9 @@ /* * Define DEMATERIALIZE_ICON if you want the undocked icon animation - * to be a progressive disaparison animation. + * to be a progressive disaparison animation. + * This will cause all application icons to be created with Save Under + * enable. */ #undef DEMATERIALIZE_ICON