static void onResize(GtkWidget *widget, GtkAllocation *al, struct viewport *port) { /* Unused parameters. */ (void)widget; port->width = al->width; port->height = al->height; /* Save current note because it would get overwritten by the redraw * event. */ saveCurrentNote(); }
static gboolean onExpose(GtkWidget *widget, GdkEvent *event, struct viewport *port) { /* Unused parameters. */ (void)widget; (void)event; /* Be sure to save the current notes because the following * update will trigger a re-print of them. */ saveCurrentNote(); updatePortPixbuf(port); return FALSE; }
static void onSaveAsClicked(GtkWidget *widget, gpointer data) { /* Unused parameters. */ (void)widget; (void)data; gchar *msg = NULL; GtkWidget *fileChooser = NULL; fileChooser = gtk_file_chooser_dialog_new("Save File", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(fileChooser), TRUE); setLastFolderOn(fileChooser); if (gtk_dialog_run(GTK_DIALOG(fileChooser)) == GTK_RESPONSE_ACCEPT) { saveCurrentNote(); if (savedAsFilename != NULL) g_free(savedAsFilename); savedAsFilename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(fileChooser)); if (saveNotes(savedAsFilename)) { saveLastFolderFrom(fileChooser); isSaved = TRUE; gtk_widget_set_sensitive(GTK_WIDGET(saveButton), FALSE); msg = g_strdup_printf("Notes saved as '%s'.", savedAsFilename); setStatusText_strdup(msg); g_free(msg); } } gtk_widget_destroy(fileChooser); }
static void prevSlide(void) { /* stop if we're at the beginning and wrapping is disabled. */ if (!runpref.do_wrapping) { if (doc_page == 0) { return; } } saveCurrentNote(); /* update global counter */ doc_page--; doc_page = (doc_page < 0 ? doc_n_pages - 1 : doc_page); /* update beamer counter if it's active */ if (beamer_active == TRUE) doc_page_beamer = doc_page; }
static void nextSlide(void) { /* stop if we're at the end and wrapping is disabled. */ if (!runpref.do_wrapping) { if (doc_page == doc_n_pages - 1) { return; } } saveCurrentNote(); /* update global counter */ doc_page++; doc_page %= doc_n_pages; /* update beamer counter if it's active */ if (beamer_active == TRUE) doc_page_beamer = doc_page; }
static void onSaveClicked(GtkWidget *widget, gpointer data) { /* Unused parameters. */ (void)widget; (void)data; gchar *msg = NULL; if (savedAsFilename == NULL) return; saveCurrentNote(); if (!saveNotes(savedAsFilename)) return; msg = g_strdup_printf("Notes saved: '%s'.", savedAsFilename); setStatusText_strdup(msg); g_free(msg); isSaved = TRUE; gtk_widget_set_sensitive(GTK_WIDGET(saveButton), FALSE); }
static gboolean onKeyPressed(GtkWidget *widget, GdkEventKey *ev, gpointer data) { /* Unused parameters. */ (void)data; guint key = ev->keyval; gchar *msg = NULL; /* When inside the note pad, don't do anything here. */ if (isInsideNotePad) return FALSE; /* Jump command? * * Note: This works as long as the values of GDK keysyms satisfy: * 1) GDK_0 < GDK_1 < GDK_2 < ... < GDK_9 * 2) All of them must be >= 0. */ key -= GDK_0; if (key <= 9) { /* The initial value is -1, so we have to reset this on the * first key stroke. */ if (target_page < 0) target_page = 0; /* Do a "decimal left shift" and add the given value. */ target_page *= 10; target_page += (int)key; /* Catch overflow and announce what would happen. */ if (target_page < 0) { target_page = -1; setStatusText_strdup("Invalid page."); } else { msg = g_strdup_printf("Jump to page: %d", target_page); setStatusText_strdup(msg); g_free(msg); } return FALSE; } gboolean changed = TRUE; saveCurrentNote(); switch (ev->keyval) { case GDK_Right: case GDK_Down: case GDK_Page_Down: case GDK_space: nextSlide(); break; case GDK_Left: case GDK_Up: case GDK_Page_Up: prevSlide(); break; case GDK_F5: /* Switch to fullscreen (if needed) and start the timer * (unless it's already running). */ if (!isFullScreen) toggleFullScreen(); if (timerMode != 1) toggleTimer(); break; case GDK_F6: /* this shall trigger a hard refresh, so empty the cache. */ clearCache(); break; case GDK_w: runpref.fit_mode = FIT_WIDTH; break; case GDK_h: runpref.fit_mode = FIT_HEIGHT; break; case GDK_p: runpref.fit_mode = FIT_PAGE; break; case GDK_l: current_fixate(); break; case GDK_L: current_release(FALSE); break; case GDK_J: current_release(TRUE); break; case GDK_f: toggleFullScreen(); break; case GDK_s: toggleTimer(); changed = FALSE; break; case GDK_c: toggleCurserVisibility(); break; case GDK_r: resetTimer(); changed = FALSE; break; case GDK_Escape: case GDK_q: if (prefs.q_exits_fullscreen && isFullScreen) { toggleFullScreen(); if (prefs.stop_timer_on_fs) { toggleTimer(); } } else { changed = FALSE; onQuit(NULL, NULL, NULL); } break; case GDK_i: /* This must not work when we're on the beamer window. */ if (widget != win_beamer) setEditingState(TRUE); changed = FALSE; break; case GDK_Return: if (executeJump() == 0) nextSlide(); break; case GDK_G: executeJump(); break; case GDK_period: case GDK_b: toggleBlankBeamer(); changed = FALSE; break; default: changed = FALSE; } if (changed == TRUE) { refreshPorts(); } return TRUE; }