/* Unset focus from actor */ static void _xfdashboard_text_box_focusable_unset_focus(XfdashboardFocusable *inFocusable) { ClutterActor *self; XfdashboardFocusableInterface *selfIface; XfdashboardFocusableInterface *parentIface; ClutterStage *stage; g_return_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable)); g_return_if_fail(XFDASHBOARD_IS_ACTOR(inFocusable)); self=CLUTTER_ACTOR(inFocusable); /* Call parent class interface function */ selfIface=XFDASHBOARD_FOCUSABLE_GET_IFACE(inFocusable); parentIface=g_type_interface_peek_parent(selfIface); if(parentIface && parentIface->unset_focus) { parentIface->unset_focus(inFocusable); } /* Get stage of actor to tell it where the keyboard focus to set to */ stage=CLUTTER_STAGE(clutter_actor_get_stage(self)); if(!stage) { g_warning(_("Focusable actor %s is not on a stage"), G_OBJECT_TYPE_NAME(self)); return; } clutter_stage_set_key_focus(stage, NULL); }
static void meta_switcher_dispose(GObject *object) { MetaSwitcher *switcher = META_SWITCHER(object); MetaSwitcherPrivate* priv = switcher->priv; if (priv->disposed) return; priv->disposed = TRUE; MetaScreen* screen = meta_plugin_get_screen(priv->plugin); ClutterActor* stage = meta_get_stage_for_screen(screen); clutter_actor_remove_child(stage, priv->top); if (priv->modaled) { meta_plugin_end_modal(priv->plugin, clutter_get_current_event_time()); meta_enable_unredirect_for_screen(screen); if (priv->selected_id < 0 && priv->previous_focused) clutter_stage_set_key_focus(CLUTTER_STAGE(stage), priv->previous_focused); } if (CLUTTER_IS_ACTOR(priv->top)) { g_clear_pointer(&priv->top, clutter_actor_destroy); } else priv->top = NULL; if (priv->autoclose_id) { g_source_remove(priv->autoclose_id); priv->autoclose_id = 0; } GList* ws_list = meta_screen_get_workspaces(screen); g_list_foreach(ws_list, (GFunc)unhook_ws_event, switcher); G_OBJECT_CLASS(meta_switcher_parent_class)->dispose(object); }
static VALUE rbclt_stage_set_key_focus (VALUE self, VALUE actor) { ClutterStage *stage = CLUTTER_STAGE (RVAL2GOBJ (self)); clutter_stage_set_key_focus (stage, RVAL2GOBJ (actor)); return self; }
G_MODULE_EXPORT gint test_text_main (gint argc, gchar **argv) { ClutterActor *stage; ClutterActor *text; ClutterColor text_color = { 0x33, 0xff, 0x33, 0xff }; ClutterColor cursor_color = { 0xff, 0x33, 0x33, 0xff }; ClutterColor background_color = { 0x00, 0x00, 0x00, 0xff }; clutter_init (&argc, &argv); stage = clutter_stage_get_default (); clutter_stage_set_color (CLUTTER_STAGE (stage), &background_color); text = clutter_text_new_full (FONT, "·", &text_color); clutter_container_add (CLUTTER_CONTAINER (stage), text, NULL); clutter_actor_set_position (text, 40, 30); clutter_actor_set_width (text, 1024); clutter_text_set_line_wrap (CLUTTER_TEXT (text), TRUE); clutter_actor_set_reactive (text, TRUE); clutter_stage_set_key_focus (CLUTTER_STAGE (stage), text); clutter_text_set_editable (CLUTTER_TEXT (text), TRUE); clutter_text_set_selectable (CLUTTER_TEXT (text), TRUE); clutter_text_set_cursor_color (CLUTTER_TEXT (text), &cursor_color); if (argv[1]) { GError *error = NULL; gchar *utf8; g_file_get_contents (argv[1], &utf8, NULL, &error); if (error) { utf8 = g_strconcat ("Unable to open '", argv[1], "':\n", error->message, NULL); g_error_free (error); } clutter_text_set_text (CLUTTER_TEXT (text), utf8); } else clutter_text_set_text (CLUTTER_TEXT (text), runes); clutter_actor_set_size (stage, 1024, 768); clutter_actor_show (stage); clutter_main (); return EXIT_SUCCESS; }
static void update_active_actor (void) { if (g_list_length (selected)==1) { cs_set_active (cs_selected_get_any ()); } else { cs_set_active (NULL); } if (g_list_length (selected)>0) clutter_stage_set_key_focus (CLUTTER_STAGE (clutter_actor_get_stage (cs->parasite_root)), NULL); }
/* Actor got key focus */ static void _xfdashboard_text_box_key_focus_in(ClutterActor *inActor) { XfdashboardTextBox *self=XFDASHBOARD_TEXT_BOX(inActor); XfdashboardTextBoxPrivate *priv=self->priv; ClutterStage *stage; XfdashboardFocusManager *focusManager; /* Push key focus forward to text box */ stage=CLUTTER_STAGE(clutter_actor_get_stage(inActor)); clutter_stage_set_key_focus(stage, priv->actorTextBox); /* Update focus in focus manager */ focusManager=xfdashboard_focus_manager_get_default(); xfdashboard_focus_manager_set_focus(focusManager, XFDASHBOARD_FOCUSABLE(self)); g_object_unref(focusManager); }
gboolean meta_switcher_show(MetaSwitcher* self) { MetaSwitcherPrivate* priv = self->priv; int screen_width, screen_height; MetaScreen* screen = meta_plugin_get_screen(priv->plugin); priv->workspace = meta_screen_get_active_workspace(screen); meta_screen_get_size(screen, &screen_width, &screen_height); meta_switcher_present_list(self); if (priv->apps == NULL || priv->apps->len == 0) goto _end; _capture_desktop(self); clutter_content_invalidate(clutter_actor_get_content(priv->top)); ClutterActor* stage = meta_get_stage_for_screen(screen); clutter_actor_insert_child_above(stage, priv->top, NULL); clutter_actor_show(priv->top); if (!meta_plugin_begin_modal(priv->plugin, 0, clutter_get_current_event_time())) { if (!meta_plugin_begin_modal(priv->plugin, META_MODAL_POINTER_ALREADY_GRABBED, clutter_get_current_event_time())) { g_warning("can not be modal"); goto _end; } } meta_disable_unredirect_for_screen(screen); priv->modaled = TRUE; priv->previous_focused = clutter_stage_get_key_focus(CLUTTER_STAGE(stage)); if (priv->previous_focused == stage) priv->previous_focused = NULL; clutter_stage_set_key_focus(CLUTTER_STAGE(stage), priv->top); clutter_actor_grab_key_focus(priv->top); return TRUE; _end: clutter_actor_hide(priv->top); return FALSE; }
void moses_overview_show(MosesOverview* self, gboolean all_windows) { MosesOverviewPrivate* priv = self->priv; MetaRectangle geom; MetaScreen* screen = meta_plugin_get_screen(priv->plugin); int focused_monitor = meta_screen_get_current_monitor(screen); meta_screen_get_monitor_geometry(screen, focused_monitor, &geom); // FIXME: overview is as big as the current monitor, // need to take care multiple monitors ClutterActor* stage = meta_get_stage_for_screen(screen); ClutterActor* top = CLUTTER_ACTOR(self); clutter_actor_set_size(top, geom.width, geom.height); clutter_actor_insert_child_above(stage, top, NULL); moses_overview_setup(self); priv->previous_focused = clutter_stage_get_key_focus(CLUTTER_STAGE(stage)); if (!meta_plugin_begin_modal(priv->plugin, 0, clutter_get_current_event_time())) { g_warning("can not be modal"); goto _end; } meta_disable_unredirect_for_screen(screen); clutter_actor_show(top); clutter_stage_set_key_focus(CLUTTER_STAGE(stage), top); clutter_actor_grab_key_focus(top); priv->modaled = TRUE; g_idle_add((GSourceFunc)on_idle, self); return; _end: clutter_actor_destroy(CLUTTER_ACTOR(self)); }
static void make_window_content (MplPanelClutter *panel) { ClutterActor *stage = mpl_panel_clutter_get_stage (panel); ClutterActor *label; ClutterColor black = {0, 0, 0, 0xff}; ClutterColor red = {0xff, 0, 0, 0xff}; #if 0 label = clutter_text_new_with_text ("Sans 16pt", "This is a clutter panel"); clutter_text_set_color (CLUTTER_TEXT (label), &black); clutter_text_set_editable (CLUTTER_TEXT (label), TRUE); clutter_stage_set_key_focus (CLUTTER_STAGE (stage), label); #else label = clutter_rectangle_new_with_color (&black); clutter_actor_set_size (label, 50.0,50.0); clutter_actor_show (label); #endif mpl_panel_clutter_set_child (panel, label); clutter_stage_set_color (CLUTTER_STAGE (stage), &red); }
static void moses_overview_dispose(GObject *object) { MosesOverview *overview = MOSES_OVERVIEW(object); MosesOverviewPrivate* priv = overview->priv; if (priv->disposed) return; priv->disposed = TRUE; g_clear_pointer(&priv->ov_head, g_object_unref); MetaScreen* screen = meta_plugin_get_screen(priv->plugin); ClutterActor* stage = meta_get_stage_for_screen(screen); ClutterActor* to_focus = NULL; if (priv->selected_actor) { to_focus = clutter_clone_get_source(CLUTTER_CLONE(priv->selected_actor)); } for (int i = 0; priv->clones && i < priv->clones->len; i++) { ClutterActor* clone = g_ptr_array_index(priv->clones, i); ClutterActor* orig = clutter_clone_get_source(CLUTTER_CLONE(clone)); clutter_actor_show(orig); // FIXME: maybe some actors had not been shown. clutter_actor_destroy(clone); } for (int i = 0; priv->badges && i < priv->badges->len; i++) { clutter_actor_destroy(CLUTTER_ACTOR(g_ptr_array_index(priv->badges, i))); } if (priv->background_actor) { clutter_actor_show(clutter_clone_get_source(CLUTTER_CLONE(priv->background_actor))); g_clear_pointer(&priv->background_actor, clutter_actor_destroy); } if (priv->modaled) { meta_plugin_end_modal(priv->plugin, clutter_get_current_event_time()); meta_enable_unredirect_for_screen(screen); if (priv->selected_workspace) { meta_workspace_activate(priv->selected_workspace, CLUTTER_CURRENT_TIME); MetaDisplay* display = meta_screen_get_display(screen); meta_compositor_switch_workspace(meta_display_get_compositor(display), meta_screen_get_active_workspace(screen), priv->selected_workspace, META_MOTION_DOWN); } else if (to_focus) { clutter_stage_set_key_focus(CLUTTER_STAGE(stage), to_focus); MetaWindowActor* actor = META_WINDOW_ACTOR(to_focus); MetaWindow* win = meta_window_actor_get_meta_window(actor); meta_window_raise(win); meta_window_focus(win, CLUTTER_CURRENT_TIME); } else if (priv->previous_focused) { if (!CLUTTER_IS_STAGE(priv->previous_focused)) { clutter_stage_set_key_focus(CLUTTER_STAGE(stage), priv->previous_focused); } } } G_OBJECT_CLASS(moses_overview_parent_class)->dispose(object); }
G_MODULE_EXPORT int test_binding_pool_main (int argc, char *argv[]) { ClutterActor *stage, *key_group; gint group_x, group_y; if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) return 1; stage = clutter_stage_get_default (); g_signal_connect (stage, "button-press-event", G_CALLBACK (clutter_main_quit), NULL); key_group = g_object_new (TYPE_KEY_GROUP, NULL); clutter_container_add_actor (CLUTTER_CONTAINER (stage), key_group); /* add three rectangles to the key group */ clutter_container_add (CLUTTER_CONTAINER (key_group), g_object_new (CLUTTER_TYPE_RECTANGLE, "color", CLUTTER_COLOR_Red, "width", 50.0, "height", 50.0, "x", 0.0, "y", 0.0, NULL), g_object_new (CLUTTER_TYPE_RECTANGLE, "color", CLUTTER_COLOR_Green, "width", 50.0, "height", 50.0, "x", 75.0, "y", 0.0, NULL), g_object_new (CLUTTER_TYPE_RECTANGLE, "color", CLUTTER_COLOR_Blue, "width", 50.0, "height", 50.0, "x", 150.0, "y", 0.0, NULL), NULL); g_signal_connect (key_group, "activate", G_CALLBACK (on_key_group_activate), NULL); group_x = (clutter_actor_get_width (stage) - clutter_actor_get_width (key_group)) / 2; group_y = (clutter_actor_get_height (stage) - clutter_actor_get_height (key_group)) / 2; clutter_actor_set_position (key_group, group_x, group_y); clutter_actor_set_reactive (key_group, TRUE); clutter_stage_set_key_focus (CLUTTER_STAGE (stage), key_group); clutter_actor_show (stage); clutter_main (); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { ClutterColor stage_color = { 0x00, 0x00, 0x00, 0xff }; ClutterColor actor_color = { 0xff, 0xff, 0xcc, 0xff }; clutter_init (&argc, &argv); /* Get the stage and set its size and color: */ ClutterActor *stage = clutter_stage_get_default (); clutter_actor_set_size (stage, 800, 200); clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); /* Add a non-editable text actor to the stage: */ ClutterActor *text = clutter_text_new (); /* Setup text properties */ clutter_text_set_color (CLUTTER_TEXT (text), &actor_color); clutter_text_set_text (CLUTTER_TEXT (text), "Non-editable text: Wizard imps and sweat sock pimps, interstellar mongrel nymphs."); clutter_text_set_font_name (CLUTTER_TEXT (text), "Sans 12"); clutter_text_set_editable (CLUTTER_TEXT (text), FALSE); clutter_text_set_line_wrap (CLUTTER_TEXT (text), FALSE); /* Discover the preferred height and use that height: */ float min_height = 0; float natural_height = 0; clutter_actor_get_preferred_height (text, 750, &min_height, &natural_height); clutter_actor_set_size (text, 750, natural_height); clutter_actor_set_position (text, 5, 5); clutter_container_add_actor (CLUTTER_CONTAINER (stage), text); clutter_actor_show (text); /* Add a multi-line editable text actor to the stage: */ text = clutter_text_new (); /* Setup text properties */ clutter_text_set_color (CLUTTER_TEXT (text), &actor_color); clutter_text_set_text (CLUTTER_TEXT (text), "Editable text: And as I sat there brooding on the old, unknown world, I thought of " "Gatsby's wonder when he first picked out the green light at the end of " "Daisy's dock. He had come a long way to this blue lawn and his dream " "must have seemed so close that he could hardly fail to grasp it. He did " "not know that it was already behind him, somewhere back in that vast " "obscurity beyond the city, where the dark fields of the republic rolled " "on under the night."); clutter_text_set_font_name (CLUTTER_TEXT (text), "Sans 12"); clutter_text_set_editable (CLUTTER_TEXT (text), TRUE); clutter_text_set_line_wrap (CLUTTER_TEXT (text), TRUE); /* Discover the preferred height and use that height: */ min_height = 0; natural_height = 0; clutter_actor_get_preferred_height (text, 750, &min_height, &natural_height); clutter_actor_set_size (text, 750, natural_height); clutter_actor_set_position (text, 5, 50); clutter_container_add_actor (CLUTTER_CONTAINER (stage), text); clutter_actor_show (text); /* Set focus to handle key presses on the stage: */ clutter_stage_set_key_focus (CLUTTER_STAGE (stage), text); /* Show the stage: */ clutter_actor_show (stage); /* Start the main loop, so we can respond to events: */ clutter_main (); return EXIT_SUCCESS; }
void entry_main (ClutterContainer *stage) { ClutterActor *entry, *button, *clear_button; entry = mx_entry_new_with_text ("Hello World!"); clutter_actor_set_position (entry, 20, 20); clutter_actor_set_width (entry, 150); clutter_container_add_actor (stage, entry); clutter_stage_set_key_focus (CLUTTER_STAGE (clutter_actor_get_stage (entry)), mx_entry_get_clutter_text (MX_ENTRY (entry))); entry = mx_entry_new (); clutter_actor_set_position (entry, 20, 70); clutter_container_add_actor (stage, entry); mx_entry_set_hint_text (MX_ENTRY (entry), "hint hint..."); #ifdef HAVE_CLUTTER_IMCONTEXT clutter_imtext_set_autoshow_im (CLUTTER_IMTEXT (mx_entry_get_clutter_text (MX_ENTRY (entry))), TRUE); #else g_debug ("Input method support is disabled"); #endif g_signal_connect (G_OBJECT (entry), "notify::text", G_CALLBACK (text_changed_cb), NULL); button = mx_button_new_with_label ("Set"); clutter_actor_set_position (button, 20, 120); g_signal_connect (button, "clicked", G_CALLBACK (btn_clicked_cb), entry); clear_button = mx_button_new_with_label ("clear"); clutter_actor_set_position (clear_button, 70, 120); g_signal_connect (clear_button, "clicked", G_CALLBACK (clear_btn_clicked_cb), entry); clutter_container_add (stage, button, clear_button, NULL); entry = mx_entry_new (); clutter_actor_set_position (entry, 20, 170); clutter_container_add_actor (stage, entry); mx_entry_set_hint_text (MX_ENTRY (entry), "Search..."); mx_entry_set_primary_icon_from_file (MX_ENTRY (entry), "edit-find.png"); mx_entry_set_secondary_icon_from_file (MX_ENTRY (entry), "edit-clear.png"); mx_entry_set_icon_highlight_suffix (MX_ENTRY (entry), "-highlight"); mx_entry_set_secondary_icon_tooltip_text (MX_ENTRY (entry), "one"); mx_entry_set_primary_icon_tooltip_text (MX_ENTRY (entry), "two"); g_signal_connect (entry, "primary-icon-clicked", G_CALLBACK (print_notice), "primary icon clicked\n"); g_signal_connect (entry, "secondary-icon-clicked", G_CALLBACK (print_notice), "secondary icon clicked\n"); entry = mx_entry_new (); clutter_actor_set_position (entry, 20, 220); clutter_container_add_actor (stage, entry); mx_entry_set_hint_text (MX_ENTRY (entry), "Secret!"); mx_entry_set_password_char (MX_ENTRY (entry), 0x2022); }
G_MODULE_EXPORT int test_events_main (int argc, char *argv[]) { ClutterActor *stage, *actor, *focus_box, *group; if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) return 1; stage = clutter_stage_new (); clutter_stage_set_title (CLUTTER_STAGE (stage), "Events"); clutter_actor_set_name (stage, "Stage"); g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); g_signal_connect (stage, "event", G_CALLBACK (input_cb), "stage"); g_signal_connect (stage, "fullscreen", G_CALLBACK (stage_state_cb), "fullscreen"); g_signal_connect (stage, "unfullscreen", G_CALLBACK (stage_state_cb), "unfullscreen"); g_signal_connect (stage, "activate", G_CALLBACK (stage_state_cb), "activate"); g_signal_connect (stage, "deactivate", G_CALLBACK (stage_state_cb), "deactivate"); focus_box = clutter_rectangle_new_with_color (CLUTTER_COLOR_Black); clutter_actor_set_name (focus_box, "Focus Box"); clutter_container_add (CLUTTER_CONTAINER(stage), focus_box, NULL); actor = clutter_rectangle_new_with_color (CLUTTER_COLOR_Red); clutter_actor_set_name (actor, "Red Box"); clutter_actor_set_size (actor, 100, 100); clutter_actor_set_position (actor, 100, 100); clutter_actor_set_reactive (actor, TRUE); clutter_container_add (CLUTTER_CONTAINER (stage), actor, NULL); g_signal_connect (actor, "event", G_CALLBACK (input_cb), "red box"); g_signal_connect (actor, "key-focus-in", G_CALLBACK (key_focus_in_cb), focus_box); /* Toggle motion - enter/leave capture */ g_signal_connect (actor, "button-press-event", G_CALLBACK (red_button_cb), NULL); clutter_stage_set_key_focus (CLUTTER_STAGE (stage), actor); actor = clutter_rectangle_new_with_color (CLUTTER_COLOR_Green); clutter_actor_set_name (actor, "Green Box"); clutter_actor_set_size (actor, 100, 100); clutter_actor_set_position (actor, 250, 100); clutter_actor_set_reactive (actor, TRUE); clutter_container_add (CLUTTER_CONTAINER (stage), actor, NULL); g_signal_connect (actor, "event", G_CALLBACK (input_cb), "green box"); g_signal_connect (actor, "key-focus-in", G_CALLBACK (key_focus_in_cb), focus_box); g_signal_connect (actor, "captured-event", G_CALLBACK (capture_cb), NULL); actor = clutter_rectangle_new_with_color (CLUTTER_COLOR_Blue); clutter_actor_set_name (actor, "Blue Box"); clutter_actor_set_size (actor, 100, 100); clutter_actor_set_position (actor, 400, 100); clutter_actor_set_reactive (actor, TRUE); clutter_container_add (CLUTTER_CONTAINER(stage), actor, NULL); g_signal_connect (actor, "event", G_CALLBACK (input_cb), "blue box"); g_signal_connect (actor, "key-focus-in", G_CALLBACK (key_focus_in_cb), focus_box); /* Fullscreen */ g_signal_connect (actor, "button-press-event", G_CALLBACK (blue_button_cb), NULL); /* non reactive */ actor = clutter_rectangle_new_with_color (CLUTTER_COLOR_Black); clutter_actor_set_name (actor, "Black Box"); clutter_actor_set_size (actor, 400, 50); clutter_actor_set_position (actor, 100, 250); clutter_container_add (CLUTTER_CONTAINER(stage), actor, NULL); g_signal_connect (actor, "event", G_CALLBACK (input_cb), "blue box"); g_signal_connect (actor, "key-focus-in", G_CALLBACK (key_focus_in_cb), focus_box); g_signal_connect (stage, "key-focus-in", G_CALLBACK (key_focus_in_cb), focus_box); /* non reactive group, with reactive child */ actor = clutter_rectangle_new_with_color (CLUTTER_COLOR_Yellow); clutter_actor_set_name (actor, "Yellow Box"); clutter_actor_set_size (actor, 100, 100); clutter_actor_set_reactive (actor, TRUE); g_signal_connect (actor, "event", G_CALLBACK (input_cb), "yellow box"); /* note group not reactive */ group = clutter_group_new (); clutter_container_add (CLUTTER_CONTAINER (group), actor, NULL); clutter_container_add (CLUTTER_CONTAINER (stage), group, NULL); clutter_actor_set_position (group, 100, 350); clutter_actor_show_all (group); /* border actor */ actor = clutter_rectangle_new_with_color (CLUTTER_COLOR_Magenta); clutter_actor_set_name (actor, "Border Box"); clutter_actor_set_size (actor, 100, 100); clutter_actor_set_position (actor, (clutter_actor_get_width (stage) - 100) / 2, clutter_actor_get_height (stage) - 100); clutter_actor_set_reactive (actor, TRUE); clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor); g_signal_connect (actor, "event", G_CALLBACK (input_cb), NULL); clutter_actor_show_all (CLUTTER_ACTOR (stage)); clutter_main(); return 0; }
static gboolean input_cb (ClutterActor *actor, ClutterEvent *event, gpointer data) { ClutterActor *stage = clutter_actor_get_stage (actor); ClutterActor *source_actor = clutter_event_get_source (event); gchar keybuf[128]; switch (event->type) { case CLUTTER_KEY_PRESS: fill_keybuf (keybuf, &event->key); printf ("[%s] KEY PRESS %s", clutter_actor_get_name (source_actor), keybuf); break; case CLUTTER_KEY_RELEASE: fill_keybuf (keybuf, &event->key); printf ("[%s] KEY RELEASE %s", clutter_actor_get_name (source_actor), keybuf); break; case CLUTTER_MOTION: { ClutterMotionEvent *motion = (ClutterMotionEvent *) event; g_print ("[%s] MOTION (%.02f,%.02f)", clutter_actor_get_name (source_actor), motion->x, motion->y); } break; case CLUTTER_ENTER: g_print ("[%s] ENTER (from:%s)", clutter_actor_get_name (source_actor), clutter_event_get_related (event) != NULL ? clutter_actor_get_name (clutter_event_get_related (event)) : "<out of stage>"); break; case CLUTTER_LEAVE: g_print ("[%s] LEAVE (to:%s)", clutter_actor_get_name (source_actor), clutter_event_get_related (event) != NULL ? clutter_actor_get_name (clutter_event_get_related (event)) : "<out of stage>"); break; case CLUTTER_BUTTON_PRESS: g_print ("[%s] BUTTON PRESS (button:%i, click count:%i)", clutter_actor_get_name (source_actor), clutter_event_get_button (event), clutter_event_get_click_count (event)); break; case CLUTTER_BUTTON_RELEASE: g_print ("[%s] BUTTON RELEASE (button:%i, click count:%i)", clutter_actor_get_name (source_actor), clutter_event_get_button (event), clutter_event_get_click_count (event)); if (source_actor == stage) clutter_stage_set_key_focus (CLUTTER_STAGE (stage), NULL); else if (source_actor == actor && clutter_actor_get_parent (actor) == stage) clutter_stage_set_key_focus (CLUTTER_STAGE (stage), actor); break; case CLUTTER_SCROLL: g_print ("[%s] BUTTON SCROLL (direction:%s)", clutter_actor_get_name (source_actor), clutter_event_get_scroll_direction (event) == CLUTTER_SCROLL_UP ? "up" : "down"); break; case CLUTTER_STAGE_STATE: g_print ("[%s] STAGE STATE", clutter_actor_get_name (source_actor)); break; case CLUTTER_DESTROY_NOTIFY: g_print ("[%s] DESTROY NOTIFY", clutter_actor_get_name (source_actor)); break; case CLUTTER_CLIENT_MESSAGE: g_print ("[%s] CLIENT MESSAGE", clutter_actor_get_name (source_actor)); break; case CLUTTER_DELETE: g_print ("[%s] DELETE", clutter_actor_get_name (source_actor)); break; case CLUTTER_NOTHING: return FALSE; } if (source_actor == actor) g_print (" *source*"); g_print ("\n"); return FALSE; }
G_MODULE_EXPORT gint test_text_main (gint argc, gchar **argv) { ClutterActor *stage; ClutterActor *text, *text2; ClutterColor text_color = { 0x33, 0xff, 0x33, 0xff }; ClutterColor cursor_color = { 0xff, 0x33, 0x33, 0xff }; ClutterTextBuffer *buffer; if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) return 1; stage = clutter_stage_new (); clutter_stage_set_title (CLUTTER_STAGE (stage), "Text Editing"); clutter_actor_set_background_color (stage, CLUTTER_COLOR_Black); g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); buffer = clutter_text_buffer_new_with_text ("·", -1); text = clutter_text_new_with_buffer (buffer); clutter_text_set_font_name (CLUTTER_TEXT (text), FONT); clutter_text_set_color (CLUTTER_TEXT (text), &text_color); clutter_container_add (CLUTTER_CONTAINER (stage), text, NULL); clutter_actor_set_position (text, 40, 30); clutter_actor_set_width (text, 1024); clutter_text_set_line_wrap (CLUTTER_TEXT (text), TRUE); clutter_actor_set_reactive (text, TRUE); clutter_stage_set_key_focus (CLUTTER_STAGE (stage), text); clutter_text_set_editable (CLUTTER_TEXT (text), TRUE); clutter_text_set_selectable (CLUTTER_TEXT (text), TRUE); clutter_text_set_cursor_color (CLUTTER_TEXT (text), &cursor_color); clutter_text_set_selected_text_color (CLUTTER_TEXT (text), CLUTTER_COLOR_Blue); text2 = clutter_text_new_with_buffer (buffer); clutter_text_set_color (CLUTTER_TEXT (text2), &text_color); clutter_container_add (CLUTTER_CONTAINER (stage), text2, NULL); clutter_actor_set_position (text2, 40, 300); clutter_actor_set_width (text2, 1024); clutter_text_set_line_wrap (CLUTTER_TEXT (text2), TRUE); clutter_actor_set_reactive (text2, TRUE); clutter_text_set_editable (CLUTTER_TEXT (text2), TRUE); clutter_text_set_selectable (CLUTTER_TEXT (text2), TRUE); clutter_text_set_cursor_color (CLUTTER_TEXT (text2), &cursor_color); clutter_text_set_selected_text_color (CLUTTER_TEXT (text2), CLUTTER_COLOR_Green); if (argv[1]) { GError *error = NULL; gchar *utf8; g_file_get_contents (argv[1], &utf8, NULL, &error); if (error) { utf8 = g_strconcat ("Unable to open '", argv[1], "':\n", error->message, NULL); g_error_free (error); } clutter_text_set_text (CLUTTER_TEXT (text), utf8); } else clutter_text_set_text (CLUTTER_TEXT (text), runes); clutter_actor_set_size (stage, 1024, 768); clutter_actor_show (stage); clutter_main (); return EXIT_SUCCESS; }