Scroom  0.14
callbacks.cc File Reference
#include "callbacks.hh"
#include <cstdlib>
#include <list>
#include <map>
#include <string>
#include <fmt/core.h>
#include <spdlog/spdlog.h>
#include <boost/scoped_array.hpp>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <cairo.h>
#include <scroom/assertions.hh>
#include <scroom/bookkeeping.hh>
#include "loader.hh"
#include "pluginmanager.hh"
#include "view.hh"
#include "workinterface.hh"
Include dependency graph for callbacks.cc:

Typedefs

using Views = std::map< View::Ptr, Scroom::Bookkeeping::Token >
 

Functions

void ShowModalDialog (const std::string &message)
 
void on_scroom_hide (GtkWidget *, gpointer user_data)
 
void on_new_activate (GtkMenuItem *, gpointer user_data)
 
gboolean combinedFileFilter (const GtkFileFilterInfo *filter_info, gpointer data)
 
void on_open_activate (GtkMenuItem *, gpointer user_data)
 
void on_save_activate (GtkMenuItem *, gpointer)
 
void on_save_as_activate (GtkMenuItem *, gpointer)
 
void on_quit_activate (GtkMenuItem *, gpointer)
 
void on_cut_activate (GtkMenuItem *, gpointer)
 
void on_copy_activate (GtkMenuItem *, gpointer)
 
void on_paste_activate (GtkMenuItem *, gpointer)
 
void on_delete_activate (GtkMenuItem *, gpointer)
 
void on_fullscreen_activate (GtkMenuItem *item, gpointer user_data)
 
void on_close_activate (GtkMenuItem *, gpointer user_data)
 
void on_about_activate (GtkMenuItem *, gpointer)
 
gboolean on_drawingarea_expose_event (GtkWidget *widget, GdkEventExpose *, gpointer user_data)
 
gboolean on_drawingarea_configure_event (GtkWidget *, GdkEventConfigure *, gpointer user_data)
 
gboolean on_idle (gpointer user_data)
 
void on_done_loading_plugins ()
 
void on_zoombox_changed (GtkComboBox *, gpointer user_data)
 
void on_textbox_value_changed (GtkEditable *editable, gpointer user_data)
 
void on_scrollbar_value_changed (GtkAdjustment *adjustment, gpointer user_data)
 
gboolean on_button_press_event (GtkWidget *, GdkEventButton *event, gpointer user_data)
 
gboolean on_button_release_event (GtkWidget *, GdkEventButton *event, gpointer user_data)
 
gboolean on_motion_notify_event (GtkWidget *, GdkEventMotion *event, gpointer user_data)
 
gboolean on_scroll_event (GtkWidget *, GdkEventScroll *event, gpointer user_data)
 
bool in_devmode ()
 
void on_scroom_bootstrap (const FileNameMap &newFilenames)
 
void on_scroom_terminating ()
 
void find_or_create_scroom (const PresentationInterface::Ptr &presentation)
 
void onDragDataReceived (GtkWidget *, GdkDragContext *, int, int, GtkSelectionData *seldata, guint, guint, gpointer)
 
void create_scroom (const PresentationInterface::Ptr &presentation)
 
void on_newPresentationInterfaces_update (const std::map< NewPresentationInterface::Ptr, std::string > &newPresentationInterfaces)
 
void on_presentation_created (const PresentationInterface::Ptr &presentation)
 
void on_view_created (const View::Ptr &v)
 
void on_presentation_added_to_view (const View::Ptr &v)
 
void on_presentation_possibly_destroyed ()
 
void on_view_destroyed (View *v)
 
void on_new_presentationobserver (const PresentationObserver::Ptr &po)
 
void on_new_viewobserver (const ViewObserver::Ptr &viewObserver)
 

Variables

static const std::string SCROOM_DEV_MODE = "SCROOM_DEV_MODE"
 
const std::string REGULAR_FILES = "Regular files"
 
static std::string xmlFileName
 
static GtkBuilder * aboutDialogXml = nullptr
 
static GtkWidget * aboutDialog = nullptr
 
static Views views
 
static std::list< PresentationInterface::WeakPtrpresentations
 
static FileNameMap filenames
 
static std::string currentFolder
 

Typedef Documentation

◆ Views

Function Documentation

◆ combinedFileFilter()

gboolean combinedFileFilter ( const GtkFileFilterInfo *  filter_info,
gpointer  data 
)
95 {
96  // Convert the data back to a filter vector
97  auto* filters = static_cast<std::vector<GtkFileFilter*>*>(data);
98 
99  // Return true if any of the filters matches the filter_info
100  for(const auto& f: *filters)
101  {
102  if(gtk_file_filter_filter(f, filter_info))
103  {
104  return true;
105  }
106  }
107 
108  // None of the filters matched
109  return false;
110 }

Referenced by on_open_activate().

Here is the caller graph for this function:

◆ create_scroom()

void create_scroom ( const PresentationInterface::Ptr presentation)
538 {
539  GtkBuilder* xml = gtk_builder_new();
540  boost::scoped_array<char*> const obj{new gchar*[2]};
541  const std::string str = "scroom";
542  obj[0] = const_cast<char*>(str.c_str());
543  obj[1] = nullptr;
544  gtk_builder_add_objects_from_file(xml, xmlFileName.c_str(), obj.get(), nullptr);
545 
546  if(xml == nullptr)
547  {
548  spdlog::error("Opening xml failed");
549  exit(-1); // NOLINT(concurrency-mt-unsafe)
550  }
551 
552  View::Ptr const view = View::create(xml, presentation);
553  on_view_created(view);
554  if(presentation)
555  {
557  }
558 
559  GtkWidget* scroom = GTK_WIDGET(gtk_builder_get_object(xml, "scroom"));
560  GtkWidget* openMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "open"));
561  GtkWidget* closeMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "close"));
562  GtkWidget* quitMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "quit"));
563  GtkWidget* fullScreenMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "fullscreen_menu_item"));
564  GtkWidget* aboutMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "about"));
565  GtkWidget* drawingArea = GTK_WIDGET(gtk_builder_get_object(xml, "drawingarea"));
566  GtkWidget* zoomBox = GTK_WIDGET(gtk_builder_get_object(xml, "zoomboxcombo"));
567  GtkWidget* vscrollbar = GTK_WIDGET(gtk_builder_get_object(xml, "vscrollbar"));
568  GtkWidget* hscrollbar = GTK_WIDGET(gtk_builder_get_object(xml, "hscrollbar"));
569  GtkAdjustment* vscrollbaradjustment = gtk_range_get_adjustment(GTK_RANGE(vscrollbar));
570  GtkAdjustment* hscrollbaradjustment = gtk_range_get_adjustment(GTK_RANGE(hscrollbar));
571  GtkEditable* xTextBox = GTK_EDITABLE(GTK_WIDGET(gtk_builder_get_object(xml, "x_textbox")));
572  GtkEditable* yTextBox = GTK_EDITABLE(GTK_WIDGET(gtk_builder_get_object(xml, "y_textbox")));
573 
574  g_signal_connect(static_cast<gpointer>(scroom), "hide", G_CALLBACK(on_scroom_hide), view.get());
575  g_signal_connect(static_cast<gpointer>(closeMenuItem), "activate", G_CALLBACK(on_close_activate), view.get());
576  g_signal_connect(static_cast<gpointer>(quitMenuItem), "activate", G_CALLBACK(on_quit_activate), view.get());
577  g_signal_connect(static_cast<gpointer>(openMenuItem), "activate", G_CALLBACK(on_open_activate), scroom);
578  g_signal_connect(static_cast<gpointer>(fullScreenMenuItem), "activate", G_CALLBACK(on_fullscreen_activate), view.get());
579  g_signal_connect(static_cast<gpointer>(zoomBox), "changed", G_CALLBACK(on_zoombox_changed), view.get());
580  g_signal_connect(
581  static_cast<gpointer>(vscrollbaradjustment), "value-changed", G_CALLBACK(on_scrollbar_value_changed), view.get());
582  g_signal_connect(
583  static_cast<gpointer>(hscrollbaradjustment), "value-changed", G_CALLBACK(on_scrollbar_value_changed), view.get());
584  g_signal_connect(static_cast<gpointer>(xTextBox), "changed", G_CALLBACK(on_textbox_value_changed), view.get());
585  g_signal_connect(static_cast<gpointer>(yTextBox), "changed", G_CALLBACK(on_textbox_value_changed), view.get());
586  // g_signal_connect ((gpointer) cut, "activate",
587  // G_CALLBACK (on_cut_activate),
588  // view.get());
589  // g_signal_connect ((gpointer) copy, "activate",
590  // G_CALLBACK (on_copy_activate),
591  // view.get());
592  // g_signal_connect ((gpointer) paste, "activate",
593  // G_CALLBACK (on_paste_activate),
594  // view.get());
595  // g_signal_connect ((gpointer) delete, "activate",
596  // G_CALLBACK (on_delete_activate),
597  // view.get());
598  g_signal_connect(static_cast<gpointer>(aboutMenuItem), "activate", G_CALLBACK(on_about_activate), view.get());
599  g_signal_connect(static_cast<gpointer>(drawingArea), "draw", G_CALLBACK(on_drawingarea_expose_event), view.get());
600  g_signal_connect(static_cast<gpointer>(drawingArea), "configure_event", G_CALLBACK(on_drawingarea_configure_event), view.get());
601  g_signal_connect(static_cast<gpointer>(drawingArea), "button-press-event", G_CALLBACK(on_button_press_event), view.get());
602  g_signal_connect(static_cast<gpointer>(drawingArea), "button-release-event", G_CALLBACK(on_button_release_event), view.get());
603  g_signal_connect(static_cast<gpointer>(drawingArea), "scroll-event", G_CALLBACK(on_scroll_event), view.get());
604  g_signal_connect(static_cast<gpointer>(drawingArea), "motion-notify-event", G_CALLBACK(on_motion_notify_event), view.get());
605 
606  char uriList[] = "text/uri-list";
607  GtkTargetEntry targets[] = {{uriList, 0, 0}};
608  gtk_drag_dest_set(
609  scroom, GTK_DEST_DEFAULT_ALL, targets, 1, static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK));
610 
611  g_signal_connect(static_cast<gpointer>(scroom), "drag_data_received", G_CALLBACK(onDragDataReceived), NULL);
612  // delete xml; //Breaks code for some reason. It seems that this xml is freed somewhere else...
613 }

Referenced by find_or_create_scroom(), and on_scroom_bootstrap().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_or_create_scroom()

void find_or_create_scroom ( const PresentationInterface::Ptr presentation)
482 {
483  require(presentation);
484 
485  for(const Views::value_type& p: views)
486  {
487  View::Ptr const view = p.first;
488  if(!view->hasPresentation())
489  {
490  view->setPresentation(presentation);
492  return;
493  }
494  }
495  create_scroom(presentation);
496 }

Referenced by create(), load(), on_done_loading_plugins(), on_newWindow_activate(), and ScroomInterfaceImpl::showPresentation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ in_devmode()

bool in_devmode ( )
416 { return nullptr != getenv(SCROOM_DEV_MODE.c_str()); }

Referenced by main(), and on_scroom_bootstrap().

Here is the caller graph for this function:

◆ on_about_activate()

void on_about_activate ( GtkMenuItem *  ,
gpointer   
)
238 {
239  // GtkWidget* aboutdialog;
240  // aboutdialog = create_aboutdialog ();
241  gtk_dialog_run(GTK_DIALOG(aboutDialog));
242  gtk_widget_hide(aboutDialog);
243  // gtk_widget_destroy (aboutdialog);
244 }

Referenced by create_scroom().

Here is the caller graph for this function:

◆ on_button_press_event()

gboolean on_button_press_event ( GtkWidget *  ,
GdkEventButton *  event,
gpointer  user_data 
)
381 {
382  View* view = static_cast<View*>(user_data);
383  view->on_buttonPress(event);
384  return true;
385 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_button_release_event()

gboolean on_button_release_event ( GtkWidget *  ,
GdkEventButton *  event,
gpointer  user_data 
)
388 {
389  View* view = static_cast<View*>(user_data);
390  view->on_buttonRelease(event);
391  return true;
392 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_close_activate()

void on_close_activate ( GtkMenuItem *  ,
gpointer  user_data 
)
231 {
232  View* view = static_cast<View*>(user_data);
233 
234  view->hide();
235 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_copy_activate()

void on_copy_activate ( GtkMenuItem *  ,
gpointer   
)
208 {}

◆ on_cut_activate()

void on_cut_activate ( GtkMenuItem *  ,
gpointer   
)
206 {}

◆ on_delete_activate()

void on_delete_activate ( GtkMenuItem *  ,
gpointer   
)
212 {}

◆ on_done_loading_plugins()

void on_done_loading_plugins ( )
283 {
284  if(!filenames.empty())
285  {
286  {
287  std::list<std::string>& fn = filenames[REGULAR_FILES];
288 
289  while(!fn.empty())
290  {
291  const std::string& file = fn.front();
292  try
293  {
294  load(file);
295  }
296  catch(std::exception& ex)
297  {
298  spdlog::error(ex.what());
300  }
301  gchar* dir = g_path_get_dirname(file.c_str());
302  currentFolder = dir;
303  g_free(dir);
304  fn.pop_front();
305  }
306  }
307  filenames.erase(REGULAR_FILES);
308 
310  std::map<std::string, NewAggregateInterface::Ptr> const& newAggregateInterfaces = instance->getNewAggregateInterfaces();
311 
312  for(FileNameMap::value_type const& v: filenames)
313  {
314  const std::string& aggregateName = v.first;
315  std::list<std::string> const& files = v.second;
316 
317  auto i = newAggregateInterfaces.find(aggregateName);
318  if(i != newAggregateInterfaces.end())
319  {
320  try
321  {
322  Aggregate::Ptr const aggregate = i->second->createNew();
323  PresentationInterface::Ptr const aggregatePresentation = boost::dynamic_pointer_cast<PresentationInterface>(aggregate);
324 
325  if(aggregatePresentation)
326  {
327  for(const std::string& file: files)
328  {
330  aggregate->addPresentation(p);
331  }
332 
333  on_presentation_created(aggregatePresentation);
334  find_or_create_scroom(aggregatePresentation);
335  }
336  else
337  {
338  spdlog::error("Don't know how to display a {}", aggregateName);
339  }
340  }
341  catch(std::exception& ex)
342  {
343  spdlog::error("While creating {}: {}", aggregateName, ex.what());
345  }
346  }
347  else
348  {
349  spdlog::error("Don't know how to create {}", aggregateName);
350  }
351  }
352 
353  if(presentations.empty())
354  {
355  // Apparently, we couldn't load any of our presentations. Terminate...
356  ensure(views.empty());
357  gtk_main_quit();
358  }
359  }
360 }

Referenced by PluginManager::doWork().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_drawingarea_configure_event()

gboolean on_drawingarea_configure_event ( GtkWidget *  ,
GdkEventConfigure *  ,
gpointer  user_data 
)
266 {
267  View* view = static_cast<View*>(user_data);
268  view->on_configure();
269  return FALSE;
270 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_drawingarea_expose_event()

gboolean on_drawingarea_expose_event ( GtkWidget *  widget,
GdkEventExpose *  ,
gpointer  user_data 
)
247 {
248  cairo_region_t* re = cairo_region_create();
249 
250  GdkDrawingContext* dc;
251  dc = gdk_window_begin_draw_frame(gtk_widget_get_window(widget), re);
252 
253  cairo_t* cr = gdk_drawing_context_get_cairo_context(dc);
254 
255  View* view = static_cast<View*>(user_data);
256  view->redraw(cr);
257 
258  gdk_window_end_draw_frame(gtk_widget_get_window(widget), dc);
259 
260  cairo_region_destroy(re);
261 
262  return FALSE;
263 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_fullscreen_activate()

void on_fullscreen_activate ( GtkMenuItem *  item,
gpointer  user_data 
)
215 {
216  View* view = static_cast<View*>(user_data);
217  GtkCheckMenuItem* cmi = GTK_CHECK_MENU_ITEM(item);
218  const gboolean active = gtk_check_menu_item_get_active(cmi);
219 
220  if(active)
221  {
222  view->setFullScreen();
223  }
224  else
225  {
226  view->unsetFullScreen();
227  }
228 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_idle()

gboolean on_idle ( gpointer  user_data)
273 {
274  if(user_data == nullptr)
275  {
276  return 0;
277  }
278 
279  return reinterpret_cast<WorkInterface*>(user_data)->doWork();
280 }

Referenced by PluginManager::addHook(), and anonymous_namespace{progressbarmanager.cc}::ProgressBarPulser::start().

Here is the caller graph for this function:

◆ on_motion_notify_event()

gboolean on_motion_notify_event ( GtkWidget *  ,
GdkEventMotion *  event,
gpointer  user_data 
)
395 {
396  View* view = static_cast<View*>(user_data);
397  view->on_motion_notify(event);
398  return true;
399 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_new_activate()

void on_new_activate ( GtkMenuItem *  ,
gpointer  user_data 
)
89 {
90  auto* newPresentationInterface = static_cast<NewPresentationInterface*>(user_data);
91  create(newPresentationInterface);
92 }

Referenced by View::on_newPresentationInterfaces_update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_new_presentationobserver()

void on_new_presentationobserver ( const PresentationObserver::Ptr po)
715 {
716  for(auto& presentation: presentations)
717  {
718  PresentationInterface::Ptr const p = presentation.lock();
719  if(p)
720  {
721  po->presentationAdded(p);
722  }
723  }
724 }

◆ on_new_viewobserver()

void on_new_viewobserver ( const ViewObserver::Ptr viewObserver)
727 {
728  for(auto& [view, token]: views)
729  {
730  if(view->hasPresentation())
731  {
732  token.add(viewObserver->viewAdded(view));
733  }
734  }
735 }

Referenced by PluginManager::registerViewObserver().

Here is the caller graph for this function:

◆ on_newPresentationInterfaces_update()

void on_newPresentationInterfaces_update ( const std::map< NewPresentationInterface::Ptr, std::string > &  newPresentationInterfaces)
616 {
617  for(const Views::value_type& p: views)
618  {
619  p.first->on_newPresentationInterfaces_update(newPresentationInterfaces);
620  }
621 }

Referenced by PluginManager::registerNewPresentationInterface().

Here is the caller graph for this function:

◆ on_open_activate()

void on_open_activate ( GtkMenuItem *  ,
gpointer  user_data 
)
113 {
114  GtkWidget* dialog;
115  auto* scroom = static_cast<GtkWidget*>(user_data);
116 
117  spdlog::debug("Creating the open dialog");
118  dialog = gtk_file_chooser_dialog_new("Open File",
119  GTK_WINDOW(scroom),
120  GTK_FILE_CHOOSER_ACTION_OPEN,
121  ("_Cancel"),
122  GTK_RESPONSE_CANCEL,
123  ("_Open"),
124  GTK_RESPONSE_ACCEPT,
125  NULL);
126  gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), currentFolder.c_str());
127 
128  const auto pm = PluginManager::getInstance();
129  const auto& openInterfaces = pm->getOpenInterfaces();
130  const auto& openPresentationInterfaces = pm->getOpenPresentationInterfaces();
131 
132  // Store all the file filters so that we can create a custom file filter that allows any supported type (by default)
133  std::vector<GtkFileFilter*> filters;
134  GtkFileFilter* allSupportedFileTypesFilter = gtk_file_filter_new();
135  gtk_file_filter_set_name(allSupportedFileTypesFilter, "Any supported file type");
136 
137  // Cannot beforehand determine which data might be needed for the plugins, so we ask GTK to load everything!
138  auto filterFlags = static_cast<GtkFileFilterFlags>(GTK_FILE_FILTER_FILENAME | GTK_FILE_FILTER_MIME_TYPE
139  | GTK_FILE_FILTER_DISPLAY_NAME | GTK_FILE_FILTER_URI);
140 
141  gtk_file_filter_add_custom(allSupportedFileTypesFilter, filterFlags, &combinedFileFilter, &filters, nullptr);
142  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), allSupportedFileTypesFilter);
143 
144  for(auto const& cur: openPresentationInterfaces)
145  {
146  for(auto const& f: cur.first->getFilters())
147  {
148  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), f);
149  filters.push_back(f);
150  }
151  }
152  for(auto const& cur: openInterfaces)
153  {
154  for(auto const& f: cur.first->getFilters())
155  {
156  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), f);
157  filters.push_back(f);
158  }
159  }
160 
161  if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
162  {
163  GFile* file = g_file_new_for_path(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)));
164  GFileInfo* fileInfo = g_file_query_info(file, "standard::*", G_FILE_QUERY_INFO_NONE, nullptr, nullptr);
165  GtkFileFilterInfo filterInfo;
166  filterInfo.filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
167  filterInfo.mime_type = g_content_type_get_mime_type(g_file_info_get_content_type(fileInfo));
168  filterInfo.display_name = g_file_info_get_display_name(fileInfo);
169  filterInfo.contains =
170  static_cast<GtkFileFilterFlags>(GTK_FILE_FILTER_FILENAME | GTK_FILE_FILTER_DISPLAY_NAME | GTK_FILE_FILTER_MIME_TYPE);
171  spdlog::debug("Opening file {}", filterInfo.filename);
172 
173  try
174  {
175  load(filterInfo);
176  }
177  catch(std::exception& ex)
178  {
179  spdlog::error(ex.what());
181  }
182  }
183  gchar* cf = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
184  if(cf)
185  {
186  currentFolder = cf;
187  g_free(cf);
188  }
189  gtk_widget_destroy(dialog);
190 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_paste_activate()

void on_paste_activate ( GtkMenuItem *  ,
gpointer   
)
210 {}

◆ on_presentation_added_to_view()

void on_presentation_added_to_view ( const View::Ptr v)
659 {
660  const std::map<ViewObserver::Ptr, std::string>& viewObservers = PluginManager::getInstance()->getViewObservers();
661 
662  auto cur = viewObservers.begin();
663  auto end = viewObservers.end();
664  for(; cur != end; cur++)
665  {
666  views[v].add(cur->first->viewAdded(v));
667  }
668 }

Referenced by create_scroom(), and find_or_create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_presentation_created()

void on_presentation_created ( const PresentationInterface::Ptr presentation)
624 {
625  presentations.emplace_back(presentation);
626 
627  for(const Views::value_type& p: views)
628  {
629  p.first->on_presentation_created(presentation);
630  }
631 
632  const std::map<PresentationObserver::Ptr, std::string>& presentationObservers =
633  PluginManager::getInstance()->getPresentationObservers();
634 
635  auto cur = presentationObservers.begin();
636  auto end = presentationObservers.end();
637  for(; cur != end; cur++)
638  {
639  cur->first->presentationAdded(presentation);
640  }
641 }

Referenced by create(), load(), loadPresentation(), ScroomInterfaceImpl::newAggregate(), ScroomInterfaceImpl::newPresentation(), on_done_loading_plugins(), and ScroomInterfaceImpl::showPresentation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_presentation_possibly_destroyed()

void on_presentation_possibly_destroyed ( )
671 {
672  bool presentationDestroyed = false;
673 
674  for(auto cur = presentations.begin(); cur != presentations.end(); cur++)
675  {
676  PresentationInterface::Ptr const p = cur->lock();
677  if(!p)
678  {
679  presentationDestroyed = true;
680  auto temp = cur;
681  temp--;
682  presentations.erase(cur);
683  cur = temp;
684  }
685  }
686  if(presentationDestroyed)
687  {
688  for(auto const& p: views)
689  {
690  p.first->on_presentation_destroyed();
691  }
692 
693  const std::map<PresentationObserver::Ptr, std::string>& presentationObservers =
694  PluginManager::getInstance()->getPresentationObservers();
695 
696  for(auto const& p: presentationObservers)
697  {
698  p.first->presentationDeleted();
699  }
700  }
701 }

Referenced by on_done_loading_plugins(), on_open_activate(), and on_view_destroyed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_quit_activate()

void on_quit_activate ( GtkMenuItem *  ,
gpointer   
)
197 {
198  Views const v(views);
199  for(const Views::value_type& p: v)
200  {
201  p.first->hide();
202  }
203  gtk_main_quit();
204 }

Referenced by create_scroom().

Here is the caller graph for this function:

◆ on_save_activate()

void on_save_activate ( GtkMenuItem *  ,
gpointer   
)
192 {}

◆ on_save_as_activate()

void on_save_as_activate ( GtkMenuItem *  ,
gpointer   
)
194 {}

◆ on_scroll_event()

gboolean on_scroll_event ( GtkWidget *  ,
GdkEventScroll *  event,
gpointer  user_data 
)
402 {
403  View* view = static_cast<View*>(user_data);
404  view->on_scrollwheel(event);
405  return true;
406 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_scrollbar_value_changed()

void on_scrollbar_value_changed ( GtkAdjustment *  adjustment,
gpointer  user_data 
)
375 {
376  View* view = static_cast<View*>(user_data);
377  view->on_scrollbar_value_changed(adjustment);
378 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_scroom_bootstrap()

void on_scroom_bootstrap ( const FileNameMap newFilenames)
419 {
420  spdlog::info("Bootstrapping Scroom...");
421  filenames = newFilenames;
422  currentFolder = ".";
423 
424  const bool devMode = in_devmode();
425  if(devMode)
426  {
427  spdlog::info("+----------------------------------------------------------------------+");
428  spdlog::info("| ENTERING DEVELOPMENT MODE |");
429  spdlog::info("| All the default directories are not searched |");
430  spdlog::info("| Instead, only environment variables and the local source tree |");
431  spdlog::info("| are consulted. |");
432  spdlog::info("+----------------------------------------------------------------------+");
433  }
434 
435  startPluginManager(devMode);
436 
437  if(devMode)
438  {
439  xmlFileName = TOP_SRCDIR "/gui/scroom.glade";
440  }
441  else
442  {
443 #ifdef _WIN32
444  // We want to keep everything portable on windows so we look for the .glade file in the same directory as the .exe
445  xmlFileName = (boost::dll::program_location().parent_path() / "scroom.glade").generic_string();
446 #else
447  xmlFileName = PACKAGE_DATA_DIR "/scroom.glade";
448 #endif
449  }
450 
451  aboutDialogXml = gtk_builder_new();
452  boost::scoped_array<gchar*> const obj{new gchar*[2]};
453  const std::string str = "aboutDialog";
454  obj[0] = const_cast<char*>(str.c_str());
455  obj[1] = nullptr;
456  gtk_builder_add_objects_from_file(aboutDialogXml, xmlFileName.c_str(), obj.get(), nullptr);
457 
458  if(aboutDialogXml != nullptr)
459  {
460  aboutDialog = GTK_WIDGET(gtk_builder_get_object(aboutDialogXml, "aboutDialog"));
461  gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(aboutDialog), "Scroom");
462  gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(aboutDialog), PACKAGE_VERSION);
463 #ifdef _WIN32
464  g_signal_connect(G_OBJECT(aboutDialog), "activate-link", G_CALLBACK(on_open_scroom_website), NULL);
465 #endif
466  }
467  else
468  {
469  spdlog::error("Opening xml failed");
470  exit(-1); // NOLINT(concurrency-mt-unsafe)
471  }
472 
473  if(filenames.empty())
474  {
476  }
477 }

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_scroom_hide()

void on_scroom_hide ( GtkWidget *  ,
gpointer  user_data 
)
78 {
79  View* view = static_cast<View*>(user_data);
80  on_view_destroyed(view);
81 
82  if(views.empty())
83  {
84  gtk_main_quit();
85  }
86 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_scroom_terminating()

void on_scroom_terminating ( )
479 { ensure(views.empty()); }

Referenced by main().

Here is the caller graph for this function:

◆ on_textbox_value_changed()

void on_textbox_value_changed ( GtkEditable *  editable,
gpointer  user_data 
)
369 {
370  View* view = static_cast<View*>(user_data);
371  view->on_textbox_value_changed(editable);
372 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_view_created()

void on_view_created ( const View::Ptr v)
644 {
646  views[v] = t;
647 
648  for(auto& presentation: presentations)
649  {
650  PresentationInterface::Ptr const p = presentation.lock();
651  if(p)
652  {
653  v->on_presentation_created(p);
654  }
655  }
656 }

Referenced by create_scroom().

Here is the caller graph for this function:

◆ on_view_destroyed()

void on_view_destroyed ( View v)
704 {
705  View::Ptr view = v->shared_from_this<View>();
706  view->clearPresentation();
707 
708  views.erase(view);
709  view.reset();
710 
712 }

Referenced by on_scroom_hide().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ on_zoombox_changed()

void on_zoombox_changed ( GtkComboBox *  ,
gpointer  user_data 
)
363 {
364  View* view = static_cast<View*>(user_data);
365  view->on_zoombox_changed();
366 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ onDragDataReceived()

void onDragDataReceived ( GtkWidget *  ,
GdkDragContext *  ,
int  ,
int  ,
GtkSelectionData *  seldata,
guint  ,
guint  ,
gpointer   
)
506 {
507  gchar** uris = g_uri_list_extract_uris(reinterpret_cast<const gchar*>(gtk_selection_data_get_data(seldata)));
508  for(gchar** uri = uris; *uri != nullptr; uri++)
509  {
510  spdlog::info("Dropping file onto Scroom: {}", *uri);
511 
512  GError* error = nullptr;
513  gchar* filename = g_filename_from_uri(*uri, nullptr, &error);
514  if(error != nullptr)
515  {
516  ShowModalDialog(error->message);
517  g_error_free(error);
518  }
519  else
520  {
521  try
522  {
523  load(filename);
524  }
525  catch(std::invalid_argument& ex)
526  {
527  ShowModalDialog(fmt::format("Warning: unable to load file {}", filename));
528  }
529  }
530 
531  g_free(filename);
532  }
533 
534  g_strfreev(uris);
535 }

Referenced by create_scroom().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ShowModalDialog()

void ShowModalDialog ( const std::string &  message)
62 {
63  spdlog::error(message);
64  if(gdk_display_get_default())
65  {
66  // We're not running headless, don't open the popup
67  // We don't have a pointer to the parent window, so nullptr should
68  // suffice
69  GtkWidget* dialog = gtk_message_dialog_new(
70  nullptr, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, "%s", message.c_str());
71 
72  gtk_dialog_run(GTK_DIALOG(dialog));
73  gtk_widget_destroy(dialog);
74  }
75 }

Referenced by onDragDataReceived().

Here is the caller graph for this function:

Variable Documentation

◆ aboutDialog

GtkWidget* aboutDialog = nullptr
static

◆ aboutDialogXml

GtkBuilder* aboutDialogXml = nullptr
static

Referenced by on_scroom_bootstrap().

◆ currentFolder

std::string currentFolder
static

◆ filenames

FileNameMap filenames
static

◆ presentations

◆ REGULAR_FILES

const std::string REGULAR_FILES = "Regular files"

Referenced by main(), and on_done_loading_plugins().

◆ SCROOM_DEV_MODE

const std::string SCROOM_DEV_MODE = "SCROOM_DEV_MODE"
static

Referenced by in_devmode().

◆ views

◆ xmlFileName

std::string xmlFileName
static
View::unsetFullScreen
void unsetFullScreen()
Definition: view.cc:808
on_presentation_possibly_destroyed
void on_presentation_possibly_destroyed()
Definition: callbacks.cc:670
View::create
static Ptr create(GtkBuilder *scroomXml, const PresentationInterface::Ptr &presentation)
Definition: view.cc:347
find_or_create_scroom
void find_or_create_scroom(const PresentationInterface::Ptr &presentation)
Definition: callbacks.cc:481
load
void load(GtkFileFilterInfo const &info)
Definition: loader.cc:238
View::setFullScreen
void setFullScreen()
Definition: view.cc:801
Scroom::Utils::Base::shared_from_this
boost::shared_ptr< R > shared_from_this()
Definition: utilities.hh:109
on_drawingarea_configure_event
gboolean on_drawingarea_configure_event(GtkWidget *, GdkEventConfigure *, gpointer user_data)
Definition: callbacks.cc:265
PluginManager::Ptr
boost::shared_ptr< PluginManager > Ptr
Definition: pluginmanager.hh:44
View::on_buttonPress
void on_buttonPress(GdkEventButton *event)
Definition: view.cc:730
loadPresentation
PresentationInterface::Ptr loadPresentation(const std::string &filename)
Definition: loader.cc:189
on_button_press_event
gboolean on_button_press_event(GtkWidget *, GdkEventButton *event, gpointer user_data)
Definition: callbacks.cc:380
on_scroom_hide
void on_scroom_hide(GtkWidget *, gpointer user_data)
Definition: callbacks.cc:77
View::clearPresentation
void clearPresentation()
Definition: view.cc:396
on_scroll_event
gboolean on_scroll_event(GtkWidget *, GdkEventScroll *event, gpointer user_data)
Definition: callbacks.cc:401
ShowModalDialog
void ShowModalDialog(const std::string &message)
Definition: callbacks.cc:61
in_devmode
bool in_devmode()
Definition: callbacks.cc:416
View::redraw
void redraw(cairo_t *cr)
Definition: view.cc:366
View::hide
void hide()
Definition: view.cc:392
onDragDataReceived
void onDragDataReceived(GtkWidget *, GdkDragContext *, int, int, GtkSelectionData *seldata, guint, guint, gpointer)
Definition: callbacks.cc:498
on_drawingarea_expose_event
gboolean on_drawingarea_expose_event(GtkWidget *widget, GdkEventExpose *, gpointer user_data)
Definition: callbacks.cc:246
on_presentation_added_to_view
void on_presentation_added_to_view(const View::Ptr &v)
Definition: callbacks.cc:658
View
Definition: view.hh:95
on_view_created
void on_view_created(const View::Ptr &v)
Definition: callbacks.cc:643
require
#define require(expr)
Definition: assertions.hh:28
Views
std::map< View::Ptr, Scroom::Bookkeeping::Token > Views
Definition: callbacks.cc:55
on_open_activate
void on_open_activate(GtkMenuItem *, gpointer user_data)
Definition: callbacks.cc:112
View::on_motion_notify
void on_motion_notify(GdkEventMotion *event)
Definition: view.cc:775
NewPresentationInterface
Definition: scroominterface.hh:35
ensure
#define ensure(expr)
Definition: assertions.hh:32
xmlFileName
static std::string xmlFileName
Definition: callbacks.cc:51
on_presentation_created
void on_presentation_created(const PresentationInterface::Ptr &presentation)
Definition: callbacks.cc:623
on_about_activate
void on_about_activate(GtkMenuItem *, gpointer)
Definition: callbacks.cc:237
presentations
static std::list< PresentationInterface::WeakPtr > presentations
Definition: callbacks.cc:57
drawingArea
static GtkWidget * drawingArea
Definition: measure-framerate-callbacks.cc:18
currentFolder
static std::string currentFolder
Definition: callbacks.cc:59
on_textbox_value_changed
void on_textbox_value_changed(GtkEditable *editable, gpointer user_data)
Definition: callbacks.cc:368
SCROOM_DEV_MODE
static const std::string SCROOM_DEV_MODE
Definition: callbacks.cc:48
on_view_destroyed
void on_view_destroyed(View *v)
Definition: callbacks.cc:703
startPluginManager
void startPluginManager(bool devMode)
Definition: pluginmanager.cc:33
PresentationInterface::Ptr
boost::shared_ptr< PresentationInterface > Ptr
Definition: presentationinterface.hh:74
View::on_buttonRelease
void on_buttonRelease(GdkEventButton *event)
Definition: view.cc:752
REGULAR_FILES
const std::string REGULAR_FILES
Definition: callbacks.cc:49
View::on_configure
void on_configure()
Definition: view.cc:617
View::on_scrollwheel
void on_scrollwheel(GdkEventScroll *event)
Definition: view.cc:646
anonymous_namespace{progressbarmanager.cc}::instance
ProgressBarPulser::Ptr instance()
Definition: progressbarmanager.cc:43
View::on_zoombox_changed
void on_zoombox_changed()
Definition: view.cc:671
WorkInterface
Definition: workinterface.hh:12
filenames
static FileNameMap filenames
Definition: callbacks.cc:58
views
static Views views
Definition: callbacks.cc:56
on_zoombox_changed
void on_zoombox_changed(GtkComboBox *, gpointer user_data)
Definition: callbacks.cc:362
aboutDialog
static GtkWidget * aboutDialog
Definition: callbacks.cc:53
PluginManager::getInstance
static PluginManager::Ptr getInstance()
Definition: pluginmanager.cc:330
combinedFileFilter
gboolean combinedFileFilter(const GtkFileFilterInfo *filter_info, gpointer data)
Definition: callbacks.cc:94
on_button_release_event
gboolean on_button_release_event(GtkWidget *, GdkEventButton *event, gpointer user_data)
Definition: callbacks.cc:387
View::on_scrollbar_value_changed
void on_scrollbar_value_changed(GtkAdjustment *adjustment)
Definition: view.cc:714
on_motion_notify_event
gboolean on_motion_notify_event(GtkWidget *, GdkEventMotion *event, gpointer user_data)
Definition: callbacks.cc:394
on_scrollbar_value_changed
void on_scrollbar_value_changed(GtkAdjustment *adjustment, gpointer user_data)
Definition: callbacks.cc:374
create_scroom
void create_scroom(const PresentationInterface::Ptr &presentation)
Definition: callbacks.cc:537
aboutDialogXml
static GtkBuilder * aboutDialogXml
Definition: callbacks.cc:52
View::Ptr
boost::shared_ptr< View > Ptr
Definition: view.hh:100
Scroom::Bookkeeping::Token
Definition: bookkeeping.hh:37
on_close_activate
void on_close_activate(GtkMenuItem *, gpointer user_data)
Definition: callbacks.cc:230
View::on_textbox_value_changed
void on_textbox_value_changed(GtkEditable *editable)
Definition: view.cc:700
create
void create(NewPresentationInterface *interface)
Definition: loader.cc:175
Aggregate::Ptr
boost::shared_ptr< Aggregate > Ptr
Definition: presentationinterface.hh:147
on_quit_activate
void on_quit_activate(GtkMenuItem *, gpointer)
Definition: callbacks.cc:196
on_fullscreen_activate
void on_fullscreen_activate(GtkMenuItem *item, gpointer user_data)
Definition: callbacks.cc:214