From 4193d2265dd095d48d18692834b8ee7e6c8025b8 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 26 Sep 2000 00:35:33 +0000 Subject: [PATCH] - Added WMSetWindowUserPosition() - Replaced FlattenStringList() and TokenizeString() with wtokenjoin() respective wtokensplit() from WINGs --- WINGs/ChangeLog | 3 +- WINGs/WINGs.h | 2 + WINGs/wwindow.c | 22 ++++++- WPrefs.app/editmenu.c | 1 + src/dock.c | 8 +-- src/funcs.h | 4 -- src/menureader.c | 2 +- src/misc.c | 155 ++------------------------------------------------ src/session.c | 4 +- src/window.c | 2 +- 10 files changed, 39 insertions(+), 164 deletions(-) diff --git a/WINGs/ChangeLog b/WINGs/ChangeLog index b9858adf..0f9971fe 100644 --- a/WINGs/ChangeLog +++ b/WINGs/ChangeLog @@ -10,13 +10,14 @@ changes since wmaker 0.62.1: - added WMReparentWidget() - added WMCreateTabViewItem() - added W_CreateUnmanagedTopView() -- added wtokenize() +- added wtokenjoin(), wtokensplit(), wtokenfree(), wtrimspace() - added WMWidgetIsMapped() - added WMSetApplicationIconWindow() - restructured the directory tree. Added Documentation, Examples and Tests subdirectories - removed WMArrayBag and reorganized WMTreeBag to be WMBag. - added WMArray class. +- added WMSetWindowUserPosition() changes since wmaker 0.62.0: diff --git a/WINGs/WINGs.h b/WINGs/WINGs.h index eaaa679e..f1ec27c9 100644 --- a/WINGs/WINGs.h +++ b/WINGs/WINGs.h @@ -880,6 +880,8 @@ void WMSetWindowCloseAction(WMWindow *win, WMAction *action, void *clientData); void WMSetWindowInitialPosition(WMWindow *win, int x, int y); +void WMSetWindowUserPosition(WMWindow *win, int x, int y); + void WMSetWindowAspectRatio(WMWindow *win, int minX, int minY, int maxX, int maxY); diff --git a/WINGs/wwindow.c b/WINGs/wwindow.c index 4186a2f4..4cfd2aef 100644 --- a/WINGs/wwindow.c +++ b/WINGs/wwindow.c @@ -29,6 +29,7 @@ typedef struct W_Window { WMPoint maxAspect; WMPoint upos; + WMPoint ppos; WMAction *closeAction; void *closeData; @@ -40,7 +41,8 @@ typedef struct W_Window { unsigned configured:1; unsigned documentEdited:1; - unsigned setPPos:1; + unsigned setUPos:1; + unsigned setPPos:1; unsigned setAspect:1; } flags; } _Window; @@ -314,6 +316,11 @@ setSizeHints(WMWindow *win) if (win->flags.setPPos) { hints->flags |= PPosition; + hints->x = win->ppos.x; + hints->y = win->ppos.y; + } + if (win->flags.setUPos) { + hints->flags |= USPosition; hints->x = win->upos.x; hints->y = win->upos.y; } @@ -470,6 +477,19 @@ void WMSetWindowInitialPosition(WMWindow *win, int x, int y) { win->flags.setPPos = 1; + win->ppos.x = x; + win->ppos.y = y; + if (win->view->flags.realized) + setSizeHints(win); + WMMoveWidget(win, x, y); +} + + + +void +WMSetWindowUserPosition(WMWindow *win, int x, int y) +{ + win->flags.setUPos = 1; win->upos.x = x; win->upos.y = y; if (win->view->flags.realized) diff --git a/WPrefs.app/editmenu.c b/WPrefs.app/editmenu.c index 6ead13ac..edb6b855 100644 --- a/WPrefs.app/editmenu.c +++ b/WPrefs.app/editmenu.c @@ -789,6 +789,7 @@ WEditMenuShowAt(WEditMenu *menu, int x, int y) W_VIEW_DRAWABLE(menu->view), hints); XFree(hints); + WMMapWidget(menu); } diff --git a/src/dock.c b/src/dock.c index 1bdd2f5a..e5cf14b4 100644 --- a/src/dock.c +++ b/src/dock.c @@ -2108,7 +2108,7 @@ wDockAttachIcon(WDock *dock, WAppIcon *icon, int x, int y) icon->editing = 0; if (XGetCommand(dpy, wwin->client_win, &argv, &argc) && argc>0) { - icon->command = FlattenStringList(argv, argc); + icon->command = wtokenjoin(argv, argc); XFreeStringList(argv); } else { char *command=NULL; @@ -2243,7 +2243,7 @@ moveIconBetweenDocks(WDock *src, WDock *dest, WAppIcon *icon, int x, int y) if ((dest->type==WM_DOCK /*|| dest->keep_attracted*/) && icon->command==NULL) { if (XGetCommand(dpy, wwin->client_win, &argv, &argc) && argc>0) { - icon->command = FlattenStringList(argv, argc); + icon->command = wtokenjoin(argv, argc); XFreeStringList(argv); } else { char *command=NULL; @@ -2940,7 +2940,7 @@ execCommand(WAppIcon *btn, char *command, WSavedState *state) return 0; } - TokenizeString(cmdline, &argv, &argc); + wtokensplit(cmdline, &argv, &argc); if (argv==NULL) { if (cmdline) @@ -3131,7 +3131,7 @@ wDockTrackWindowLaunch(WDock *dock, Window window) if (XGetCommand(dpy, window, &argv, &argc)) { if (argc > 0 && argv != NULL) - command = FlattenStringList(argv,argc); + command = wtokenjoin(argv,argc); if (argv) { XFreeStringList(argv); } diff --git a/src/funcs.h b/src/funcs.h index 94fcf243..95fcd0f8 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -126,8 +126,6 @@ BOOL StringCompareHook(proplist_t pl1, proplist_t pl2); int IsEof(FILE * stream); /* feof that stats pipes */ -char *FlattenStringList(char **list, int count); - void ParseWindowName(proplist_t value, char **winstance, char **wclass, char *where); @@ -151,8 +149,6 @@ void wHackedGrabButton(unsigned int button, unsigned int modifiers, int keyboard_mode, Window confine_to, Cursor cursor); -void TokenizeString(char *command, char ***argv, int *argc); - void ExecExitScript(); /****** I18N Wrapper for XFetchName,XGetIconName ******/ diff --git a/src/menureader.c b/src/menureader.c index f0218172..9430063c 100644 --- a/src/menureader.c +++ b/src/menureader.c @@ -242,7 +242,7 @@ static WRootMenuData *dir_openMenuFile(char *paths, time_t *timestamp) /* timestamp for directory is a "checksum" of the directory times */ - TokenizeString(paths, &dirs, &dirN); + wtokensplit(paths, &dirs, &dirN); if (dirN == 0) { return NULL; diff --git a/src/misc.c b/src/misc.c index b0812368..dc3f66a6 100644 --- a/src/misc.c +++ b/src/misc.c @@ -237,7 +237,8 @@ isBelow(WWindow *win1, WWindow *win2) * XFetchName Wrapper * */ -Bool wFetchName(dpy, win, winname) +Bool +wFetchName(dpy, win, winname) Display *dpy; Window win; char **winname; @@ -281,7 +282,8 @@ char **winname; * */ -Bool wGetIconName(dpy, win, iconname) +Bool +wGetIconName(dpy, win, iconname) Display *dpy; Window win; char **iconname; @@ -502,153 +504,6 @@ FindImage(char *paths, char *file) } -char* -FlattenStringList(char **list, int count) -{ - int i, j; - char *flat_string, *wspace; - - j = 0; - for (i=0; i0) - strcat(flat_string, " "); - wspace = strpbrk(list[i], " \t"); - if (wspace) - strcat(flat_string, "\""); - strcat(flat_string, list[i]); - if (wspace) - strcat(flat_string, "\""); - } - } - - return flat_string; -} - - - -/* - *---------------------------------------------------------------------- - * ParseCommand -- - * Divides a command line into a argv/argc pair. - *---------------------------------------------------------------------- - */ -#define PRC_ALPHA 0 -#define PRC_BLANK 1 -#define PRC_ESCAPE 2 -#define PRC_DQUOTE 3 -#define PRC_EOS 4 -#define PRC_SQUOTE 5 - -typedef struct { - short nstate; - short output; -} DFA; - - -static DFA mtable[9][6] = { - {{3,1},{0,0},{4,0},{1,0},{8,0},{6,0}}, - {{1,1},{1,1},{2,0},{3,0},{5,0},{1,1}}, - {{1,1},{1,1},{1,1},{1,1},{5,0},{1,1}}, - {{3,1},{5,0},{4,0},{1,0},{5,0},{6,0}}, - {{3,1},{3,1},{3,1},{3,1},{5,0},{3,1}}, - {{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */ - {{6,1},{6,1},{7,0},{6,1},{5,0},{3,0}}, - {{6,1},{6,1},{6,1},{6,1},{5,0},{6,1}}, - {{-1,-1},{0,0},{0,0},{0,0},{0,0},{0,0}}, /* final state */ -}; - -char* -next_token(char *word, char **next) -{ - char *ptr; - char *ret, *t; - int state, ctype; - - t = ret = wmalloc(strlen(word)+1); - ptr = word; - - state = 0; - *t = 0; - while (1) { - if (*ptr==0) - ctype = PRC_EOS; - else if (*ptr=='\\') - ctype = PRC_ESCAPE; - else if (*ptr=='"') - ctype = PRC_DQUOTE; - else if (*ptr=='\'') - ctype = PRC_SQUOTE; - else if (*ptr==' ' || *ptr=='\t') - ctype = PRC_BLANK; - else - ctype = PRC_ALPHA; - - if (mtable[state][ctype].output) { - *t = *ptr; t++; - *t = 0; - } - state = mtable[state][ctype].nstate; - ptr++; - if (mtable[state][0].output<0) { - break; - } - } - - if (*ret==0) - t = NULL; - else - t = wstrdup(ret); - - free(ret); - - if (ctype==PRC_EOS) - *next = NULL; - else - *next = ptr; - - return t; -} - - -/* separate a string in tokens, taking " and ' into account */ -void -TokenizeString(char *command, char ***argv, int *argc) -{ - char *token, *line; - int count; - - count = 0; - line = command; - do { - token = next_token(line, &line); - if (token) { - if (count == 0) - *argv = wmalloc(sizeof(char**)); - else - *argv = wrealloc(*argv, (count+1)*sizeof(char**)); - (*argv)[count++] = token; - } - } while (token!=NULL && line!=NULL); - - *argc = count; -} - - static void timeoutHandler(void *data) { @@ -875,7 +730,7 @@ get_dnd_selection(WScreen *scr) return NULL; } - flat_string = FlattenStringList(list, count); + flat_string = wtokenjoin(list, count); if (!flat_string) { wwarning(_("out of memory while getting data from DND drop")); } diff --git a/src/session.c b/src/session.c index d4e45b49..2310b14c 100644 --- a/src/session.c +++ b/src/session.c @@ -226,7 +226,7 @@ makeWindowState(WWindow *wwin, WApplication *wapp) win = wwin->client_win; if (XGetCommand(dpy, win, &argv, &argc) && argc>0) { - command = FlattenStringList(argv, argc); + command = wtokenjoin(argv, argc); XFreeStringList(argv); } if (!command) @@ -381,7 +381,7 @@ execCommand(WScreen *scr, char *command, char *host) char **argv; int argc; - TokenizeString(command, &argv, &argc); + wtokensplit(command, &argv, &argc); if (argv==NULL) { return 0; diff --git a/src/window.c b/src/window.c index 53327a4f..d945ca07 100644 --- a/src/window.c +++ b/src/window.c @@ -2632,7 +2632,7 @@ wWindowGetSavedState(Window win) if (XGetCommand(dpy, win, &argv, &argc)) { if (argc > 0) - command = FlattenStringList(argv, argc); + command = wtokenjoin(argv, argc); XFreeStringList(argv); } if (!command) -- 2.11.4.GIT