[
Thread Prev][
Thread Next] >
Date Index
>
Thread Index
[wmx] One last attempt
Lasse Rasinen -
Thu Jan 21 06:54:04 1999
Sheesh. I suck. It was so simple and I didn't figure it out.
Anyway, here's the final version, with (hopefully ;) no more bugs
left. Except the keyboard code is still untested. Some delay might be
nice, since now this is FAST. Or maybe that "hot spot" indicator.
Play with this. I have a lecture in 20 minutes, so it's only proper I
finish this now ;)
The patch goes to plain wmx-5, again.
*** Menu.C.old Wed Jan 20 19:10:00 1999
--- Menu.C Thu Jan 21 07:48:48 1999
***************
*** 22,28 ****
Menu::Menu(WindowManager *manager, XEvent *e)
: m_items(0), m_nItems(0), m_nHidden(0),
! m_windowManager(manager), m_event(e)
{
if (!m_initialised)
{
--- 22,29 ----
Menu::Menu(WindowManager *manager, XEvent *e)
: m_items(0), m_nItems(0), m_nHidden(0),
! m_windowManager(manager), m_event(e),
! m_hasSubmenus(False)
{
if (!m_initialised)
{
***************
*** 176,183 ****
warp = True;
}
! if (warp) XWarpPointer(display(), None, root(),
! None, None, None, None, xbev->x, xbev->y);
}
XMoveResizeWindow(display(), m_window, x, y, maxWidth, totalHeight);
--- 177,185 ----
warp = True;
}
! if (warp || m_hasSubmenus) XWarpPointer(display(), None, root(),
! None, None, None, None,
! xbev->x, xbev->y);
}
XMoveResizeWindow(display(), m_window, x, y, maxWidth, totalHeight);
***************
*** 259,264 ****
--- 261,268 ----
if (selecting >= 0 && y >= selecting * entryHeight - 3 &&
y <= (selecting + 1) * entryHeight - 3) i = selecting;
+ if (m_hasSubmenus && (i >= 0 && i < m_nHidden)) i = -i;
+
if (x < 0 || x > maxWidth || y < -3) i = -1;
else if (i < 0 || i >= m_nItems) i = -1;
***************
*** 284,289 ****
--- 288,301 ----
if (prev >= 0 && y >= prev * entryHeight - 3 &&
y <= (prev+1) * entryHeight - 3) selecting = prev;
+ if (m_hasSubmenus && (selecting >= 0 && selecting < m_nHidden) &&
+ x >= maxWidth-32 && x < maxWidth)
+ {
+ createSubmenu (selecting);
+ done = True;
+ break;
+ }
+
if (x < 0 || x > maxWidth || y < -3) selecting = -1;
else if (selecting < 0 || selecting > m_nItems) selecting = -1;
***************
*** 354,359 ****
--- 366,377 ----
if (key == CONFIG_MENU_SELECT_KEY) {
if (!drawn) selecting = -1;
+
+ if (m_hasSubmenus && selecting >= 0 && selecting < m_nHidden)
+ {
+ createSubmenu(selecting);
+ selecting = -1;
+ }
m_windowManager->releaseGrabKeyMode(&event.xkey);
XUnmapWindow(display(), m_window);
done = True;
***************
*** 564,602 ****
}
! CommandMenu::CommandMenu(WindowManager *manager, XEvent *e)
: Menu(manager, e)
{
- m_commandDir = NULL;
const char *home = getenv("HOME");
const char *wmxdir = getenv("WMXDIR");
! if (wmxdir == NULL)
! {
! if (home == NULL) return;
! m_commandDir =
! (char *)malloc(strlen(home) + strlen(CONFIG_COMMAND_MENU) + 2);
! sprintf(m_commandDir, "%s/%s", home, CONFIG_COMMAND_MENU);
! }
! else
{
! if(wmxdir[0] == '/')
{
m_commandDir =
! (char *)malloc(strlen(wmxdir) + 1);
! strcpy(m_commandDir, wmxdir);
}
else
{
! m_commandDir =
! (char *)malloc(strlen(home) + strlen(wmxdir) + 2);
! sprintf(m_commandDir, "%s/%s", home, wmxdir);
}
}
int i = getSelection();
! if (i >= 0 && i < m_nItems) {
char *commandFile =
(char *)malloc(strlen(m_commandDir) + strlen(m_items[i]) + 2);
--- 582,636 ----
}
! CommandMenu::CommandMenu(WindowManager *manager, XEvent *e,
! char* otherdir = NULL)
: Menu(manager, e)
{
const char *home = getenv("HOME");
const char *wmxdir = getenv("WMXDIR");
! m_commandDir = NULL;
! m_hasSubmenus = True;
!
! if (otherdir == NULL)
{
! if (wmxdir == NULL)
{
+ if (home == NULL) return;
m_commandDir =
! (char *)malloc(strlen(home) + strlen(CONFIG_COMMAND_MENU) + 2);
! sprintf(m_commandDir, "%s/%s", home, CONFIG_COMMAND_MENU);
}
else
{
! if(wmxdir[0] == '/')
! {
! m_commandDir =
! (char *)malloc(strlen(wmxdir) + 1);
! strcpy(m_commandDir, wmxdir);
! }
! else
! {
! m_commandDir =
! (char *)malloc(strlen(home) + strlen(wmxdir) + 2);
! sprintf(m_commandDir, "%s/%s", home, wmxdir);
! }
}
}
+ else
+ {
+ m_commandDir = (char *)malloc(strlen(otherdir)+1);
+ strcpy(m_commandDir, otherdir);
+ }
int i = getSelection();
! if (i >= 0 && i < m_nHidden) {
! // This should never happen.
! }
!
! if (i >= m_nHidden && i < m_nItems)
! {
char *commandFile =
(char *)malloc(strlen(m_commandDir) + strlen(m_items[i]) + 2);
***************
*** 622,627 ****
--- 656,675 ----
return strcmp(*a, *b);
}
+ void CommandMenu::createSubmenu (int i)
+ {
+ char *new_directory;
+ int dirlen = strlen (m_commandDir);
+
+ new_directory = (char *)malloc (dirlen + strlen(m_items[i]) + 2);
+ strcpy (new_directory, m_commandDir);
+ new_directory[dirlen] = '/';
+ strcpy (new_directory + dirlen + 1, m_items[i]);
+
+ CommandMenu menu (m_windowManager, m_event, new_directory);
+ free(new_directory);
+ }
+
char **CommandMenu::getItems(int *niR, int *nhR)
{
*niR = *nhR = 0;
***************
*** 669,674 ****
--- 717,742 ----
sprintf(dirpath + dirlen, "/%s", ent->d_name);
if (stat(dirpath, &st) == -1) continue;
+ if (!S_ISDIR(st.st_mode) || !(st.st_mode & 0444)) continue;
+ if (ent->d_name[0] == '.') continue;
+
+ items = (!items ? (char **)malloc(sizeof(char *)) :
+ (char **)realloc(items, (count + 1) * sizeof(char *)));
+
+ items[count++] = NewString(ent->d_name);
+ }
+
+ qsort(items, count, sizeof(char *), sortstrs);
+ *nhR = count;
+
+ rewinddir(dir);
+
+ while ((ent = readdir(dir)) != NULL) {
+
+ struct stat st;
+ sprintf(dirpath + dirlen, "/%s", ent->d_name);
+
+ if (stat(dirpath, &st) == -1) continue;
if (!S_ISREG(st.st_mode) || !(st.st_mode & 0111)) continue;
items = (!items ? (char **)malloc(sizeof(char *)) :
***************
*** 677,688 ****
items[count++] = NewString(ent->d_name);
}
free(dirpath);
closedir(dir);
- qsort(items, count, sizeof(char *), sortstrs);
-
- *niR = *nhR = count;
return items;
}
--- 745,756 ----
items[count++] = NewString(ent->d_name);
}
+ *niR = count;
+ qsort(items + *nhR, *niR - *nhR, sizeof(char *), sortstrs);
+
free(dirpath);
closedir(dir);
return items;
}
*** Menu.h.old Wed Jan 20 19:10:05 1999
--- Menu.h Thu Jan 21 07:17:47 1999
***************
*** 14,20 ****
virtual int getSelection();
static void cleanup(WindowManager *const);
! protected:
static Window m_window;
static Boolean m_initialised;
--- 14,20 ----
virtual int getSelection();
static void cleanup(WindowManager *const);
! protected:
static Window m_window;
static Boolean m_initialised;
***************
*** 31,36 ****
--- 31,39 ----
int m_nItems;
int m_nHidden;
+ Boolean m_hasSubmenus;
+ virtual void createSubmenu (int i) {};
+
WindowManager *m_windowManager;
XEvent *m_event;
***************
*** 43,48 ****
--- 46,52 ----
virtual void showFeedback(int) { }
virtual void removeFeedback(int, Boolean) { }
virtual void raiseFeedbackLevel(int) { }
+
};
class ClientMenu : public Menu
***************
*** 65,74 ****
class CommandMenu : public Menu
{
public:
! CommandMenu(WindowManager *, XEvent *e);
virtual ~CommandMenu();
private:
virtual char **getItems(int *, int *);
char *m_commandDir;
};
--- 69,79 ----
class CommandMenu : public Menu
{
public:
! CommandMenu(WindowManager *, XEvent *e, char *otherdir = NULL);
virtual ~CommandMenu();
private:
+ void createSubmenu(int i);
virtual char **getItems(int *, int *);
char *m_commandDir;
};
Next: