#include <config.h>
+// Too hard to make concept checks work with this file
+#ifdef _GLIBCPP_CONCEPT_CHECKS
+#undef _GLIBCPP_CONCEPT_CHECKS
+#endif
+
#include "GWorkArea.h"
#include "GView.h"
#include "GtkmmX.h"
#include "funcrequest.h"
#include "LColor.h"
+using boost::shared_ptr;
+
using std::string;
namespace lyx {
namespace frontend {
-ColorCache colorCache;
-
+namespace {
+
+mouse_button::state gButtonToLyx(guint gdkbutton)
+{
+ // GDK uses int 1,2,3 but lyx uses enums (1,2,4)
+ switch (gdkbutton) {
+ case 1:
+ return mouse_button::button1;
+ case 2:
+ return mouse_button::button2;
+ case 3:
+ return mouse_button::button3;
+ case 4:
+ return mouse_button::button4;
+ case 5:
+ return mouse_button::button5;
+ }
-ColorCache::~ColorCache()
-{
- clear();
+ // This shouldn't happen, according to gdk docs
+ lyxerr << "gButtonToLyx: unhandled button index\n";
+ return mouse_button::button1;
}
+} // namespace anon
+
+ColorCache colorCache;
Gdk::Color * ColorCache::getColor(LColor_color clr)
{
MapIt it = cache_.find(clr);
- return it == cache_.end() ? 0 : it->second;
+ return it == cache_.end() ? 0 : it->second.get();
}
XftColor * ColorCache::getXftColor(LColor_color clr)
{
MapIt2 it = cache2_.find(clr);
- return it == cache2_.end() ? 0 : it->second;
+ return it == cache2_.end() ? 0 : it->second.get();
}
void ColorCache::cacheColor(LColor_color clr, Gdk::Color * gclr)
{
- cache_[clr] = gclr;
+ cache_[clr] = shared_ptr<Gdk::Color>(gclr);
}
void ColorCache::cacheXftColor(LColor_color clr, XftColor * xclr)
{
- cache2_[clr] = xclr;
+ cache2_[clr] = shared_ptr<XftColor>(xclr);
}
void ColorCache::clear()
{
- MapIt it = cache_.begin();
- for (; it != cache_.end(); ++it)
- delete it->second;
cache_.clear();
- MapIt2 it2 = cache2_.begin();
- for (; it2 != cache2_.end(); ++it2)
- delete it2->second;
cache2_.clear();
}
adjustment->changed();
return;
}
- adjustment->set_step_increment(line_height);
+ adjustment->set_step_increment(line_height * 3);
adjustment->set_page_increment(workAreaHeight - line_height);
- adjustment->set_upper(height);
+ // Allow the user half a screen of blank at the end
+ // to make scrollbar consistant with centering the cursor
+ adjustment->set_upper(height + workAreaHeight / 2);
adjustment->set_page_size(workAreaHeight);
adjustment->set_value(pos);
adjustment->changed();
if (event->direction == GDK_SCROLL_UP)
step *= -1.0f;
- adjustment->set_value(adjustment->get_value() + step);
+ double target = adjustment->get_value() + step;
+ // Prevent the user getting a whole screen of blank when they
+ // try to scroll past the end of the doc
+ double max = adjustment->get_upper() - workHeight();
+ if (target > max)
+ target = max;
+ adjustment->set_value(target);
return true;
}
dispatch(FuncRequest(ka,
static_cast<int>(event->x),
static_cast<int>(event->y),
- static_cast<mouse_button::state>(event->button)));
+ gButtonToLyx(event->button)));
workArea_.grab_focus();
return true;
}
dispatch(FuncRequest(LFUN_MOUSE_RELEASE,
static_cast<int>(event->x),
static_cast<int>(event->y),
- static_cast<mouse_button::state>(event->button)));
+ gButtonToLyx(event->button)));
return true;
}