Image reading, template handling, and printing bug fixes.

CHANGES:
    - Add fl_read_image() note and move documentation STRs back
      to the top of the list...

fluid/fluid.cxx:
    - Use printer choice data instead of the label text, since
      we have to escape / in printer names.
    - Change page number in header to n/N.

fluid/print_panel.*:
    - Don't disable properties button, ever.
    - Quote / in printer names.
    - Put copy of real printer name in the user data.
    - Use user data instead of label text for printer name.

fluid/template_panel.*:
    - Only free the files array if num_files > 0.

src/fl_read_image.cxx:
    - Use fl_visual->visual->*_mask instead of fl_*mask and
      fl_*shift when the XGetImage() data does not have them
      set.



git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4157 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Michael R Sweet 2005-03-21 17:34:03 +00:00
parent 562198fa31
commit 880928146d
7 changed files with 83 additions and 50 deletions

View File

@ -1,10 +1,13 @@
CHANGES IN FLTK 1.1.7
- Fixed Quickdraw drawing of 3 and 4 sided polygons (STR #765)
- Fixed fl_message code so that it does not get accidentaly
addded to the current group (STR #253)
- Documentation fixes (STR #648, STR #692, STR #730, STR
#744, STR #745)
- fl_read_image() didn't use the right red, green, and
blue masks on XFree86.
- Fixed Quickdraw drawing of 3 and 4 sided polygons (STR
#765)
- Fixed fl_message code so that it does not get
accidentaly addded to the current group (STR #253)
- FLUID now highlights code in the widget callback and
code editors.
- FLUID now supports printing of windows.

View File

@ -922,9 +922,10 @@ void print_cb(Fl_Return_Button *, void *) {
// Open the print stream...
if (print_choice->value()) {
// Pipe the output into the lp command...
const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data();
snprintf(command, sizeof(command), "lp -s -d %s -n %d -t '%s' -o media=%s",
print_choice->text(print_choice->value()),
print_collate_button->value() ? 1 : print_copies->value(),
printer, print_collate_button->value() ? 1 : print_copies->value(),
basename, print_page_size->text(print_page_size->value()));
outfile = popen(command, "w");
} else {
@ -934,6 +935,7 @@ void print_cb(Fl_Return_Button *, void *) {
fl_ok = "OK";
if (outname) outfile = fopen(outname, "w");
else outfile = NULL;
}
if (outfile) {
@ -1038,10 +1040,10 @@ void print_cb(Fl_Return_Button *, void *) {
"/Helvetica findfont 14 scalefont setfont\n"
"%d %d moveto (%s) show\n"
"%.1f %d moveto (%s) dup stringwidth pop -0.5 mul 0 rmoveto show\n"
"%d %d moveto (%d) dup stringwidth pop neg 0 rmoveto show\n",
"%d %d moveto (%d/%d) dup stringwidth pop neg 0 rmoveto show\n",
left, top - 15, basename,
0.5 * (left + right), top - 15, date,
right, top - 15, winpage + 1);
right, top - 15, winpage + 1, num_windows);
// Get window image...
uchar *pixels; // Window image data

View File

@ -222,11 +222,12 @@ static void cb_Save(Fl_Return_Button*, void*) {
char name[1024];
int val;
const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data();
snprintf(name, sizeof(name), "%s/page_size", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/page_size", printer);
fluid_prefs.set(name, print_page_size->value());
snprintf(name, sizeof(name), "%s/output_mode", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/output_mode", printer);
for (val = 0; val < 4; val ++) {
if (print_output_mode[val]->value()) break;
}
@ -505,22 +506,31 @@ void print_cb(Fl_Return_Button *, void *);
void print_load() {
FILE *lpstat;
char line[1024], name[1024], defname[1024];
char line[1024], name[1024], *nptr, qname[2048], *qptr, defname[1024];
int i;
if (print_choice->size() > 1) {
for (i = 1; print_choice->text(i); i ++) {
free(print_choice->menu()[i].user_data());
}
}
print_choice->clear();
print_choice->add("Print To File", 0, 0, 0, FL_MENU_DIVIDER);
print_choice->value(0);
print_properties->deactivate();
defname[0] = '\0';
if ((lpstat = popen("lpstat -p -d", "r")) != NULL) {
while (fgets(line, sizeof(line), lpstat)) {
if (!strncmp(line, "printer ", 8) &&
sscanf(line + 8, "%s", name) == 1) {
print_choice->add(name, 0, 0, (void *)name, 0);
for (nptr = name, qptr = qname; *nptr; *qptr++ = *nptr++) {
if (*nptr == '/') *qptr++ = '\\';
}
*qptr = '\0';
print_choice->add(qname, 0, 0, (void *)strdup(name), 0);
} else if (!strncmp(line, "system default destination: ", 28)) {
if (sscanf(line + 28, "%s", defname) != 1) defname[0] = '\0';
}
@ -530,16 +540,12 @@ if ((lpstat = popen("lpstat -p -d", "r")) != NULL) {
if (defname[0]) {
for (i = 1; print_choice->text(i); i ++) {
if (!strcmp(print_choice->text(i), defname)) {
if (!strcmp((char *)print_choice->menu()[i].user_data(), defname)) {
print_choice->value(i);
print_properties->activate();
break;
}
}
} else if (print_choice->size() > 2) {
print_choice->value(1);
print_properties->activate();
}
} else if (print_choice->size() > 2) print_choice->value(1);
print_update_status();
@ -549,10 +555,10 @@ void print_update_status() {
FILE *lpstat;
char command[1024];
static char status[1024];
const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data();
if (print_choice->value()) {
snprintf(command, sizeof(command), "lpstat -p '%s'",
print_choice->text(print_choice->value()));
snprintf(command, sizeof(command), "lpstat -p '%s'", printer);
if ((lpstat = popen(command, "r")) != NULL) {
fgets(status, sizeof(status), lpstat);
pclose(lpstat);
@ -564,11 +570,11 @@ print_status->label(status);
char name[1024];
int val;
snprintf(name, sizeof(name), "%s/page_size", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/page_size", printer);
fluid_prefs.get(name, val, 0);
print_page_size->value(val);
snprintf(name, sizeof(name), "%s/output_mode", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/output_mode", printer);
fluid_prefs.get(name, val, 0);
print_output_mode[val]->setonly();
}

View File

@ -52,7 +52,7 @@ Function {make_print_panel()} {open
} {
Fl_Choice print_choice {
label {Printer:}
callback {print_update_status();} open selected
callback {print_update_status();} open
xywh {113 10 181 25} down_box BORDER_BOX labelfont 1 when 1
} {}
Fl_Button print_properties {
@ -235,7 +235,7 @@ print_update_status();} open
}
}
Fl_Group {} {
label {Output Mode:} open
label {Output Mode:}
xywh {110 45 170 40} labelfont 1 align 4
} {
Fl_Button {print_output_mode[0]} {
@ -257,11 +257,12 @@ print_update_status();} open
char name[1024];
int val;
const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data();
snprintf(name, sizeof(name), "%s/page_size", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/page_size", printer);
fluid_prefs.set(name, print_page_size->value());
snprintf(name, sizeof(name), "%s/output_mode", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/output_mode", printer);
for (val = 0; val < 4; val ++) {
if (print_output_mode[val]->value()) break;
}
@ -280,25 +281,34 @@ print_update_status();}
decl {void print_cb(Fl_Return_Button *, void *);} {public
}
Function {print_load()} {return_type void
Function {print_load()} {open return_type void
} {
code {FILE *lpstat;
char line[1024], name[1024], defname[1024];
char line[1024], name[1024], *nptr, qname[2048], *qptr, defname[1024];
int i;
if (print_choice->size() > 1) {
for (i = 1; print_choice->text(i); i ++) {
free(print_choice->menu()[i].user_data());
}
}
print_choice->clear();
print_choice->add("Print To File", 0, 0, 0, FL_MENU_DIVIDER);
print_choice->value(0);
print_properties->deactivate();
defname[0] = '\\0';
if ((lpstat = popen("lpstat -p -d", "r")) != NULL) {
while (fgets(line, sizeof(line), lpstat)) {
if (!strncmp(line, "printer ", 8) &&
sscanf(line + 8, "%s", name) == 1) {
print_choice->add(name, 0, 0, (void *)name, 0);
for (nptr = name, qptr = qname; *nptr; *qptr++ = *nptr++) {
if (*nptr == '/') *qptr++ = '\\\\';
}
*qptr = '\\0';
print_choice->add(qname, 0, 0, (void *)strdup(name), 0);
} else if (!strncmp(line, "system default destination: ", 28)) {
if (sscanf(line + 28, "%s", defname) != 1) defname[0] = '\\0';
}
@ -308,16 +318,12 @@ if ((lpstat = popen("lpstat -p -d", "r")) != NULL) {
if (defname[0]) {
for (i = 1; print_choice->text(i); i ++) {
if (!strcmp(print_choice->text(i), defname)) {
if (!strcmp((char *)print_choice->menu()[i].user_data(), defname)) {
print_choice->value(i);
print_properties->activate();
break;
}
}
} else if (print_choice->size() > 2) {
print_choice->value(1);
print_properties->activate();
}
} else if (print_choice->size() > 2) print_choice->value(1);
print_update_status();} {}
@ -328,10 +334,10 @@ Function {print_update_status()} {open return_type void
code {FILE *lpstat;
char command[1024];
static char status[1024];
const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data();
if (print_choice->value()) {
snprintf(command, sizeof(command), "lpstat -p '%s'",
print_choice->text(print_choice->value()));
snprintf(command, sizeof(command), "lpstat -p '%s'", printer);
if ((lpstat = popen(command, "r")) != NULL) {
fgets(status, sizeof(status), lpstat);
pclose(lpstat);
@ -343,13 +349,14 @@ print_status->label(status);
char name[1024];
int val;
snprintf(name, sizeof(name), "%s/page_size", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/page_size", printer);
fluid_prefs.get(name, val, 0);
print_page_size->value(val);
snprintf(name, sizeof(name), "%s/output_mode", print_choice->text(print_choice->value()));
snprintf(name, sizeof(name), "%s/output_mode", printer);
fluid_prefs.get(name, val, 0);
print_output_mode[val]->setonly();} {}
print_output_mode[val]->setonly();} {selected
}
}
comment {

View File

@ -257,7 +257,7 @@ for (i = 0; i < num_files; i ++) {
free(files[i]);
}
if (files) free(files);
if (num_files > 0) free(files);
}
//

View File

@ -67,7 +67,7 @@ template_preview->image(0);
template_browser->deselect();
template_name->value("");
template_instance->value("");
template_panel->hide();} open selected
template_panel->hide();} open
xywh {340 237 460 355} type Double resizable modal visible
} {
Fl_Browser template_browser {
@ -208,7 +208,7 @@ template_browser->remove(item);
template_browser->do_callback();} {}
}
Function {template_load()} {return_type void
Function {template_load()} {open return_type void
} {
code {int i;
char name[1024], filename[1024], path[1024], *ptr;
@ -239,7 +239,8 @@ for (i = 0; i < num_files; i ++) {
free(files[i]);
}
if (files) free(files);} {}
if (num_files > 0) free(files);} {selected
}
}
comment {

View File

@ -111,6 +111,7 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
printf("red_mask = %08x\n", image->red_mask);
printf("green_mask = %08x\n", image->green_mask);
printf("blue_mask = %08x\n", image->blue_mask);
printf("map_entries = %d\n", fl_visual->visual->map_entries);
#endif // DEBUG
d = alpha ? 4 : 3;
@ -124,9 +125,22 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
// Check that we have valid mask/shift values...
if (!image->red_mask && image->bits_per_pixel > 12) {
// Greater than 12 bits must be TrueColor...
image->red_mask = fl_redmask << fl_redshift;
image->green_mask = fl_greenmask << fl_greenshift;
image->blue_mask = fl_bluemask << fl_blueshift;
image->red_mask = fl_visual->visual->red_mask;
image->green_mask = fl_visual->visual->green_mask;
image->blue_mask = fl_visual->visual->blue_mask;
#ifdef DEBUG
puts("\n---- UPDATED ----");
printf("fl_redmask = %08x\n", fl_redmask);
printf("fl_redshift = %d\n", fl_redshift);
printf("fl_greenmask = %08x\n", fl_greenmask);
printf("fl_greenshift = %d\n", fl_greenshift);
printf("fl_bluemask = %08x\n", fl_bluemask);
printf("fl_blueshift = %d\n", fl_blueshift);
printf("red_mask = %08x\n", image->red_mask);
printf("green_mask = %08x\n", image->green_mask);
printf("blue_mask = %08x\n", image->blue_mask);
#endif // DEBUG
}
// Check if we have colormap image...