Index: work/gtk/trunctext/wt_trunc_text.h =================================================================== --- work/gtk/trunctext/wt_trunc_text.h (revision 39666) +++ work/gtk/trunctext/wt_trunc_text.h (nonexistent) @@ -1,78 +0,0 @@ -/* - * COPYRIGHT - * - * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2018 Alain Vigne - * - * This module is subject to the GNU GPL as described below. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Contact: - * Project page: http://repo.hu/projects/pcb-rnd - * lead developer: email to pcb-rnd (at) igor2.repo.hu - * mailing list: pcb-rnd (at) list.repo.hu (send "subscribe") - */ - -#ifndef PCB_GTK_TRUNC_TEXT_H -#define PCB_GTK_TRUNC_TEXT_H - -#include -typedef struct _GtkTrunctext GtkTrunctext; -typedef struct _GtkTrunctextClass GtkTrunctextClass; -GtkTrunctext *gtk_trunctext_new(const gchar *str); - -#include "lib_gtk_common/compat.h" -/* To be included in compat.h */ -#ifdef PCB_GTK3 -static inline GtkWidget *gtkc_trunctext_new(const gchar *str) -{ - return gtk_trunctext_new(str); -} -#else -/* GTK2 */ -static inline GtkWidget *gtkc_trunctext_new(const gchar *str) -{ - return gtk_label_new(str); -} -#endif - -/* GtkTrunctext is a subclass of GtkLabel */ -#define TYPE_GTK_TRUNCTEXT (gtk_trunctext_get_type ()) -#define GTK_TRUNCTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_GTK_TRUNCTEXT, GtkTrunctext)) -#define GTK_TRUNCTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_GTK_TRUNCTEXT, GtkTrunctextClass)) -#define IS_GTK_TRUNCTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_GTK_TRUNCTEXT)) -#define IS_GTK_TRUNCTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_GTK_TRUNCTEXT)) -#define GTK_TRUNCTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_GTK_TRUNCTEXT, GtkTrunctextClass)) - -GType gtk_trunctext_get_type(void) G_GNUC_CONST; - -GtkTrunctext *gtk_trunctext_construct(GType object_type, const gchar *str); - -enum { - GTK_TRUNCTEXT_0_PROPERTY, - GTK_TRUNCTEXT_NUM_PROPERTIES -}; -static GParamSpec *gtk_trunctext_properties[GTK_TRUNCTEXT_NUM_PROPERTIES]; - -struct _GtkTrunctext { - GtkLabel parent_instance; -}; - -struct _GtkTrunctextClass { - GtkLabelClass parent_class; -}; - -#endif Index: work/gtk/trunctext/trunctext_demo.c =================================================================== --- work/gtk/trunctext/trunctext_demo.c (revision 39666) +++ work/gtk/trunctext/trunctext_demo.c (nonexistent) @@ -1,54 +0,0 @@ -#include - -#include "wt_trunc_text.h" - -GtkWidget *build_text_test() -{ - GtkWidget *box = gtkc_vbox_new(FALSE, 0); - GtkWidget *hbox = gtkc_hbox_new(FALSE, 0); - - GtkWidget *h_label = gtk_label_new("Horizontal"); - GtkWidget *v_label = gtk_label_new("Vertical"); - /*GtkWidget *vt_label = gtk_label_new("Vert_truncated");*/ - GtkWidget *vt_label = gtkc_trunctext_new("Vert_truncated"); - - gtk_label_set_angle(v_label, 90.0); - - gtk_label_set_angle(vt_label, 90.0); - gtk_misc_set_alignment(GTK_MISC(vt_label), 0, 1); - gtk_widget_set_size_request(vt_label, 16, 1); - gtk_box_pack_start(hbox, vt_label, TRUE, FALSE, 0); - gtk_box_pack_start(hbox, gtk_label_new("layer name"), TRUE, TRUE, 0); - - gtk_box_pack_start(box, h_label, TRUE, FALSE, 0); - gtk_box_pack_start(box, v_label, TRUE, FALSE, 0); - gtk_box_pack_start(box, gtk_label_new("-----"), TRUE, FALSE, 0); - gtk_box_pack_start(box, hbox, TRUE, TRUE, 0); - - return box; -} - -int main(int argc, char **argv) -{ - GtkWidget *mainwin; - GtkWidget *test; - - /* Initialize the widget set */ - gtk_init(&argc, &argv); - /* Create the main window */ - mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(mainwin), 10, 20); - g_signal_connect(G_OBJECT(mainwin), "destroy", G_CALLBACK(gtk_main_quit), NULL); - - /* Set up GUI elements */ - test = build_text_test(); - gtk_container_add(GTK_CONTAINER(mainwin), test); - - /* Show the application window */ - gtk_widget_show_all(mainwin); - - /* Enter the main event loop, and wait for user interaction */ - gtk_main(); - - return 0; -} Index: work/gtk/trunctext/wt_trunc_text.c =================================================================== --- work/gtk/trunctext/wt_trunc_text.c (revision 39666) +++ work/gtk/trunctext/wt_trunc_text.c (nonexistent) @@ -1,103 +0,0 @@ -/* - * COPYRIGHT - * - * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2018 Alain Vigne - * - * This module is subject to the GNU GPL as described below. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Contact: - * Project page: http://repo.hu/projects/pcb-rnd - * lead developer: email to pcb-rnd (at) igor2.repo.hu - * mailing list: pcb-rnd (at) list.repo.hu (send "subscribe") - */ - -#include "wt_trunc_text.h" - -static gpointer gtk_trunctext_parent_class = NULL; - -GtkTrunctext *gtk_trunctext_construct(GType object_type, const gchar *str) -{ - GtkTrunctext *self = NULL; - self = (GtkTrunctext *)g_object_new(object_type, NULL); - - if (str && *str) - gtk_label_set_text(GTK_LABEL(self), str); - - return self; -} - -GtkTrunctext *gtk_trunctext_new(const gchar *str) -{ - return gtk_trunctext_construct(TYPE_GTK_TRUNCTEXT, str); -} - -static void gtk_trunctext_get_preferred_width(GtkWidget *widget, gint *minimum_size, gint *natural_size) -{ - *minimum_size = 1; - *natural_size = 1; -} - -static void gtk_trunctext_get_preferred_width_for_height(GtkWidget *widget, gint height, gint *minimum_width, gint *natural_width) -{ - *minimum_width = 1; - *natural_width = 1; -} - -static void gtk_trunctext_get_preferred_height_and_baseline_for_width(GtkWidget *widget, gint width, gint *minimum_height, gint *natural_height, gint *minimum_baseline, gint *natural_baseline) -{ - *minimum_height = 1; - *natural_height = 1; - *minimum_baseline = 0; - *natural_baseline = 0; -} - -static void gtk_trunctext_class_init(GtkTrunctextClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); - -#ifdef PCB_GTK3 - widget_class->get_preferred_width = gtk_trunctext_get_preferred_width; - widget_class->get_preferred_height = gtk_trunctext_get_preferred_width; - widget_class->get_preferred_width_for_height = gtk_trunctext_get_preferred_width_for_height; - widget_class->get_preferred_height_for_width = gtk_trunctext_get_preferred_width_for_height; - widget_class->get_preferred_height_and_baseline_for_width = gtk_trunctext_get_preferred_height_and_baseline_for_width; -#endif - - gtk_trunctext_parent_class = g_type_class_peek_parent(klass); -} - -static void gtk_trunctext_instance_init(GtkTrunctext *self) -{ -} - -GType gtk_trunctext_get_type(void) -{ - static volatile gsize gtk_trunctext_type_id__volatile = 0; - - if (g_once_init_enter(>k_trunctext_type_id__volatile)) { - static const GTypeInfo g_define_type_info = - { sizeof(GtkTrunctextClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gtk_trunctext_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof(GtkTrunctext), 0, (GInstanceInitFunc) gtk_trunctext_instance_init, NULL }; - GType gtk_trunctext_type_id; - - gtk_trunctext_type_id = g_type_register_static(gtk_label_get_type(), "GtkTrunctext", &g_define_type_info, 0); - g_once_init_leave(>k_trunctext_type_id__volatile, gtk_trunctext_type_id); - } - - return gtk_trunctext_type_id__volatile; -} Index: work/gtk/trunctext/Makefile =================================================================== --- work/gtk/trunctext/Makefile (revision 39666) +++ work/gtk/trunctext/Makefile (nonexistent) @@ -1,14 +0,0 @@ -TRUNK=../../../trunk -CFLAGS=-g -Wall -I $(TRUNK)/src_plugins `pkg-config --cflags gtk+-2.0` -LDFLAGS=-g `pkg-config --libs gtk+-2.0` -#CFLAGS=-g -Wall -I $(TRUNK)/src_plugins -DPCB_GTK3 `pkg-config --cflags gtk+-3.0` -#LDFLAGS=-g `pkg-config --libs gtk+-3.0` - -all: trunctext_demo - -trunctext_demo: trunctext_demo.o wt_trunc_text.o - -wt_trunc_text.o: wt_trunc_text.h - -clean: - rm *.o trunctext_demo Index: work/gtk/layersel/wt_layersel.h =================================================================== --- work/gtk/layersel/wt_layersel.h (revision 39666) +++ work/gtk/layersel/wt_layersel.h (nonexistent) @@ -1,42 +0,0 @@ -#ifndef PCB_GTK_LAYERSEL_H -#define PCB_GTK_LAYERSEL_H - -#include - -typedef struct pcb_gtk_layersel_s pcb_gtk_layersel_t; -typedef struct pcb_gtk_ls_grp_s pcb_gtk_ls_grp_t; -typedef struct pcb_gtk_ls_lyr_s pcb_gtk_ls_lyr_t; - -struct pcb_gtk_ls_lyr_s { - GtkWidget *box, *vis_on, *vis_off, *name_box; - - int (*ev_toggle_vis)(pcb_gtk_ls_lyr_t *lsl); /* called first in click handler, if returns non-zero, normal visibility update is supressed */ - int (*ev_selected)(pcb_gtk_ls_lyr_t *lsl); /* called first in click handler, if returns non-zero, layer can not be selected */ - - unsigned on:1; /* TODO: temporary hack: should be extracted from the layer struct */ - - /* for callbacks */ - pcb_gtk_ls_grp_t *lsg; /* points to parent */ -}; - -struct pcb_gtk_ls_grp_s { - GtkWidget *grp_row, *grp_closed, *grp_open, *layers, *vis_on, *vis_off; - - pcb_gtk_ls_lyr_t layer[4]; - - /* for callbacks */ - pcb_gtk_layersel_t *ls; /* points to parent */ - - /* TODO: temporary hack: will come from the core */ - unsigned on:1; /* central visibility (toggles all layers) */ - unsigned open:1; /* whether group is expanded, layers are visible */ -}; - - -struct pcb_gtk_layersel_s { - pcb_gtk_ls_grp_t grp[4]; -}; - -GtkWidget *pcb_gtk_layersel_build(pcb_gtk_layersel_t *ls); - -#endif Index: work/gtk/layersel/TODO =================================================================== --- work/gtk/layersel/TODO (revision 39666) +++ work/gtk/layersel/TODO (nonexistent) @@ -1,2 +0,0 @@ -- (keyboard (up/down arrow, open, close)) -- (drag & drop reorder) Index: work/gtk/layersel/layersel_demo.c =================================================================== --- work/gtk/layersel/layersel_demo.c (revision 39666) +++ work/gtk/layersel/layersel_demo.c (nonexistent) @@ -1,37 +0,0 @@ -#include -#include - -#include "wt_layersel.h" -#include "lib_gtk_common/compat.h" - -int main(int argc, char **argv) -{ - GtkWidget *mainwin; - GtkWidget *layer_selector; - pcb_gtk_layersel_t ls; - - memset(&ls, 0, sizeof(ls)); - ls.grp[0].open = 1; - ls.grp[1].open = 1; - ls.grp[2].open = 1; - ls.grp[3].open = 1; - - /* Initialize the widget set */ - gtk_init(&argc, &argv); - /* Create the main window */ - mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(mainwin), 10, 400); - g_signal_connect(G_OBJECT(mainwin), "destroy", G_CALLBACK(gtk_main_quit), NULL); - - /* Set up GUI elements */ - layer_selector = pcb_gtk_layersel_build(&ls); - gtk_container_add(GTK_CONTAINER(mainwin), layer_selector); - - /* Show the application window */ - gtk_widget_show_all(mainwin); - - /* Enter the main event loop, and wait for user interaction */ - gtk_main(); - - return 0; -} Index: work/gtk/layersel/wt_layersel.c =================================================================== --- work/gtk/layersel/wt_layersel.c (revision 39666) +++ work/gtk/layersel/wt_layersel.c (nonexistent) @@ -1,395 +0,0 @@ -#error PLEASE DO NOT EDIT - it's been copied to trunk/ -/* - * COPYRIGHT - * - * pcb-rnd, interactive printed circuit board design - * Copyright (C) 2017 Tibor 'Igor2' Palinkas - * Copyright (C) 2017 Alain Vigne - * - * This module is subject to the GNU GPL as described below. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include "wt_layersel.h" -#include "lib_gtk_common/compat.h" - -#warning TEMPORARY HACKs: -#define pcb_hid_actionl(a, b, c) printf("action: " a b "\n") -static pcb_gtk_ls_lyr_t *current = NULL; - -/*** Layer visibility widget rendering ***/ -#define set_pixel(dst, r, g, b, a) \ -do { \ - p[0] = r; \ - p[1] = g; \ - p[2] = b; \ - p[3] = a; \ -} while(0) - -static guint hex2bin_(char c) -{ - if ((c >= '0') && (c <= '9')) return c - '0'; - if ((c >= 'a') && (c <= 'z')) return c - 'a' + 10; - if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10; - return 0; /* syntax error... */ -} - -#define hex2bin(str) ((hex2bin_((str)[0])) << 4 | hex2bin_((str)[1])) - -/* draw a visibility box: filled or partially filled with layer color */ -static GtkWidget *layer_vis_box(int filled, const char *rgb) -{ - GdkPixbuf *pixbuf; - GtkWidget *image; - gint width, height, max_height; - guchar *pixels; - guint r, g, b; - guint w; - guchar *p; - - pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 16, 16); - width = gdk_pixbuf_get_width(pixbuf); /* 16 here, obviously */ - max_height = height = gdk_pixbuf_get_height(pixbuf); - pixels = gdk_pixbuf_get_pixels(pixbuf); - - /* Fill the whole rectangle with color */ - r = hex2bin(rgb+1); - g = hex2bin(rgb+3); - b = hex2bin(rgb+5); - - while (height--) { - w = width; - p = pixels; - while (w--) { - if ((height == 0) || (height == max_height-1) || (w == 0) || (w == width-1)) - set_pixel(p, 0, 0, 0, 0xff); /* frame */ - else if ((width-w+5 < height) || (filled)) - set_pixel(p, r, g, b, 0xff); /* layer color fill (full or up-left triangle) */ - else - set_pixel(p, 0xff, 0xff, 0xff, 0x0); /* the unfilled part when triangle should be transparent */ - p += 4; - } - pixels += gdk_pixbuf_get_rowstride(pixbuf); - } - - image = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); - - return image; -} - -/*** Sync: make the GUI look like internal states ***/ - -static void layer_vis_sync(pcb_gtk_ls_lyr_t *lsl) -{ - if (lsl->on) { - gtk_widget_show(lsl->vis_on); - gtk_widget_hide(lsl->vis_off); - } - else { - gtk_widget_show(lsl->vis_off); - gtk_widget_hide(lsl->vis_on); - } - if (lsl == current) - pcb_gtk_set_selected(lsl->name_box, 1); - else - pcb_gtk_set_selected(lsl->name_box, 0); -} - -static void group_vis_sync(pcb_gtk_ls_grp_t *lsg) -{ - if (lsg->open) { - int n; - pcb_gtk_widget_hide_all(lsg->grp_closed); - gtk_widget_set_no_show_all(lsg->grp_open, 0); - gtk_widget_show_all(lsg->grp_open); - gtk_widget_set_no_show_all(lsg->grp_open, 1); - for(n = 0; n < 4; n++) - layer_vis_sync(&lsg->layer[n]); - } - else { - gtk_widget_set_no_show_all(lsg->grp_closed, 0); - gtk_widget_show_all(lsg->grp_closed); - gtk_widget_set_no_show_all(lsg->grp_closed, 1); - pcb_gtk_widget_hide_all(lsg->grp_open); - - /* a closed group has visibility boxes displayed, pick one to show */ - if (lsg->vis_on != NULL) { - if (lsg->on) { - gtk_widget_show(lsg->vis_on); - gtk_widget_hide(lsg->vis_off); - } - else { - gtk_widget_show(lsg->vis_off); - gtk_widget_hide(lsg->vis_on); - } - } - } -} - - -/*** Event handling ***/ - -static int ev_lyr_no_select(pcb_gtk_ls_lyr_t *lsl) -{ - return 1; /* layer can not be selected ever */ -} - -static gboolean group_vis_press_cb(GtkWidget *widget, GdkEvent *event, pcb_gtk_ls_grp_t *lsg) -{ - switch(event->button.button) { - case 1: - lsg->on = !lsg->on; - group_vis_sync(lsg); - break; - case 3: - pcb_hid_actionl("Popup", "group", NULL); - break; - } - return TRUE; -} - -static gboolean layer_vis_press_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) -{ - pcb_gtk_ls_lyr_t *lsl = user_data; - switch(event->button.button) { - case 1: - if ((lsl->ev_toggle_vis == NULL) || (lsl->ev_toggle_vis(lsl) == 0)) - lsl->on = !lsl->on; - layer_vis_sync(lsl); - break; - case 3: - pcb_hid_actionl("Popup", "layer", NULL); - break; - } - return TRUE; -} - -static gboolean layer_select_press_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) -{ - pcb_gtk_ls_lyr_t *lsl = user_data, *old_curr; - switch(event->button.button) { - case 1: - printf("layer select!\n"); - if ((lsl->ev_selected == NULL) || (lsl->ev_selected(lsl) == 0)) { - old_curr = current; - current = lsl; - if (old_curr != NULL) - layer_vis_sync(old_curr); - layer_vis_sync(lsl); - } - break; - case 3: - pcb_hid_actionl("Popup", "layer", NULL); - break; - } - return TRUE; -} - -static gboolean group_any_press_cb(GtkWidget *widget, GdkEvent *event, pcb_gtk_ls_grp_t *lsg, int openval) -{ - switch(event->button.button) { - case 1: - lsg->open = openval; - group_vis_sync(lsg); - break; - case 3: - pcb_hid_actionl("Popup", "group", NULL); - break; - } - return TRUE; -} - -static gboolean group_close_press_cb(GtkWidget *widget, GdkEvent *event, pcb_gtk_ls_grp_t *lsg) -{ - return group_any_press_cb(widget, event, lsg, 0); -} - -static gboolean group_open_press_cb(GtkWidget *widget, GdkEvent *event, pcb_gtk_ls_grp_t *lsg) -{ - return group_any_press_cb(widget, event, lsg, 1); -} - -/** Wrap w so that clicks on it are triggering a callback */ -static GtkWidget *wrap_bind_click(GtkWidget *w, GCallback cb, void *cb_data) -{ - GtkWidget *event_box = gtk_event_box_new(); - gtk_container_add(GTK_CONTAINER(event_box), w); - g_signal_connect(event_box, "button-press-event", G_CALLBACK(cb), cb_data); - return event_box; -} - -/*** Row builder ***/ - -/* Create a hbox with on/off visibility boxes packed in, pointers returned in *on, *off */ -static GtkWidget *build_visbox(const char *color, GtkWidget **on, GtkWidget **off) -{ - GtkWidget *vis_box = gtkc_hbox_new(0, 0); - *on = layer_vis_box(1, color); - gtk_box_pack_start(GTK_BOX(vis_box), *on, FALSE, FALSE, 0); - *off = layer_vis_box(0, color); - gtk_box_pack_start(GTK_BOX(vis_box), *off, FALSE, FALSE, 0); - return vis_box; -} - -/* Create a hbox of a layer within an expanded group */ -static GtkWidget *build_layer(pcb_gtk_ls_grp_t *lsg, pcb_gtk_ls_lyr_t *lsl, const char *name) -{ - GtkWidget *vis_box, *vis_ebox, *ly_name_bx, *lab; - - lsl->lsg = lsg; - lsl->box = gtkc_hbox_new(0, 0); - - /* sensitive layer visibility widgets */ - vis_box = build_visbox("#ff0000", &lsl->vis_on, &lsl->vis_off); - vis_ebox = wrap_bind_click(vis_box, G_CALLBACK(layer_vis_press_cb), lsl); - gtk_box_pack_start(GTK_BOX(lsl->box), vis_ebox, FALSE, FALSE, 0); - - /* selectable layer name*/ - ly_name_bx = gtkc_hbox_new(0, 0); - lsl->name_box = wrap_bind_click(ly_name_bx, G_CALLBACK(layer_select_press_cb), lsl); - lab = gtk_label_new(name); - gtk_box_pack_start(GTK_BOX(ly_name_bx), lab, TRUE, TRUE, 2); - gtk_box_pack_start(GTK_BOX(lsl->box), lsl->name_box, TRUE, TRUE, 10); - gtk_misc_set_alignment(GTK_MISC(lab), 0, 0.5); - - layer_vis_sync(lsl); - - return lsl->box; -} - -/* Creating a group enrty (both open and closed state); after layers are added, finish() needs to be called */ -static GtkWidget *build_group_start(pcb_gtk_layersel_t *ls, pcb_gtk_ls_grp_t *lsg, const char *gname, int has_group_vis) -{ - GtkWidget *gn_vert, *vlabel, *vlabel_sw, *opn, *cld; - -/* Layout: - +--------------------------+<- grp_row - | grp_closed | - +--------------------------+ - |+-----------------------+<--- grp_open - || gn | layer1 | | - || _v | layer2 | | - || er | layer3 | | - || t | layer4 | | - |+-----------------------+ | - +--------------------------+ -*/ - lsg->ls = ls; - lsg->grp_row = gtkc_vbox_new(0, 0); - lsg->grp_closed = gtkc_hbox_new(0, 0); - lsg->grp_open = gtkc_hbox_new(0, 0); - gtk_box_pack_start(GTK_BOX(lsg->grp_row), lsg->grp_closed, FALSE, FALSE, 1); - gtk_box_pack_start(GTK_BOX(lsg->grp_row), lsg->grp_open, FALSE, FALSE, 5); - - gn_vert = gtkc_vbox_new(0, 0); - lsg->layers = gtkc_vbox_new(0, 0); - opn = wrap_bind_click(gn_vert, G_CALLBACK(group_close_press_cb), lsg); - gtk_box_pack_start(GTK_BOX(lsg->grp_open), opn, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(lsg->grp_open), lsg->layers, TRUE, TRUE, 0); - - /* install group name - vertical (for when the group is open) */ - vlabel = gtk_label_new(gname); - gtk_label_set_angle(GTK_LABEL(vlabel), 90); - vlabel_sw = gtk_scrolled_window_new(NULL, NULL); - gtkc_scrolled_window_add_with_viewport(vlabel_sw, vlabel); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vlabel_sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start(GTK_BOX(gn_vert), vlabel_sw, TRUE, TRUE, 0); - gtk_misc_set_alignment(GTK_MISC(vlabel), 0, 1); - gtk_widget_set_size_request(vlabel, 32, 1); - - /* install group name - vertical (for when the group is closed) */ - if (has_group_vis) { - GtkWidget *vis; - vis = wrap_bind_click(build_visbox("#ff0000", &lsg->vis_on, &lsg->vis_off), G_CALLBACK(group_vis_press_cb), lsg); - gtk_box_pack_start(GTK_BOX(lsg->grp_closed), vis, FALSE, FALSE, 0); - } - cld = wrap_bind_click(gtk_label_new(gname), G_CALLBACK(group_open_press_cb), lsg); - gtk_box_pack_start(GTK_BOX(lsg->grp_closed), cld, FALSE, FALSE, 2); - - return lsg->grp_row; -} - -/* finish creating a group - call after layers are added */ -static void build_group_finish(pcb_gtk_ls_grp_t *lsg) -{ - /* Make sure gtk_show_all() won't mess with our hardwired hide/show */ - group_vis_sync(lsg); - gtk_widget_set_no_show_all(lsg->grp_closed, 1); - gtk_widget_set_no_show_all(lsg->grp_open, 1); -} - -/* Create a group that has a real layer group in core, add all layers */ -static GtkWidget *build_group_real(pcb_gtk_layersel_t *ls, pcb_gtk_ls_grp_t *lsg, const char *gname) -{ - int n; - GtkWidget *wg = build_group_start(ls, lsg, gname, 1); - - /* install layers */ - for(n = 0; n < 4; n++) { - char tmp[32]; - GtkWidget *ly; - sprintf(tmp, "layer %d", n); - ly = build_layer(lsg, &lsg->layer[n], tmp); - gtk_box_pack_start(GTK_BOX(lsg->layers), ly, TRUE, TRUE, 1); - } - - build_group_finish(lsg); - - return wg; -} - - -/*** Layer selector widget building function ***/ -GtkWidget *pcb_gtk_layersel_build(pcb_gtk_layersel_t *ls) -{ - GtkWidget *scrolled, *main_box, *spring; - - main_box = gtkc_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(main_box), build_group_real(ls, &ls->grp[0], "group0"), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(main_box), build_group_real(ls, &ls->grp[1], "group1"), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(main_box), build_group_real(ls, &ls->grp[2], "group2longnamed"), FALSE, FALSE, 0); - - gtk_box_pack_start(GTK_BOX(main_box), gtk_hseparator_new(), FALSE, FALSE, 0); - - { /* build hardwired virtual layers */ - pcb_gtk_ls_grp_t *lsg = &ls->grp[3]; - gtk_box_pack_start(GTK_BOX(main_box), build_group_start(ls, lsg, "Virtual", 0), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(lsg->layers), build_layer(lsg, &lsg->layer[0], "Pins/Pads"), FALSE, FALSE, 1); - gtk_box_pack_start(GTK_BOX(lsg->layers), build_layer(lsg, &lsg->layer[1], "Vias"), FALSE, FALSE, 1); - gtk_box_pack_start(GTK_BOX(lsg->layers), build_layer(lsg, &lsg->layer[2], "Far side"), FALSE, FALSE, 1); - gtk_box_pack_start(GTK_BOX(lsg->layers), build_layer(lsg, &lsg->layer[3], "All-silk"), FALSE, FALSE, 1); - - lsg->layer[0].ev_selected = ev_lyr_no_select; - lsg->layer[1].ev_selected = ev_lyr_no_select; - lsg->layer[2].ev_selected = ev_lyr_no_select; - lsg->layer[3].ev_selected = ev_lyr_no_select; - - build_group_finish(lsg); - } - - spring = gtkc_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(main_box), spring, TRUE, TRUE, 0); - - /* get the whole box vertically scrolled, if needed */ - scrolled = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled), main_box); - - return scrolled; -} Index: work/gtk/layersel/Makefile =================================================================== --- work/gtk/layersel/Makefile (revision 39666) +++ work/gtk/layersel/Makefile (nonexistent) @@ -1,15 +0,0 @@ -TRUNK=../../../trunk -CFLAGS=-g -Wall -I $(TRUNK)/src_plugins `pkg-config --cflags gtk+-2.0` -LDFLAGS=-g `pkg-config --libs gtk+-2.0` -#CFLAGS=-g -Wall -I $(TRUNK)/src_plugins -DPCB_GTK3 `pkg-config --cflags gtk+-3.0` -#LDFLAGS=-g `pkg-config --libs gtk+-3.0` - -all: layersel_demo - -layersel_demo: layersel_demo.o wt_layersel.o - -layersel_demo.o: wt_layersel.h -wt_layersel.o: wt_layersel.h - -clean: - rm *.o layersel_demo \ No newline at end of file Index: work/gtk/gschem_accel_label.h =================================================================== --- work/gtk/gschem_accel_label.h (revision 39666) +++ work/gtk/gschem_accel_label.h (nonexistent) @@ -1,77 +0,0 @@ -/* gEDA - GPL Electronic Design Automation - * gschem - gEDA Schematic Capture - * Copyright (C) 1998-2010 gEDA Contributors (see ChangeLog for details) - * - * Code based on GTK 2.14.5 gtk/gtkaccellabel.h (LGPL) - * - * GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GschemAccelLabel: GtkLabel with accelerator monitoring facilities. - * Copyright (C) 1998 Tim Janik - * - * Modified by the GTK+ Team and others 1997-2001. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - * - * Adapted for gEDA by Peter Clifton - * - * THIS FILE IS LGPL LICENSED, gEDA AS A WHOLE IS GPL LICENSED - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef __GSCHEM_ACCEL_LABEL_H__ -#define __GSCHEM_ACCEL_LABEL_H__ - -G_BEGIN_DECLS -#define GSCHEM_TYPE_ACCEL_LABEL (gschem_accel_label_get_type ()) -#define GSCHEM_ACCEL_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSCHEM_TYPE_ACCEL_LABEL, GschemAccelLabel)) -#define GSCHEM_ACCEL_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSCHEM_TYPE_ACCEL_LABEL, GschemAccelLabelClass)) -#define GSCHEM_IS_ACCEL_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSCHEM_TYPE_ACCEL_LABEL)) -#define GSCHEM_IS_ACCEL_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSCHEM_TYPE_ACCEL_LABEL)) -#define GSCHEM_ACCEL_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSCHEM_TYPE_ACCEL_LABEL, GschemAccelLabelClass)) -typedef struct _GschemAccelLabel GschemAccelLabel; -typedef struct _GschemAccelLabelClass GschemAccelLabelClass; - -struct _GschemAccelLabel { - GtkAccelLabel label; - - guint accel_padding; - gchar *accel_string; - guint16 accel_string_width; -}; - -struct _GschemAccelLabelClass { - GtkAccelLabelClass parent_class; -}; - - -GType gschem_accel_label_get_type(void) G_GNUC_CONST; -GtkWidget *gschem_accel_label_new(const gchar * string); -guint gschem_accel_label_get_accel_width(GschemAccelLabel * accel_label); -void gschem_accel_label_set_accel_string(GschemAccelLabel * accel_label, const gchar * accel_string); -gboolean gschem_accel_label_refetch(GschemAccelLabel * accel_label); - -/* Helper: create a new menu item with label and accel label set up */ -GtkWidget *gtk_menu_item_new_gschem(const char *label, const char *accel_label); - -/* private */ -gchar *_gschem_accel_label_class_get_accelerator_label(GschemAccelLabelClass * klass, guint accelerator_key, GdkModifierType accelerator_mods); - -G_END_DECLS -#endif /* __GSCHEM_ACCEL_LABEL_H__ */ Index: work/gtk/in_keyboard/in_keyboard.c =================================================================== --- work/gtk/in_keyboard/in_keyboard.c (revision 39666) +++ work/gtk/in_keyboard/in_keyboard.c (nonexistent) @@ -1,81 +0,0 @@ -/* From Alain : This program captures key events and prints the key modifier, - * "group=0" key label (unicode char) and "key name" according to GDK - */ - -#include -#include - -gboolean on_key_press(GtkWidget * widget, GdkEventKey * event, gpointer user_data); - -int main(int argc, char *argv[]) -{ - GtkWidget *window; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - - g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); - g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(on_key_press), NULL); - - gtk_widget_show_all(window); - - gtk_main(); - - return 0; -} - -void key_press_cb(GdkEventKey * kev) -{ - - if (kev->keyval <= 0xffff) { - GdkModifierType state = (GdkModifierType) (kev->state); - //int slen, mods = 0; - //static int seq_len = 0; - unsigned short int kv = kev->keyval; - - guint *keyvals; - GdkKeymapKey *keys; - gint n_entries; - unsigned short int ukv; - - kv = gdk_keyval_to_lower(kev->keyval); - ukv = gdk_keyval_to_unicode(kv); - if (ukv < 'a' || ukv > 'z') { - if (gdk_keymap_get_entries_for_keycode(gdk_keymap_get_default(), kev->hardware_keycode, &keys, &keyvals, &n_entries)) { - for (int n = 0; n < n_entries; n++) { - printf(" group=%d \tlevel=%d \t%c \t%s\n", keys[n].group, keys[n].level, gdk_keyval_to_unicode(keyvals[n]), - gdk_keyval_name(keyvals[n])); - } - kv = keyvals[0]; - //kv = keyvals[2 * kev->group]; - g_free(keys); - g_free(keyvals); - } - } - printf("Found: "); - if (state & GDK_SHIFT_MASK) { - printf(""); - } - if (state & GDK_CONTROL_MASK) { - printf(""); - } - if (state & GDK_MOD1_MASK) { - printf(""); - } - printf(" %c \tkeyname = %s\n", gdk_keyval_to_unicode(kv), gdk_keyval_name(kv)); - - } -} - -gboolean on_key_press(GtkWidget * widget, GdkEventKey * event, gpointer user_data) -{ - key_press_cb(event); - - /* CTRL-q exits the application */ - if (event->keyval == GDK_KEY_q && event->state & GDK_CONTROL_MASK) { - gtk_main_quit(); - } - - return FALSE; -} Index: work/gtk/in_keyboard/Makefile =================================================================== --- work/gtk/in_keyboard/Makefile (revision 39666) +++ work/gtk/in_keyboard/Makefile (nonexistent) @@ -1,12 +0,0 @@ -TRUNK=../../../trunk -CFLAGS=-g -Wall -I $(TRUNK)/src_plugins `pkg-config --cflags gtk+-2.0` -LDFLAGS=-g `pkg-config --libs gtk+-2.0` -#CFLAGS=-g -Wall -I $(TRUNK)/src_plugins -DPCB_GTK3 `pkg-config --cflags gtk+-3.0` -#LDFLAGS=-g `pkg-config --libs gtk+-3.0` - -all: in_keyboard - -in_keyboard: in_keyboard.o - -clean: - rm *.o in_keyboard Index: work/gtk/gtk_conf_list.c =================================================================== --- work/gtk/gtk_conf_list.c (revision 39666) +++ work/gtk/gtk_conf_list.c (nonexistent) @@ -1,244 +0,0 @@ -#include -#include -#include -#include "gtk_conf_list.h" - -static void rebuild(gtk_conf_list_t *cl) -{ - printf("rebuild\n"); -} - -static int get_sel(gtk_conf_list_t *cl, GtkTreeIter *iter) -{ - GtkTreeSelection *tsel; - GtkTreeModel *tm; - GtkTreePath *path; - int *i; - - tsel = gtk_tree_view_get_selection(GTK_TREE_VIEW(cl->t)); - if (tsel == NULL) - return -1; - - gtk_tree_selection_get_selected(tsel, &tm, iter); - if (iter->stamp == 0) - return -1; - path = gtk_tree_model_get_path(tm, iter); - if (path != NULL) { - i = gtk_tree_path_get_indices(path); - if (i != NULL) - return i[0]; - } - return -1; -} - -static void row_insert_cb(GtkTreeModel *m, GtkTreePath *p, GtkTreeIter *iter, gtk_conf_list_t *cl) -{ - rebuild(cl); -} - -static void row_delete_cb(GtkTreeModel *m, GtkTreePath *p, gtk_conf_list_t *cl) -{ - rebuild(cl); -} - -static void fill_misc_cols(gtk_conf_list_t *cl, int row_idx, GtkTreeIter *iter) -{ - int col; - if (cl->get_misc_col_data != NULL) { - for(col = 0; col < cl->num_cols; col++) { - if ((col == cl->col_data) || (col == cl->col_src)) - continue; - char *s = cl->get_misc_col_data(row_idx, col, NULL); - if (s != NULL) { - gtk_list_store_set(cl->l, iter, col, s, -1); - free(s); - } - } - } -} - -static void button_ins_cb(GtkButton * button, gtk_conf_list_t *cl) -{ - GtkTreeIter *sibl, sibl_, iter; - int idx = get_sel(cl, &sibl_); - if (idx < 0) { - idx = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(cl->t)), NULL); - sibl = NULL; - } - else - sibl = &sibl_; - - gtk_list_store_insert_before(cl->l, &iter, sibl); - fill_misc_cols(cl, idx, &iter); - -#warning TODO: insert new item at idx - printf("ins %d!\n", idx); -} - -static void button_del_cb(GtkButton * button, gtk_conf_list_t *cl) -{ - GtkTreeIter iter; - int max, idx = get_sel(cl, &iter); - - if (idx < 0) - return; - - printf("del %d!\n", idx); - gtk_list_store_remove(cl->l, &iter); -#warning TODO: remove list item idx - - /* set cursor to where the user may expect it */ - max = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(cl->t)), NULL) - 1; - if (idx > max) - idx = max; - if (idx >= 0) { - GtkTreePath *path; - path = gtk_tree_path_new_from_indices(idx, -1); - gtk_tree_view_set_cursor(GTK_TREE_VIEW(cl->t), path, NULL, 0); - } -} - -static void button_sel_cb(GtkButton * button, gtk_conf_list_t *cl) -{ - GtkWidget *fcd; - GtkTreeIter iter; - int idx = get_sel(cl, &iter); - if (idx < 0) - return; - fcd = gtk_file_chooser_dialog_new(cl->file_chooser_title, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); - if (gtk_dialog_run(GTK_DIALOG(fcd)) == GTK_RESPONSE_ACCEPT) { - char *fno = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fcd)); - const char *fn = fno; - - if (cl->file_chooser_postproc != NULL) - fn = cl->file_chooser_postproc(fno); - - printf("sel %d '%s'\n", idx, fn); - gtk_list_store_set(cl->l, &iter, cl->col_data, fn, -1); -#warning TODO: replace list item idx - g_free(fno); - } - gtk_widget_destroy(fcd); -} - - -static void cell_edited_cb(GtkCellRendererText *cell, gchar *path, gchar *new_text, gtk_conf_list_t *cl) -{ - GtkTreeIter iter; - int idx = get_sel(cl, &iter); - - cl->editing = 0; - - printf("edit %d to %s!\n", idx, new_text); - gtk_list_store_set(cl->l, &iter, cl->col_data, new_text, -1); -#warning TODO: replace list item idx -} - -static void cell_edit_started_cb(GtkCellRendererText *cell, GtkCellEditable *e,gchar *path, gtk_conf_list_t *cl) -{ - cl->editing = 1; -} - -static void cell_edit_canceled_cb(GtkCellRendererText *cell, gtk_conf_list_t *cl) -{ - cl->editing = 0; -} - -/* bind a few intuitive keys so that the list can be used without mouse */ -gboolean key_release_cb(GtkWidget *widget, GdkEventKey *event, gtk_conf_list_t *cl) -{ - unsigned short int kv = event->keyval; - if (cl->editing) - return FALSE; -/* printf("REL! %d %d\n", cl->editing, kv);*/ - switch(kv) { - case GDK_KEY_KP_Insert: - case GDK_KEY_Insert: - button_ins_cb(NULL, cl); - break; - case GDK_KEY_KP_Delete: - case GDK_KEY_Delete: - button_del_cb(NULL, cl); - break; - case 'c': - case 's': - if (cl->file_chooser_title != NULL) - button_sel_cb(NULL, cl); - break; - } -} - -GtkWidget *gtk_conf_list_widget(gtk_conf_list_t *cl) -{ - GtkWidget *vbox, *hbox, *bins, *bdel, *bsel, *vfill; - GtkTreeIter iter; - int n; - GType *ty; - - cl->editing = 0; - - vbox = gtk_vbox_new(FALSE, 0); - cl->t = gtk_tree_view_new(); - - /* create the list model */ - ty = malloc(sizeof(GType) * cl->num_cols); - for(n = 0; n < cl->num_cols; n++) - ty[n] = G_TYPE_STRING; - cl->l = gtk_list_store_newv(cl->num_cols, ty); - free(ty); - - /* fill in the list with initial data */ - for(n = 0; n < 8; n++) { - char s[16]; - sprintf(s, "foo %d", n); - gtk_list_store_append(cl->l, &iter); - - gtk_list_store_set(cl->l, &iter, cl->col_data, s, -1); - gtk_list_store_set(cl->l, &iter, cl->col_src, "src", -1); - fill_misc_cols(cl, n, &iter); - } - - /* add all columns */ - for(n = 0; n < cl->num_cols; n++) { - GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(cl->t), -1, cl->col_names[n], renderer, "text", n, NULL); - if (n == cl->col_data) { - g_object_set(renderer, "editable", TRUE, NULL); - g_signal_connect(renderer, "edited", G_CALLBACK(cell_edited_cb), cl); - g_signal_connect(renderer, "editing-started", G_CALLBACK(cell_edit_started_cb), cl); - g_signal_connect(renderer, "editing-canceled", G_CALLBACK(cell_edit_canceled_cb), cl); - } - } - - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(cl->t), cl->reorder); - - g_signal_connect(G_OBJECT(cl->l), "row_deleted", G_CALLBACK(row_delete_cb), cl); - g_signal_connect(G_OBJECT(cl->l), "row_inserted", G_CALLBACK(row_insert_cb), cl); - g_signal_connect(G_OBJECT(cl->t), "key-release-event", G_CALLBACK(key_release_cb), cl); - - gtk_tree_view_set_model(GTK_TREE_VIEW(cl->t), GTK_TREE_MODEL(cl->l)); - - hbox = gtk_hbox_new(FALSE, 0); - bins = gtk_button_new_with_label("insert new"); - bdel = gtk_button_new_with_label("remove"); - - gtk_box_pack_start(GTK_BOX(hbox), bins, FALSE, FALSE, 2); - gtk_box_pack_start(GTK_BOX(hbox), bdel, FALSE, FALSE, 2); - - g_signal_connect(G_OBJECT(bins), "clicked", G_CALLBACK(button_ins_cb), cl); - g_signal_connect(G_OBJECT(bdel), "clicked", G_CALLBACK(button_del_cb), cl); - - if (cl->file_chooser_title != NULL) { - bsel = gtk_button_new_with_label("change path"); - gtk_box_pack_start(GTK_BOX(hbox), bsel, FALSE, FALSE, 2); - g_signal_connect(G_OBJECT(bsel), "clicked", G_CALLBACK(button_sel_cb), cl); - } - - vfill = gtk_vbox_new(FALSE, 100); - - gtk_box_pack_start(GTK_BOX(vbox), cl->t, FALSE, FALSE, 2); - gtk_box_pack_start(GTK_BOX(vbox), vfill, TRUE, TRUE, 2); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); - - return vbox; -} Index: work/gtk/fixed_flow/fixed_flow.c =================================================================== --- work/gtk/fixed_flow/fixed_flow.c (revision 39666) +++ work/gtk/fixed_flow/fixed_flow.c (nonexistent) @@ -1,74 +0,0 @@ -#include - -/* Flow layout: left-to-right first, top-to-bottom next */ -static void flow_resize_lrtb(GtkWidget *flow, GtkAllocation *af, gpointer user_data) -{ - int x = 0, y = 0, row_height = 0, cols = 0, total_width = af->width; - GList *ch = gtk_container_get_children(GTK_CONTAINER(flow)); - - for(; ch != NULL; ch = ch->next) { - GtkWidget *cw = ch->data; - GtkAllocation aw; - - gtk_widget_get_allocation(cw, &aw); - - if ((x + aw.width >= total_width) && (cols > 0)) { /* line wrap */ - y += row_height; - x = 0; - cols = 0; - } - - if ((aw.x != x) || (aw.y != y)) - gtk_fixed_move(GTK_FIXED(flow), cw, x, y); - x += aw.width; - if (aw.height > row_height) - row_height = aw.height; - cols++; - } -} - -static GtkWidget *pcb_gtk_flow_lrtb(void) -{ - GtkWidget *flow = gtk_fixed_new(); - g_signal_connect(G_OBJECT(flow), "size-allocate", G_CALLBACK(flow_resize_lrtb), NULL); - return flow; -} - -static void create_widgets(GtkWidget *window, const char **text) -{ - const char **s; - GtkWidget *flow = pcb_gtk_flow_lrtb(); - - for(s = text; *s != NULL; s++) { - GtkWidget *label = gtk_label_new(*s); - gtk_container_add(GTK_CONTAINER(flow), label); - } - - gtk_container_add(GTK_CONTAINER(window), flow); -} - -int main(int argc, char **argv) -{ - GtkWidget *window; - static const char *text[] = { - "|this is a long text|", - "|that brea|", - "|ks only at|", - "|specific|", - "|locations|", - NULL - }; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_signal_connect(G_OBJECT(window), "destroy", gtk_main_quit, NULL); - gtk_window_set_default_size(GTK_WINDOW(window), 10, 400); - - create_widgets(window, text); - gtk_widget_show_all(window); - - gtk_main(); - - return 0; -} Index: work/gtk/fixed_flow/Makefile =================================================================== --- work/gtk/fixed_flow/Makefile (revision 39666) +++ work/gtk/fixed_flow/Makefile (nonexistent) @@ -1,12 +0,0 @@ -TRUNK=../../../trunk -CFLAGS=-g -Wall -I $(TRUNK)/src_plugins `pkg-config --cflags gtk+-2.0` -LDFLAGS=-g `pkg-config --libs gtk+-2.0` -#CFLAGS=-g -Wall -I $(TRUNK)/src_plugins -DPCB_GTK3 `pkg-config --cflags gtk+-3.0` -#LDFLAGS=-g `pkg-config --libs gtk+-3.0` - -all: fixed_flow - -fixed_flow: fixed_flow.o - -clean: - rm *.o fixed_flow \ No newline at end of file Index: work/gtk/treetable/treetable_orig.c =================================================================== --- work/gtk/treetable/treetable_orig.c (revision 39666) +++ work/gtk/treetable/treetable_orig.c (nonexistent) @@ -1,160 +0,0 @@ -#include - -/* Code copied from the gtk2 manual */ - -enum { - COL_FIRST_NAME = 0, - COL_LAST_NAME, - COL_YEAR_BORN, - NUM_COLS -}; - -static GtkTreeModel *create_and_fill_model(void) -{ - GtkTreeStore *treestore; - GtkTreeIter toplevel, child; - - treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT); - - /* Append a top level row and leave it empty */ - gtk_tree_store_append(treestore, &toplevel, NULL); - gtk_tree_store_set(treestore, &toplevel, COL_FIRST_NAME, "Maria", COL_LAST_NAME, "Incognito", -1); - - /* Append a second top level row, and fill it with some data */ - gtk_tree_store_append(treestore, &toplevel, NULL); - gtk_tree_store_set(treestore, &toplevel, COL_FIRST_NAME, "Jane", COL_LAST_NAME, "Average", COL_YEAR_BORN, (guint) 1962, -1); - - /* Append a child to the second top level row, and fill in some data */ - gtk_tree_store_append(treestore, &child, &toplevel); - gtk_tree_store_set(treestore, &child, COL_FIRST_NAME, "Janinita", COL_LAST_NAME, "Average", COL_YEAR_BORN, (guint) 1985, -1); - - return GTK_TREE_MODEL(treestore); -} - -void age_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) -{ - guint year_born; - guint year_now = 2003; /* to save code not relevant for the example */ - gchar buf[64]; - - gtk_tree_model_get(model, iter, COL_YEAR_BORN, &year_born, -1); - - if (year_born <= year_now && year_born > 0) { - guint age = year_now - year_born; - - g_snprintf(buf, sizeof(buf), "%u years old", age); - - g_object_set(renderer, "foreground-set", FALSE, NULL); /* print this normal */ - } - else { - g_snprintf(buf, sizeof(buf), "age unknown"); - - /* make red */ - g_object_set(renderer, "foreground", "Red", "foreground-set", TRUE, NULL); - } - - g_object_set(renderer, "text", buf, NULL); -} - - -static GtkWidget *create_view_and_model(void) -{ - GtkTreeViewColumn *col; - GtkCellRenderer *renderer; - GtkWidget *view; - GtkTreeModel *model; - - view = gtk_tree_view_new(); - - /* --- Column #1 --- */ - - col = gtk_tree_view_column_new(); - - gtk_tree_view_column_set_title(col, "First Name"); - - /* pack tree view column into tree view */ - gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); - - renderer = gtk_cell_renderer_text_new(); - - /* pack cell renderer into tree view column */ - gtk_tree_view_column_pack_start(col, renderer, TRUE); - - /* connect 'text' property of the cell renderer to - * model column that contains the first name */ - gtk_tree_view_column_add_attribute(col, renderer, "text", COL_FIRST_NAME); - - - /* --- Column #2 --- */ - - col = gtk_tree_view_column_new(); - - gtk_tree_view_column_set_title(col, "Last Name"); - - /* pack tree view column into tree view */ - gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); - - renderer = gtk_cell_renderer_text_new(); - - /* pack cell renderer into tree view column */ - gtk_tree_view_column_pack_start(col, renderer, TRUE); - - /* connect 'text' property of the cell renderer to - * model column that contains the last name */ - gtk_tree_view_column_add_attribute(col, renderer, "text", COL_LAST_NAME); - - /* set 'weight' property of the cell renderer to - * bold print (we want all last names in bold) */ - g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL); - - - /* --- Column #3 --- */ - - col = gtk_tree_view_column_new(); - - gtk_tree_view_column_set_title(col, "Age"); - - /* pack tree view column into tree view */ - gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); - - renderer = gtk_cell_renderer_text_new(); - - /* pack cell renderer into tree view column */ - gtk_tree_view_column_pack_start(col, renderer, TRUE); - - /* connect a cell data function */ - gtk_tree_view_column_set_cell_data_func(col, renderer, age_cell_data_func, NULL, NULL); - - - model = create_and_fill_model(); - - gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); - - g_object_unref(model); /* destroy model automatically with view */ - - gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_NONE); - - return view; -} - - -int main(int argc, char **argv) -{ - GtkWidget *window; - GtkWidget *view; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_signal_connect(window, "delete_event", gtk_main_quit, NULL); /* dirty */ - - view = create_view_and_model(); - - gtk_container_add(GTK_CONTAINER(window), view); - - gtk_widget_show_all(window); - - gtk_main(); - - return 0; -} Index: work/gtk/treetable/Makefile =================================================================== --- work/gtk/treetable/Makefile (revision 39666) +++ work/gtk/treetable/Makefile (nonexistent) @@ -1,5 +0,0 @@ -GTK=gtk+-2.0 -CFLAGS = -Wall -g `pkg-config --cflags $(GTK)` -LDFLAGS = `pkg-config --libs $(GTK)` - -treetable_orig: treetable_orig.c Index: work/gtk/propedit.c =================================================================== --- work/gtk/propedit.c (revision 39666) +++ work/gtk/propedit.c (nonexistent) @@ -1,21 +0,0 @@ -#include -#include -#include "ghid-propedit.h" - -int main(int argc, char *argv[]) -{ - static ghid_propedit_dialog_t dlg; - GtkWidget *window; - - gtk_init(&argc, &argv); - - window = ghid_propedit_dialog_create(&dlg); - - ghid_propedit_prop_add(&dlg, "foo/bar", "15", "10", "20", "17.2"); - ghid_propedit_prop_add(&dlg, "foo/baz", "1", "1", "2", "1.2"); - ghid_propedit_prop_add(&dlg, "string", "ho", NULL, NULL, NULL); - - gtk_main(); - - return 0; -} Index: work/gtk/gtk1.c =================================================================== --- work/gtk/gtk1.c (revision 39666) +++ work/gtk/gtk1.c (nonexistent) @@ -1,104 +0,0 @@ -#include -#include -#include "gschem_accel_label.h" - -void d1() {} - -int main(int argc, char *argv[]) -{ - - GtkWidget *window; - GtkWidget *vbox; - - GtkWidget *menubar; - GtkWidget *fileMenu; - GtkWidget *fileMi; - GtkWidget *fakeMi; - GtkWidget *newMi; - GtkWidget *openMi; - GtkWidget *quitMi; - GtkWidget *acc; - - GtkWidget *sep; - - GtkAccelGroup *accel_group = NULL; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_UTILITY); - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); - gtk_window_set_title(GTK_WINDOW(window), "Images"); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(window), vbox); - - menubar = gtk_menu_bar_new(); - fileMenu = gtk_menu_new(); - - accel_group = gtk_accel_group_new(); - gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); - - fileMi = gtk_menu_item_new_with_mnemonic("_File"); - -// newMi = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL); - fakeMi = gtk_menu_item_new_with_label("asdfjdslfkjlsdkljsdlkjdsf"); - - quitMi = gtk_menu_item_new_with_label("q"); - -// newMi = gtk_menu_item_new_with_label("a"); -// GtkWidget *ch = gtk_bin_get_child(GTK_BIN(newMi)); -// gtk_label_set_markup(GTK_LABEL(ch), "e RIGHT"); - -// newMi = gtk_menu_item_new(); - - acc = gtk_accel_label_new("Ctrl+W"); - -// acc = gtk_label_new("Ctrl+W"); -// gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(ch), acc); -// gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(newMi), acc); - -// g_object_set(GTK_ACCEL_LABEL(ch), "accel-widget", acc, NULL); -//g_signal_emit(GTK_ACCEL_LABEL(ch), widget_signals[ACCEL_CLOSURES_CHANGED], 0); - -/// -// g_object_set(newMi, "label", "jajj", NULL); -// GtkWidget *l = gtk_label_new("jajj2"); -// gtk_container_add (GTK_CONTAINER (newMi), l); - -/* almost -// gtk_container_add (GTK_CONTAINER (acc), l); - gtk_container_add (GTK_CONTAINER (newMi), acc); - gtk_widget_show (acc); - - gtk_menu_item_set_label(GTK_MENU_ITEM(newMi), "jujj1"); -/// -*/ - - - newMi = gtk_menu_item_new_gschem("foo", "ctrl+t"); - - gtk_widget_add_accelerator(quitMi, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); - - gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu); - gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), fakeMi); - gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), newMi); -/* gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), openMi); - gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), sep);*/ - gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi); - gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi); - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); - -// g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); - - g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(gtk_main_quit), NULL); - - gtk_widget_show_all(window); - - gtk_main(); - -// gtk_main(); - - return 0; -} Index: work/gtk/fixed_dockbox/fixed_dockbox.c =================================================================== --- work/gtk/fixed_dockbox/fixed_dockbox.c (revision 39666) +++ work/gtk/fixed_dockbox/fixed_dockbox.c (nonexistent) @@ -1,100 +0,0 @@ -#include - -/* dockbox children in order: - 1. frame - 2. control -*/ - -static void dockbox_resize(GtkWidget *dockbox, GtkAllocation *af, gpointer user_data) -{ - GList *ch = gtk_container_get_children(GTK_CONTAINER(dockbox)); - GtkWidget *wctrl = ch->next->data; - GtkWidget *wframe = ch->data; - gint x, y, w, h, yoffs; - GtkAllocation ctrl_alloc, frame_alloc; - - gtk_widget_get_allocation(wctrl, &ctrl_alloc); - yoffs = ctrl_alloc.height/4; - x = af->width - ctrl_alloc.width - 8; - y = 0; - if ((ctrl_alloc.x != x) || (ctrl_alloc.y != y)) - gtk_fixed_move(GTK_FIXED(dockbox), wctrl, x, y); - - gtk_widget_get_allocation(wframe, &frame_alloc); - w = af->width; - h = af->height - yoffs; - if ((w != frame_alloc.width) || (h != frame_alloc.height)) - gtk_widget_set_size_request(wframe, w, h); - - gtk_widget_get_allocation(wframe, &frame_alloc); - x = 0; - y = yoffs; - if ((frame_alloc.x != x) || (frame_alloc.y != y)) - gtk_fixed_move(GTK_FIXED(dockbox), wframe, x, y); -} - -static GtkWidget *pcb_gtk_dockbox(const char *label, GtkWidget *ctrl, GtkWidget **frame_out) -{ - GtkWidget *frame, *db; - - db = gtk_fixed_new(); - frame = gtk_frame_new(label); - - gtk_container_add(GTK_CONTAINER(db), frame); - gtk_container_add(GTK_CONTAINER(db), ctrl); - - g_signal_connect(G_OBJECT(db), "size-allocate", G_CALLBACK(dockbox_resize), NULL); - *frame_out = frame; - return db; -} - -static void create_widgets(GtkWidget *window, const char *label, const char **text) -{ - const char **s; - GtkWidget *db, *ctrl, *but, *frame, *vbox; - - ctrl = gtk_hbox_new(FALSE, 0); - - but = gtk_button_new_with_label("~"); - gtk_box_pack_start(GTK_BOX(ctrl), but, TRUE, TRUE, 0); - but = gtk_button_new_with_label("x"); - gtk_box_pack_start(GTK_BOX(ctrl), but, TRUE, TRUE, 0); - - db = pcb_gtk_dockbox(label, ctrl, &frame); - - vbox = gtk_vbox_new(FALSE, 3); - gtk_container_add(GTK_CONTAINER(frame), vbox); - for(s = text; *s != NULL; s++) { - GtkWidget *label = gtk_label_new(*s); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - } - - gtk_container_add(GTK_CONTAINER(window), db); -} - -int main(int argc, char **argv) -{ - GtkWidget *window; - static const char *text[] = { - "dock", - "children labels", - "jsut to have", - "something in", - "the box", - NULL - }; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - g_signal_connect(G_OBJECT(window), "destroy", gtk_main_quit, NULL); - -/* WARNING: must not set: gtk_window_set_default_size(GTK_WINDOW(window), 10, 400);*/ - - create_widgets(window, "title", text); - gtk_widget_show_all(window); - - gtk_main(); - - return 0; -} Index: work/gtk/fixed_dockbox/Makefile =================================================================== --- work/gtk/fixed_dockbox/Makefile (revision 39666) +++ work/gtk/fixed_dockbox/Makefile (nonexistent) @@ -1,12 +0,0 @@ -TRUNK=../../../trunk -CFLAGS=-g -Wall -I $(TRUNK)/src_plugins `pkg-config --cflags gtk+-2.0` -LDFLAGS=-g `pkg-config --libs gtk+-2.0` -#CFLAGS=-g -Wall -I $(TRUNK)/src_plugins -DPCB_GTK3 `pkg-config --cflags gtk+-3.0` -#LDFLAGS=-g `pkg-config --libs gtk+-3.0` - -all: fixed_dockbox - -fixed_dockbox: fixed_dockbox.o - -clean: - rm *.o fixed_dockbox \ No newline at end of file Index: work/gtk/gtk_conf_list.h =================================================================== --- work/gtk/gtk_conf_list.h (revision 39666) +++ work/gtk/gtk_conf_list.h (nonexistent) @@ -1,24 +0,0 @@ -#include - -typedef struct gtk_conf_list_s { - int num_cols; /* number of visible columns */ - const char **col_names; /* header for each visible column */ - int col_data, col_src; /* column index where list data and list source (lihata path) should be automatically added (-1 means off) */ - int reorder; /* 0 to disable reordering */ - - /* callback to fill in non-data, non-src cells */ - char *(*get_misc_col_data)(int row, int col, void *item); /* free()'d after the call; NULL=empty */ - - /* if not NULL, allow the file chooser to be invoked on the data cells */ - const char *file_chooser_title; - - /* if the file chooser ran, filter the name through this function before inserting in the table */ - const char *(*file_chooser_postproc)(char *path); - - /* -- internal -- */ - GtkListStore *l; - GtkWidget *t; - int editing; -} gtk_conf_list_t; - -GtkWidget *gtk_conf_list_widget(gtk_conf_list_t *cl); Index: work/gtk/list.c =================================================================== --- work/gtk/list.c (revision 39666) +++ work/gtk/list.c (nonexistent) @@ -1,55 +0,0 @@ -#include -#include -#include -#include "gtk_conf_list.h" - -static char *col_data(int row, int col, void *item) -{ - char s[16]; - sprintf(s, "r%d c%d", row, col); - return strdup(s); -} - -const char *fn_postproc(char *path) -{ - return path; -} - -int main(int argc, char *argv[]) -{ - GtkWidget *window; - GtkWidget *vbox, *t; - gtk_conf_list_t cl; - const char *cnames[] = {"foo", "path", "src", "bar"}; - - cl.num_cols = 4; - cl.col_names = cnames; - cl.col_data = 1; - cl.col_src = 2; - cl.reorder = 0; - cl.get_misc_col_data = col_data; - cl.file_chooser_title = "qwerty"; - cl.file_chooser_postproc = fn_postproc; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); - gtk_window_set_title(GTK_WINDOW(window), "Images"); - - vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(window), vbox); - - t = gtk_conf_list_widget(&cl); - - gtk_box_pack_start(GTK_BOX(vbox), t, TRUE, TRUE, 4); - - gtk_widget_show_all(window); - - gtk_main(); - - gtk_main(); - - return 0; -} Index: work/gtk/README =================================================================== --- work/gtk/README (revision 39666) +++ work/gtk/README (nonexistent) @@ -1,4 +0,0 @@ -gtk workaround tests - -accel key label: gtk simply can not do it without messing with key input, -has to replace the accel label object. \ No newline at end of file Index: work/gtk/gschem_accel_label.c =================================================================== --- work/gtk/gschem_accel_label.c (revision 39666) +++ work/gtk/gschem_accel_label.c (nonexistent) @@ -1,341 +0,0 @@ -/* gEDA - GPL Electronic Design Automation - * gschem - gEDA Schematic Capture - * Copyright (C) 1998-2010 gEDA Contributors (see ChangeLog for details) - * - * Code based on GTK 2.14.5 gtk/gtkaccellabel.c (LGPL) - * - * GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GschemAccelLabel: GtkLabel with accelerator monitoring facilities. - * Copyright (C) 1998 Tim Janik - * - * Modified by the GTK+ Team and others 1997-2001. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - * - * Adapted for gEDA by Peter Clifton - * - * THIS FILE IS LGPL LICENSED, pcb-rnd AS A WHOLE IS GPL LICENSED - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -/* This file has been copied from gschem sources. It seems gtk's bondage -and discipline menu item simply cna not handle arbitrary accel label text -and the default accel label widget works only if gtk takes over handling -accel key input. In pbc-rnd there's a central input key handling and support -for multi-key sequences. gschem had the same problem because of multi-key, -and came up with this solution to rewrite the accel label object. - -Modifications: - - indentation - - #includes - - helper call that creates a menu item with label and accel label -*/ - -#include -#include -#include "gschem_accel_label.h" - -#define P_(x) (x) - -enum { - PROP_0, - PROP_ACCEL_CLOSURE, - PROP_ACCEL_WIDGET, - PROP_ACCEL_STRING, -}; - -G_DEFINE_TYPE(GschemAccelLabel, gschem_accel_label, GTK_TYPE_ACCEL_LABEL) - - -gboolean gschem_accel_label_refetch(GschemAccelLabel * accel_label) -{ - gboolean enable_accels; - - g_return_val_if_fail(GSCHEM_IS_ACCEL_LABEL(accel_label), FALSE); - - g_object_get(gtk_widget_get_settings(GTK_WIDGET(accel_label)), "gtk-enable-accels", &enable_accels, NULL); - - if (!enable_accels || accel_label->accel_string == NULL) { - if (accel_label->accel_string != NULL) - g_free(accel_label->accel_string); - - accel_label->accel_string = g_strdup(""); - } - - gtk_widget_queue_resize(GTK_WIDGET(accel_label)); - - return FALSE; -} - - -static const gchar *gschem_accel_label_get_string(GschemAccelLabel * accel_label) -{ - if (!accel_label->accel_string) - gschem_accel_label_refetch(accel_label); - - return accel_label->accel_string; -} - - -static void gschem_accel_label_set_property(GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) -{ - GschemAccelLabel *accel_label; - - accel_label = GSCHEM_ACCEL_LABEL(object); - - switch (prop_id) { - /* Dummy properties from GtkAccelLabel */ - case PROP_ACCEL_CLOSURE: - case PROP_ACCEL_WIDGET: - break; - - case PROP_ACCEL_STRING: - gschem_accel_label_set_accel_string(accel_label, g_value_get_string(value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); - break; - } -} - -static void gschem_accel_label_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) -{ - GschemAccelLabel *accel_label; - - accel_label = GSCHEM_ACCEL_LABEL(object); - - switch (prop_id) { - /* Dummy property from GtkAccelLabel */ - case PROP_ACCEL_CLOSURE: - g_value_set_boxed(value, NULL); - break; - - /* Dummy property from GtkAccelLabel */ - case PROP_ACCEL_WIDGET: - g_value_set_object(value, NULL); - break; - - case PROP_ACCEL_STRING: - g_value_set_string(value, accel_label->accel_string); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); - break; - } -} - -static void gschem_accel_label_init(GschemAccelLabel * accel_label) -{ - accel_label->accel_padding = 3; - accel_label->accel_string = NULL; -} - -static void gschem_accel_label_finalize(GObject * object) -{ - GschemAccelLabel *accel_label = GSCHEM_ACCEL_LABEL(object); - - g_free(accel_label->accel_string); - - G_OBJECT_CLASS(gschem_accel_label_parent_class)->finalize(object); -} - -guint gschem_accel_label_get_accel_width(GschemAccelLabel * accel_label) -{ - g_return_val_if_fail(GSCHEM_IS_ACCEL_LABEL(accel_label), 0); - - return (accel_label->accel_string_width + (accel_label->accel_string_width ? accel_label->accel_padding : 0)); -} - -static void gschem_accel_label_size_request(GtkWidget * widget, GtkRequisition * requisition) -{ - GschemAccelLabel *accel_label = GSCHEM_ACCEL_LABEL(widget); - GtkAccelLabel *gtk_accel_label = GTK_ACCEL_LABEL(widget); - PangoLayout *layout; - gint width; - - GTK_WIDGET_CLASS(gschem_accel_label_parent_class)->size_request(widget, requisition); - - layout = gtk_widget_create_pango_layout(widget, gschem_accel_label_get_string(accel_label)); - pango_layout_get_pixel_size(layout, &width, NULL); - accel_label->accel_string_width = width; - gtk_accel_label->accel_string_width = width; /* HACK: This field is private to GtkAccelLabel */ - g_object_unref(layout); -} - -static gint get_first_baseline(PangoLayout * layout) -{ - PangoLayoutIter *iter; - gint result; - - iter = pango_layout_get_iter(layout); - result = pango_layout_iter_get_baseline(iter); - pango_layout_iter_free(iter); - - return PANGO_PIXELS(result); -} - -static gboolean gschem_accel_label_expose_event(GtkWidget * widget, GdkEventExpose * event) -{ - GschemAccelLabel *accel_label = GSCHEM_ACCEL_LABEL(widget); - GtkMisc *misc = GTK_MISC(accel_label); - GtkTextDirection direction; - - direction = gtk_widget_get_direction(widget); - - if (gtk_widget_is_drawable(GTK_WIDGET(accel_label))) { - guint ac_width; - - ac_width = gschem_accel_label_get_accel_width(accel_label); - - if (widget->allocation.width >= widget->requisition.width + ac_width) { - PangoLayout *label_layout; - PangoLayout *accel_layout; - GtkLabel *label = GTK_LABEL(widget); - - gint x; - gint y; - - label_layout = gtk_label_get_layout(GTK_LABEL(accel_label)); - - if (direction == GTK_TEXT_DIR_RTL) - widget->allocation.x += ac_width; - widget->allocation.width -= ac_width; - if (gtk_label_get_ellipsize(label)) - pango_layout_set_width(label_layout, pango_layout_get_width(label_layout) - - ac_width * PANGO_SCALE); - - if (GTK_WIDGET_CLASS(gschem_accel_label_parent_class)->expose_event) - GTK_WIDGET_CLASS(gschem_accel_label_parent_class)->expose_event(widget, event); - if (direction == GTK_TEXT_DIR_RTL) - widget->allocation.x -= ac_width; - widget->allocation.width += ac_width; - if (gtk_label_get_ellipsize(label)) - pango_layout_set_width(label_layout, pango_layout_get_width(label_layout) - + ac_width * PANGO_SCALE); - - if (direction == GTK_TEXT_DIR_RTL) - x = widget->allocation.x + misc->xpad; - else - x = widget->allocation.x + widget->allocation.width - misc->xpad - ac_width; - - gtk_label_get_layout_offsets(GTK_LABEL(accel_label), NULL, &y); - - accel_layout = gtk_widget_create_pango_layout(widget, gschem_accel_label_get_string(accel_label)); - - y += get_first_baseline(label_layout) - get_first_baseline(accel_layout); - - gtk_paint_layout(widget->style, - widget->window, - gtk_widget_get_state(widget), FALSE, &event->area, widget, "accellabel", x, y, accel_layout); - - g_object_unref(accel_layout); - } - else { - if (GTK_WIDGET_CLASS(gschem_accel_label_parent_class)->expose_event) - GTK_WIDGET_CLASS(gschem_accel_label_parent_class)->expose_event(widget, event); - } - } - - return FALSE; -} - -/* Underscores in key names are better displayed as spaces - * E.g., Page_Up should be "Page Up" - */ -static void substitute_underscores(char *str) -{ - char *p; - - for (p = str; *p; p++) - if (*p == '_') - *p = ' '; -} - - -/** - * gschem_accel_label_set_accel_string: - * \param accel_label a #GschemAccelLabel - * \param accel_string the accelerator string. - * - * Sets the accelerator string for this accelerator label. - **/ -void gschem_accel_label_set_accel_string(GschemAccelLabel * accel_label, const gchar * accel_string) -{ - g_return_if_fail(GSCHEM_IS_ACCEL_LABEL(accel_label)); - - if (accel_label->accel_string) - g_free(accel_label->accel_string); - - if (accel_string) { - accel_label->accel_string = g_strdup(accel_string); - substitute_underscores(accel_label->accel_string); - } - else { - accel_label->accel_string = NULL; - } - - g_object_notify(G_OBJECT(accel_label), "accel-string"); -} - -static void gschem_accel_label_class_init(GschemAccelLabelClass * class) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS(class); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); - - gobject_class->finalize = gschem_accel_label_finalize; - gobject_class->set_property = gschem_accel_label_set_property; - gobject_class->get_property = gschem_accel_label_get_property; - - widget_class->size_request = gschem_accel_label_size_request; - widget_class->expose_event = gschem_accel_label_expose_event; - - g_object_class_install_property(gobject_class, - PROP_ACCEL_CLOSURE, - g_param_spec_boxed("accel-closure", - P_("Accelerator Closure"), - P_("The closure to be monitored for accelerator changes"), - G_TYPE_CLOSURE, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, - PROP_ACCEL_WIDGET, - g_param_spec_object("accel-widget", - P_("Accelerator Widget"), - P_("The widget to be monitored for accelerator changes"), - GTK_TYPE_WIDGET, G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, - PROP_ACCEL_STRING, - g_param_spec_string("accel-string", - P_("Accelerator String"), - P_("The accelerator string to be displayed"), NULL, G_PARAM_READWRITE)); -} - -GtkWidget *gtk_menu_item_new_gschem(const char *label, const char *accel_label) -{ - GtkWidget *w = gtk_menu_item_new(); - GschemAccelLabel *al = g_object_new (GSCHEM_TYPE_ACCEL_LABEL, - "use-underline", TRUE, - "xalign", 0.0, - "visible", TRUE, - "label", label, - "accel-string", accel_label, - NULL); - gtk_container_add(GTK_CONTAINER(w), GTK_WIDGET(al)); - return w; -} Index: work/gtk/Makefile =================================================================== --- work/gtk/Makefile (revision 39666) +++ work/gtk/Makefile (nonexistent) @@ -1,12 +0,0 @@ -CFLAGS=-g `pkg-config --cflags gtk+-2.0` -LDFLAGS=-g `pkg-config --libs gtk+-2.0` - -all: gtk1 - -#propedit - -propedit: propedit.o ghid-propedit.o - -gtk1: gtk1.o gschem_accel_label.o - -list: list.o gtk_conf_list.o