//! //! @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; }
//! //! @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 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; }