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.
17 // FIXME: move this stuff out again
18 #include "bufferlist.h"
19 #include "BufferView.h"
21 #include "funcrequest.h"
24 #include "LyXAction.h"
27 #include "lyxserver.h"
28 #include "lyxsocket.h"
31 #include "graphics/LoaderQueue.h"
33 #include "support/lstrings.h"
34 #include "support/os.h"
35 #include "support/package.h"
40 #include "ColorCache.h"
41 #include "FontLoader.h"
43 #include "qt_helpers.h"
44 #include "socket_callback.h"
45 #include "Application.h"
47 #include <QApplication>
49 #include <QTranslator>
52 #include <QLibraryInfo>
54 #include <boost/bind.hpp>
55 #include <boost/shared_ptr.hpp>
58 using lyx::support::ltrim;
59 using lyx::support::package;
61 using lyx::frontend::GuiImplementation;
62 using lyx::frontend::GuiView;
63 using lyx::frontend::Application;
65 namespace os = lyx::support::os;
67 using boost::shared_ptr;
69 #ifndef CXX_GLOBAL_CSTD
77 // FIXME: wrong place !
78 LyXServer * lyxserver;
79 LyXServerSocket * lyxsocket;
81 lyx::frontend::Application * theApp;
88 return int(0.5 * (w.logicalDpiX() + w.logicalDpiY()));
91 map<int, shared_ptr<socket_callback> > socket_callbacks;
104 extern void initEncodings();
110 int exec(int & argc, char * argv[])
113 FIXME : Abdel 29/05/2006 (younes.a@free.fr)
114 reorganize this code. In particular make sure that this
115 advice from Qt documentation is respected:
117 Since the QApplication object does so much initialization, it
118 must be created before any other objects related to the user
119 interface are created.
121 Right now this is not the case, I suspect that a number of global variables
122 contains Qt object that are initialized before the passage through
123 parse_init(). This might also explain the message displayed by Qt
124 that caused the hanging:
126 QObject::killTimer: timers cannot be stopped from another thread
129 // Force adding of font path _before_ QApplication is initialized
130 FontLoader::initFontPath();
132 #if defined(Q_WS_WIN) && !defined(Q_CYGWIN_WIN)
133 static Application app(argc, argv);
135 Application app(argc, argv);
141 // install translation file for Qt built-in dialogs
142 // These are only installed since Qt 3.2.x
143 QTranslator qt_trans;
144 QString language_name = QString("qt_") + QLocale::system().name();
145 language_name.truncate(5);
146 if (qt_trans.load(language_name,
147 QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
149 qApp->installTranslator(&qt_trans);
150 // even if the language calls for RtL, don't do that
151 qApp->setLayoutDirection(Qt::LeftToRight);
153 << "Successfully installed Qt translations for locale "
154 << fromqstr(language_name) << std::endl;
157 << "Could not find Qt translations for locale "
158 << fromqstr(language_name) << std::endl;
161 // These translations are meant to break Qt/Mac menu merging
162 // algorithm on some entries. It lists the menu names that
163 // should not be moved to the LyX menu
164 QTranslator aqua_trans(0);
165 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Setting", 0,
167 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Config", 0,
169 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Options", 0,
171 aqua_trans.insert(QTranslatorMessage("QMenuBar", "Setup", 0,
174 qApp->installTranslator(&aqua_trans);
177 using namespace lyx::graphics;
179 Image::newImage = boost::bind(&QLImage::newImage);
180 Image::loadableFormats = boost::bind(&QLImage::loadableFormats);
182 // needs to be done before reading lyxrc
183 lyxrc.dpi = getDPI();
185 LoaderQueue::setPriority(10,100);
187 return LyX::ref().exec2(argc, argv);
195 LyXView * create_view(unsigned int width, unsigned int height, int posx, int posy,
198 // this can't be done before because it needs the Languages object
201 int view_id = theApp->gui().newView(width, height);
202 GuiView & view = static_cast<GuiView &> (theApp->gui().view(view_id));
204 // FIXME: for now we assume that there is only one LyXView with id = 0.
205 /*int workArea_id_ =*/ theApp->gui().newWorkArea(width, height, 0);
206 //WorkArea * workArea_ = & theApp->gui().workArea(workArea_id_);
208 LyX::ref().addLyXView(&view);
212 // only true when the -geometry option was NOT used
213 if (width != 0 && height != 0) {
214 if (posx != -1 && posy != -1) {
216 // FIXME: use only setGeoemtry when Trolltech has
217 // fixed the qt4/X11 bug
218 view.setGeometry(posx, posy,width, height);
220 view.resize(width, height);
221 view.move(posx, posy);
224 view.resize(width, height);
228 view.setWindowState(Qt::WindowMaximized);
237 int start(LyXView * view, string const & batch)
239 // FIXME: some code below needs moving
241 lyxserver = new LyXServer(&view->getLyXFunc(), lyxrc.lyxpipes);
242 lyxsocket = new LyXServerSocket(&view->getLyXFunc(),
243 os::internal_path(package().temp_dir() + "/lyxsocket"));
245 // handle the batch commands the user asked for
246 if (!batch.empty()) {
247 view->getLyXFunc().dispatch(lyxaction.lookupFunc(batch));
250 int const status = qApp->exec();
260 // This is the ONLY place where processEvents may be called.
261 // During screen update/ redraw, this method is disabled to
262 // prevent keyboard events being handed to the LyX core, where
263 // they could cause re-entrant calls to screen update.
264 qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
268 void exit(int status)
271 QApplication::exit(status);
275 FuncStatus getStatus(FuncRequest const & ev)
279 case LFUN_TOOLTIPS_TOGGLE:
290 bool getRGBColor(LColor_color col, lyx::RGBColor & rgbcol)
292 QColor const & qcol = lcolorcache.get(col);
293 if (!qcol.isValid()) {
299 rgbcol.r = qcol.red();
300 rgbcol.g = qcol.green();
301 rgbcol.b = qcol.blue();
306 string const hexname(LColor_color col)
308 return ltrim(fromqstr(lcolorcache.get(col).name()), "#");
312 void update_color(LColor_color)
314 // FIXME: Bleh, can't we just clear them all at once ?
321 theApp->fontLoader().update();
325 bool font_available(LyXFont const & font)
327 return theApp->fontLoader().available(font);
331 void register_socket_callback(int fd, boost::function<void()> func)
333 socket_callbacks[fd] = shared_ptr<socket_callback>(new socket_callback(fd, func));
337 void unregister_socket_callback(int fd)
339 socket_callbacks.erase(fd);
343 string const roman_font_name()
349 font.setStyleHint(QFont::Serif);
350 font.setFamily("serif");
352 return fromqstr(QFontInfo(font).family());
356 string const sans_font_name()
362 font.setStyleHint(QFont::SansSerif);
363 font.setFamily("sans");
365 return fromqstr(QFontInfo(font).family());
369 string const typewriter_font_name()
375 font.setStyleHint(QFont::TypeWriter);
376 font.setFamily("monospace");
378 return fromqstr(QFontInfo(font).family());
381 }; // namespace lyx_gui