> 1. apply my patch for now.
> 2. display a message box when lyx is started without proper .lst
> files. This can be done easily if someone can show me where to insert
> this message box.
>
> Because my patch follows this line, I propose that we figure out 2 for
> 1.5.x, and complete 3 and 4 for 1.6.x.

OK. Here is an updated patch that does 2 as well. When lyx is started
without proper .lst files, a message box will appear and say "No
textclass is found. Click OK to reconfigure". After a user clicks OK,
reconfigure will start.

Uwe: please test.

Abdel, it would be good if the output of reconfigure can appear in a
dialog. Because miktex' update is very slow (25 min in my case), some
progress would better be displayed.

Bo
Index: src/LyX.cpp
===================================================================
--- src/LyX.cpp	(revision 20474)
+++ src/LyX.cpp	(working copy)
@@ -611,6 +611,13 @@
 	// aknowledged.
 	restoreGuiSession();
 
+	// if reconfiguration is needed.
+	if (textclasslist.empty()) {
+		Alert::error(_("No textclass is found"),
+			_("Click OK to reconfigure lyx."));
+		pimpl_->lyxfunc_.dispatch(FuncRequest(LFUN_RECONFIGURE));
+	}
+	
 	// Execute batch commands if available
 	if (batch_command.empty())
 		return;
@@ -626,6 +633,10 @@
 {
 	LyXView * view = newLyXView();
 
+	// if there is no valid class list, do not load any file. 
+	if (textclasslist.empty())
+		return;
+
 	// if some files were specified at command-line we assume that the
 	// user wants to edit *these* files and not to restore the session.
 	if (!pimpl_->files_to_load_.empty()) {
Index: src/TextClassList.cpp
===================================================================
--- src/TextClassList.cpp	(revision 20474)
+++ src/TextClassList.cpp	(working copy)
@@ -164,13 +164,15 @@
 	}
 	LYXERR(Debug::TCLASS) << "End of parsing of textclass.lst" << endl;
 
-	if (classlist_.empty()) {
+	// lyx will start with an empty classlist_, but only reconfigure is allowed
+	// in this case. This gives users a second chance to configure lyx if
+	// initial configuration fails. (c.f. bug 2829)
+	if (classlist_.empty())
 		lyxerr << "TextClassList::Read: no textclasses found!"
 		       << endl;
-		return false;
-	}
-	// Ok everything loaded ok, now sort the list.
-	sort(classlist_.begin(), classlist_.end(), less_textclass_avail_desc());
+	else 
+		// Ok everything loaded ok, now sort the list.
+		sort(classlist_.begin(), classlist_.end(), less_textclass_avail_desc());
 	return true;
 }
 
Index: src/TextClassList.h
===================================================================
--- src/TextClassList.h	(revision 20474)
+++ src/TextClassList.h	(working copy)
@@ -40,6 +40,8 @@
 	const_iterator begin() const { return classlist_.begin(); }
 	///
 	const_iterator end() const { return classlist_.end(); }
+	///
+	bool empty() const { return classlist_.empty(); }
 
 	/// Gets textclass number from name, -1 if textclass name does not exist
 	std::pair<bool, textclass_type> const
Index: src/LyXFunc.cpp
===================================================================
--- src/LyXFunc.cpp	(revision 20474)
+++ src/LyXFunc.cpp	(working copy)
@@ -390,6 +390,16 @@
 	//lyxerr << "LyXFunc::getStatus: cmd: " << cmd << endl;
 	FuncStatus flag;
 
+	// if textclasslist is empty, the only allowed operation is reconfigure (c.f. bug 2829)
+	// FIXME: this can be removed after lyx can restart itself automatically
+	// after reconfiguration. Note that reconfiguration is triggered at
+	// LyX::execBatchCommands() in LyX.cpp.
+	if (textclasslist.empty() && cmd.action != LFUN_RECONFIGURE 
+		&& cmd.action != LFUN_LYX_QUIT) {
+		flag.enabled(false);
+		return flag;
+	}
+
 	Cursor & cur = view()->cursor();
 
 	/* In LyX/Mac, when a dialog is open, the menus of the

Reply via email to