B_NORMAL_WINDOW_FEEL, B_NO_SERVER_SIDE_WINDOW_MODIFIERS)
{
window_id = current_window_id++;
+
+ /* This pulse rate is used by scroll bars for repeating a button
+ action while a button is held down. */
+ SetPulseRate (30000);
}
~EmacsWindow ()
BScrollBar::MessageReceived (msg);
}
+ void
+ Pulse (void)
+ {
+ struct haiku_scroll_bar_part_event rq;
+ BPoint point;
+ uint32 buttons;
+
+ if (!dragging)
+ {
+ SetFlags (Flags () & ~B_PULSE_NEEDED);
+ return;
+ }
+
+ GetMouse (&point, &buttons, false);
+
+ if (ButtonRegionFor (current_part).Contains (point))
+ {
+ rq.scroll_bar = this;
+ rq.window = Window ();
+ rq.part = current_part;
+ haiku_write (SCROLL_BAR_PART_EVENT, &rq);
+ }
+
+ BScrollBar::Pulse ();
+ }
+
void
ValueChanged (float new_value)
{
struct haiku_scroll_bar_value_event rq;
- struct haiku_scroll_bar_part_event part;
new_value = Value ();
if (dragging > 1)
{
SetValue (old_value);
-
- part.scroll_bar = this;
- part.window = Window ();
- part.part = current_part;
- haiku_write (SCROLL_BAR_PART_EVENT, &part);
+ SetFlags (Flags () | B_PULSE_NEEDED);
}
else
dragging++;
dragging = 1;
current_part = HAIKU_SCROLL_BAR_DOWN_BUTTON;
+ if (Value () == max_value)
+ {
+ SetFlags (Flags () | B_PULSE_NEEDED);
+ dragging = 2;
+ }
+
haiku_write (SCROLL_BAR_PART_EVENT, &part);
goto out;
}
rq.window = Window ();
haiku_write (SCROLL_BAR_DRAG_EVENT, &rq);
- dragging = false;
+ dragging = 0;
BScrollBar::MouseUp (pt);
}