Scroom 0.14-48-ga0fee447
Loading...
Searching...
No Matches
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 <scroom/logger.hh>
#include "loader.hh"
#include "pluginmanager.hh"
#include "view.hh"
#include "workinterface.hh"
Include dependency graph for callbacks.cc:

Namespaces

namespace  anonymous_namespace{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
 
Scroom::Logger anonymous_namespace{callbacks.cc}::logger
 
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 
)
98{
99 // Convert the data back to a filter vector
100 auto* filters = static_cast<std::vector<GtkFileFilter*>*>(data);
101
102 // Return true if any of the filters matches the filter_info
103 for(const auto& f: *filters)
104 {
105 if(gtk_file_filter_filter(f, filter_info))
106 {
107 return true;
108 }
109 }
110
111 // None of the filters matched
112 return false;
113}
uint8_t data
Definition blob-tests.cc:36
f
Definition gtkhelper-tests.cc:43

Referenced by on_open_activate().

Here is the caller graph for this function:

◆ create_scroom()

void create_scroom ( const PresentationInterface::Ptr presentation)
546{
547 GtkBuilder* xml = gtk_builder_new();
548 boost::scoped_array<char*> const obj{new gchar*[2]};
549 const std::string str = "scroom";
550 obj[0] = const_cast<char*>(str.c_str());
551 obj[1] = nullptr;
552 gtk_builder_add_objects_from_file(xml, xmlFileName.c_str(), obj.get(), nullptr);
553
554 if(xml == nullptr)
555 {
556 logger->error("Opening xml failed");
557 exit(-1); // NOLINT(concurrency-mt-unsafe)
558 }
559
560 View::Ptr const view = View::create(xml, presentation);
562 if(presentation)
563 {
565 }
566
567 GtkWidget* scroom = GTK_WIDGET(gtk_builder_get_object(xml, "scroom"));
568 GtkWidget* openMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "open"));
569 GtkWidget* closeMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "close"));
570 GtkWidget* quitMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "quit"));
571 GtkWidget* fullScreenMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "fullscreen_menu_item"));
572 GtkWidget* aboutMenuItem = GTK_WIDGET(gtk_builder_get_object(xml, "about"));
573 GtkWidget* drawingArea = GTK_WIDGET(gtk_builder_get_object(xml, "drawingarea"));
574 GtkWidget* zoomBox = GTK_WIDGET(gtk_builder_get_object(xml, "zoomboxcombo"));
575 GtkWidget* vscrollbar = GTK_WIDGET(gtk_builder_get_object(xml, "vscrollbar"));
576 GtkWidget* hscrollbar = GTK_WIDGET(gtk_builder_get_object(xml, "hscrollbar"));
577 GtkAdjustment* vscrollbaradjustment = gtk_range_get_adjustment(GTK_RANGE(vscrollbar));
578 GtkAdjustment* hscrollbaradjustment = gtk_range_get_adjustment(GTK_RANGE(hscrollbar));
579 GtkEditable* xTextBox = GTK_EDITABLE(GTK_WIDGET(gtk_builder_get_object(xml, "x_textbox")));
580 GtkEditable* yTextBox = GTK_EDITABLE(GTK_WIDGET(gtk_builder_get_object(xml, "y_textbox")));
581
582 g_signal_connect(static_cast<gpointer>(scroom), "hide", G_CALLBACK(on_scroom_hide), view.get());
583 g_signal_connect(static_cast<gpointer>(closeMenuItem), "activate", G_CALLBACK(on_close_activate), view.get());
584 g_signal_connect(static_cast<gpointer>(quitMenuItem), "activate", G_CALLBACK(on_quit_activate), view.get());
585 g_signal_connect(static_cast<gpointer>(openMenuItem), "activate", G_CALLBACK(on_open_activate), scroom);
586 g_signal_connect(static_cast<gpointer>(fullScreenMenuItem), "activate", G_CALLBACK(on_fullscreen_activate), view.get());
587 g_signal_connect(static_cast<gpointer>(zoomBox), "changed", G_CALLBACK(on_zoombox_changed), view.get());
588 g_signal_connect(
589 static_cast<gpointer>(vscrollbaradjustment), "value-changed", G_CALLBACK(on_scrollbar_value_changed), view.get()
590 );
591 g_signal_connect(
592 static_cast<gpointer>(hscrollbaradjustment), "value-changed", G_CALLBACK(on_scrollbar_value_changed), view.get()
593 );
594 g_signal_connect(static_cast<gpointer>(xTextBox), "changed", G_CALLBACK(on_textbox_value_changed), view.get());
595 g_signal_connect(static_cast<gpointer>(yTextBox), "changed", G_CALLBACK(on_textbox_value_changed), view.get());
596 // g_signal_connect ((gpointer) cut, "activate",
597 // G_CALLBACK (on_cut_activate),
598 // view.get());
599 // g_signal_connect ((gpointer) copy, "activate",
600 // G_CALLBACK (on_copy_activate),
601 // view.get());
602 // g_signal_connect ((gpointer) paste, "activate",
603 // G_CALLBACK (on_paste_activate),
604 // view.get());
605 // g_signal_connect ((gpointer) delete, "activate",
606 // G_CALLBACK (on_delete_activate),
607 // view.get());
608 g_signal_connect(static_cast<gpointer>(aboutMenuItem), "activate", G_CALLBACK(on_about_activate), view.get());
609 g_signal_connect(static_cast<gpointer>(drawingArea), "draw", G_CALLBACK(on_drawingarea_expose_event), view.get());
610 g_signal_connect(static_cast<gpointer>(drawingArea), "configure_event", G_CALLBACK(on_drawingarea_configure_event), view.get());
611 g_signal_connect(static_cast<gpointer>(drawingArea), "button-press-event", G_CALLBACK(on_button_press_event), view.get());
612 g_signal_connect(static_cast<gpointer>(drawingArea), "button-release-event", G_CALLBACK(on_button_release_event), view.get());
613 g_signal_connect(static_cast<gpointer>(drawingArea), "scroll-event", G_CALLBACK(on_scroll_event), view.get());
614 g_signal_connect(static_cast<gpointer>(drawingArea), "motion-notify-event", G_CALLBACK(on_motion_notify_event), view.get());
615
616 char uriList[] = "text/uri-list";
617 GtkTargetEntry targets[] = {{uriList, 0, 0}};
618 gtk_drag_dest_set(
619 scroom, GTK_DEST_DEFAULT_ALL, targets, 1, static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK)
620 );
621
622 g_signal_connect(static_cast<gpointer>(scroom), "drag_data_received", G_CALLBACK(onDragDataReceived), NULL);
623 // delete xml; //Breaks code for some reason. It seems that this xml is freed somewhere else...
624}
gboolean on_motion_notify_event(GtkWidget *, GdkEventMotion *event, gpointer user_data)
Definition callbacks.cc:400
gboolean on_scroll_event(GtkWidget *, GdkEventScroll *event, gpointer user_data)
Definition callbacks.cc:407
void on_scrollbar_value_changed(GtkAdjustment *adjustment, gpointer user_data)
Definition callbacks.cc:380
gboolean on_button_press_event(GtkWidget *, GdkEventButton *event, gpointer user_data)
Definition callbacks.cc:386
void on_fullscreen_activate(GtkMenuItem *item, gpointer user_data)
Definition callbacks.cc:220
void on_scroom_hide(GtkWidget *, gpointer user_data)
Definition callbacks.cc:80
void on_open_activate(GtkMenuItem *, gpointer user_data)
Definition callbacks.cc:115
void onDragDataReceived(GtkWidget *, GdkDragContext *, int, int, GtkSelectionData *seldata, guint, guint, gpointer)
Definition callbacks.cc:504
void on_quit_activate(GtkMenuItem *, gpointer)
Definition callbacks.cc:202
gboolean on_button_release_event(GtkWidget *, GdkEventButton *event, gpointer user_data)
Definition callbacks.cc:393
gboolean on_drawingarea_configure_event(GtkWidget *, GdkEventConfigure *, gpointer user_data)
Definition callbacks.cc:271
void on_about_activate(GtkMenuItem *, gpointer)
Definition callbacks.cc:243
void on_view_created(const View::Ptr &v)
Definition callbacks.cc:654
void on_close_activate(GtkMenuItem *, gpointer user_data)
Definition callbacks.cc:236
static std::string xmlFileName
Definition callbacks.cc:48
void on_zoombox_changed(GtkComboBox *, gpointer user_data)
Definition callbacks.cc:368
gboolean on_drawingarea_expose_event(GtkWidget *widget, GdkEventExpose *, gpointer user_data)
Definition callbacks.cc:252
void on_presentation_added_to_view(const View::Ptr &v)
Definition callbacks.cc:669
void on_textbox_value_changed(GtkEditable *editable, gpointer user_data)
Definition callbacks.cc:374
static Ptr create(GtkBuilder *scroomXml, const PresentationInterface::Ptr &presentation)
Definition view.cc:124
std::shared_ptr< View > Ptr
Definition view.hh:98
Scroom::Logger logger
Definition callbacks.cc:54
const auto view
Definition pipette-tests.cc:227
GtkWidget * drawingArea
Definition ruler-tests.cc:11

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)
488{
489 require(presentation);
490
491 for(const Views::value_type& p: views)
492 {
493 View::Ptr const view = p.first;
494 if(!view->hasPresentation())
495 {
496 view->setPresentation(presentation);
498 return;
499 }
500 }
501 create_scroom(presentation);
502}
#define require(expr)
Definition assertions.hh:30
void create_scroom(const PresentationInterface::Ptr &presentation)
Definition callbacks.cc:545
static Views views
Definition callbacks.cc:58
PresentationInterfaceStub::Ptr const p
Definition determine-size-test.cc:172

Referenced by create(), load(), on_done_loading_plugins(), anonymous_namespace{view.cc}::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 ( )
422{ return nullptr != getenv(SCROOM_DEV_MODE.c_str()); }
static const std::string SCROOM_DEV_MODE
Definition callbacks.cc:45

Referenced by main(), and on_scroom_bootstrap().

Here is the caller graph for this function:

◆ on_about_activate()

void on_about_activate ( GtkMenuItem *  menuitem,
gpointer  user_data 
)
244{
245 // GtkWidget* aboutdialog;
246 // aboutdialog = create_aboutdialog ();
247 gtk_dialog_run(GTK_DIALOG(aboutDialog));
248 gtk_widget_hide(aboutDialog);
249 // gtk_widget_destroy (aboutdialog);
250}
static GtkWidget * aboutDialog
Definition callbacks.cc:50

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 
)
387{
388 View* view = static_cast<View*>(user_data);
389 view->on_buttonPress(event);
390 return true;
391}
Definition view.hh:96
void on_buttonPress(GdkEventButton *event)
Definition view.cc:519

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 
)
394{
395 View* view = static_cast<View*>(user_data);
396 view->on_buttonRelease(event);
397 return true;
398}
void on_buttonRelease(GdkEventButton *event)
Definition view.cc:541

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 *  menuitem,
gpointer  user_data 
)
237{
238 View* view = static_cast<View*>(user_data);
239
240 view->hide();
241}
void hide()
Definition view.cc:169

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 *  menuitem,
gpointer  user_data 
)
214{}

◆ on_cut_activate()

void on_cut_activate ( GtkMenuItem *  menuitem,
gpointer  user_data 
)
212{}

◆ on_delete_activate()

void on_delete_activate ( GtkMenuItem *  menuitem,
gpointer  user_data 
)
218{}

◆ on_done_loading_plugins()

void on_done_loading_plugins ( )
289{
290 if(!filenames.empty())
291 {
292 {
293 std::list<std::string>& fn = filenames[REGULAR_FILES];
294
295 while(!fn.empty())
296 {
297 const std::string& file = fn.front();
298 try
299 {
300 load(file);
301 }
302 catch(std::exception& ex)
303 {
304 logger->error(ex.what());
306 }
307 gchar* dir = g_path_get_dirname(file.c_str());
308 currentFolder = dir;
309 g_free(dir);
310 fn.pop_front();
311 }
312 }
314
316 std::map<std::string, NewAggregateInterface::Ptr> const& newAggregateInterfaces = instance->getNewAggregateInterfaces();
317
318 for(FileNameMap::value_type const& v: filenames)
319 {
320 const std::string& aggregateName = v.first;
321 std::list<std::string> const& files = v.second;
322
323 auto i = newAggregateInterfaces.find(aggregateName);
324 if(i != newAggregateInterfaces.end())
325 {
326 try
327 {
328 Aggregate::Ptr const aggregate = i->second->createNew();
329 PresentationInterface::Ptr const aggregatePresentation = std::dynamic_pointer_cast<PresentationInterface>(aggregate);
330
331 if(aggregatePresentation)
332 {
333 for(const std::string& file: files)
334 {
336 aggregate->addPresentation(p);
337 }
338
339 on_presentation_created(aggregatePresentation);
340 find_or_create_scroom(aggregatePresentation);
341 }
342 else
343 {
344 logger->error("Don't know how to display a {}", aggregateName);
345 }
346 }
347 catch(std::exception& ex)
348 {
349 logger->error("While creating {}: {}", aggregateName, ex.what());
351 }
352 }
353 else
354 {
355 logger->error("Don't know how to create {}", aggregateName);
356 }
357 }
358
359 if(presentations.empty())
360 {
361 // Apparently, we couldn't load any of our presentations. Terminate...
362 ensure(views.empty());
363 gtk_main_quit();
364 }
365 }
366}
#define ensure(expr)
Definition assertions.hh:35
static std::list< PresentationInterface::WeakPtr > presentations
Definition callbacks.cc:59
void on_presentation_created(const PresentationInterface::Ptr &presentation)
Definition callbacks.cc:634
void on_presentation_possibly_destroyed()
Definition callbacks.cc:681
void find_or_create_scroom(const PresentationInterface::Ptr &presentation)
Definition callbacks.cc:487
const std::string REGULAR_FILES
Definition callbacks.cc:46
static std::string currentFolder
Definition callbacks.cc:61
static FileNameMap filenames
Definition callbacks.cc:60
std::shared_ptr< Aggregate > Ptr
Definition presentationinterface.hh:146
std::shared_ptr< PluginManager > Ptr
Definition pluginmanager.hh:45
static PluginManager::Ptr getInstance()
Definition pluginmanager.cc:334
std::shared_ptr< PresentationInterface > Ptr
Definition presentationinterface.hh:73
void load(GtkFileFilterInfo const &info)
Definition loader.cc:235
PresentationInterface::Ptr loadPresentation(const std::string &filename)
Definition loader.cc:186
ProgressBarPulser::Ptr instance()
Definition progressbarmanager.cc:44

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 *  widget,
GdkEventConfigure *  event,
gpointer  user_data 
)
272{
273 View* view = static_cast<View*>(user_data);
275 return FALSE;
276}
void on_configure()
Definition view.cc:404

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 *  event,
gpointer  user_data 
)
253{
254 cairo_region_t* re = cairo_region_create();
255
256 GdkDrawingContext* dc;
257 dc = gdk_window_begin_draw_frame(gtk_widget_get_window(widget), re);
258
259 cairo_t* cr = gdk_drawing_context_get_cairo_context(dc);
260
261 View* view = static_cast<View*>(user_data);
262 view->redraw(cr);
263
264 gdk_window_end_draw_frame(gtk_widget_get_window(widget), dc);
265
266 cairo_region_destroy(re);
267
268 return FALSE;
269}
void redraw(cairo_t *cr)
Definition view.cc:143
cairo_t * cr
Definition transformpresentation_test.cc:72

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 
)
221{
222 View* view = static_cast<View*>(user_data);
223 GtkCheckMenuItem* cmi = GTK_CHECK_MENU_ITEM(item);
224 const gboolean active = gtk_check_menu_item_get_active(cmi);
225
226 if(active)
227 {
228 view->setFullScreen();
229 }
230 else
231 {
232 view->unsetFullScreen();
233 }
234}

Referenced by create_scroom().

Here is the caller graph for this function:

◆ on_idle()

gboolean on_idle ( gpointer  user_data)
279{
280 if(user_data == nullptr)
281 {
282 return 0;
283 }
284
285 return reinterpret_cast<WorkInterface*>(user_data)->doWork();
286}
Definition workinterface.hh:13

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 
)
401{
402 View* view = static_cast<View*>(user_data);
403 view->on_motion_notify(event);
404 return true;
405}
void on_motion_notify(GdkEventMotion *event)
Definition view.cc:564

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 *  menuitem,
gpointer  user_data 
)
92{
93 auto* newPresentationInterface = static_cast<NewPresentationInterface*>(user_data);
94 create(newPresentationInterface);
95}
Definition scroominterface.hh:35
void create(NewPresentationInterface *interface)
Definition loader.cc:172

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)
726{
727 for(auto& presentation: presentations)
728 {
729 PresentationInterface::Ptr const p = presentation.lock();
730 if(p)
731 {
732 po->presentationAdded(p);
733 }
734 }
735}

◆ on_new_viewobserver()

void on_new_viewobserver ( const ViewObserver::Ptr viewObserver)
738{
739 for(auto& [view, token]: views)
740 {
741 if(view->hasPresentation())
742 {
743 token.add(viewObserver->viewAdded(view));
744 }
745 }
746}
void add(const Stuff &s) const
Definition bookkeepingimpl.hh:191
Scroom::Bookkeeping::Token const token
Definition pipette-tests.cc:269

Referenced by PluginManager::registerViewObserver().

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

◆ on_newPresentationInterfaces_update()

void on_newPresentationInterfaces_update ( const std::map< NewPresentationInterface::Ptr, std::string > &  newPresentationInterfaces)
627{
628 for(const Views::value_type& p: views)
629 {
630 p.first->on_newPresentationInterfaces_update(newPresentationInterfaces);
631 }
632}

Referenced by PluginManager::registerNewPresentationInterface().

Here is the caller graph for this function:

◆ on_open_activate()

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

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 *  menuitem,
gpointer  user_data 
)
216{}

◆ on_presentation_added_to_view()

void on_presentation_added_to_view ( const View::Ptr v)
670{
671 const std::map<ViewObserver::Ptr, std::string>& viewObservers = PluginManager::getInstance()->getViewObservers();
672
673 auto cur = viewObservers.begin();
674 auto end = viewObservers.end();
675 for(; cur != end; cur++)
676 {
677 views[v].add(cur->first->viewAdded(v));
678 }
679}

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)
635{
636 presentations.emplace_back(presentation);
637
638 for(const Views::value_type& p: views)
639 {
640 p.first->on_presentation_created(presentation);
641 }
642
643 const std::map<PresentationObserver::Ptr, std::string>& presentationObservers =
644 PluginManager::getInstance()->getPresentationObservers();
645
646 auto cur = presentationObservers.begin();
647 auto end = presentationObservers.end();
648 for(; cur != end; cur++)
649 {
650 cur->first->presentationAdded(presentation);
651 }
652}

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 ( )
682{
683 bool presentationDestroyed = false;
684
685 for(auto cur = presentations.begin(); cur != presentations.end(); cur++)
686 {
687 PresentationInterface::Ptr const p = cur->lock();
688 if(!p)
689 {
690 presentationDestroyed = true;
691 auto temp = cur;
692 temp--;
693 presentations.erase(cur);
694 cur = temp;
695 }
696 }
697 if(presentationDestroyed)
698 {
699 for(auto const& p: views)
700 {
701 p.first->on_presentation_destroyed();
702 }
703
704 const std::map<PresentationObserver::Ptr, std::string>& presentationObservers =
705 PluginManager::getInstance()->getPresentationObservers();
706
707 for(auto const& p: presentationObservers)
708 {
709 p.first->presentationDeleted();
710 }
711 }
712}

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 *  menuitem,
gpointer  user_data 
)
203{
204 Views const v(views);
205 for(const Views::value_type& p: v)
206 {
207 p.first->hide();
208 }
209 gtk_main_quit();
210}
std::map< View::Ptr, Scroom::Bookkeeping::Token > Views
Definition callbacks.cc:57

Referenced by create_scroom().

Here is the caller graph for this function:

◆ on_save_activate()

void on_save_activate ( GtkMenuItem *  menuitem,
gpointer  user_data 
)
198{}

◆ on_save_as_activate()

void on_save_as_activate ( GtkMenuItem *  menuitem,
gpointer  user_data 
)
200{}

◆ on_scroll_event()

gboolean on_scroll_event ( GtkWidget *  ,
GdkEventScroll *  event,
gpointer  user_data 
)
408{
409 View* view = static_cast<View*>(user_data);
410 view->on_scrollwheel(event);
411 return true;
412}
void on_scrollwheel(GdkEventScroll *event)
Definition view.cc:433

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 
)
381{
382 View* view = static_cast<View*>(user_data);
383 view->on_scrollbar_value_changed(adjustment);
384}
void on_scrollbar_value_changed(GtkAdjustment *adjustment)
Definition view.cc:503

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

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 *  widget,
gpointer  user_data 
)
81{
82 View* view = static_cast<View*>(user_data);
84
85 if(views.empty())
86 {
87 gtk_main_quit();
88 }
89}
void on_view_destroyed(View *v)
Definition callbacks.cc:714

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 ( )
485{ 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 
)
375{
376 View* view = static_cast<View*>(user_data);
378}
void on_textbox_value_changed(GtkEditable *editable)
Definition view.cc:489

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)
655{
657 views[v] = t;
658
659 for(auto& presentation: presentations)
660 {
661 PresentationInterface::Ptr const p = presentation.lock();
662 if(p)
663 {
664 v->on_presentation_created(p);
665 }
666 }
667}
Definition bookkeeping.hh:50
ThreadPool t(0)

Referenced by create_scroom().

Here is the caller graph for this function:

◆ on_view_destroyed()

void on_view_destroyed ( View v)
715{
718
719 views.erase(view);
720 view.reset();
721
723}
std::shared_ptr< R > shared_from_this()
Definition utilities.hh:48
void clearPresentation()
Definition view.cc:173

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 *  widget,
gpointer  user_data 
)
369{
370 View* view = static_cast<View*>(user_data);
372}
void on_zoombox_changed()
Definition view.cc:460

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   
)
514{
515 gchar** uris = g_uri_list_extract_uris(reinterpret_cast<const gchar*>(gtk_selection_data_get_data(seldata)));
516 for(gchar** uri = uris; *uri != nullptr; uri++)
517 {
518 logger->info("Dropping file onto Scroom: {}", *uri);
519
520 GError* error = nullptr;
521 gchar* filename = g_filename_from_uri(*uri, nullptr, &error);
522 if(error != nullptr)
523 {
524 ShowModalDialog(error->message);
525 g_error_free(error);
526 }
527 else
528 {
529 try
530 {
531 load(filename);
532 }
533 catch(std::invalid_argument& ex)
534 {
535 ShowModalDialog(fmt::format("Warning: unable to load file {}", filename));
536 }
537 }
538
539 g_free(filename);
540 }
541
542 g_strfreev(uris);
543}
void ShowModalDialog(const std::string &message)
Definition callbacks.cc:63

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)
64{
65 logger->error(message);
66 if(gdk_display_get_default())
67 {
68 // We're not running headless, don't open the popup
69 // We don't have a pointer to the parent window, so nullptr should
70 // suffice
71 GtkWidget* dialog = gtk_message_dialog_new(
72 nullptr, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, "%s", message.c_str()
73 );
74
75 gtk_dialog_run(GTK_DIALOG(dialog));
76 gtk_widget_destroy(dialog);
77 }
78}

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