[gq-commit] gq/src configfile.c,1.49,1.50 configfile.h,1.35,1.36 formfill.c,1.43,1.44 gq-xml.c,1.10,
Status: Beta
Brought to you by:
sur5r
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv13540/src Modified Files: configfile.c configfile.h formfill.c gq-xml.c input.c mainwin.c mainwin.h util.c util.h Log Message: * Due to a suggestion by Scott Ware <sc...@ea...> I implemented the possibility to set user-defined attribute aliases in browse mode. This triggered an internally planned rewrite of LDAP-attribute related preferences like default display types and some other changes. Index: configfile.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.c,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** configfile.c 2 Nov 2003 17:23:49 -0000 1.49 --- configfile.c 2 Nov 2003 17:41:04 -0000 1.50 *************** *** 222,225 **** --- 222,253 ---- } + + struct attr_settings *new_attr_settings() + { + struct attr_settings *a = g_malloc0(sizeof(struct attr_settings)); + a->name = g_strdup(""); + a->defaultDT = -1; + a->user_friendly = NULL; + + return a; + } + + void free_attr_settings(struct attr_settings *a) + { + if (a) { + g_free_if(a->name); + g_free_if(a->user_friendly); + g_free(a); + } + } + + + gboolean is_default_attr_settings(struct attr_settings *as) + { + assert(as); + return as && as->defaultDT == -1 && as->user_friendly == NULL; + } + + void config_add_server(struct gq_config *config, struct ldapserver *newserver) *************** *** 490,505 **** } ! static void default_dt_dumper(char *key, ! int *value, ! struct writeconfig *wc) { ! config_write(wc, "<display-type>\n"); wc->indent++; ! config_write_string(wc, key, "dt-attribute", NULL); ! config_write_int(wc, *value, "dt-default", NULL); wc->indent--; ! config_write(wc, "</display-type>\n"); } --- 518,542 ---- } ! static void attrs_dumper(char *key, ! struct attr_settings *as, ! struct writeconfig *wc) { ! GHashTable *attrs = g_hash_table_new(g_str_hash, g_str_equal); ! g_hash_table_insert(attrs, "name", key); ! ! config_write_start_tag(wc, "ldap-attribute", attrs); wc->indent++; ! if (as->defaultDT != -1) { ! config_write_int(wc, as->defaultDT, "dt-default", NULL); ! } ! if (as->user_friendly != NULL && strlen(as->user_friendly) > 0) { ! config_write_string(wc, as->user_friendly, "user-friendly", NULL); ! } wc->indent--; ! config_write_end_tag(wc, "ldap-attribute"); ! ! g_hash_table_destroy(attrs); } *************** *** 699,709 **** wc->indent++; ! config_write(wc, "<display-types>\n"); ! wc->indent++; ! ! g_hash_table_foreach(cfg->defaultDT, (GHFunc) default_dt_dumper, wc); ! ! wc->indent--; ! config_write(wc, "</display-types>\n"); wc->indent--; --- 736,748 ---- wc->indent++; ! if (g_hash_table_size(cfg->attrs) > 0) { ! config_write_start_tag(wc, "ldap-attributes", NULL); ! wc->indent++; ! ! g_hash_table_foreach(cfg->attrs, (GHFunc) attrs_dumper, wc); ! ! wc->indent--; ! config_write_end_tag(wc, "ldap-attributes"); ! } wc->indent--; *************** *** 787,791 **** cfg->ldifformat = DEFAULT_LDIFFORMAT; cfg->schemaserver = g_strdup(""); /* [0] = '\0'; */ ! cfg->defaultDT = g_hash_table_new(g_str_hash, g_str_equal); cfg->restore_window_sizes = DEFAULT_RESTORE_SIZES; --- 826,830 ---- cfg->ldifformat = DEFAULT_LDIFFORMAT; cfg->schemaserver = g_strdup(""); /* [0] = '\0'; */ ! cfg->attrs = g_hash_table_new(g_str_hash, g_str_equal); cfg->restore_window_sizes = DEFAULT_RESTORE_SIZES; *************** *** 849,862 **** } ! ! static gboolean default_dt_remove(gpointer key, ! gpointer value, ! gpointer user_data) { ! if (key) g_free(key); ! if (value) g_free(value); return 1; } void free_config(struct gq_config *cfg) { struct ldapserver *server; --- 888,925 ---- } ! static gboolean attr_remove(gpointer key, ! gpointer value, ! gpointer user_data) { ! g_free_if(key); ! free_attr_settings((struct attr_settings *)value); return 1; } + struct attr_settings *lookup_attr_settings(const char *attrname) + { + struct attr_settings *as; + char *tmp, *t; + + if (!config->attrs) return NULL; + + tmp = g_strdup(attrname); + for (t = tmp ; *t ; t++) { + *t = tolower(*t); + } + + as = g_hash_table_lookup(config->attrs, tmp); + + g_free(tmp); + + return as; + } + + const char *human_readable_attrname(const char *attrname) + { + struct attr_settings *as = lookup_attr_settings(attrname); + return (as && as->user_friendly && strlen(as->user_friendly) > 0) ? as->user_friendly : attrname; + } + void free_config(struct gq_config *cfg) { struct ldapserver *server; *************** *** 887,895 **** g_list_free(cfg->filters); ! /* free default display type hash */ ! g_hash_table_foreach_remove(cfg->defaultDT, default_dt_remove, NULL); ! g_hash_table_destroy(cfg->defaultDT); ! cfg->defaultDT = NULL; /* free object itself */ --- 950,958 ---- g_list_free(cfg->filters); ! /* free ldap attribute settings hash */ ! g_hash_table_foreach_remove(cfg->attrs, attr_remove, NULL); ! g_hash_table_destroy(cfg->attrs); ! cfg->attrs = NULL; /* free object itself */ Index: configfile.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.h,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** configfile.h 2 Nov 2003 07:20:43 -0000 1.35 --- configfile.h 2 Nov 2003 17:41:04 -0000 1.36 *************** *** 33,37 **** #include "common.h" ! #define CURRENT_CONFIG_VERSION 2 #define CONFIG_INDENT_STRING " " --- 33,37 ---- #include "common.h" ! #define CURRENT_CONFIG_VERSION 3 #define CONFIG_INDENT_STRING " " *************** *** 114,118 **** int never_leak_credentials; ! GHashTable *defaultDT; }; --- 114,118 ---- int never_leak_credentials; ! GHashTable *attrs; /* attribute specific data */ }; *************** *** 130,136 **** --- 130,153 ---- }; + /* A structure holding LDAP attribute specific, configurable settings */ + struct attr_settings { + char *name; + int defaultDT; /* default displaytype: -1: unset */ + char *user_friendly; /* user-friendly name */ + }; + struct writeconfig *new_writeconfig(); void free_writeconfig(struct writeconfig *wc); + + struct attr_settings *new_attr_settings(); + void free_attr_settings(struct attr_settings *); + /* returns TRUE if the attr_settings object contains only default + values. This indicates that the object could be removed + altogether */ + gboolean is_default_attr_settings(struct attr_settings *); + + struct attr_settings *lookup_attr_settings(const char *attrname); + const char *human_readable_attrname(const char *attrname); void config_write_start_tag(struct writeconfig *wc, Index: formfill.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/formfill.c,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** formfill.c 2 Nov 2003 17:23:49 -0000 1.43 --- formfill.c 2 Nov 2003 17:41:05 -0000 1.44 *************** *** 484,488 **** struct ldapserver *server, struct formfill *form) { ! int *val = NULL; /* this is ugly... all of this needs a cleanup!!!! - FIXME */ --- 484,488 ---- struct ldapserver *server, struct formfill *form) { ! struct attr_settings *as; /* this is ugly... all of this needs a cleanup!!!! - FIXME */ *************** *** 496,505 **** form->syntax = get_syntax_handler_of_attr(error_context, server, form->attrname, NULL); - if (config->defaultDT) { - val = g_hash_table_lookup(config->defaultDT, form->attrname); - } ! if (val) { ! form->displaytype = *val; } else { form->displaytype = find_displaytype(error_context, server, form); --- 496,503 ---- form->syntax = get_syntax_handler_of_attr(error_context, server, form->attrname, NULL); ! as = lookup_attr_settings(form->attrname); ! if (as && as->defaultDT != -1) { ! form->displaytype = as->defaultDT; } else { form->displaytype = find_displaytype(error_context, server, form); Index: gq-xml.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/gq-xml.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** gq-xml.c 2 Nov 2003 17:23:49 -0000 1.10 --- gq-xml.c 2 Nov 2003 17:41:05 -0000 1.11 *************** *** 555,568 **** if (d->attr) { if (get_dt_handler(d->dt)) { ! int *p = (int *) g_malloc(sizeof(int)); ! *p = d->dt; ! g_hash_table_insert(c->defaultDT, ! d->attr, ! p); ! d->attr = NULL; /* stored in hash table */ } } - } --- 555,575 ---- if (d->attr) { + char *t; + for (t = d->attr ; *t ; t++) *t = tolower(*t); + if (get_dt_handler(d->dt)) { ! struct attr_settings *as = ! (struct attr_settings *) g_hash_table_lookup(c->attrs, ! d->attr); ! if (!as) { ! as = new_attr_settings(); ! as->name = g_strdup(d->attr); ! g_hash_table_insert(c->attrs, g_strdup(as->name), ! as); ! } ! ! as->defaultDT = d->dt; } } } *************** *** 576,580 **** } - static void ldapserver_dt_defaultE(struct parser_context *ctx, struct tagstack_entry *e) --- 583,586 ---- *************** *** 586,589 **** --- 592,686 ---- } + static void ldap_attributeS(struct parser_context *ctx, + struct tagstack_entry *e) + { + struct gq_config *c = peek_tag(ctx->stack, 3)->data; + int i; + + for (i = 0 ; e->attrs[i] ; i += 2) { + if (strcasecmp(e->attrs[i], "name") == 0) { + char *tmp, *t; + struct attr_settings *as; + + assert(e->attrs[i + 1]); + + tmp = g_strdup(e->attrs[i + 1]); + for (t = tmp ; *t ; t++) *t = tolower(*t); + + as = (struct attr_settings *) g_hash_table_lookup(c->attrs, tmp); + + if (!as) { + as = new_attr_settings(); + as->name = g_strdup(tmp); + g_hash_table_insert(c->attrs, g_strdup(as->name), + as); + } + + g_free(tmp); + + e->data = as; + e->free_data = NULL; + break; + } + } + + if (!e->data) { + /* raise error: missing attribute "name" */ + XMLhandleError(ctx, _("Missing attribute 'name'")); + } + } + + + static void ldap_attributeE(struct parser_context *ctx, + struct tagstack_entry *e) + { + struct gq_config *c = peek_tag(ctx->stack, 3)->data; + struct attr_settings *as; + gpointer okey; + + assert(e->data); + as = (struct attr_settings *) e->data; + + if (is_default_attr_settings(as)) { + /* corresponds to default settings anyway - get rid of this + unneeded object */ + + g_hash_table_lookup_extended(c->attrs, + as->name, + &okey, NULL); + g_hash_table_remove(c->attrs, as->name); + g_free_if(okey); + + free_attr_settings(as); + } + } + + + static void dt_defaultE(struct parser_context *ctx, + struct tagstack_entry *e) + { + struct attr_settings *as = + (struct attr_settings *) peek_tag(ctx->stack, 1)->data; + + long l = longCDATA(ctx, e); + + assert(as); + + if (l >= 0) as->defaultDT = l; + } + + static void user_friendlyE(struct parser_context *ctx, + struct tagstack_entry *e) + { + struct attr_settings *as = + (struct attr_settings *) peek_tag(ctx->stack, 1)->data; + + assert(as); + + if (e->cdata && strlen(e->cdata) > 0) { + as->user_friendly = g_strdup(e->cdata); + } + } + static struct xml_tag config_tags[] = { *************** *** 818,821 **** --- 915,946 ---- }, + /* ldap-attributes */ + { + "ldap-attributes", 0, + NULL, NULL, + { "defaults", NULL }, + }, + + /* ldap-attribute */ + { + "ldap-attribute", 0, + ldap_attributeS, ldap_attributeE, + { "ldap-attributes", "defaults", NULL }, + }, + + { + "dt-default", 0, + NULL, dt_defaultE, + { "ldap-attribute", NULL }, + }, + + { + "user-friendly", 0, + NULL, user_friendlyE, + { "ldap-attribute", NULL }, + }, + + + #ifndef NO_DEPRECATED /* display-types */ *************** *** 843,846 **** --- 968,974 ---- { "display-type", NULL }, }, + + #endif + { Index: input.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/input.c,v retrieving revision 1.80 retrieving revision 1.81 diff -C2 -d -r1.80 -r1.81 *** input.c 2 Nov 2003 17:23:49 -0000 1.80 --- input.c 2 Nov 2003 17:41:05 -0000 1.81 *************** *** 28,31 **** --- 28,32 ---- #include <stdio.h> /* perror() */ #include <stdlib.h> /* free() */ + #include <ctype.h> /* tolower() */ #include <glib.h> *************** *** 584,599 **** gpointer okey; gpointer val; ! if (g_hash_table_lookup_extended(config->defaultDT, ! form->attrname, ! &okey, &val)) { ! g_hash_table_remove(config->defaultDT, form->attrname); ! if (save_config(GTK_WIDGET(menuitem))) { if (okey) g_free(okey); ! if (val) g_free(val); ! } else { /* save failed, undo changes - re-insert into hash */ ! g_hash_table_insert(config->defaultDT, okey, val); } --- 585,620 ---- gpointer okey; gpointer val; + struct attr_settings *as = lookup_attr_settings(form->attrname); + int old_ddt; + int do_free = 0; ! if (!as) return; ! old_ddt = as->defaultDT; ! ! as->defaultDT = -1; ! if (is_default_attr_settings(as)) { ! do_free = 1; ! } ! ! if (do_free) { ! if (g_hash_table_lookup_extended(config->attrs, ! as->name, ! &okey, &val)) { ! g_hash_table_remove(config->attrs, okey); ! } ! } ! ! if (save_config(GTK_WIDGET(menuitem))) { ! if (do_free) { if (okey) g_free(okey); ! if (val) free_attr_settings(val); ! } ! } else { ! as->defaultDT = old_ddt; ! ! if (do_free) { /* save failed, undo changes - re-insert into hash */ ! g_hash_table_insert(config->attrs, okey, val); } *************** *** 604,649 **** struct formfill *form) { - int dt; - gpointer okey = NULL; - gpointer val = NULL; - gpointer nkey = NULL; - int *p = NULL; ! /* first remove, in case one has been set before */ ! if (g_hash_table_lookup_extended(config->defaultDT, ! form->attrname, ! &okey, &val)) { ! g_hash_table_remove(config->defaultDT, form->attrname); ! } else { ! okey = val = NULL; } ! dt = get_dt_from_handler(form->dt_handler); ! if (dt != -1) { ! p = (int *) g_malloc(sizeof(int)); ! *p = dt; ! g_hash_table_insert(config->defaultDT, ! nkey = g_strdup(form->attrname), ! p); } if (save_config(GTK_WIDGET(menuitem))) { ! g_free_if(okey); ! g_free_if(val); } else { ! /* save failed, undo changes */ ! g_hash_table_remove(config->defaultDT, form->attrname); ! g_free_if(nkey); ! g_free_if(p); ! g_hash_table_insert(config->defaultDT, ! okey, val); } } static gboolean widget_button_press(GtkWidget *widget, GdkEventButton *event, ! struct formfill *form) { if (event->type == GDK_BUTTON_PRESS && event->button == 3) { --- 625,785 ---- struct formfill *form) { gpointer nkey = NULL; ! struct attr_settings *as = lookup_attr_settings(form->attrname); ! int old_ddt = -1; ! int is_new = 0; ! ! if (!as) { ! char *t; ! as = new_attr_settings(); ! as->name = g_strdup(form->attrname); ! for (t = as->name ; *t ; t++) *t = tolower(*t); ! is_new = 1; ! ! g_hash_table_insert(config->attrs, ! nkey = g_strdup(as->name), ! as); } ! old_ddt = as->defaultDT; ! as->defaultDT = get_dt_from_handler(form->dt_handler); ! ! if (!save_config(GTK_WIDGET(menuitem))) { ! /* save failed, undo changes */ ! if (is_new) { ! g_hash_table_remove(config->attrs, nkey); ! free_attr_settings(as); ! g_free(nkey); ! } else { ! as->defaultDT = old_ddt; ! } ! } ! } ! ! /* quick and dirty callback data */ ! struct iform_form { ! struct inputform *iform; ! struct formfill *form; ! }; ! ! static struct iform_form *new_iform_form() { ! struct iform_form *i = g_malloc0(sizeof(struct iform_form)); ! return i; ! } ! ! static void free_iform_form(struct iform_form *iff) { ! g_free_if(iff); ! } ! ! static void remove_user_friendly_for_attr(GtkMenuItem *menuitem, ! struct iform_form *iff) ! { ! gpointer okey; ! gpointer val; ! struct attr_settings *as = lookup_attr_settings(iff->form->attrname); ! char *old_uf = NULL; ! int do_free = 0; ! ! if (!as) return; ! ! old_uf = as->user_friendly; ! as->user_friendly = NULL; ! ! if (is_default_attr_settings(as)) { ! do_free = 1; ! } ! ! if (do_free) { ! if (g_hash_table_lookup_extended(config->attrs, ! as->name, ! &okey, &val)) { ! g_hash_table_remove(config->attrs, okey); ! } } if (save_config(GTK_WIDGET(menuitem))) { ! if (do_free) { ! g_free_if(okey); ! g_free_if(old_uf); ! if (val) free_attr_settings(val); ! } ! refresh_inputform(iff->iform); } else { ! as->user_friendly = old_uf; ! ! if (do_free) { ! /* save failed, undo changes - re-insert into hash */ ! g_hash_table_insert(config->attrs, ! okey, val); ! } ! } ! } ! ! static void make_user_friendly_for_attr(GtkMenuItem *menuitem, ! struct iform_form *iff) ! { ! gchar *ret = NULL; ! struct attr_settings *as = lookup_attr_settings(iff->form->attrname); ! GString *msg = g_string_sized_new(150); ! ! if (as) ret = as->user_friendly; ! ! g_string_printf(msg, _("User friendly name for LDAP attribute '%s'"), ! iff->form->attrname); ! ! ! if (query_popup(msg->str, &ret, FALSE, GTK_WIDGET(menuitem))) { ! gpointer nkey = NULL; ! char *old_uf = NULL; ! int is_new = 0; ! ! if (!as) { ! char *t; ! ! is_new = 1; ! ! as = new_attr_settings(); ! as->name = g_strdup(iff->form->attrname); ! for (t = as->name ; *t ; t++) *t = tolower(*t); ! ! g_hash_table_insert(config->attrs, ! nkey = g_strdup(as->name), ! as); ! } ! ! old_uf = as->user_friendly; ! if ((ret && strlen(ret) == 0) || ! (strcmp(ret, iff->form->attrname) == 0)) { ! g_free(ret); ! ret = NULL; ! } ! ! as->user_friendly = ret; ! ! if (!save_config(GTK_WIDGET(menuitem))) { ! /* save failed, undo changes */ ! if (is_new) { ! g_hash_table_remove(config->attrs, nkey); ! free_attr_settings(as); ! g_free(nkey); ! } else { ! as->user_friendly = old_uf; ! } ! } else { ! g_free_if(old_uf); ! ret = NULL; ! refresh_inputform(iff->iform); ! } } + g_free_if(ret); + g_string_free(msg, TRUE); } + static gboolean widget_button_press(GtkWidget *widget, GdkEventButton *event, ! struct iform_form *iff) { if (event->type == GDK_BUTTON_PRESS && event->button == 3) { *************** *** 652,655 **** --- 788,792 ---- GList *dt_list; char buf[40]; + struct attr_settings *as; root_menu = gtk_menu_item_new_with_label("Root"); *************** *** 658,662 **** gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu); ! snprintf(buf, sizeof(buf), _("Attribute %s"), form->attrname); label = gtk_menu_item_new_with_label(buf); --- 795,799 ---- gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu); ! snprintf(buf, sizeof(buf), _("Attribute %s"), iff->form->attrname); label = gtk_menu_item_new_with_label(buf); *************** *** 682,686 **** gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(schema_show_attr), ! (gpointer) form); gtk_widget_show(menu_item); --- 819,823 ---- gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(schema_show_attr), ! (gpointer) iff->form); gtk_widget_show(menu_item); *************** *** 712,716 **** menu_item = gtk_menu_item_new_with_label(h->name); ! gtk_object_set_data(GTK_OBJECT(menu_item), "formfill", form); /* gtk_object_set_data(GTK_OBJECT(menu_item), "entry", entry); */ gtk_menu_append(GTK_MENU(submenu), menu_item); --- 849,854 ---- menu_item = gtk_menu_item_new_with_label(h->name); ! gtk_object_set_data(GTK_OBJECT(menu_item), "formfill", ! iff->form); /* gtk_object_set_data(GTK_OBJECT(menu_item), "entry", entry); */ gtk_menu_append(GTK_MENU(submenu), menu_item); *************** *** 724,727 **** --- 862,867 ---- + as = lookup_attr_settings(iff->form->attrname); + menu_item = gtk_menu_item_new_with_label(_("Make current display type the default for this attribute")); /* gtk_object_set_data(GTK_OBJECT(menu_item), "formfill", form); */ *************** *** 729,733 **** gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(make_dt_default_for_attr), ! (gpointer) form); gtk_widget_show(menu_item); --- 869,873 ---- gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(make_dt_default_for_attr), ! (gpointer) iff->form); gtk_widget_show(menu_item); *************** *** 737,746 **** gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(remove_dt_default_for_attr), ! (gpointer) form); gtk_widget_show(menu_item); gtk_widget_set_sensitive(menu_item, ! g_hash_table_lookup(config->defaultDT, ! form->attrname) != NULL); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, --- 877,909 ---- gtk_signal_connect(GTK_OBJECT(menu_item), "activate", GTK_SIGNAL_FUNC(remove_dt_default_for_attr), ! (gpointer) iff->form); gtk_widget_show(menu_item); gtk_widget_set_sensitive(menu_item, ! as != NULL && as->defaultDT != -1); ! ! #if GTK_MAJOR >= 2 ! menu_item = gtk_separator_menu_item_new(); ! gtk_menu_append(GTK_MENU(menu), menu_item); ! gtk_widget_show(menu_item); ! #endif ! ! menu_item = gtk_menu_item_new_with_label(_("Set user-friendly name")); ! gtk_menu_append(GTK_MENU(menu), menu_item); ! ! gtk_signal_connect(GTK_OBJECT(menu_item), "activate", ! GTK_SIGNAL_FUNC(make_user_friendly_for_attr), ! (gpointer) iff); ! gtk_widget_show(menu_item); ! ! menu_item = gtk_menu_item_new_with_label(_("Clear user-friendly name")); ! gtk_menu_append(GTK_MENU(menu), menu_item); ! gtk_signal_connect(GTK_OBJECT(menu_item), "activate", ! GTK_SIGNAL_FUNC(remove_user_friendly_for_attr), ! (gpointer) iff); ! gtk_widget_show(menu_item); ! ! gtk_widget_set_sensitive(menu_item, ! as != NULL && as->user_friendly); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, *************** *** 867,871 **** /* attribute name */ ! ff->label = gtk_label_new(ff->attrname); gtk_misc_set_alignment(GTK_MISC(ff->label), LABEL_JUSTIFICATION, .5); --- 1030,1034 ---- /* attribute name */ ! ff->label = gtk_label_new(human_readable_attrname(ff->attrname)); gtk_misc_set_alignment(GTK_MISC(ff->label), LABEL_JUSTIFICATION, .5); *************** *** 876,885 **** if (ff->dt_handler && ff->dt_handler->selectable) { gtk_signal_connect(GTK_OBJECT(ff->event_box), "button_press_event", GTK_SIGNAL_FUNC(widget_button_press), ! ff); ! gtk_object_set_data(GTK_OBJECT(ff->event_box), ! "row", GINT_TO_POINTER(row)); } --- 1039,1053 ---- if (ff->dt_handler && ff->dt_handler->selectable) { + struct iform_form *iff = new_iform_form(); + iff->iform = iform; + iff->form = ff; + gtk_signal_connect(GTK_OBJECT(ff->event_box), "button_press_event", GTK_SIGNAL_FUNC(widget_button_press), ! iff); ! gtk_object_set_data_full(GTK_OBJECT(ff->event_box), ! "cb-data", iff, ! (GtkDestroyNotify)free_iform_form); } *************** *** 2433,2438 **** done: - error_flush(error_context); - return comm.rc; } --- 2601,2604 ---- *************** *** 2440,2444 **** /* Checks if the objectClass attribute contains "extensibleObject" */ ! int is_extensible_object(struct inputform *iform) { GList *f, *wl; --- 2606,2610 ---- /* Checks if the objectClass attribute contains "extensibleObject" */ ! static int is_extensible_object(struct inputform *iform) { GList *f, *wl; Index: mainwin.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/mainwin.c,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** mainwin.c 2 Nov 2003 17:23:49 -0000 1.53 --- mainwin.c 2 Nov 2003 17:41:05 -0000 1.54 *************** *** 492,495 **** --- 492,534 ---- } + + void mainwin_update_filter_menu(struct mainwin_data *win) + { + GList *menuitems = gtk_container_children(GTK_CONTAINER(win->filtermenu)); + GList *I; + + /* Filters | list of filters */ + + if (menuitems) { + for ( I = g_list_first(menuitems) ; I ; I = g_list_next(I) ) { + GtkWidget *item = GTK_WIDGET(I->data); + gpointer data = gtk_object_get_data(GTK_OBJECT(item), "filter"); + + if (data) { + gtk_widget_destroy(item); + } + } + + g_list_free(menuitems); + } + + for ( I = g_list_first(config->filters) ; I ; I = g_list_next(I) ) { + struct gq_filter *filter; + GtkWidget *menuitem; + + filter = (struct gq_filter *) I->data; + menuitem = gtk_menu_item_new_with_label(filter->name); + + gtk_object_set_data(GTK_OBJECT(menuitem), "filter", filter); + gtk_signal_connect_object(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(filter_selected), + (GtkObject *) filter); + + gtk_container_add(GTK_CONTAINER(win->filtermenu), menuitem); + gtk_widget_show(menuitem); + } + } + + void create_mainwin(struct mainwin_data *win) { *************** *** 501,506 **** GtkWidget *handlebox; GtkAccelGroup *accel_group; - GList *filterlist; - struct gq_filter *filter; assert(win != NULL); --- 540,543 ---- *************** *** 647,651 **** menuFilters = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(Filters), menuFilters); ! mainwin.filtermenu = menuFilters; /* Filters | New */ --- 684,688 ---- menuFilters = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(Filters), menuFilters); ! win->filtermenu = menuFilters; /* Filters | New */ *************** *** 685,702 **** gtk_container_add(GTK_CONTAINER(menuFilters), menuitem); ! /* Filters | list of filters */ ! filterlist = config->filters; ! while(filterlist) { ! filter = (struct gq_filter *) filterlist->data; ! menuitem = gtk_menu_item_new_with_label(filter->name); ! gtk_object_set_data(GTK_OBJECT(menuitem), "filter", filter); ! gtk_signal_connect_object(GTK_OBJECT(menuitem), "activate", ! GTK_SIGNAL_FUNC(filter_selected), (GtkObject *) filter); ! gtk_container_add(GTK_CONTAINER(menuFilters), menuitem); ! gtk_widget_show(menuitem); ! ! filterlist = filterlist->next; ! } ! /* Help menu */ --- 722,726 ---- gtk_container_add(GTK_CONTAINER(menuFilters), menuitem); ! mainwin_update_filter_menu(win); /* Help menu */ Index: mainwin.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/mainwin.h,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** mainwin.h 2 Nov 2003 07:20:44 -0000 1.23 --- mainwin.h 2 Nov 2003 17:41:05 -0000 1.24 *************** *** 90,93 **** --- 90,95 ---- void cleanup(struct mainwin_data *win); void create_mainwin(struct mainwin_data *); + void mainwin_update_filter_menu(struct mainwin_data *win); + struct tab *new_modetab(struct mainwin_data *, int mode); void cleanup_all_tabs(struct mainwin_data *win); Index: util.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/util.c,v retrieving revision 1.85 retrieving revision 1.86 diff -C2 -d -r1.85 -r1.86 *** util.c 2 Nov 2003 07:20:44 -0000 1.85 --- util.c 2 Nov 2003 17:41:05 -0000 1.86 *************** *** 497,501 **** /* server->bindpw[0] == 0 && */ server->enteredpw[0] == 0) { ! char *ret; message = g_string_sized_new(128); g_string_sprintf(message, --- 497,501 ---- /* server->bindpw[0] == 0 && */ server->enteredpw[0] == 0) { ! char *ret = NULL; message = g_string_sized_new(128); g_string_sprintf(message, *************** *** 506,510 **** } ! if (query_popup(message->str, &ret, TRUE /* is_password */)) { g_string_free(message, TRUE); if (ret) { --- 506,511 ---- } ! if (query_popup(message->str, &ret, TRUE /* is_password */, ! NULL)) { /* FIXME: somehow get modal_for widget */ g_string_free(message, TRUE); if (ret) { *************** *** 1533,1539 **** /* pops up a dialog to retrieve user data via a GtkEntry. This ! functions waits for the data and puts it into outbuf. */ ! int query_popup(const char *title, gchar **outbuf, gboolean is_password) { GtkWidget *window, *vbox1, *vbox2, *label, *inputbox, *button, *hbox0; --- 1534,1547 ---- /* pops up a dialog to retrieve user data via a GtkEntry. This ! functions waits for the data and puts it into outbuf. ! inout_buf afterward points to allocate memory that has to be free'd ! using g_free. As an input parameter it points to the current value ! of the information to be entered (if not NULL). The passed-in ! information will not be changed. ! */ ! ! int query_popup(const char *title, gchar **inout_buf, gboolean is_password, ! GtkWidget *modal_for) { GtkWidget *window, *vbox1, *vbox2, *label, *inputbox, *button, *hbox0; *************** *** 1553,1556 **** --- 1561,1568 ---- } + if (modal_for) { + modal_for = gtk_widget_get_toplevel(modal_for); + } + window = gtk_dialog_new(); gtk_container_border_width(GTK_CONTAINER(window), CONTAINER_BORDER_WIDTH); *************** *** 1564,1567 **** --- 1576,1585 ---- (gpointer) window); + if (modal_for) { + gtk_window_set_modal(GTK_WINDOW(window), TRUE); + gtk_window_set_transient_for(GTK_WINDOW(window), + GTK_WINDOW(modal_for)); + } + vbox1 = GTK_DIALOG(window)->vbox; gtk_widget_show(vbox1); *************** *** 1579,1582 **** --- 1597,1607 ---- gtk_entry_set_visibility(GTK_ENTRY(inputbox), FALSE); } + + if (inout_buf && *inout_buf) { + int pos = 0; + gtk_editable_insert_text(GTK_EDITABLE(inputbox), + *inout_buf, strlen(*inout_buf), &pos); + } + gtk_widget_show(inputbox); gtk_signal_connect(GTK_OBJECT(inputbox), "activate", *************** *** 1631,1637 **** if (! comm->destroyed && comm->rc) { ! *outbuf = gtk_editable_get_chars(GTK_EDITABLE(inputbox), 0, -1); } else { ! *outbuf = NULL; } --- 1656,1662 ---- if (! comm->destroyed && comm->rc) { ! *inout_buf = gtk_editable_get_chars(GTK_EDITABLE(inputbox), 0, -1); } else { ! *inout_buf = NULL; } Index: util.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/util.h,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** util.h 2 Nov 2003 07:20:44 -0000 1.28 --- util.h 2 Nov 2003 17:41:05 -0000 1.29 *************** *** 113,117 **** const char *find_s_by_at_oid(int error_context, struct ldapserver *server, const char *oid); ! int query_popup(const char *title, gchar **outbuf, gboolean is_password); int question_popup(const char *title, const char *question); --- 113,118 ---- const char *find_s_by_at_oid(int error_context, struct ldapserver *server, const char *oid); ! int query_popup(const char *title, gchar **outbuf, gboolean is_password, ! GtkWidget *modal_for); int question_popup(const char *title, const char *question); |