//! //! @brief To be written //! G_MODULE_EXPORT int gw_kanjipadwindow_drawingarea_button_release_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; cairo_t *cr; //Initializations window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; if (priv->annotate) { //Initializations cr = cairo_create(priv->surface); gw_kanjipadwindow_annotate_drawingarea_stroke (window, priv->curstroke, cr, g_list_length (priv->strokes) + 1); cairo_destroy(cr); gtk_widget_queue_draw (GTK_WIDGET (priv->drawingarea)); } priv->strokes = g_list_append (priv->strokes, priv->curstroke); priv->curstroke = NULL; priv->instroke = FALSE; _kanjipadwindow_initialize_drawingarea (window); return FALSE; }
//! //! @brief To be written //! G_MODULE_EXPORT gboolean gw_kanjipadwindow_candidatearea_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { //Declarations GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; GwKanjipadWindowClass *klass; int j; gint char_height; GtkClipboard *clipboard; char *string_utf; //Initializations window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; klass = GW_KANJIPADWINDOW_CLASS (G_OBJECT_GET_CLASS (window)); clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); static const GtkTargetEntry targets[] = { { "STRING", 0, 0 }, { "TEXT", 0, 0 }, { "COMPOUND_TEXT", 0, 0 }, { "UTF8_STRING", 0, 0 } }; _kanjipadwindow_erase_candidate_selection (window); _kanjipadwindow_get_candidate_character_size (window, NULL, &char_height); j = event->y / (char_height + 6); if (j < priv->total_candidates) { gw_kanjipadwindow_draw_candidates (window); strncpy(priv->kselected, priv->kanji_candidates[j], 2); _kanjipadwindow_draw_candidate_character (window, j, 1); if (!gtk_clipboard_set_with_owner (clipboard, targets, G_N_ELEMENTS (targets), _kanjipadwindow_primary_candidates_get, _kanjipadwindow_primary_candidates_clear, G_OBJECT (widget))) _kanjipadwindow_primary_candidates_clear (clipboard, widget); } else { priv->kselected[0] = 0; priv->kselected[1] = 0; if (gtk_clipboard_get_owner (clipboard) == G_OBJECT (widget)) gtk_clipboard_clear (clipboard); } gtk_widget_queue_draw (widget); string_utf = _kanjipadwindow_utf8_for_char (priv->kselected); g_signal_emit (G_OBJECT (window), klass->signalid[GW_KANJIPADWINDOW_CLASS_SIGNALID_KANJI_SELECTED], 0, string_utf); g_free (string_utf); //Cleanup so the user can draw the next character gw_kanjipadwindow_clear_drawingarea (window); return TRUE; }
static void gw_kanjipadwindow_finalize (GObject *object) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; GSource *source; GError *error; GList *link; window = GW_KANJIPADWINDOW (object); priv = window->priv; error = NULL; for (link = priv->strokes; link != NULL; link = link->next) gw_kanjipadwindow_free_drawingarea_stroke (link->data); if (priv->strokes != NULL) g_list_free (priv->strokes); priv->strokes = NULL; if (priv->strokes != NULL) g_list_free (priv->curstroke); priv->curstroke = NULL; if (priv->ksurface != NULL) cairo_surface_destroy (priv->ksurface); priv->ksurface = NULL; if (priv->surface != NULL) cairo_surface_destroy (priv->surface); priv->surface = NULL; if (g_main_current_source () != NULL && !g_source_is_destroyed (g_main_current_source ()) && priv->iowatchid > 0 ) { source = g_main_context_find_source_by_id (NULL, priv->iowatchid); if (source != NULL) { g_source_destroy (source); } } priv->iowatchid = 0; if (error == NULL) { g_io_channel_shutdown (priv->from_engine, FALSE, &error); g_io_channel_unref (priv->from_engine); priv->from_engine = NULL; } if (error == NULL) { g_io_channel_shutdown (priv->to_engine, FALSE, &error); g_io_channel_unref (priv->to_engine); priv->to_engine = NULL; } g_spawn_close_pid (priv->engine_pid); if (error != NULL) { fprintf(stderr, "Errored: %s\n", error->message); exit(EXIT_FAILURE); } G_OBJECT_CLASS (gw_kanjipadwindow_parent_class)->finalize (object); }
//! //! @brief To be written //! static gboolean _kanjipadwindow_engine_input_handler (GIOChannel *source, GIOCondition condition, gpointer data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; static gchar *p; static gchar *line; GError *error; GIOStatus status; int i; window = GW_KANJIPADWINDOW (data); priv = window->priv; error = NULL; status = g_io_channel_read_line (priv->from_engine, &line, NULL, NULL, &error); switch (status) { case G_IO_STATUS_ERROR: fprintf (stderr, "Error reading from engine: %s\n", error->message); exit(EXIT_FAILURE); break; case G_IO_STATUS_NORMAL: break; case G_IO_STATUS_EOF: fprintf (stderr, "Engine no longer exists"); exit (EXIT_FAILURE); break; case G_IO_STATUS_AGAIN: g_assert_not_reached (); break; } if (line[0] == 'K') { unsigned int t1, t2; p = line + 1; for (i = 0; i < GW_KANJIPADWINDOW_MAX_GUESSES; i++) { while (*p && isspace(*p)) p++; if (!*p || sscanf(p, "%2x%2x", &t1, &t2) != 2) { i--; break; } priv->kanji_candidates[i][0] = t1; priv->kanji_candidates[i][1] = t2; while (*p && !isspace(*p)) p++; } priv->total_candidates = i + 1; gw_kanjipadwindow_draw_candidates (window); } g_free (line); return TRUE; }
//! //! @brief To be written //! G_MODULE_EXPORT int gw_kanjipadwindow_drawingarea_draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; if (priv->surface == NULL) return FALSE; cairo_set_source_surface (cr, priv->surface, 0, 0); cairo_paint (cr); return TRUE; }
//! //! @brief To be written //! static void _kanjipadwindow_primary_candidates_get (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info, gpointer data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; gchar *string_utf; window = GW_KANJIPADWINDOW (data); priv = window->priv; if (priv->kselected[0] || priv->kselected[1]) { string_utf = _kanjipadwindow_utf8_for_char (priv->kselected); gtk_selection_data_set_text (selection_data, string_utf, -1); g_free (string_utf); } }
//! //! @brief To be written //! static void _kanjipadwindow_primary_candidates_clear (GtkClipboard *clipboard, gpointer data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; window = GW_KANJIPADWINDOW (data); if (window == NULL) return; priv = window->priv; _kanjipadwindow_erase_candidate_selection (window); priv->kselected[0] = 0; priv->kselected[1] = 0; gtk_widget_queue_draw (GTK_WIDGET (priv->candidates)); }
//! //! @brief Sets up the variables in main-interface.c and main-callbacks.c for use //! GtkWindow* gw_kanjipadwindow_new (GtkApplication *application) { g_assert (application != NULL); //Declarations GwKanjipadWindow *window; //Initializations window = GW_KANJIPADWINDOW (g_object_new (GW_TYPE_KANJIPADWINDOW, "type", GTK_WINDOW_TOPLEVEL, "application", GW_APPLICATION (application), "ui-xml", "kanjipadwindow.ui", NULL)); return GTK_WINDOW (window); }
//! //! @brief To be written //! G_MODULE_EXPORT gboolean gw_kanjipadwindow_candidatearea_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; if (priv->ksurface) cairo_surface_destroy (priv->ksurface); priv->ksurface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, event->width, event->height); gw_kanjipadwindow_draw_candidates (window); return TRUE; }
//! //! @brief To be written //! G_MODULE_EXPORT gboolean gw_kanjipadwindow_candidatearea_draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; //Sanity check if (priv->ksurface == NULL) return FALSE; cairo_set_source_surface (cr, priv->ksurface, 0, 0); gw_kanjipadwindow_draw_candidates (window); if (priv->kanji_candidate_index > -1) _kanjipadwindow_draw_candidate_character (window, priv->kanji_candidate_index, 1); cairo_paint (cr); return TRUE; }
//! //! @brief To be written //! G_MODULE_EXPORT int gw_kanjipadwindow_drawingarea_button_press_event_cb (GtkWidget *widget, GdkEventButton *event, gpointer *data) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; GdkPoint *point; window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; if (event->button == 1) { point = g_new (GdkPoint, 1); point->x = event->x; point->y = event->y; priv->curstroke = g_list_append (priv->curstroke, point); priv->instroke = TRUE; } return TRUE; }
static void gw_kanjipadwindow_constructed (GObject *object) { GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; GtkAccelGroup *accelgroup; //Chain the parent class { G_OBJECT_CLASS (gw_kanjipadwindow_parent_class)->constructed (object); } window = GW_KANJIPADWINDOW (object); priv = window->priv; accelgroup = gw_window_get_accel_group (GW_WINDOW (window)); gw_kanjipadwindow_map_actions (G_ACTION_MAP (window), window); gtk_window_set_title (GTK_WINDOW (window), gettext("gWaei Kanjipad")); gtk_window_set_resizable (GTK_WINDOW (window), FALSE); gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_UTILITY); gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), TRUE); gtk_window_set_skip_pager_hint (GTK_WINDOW (window), TRUE); gtk_window_set_destroy_with_parent (GTK_WINDOW (window), TRUE); gtk_window_set_icon_name (GTK_WINDOW (window), "gwaei"); priv->drawingarea = GTK_DRAWING_AREA (gw_window_get_object (GW_WINDOW (window), "kdrawing_area")); priv->candidates = GTK_DRAWING_AREA (gw_window_get_object (GW_WINDOW (window), "kguesses")); priv->close_button = GTK_BUTTON (gw_window_get_object (GW_WINDOW (window), "close_button")); gw_kanjipadwindow_initialize_drawingarea (window); gw_kanjipadwindow_initialize_candidates (window); _kanjipadwindow_initialize_engine (window); gtk_widget_add_accelerator (GTK_WIDGET (priv->close_button), "activate", accelgroup, (GDK_KEY_Escape), 0, GTK_ACCEL_VISIBLE); gtk_actionable_set_detailed_action_name (GTK_ACTIONABLE (priv->close_button), "win.close"); gw_window_unload_xml (GW_WINDOW (window)); }
//! //! @brief To be written //! G_MODULE_EXPORT int gw_kanjipadwindow_drawingarea_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer data) { //Declarations GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; //Initializations window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; if (priv->surface != NULL) { cairo_surface_destroy (priv->surface); priv->surface = NULL; } priv->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, event->width, event->height); _kanjipadwindow_initialize_drawingarea (window); return TRUE; }
//! //! @brief To be written //! G_MODULE_EXPORT gint gw_kanjipadwindow_drawingarea_motion_event_cb (GtkWidget *widget, GdkEventMotion *event, gpointer data) { //Declarations GwKanjipadWindow *window; GwKanjipadWindowPrivate *priv; gint x,y; GdkModifierType state; GdkRectangle rect; GdkPoint *point; int xmin, ymin, xmax, ymax; GdkPoint *old; cairo_t *cr; window = GW_KANJIPADWINDOW (gtk_widget_get_ancestor (GTK_WIDGET (data), GW_TYPE_KANJIPADWINDOW)); if (window == NULL) return FALSE; priv = window->priv; if (event->is_hint) { gdk_window_get_device_position ( gtk_widget_get_window (GTK_WIDGET (widget)), gdk_event_get_device ((GdkEvent*) event), &x, &y, &state ); } else { x = event->x; y = event->y; state = event->state; } if (priv->instroke == TRUE && (state & GDK_BUTTON1_MASK)) { old = (GdkPoint*) g_list_last (priv->curstroke)->data; //extend line cr = cairo_create(priv->surface); cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); cairo_set_line_width (cr, 2.0 ); cairo_move_to (cr, old->x, old->y); cairo_line_to (cr, x, y); cairo_stroke (cr); cairo_destroy(cr); if (old->x < x) { xmin = old->x; xmax = x; } else { xmin = x; xmax = old->x; } if (old->y < y) { ymin = old->y; ymax = y; } else { ymin = y; ymax = old->y; } rect.x = xmin - 1 - 3; rect.y = ymin = 1 - 3; rect.width = xmax - xmin + 2 + 3; rect.height = ymax - ymin + 2 + 3; gdk_window_invalidate_rect (gtk_widget_get_window (widget), &rect, FALSE); point = g_new (GdkPoint, 1); point->x = x; point->y = y; priv->curstroke = g_list_append (priv->curstroke, point); gtk_widget_queue_draw (GTK_WIDGET (priv->drawingarea)); } return TRUE; }