Exemplo n.º 1
0
//!
//! @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;
}
Exemplo n.º 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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
//!
//! @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;
}
Exemplo n.º 5
0
//!
//! @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;
}
Exemplo n.º 6
0
//!
//! @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);
    }
}
Exemplo n.º 7
0
//!
//! @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));
}
Exemplo n.º 8
0
//!
//! @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);
}
Exemplo n.º 9
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);

    return TRUE;
}
Exemplo n.º 10
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;
}
Exemplo n.º 11
0
//!
//! @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;
}
Exemplo n.º 12
0
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));
}
Exemplo n.º 13
0
//!
//! @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;
}
Exemplo n.º 14
0
//!
//! @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;
}