3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * \author Abdelrazak Younes
10 * Full author contact details are available in file CREDITS.
19 // FIXME: move this stuff out again
20 #include "bufferlist.h"
21 #include "BufferView.h"
23 #include "funcrequest.h"
26 #include "LyXAction.h"
29 #include "lyxserver.h"
30 #include "lyxsocket.h"
33 #include "graphics/LoaderQueue.h"
35 #include "support/lstrings.h"
36 #include "support/os.h"
37 #include "support/package.h"
42 #include "ColorCache.h"
43 #include "FontLoader.h"
45 #include "qt_helpers.h"
46 #include "socket_callback.h"
47 #include "Application.h"
49 #include <QApplication>
51 #include <QTranslator>
54 #include <QLibraryInfo>
56 #include <boost/bind.hpp>
57 #include <boost/shared_ptr.hpp>
60 using lyx::support::ltrim;
61 using lyx::support::package;
63 using lyx::frontend::GuiImplementation;
64 using lyx::frontend::GuiView;
65 using lyx::frontend::Application;
67 namespace os = lyx::support::os;
69 using boost::shared_ptr;
71 #ifndef CXX_GLOBAL_CSTD
79 // FIXME: wrong place !
80 LyXServer * lyxserver;
81 LyXServerSocket * lyxsocket;
83 lyx::frontend::Application * theApp;
90 return int(0.5 * (w.logicalDpiX() + w.logicalDpiY()));
93 map<int, shared_ptr<socket_callback> > socket_callbacks;
106 extern void initEncodings();
112 int exec(int & argc, char * argv[])
115 FIXME : Abdel 29/05/2006 (younes.a@free.fr)
116 reorganize this code. In particular make sure that this
117 advice from Qt documentation is respected:
119 Since the QApplication object does so much initialization, it
120 must be created before any other objects related to the user
121 interface are created.
123 Right now this is not the case, I suspect that a number of global variables
124 contains Qt object that are initialized before the passage through
125 parse_init(). This might also explain the message displayed by Qt
126 that caused the hanging:
128 QObject::killTimer: timers cannot be stopped from another thread
131 // Force adding of font path _before_ QApplication is initialized
132 FontLoader::initFontPath();
135 static Application app(argc, argv);
137 Application app(argc, argv);
143 // install translation file for Qt built-in dialogs
144 // These are only installed since Qt 3.2.x
145 QTranslator qt_trans;
146 QString language_name = QString("qt_") + QLocale::system().name();
147 language_name.truncate(5);
148 if (qt_trans.load(language_name,
149 QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
151 qApp->installTranslator(&qt_trans);
152 // even if the language calls for RtL, don't do that
153 qApp->setLayoutDirection(Qt::LeftToRight);
155 << "Successfully installed Qt translations for locale "
156 << fromqstr(language_name) << std::endl;
159 << "Could not find Qt translations for locale "
160 << fromqstr(language_name) << std::endl;
163 // These translations are meant to break Qt/Mac menu merging
164 // algorithm on some entries. It lists the menu names that
165 // should not be moved to the LyX menu
166 QTranslator aqua_trans(0);
167 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Setting", 0,
169 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Config", 0,
171 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Options", 0,
173 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Setup", 0,
176 qApp->installTranslator(&aqua_trans);
179 using namespace lyx::graphics;
181 Image::newImage = boost::bind(&QLImage::newImage);
182 Image::loadableFormats = boost::bind(&QLImage::loadableFormats);
184 // needs to be done before reading lyxrc
185 lyxrc.dpi = getDPI();
187 LoaderQueue::setPriority(10,100);
189 return LyX::ref().exec2(argc, argv);
197 LyXView * create_view(unsigned int width, unsigned int height, int posx, int posy,
200 // this can't be done before because it needs the Languages object
203 int view_id = theApp->gui().newView(width, height);
204 GuiView & view = static_cast<GuiView &> (theApp->gui().view(view_id));
206 // FIXME: for now we assume that there is only one LyXView with id = 0.
207 /*int workArea_id_ =*/ theApp->gui().newWorkArea(width, height, 0);
208 //WorkArea * workArea_ = & theApp->gui().workArea(workArea_id_);
210 LyX::ref().addLyXView(&view);
214 // only true when the -geometry option was NOT used
215 if (width != 0 && height != 0) {
216 if (posx != -1 && posy != -1) {
218 // FIXME: use only setGeoemtry when Trolltech has
219 // fixed the qt4/X11 bug
220 view.setGeometry(posx, posy,width, height);
222 view.resize(width, height);
223 view.move(posx, posy);
226 view.resize(width, height);
230 view.setWindowState(Qt::WindowMaximized);
239 int start(LyXView * view, string const & batch)
241 // FIXME: some code below needs moving
243 lyxserver = new LyXServer(&view->getLyXFunc(), lyxrc.lyxpipes);
244 lyxsocket = new LyXServerSocket(&view->getLyXFunc(),
245 os::internal_path(package().temp_dir() + "/lyxsocket"));
247 // handle the batch commands the user asked for
248 if (!batch.empty()) {
249 view->getLyXFunc().dispatch(lyxaction.lookupFunc(batch));
252 int const status = qApp->exec();
262 // This is the ONLY place where processEvents may be called.
263 // During screen update/ redraw, this method is disabled to
264 // prevent keyboard events being handed to the LyX core, where
265 // they could cause re-entrant calls to screen update.
266 qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
270 void exit(int status)
273 QApplication::exit(status);
277 FuncStatus getStatus(FuncRequest const & ev)
281 case LFUN_TOOLTIPS_TOGGLE:
292 bool getRGBColor(LColor_color col, lyx::RGBColor & rgbcol)
294 QColor const & qcol = lcolorcache.get(col);
295 if (!qcol.isValid()) {
301 rgbcol.r = qcol.red();
302 rgbcol.g = qcol.green();
303 rgbcol.b = qcol.blue();
308 string const hexname(LColor_color col)
310 return ltrim(fromqstr(lcolorcache.get(col).name()), "#");
314 void update_color(LColor_color)
316 // FIXME: Bleh, can't we just clear them all at once ?
323 theApp->fontLoader().update();
327 bool font_available(LyXFont const & font)
329 return theApp->fontLoader().available(font);
333 void register_socket_callback(int fd, boost::function<void()> func)
335 socket_callbacks[fd] = shared_ptr<socket_callback>(new socket_callback(fd, func));
339 void unregister_socket_callback(int fd)
341 socket_callbacks.erase(fd);
345 string const roman_font_name()
351 font.setStyleHint(QFont::Serif);
352 font.setFamily("serif");
354 return fromqstr(QFontInfo(font).family());
358 string const sans_font_name()
364 font.setStyleHint(QFont::SansSerif);
365 font.setFamily("sans");
367 return fromqstr(QFontInfo(font).family());
371 string const typewriter_font_name()
377 font.setStyleHint(QFont::TypeWriter);
378 font.setFamily("monospace");
380 return fromqstr(QFontInfo(font).family());
383 }; // namespace lyx_gui