Hi Norbert,
I will let Max handle these patches.
Best wishes, Joris
On Thu, Jun 11, 2009 at 07:21:54AM +0100, Norbert Nemec wrote:
Hi Massimiliano, hi everybody,
attached is a pile of patches to the Qt GUI. The Qt event-loop is now
used properly, properly hooking in the repaint and update
mechanisms via
timers. As far as I can see, it covers everything that the X11 GUI
and
the former hacked up Qt-solution did. It has been working smoothly
for
me over the past few weeks, solves a few quirks and uses far less CPU
time when idle. (<0.1% compared to the former 3% on my machine).
The other changes fix a number of issues that I encountered, most
notably the keymap. Please make sure that these changes also apply to
MacOSX, where everything seems to be somewhat different to my Linux
machine.
Greetings,
Norbert
remove trailing spaces and expand tabs
From: <>
---
src/plugins/asymptote/bin/perl-tm_asy | 0
src/src/Plugins/Qt/qt_gui.cpp | 9 ++++-----
src/src/Plugins/Qt/qt_widget.cpp | 16 ++++++++--------
3 files changed, 12 insertions(+), 13 deletions(-)
mode change 100644 => 100755 src/plugins/asymptote/bin/perl-tm_asy
diff --git a/src/plugins/asymptote/bin/perl-tm_asy b/src/plugins/
asymptote/bin/perl-tm_asy
old mode 100644
new mode 100755
diff --git a/src/src/Plugins/Qt/qt_gui.cpp b/src/src/Plugins/Qt/
qt_gui.cpp
index 8ce92ea..3f34f32 100755
--- a/src/src/Plugins/Qt/qt_gui.cpp
+++ b/src/src/Plugins/Qt/qt_gui.cpp
@@ -57,7 +57,7 @@ void
qt_gui_rep::get_extents (SI& width, SI& height) {
QDesktopWidget* d= QApplication::desktop();
int w = d->width(); // returns desktop width
- int h = d->height(); // returns desktop height
+ int h = d->height(); // returns desktop height
width = ((SI) w) * PIXEL;
height= ((SI) h) * PIXEL;
}
@@ -109,11 +109,11 @@ qt_gui_rep::set_selection (string key, tree
t, string s) {
//XSetSelectionOwner (dpy, XA_PRIMARY, win, CurrentTime);
//if (XGetSelectionOwner(dpy, XA_PRIMARY)==None) return false;
selection= as_charp (s);
-
+
QClipboard *clipboard = QApplication::clipboard();
QString originalText = clipboard->text();
-
- clipboard->setText(selection);
+
+ clipboard->setText(selection);
}
return true;
}
@@ -390,4 +390,3 @@ font x_font (string family, int size, int dpi)
if (DEBUG_EVENTS) cout << "x_font(): SHOULD NOT BE CALLED\n";
return NULL;
}
-
diff --git a/src/src/Plugins/Qt/qt_widget.cpp b/src/src/Plugins/Qt/
qt_widget.cpp
index 0e80d4b..0637efd 100755
--- a/src/src/Plugins/Qt/qt_widget.cpp
+++ b/src/src/Plugins/Qt/qt_widget.cpp
@@ -154,7 +154,7 @@ qt_view_widget_rep::send (slot s, blackbox val) {
cout << "qt_view_widget_rep::send " << slot_name (s) << LF;
switch (s) {
case SLOT_NAME:
- {
+ {
check_type<string> (val, "SLOT_NAME");
string name = open_box<string> (val);
view->window() -> setWindowTitle (to_qstring (name));
@@ -190,7 +190,7 @@ qt_view_widget_rep::send (slot s, blackbox val) {
if (open_box<bool> (val)) the_keyboard_focus = this;
if (DEBUG_EVENTS) cout << "Ignored!\n";
break;
-
+
default:
FAILED ("unhandled slot type");
}
@@ -279,7 +279,7 @@ qt_view_widget_rep::read (slot s, blackbox
index) {
return (widget_rep*) (v.value<void*> ());
else FAILED ("QWidget property not set");
}
- break; // not reached
+ break; // not reached
default:
FAILED ("cannot handle slot type");
return widget();
@@ -553,7 +553,7 @@ qt_tm_widget_rep::query (slot s, int type_id) {
if (DEBUG_EVENTS) cout << "Visible Region " << rect << LF;
return close_box<coord4> (c);
}
-
+
case SLOT_USER_ICONS_VISIBILITY:
TYPE_CHECK (type_id == type_helper<bool>::id);
return close_box<bool> (visibility[3]);
@@ -643,7 +643,7 @@ qt_tm_widget_rep::write (slot s, blackbox
index, widget w) {
check_type_void (index, "SLOT_CANVAS");
QWidget* qw= ((qt_view_widget_rep*) w.rep)->view;
QWidget* old_canvas= tm_scrollarea()->takeWidget();
- tm_scrollarea()->setWidget (qw);
+ tm_scrollarea()->setWidget (qw);
(void) old_canvas;
// old_canvas will be deleted when the corresponding
qt_view_widget_rep is destroyed
qw->setFocusPolicy (Qt::StrongFocus);
@@ -673,7 +673,7 @@ qt_tm_widget_rep::write (slot s, blackbox
index, widget w) {
case SLOT_CONTEXT_ICONS:
check_type_void (index, "SLOT_CONTEXT_ICONS");
- {
+ {
QMenu* m= to_qmenu (w);
replaceButtons (contextToolBar, m);
delete m;
@@ -682,7 +682,7 @@ qt_tm_widget_rep::write (slot s, blackbox
index, widget w) {
case SLOT_USER_ICONS:
check_type_void (index, "SLOT_USER_ICONS");
- {
+ {
QMenu* m= to_qmenu (w);
replaceButtons (userToolBar, m);
delete m;
@@ -769,7 +769,7 @@ qt_window_widget_rep::send (slot s, blackbox
val) {
break;
case SLOT_NAME:
- {
+ {
check_type<string> (val, "SLOT_NAME");
string name = open_box<string> (val);
if (wid) wid->setWindowTitle (to_qstring (name));
Qt: Make sure closeEvent of windows is handled only through the
TeXmacs engine.
From: <>
---
src/src/Plugins/Qt/QTMWindow.cpp | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/src/src/Plugins/Qt/QTMWindow.cpp b/src/src/Plugins/Qt/
QTMWindow.cpp
index 42d79ca..1904022 100644
--- a/src/src/Plugins/Qt/QTMWindow.cpp
+++ b/src/src/Plugins/Qt/QTMWindow.cpp
@@ -20,8 +20,11 @@ void QTMWindow::closeEvent ( QCloseEvent *event )
if (DEBUG_EVENTS) cout << "CLOSE WINDOW" << LF;
qt_tm_widget_rep *wid = tm_widget ();
if (wid) {
+ // pass the close request on to TeXmacs and ignore
+ // the direct handling
wid -> quit ();
+ event -> ignore();
}
- QMainWindow::closeEvent (event);
+// QMainWindow::closeEvent (event);
}
Set SH_MenuBar_AltKeyNavigation to false. Typically this would be
the job of the style that is selected.
From: <>
However: That mechanism seems to be broken with some Qt versions.
Furthermore, the Alt key is heavily
used within TeXmacs, so the menubar navigation gets in the way
quite often.
---
src/src/Plugins/Qt/QTMStyle.cpp | 10 ++++++++++
src/src/Plugins/Qt/QTMStyle.hpp | 1 +
src/src/Plugins/Qt/qt_widget.cpp | 2 ++
3 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/src/src/Plugins/Qt/QTMStyle.cpp b/src/src/Plugins/Qt/
QTMStyle.cpp
index cd92b03..0e5a6de 100644
--- a/src/src/Plugins/Qt/QTMStyle.cpp
+++ b/src/src/Plugins/Qt/QTMStyle.cpp
@@ -174,6 +174,16 @@ QTMStyle::drawControl (ControlElement element,
const QStyleOption* option, QPain
}
#endif
+int
+QTMStyle::styleHint (StyleHint hint, const QStyleOption* option,
const QWidget* widget, QStyleHintReturn* returnData) const {
+ switch (hint) {
+ case SH_MenuBar_AltKeyNavigation:
+ return 0;
+ default:
+ return style->styleHint (hint, option, widget, returnData);
+ }
+}
+
QTMStyle*
qtmstyle () {
static QTMStyle* qtmstyle= NULL;
diff --git a/src/src/Plugins/Qt/QTMStyle.hpp b/src/src/Plugins/Qt/
QTMStyle.hpp
index 76aa010..612311c 100644
--- a/src/src/Plugins/Qt/QTMStyle.hpp
+++ b/src/src/Plugins/Qt/QTMStyle.hpp
@@ -60,6 +60,7 @@ public:
void drawPrimitive (PrimitiveElement element, const QStyleOption
*option, QPainter *painter, const QWidget *widget) const;
int pixelMetric (PixelMetric metric, const QStyleOption *opt,
const QWidget *widget) const;
// void drawControl (ControlElement element, const QStyleOption*
option, QPainter* painter, const QWidget* widget = 0) const;
+ int styleHint (StyleHint hint, const QStyleOption* option = 0,
const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const;
};
QTMStyle* qtmstyle ();
diff --git a/src/src/Plugins/Qt/qt_widget.cpp b/src/src/Plugins/Qt/
qt_widget.cpp
index 0637efd..8f9df2b 100755
--- a/src/src/Plugins/Qt/qt_widget.cpp
+++ b/src/src/Plugins/Qt/qt_widget.cpp
@@ -321,6 +321,8 @@ qt_tm_widget_rep::qt_tm_widget_rep(int mask,
command _quit):
QMainWindow* mw= tm_mainwindow ();
+ mw->setStyle (qtmstyle ());
+ mw->menuBar()->setStyle (qtmstyle ());
QScrollArea* sa= new QScrollArea (mw);
sa->setBackgroundRole (QPalette::Dark);
Prevent qt to pass on plain modifier key-events (like "C-", "Mod1-"
etc) to be passed on to TeXmacs.
From: <>
This used to cause "stuck" Alt keypresses to modify the next
keypress, even though the Alt key had
been released afterwards.
---
src/src/Plugins/Qt/QTMWidget.cpp | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/src/src/Plugins/Qt/QTMWidget.cpp b/src/src/Plugins/Qt/
QTMWidget.cpp
index 7dc2cfc..b0e72ff 100644
--- a/src/src/Plugins/Qt/QTMWidget.cpp
+++ b/src/src/Plugins/Qt/QTMWidget.cpp
@@ -309,6 +309,8 @@ QTMWidget::keyPressEvent (QKeyEvent* event) {
}
}
+ if (r == "") return;
+
#ifdef Q_WS_MAC
if (mods & Qt::MetaModifier) r= "C-" * r;
if (mods & Qt::ControlModifier) r= "Mod1-" * r;
@@ -321,7 +323,6 @@ QTMWidget::keyPressEvent (QKeyEvent* event) {
if (mods & Qt::MetaModifier) r= "Mod4-" * r;
#endif
- if (r == "") return;
if (DEBUG_EVENTS)
cout << "key press: " << r << LF;
//int start= texmacs_time ();
Fix handling of deadkeys in qt keymap
From: <>
---
src/src/Plugins/Qt/QTMWidget.cpp | 44 +++++++++++++++++++++++++
+------------
1 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/src/src/Plugins/Qt/QTMWidget.cpp b/src/src/Plugins/Qt/
QTMWidget.cpp
index b0e72ff..792595a 100644
--- a/src/src/Plugins/Qt/QTMWidget.cpp
+++ b/src/src/Plugins/Qt/QTMWidget.cpp
@@ -41,6 +41,7 @@ extern int time_credit;
extern int timeout_time;
hashmap<int,string> qtkeymap (0);
+hashmap<int,string> qtdeadmap (0);
inline void
scale (QPoint& point) {
@@ -51,6 +52,10 @@ inline void
map (int code, string name) {
qtkeymap(code) = name;
}
+inline void
+deadmap (int code, string name) {
+ qtdeadmap(code) = name;
+}
void
initkeymap () {
@@ -116,11 +121,11 @@ initkeymap () {
map (Qt::Key_Execute , "execute" );
map (Qt::Key_Help , "help" );
- map (Qt::Key_Dead_Acute , "acute");
- map (Qt::Key_Dead_Grave , "grave");
- map (Qt::Key_Dead_Diaeresis , "umlaut");
- map (Qt::Key_Dead_Circumflex, "hat");
- map (Qt::Key_Dead_Tilde , "tilde");
+ deadmap (Qt::Key_Dead_Acute , "acute");
+ deadmap (Qt::Key_Dead_Grave , "grave");
+ deadmap (Qt::Key_Dead_Diaeresis , "umlaut");
+ deadmap (Qt::Key_Dead_Circumflex, "hat");
+ deadmap (Qt::Key_Dead_Tilde , "tilde");
// map (0x0003 , "K-enter");
// map (Qt::Key_Begin , "begin" );
@@ -281,6 +286,8 @@ QTMWidget::keyPressEvent (QKeyEvent* event) {
if (qtkeymap->contains (key)) {
r = qtkeymap[key];
if (mods & Qt::ShiftModifier) r= "S-" * r;
+ } else if (qtdeadmap->contains (key)) {
+ r = qtdeadmap[key];
}
else {
QByteArray buf= nss.toUtf8();
@@ -296,17 +303,26 @@ QTMWidget::keyPressEvent (QKeyEvent* event) {
key= (int) (key + ((int) 'a') - ((int) 'A'));
r= string ((char) key);
}
+
else {
- if (unic == 168) r= "umlaut";
- if (unic == 96) {
- if ((mods & Qt::AltModifier) != 0) r= "grave";
- else r= "`";
- }
- if (unic == 180) r= "acute";
- if (unic == 710) r= "hat";
- if (unic == 732) r= "tilde";
flag= false;
+ switch(unic) {
+ case 168: r= "umlaut"; break;
+ case 96: if ((mods & Qt::AltModifier) != 0) r= "grave";
+ else r= "`";
+ break;
+ case 180: r= "acute"; break;
+ // the following combining characters should be caught by qtdeadmap
+ // case 0x300: r= "grave";
+ // case 0x301: r= "acute";
+ // case 0x302: r= "hat";
+ // case 0x308: r= "umlaut";
+ // case 0x33e: r= "tilde";
+ default:
+ flag= true;
+ }
}
+
}
if (r == "") return;
@@ -318,7 +334,7 @@ QTMWidget::keyPressEvent (QKeyEvent* event) {
if (flag && ((mods & Qt::AltModifier) != 0)) r= "Mod4-" * r;
#else
if (mods & Qt::ControlModifier) r= "C-" * r;
- if (mods & Qt::AltModifier) r= "Mod1-" * r;
+ if (flag && ((mods & Qt::AltModifier) != 0)) r= "Mod1-" * r;
//if (mods & Qt::KeypadModifier) r= "Mod3-" * r;
if (mods & Qt::MetaModifier) r= "Mod4-" * r;
#endif
Attempt to use Qt event loop
From: <>
---
src/src/Plugins/Qt/qt_gui.cpp | 24 +++++++++++++++---------
src/src/Plugins/Qt/qt_gui.hpp | 2 ++
2 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/src/src/Plugins/Qt/qt_gui.cpp b/src/src/Plugins/Qt/
qt_gui.cpp
index 3f34f32..c0ad8f9 100755
--- a/src/src/Plugins/Qt/qt_gui.cpp
+++ b/src/src/Plugins/Qt/qt_gui.cpp
@@ -49,6 +49,8 @@ qt_gui_rep::qt_gui_rep(int &argc, char **argv):
interrupted = false;
interrupt_time= texmacs_time ();
set_output_language (get_locale_language ());
+ gui_helper = new QTMGuiHelper(this);
+ qApp -> installEventFilter (gui_helper);
// (void) default_font ();
}
@@ -70,6 +72,7 @@ qt_gui_rep::get_max_size (SI& width, SI& height) {
qt_gui_rep::~qt_gui_rep() {
+ delete gui_helper;
}
/
******************************************************************************
@@ -187,6 +190,14 @@ qt_gui_rep::update () {
void
qt_gui_rep::event_loop () {
QApplication *app = (QApplication*) QApplication::instance();
+
+ QTimer *timer = new QTimer( gui_helper );
+ QObject::connect( timer, SIGNAL(timeout()), gui_helper,
SLOT(doUpdate()) );
+ timer->start(0); // 0 ms - call immediately when all other
events have been processed
+
+ app->exec();
+ delete timer;
+/*
QTimer t (NULL);
t.start (25);
@@ -203,24 +214,19 @@ qt_gui_rep::event_loop () {
}
//FIXME: QCoreApplication sends aboutToQuit signal before
exiting...
app->sendPostedEvents (0, QEvent::DeferredDelete);
+*/
}
/
******************************************************************************
* Main routines
******************************************************************************/
-QTMGuiHelper *gui_helper;
-
void
gui_open (int& argc, char** argv) {
// start the gui
// new QApplication (argc,argv); now in texmacs.cpp
the_gui = tm_new<qt_gui_rep> (argc, argv);
-
- gui_helper = new QTMGuiHelper (the_gui);
- qApp -> installEventFilter (gui_helper);
-
}
void
@@ -272,7 +278,7 @@ QTMGuiHelper::eventFilter (QObject *obj, QEvent
*event) {
const char *s = openEvent->file().toAscii().constData();
qDebug ("File Open Event %s", s);
call ("texmacs-load-buffer", object(url_system (s)),
object("generic"), object(1), object(false));
-
+
return true;
} else {
// standard event processing
@@ -295,9 +301,9 @@ set_default_font (string name) {
font
get_default_font (bool tt) {
- (void) tt;
+ (void) tt;
// get the default font or monospaced font (if tt is true)
-
+
// return a null font since this function is not called in the Qt
port.
if (DEBUG_EVENTS) cout << "get_default_font(): SHOULD NOT BE
CALLED\n";
return NULL;
diff --git a/src/src/Plugins/Qt/qt_gui.hpp b/src/src/Plugins/Qt/
qt_gui.hpp
index 284339f..e7fd1d0 100755
--- a/src/src/Plugins/Qt/qt_gui.hpp
+++ b/src/src/Plugins/Qt/qt_gui.hpp
@@ -27,6 +27,7 @@
* The qt_gui class
******************************************************************************/
+class QTMGuiHelper;
typedef class qt_gui_rep* qt_gui;
extern qt_gui the_gui;
@@ -35,6 +36,7 @@ public:
bool interrupted;
time_t interrupt_time;
+ QTMGuiHelper *gui_helper;
char* selection;
hashmap<string,tree> selection_t;
Various changes
From: <>
---
src/src/Plugins/Qt/qt_gui.cpp | 14 ++++++++------
src/src/Plugins/Qt/qt_gui.hpp | 1 +
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/src/Plugins/Qt/qt_gui.cpp b/src/src/Plugins/Qt/
qt_gui.cpp
index c0ad8f9..3e77db6 100755
--- a/src/src/Plugins/Qt/qt_gui.cpp
+++ b/src/src/Plugins/Qt/qt_gui.cpp
@@ -31,7 +31,7 @@ extern window (*get_current_window) (void);
qt_gui_rep* the_gui= NULL;
int nr_windows = 0; // FIXME: fake variable, referenced in tm_server
-bool qt_update_flag= false;
+bool qt_update_flag = false;
int time_credit;
int timeout_time;
@@ -51,6 +51,9 @@ qt_gui_rep::qt_gui_rep(int &argc, char **argv):
set_output_language (get_locale_language ());
gui_helper = new QTMGuiHelper(this);
qApp -> installEventFilter (gui_helper);
+ updatetimer = new QTimer( gui_helper );
+ updatetimer->setSingleShot(true);
+ QObject::connect( updatetimer, SIGNAL(timeout()), gui_helper,
SLOT(doUpdate()) );
// (void) default_font ();
}
@@ -73,6 +76,7 @@ qt_gui_rep::get_max_size (SI& width, SI& height) {
qt_gui_rep::~qt_gui_rep() {
delete gui_helper;
+ delete updatetimer;
}
/
******************************************************************************
@@ -191,12 +195,9 @@ void
qt_gui_rep::event_loop () {
QApplication *app = (QApplication*) QApplication::instance();
- QTimer *timer = new QTimer( gui_helper );
- QObject::connect( timer, SIGNAL(timeout()), gui_helper,
SLOT(doUpdate()) );
- timer->start(0); // 0 ms - call immediately when all other
events have been processed
+ updatetimer->start(); // 0 ms - call immediately when all other
events have been processed
app->exec();
- delete timer;
/*
QTimer t (NULL);
t.start (25);
@@ -358,7 +359,8 @@ beep () {
void
needs_update () {
- qt_update_flag= true;
+ qt_update_flag = true;
+ the_gui->updatetimer->start();
}
bool
diff --git a/src/src/Plugins/Qt/qt_gui.hpp b/src/src/Plugins/Qt/
qt_gui.hpp
index e7fd1d0..fa4de0b 100755
--- a/src/src/Plugins/Qt/qt_gui.hpp
+++ b/src/src/Plugins/Qt/qt_gui.hpp
@@ -37,6 +37,7 @@ public:
time_t interrupt_time;
QTMGuiHelper *gui_helper;
+ QTimer *updatetimer;
char* selection;
hashmap<string,tree> selection_t;
Call needs_update after issuing commands
From: <>
---
src/src/Plugins/Qt/QTMMenuHelper.hpp | 3 ++-
src/src/Plugins/Qt/QTMWindow.cpp | 2 ++
2 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/src/src/Plugins/Qt/QTMMenuHelper.hpp b/src/src/Plugins/
Qt/QTMMenuHelper.hpp
index 3369c1d..f3f1f95 100644
--- a/src/src/Plugins/Qt/QTMMenuHelper.hpp
+++ b/src/src/Plugins/Qt/QTMMenuHelper.hpp
@@ -12,6 +12,7 @@
#ifndef QTMMENUHELPER_HPP
#define QTMMENUHELPER_HPP
+#include "gui.hpp"
#include "message.hpp"
#include "promise.hpp"
#include <QObject>
@@ -28,7 +29,7 @@ public:
public slots:
inline void apply() {
- if (!is_nil(cmd)) cmd->apply(); }
+ if (!is_nil(cmd)) cmd->apply(); needs_update(); }
};
class QTMLazyMenu: public QMenu {
diff --git a/src/src/Plugins/Qt/QTMWindow.cpp b/src/src/Plugins/Qt/
QTMWindow.cpp
index 1904022..adfa3c9 100644
--- a/src/src/Plugins/Qt/QTMWindow.cpp
+++ b/src/src/Plugins/Qt/QTMWindow.cpp
@@ -12,6 +12,7 @@
#include <QtGui>
#include "QTMWindow.hpp"
+#include "gui.hpp"
#include <QEvent>
@@ -23,6 +24,7 @@ void QTMWindow::closeEvent ( QCloseEvent *event )
// pass the close request on to TeXmacs and ignore
// the direct handling
wid -> quit ();
+ needs_update();
event -> ignore();
}
// QMainWindow::closeEvent (event);
Repeatedly call updatetimer every 500ms
From: <>
---
src/src/Plugins/Qt/qt_gui.cpp | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/src/Plugins/Qt/qt_gui.cpp b/src/src/Plugins/Qt/
qt_gui.cpp
index 3e77db6..f2a99d5 100755
--- a/src/src/Plugins/Qt/qt_gui.cpp
+++ b/src/src/Plugins/Qt/qt_gui.cpp
@@ -195,7 +195,7 @@ void
qt_gui_rep::event_loop () {
QApplication *app = (QApplication*) QApplication::instance();
- updatetimer->start(); // 0 ms - call immediately when all other
events have been processed
+ updatetimer->start(0); // 0 ms - call immediately when all other
events have been processed
app->exec();
/*
@@ -270,6 +270,10 @@ gui_refresh () {
void
QTMGuiHelper::doUpdate() {
gui->update();
+ int interval = gui->updatetimer->interval() + 5;
+ if(interval > 1000) interval = 1000;
+ if(qt_update_flag) interval = 0;
+ gui->updatetimer->start(interval);
}
bool
@@ -360,7 +364,7 @@ beep () {
void
needs_update () {
qt_update_flag = true;
- the_gui->updatetimer->start();
+ the_gui->updatetimer->start(0);
}
bool
Fix the call to postponedUpdate for the new event loop
From: <>
---
src/src/Plugins/Qt/QTMWidget.cpp | 23 +++++++++++------------
1 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/src/src/Plugins/Qt/QTMWidget.cpp b/src/src/Plugins/Qt/
QTMWidget.cpp
index 792595a..1fee52f 100644
--- a/src/src/Plugins/Qt/QTMWidget.cpp
+++ b/src/src/Plugins/Qt/QTMWidget.cpp
@@ -150,6 +150,14 @@ initkeymap () {
void
QTMWidget::postponedUpdate () {
+#ifdef Q_WS_MAC
+ //FIXME: the call to update(rect) is ignored sometimes (usually
in long documents).
+ // It is a confirmed Qt/Mac bug (#251792). See
+ //
http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=251792
+ // This is a workaround for the update(rect) bug. Mac
specific.
+ update();
+ delayed_rects= list<QRect>();
+#else
while (!is_nil (delayed_rects)) {
QRect rect = delayed_rects->item;
if (DEBUG_EVENTS) {
@@ -158,23 +166,15 @@ QTMWidget::postponedUpdate () {
<< "," << rect.width()
<< "," << rect.height() << ")\n" ;
}
- //FIXME: the call below to update is ignored sometimes
(usually in long documents).
- // It is a confirmed Qt/Mac bug (#251792). See
- //
http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=251792
-#ifdef Q_WS_MAC
- //FIXME: This is a workaround for the update(rect) bug. Mac
specific.
- update();
-#else
update (rect);
-#endif
delayed_rects= delayed_rects->next;
}
+#endif
}
void
QTMWidget::paintEvent (QPaintEvent* event) {
QRect rect = event->rect ();
- bool partial_redraw = false;
if (DEBUG_EVENTS) {
QPainter p(this);
@@ -229,7 +229,6 @@ QTMWidget::paintEvent (QPaintEvent* event) {
if (DEBUG_EVENTS)
cout << "Interrupted\n";
qt_update_flag= true;
- partial_redraw = true;
}
r->end();
@@ -238,12 +237,12 @@ QTMWidget::paintEvent (QPaintEvent* event) {
//int end= texmacs_time ();
//if (end > start) cout << "Repaint " << end - start << "\n";
}
- if (partial_redraw)
+ if (qt_update_flag)
{
if (DEBUG_EVENTS)
cout << "Postponed redrawing\n";
delayed_rects= list<QRect> (rect, delayed_rects);
- QTimer::singleShot (1, this, SLOT (postponedUpdate ()));
+ QTimer::singleShot (0, this, SLOT (postponedUpdate ()));
}
}
Correct handling of QClipboard
From: <>
---
src/src/Plugins/Qt/qt_gui.cpp | 61 ++++++++++++++++++++++++
+----------------
1 files changed, 37 insertions(+), 24 deletions(-)
diff --git a/src/src/Plugins/Qt/qt_gui.cpp b/src/src/Plugins/Qt/
qt_gui.cpp
index f2a99d5..ddfb497 100755
--- a/src/src/Plugins/Qt/qt_gui.cpp
+++ b/src/src/Plugins/Qt/qt_gui.cpp
@@ -85,17 +85,30 @@ qt_gui_rep::~qt_gui_rep() {
bool
qt_gui_rep::get_selection (string key, tree& t, string& s) {
- t= "none";
+ QClipboard *cb= QApplication::clipboard();
+ bool owns= true;
+ QClipboard::Mode mode;
+ if (key == "primary") {
+ owns= cb->ownsClipboard();
+ mode= QClipboard::Clipboard;
+ } else if (key == "mouse" && cb->supportsSelection()) {
+ owns= cb->ownsSelection();
+ mode= QClipboard::Selection;
+ }
+
s= "";
- if (selection_t->contains (key)) {
- t= copy (selection_t [key]);
- s= copy (selection_s [key]);
- return true;
+ t= "none";
+
+ if(owns) {
+ if (selection_t->contains (key)) {
+ t= copy (selection_t [key]);
+ s= copy (selection_s [key]);
+ return true;
+ }
+ return false;
}
- if (key != "primary") return false;
- QClipboard *clipboard = QApplication::clipboard();
- QString originalText = clipboard->text();
+ QString originalText = cb->text(mode);
QByteArray buf = originalText.toAscii();
if (!(buf.isEmpty())) {
s << string(buf.constData(), buf.size());
@@ -109,19 +122,18 @@ bool
qt_gui_rep::set_selection (string key, tree t, string s) {
selection_t (key)= copy (t);
selection_s (key)= copy (s);
- if (key == "primary") {
- //if (is_nil (windows_l)) return false;
- //Window win= windows_l->item;
- if (selection != NULL) tm_delete_array (selection);
- //XSetSelectionOwner (dpy, XA_PRIMARY, win, CurrentTime);
- //if (XGetSelectionOwner(dpy, XA_PRIMARY)==None) return false;
- selection= as_charp (s);
- QClipboard *clipboard = QApplication::clipboard();
- QString originalText = clipboard->text();
+ QClipboard *cb = QApplication::clipboard();
- clipboard->setText(selection);
- }
+ QClipboard::Mode mode;
+ if (key == "primary")
+ mode=QClipboard::Clipboard;
+ else if (key == "mouse" && cb->supportsSelection())
+ mode=QClipboard::Selection;
+ else
+ return true;
+
+ cb->setText(QString::fromAscii(as_charp(s)),mode);
return true;
}
@@ -129,11 +141,12 @@ void
qt_gui_rep::clear_selection (string key) {
selection_t->reset (key);
selection_s->reset (key);
- if ((key == "primary") && (selection != NULL)) {
- tm_delete_array (selection);
- // FIXME: should we do something with the pasteboard?
- selection= NULL;
- }
+
+ QClipboard *cb = QApplication::clipboard();
+ if (key == "primary")
+ cb->clear(QClipboard::Clipboard);
+ else if (key == "mouse" && cb->supportsSelection())
+ cb->clear(QClipboard::Selection);
}
/
******************************************************************************
Fix color computation in qt drawing of glyphs
From: <>
---
src/src/Plugins/Qt/qt_renderer.cpp | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/src/Plugins/Qt/qt_renderer.cpp b/src/src/Plugins/
Qt/qt_renderer.cpp
index c5e3b49..9e09bec 100755
--- a/src/src/Plugins/Qt/qt_renderer.cpp
+++ b/src/src/Plugins/Qt/qt_renderer.cpp
@@ -357,7 +357,7 @@ qt_renderer_rep::draw (int c, font_glyphs fng,
SI x, SI y) {
for (j=0; j<h; j++)
for (i=0; i<w; i++) {
int col = gl->get_x (i, j);
- brush.setColor (QColor (r, g, b, (255*col)/(nr_cols+1)));
+ brush.setColor (QColor (r, g, b, (255*col)/nr_cols));
pp.fillRect (i, j, 1, 1, brush);
}
pp.end();
@@ -376,7 +376,7 @@ qt_renderer_rep::draw (int c, font_glyphs fng,
SI x, SI y) {
for (j=0; j<h; j++)
for (i=0; i<w; i++) {
int col = gl->get_x (i, j);
- im->setPixel (i, j, qRgba (r, g, b, (255*col)/(nr_cols
+1)));
+ im->setPixel (i, j, qRgba (r, g, b, (255*col)/nr_cols));
}
}
#endif
Enable smooth rendering for images
From: <>
---
src/src/Plugins/Qt/qt_renderer.cpp | 8 ++------
1 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/src/src/Plugins/Qt/qt_renderer.cpp b/src/src/Plugins/
Qt/qt_renderer.cpp
index 9e09bec..26e7ca4 100755
--- a/src/src/Plugins/Qt/qt_renderer.cpp
+++ b/src/src/Plugins/Qt/qt_renderer.cpp
@@ -253,9 +253,6 @@ qt_renderer_rep::image (url u, SI w, SI h, SI
x, SI y,
w= w/pixel; h= h/pixel;
decode (x, y);
- //painter.setRenderHints (0);
- //painter.drawRect (QRect (x, y-h, w, h));
-
QImage *pm = NULL;
tree lookup= tuple (u->t);
lookup << as_string (w ) << as_string (h )
@@ -275,7 +272,7 @@ qt_renderer_rep::image (url u, SI w, SI h, SI
x, SI y,
#ifdef MACOSX_EXTENSIONS
mac_image_to_png (u, temp);
#else
- system ("convert", u, temp);
+ system ("convert -background white -flatten", u, temp);
#endif
pm= new QImage (to_qstring (as_string (temp)));
remove (temp);
@@ -299,8 +296,7 @@ qt_renderer_rep::image (url u, SI w, SI h, SI
x, SI y,
int ww= x2 - x1;
int hh= y2 - y1;
- painter.setRenderHints (0);
- //painter.setRenderHints (QPainter::SmoothPixmapTransform);
+ painter.setRenderHints (QPainter::SmoothPixmapTransform);
painter.drawImage (QRect (x, y-h, w, h), *pm, QRect (x1, hh-y2,
ww, hh));
};
_______________________________________________
Texmacs-dev mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/texmacs-dev
_______________________________________________
Texmacs-dev mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/texmacs-dev