[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: