]> git.donarmstrong.com Git - xournal.git/blobdiff - src/xo-callbacks.c
fix: don't lose tracking of pointer events when exiting canvas
[xournal.git] / src / xo-callbacks.c
index 43c96fdfc409400a96e5d94aab9fd1ba0c7a6be1..0e8e02bdc47248619def955e9cf89713cc9c575c 100644 (file)
@@ -221,7 +221,7 @@ on_fileSaveAs_activate                 (GtkMenuItem     *menuitem,
   }
   else {
     curtime = time(NULL);
-    strftime(stime, 30, "%F-Note-%H-%M.xoj", localtime(&curtime));
+    strftime(stime, 30, "%Y-%m-%d-Note-%H-%M.xoj", localtime(&curtime));
     if (ui.default_path!=NULL)
       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), ui.default_path);
     gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), stime);
@@ -374,7 +374,7 @@ on_filePrintPDF_activate               (GtkMenuItem     *menuitem,
     gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), g_basename(in_fn));
   } else {
     curtime = time(NULL);
-    strftime(stime, 30, "%F-Note-%H-%M.pdf", localtime(&curtime));
+    strftime(stime, 30, "%Y-%m-%d-Note-%H-%M.pdf", localtime(&curtime));
     if (ui.default_path!=NULL)
       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), ui.default_path);
     gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), stime);
@@ -1308,7 +1308,7 @@ on_papercolorWhite_activate            (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
   end_text();
-  process_papercolor_activate(menuitem, COLOR_WHITE);
+  process_papercolor_activate(menuitem, COLOR_WHITE, predef_bgcolors_rgba[COLOR_WHITE]);
 }
 
 
@@ -1317,7 +1317,7 @@ on_papercolorYellow_activate           (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
   end_text();
-  process_papercolor_activate(menuitem, COLOR_YELLOW);
+  process_papercolor_activate(menuitem, COLOR_YELLOW, predef_bgcolors_rgba[COLOR_YELLOW]);
 }
 
 
@@ -1326,7 +1326,7 @@ on_papercolorPink_activate             (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
   end_text();
-  process_papercolor_activate(menuitem, COLOR_RED);
+  process_papercolor_activate(menuitem, COLOR_RED, predef_bgcolors_rgba[COLOR_RED]);
 }
 
 
@@ -1335,7 +1335,7 @@ on_papercolorOrange_activate           (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
   end_text();
-  process_papercolor_activate(menuitem, COLOR_ORANGE);
+  process_papercolor_activate(menuitem, COLOR_ORANGE, predef_bgcolors_rgba[COLOR_ORANGE]);
 }
 
 
@@ -1344,7 +1344,7 @@ on_papercolorBlue_activate             (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
   end_text();
-  process_papercolor_activate(menuitem, COLOR_BLUE);
+  process_papercolor_activate(menuitem, COLOR_BLUE, predef_bgcolors_rgba[COLOR_BLUE]);
 }
 
 
@@ -1353,7 +1353,7 @@ on_papercolorGreen_activate            (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
   end_text();
-  process_papercolor_activate(menuitem, COLOR_GREEN);
+  process_papercolor_activate(menuitem, COLOR_GREEN, predef_bgcolors_rgba[COLOR_GREEN]);
 }
 
 
@@ -1361,7 +1361,25 @@ void
 on_papercolorOther_activate            (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
-
+  GtkWidget *dialog;
+  GtkColorSelection *colorsel;
+  gint result;
+  guint rgba;
+  GdkColor gdkcolor;
+  
+  end_text();
+  dialog = gtk_color_selection_dialog_new(_("Pick a Paper Color"));
+  colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(dialog)->colorsel);
+  if (ui.cur_page->bg->type == BG_SOLID) rgba = ui.cur_page->bg->color_rgba;
+  else rgba = ui.default_page.bg->color_rgba;
+  rgb_to_gdkcolor(rgba, &gdkcolor);
+  gtk_color_selection_set_current_color(colorsel, &gdkcolor);
+  
+  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) {
+    gtk_color_selection_get_current_color(colorsel, &gdkcolor);
+    process_papercolor_activate(menuitem, COLOR_OTHER, gdkcolor_to_rgba(gdkcolor, 0xffff));
+  }
+  gtk_widget_destroy(dialog);
 }
 
 
@@ -2240,7 +2258,7 @@ on_helpAbout_activate                  (GtkMenuItem     *menuitem,
   aboutDialog = create_aboutDialog ();
   labelTitle = GTK_LABEL(g_object_get_data(G_OBJECT(aboutDialog), "labelTitle"));
   gtk_label_set_markup(labelTitle, 
-    "<span size=\"xx-large\" weight=\"bold\">Xournal " VERSION "</span>");
+    "<span size=\"xx-large\" weight=\"bold\">Xournal " VERSION_STRING "</span>");
   gtk_dialog_run (GTK_DIALOG(aboutDialog));
   gtk_widget_destroy(aboutDialog);
 }
@@ -2352,6 +2370,8 @@ on_canvas_button_press_event           (GtkWidget       *widget,
   }
   if ((event->state & (GDK_CONTROL_MASK|GDK_MOD1_MASK)) != 0) return FALSE;
     // no control-clicking or alt-clicking
+  if (!is_core) gdk_device_get_state(event->device, event->window, event->axes, NULL);
+    // synaptics touchpads send bogus axis values with ButtonDown
   if (!is_core)
     fix_xinput_coords((GdkEvent *)event);
 
@@ -2425,6 +2445,9 @@ on_canvas_button_press_event           (GtkWidget       *widget,
   
   ui.which_mouse_button = event->button;
   switch_mapping(mapping);
+#ifdef WIN32
+  update_cursor();
+#endif
 
   // in text tool, clicking in a text area edits it
   if (ui.toolno[mapping] == TOOL_TEXT) {
@@ -2526,7 +2549,21 @@ on_canvas_enter_notify_event           (GtkWidget       *widget,
                                         GdkEventCrossing *event,
                                         gpointer         user_data)
 {
+  GList *dev_list;
+  GdkDevice *dev;
 
+#ifdef INPUT_DEBUG
+  printf("DEBUG: enter notify\n");
+#endif
+    /* re-enable input devices after they've been emergency-disabled
+       by leave_notify */
+  if (!gtk_check_version(2, 17, 0)) {
+    for (dev_list = gdk_devices_list(); dev_list != NULL; dev_list = dev_list->next) {
+      dev = GDK_DEVICE(dev_list->data);
+      gdk_device_set_mode(dev, GDK_MODE_SCREEN);
+    }
+    ui.is_corestroke = ui.saved_is_corestroke;
+  }
   return FALSE;
 }
 
@@ -2535,12 +2572,21 @@ on_canvas_leave_notify_event           (GtkWidget       *widget,
                                         GdkEventCrossing *event,
                                         gpointer         user_data)
 {
+  GList *dev_list;
+  GdkDevice *dev;
+
 #ifdef INPUT_DEBUG
-  printf("DEBUG: leave notify\n");
+  printf("DEBUG: leave notify (mode=%d, details=%d)\n", event->mode, event->detail);
 #endif
-  if (ui.need_emergency_disable_xinput) {
-    gtk_widget_set_extension_events(GTK_WIDGET (canvas), GDK_EXTENSION_EVENTS_NONE);
-    ui.need_emergency_disable_xinput = FALSE;
+    /* emergency disable XInput to avoid segfaults (GTK+ 2.17) or 
+       interface non-responsiveness (GTK+ 2.18) */
+  if (!gtk_check_version(2, 17, 0)) { 
+    for (dev_list = gdk_devices_list(); dev_list != NULL; dev_list = dev_list->next) {
+      dev = GDK_DEVICE(dev_list->data);
+      gdk_device_set_mode(dev, GDK_MODE_DISABLED);
+    }
+    ui.saved_is_corestroke = ui.is_corestroke;
+    ui.is_corestroke = TRUE;
   }
   return FALSE;
 }
@@ -2671,6 +2717,9 @@ on_canvas_motion_notify_event          (GtkWidget       *widget,
     else if (ui.cur_item_type == ITEM_RESIZESEL) {
       finalize_resizesel();
     }
+    else if (ui.cur_item_type == ITEM_HAND) {
+      ui.cur_item_type = ITEM_NONE;
+    }
     switch_mapping(0);
     return FALSE;
   }
@@ -2773,7 +2822,9 @@ on_optionsUseXInput_activate           (GtkMenuItem     *menuitem,
    non-responsive). 
 */
 
+#ifndef WIN32
   if (!gtk_check_version(2, 17, 0)) {
+#endif
     /* GTK+ 2.17 and later: everybody shares a single native window,
        so we'll never get any core events, and we might as well set 
        extension events the way we're supposed to. Doing so helps solve 
@@ -2781,14 +2832,18 @@ on_optionsUseXInput_activate           (GtkMenuItem     *menuitem,
        events in 2.18 */
     gtk_widget_set_extension_events(GTK_WIDGET (canvas), 
        ui.use_xinput?GDK_EXTENSION_EVENTS_ALL:GDK_EXTENSION_EVENTS_NONE);
+#ifndef WIN32
   } else {
+#endif
     /* GTK+ 2.16 and earlier: we only activate extension events on the
        canvas's parent GdkWindow. This allows us to keep receiving core
        events. */
     gdk_input_set_extension_events(GTK_WIDGET(canvas)->window, 
       GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK,
       ui.use_xinput?GDK_EXTENSION_EVENTS_ALL:GDK_EXTENSION_EVENTS_NONE);
+#ifndef WIN32
   }
+#endif
   
   update_mappings_menu();
 }
@@ -3420,13 +3475,11 @@ on_optionsPrintRuling_activate         (GtkMenuItem     *menuitem,
 }
 
 void
-on_optionsDiscardCore_activate         (GtkMenuItem     *menuitem,
+on_optionsAutoloadPdfXoj_activate      (GtkMenuItem     *menuitem,
                                         gpointer         user_data)
 {
   end_text();
-  ui.discard_corepointer =
-    gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM (menuitem));
-  update_mappings_menu();
+  ui.autoload_pdf_xoj = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM (menuitem));
 }
 
 void