@@ -60,8 +60,8 @@ static std::map<std::pair<ScrollView *, SVEventType>,
6060 std::pair<SVSemaphore *, std::unique_ptr<SVEvent>>> waiting_for_events;
6161static std::mutex *waiting_for_events_mu;
6262
63- SVEvent * SVEvent::copy () const {
64- auto * any = new SVEvent;
63+ std::unique_ptr< SVEvent> SVEvent::copy () const {
64+ auto any = std::unique_ptr<SVEvent>( new SVEvent) ;
6565 any->command_id = command_id;
6666 any->counter = counter;
6767 any->parameter = new char [strlen (parameter) + 1 ];
@@ -319,38 +319,32 @@ void ScrollView::Initialize(const char *name, int x_pos, int y_pos, int x_size,
319319
320320// / Sits and waits for events on this window.
321321void ScrollView::StartEventHandler () {
322- SVEvent *new_event;
323-
324322 for (;;) {
325323 stream_->Flush ();
326324 semaphore_->Wait ();
327- new_event = nullptr ;
328325 int serial = -1 ;
329326 int k = -1 ;
330327 mutex_.lock ();
331328 // Check every table entry if it is valid and not already processed.
332329
333330 for (int i = 0 ; i < SVET_COUNT; i++) {
334331 if (event_table_[i] != nullptr && (serial < 0 || event_table_[i]->counter < serial)) {
335- new_event = event_table_[i];
336332 serial = event_table_[i]->counter ;
337333 k = i;
338334 }
339335 }
340336 // If we didn't find anything we had an old alarm and just sleep again.
341- if (new_event != nullptr ) {
342- event_table_[k] = nullptr ;
337+ if (k != - 1 ) {
338+ auto new_event = std::move ( event_table_[k]) ;
343339 mutex_.unlock ();
344340 if (event_handler_ != nullptr ) {
345- event_handler_->Notify (new_event);
341+ event_handler_->Notify (new_event. get () );
346342 }
347343 if (new_event->type == SVET_DESTROY) {
348344 // Signal the destructor that it is safe to terminate.
349345 event_handler_ended_ = true ;
350- delete new_event; // Delete the pointer after it has been processed.
351346 return ;
352347 }
353- delete new_event; // Delete the pointer after it has been processed.
354348 } else {
355349 mutex_.unlock ();
356350 }
@@ -382,9 +376,6 @@ ScrollView::~ScrollView() {
382376 }
383377 delete semaphore_;
384378 delete points_;
385- for (auto &i : event_table_) {
386- delete i;
387- }
388379#endif // !GRAPHICS_DISABLED
389380}
390381
@@ -424,18 +415,15 @@ void ScrollView::Signal() {
424415
425416void ScrollView::SetEvent (const SVEvent *svevent) {
426417 // Copy event
427- SVEvent * any = svevent->copy ();
428- SVEvent * specific = svevent->copy ();
418+ auto any = svevent->copy ();
419+ auto specific = svevent->copy ();
429420 any->counter = specific->counter + 1 ;
430421
431422 // Place both events into the queue.
432423 std::lock_guard<std::mutex> guard (mutex_);
433- // Delete the old objects..
434- delete event_table_[specific->type ];
435- delete event_table_[SVET_ANY];
436- // ...and put the new ones in the table.
437- event_table_[specific->type ] = specific;
438- event_table_[SVET_ANY] = any;
424+
425+ event_table_[specific->type ] = std::move (specific);
426+ event_table_[SVET_ANY] = std::move (any);
439427}
440428
441429// / Block until an event of the given type is received.
0 commit comments