예제 #1
0
//!
//! @brief To be written
//!
void gw_kanjipadwindow_draw_candidates (GwKanjipadWindow *window)
{
    //Declarations
    GwKanjipadWindowPrivate *priv;
    //gint width;
    //gint height;
    int i;
    cairo_t *cr;

    //Initializations
    priv = window->priv;
    //height = gtk_widget_get_allocated_height (GTK_WIDGET (priv->candidates));
    //width = gtk_widget_get_allocated_width (GTK_WIDGET (priv->candidates));
    cr = cairo_create (priv->ksurface);

    cairo_save (cr);
    cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
    cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
    cairo_paint (cr);
    cairo_fill (cr);
    cairo_restore (cr);

    for (i = 0; i < priv->total_candidates; i++)
    {
      if (strcmp (priv->kselected, priv->kanji_candidates[i]) == 0)
        _kanjipadwindow_draw_candidate_character (window, i, 1);
      else
        _kanjipadwindow_draw_candidate_character (window, i, -1);
    }

    gtk_widget_queue_draw (GTK_WIDGET (priv->candidates));

    cairo_destroy (cr);
    cr = NULL;
}
예제 #2
0
//!
//! @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;
}
예제 #3
0
//!
//! @brief To be written
//!
void gw_kanjipadwindow_draw_candidates (GwKanjipadWindow *window)
{
    //Declarations
    GwKanjipadWindowPrivate *priv;
    //gint width;
    //gint height;
    int i;
    cairo_t *cr;
    GtkStyleContext *context;
    GtkStateFlags state;
    GdkRGBA bgcolor;

    //Initializations
    priv = window->priv;
    //height = gtk_widget_get_allocated_height (GTK_WIDGET (priv->candidates));
    //width = gtk_widget_get_allocated_width (GTK_WIDGET (priv->candidates));
    cr = cairo_create (priv->ksurface);
    context = gtk_widget_get_style_context (GTK_WIDGET (priv->candidates));
    state = gtk_widget_get_state_flags (GTK_WIDGET (priv->drawingarea));
    gtk_style_context_get_background_color (context, state, &bgcolor);

    cairo_save (cr);
    gdk_cairo_set_source_rgba (cr, &bgcolor);
    cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
    cairo_paint (cr);
    cairo_fill (cr);
    cairo_restore (cr);

    for (i = 0; i < priv->total_candidates; i++)
    {
      if (strcmp (priv->kselected, priv->kanji_candidates[i]) == 0)
        _kanjipadwindow_draw_candidate_character (window, i, 1);
      else
        _kanjipadwindow_draw_candidate_character (window, i, -1);
    }

    gtk_widget_queue_draw (GTK_WIDGET (priv->candidates));

    cairo_destroy (cr);
    cr = NULL;
}
예제 #4
0
//!
//! @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);
    if (priv->kanji_candidate_index > -1) _kanjipadwindow_draw_candidate_character (window, priv->kanji_candidate_index, 1);

    return TRUE;
}
예제 #5
0
//!
//! @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;
}
예제 #6
0
//!
//! @brief To be written
//!
static int _kanjipadwindow_erase_candidate_selection (GwKanjipadWindow *window)
{
    //Declarations
    GwKanjipadWindowPrivate *priv;
    int i;

    //Initializations
    priv = window->priv;

    if (priv->kselected[0] || priv->kselected[1])
    {
      for (i = 0; i < priv->total_candidates; i++)
      {
        if (strncmp (priv->kselected, priv->kanji_candidates[i], 2))
        {
          _kanjipadwindow_draw_candidate_character (window, i, 0);
        }
      }
    }
    return TRUE;
}