Revision: 7173
Author:   ek.kato
Date:     Sat Jul  2 00:30:48 2011
Log:      * gtk2/immodule/uim-cand-win-horizontal-gtk.c
  - (uim_cand_win_horizontal_gtk_init) : Connect "draw" signal to
    label_draw() for GTK+3.
  - (label_draw) : New for GTK+3.
  - (label_exposed) : Use for GTK+2 only.
  - (button_clicked) : Use gtk_widget_unmap() and gtk_widget_map()
    to redraw labels.
  - (assign_cellbutton) : Connect "draw" signal to label_draw()
    for GTK+3.
  - (uim_cand_win_horizontal_gtk_set_index) : Use
    gtk_widget_unmap() and gtk_widget_map() to redraw labels.

http://code.google.com/p/uim/source/detail?r=7173

Modified:
 /trunk/gtk2/immodule/uim-cand-win-horizontal-gtk.c

=======================================
--- /trunk/gtk2/immodule/uim-cand-win-horizontal-gtk.c Fri Jul 1 07:57:02 2011 +++ /trunk/gtk2/immodule/uim-cand-win-horizontal-gtk.c Sat Jul 2 00:30:48 2011
@@ -62,7 +62,11 @@
static void uim_cand_win_horizontal_gtk_class_init(UIMCandWinGtkClass *klass);
 static void uim_cand_win_horizontal_gtk_dispose(GObject *obj);
static void button_clicked(GtkEventBox *button, GdkEventButton *event, gpointer data);
+#if GTK_CHECK_VERSION(2, 90, 0)
+static gboolean label_draw(GtkWidget *label, cairo_t *cr, gpointer data);
+#else
static gboolean label_exposed(GtkWidget *label, GdkEventExpose *event, gpointer data);
+#endif
 static void clear_button(struct index_button *idxbutton, gint cell_index);
 static void show_table(GtkTable *view, GPtrArray *buttons);
 static void scale_label(GtkEventBox *button, double factor);
@@ -148,7 +152,7 @@
     scale_label(GTK_EVENT_BOX(button), PANGO_SCALE_LARGE);
g_signal_connect(button, "button-press-event", G_CALLBACK(button_clicked), horizontal_cwin);
 #if GTK_CHECK_VERSION(2, 90, 0)
- g_signal_connect_after(label, "draw", G_CALLBACK(label_exposed), horizontal_cwin); + g_signal_connect_after(label, "draw", G_CALLBACK(label_draw), horizontal_cwin);
 #else
g_signal_connect_after(label, "expose-event", G_CALLBACK(label_exposed), horizontal_cwin);
 #endif
@@ -201,8 +205,9 @@
 }
 #endif

+#if GTK_CHECK_VERSION(2, 90, 0)
 static gboolean
-label_exposed(GtkWidget *label, GdkEventExpose *event, gpointer data)
+label_draw(GtkWidget *label, cairo_t *cr, gpointer data)
 {
   UIMCandWinHorizontalGtk *horizontal_cwin = data;
   struct index_button *selected;
@@ -213,10 +218,47 @@
     selected_label = gtk_bin_get_child(GTK_BIN(selected->button));

   if (label == selected_label) {
-#if GTK_CHECK_VERSION(2, 90, 0)
-    /* FIXME */
-    ;
+    GdkRGBA *bg_color, *fg_color;
+    GtkStyleContext *context;
+    PangoLayout *layout;
+    gint x, y;
+    GtkStateFlags state;
+
+    layout = gtk_label_get_layout(GTK_LABEL(label));
+    gtk_label_get_layout_offsets(GTK_LABEL(label), &x, &y);
+
+    context = gtk_widget_get_style_context(label);
+
+    state = GTK_STATE_FLAG_SELECTED;
+ gtk_style_context_get (context, state, "background-color", &bg_color, "color", &fg_color, NULL);
+
+    cairo_save(cr);
+    gdk_cairo_set_source_rgba(cr, bg_color);
+    cairo_paint(cr);
+    cairo_restore(cr);
+    gdk_rgba_free(bg_color);
+    gdk_rgba_free(fg_color);
+
+
+    gtk_style_context_set_state (context, state);
+    gtk_render_layout (context, cr, x, y, layout);
+  }
+
+  return FALSE;
+}
 #else
+static gboolean
+label_exposed(GtkWidget *label, GdkEventExpose *event, gpointer data)
+{
+  UIMCandWinHorizontalGtk *horizontal_cwin = data;
+  struct index_button *selected;
+  GtkWidget *selected_label = NULL;
+
+  selected = horizontal_cwin->selected;
+  if (selected)
+    selected_label = gtk_bin_get_child(GTK_BIN(selected->button));
+
+  if (label == selected_label) {
     gint x;
     get_layout_x(GTK_LABEL(label), &x);
     gdk_draw_layout_with_colors(label->window,
@@ -224,11 +266,11 @@
                      GTK_LABEL(label)->layout,
                      &label->style->text[GTK_STATE_SELECTED],
                      &label->style->bg[GTK_STATE_SELECTED]);
-#endif
   }

   return FALSE;
 }
+#endif

 static void
 button_clicked(GtkEventBox *button, GdkEventButton *event, gpointer data)
@@ -242,18 +284,8 @@
   prev_selected = horizontal_cwin->selected;
   if (prev_selected) {
     GtkWidget *label = gtk_bin_get_child(GTK_BIN(prev_selected->button));
-#if GTK_CHECK_VERSION(2, 90, 0)
-    /* FIXME */
-    ;
-#else
-    gint x;
-    get_layout_x(GTK_LABEL(label), &x);
-    gdk_draw_layout_with_colors(label->window,
-                     label->style->black_gc, x, 0,
-                     GTK_LABEL(label)->layout,
-                     &label->style->text[GTK_STATE_NORMAL],
-                     &label->style->bg[GTK_STATE_NORMAL]);
-#endif
+    gtk_widget_unmap(label);
+    gtk_widget_map(label);
   }

   for (i = 0; i < (gint)horizontal_cwin->buttons->len; i++) {
@@ -266,20 +298,9 @@
     p = idxbutton->button;
     if (p == button) {
       GtkWidget *label = gtk_bin_get_child(GTK_BIN(button));
-      gint x;
       idx = idxbutton->cand_index_in_page;
-#if GTK_CHECK_VERSION(2, 90, 0)
-      /* FIXME */
-#else
-      get_layout_x(GTK_LABEL(label), &x);
-      if (GTK_LABEL(label)->layout) {
-        gdk_draw_layout_with_colors(label->window,
-                     label->style->black_gc, x, 0,
-                     GTK_LABEL(label)->layout,
-                     &label->style->text[GTK_STATE_SELECTED],
-                     &label->style->bg[GTK_STATE_SELECTED]);
-      }
-#endif
+      gtk_widget_unmap(label);
+      gtk_widget_map(label);
       horizontal_cwin->selected = idxbutton;
       break;
     }
@@ -355,7 +376,7 @@
     scale_label(GTK_EVENT_BOX(button), PANGO_SCALE_LARGE);
g_signal_connect(button, "button-press-event", G_CALLBACK(button_clicked), horizontal_cwin);
 #if GTK_CHECK_VERSION(2, 90, 0)
- g_signal_connect_after(label, "draw", G_CALLBACK(label_exposed), horizontal_cwin); + g_signal_connect_after(label, "draw", G_CALLBACK(label_draw), horizontal_cwin);
 #else
g_signal_connect_after(label, "expose-event", G_CALLBACK(label_exposed), horizontal_cwin);
 #endif
@@ -399,7 +420,7 @@
     uim_cand_win_gtk_set_page(cwin, new_page);

   if (cwin->candidate_index >= 0) {
-    gint pos, x;
+    gint pos;
     struct index_button *idxbutton, *prev_selected;
     GtkWidget *label;

@@ -412,33 +433,12 @@
     prev_selected = (gpointer)horizontal_cwin->selected;
     if (prev_selected && prev_index != cwin->candidate_index) {
       label = gtk_bin_get_child(GTK_BIN(prev_selected->button));
-
-#if GTK_CHECK_VERSION(2, 90, 0)
-      /* FIXME */
-#else
-      if (GTK_LABEL(label)->layout) {
-        get_layout_x(GTK_LABEL(label), &x);
-        gdk_draw_layout_with_colors(label->window,
-                     label->style->black_gc, x, 0,
-                     GTK_LABEL(label)->layout,
-                     &label->style->text[GTK_STATE_NORMAL],
-                     &label->style->bg[GTK_STATE_NORMAL]);
-      }
-#endif
+      gtk_widget_unmap(label);
+      gtk_widget_map(label);
     }
     label = gtk_bin_get_child(GTK_BIN(idxbutton->button));
-#if GTK_CHECK_VERSION(2, 90, 0)
-    /* FIXME */
-#else
-    get_layout_x(GTK_LABEL(label), &x);
-    if (GTK_LABEL(label)->layout) {
-      gdk_draw_layout_with_colors(label->window,
-                     label->style->black_gc, x, 0,
-                     GTK_LABEL(label)->layout,
-                     &label->style->text[GTK_STATE_SELECTED],
-                     &label->style->bg[GTK_STATE_SELECTED]);
-    }
-#endif
+    gtk_widget_unmap(label);
+    gtk_widget_map(label);
     horizontal_cwin->selected = idxbutton;

     /* show subwin */

Reply via email to