From ef911eda201ec9b449705f999b60bf3332ee4fdf Mon Sep 17 00:00:00 2001
From: fluxgen <fluxgen>
Date: Thu, 10 Jan 2002 12:51:21 +0000
Subject: moved rootcommand to screen loading and added loadRootCommand

---
 src/fluxbox.cc | 133 +++++++++++++++++++++++++--------------------------------
 src/fluxbox.hh |   8 ++--
 2 files changed, 62 insertions(+), 79 deletions(-)

diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index e141b6f..a48f0ef 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.cc
@@ -22,7 +22,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: fluxbox.cc,v 1.17 2002/01/09 15:08:22 fluxgen Exp $
+// $Id: fluxbox.cc,v 1.18 2002/01/10 12:51:21 fluxgen Exp $
 
 // stupid macros needed to access some functions in version 2 of the GNU C
 // library
@@ -191,8 +191,8 @@ Fluxbox::Fluxbox(int m_argc, char **m_argv, char *dpy_name, char *rc)
 	key=0;
 	
   no_focus = False;
-  resource.titlebar_file = resource.menu_file = resource.style_file = resource.keys_file = 
-		resource.root_cmd = 0;  
+  resource.titlebar_file = resource.menu_file = resource.style_file = resource.keys_file = 0;
+	
 	resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec = 0;
 		
   focused_window = masked_window = (FluxboxWindow *) 0;
@@ -290,9 +290,6 @@ Fluxbox::~Fluxbox(void) {
 	delete key;
 	key = 0;
 	
-	if (resource.root_cmd)
-		delete [] resource.root_cmd;
-	
 	if (resource.menu_file)
 		delete [] resource.menu_file;
 	
@@ -982,7 +979,17 @@ void Fluxbox::process_event(XEvent *e) {
 
 	  	  		win->changeBlackboxHints(&net);
 					}
+				} 
+				#ifdef GNOME
+				else if (e->xclient.message_type == getGnomeWorkspaceAtom()) {
+					#ifdef DEBUG
+					cerr<<__FILE__<<"("<<__LINE__<<"): Got workspace atom"<<endl;
+					#endif//!DEBUG
+					BScreen *screen = searchScreen(e->xclient.window);
+					if (screen)
+						screen->changeWorkspaceID(e->xclient.data.l[0]);
 				}
+				#endif //!GNOME
 			}
 
 			break;
@@ -1256,28 +1263,6 @@ Slit *Fluxbox::searchSlit(Window window) {
 
 void Fluxbox::saveWindowSearch(Window window, FluxboxWindow *data) {
   windowSearchList->insert(new WindowSearch(window, data));
-
-#ifdef GNOME
-	/*
-	Window	*wl=0;
-	int	num=0;
-
-	num = windowSearchList->count();
-	wl = new Window[num];
-  // Fill in array of window ID's
-	LinkedListIterator<WindowSearch> it(windowSearchList);
-
-	for (unsigned int i=0; it.current(); it++, i++)
-		wl[i] = it.current()->getWindow();		
-	
-	//set property
-  XChangeProperty(getXDisplay(), DefaultRootWindow(getXDisplay()), getGnomeClientListAtom(), XA_CARDINAL, 32,
-                  PropModeReplace, (unsigned char  *)(wl), num);
-	
-	delete wl;	
-	*/
-#endif
-
 }
 
 
@@ -1432,7 +1417,8 @@ void Fluxbox::save_rc(void) {
 
 	auto_ptr<char> dbfile(getRcFilename());
 
-//	load_rc(); This overwrites configs made while running, for example
+//	load_rc();
+// This overwrites configs made while running, for example
 // usage of iconbar and tabs
   
 	sprintf(rc_string, "session.iconbar: %s", resource.iconbar ? "true" : "false");
@@ -1511,15 +1497,19 @@ void Fluxbox::save_rc(void) {
 		XrmPutLineResource(&new_blackboxrc, rc_string);
 
 		sprintf(rc_string, "session.imageDither: %s",
-				((screen->getImageControl()->doDither()) ? "True" : "False"));
+			((screen->getImageControl()->doDither()) ? "True" : "False"));
 		XrmPutLineResource(&new_blackboxrc, rc_string);
 
 		sprintf(rc_string, "session.screen%d.fullMaximization: %s", screen_number,
-					((screen->doFullMax()) ? "True" : "False"));
+			((screen->doFullMax()) ? "True" : "False"));
+		XrmPutLineResource(&new_blackboxrc, rc_string);
+		
+		sprintf(rc_string, "session.screen%d.rootCommand: %s", screen_number,
+			screen->getRootCommand().c_str());
 		XrmPutLineResource(&new_blackboxrc, rc_string);
 
 		sprintf(rc_string, "session.screen%d.focusNewWindows: %s", screen_number,
-						((screen->doFocusNew()) ? "True" : "False"));
+			((screen->doFocusNew()) ? "True" : "False"));
 		XrmPutLineResource(&new_blackboxrc, rc_string);
 
 		sprintf(rc_string, "session.screen%d.focusLastWindow: %s", screen_number,
@@ -1528,18 +1518,18 @@ void Fluxbox::save_rc(void) {
 
 		sprintf(rc_string, "session.screen%d.rowPlacementDirection: %s", screen_number,
 			((screen->getRowPlacementDirection() == BScreen::LeftRight) ?
-				"LeftToRight" : "RightToLeft"));
+			"LeftToRight" : "RightToLeft"));
 		XrmPutLineResource(&new_blackboxrc, rc_string);
 
 		sprintf(rc_string, "session.screen%d.colPlacementDirection: %s", screen_number,
 			((screen->getColPlacementDirection() == BScreen::TopBottom) ?
-				"TopToBottom" : "BottomToTop"));
+			"TopToBottom" : "BottomToTop"));
 		XrmPutLineResource(&new_blackboxrc, rc_string);
 
 		char *placement = (char *) 0;
 		
 		sprintf(rc_string, "session.screen%d.maxOverSlit: %s", screen_number,
-					((screen->doMaxOverSlit()) ? "True" : "False"));
+			((screen->doMaxOverSlit()) ? "True" : "False"));
 		XrmPutLineResource(&new_blackboxrc, rc_string);
 		switch (screen->getPlacementPolicy()) {
 		case BScreen::CascadePlacement:
@@ -1699,13 +1689,8 @@ void Fluxbox::save_rc(void) {
 char *Fluxbox::getRcFilename() {
 	char *dbfile=0;
  
-	if (!rc_file) {
-		
-		string str(getenv("HOME")+string("/.")+RC_PATH+string("/")+RC_INIT_FILE);		
-		#ifdef DEBUG
-		cerr<<__FILE__<<"("<<__LINE__<<"): str.size()="<<str.size()<<endl;
-		cerr<<__FILE__<<"("<<__LINE__<<"): str="<<str<<endl;
-		#endif
+	if (!rc_file) {		
+		string str(getenv("HOME")+string("/.")+RC_PATH+string("/")+RC_INIT_FILE);				
 		return StringUtil::strdup(str.c_str());
 	} else
 		dbfile = StringUtil::strdup(rc_file);
@@ -1808,16 +1793,6 @@ void Fluxbox::load_rc(void) {
 	else
 		resource.style_file = StringUtil::strdup(DEFAULTSTYLE);
 
-	if (resource.root_cmd) {
-		delete [] resource.root_cmd;
-		resource.root_cmd = 0;
-	}
-
-	if (XrmGetResource(database, "session.rootCommand", "Session.RootCommand", &value_type, &value))
-		resource.root_cmd = StringUtil::expandFilename(value.addr);
-	else
-		resource.root_cmd = 0;
-
 	if (XrmGetResource(database, "session.doubleClickInterval",
 				"Session.DoubleClickInterval", &value_type, &value)) {
 		if (sscanf(value.addr, "%lu", &resource.double_click_interval) != 1)
@@ -1946,7 +1921,8 @@ void Fluxbox::load_rc(BScreen *screen) {
   char *value_type, name_lookup[1024], class_lookup[1024];
   int screen_number = screen->getScreenNumber();
 
-  sprintf(name_lookup,  "session.screen%d.fullMaximization", screen_number);
+  
+	sprintf(name_lookup,  "session.screen%d.fullMaximization", screen_number);
   sprintf(class_lookup, "Session.Screen%d.FullMaximization", screen_number);
   if (XrmGetResource(database, name_lookup, class_lookup, &value_type,
                      &value)) {
@@ -1957,7 +1933,15 @@ void Fluxbox::load_rc(BScreen *screen) {
   } else
     screen->saveFullMax(False);
 
-  sprintf(name_lookup,  "session.screen%d.focusNewWindows", screen_number);
+  sprintf(name_lookup,  "session.screen%d.rootCommand", screen_number);
+  sprintf(class_lookup, "Session.Screen%d.RootCommand", screen_number);
+  if (XrmGetResource(database, name_lookup, class_lookup, &value_type,
+                     &value)) {										 
+    screen->saveRootCommand(value.addr==0 ? "": value.addr);
+  } else
+		screen->saveRootCommand("");    
+
+	sprintf(name_lookup,  "session.screen%d.focusNewWindows", screen_number);
   sprintf(class_lookup, "Session.Screen%d.FocusNewWindows", screen_number);
   if (XrmGetResource(database, name_lookup, class_lookup, &value_type,
                      &value)) {
@@ -2080,27 +2064,7 @@ void Fluxbox::load_rc(BScreen *screen) {
 
     delete [] search;
   }
-	//TODO MOVE THIS!!!!!!
-	#ifdef GNOME	
-	{
-	Atom atype;
-  int aformat;
-  unsigned long nitems, bytes_remain;
-  unsigned char *prop;
-	XGetWindowProperty (screen->getBaseDisplay()->getXDisplay(), 
-		screen->getRootWindow(), 
-		screen->getBaseDisplay()->getGnomeWorkspaceCountAtom(), 
-		0L, 1L, False, XA_CARDINAL, &atype, &aformat, &nitems, &bytes_remain, &prop);
-		
-	long val = screen->getNumberOfWorkspaces();
-	fprintf(stderr, "HERE!! %s(%d) num wrkspace(%l)\n", __FILE__, __LINE__, val);
-		XChangeProperty(screen->getBaseDisplay()->getXDisplay(), screen->getRootWindow(),
-			screen->getBaseDisplay()->getGnomeWorkspaceCountAtom(), XA_CARDINAL, 32,
-		PropModeReplace, (unsigned char *)&val, 1);
-	}
-	#endif //GNOME
-     
-		 
+
   sprintf(name_lookup,  "session.screen%d.toolbar.onTop", screen_number);
   sprintf(class_lookup, "Session.Screen%d.Toolbar.OnTop", screen_number);
   if (XrmGetResource(database, name_lookup, class_lookup, &value_type,
@@ -2375,7 +2339,26 @@ void Fluxbox::load_rc(BScreen *screen) {
 
 }
 
+void Fluxbox::loadRootCommand(BScreen *screen)  {
+	XrmDatabase database = (XrmDatabase) 0;
 
+  auto_ptr<char> dbfile(getRcFilename());
+
+  database = XrmGetFileDatabase(dbfile.get());
+	if (!database) 
+		database = XrmGetFileDatabase(DEFAULT_INITFILE);
+
+  XrmValue value;
+  char *value_type, name_lookup[1024], class_lookup[1024];
+	sprintf(name_lookup,  "session.screen%d.rootCommand", screen->getScreenNumber());
+  sprintf(class_lookup, "Session.Screen%d.RootCommand", screen->getScreenNumber());
+  if (XrmGetResource(database, name_lookup, class_lookup, &value_type,
+                     &value)) {										 
+    screen->saveRootCommand(value.addr==0 ? "": value.addr);
+  } else
+		screen->saveRootCommand("");    
+	
+}
 void Fluxbox::reload_rc(void) {
   load_rc();
   reconfigure();
diff --git a/src/fluxbox.hh b/src/fluxbox.hh
index 4e10bad..68219d0 100644
--- a/src/fluxbox.hh
+++ b/src/fluxbox.hh
@@ -22,7 +22,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: fluxbox.hh,v 1.4 2002/01/09 14:11:20 fluxgen Exp $
+// $Id: fluxbox.hh,v 1.5 2002/01/10 12:51:21 fluxgen Exp $
 
 #ifndef	 _FLUXBOX_HH_
 #define	 _FLUXBOX_HH_
@@ -128,8 +128,7 @@ public:
 	inline const std::vector<Fluxbox::Titlebar>& getTitlebarLeft() { return titlebar.left; }
 	inline const char *getStyleFilename(void) const
 		{ return resource.style_file; }
-	inline const char *getRootCommand() const 
-		{ return resource.root_cmd; }
+
 	inline const char *getMenuFilename(void) const
 		{ return resource.menu_file; }
 
@@ -151,6 +150,7 @@ public:
 	void setFocusedWindow(FluxboxWindow *w);
 	void shutdown(void);
 	void load_rc(BScreen *);
+	void loadRootCommand(BScreen *);
 	void loadTitlebar();
 	void saveStyleFilename(const char *);
 	void saveMenuFilename(const char *);
@@ -211,7 +211,7 @@ private:
 	struct resource {
 		Time double_click_interval;
 
-		char *menu_file, *style_file, *titlebar_file, *keys_file, *root_cmd;
+		char *menu_file, *style_file, *titlebar_file, *keys_file;
 		int colors_per_channel;
 		timeval auto_raise_delay;
 		unsigned long cache_life, cache_max;
-- 
cgit v0.11.2