static VALUE gtkdrag_selection_add_targets(VALUE self, VALUE rbwidget, VALUE rbselection, VALUE rbtargets) { GtkWidget *widget = RVAL2WIDGET(rbwidget); GdkAtom selection = RVAL2ATOM(rbselection); long n; GtkTargetEntry *targets = RVAL2GTKTARGETENTRIES(rbtargets, &n); gtk_selection_add_targets(widget, selection, targets, n); g_free(targets); return self; }
void drop_widget_init(GtkWidget *widget, drag_data_received_cb callback, void *user_data) { static const GtkTargetEntry targets[] = { #if GTK_CHECK_VERSION(2,0,0) { "UTF8_STRING", 0, 3 }, { "text/plain;charset=utf-8", 0, 4 }, #endif /* Gtk+ >= 2.0 */ { "STRING", 0, 1 }, { "text/plain", 0, 2 }, }; g_return_if_fail(widget); g_return_if_fail(callback); gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL, targets, G_N_ELEMENTS(targets), GDK_ACTION_COPY | GDK_ACTION_MOVE); #if GTK_CHECK_VERSION(2,0,0) { static GtkClipboard *clipboard; if (!clipboard) { clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY); } } gtk_drag_dest_set_target_list(widget, gtk_target_list_new(targets, G_N_ELEMENTS(targets))); #endif /* USE_GTK2 */ #if !GTK_CHECK_VERSION(2,0,0) gtk_selection_add_targets(widget, GDK_SELECTION_TYPE_STRING, targets, G_N_ELEMENTS(targets)); #endif /* USE_GTK1 */ gui_signal_connect(GTK_OBJECT(widget), "drag-data-received", callback, user_data); }
int main (int argc, char *argv[]) { GtkWidget *dialog; GtkWidget *button; GtkWidget *table; GtkWidget *label; GtkWidget *entry; GtkWidget *hscrollbar; GtkWidget *vscrollbar; GtkWidget *hbox; static GtkTargetEntry targetlist[] = { { "STRING", 0, STRING }, { "TEXT", 0, TEXT }, { "COMPOUND_TEXT", 0, COMPOUND_TEXT } }; static gint ntargets = sizeof(targetlist) / sizeof(targetlist[0]); gtk_init (&argc, &argv); init_atoms(); selection_widget = gtk_invisible_new (); dialog = gtk_dialog_new (); gtk_widget_set_name (dialog, "Test Input"); gtk_container_set_border_width (GTK_CONTAINER(dialog), 0); g_signal_connect (dialog, "destroy", G_CALLBACK (quit), NULL); table = gtk_table_new (4, 2, FALSE); gtk_container_set_border_width (GTK_CONTAINER(table), 10); gtk_table_set_row_spacing (GTK_TABLE (table), 0, 5); gtk_table_set_row_spacing (GTK_TABLE (table), 1, 2); gtk_table_set_row_spacing (GTK_TABLE (table), 2, 2); gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 0); gtk_widget_show (table); selection_button = gtk_toggle_button_new_with_label ("Claim Selection"); gtk_table_attach (GTK_TABLE (table), selection_button, 0, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_widget_show (selection_button); g_signal_connect (selection_button, "toggled", G_CALLBACK (selection_toggled), NULL); g_signal_connect (selection_widget, "selection_clear_event", G_CALLBACK (selection_clear), NULL); g_signal_connect (selection_widget, "selection_received", G_CALLBACK (selection_received), NULL); gtk_selection_add_targets (selection_widget, GDK_SELECTION_PRIMARY, targetlist, ntargets); g_signal_connect (selection_widget, "selection_get", G_CALLBACK (selection_get), NULL); selection_text = gtk_text_new (NULL, NULL); gtk_table_attach_defaults (GTK_TABLE (table), selection_text, 0, 1, 1, 2); gtk_widget_show (selection_text); hscrollbar = gtk_hscrollbar_new (GTK_TEXT (selection_text)->hadj); gtk_table_attach (GTK_TABLE (table), hscrollbar, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (hscrollbar); vscrollbar = gtk_vscrollbar_new (GTK_TEXT (selection_text)->vadj); gtk_table_attach (GTK_TABLE (table), vscrollbar, 1, 2, 1, 2, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_widget_show (vscrollbar); hbox = gtk_hbox_new (FALSE, 2); gtk_table_attach (GTK_TABLE (table), hbox, 0, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_widget_show (hbox); label = gtk_label_new ("Target:"); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX(hbox), entry, TRUE, TRUE, 0); gtk_widget_show (entry); /* .. And create some buttons */ button = gtk_button_new_with_label ("Paste"); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); g_signal_connect (button, "clicked", G_CALLBACK (paste), entry); gtk_widget_show (button); button = gtk_button_new_with_label ("Quit"); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), dialog); gtk_widget_show (button); gtk_widget_show (dialog); gtk_main (); return 0; }
GtkWidget *setupLCD(GtkWidget *parent, int rows, int cols, char *font){ int i; int width; int wid, hgt; #ifdef GTK_VER_1_1 static GtkTargetEntry targetlist[] = { /* Target Flags Info */ { "STRING", 0, TARGET_STRING }, { "TEXT", 0, TARGET_TEXT }, { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT } }; static gint ntargets = sizeof(targetlist) / sizeof(targetlist[0]); #endif /* store arguments */ lcdWidth = cols; lcdHeight = rows; #ifdef USE_PANGO lcdDA = gtk_drawing_area_new(); pango_layout = gtk_widget_create_pango_layout(lcdDA, NULL); pango_desc = pango_font_description_from_string(font?font:"Liberation Mono 16"); pango_fontmap = pango_cairo_font_map_get_default(); pango_context = pango_cairo_font_map_create_context( (PangoCairoFontMap *)pango_fontmap ); pango_font = pango_context_load_font(pango_context, pango_desc); pango_metrics = pango_context_get_metrics(pango_context, pango_desc, pango_language_get_default()); fontW = (pango_font_metrics_get_approximate_digit_width(pango_metrics))/PANGO_SCALE; fontH = (pango_font_metrics_get_ascent(pango_metrics) + pango_font_metrics_get_descent(pango_metrics))/PANGO_SCALE; fontD = pango_font_metrics_get_descent(pango_metrics)/PANGO_SCALE; gtk_widget_modify_font(lcdDA, pango_desc); #else fontW = 0; fontH = 0; fontD = 0; /* get a font for the main window */ if(font != NULL){ if(NULL == (lcdFont = gdk_font_load(font))){ fprintf(stderr, "Unable to load font %s.\n", font); exit(0); } } else if(NULL == (lcdFont = gdk_font_load(FONT1)) && NULL == (lcdFont = gdk_font_load(FONT2)) && NULL == (lcdFont = gdk_font_load(FONT3)) && NULL == (lcdFont = gdk_font_load(FONT4)) && NULL == (lcdFont = gdk_font_load(FONT5)) && NULL == (lcdFont = gdk_font_load(FONT6))){ fprintf(stderr, "Unable to load a font.\n"); exit(0); } /* find max font width */ for(i=0; i<256; i++){ width = gdk_char_width(lcdFont, (gchar)i); if(width < 50 && width > fontW) fontW = width; } /* globals we use all over the place */ fontH = lcdFont->ascent + lcdFont->descent; fontD = lcdFont->descent; #endif if(fontW == 0 || fontH == 0){ fprintf(stderr, "Error: can not determine font dimentions.\n"); exit(0); } wid = (2 * BORDER) + (lcdWidth * fontW); hgt = (2 * BORDER) + (lcdHeight * fontH); #ifndef USE_PANGO lcdDA = gtk_drawing_area_new(); #endif gtk_drawing_area_size(GTK_DRAWING_AREA(lcdDA), wid, hgt); gtk_box_pack_start(GTK_BOX(parent), lcdDA, TRUE, TRUE, 0); /* Signals used to handle window ops */ gtk_signal_connect(GTK_OBJECT(lcdDA), "expose_event", (GtkSignalFunc)lcdExposeCB, NULL); gtk_signal_connect(GTK_OBJECT(lcdDA),"configure_event", (GtkSignalFunc)lcdResizeCB, NULL); /* Event signals (Selection) */ gtk_signal_connect(GTK_OBJECT(lcdDA), "selection_received", (GtkSignalFunc)lcdPasteCB, NULL); gtk_signal_connect(GTK_OBJECT(lcdDA), "selection_clear_event", (GtkSignalFunc)loseSelection, NULL); /* gtk_signal_connect(GTK_OBJECT(lcdDA), "selection_request_event", (GtkSignalFunc)convertSelection, NULL); */ #ifdef GTK_VER_1_1 gtk_selection_add_targets(lcdDA, GDK_SELECTION_PRIMARY, targetlist, ntargets); gtk_signal_connect(GTK_OBJECT(lcdDA), "selection_get", (GtkSignalFunc)convertSelection, NULL); #else gtk_selection_add_handler(lcdDA, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, convertSelection, NULL); #endif /* Event signals (Input) */ gtk_signal_connect(GTK_OBJECT(lcdDA), "motion_notify_event", (GtkSignalFunc)lcdMotionEvnt, NULL); gtk_signal_connect(GTK_OBJECT(lcdDA), "button_press_event", (GtkSignalFunc)lcdButtonPressEvnt, NULL); gtk_signal_connect(GTK_OBJECT(lcdDA), "button_release_event", (GtkSignalFunc)lcdButtonReleaseEvnt, NULL); gtk_signal_connect_after(GTK_OBJECT(lcdDA), "key_press_event", (GtkSignalFunc)lcdKeyPressEvnt, NULL); gtk_signal_connect_after(GTK_OBJECT(lcdDA), "key_release_event", (GtkSignalFunc)lcdKeyReleaseEvnt, NULL); gtk_widget_set_events(lcdDA, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); GTK_WIDGET_SET_FLAGS(lcdDA, GTK_CAN_FOCUS); gtk_widget_show(lcdDA); gtk_widget_grab_focus(lcdDA); return lcdDA; }