diff --git a/ChangeLog b/ChangeLog index a516c22c5..65d98ed7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,41 @@ +2008-01-03 David A. Capello + + * src/jinete/jmenu.c (menubox_msg_proc): Finally works (with keys + and without JM_IDLE message). + +2008-01-02 David A. Capello + + * src/jinete/jmenu.c: In all these day I was working to make it + working without JM_IDLE. The keyboard is the only thing that + doesn't work right now. + + * src/widgets/preview.c: Doesn't use JM_IDLE message anymore. + + * src/widgets/statebar.c: Doesn't use JM_IDLE message anymore. + +2007-12-26 David A. Capello + + * src/jinete/jmanager.c: Added 'enqueue_messages_before_this'. + + * src/widgets/tabs.c (tabs_msg_proc): Fixed a problem that allow + to the user select to no-tabs at all. + + * src/jinete/jmanager.c (jmanager_poll): Double-click now is + controlled through the 'ji_clock'. + (jmanager_add_msg_filter): Added routines to control filters for + the messages. + + * src/jinete/jsystem.c: Removed all the stuff about double-click + in this file. + +2007-12-19 David A. Capello + + * src/jinete/jentry.c, src/widgets/tabs.c: Modified to use timers. + + * src/jinete/jmanager.c (jmanager_add_timer): Added timers and + JM_TIMER (needed to finally remove the JM_IDLE message in the + future). + 2007-12-16 David A. Capello * src/commands/cmd_screen_shot.c (cmd_screen_shot_execute): Now diff --git a/config.h b/config.h index 7c8ddca81..beeb6c5a7 100644 --- a/config.h +++ b/config.h @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, + * 2007, 2008 David A. Capello * * 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 @@ -27,7 +28,7 @@ #define VERSION "0.6" #define WEBSITE "http://www.aseprite.org/" #define BUGREPORT "ase-help@lists.sourceforge.net" -#define COPYRIGHT "Copyright (C) 2001-2005, 2007 David A. Capello" +#define COPYRIGHT "Copyright (C) 2001-2008 David A. Capello" #define PRINTF verbose_printf diff --git a/data/gui-en.xml b/data/gui-en.xml index e687065a2..7bf8d43d2 100644 --- a/data/gui-en.xml +++ b/data/gui-en.xml @@ -1,4 +1,4 @@ - + @@ -43,6 +43,11 @@ + + + + + @@ -153,6 +158,14 @@ + + + + + + + + diff --git a/src/commands/cmd_screen_shot.c b/src/commands/cmd_screen_shot.c index 3446c5c61..85f8c8579 100644 --- a/src/commands/cmd_screen_shot.c +++ b/src/commands/cmd_screen_shot.c @@ -34,7 +34,7 @@ static void cmd_screen_shot_execute(const char *argument) { - int old_flag; + int c, old_flag; char buf[512]; PALETTE pal; BITMAP *bmp; diff --git a/src/commands/cmd_select_file.c b/src/commands/cmd_select_file.c index b94c9c278..a36bab2cf 100644 --- a/src/commands/cmd_select_file.c +++ b/src/commands/cmd_select_file.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -20,6 +21,7 @@ #ifndef USE_PRECOMPILED_HEADER +#include #include #include @@ -63,7 +65,7 @@ static void cmd_select_file_execute(const char *argument) if (argument) { int sprite_id = ustrtol(argument, NULL, 10); GfxObj *gfxobj = gfxobj_find(sprite_id); - ASSERT(gfxobj != NULL); + assert(gfxobj != NULL); sprite_show((Sprite *)gfxobj); } diff --git a/src/console/console.c b/src/console/console.c index 75191a698..9f76e44b2 100644 --- a/src/console/console.c +++ b/src/console/console.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -48,37 +49,37 @@ void console_open(void) /* TODO verify if the ji_screen works */ /* if (!screen || */ if (!ji_screen || - !is_interactive () || + !is_interactive() || wid_console || console_counter > 1) return; else { JWidget window, box1, view, textbox, button; - window = jwindow_new (_("Processing...")); + window = jwindow_new(_("Processing...")); if (!window) return; - box1 = jbox_new (JI_VERTICAL); - view = jview_new (); - textbox = jtextbox_new (NULL, JI_WORDWRAP); - button = jbutton_new (_("&Cancel")); + box1 = jbox_new(JI_VERTICAL); + view = jview_new(); + textbox = jtextbox_new(NULL, JI_WORDWRAP); + button = jbutton_new(_("&Cancel")); if (!box1 || !textbox || !button) return; - jview_attach (view, textbox); + jview_attach(view, textbox); - jwidget_add_child (box1, view); - jwidget_add_child (box1, button); - jwidget_add_child (window, box1); + jwidget_add_child(box1, view); + jwidget_add_child(box1, button); + jwidget_add_child(window, box1); - jwidget_hide (view); - jwidget_magnetic (button, TRUE); - jwidget_expansive (view, TRUE); + jwidget_hide(view); + jwidget_magnetic(button, TRUE); + jwidget_expansive(view, TRUE); /* force foreground mode */ -/* ji_find_widget (window)->in_foreground = TRUE; */ +/* ji_find_widget(window)->in_foreground = TRUE; */ wid_console = window; wid_view = view; @@ -89,17 +90,19 @@ void console_open(void) } } -void console_close (void) +void console_close(void) { console_counter--; if ((wid_console) && (console_counter == 0)) { - if (console_locked && - !want_close_flag && - jwidget_is_visible (wid_console)) - jwindow_open_fg (wid_console); + if (console_locked + && !want_close_flag + && jwidget_is_visible(wid_console)) { + /* open in foreground */ + jwindow_open_fg(wid_console); + } - jwidget_free (wid_console); + jwidget_free(wid_console); wid_console = NULL; want_close_flag = FALSE; } @@ -110,18 +113,18 @@ void console_printf(const char *format, ...) char buf[1024]; va_list ap; - va_start (ap, format); - uvsprintf (buf, format, ap); - va_end (ap); + va_start(ap, format); + uvsprintf(buf, format, ap); + va_end(ap); if (wid_console) { const char *text; char *final; /* open the window */ - if (jwidget_is_hidden (wid_console)) { - jwindow_open (wid_console); - jmanager_refresh_screen (); + if (jwidget_is_hidden(wid_console)) { + jwindow_open(wid_console); + jmanager_refresh_screen(); } /* update the textbox */ @@ -136,37 +139,37 @@ void console_printf(const char *format, ...) jwidget_dirty(wid_console); } - text = jwidget_get_text (wid_textbox); + text = jwidget_get_text(wid_textbox); if (!text) - final = jstrdup (buf); + final = jstrdup(buf); else { - final = jmalloc (ustrlen (text) + ustrlen (buf) + 1); + final = jmalloc(ustrlen(text) + ustrlen(buf) + 1); - ustrcpy (final, empty_string); - ustrcat (final, text); - ustrcat (final, buf); + ustrcpy(final, empty_string); + ustrcat(final, text); + ustrcat(final, buf); } - jwidget_set_text (wid_textbox, final); - jfree (final); + jwidget_set_text(wid_textbox, final); + jfree(final); } else - printf (buf); + printf(buf); } -void user_printf (const char *format, ...) +void user_printf(const char *format, ...) { char buf[1024]; va_list ap; - va_start (ap, format); - uvsprintf (buf, format, ap); - va_end (ap); + va_start(ap, format); + uvsprintf(buf, format, ap); + va_end(ap); -/* if (script_is_running ()) */ -/* plugin_printf (buf); */ +/* if (script_is_running()) */ +/* plugin_printf(buf); */ /* else */ - allegro_message (buf); + allegro_message(buf); } void do_progress(int progress) diff --git a/src/core/app.c b/src/core/app.c index 58f74aabc..67f2e83d0 100644 --- a/src/core/app.c +++ b/src/core/app.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 diff --git a/src/effect/effect.c b/src/effect/effect.c index b7eaf020b..7f3c04aa5 100644 --- a/src/effect/effect.c +++ b/src/effect/effect.c @@ -266,26 +266,26 @@ bool effect_apply_step(Effect *effect) } } -void effect_apply (Effect *effect) +void effect_apply(Effect *effect) { - add_progress (effect->h); + add_progress(effect->h); - effect_begin (effect); - while (effect_apply_step (effect)) - do_progress (effect->row); + effect_begin(effect); + while (effect_apply_step(effect)) + do_progress(effect->row); /* undo stuff */ - if (undo_is_enabled (effect->sprite->undo)) - undo_image (effect->sprite->undo, effect->src, - effect->x, effect->y, effect->w, effect->h); + if (undo_is_enabled(effect->sprite->undo)) + undo_image(effect->sprite->undo, effect->src, + effect->x, effect->y, effect->w, effect->h); /* copy "dst" to "src" */ - image_copy (effect->src, effect->dst, 0, 0); + image_copy(effect->src, effect->dst, 0, 0); - del_progress (); + del_progress(); } -void effect_flush (Effect *effect) +void effect_flush(Effect *effect) { if (effect->row >= 0) { JRegion reg1, reg2; @@ -299,8 +299,8 @@ void effect_flush (Effect *effect) effect->x+effect->offset_x, effect->y+effect->offset_y+effect->row-1, &rect.x1, &rect.y1); - rect.x2 = rect.x1 + (effect->w << editor_data (editor)->zoom); - rect.y2 = rect.y1 + (1 << editor_data (editor)->zoom); + rect.x2 = rect.x1 + (effect->w << editor_data(editor)->zoom); + rect.y2 = rect.y1 + (1 << editor_data(editor)->zoom); reg2 = jregion_new(&rect, 1); jregion_union(reg1, reg1, reg2); @@ -315,20 +315,20 @@ void effect_flush (Effect *effect) } } -void effect_apply_to_image (Effect *effect, Image *image, int x, int y) +void effect_apply_to_image(Effect *effect, Image *image, int x, int y) { - if (effect_init (effect, image, x, y)) - effect_apply (effect); + if (effect_init(effect, image, x, y)) + effect_apply(effect); } -void effect_apply_to_target (Effect *effect) +void effect_apply_to_target(Effect *effect) { - int target = get_config_int ("Target", "Images", 0); + int target = get_config_int("Target", "Images", 0); int n, n2, images = 0; Stock *stock; int *x, *y; - stock = sprite_get_images (effect->sprite, target, TRUE, &x, &y); + stock = sprite_get_images(effect->sprite, target, TRUE, &x, &y); if (!stock) return; diff --git a/src/jinete/jaccel.c b/src/jinete/jaccel.c index 7edd6f452..c8af415a3 100644 --- a/src/jinete/jaccel.c +++ b/src/jinete/jaccel.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,6 +36,11 @@ #include "jinete/jaccel.h" #include "jinete/jlist.h" +/* #define REPORT_KEYS */ +#define PREPROCESS_KEYS + + + struct jaccel { JList key_list; @@ -168,46 +173,46 @@ static void proc_one_word(JAccel accel, char *word) /* other ones */ else { /* F1, F2, ..., F11, F12 */ - if ((toupper (*tok) == 'F') && (ustrlen (tok) <= 3)) { - int num = ustrtol (tok+1, NULL, 10); + if ((toupper (*tok) == 'F') && (ustrlen(tok) <= 3)) { + int num = ustrtol(tok+1, NULL, 10); if ((num >= 1) && (num <= 12)) scancode = KEY_F1 + num - 1; } - else if (ustricmp (tok, "Esc") == 0) + else if (ustricmp(tok, "Esc") == 0) scancode = KEY_ESC; - else if (ustricmp (tok, "Backspace") == 0) + else if (ustricmp(tok, "Backspace") == 0) scancode = KEY_BACKSPACE; - else if (ustricmp (tok, "Tab") == 0) + else if (ustricmp(tok, "Tab") == 0) scancode = KEY_TAB; - else if (ustricmp (tok, "Enter") == 0) + else if (ustricmp(tok, "Enter") == 0) scancode = KEY_ENTER; - else if (ustricmp (tok, "Space") == 0) + else if (ustricmp(tok, "Space") == 0) scancode = KEY_SPACE; - else if ((ustricmp (tok, "Insert") == 0) || - (ustricmp (tok, "Ins") == 0)) + else if ((ustricmp(tok, "Insert") == 0) || + (ustricmp(tok, "Ins") == 0)) scancode = KEY_INSERT; - else if ((ustricmp (tok, "Delete") == 0) || - (ustricmp (tok, "Del") == 0)) + else if ((ustricmp(tok, "Delete") == 0) || + (ustricmp(tok, "Del") == 0)) scancode = KEY_DEL; - else if (ustricmp (tok, "Home") == 0) + else if (ustricmp(tok, "Home") == 0) scancode = KEY_HOME; - else if (ustricmp (tok, "End") == 0) + else if (ustricmp(tok, "End") == 0) scancode = KEY_END; - else if (ustricmp (tok, "PgUp") == 0) + else if (ustricmp(tok, "PgUp") == 0) scancode = KEY_PGUP; - else if (ustricmp (tok, "PgDn") == 0) + else if (ustricmp(tok, "PgDn") == 0) scancode = KEY_PGDN; - else if (ustricmp (tok, "Left") == 0) + else if (ustricmp(tok, "Left") == 0) scancode = KEY_LEFT; - else if (ustricmp (tok, "Right") == 0) + else if (ustricmp(tok, "Right") == 0) scancode = KEY_RIGHT; - else if (ustricmp (tok, "Up") == 0) + else if (ustricmp(tok, "Up") == 0) scancode = KEY_UP; - else if (ustricmp (tok, "Down") == 0) + else if (ustricmp(tok, "Down") == 0) scancode = KEY_DOWN; /* TODO all "Pad" stuff and "PrtScr" and "Pause" */ - else if (ustricmp (tok, "Enter Pad") == 0) + else if (ustricmp(tok, "Enter Pad") == 0) scancode = KEY_ENTER_PAD; } } @@ -385,9 +390,6 @@ void jaccel_to_string(JAccel accel, char *buf) bool jaccel_check(JAccel accel, int shifts, int ascii, int scancode) { -/* #define REPORT_KEYS */ -#define PREPROCESS_KEYS - KeyCombo *key; JLink link; #ifdef REPORT_KEYS diff --git a/src/jinete/jaccel.h b/src/jinete/jaccel.h index e63ba227f..0a0f75dc8 100644 --- a/src/jinete/jaccel.h +++ b/src/jinete/jaccel.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jalert.c b/src/jinete/jalert.c index 672d582a2..2b7f2c3af 100644 --- a/src/jinete/jalert.c +++ b/src/jinete/jalert.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jalert.h b/src/jinete/jalert.h index 91ace4d1b..b0790349f 100644 --- a/src/jinete/jalert.h +++ b/src/jinete/jalert.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jbase.h b/src/jinete/jbase.h index 4b93aa181..c40cdc72a 100644 --- a/src/jinete/jbase.h +++ b/src/jinete/jbase.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -156,13 +156,15 @@ enum { JM_CLOSE, /* windows is closed */ JM_DESTROY, /* widget is destroyed */ JM_DRAW, /* widget needs be repainted */ - JM_IDLE, /* is sent when the manager does nothing */ JM_SIGNAL, /* signal from some widget */ + JM_TIMER, /* a timer timeout */ JM_REQSIZE, /* request size */ JM_SETPOS, /* set position */ JM_WINMOVE, /* window movement */ JM_DRAWRGN, /* redraw region */ JM_DIRTYCHILDREN, /* dirty children */ + JM_QUEUEPROCESSING, /* only sent to manager which indicate + the last message in the queue */ /* keyboard related messages */ JM_CHAR, /* a new character in the buffer */ @@ -182,6 +184,9 @@ enum { /* XXX drag'n'drop operation? */ /* JM_DND_, */ + + /* other messages */ + JM_REGISTERED_MESSAGES }; /* signals */ diff --git a/src/jinete/jbox.c b/src/jinete/jbox.c index c49b7e8c7..29c7ef212 100644 --- a/src/jinete/jbox.c +++ b/src/jinete/jbox.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jbox.h b/src/jinete/jbox.h index ed4f91f94..c8084b236 100644 --- a/src/jinete/jbox.h +++ b/src/jinete/jbox.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jbutton.c b/src/jinete/jbutton.c index 7755a326a..edc675b3e 100644 --- a/src/jinete/jbutton.c +++ b/src/jinete/jbutton.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jbutton.h b/src/jinete/jbutton.h index ff99181f7..d3323fefb 100644 --- a/src/jinete/jbutton.h +++ b/src/jinete/jbutton.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jclipboard.c b/src/jinete/jclipboard.c index c7826f805..b4fde8f04 100644 --- a/src/jinete/jclipboard.c +++ b/src/jinete/jclipboard.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jclipboard.h b/src/jinete/jclipboard.h index 69193dd88..54c6af027 100644 --- a/src/jinete/jclipboard.h +++ b/src/jinete/jclipboard.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jcombobox.h b/src/jinete/jcombobox.h index 0ff6c6838..3496982d7 100644 --- a/src/jinete/jcombobox.h +++ b/src/jinete/jcombobox.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jcombox.c b/src/jinete/jcombox.c index 9fa17d514..821728428 100644 --- a/src/jinete/jcombox.c +++ b/src/jinete/jcombox.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jdraw.c b/src/jinete/jdraw.c index 3916e09c2..914aa9373 100644 --- a/src/jinete/jdraw.c +++ b/src/jinete/jdraw.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jdraw.h b/src/jinete/jdraw.h index 506a46029..621182b3c 100644 --- a/src/jinete/jdraw.h +++ b/src/jinete/jdraw.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jentry.c b/src/jinete/jentry.c index 3ef6ac439..5228e3f34 100644 --- a/src/jinete/jentry.c +++ b/src/jinete/jentry.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -50,7 +51,7 @@ typedef struct Entry int cursor; int scroll; int select; - int clock; + int timer_id; bool hidden : 1; bool state : 1; /* show or not the text cursor */ bool readonly : 1; @@ -58,38 +59,38 @@ typedef struct Entry bool recent_focused : 1; } Entry; -static bool entry_msg_proc (JWidget widget, JMessage msg); -static void entry_request_size (JWidget widget, int *w, int *h); +static bool entry_msg_proc(JWidget widget, JMessage msg); +static void entry_request_size(JWidget widget, int *w, int *h); -static int entry_get_cursor_from_mouse (JWidget widget, JMessage msg); +static int entry_get_cursor_from_mouse(JWidget widget, JMessage msg); -static void entry_forward_word (JWidget widget); -static void entry_backward_word (JWidget widget); +static void entry_forward_word(JWidget widget); +static void entry_backward_word(JWidget widget); -JWidget jentry_new (int maxsize, const char *format, ...) +JWidget jentry_new(int maxsize, const char *format, ...) { - JWidget widget = jwidget_new (JI_ENTRY); - Entry *entry = jnew (Entry, 1); + JWidget widget = jwidget_new(JI_ENTRY); + Entry *entry = jnew(Entry, 1); char buf[4096]; /* formatted string */ if (format) { va_list ap; - va_start (ap, format); - vsprintf (buf, format, ap); - va_end (ap); + va_start(ap, format); + vsprintf(buf, format, ap); + va_end(ap); } /* empty string */ else { - ustrcpy (buf, empty_string); + ustrcpy(buf, empty_string); } - jwidget_add_hook (widget, JI_ENTRY, entry_msg_proc, entry); + jwidget_add_hook(widget, JI_ENTRY, entry_msg_proc, entry); entry->cursor = 0; entry->scroll = 0; entry->select = 0; - entry->clock = 0; + entry->timer_id = jmanager_add_timer(widget, 500); entry->hidden = FALSE; entry->state = FALSE; entry->password = FALSE; @@ -99,64 +100,64 @@ JWidget jentry_new (int maxsize, const char *format, ...) /* TODO support for text alignment and multi-line */ /* widget->align = JI_LEFT | JI_MIDDLE; */ widget->text_size = maxsize+1; - widget->text = jmalloc (widget->text_size); - jwidget_set_text (widget, buf); + widget->text = jmalloc(widget->text_size); + jwidget_set_text(widget, buf); - jwidget_focusrest (widget, TRUE); - jwidget_init_theme (widget); + jwidget_focusrest(widget, TRUE); + jwidget_init_theme(widget); return widget; } -void jentry_readonly (JWidget widget, bool state) +void jentry_readonly(JWidget widget, bool state) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); entry->readonly = state; } -void jentry_password (JWidget widget, bool state) +void jentry_password(JWidget widget, bool state) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); entry->password = state; } -bool jentry_is_readonly (JWidget widget) +bool jentry_is_readonly(JWidget widget) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); return entry->readonly; } -bool jentry_is_password (JWidget widget) +bool jentry_is_password(JWidget widget) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); return entry->password; } -void jentry_show_cursor (JWidget widget) +void jentry_show_cursor(JWidget widget) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); entry->hidden = FALSE; - jwidget_dirty (widget); + jwidget_dirty(widget); } -void jentry_hide_cursor (JWidget widget) +void jentry_hide_cursor(JWidget widget) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); entry->hidden = TRUE; - jwidget_dirty (widget); + jwidget_dirty(widget); } -void jentry_set_cursor_pos (JWidget widget, int pos) +void jentry_set_cursor_pos(JWidget widget, int pos) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); const char *text = widget->text; int x, c; @@ -171,46 +172,46 @@ void jentry_set_cursor_pos (JWidget widget, int pos) do { x = widget->rc->x1 + widget->border_width.l; for (c=++entry->scroll; ; c++) { - x += CHARACTER_LENGTH (widget->text_font, - (c < ustrlen (text))? ugetat (text, c): ' '); + x += CHARACTER_LENGTH(widget->text_font, + (c < ustrlen(text))? ugetat(text, c): ' '); if (x >= widget->rc->x2-widget->border_width.r) break; } } while (entry->cursor >= c); - entry->clock = ji_clock; + jmanager_start_timer(entry->timer_id); entry->state = TRUE; - jwidget_dirty (widget); + jwidget_dirty(widget); } -void jentry_select_text (JWidget widget, int from, int to) +void jentry_select_text(JWidget widget, int from, int to) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); - int end = ustrlen (widget->text); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); + int end = ustrlen(widget->text); entry->select = from; - jentry_set_cursor_pos (widget, from); - jentry_set_cursor_pos (widget, (to >= 0)? to: end+to+1); + jentry_set_cursor_pos(widget, from); + jentry_set_cursor_pos(widget, (to >= 0)? to: end+to+1); - jwidget_dirty (widget); + jwidget_dirty(widget); } -void jentry_deselect_text (JWidget widget) +void jentry_deselect_text(JWidget widget) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); entry->select = -1; - jwidget_dirty (widget); + jwidget_dirty(widget); } -void jtheme_entry_info (JWidget widget, - int *scroll, int *cursor, int *state, - int *selbeg, int *selend) +void jtheme_entry_info(JWidget widget, + int *scroll, int *cursor, int *state, + int *selbeg, int *selend) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); if (scroll) *scroll = entry->scroll; if (cursor) *cursor = entry->cursor; @@ -218,8 +219,8 @@ void jtheme_entry_info (JWidget widget, if ((entry->select >= 0) && (entry->cursor != entry->select)) { - *selbeg = MIN (entry->cursor, entry->select); - *selend = MAX (entry->cursor, entry->select)-1; + *selbeg = MIN(entry->cursor, entry->select); + *selend = MAX(entry->cursor, entry->select)-1; } else { *selbeg = -1; @@ -227,32 +228,32 @@ void jtheme_entry_info (JWidget widget, } } -static bool entry_msg_proc (JWidget widget, JMessage msg) +static bool entry_msg_proc(JWidget widget, JMessage msg) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); switch (msg->type) { case JM_DESTROY: - jfree (entry); + jmanager_remove_timer(entry->timer_id); + jfree(entry); break; case JM_REQSIZE: entry_request_size (widget, &msg->reqsize.w, &msg->reqsize.h); return TRUE; - case JM_IDLE: - if (jwidget_has_focus (widget)) { - if (ji_clock-entry->clock > JI_TICKS_PER_SEC/2) { - entry->clock = ji_clock; - entry->state = entry->state ? FALSE: TRUE; - jwidget_dirty (widget); - } + case JM_TIMER: + if (jwidget_has_focus(widget) && + msg->timer.timer_id == entry->timer_id) { + entry->state = entry->state ? FALSE: TRUE; + jwidget_dirty(widget); } break; case JM_FOCUSENTER: - entry->clock = ji_clock; + jmanager_start_timer(entry->timer_id); + entry->state = TRUE; jwidget_dirty(widget); @@ -263,6 +264,8 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) case JM_FOCUSLEAVE: jwidget_dirty(widget); + jmanager_stop_timer(entry->timer_id); + jentry_deselect_text(widget); entry->recent_focused = FALSE; break; @@ -380,12 +383,12 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) /* paste text */ for (c=0; ctext_size) - uinsert (text, entry->cursor+c, ugetat (clipboard, c)); + if (ustrsizez(text) < widget->text_size) + uinsert(text, entry->cursor+c, ugetat(clipboard, c)); else break; - jentry_set_cursor_pos (widget, entry->cursor+c); + jentry_set_cursor_pos(widget, entry->cursor+c); } } /* *copy* text */ @@ -393,8 +396,8 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) char buf[1024]; ustrcpy (buf, empty_string); for (c=selbeg; c<=selend; c++) - uinsert (buf, ustrlen (buf), ugetat (text, c)); - jclipboard_set_text (buf); + uinsert(buf, ustrlen(buf), ugetat (text, c)); + jclipboard_set_text(buf); } break; @@ -402,14 +405,14 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) /* delete the entire selection */ if (selbeg >= 0) { for (c=0; ccursor = selbeg; } /* delete the previous character */ else { if (entry->cursor > 0) - uremove (text, --entry->cursor); + uremove(text, --entry->cursor); } entry->select = -1; @@ -420,20 +423,20 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) /* delete the entire selection */ if (selbeg >= 0) { for (c=0; ccursor = selbeg; } /* put the character */ - if (ustrsizez (text) < widget->text_size) - uinsert (text, entry->cursor++, msg->key.ascii); + if (ustrsizez(text) < widget->text_size) + uinsert(text, entry->cursor++, msg->key.ascii); entry->select = -1; break; } else { - jfree (text); + jfree(text); return FALSE; } } @@ -455,7 +458,7 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) jwidget_capture_mouse(widget); case JM_MOTION: - if (jwidget_has_capture (widget)) { + if (jwidget_has_capture(widget)) { const char *text = widget->text; bool move, dirty; int c, x; @@ -515,7 +518,7 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) /* show the cursor */ if (dirty) { - entry->clock = ji_clock; + jmanager_start_timer(entry->timer_id); entry->state = TRUE; } @@ -524,8 +527,8 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) break; case JM_BUTTONRELEASED: - if (jwidget_has_capture (widget)) - jwidget_release_mouse (widget); + if (jwidget_has_capture(widget)) + jwidget_release_mouse(widget); return TRUE; case JM_DOUBLECLICK: @@ -546,34 +549,34 @@ static bool entry_msg_proc (JWidget widget, JMessage msg) return FALSE; } -static void entry_request_size (JWidget widget, int *w, int *h) +static void entry_request_size(JWidget widget, int *w, int *h) { *w = + widget->border_width.l - + ji_font_char_len (widget->text_font, 'w') * MIN (widget->text_size, 6) + + ji_font_char_len(widget->text_font, 'w') * MIN(widget->text_size, 6) + 2 + widget->border_width.r; - *w = MIN (*w, 128); + *w = MIN(*w, 128); *h = + widget->border_width.t - + text_height (widget->text_font) + + text_height(widget->text_font) + widget->border_width.b; } -static int entry_get_cursor_from_mouse (JWidget widget, JMessage msg) +static int entry_get_cursor_from_mouse(JWidget widget, JMessage msg) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); int c, x, w, mx, cursor = entry->cursor; mx = msg->mouse.x; - mx = MID (widget->rc->x1+widget->border_width.l, - mx, - widget->rc->x2-widget->border_width.r-1); + mx = MID(widget->rc->x1+widget->border_width.l, + mx, + widget->rc->x2-widget->border_width.r-1); x = widget->rc->x1 + widget->border_width.l; for (c=entry->scroll; ugetat (widget->text, c); c++) { - w = CHARACTER_LENGTH (widget->text_font, ugetat (widget->text, c)); + w = CHARACTER_LENGTH(widget->text_font, ugetat (widget->text, c)); if (x+w >= widget->rc->x2-widget->border_width.r) break; if ((mx >= x) && (mx < x+w)) { @@ -592,43 +595,43 @@ static int entry_get_cursor_from_mouse (JWidget widget, JMessage msg) } #define IS_WORD_CHAR(ch) \ - (!((!ch) || (uisspace (ch)) || \ + (!((!ch) || (uisspace(ch)) || \ ((ch) == '/') || ((ch) == OTHER_PATH_SEPARATOR))) -static void entry_forward_word (JWidget widget) +static void entry_forward_word(JWidget widget) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); int ch; for (; entry->cursortext); entry->cursor++) { - ch = ugetat (widget->text, entry->cursor); + ch = ugetat(widget->text, entry->cursor); if (IS_WORD_CHAR (ch)) break; } - for (; entry->cursortext); entry->cursor++) { - ch = ugetat (widget->text, entry->cursor); - if (!IS_WORD_CHAR (ch)) { + for (; entry->cursortext); entry->cursor++) { + ch = ugetat(widget->text, entry->cursor); + if (!IS_WORD_CHAR(ch)) { entry->cursor++; break; } } } -static void entry_backward_word (JWidget widget) +static void entry_backward_word(JWidget widget) { - Entry *entry = jwidget_get_data (widget, JI_ENTRY); + Entry *entry = jwidget_get_data(widget, JI_ENTRY); int ch; for (entry->cursor--; entry->cursor >= 0; entry->cursor--) { - ch = ugetat (widget->text, entry->cursor); - if (IS_WORD_CHAR (ch)) + ch = ugetat(widget->text, entry->cursor); + if (IS_WORD_CHAR(ch)) break; } for (; entry->cursor >= 0; entry->cursor--) { - ch = ugetat (widget->text, entry->cursor); - if (!IS_WORD_CHAR (ch)) { + ch = ugetat(widget->text, entry->cursor); + if (!IS_WORD_CHAR(ch)) { entry->cursor++; break; } diff --git a/src/jinete/jentry.h b/src/jinete/jentry.h index 1e17f575b..e1f1c4246 100644 --- a/src/jinete/jentry.h +++ b/src/jinete/jentry.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jfile.c b/src/jinete/jfile.c index 02dce2326..321f63bbe 100644 --- a/src/jinete/jfile.c +++ b/src/jinete/jfile.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jfile.h b/src/jinete/jfile.h index 52d3943a1..b7ab307cc 100644 --- a/src/jinete/jfile.h +++ b/src/jinete/jfile.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jfilesel.c b/src/jinete/jfilesel.c index 7471e7b1e..acfa06b04 100644 --- a/src/jinete/jfilesel.c +++ b/src/jinete/jfilesel.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jfilesel.h b/src/jinete/jfilesel.h index 883409ab5..fbd19b47e 100644 --- a/src/jinete/jfilesel.h +++ b/src/jinete/jfilesel.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jfont.c b/src/jinete/jfont.c index 718ad9376..77d4a9ae1 100644 --- a/src/jinete/jfont.c +++ b/src/jinete/jfont.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jfont.h b/src/jinete/jfont.h index f984dfd18..e0c579e25 100644 --- a/src/jinete/jfont.h +++ b/src/jinete/jfont.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jfontbmp.c b/src/jinete/jfontbmp.c index be32a3db2..caa011034 100644 --- a/src/jinete/jfontbmp.c +++ b/src/jinete/jfontbmp.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jhook.c b/src/jinete/jhook.c index 54e6ef00d..93182a85a 100644 --- a/src/jinete/jhook.c +++ b/src/jinete/jhook.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jhook.h b/src/jinete/jhook.h index a887fe44f..c2841ad3d 100644 --- a/src/jinete/jhook.h +++ b/src/jinete/jhook.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jimage.c b/src/jinete/jimage.c index cd4cedfe4..80c22945c 100644 --- a/src/jinete/jimage.c +++ b/src/jinete/jimage.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jimage.h b/src/jinete/jimage.h index 3b45cbece..4749d6dcb 100644 --- a/src/jinete/jimage.h +++ b/src/jinete/jimage.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jinete.h b/src/jinete/jinete.h index 56e83ca7a..d13a7357c 100644 --- a/src/jinete/jinete.h +++ b/src/jinete/jinete.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jintern.c b/src/jinete/jintern.c index 1be55813d..e56a2b0af 100644 --- a/src/jinete/jintern.c +++ b/src/jinete/jintern.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,20 +37,20 @@ static JID nwidgets = 0; static JWidget *widgets = NULL; -JWidget _ji_get_widget_by_id (JID widget_id) +JWidget _ji_get_widget_by_id(JID widget_id) { /* ji_assert ((widget_id >= 0) && (widget_id < nwidgets)); */ return widgets[widget_id]; } -JWidget *_ji_get_widget_array (int *n) +JWidget *_ji_get_widget_array(int *n) { *n = nwidgets; return widgets; } -JWidget _ji_get_new_widget (void) +JWidget _ji_get_new_widget(void) { JID widget_id; @@ -90,12 +90,12 @@ JWidget _ji_get_new_widget (void) return widgets[widget_id]; } -void _ji_free_widget (JWidget widget) +void _ji_free_widget(JWidget widget) { widgets[widget->id]->id = 0; } -void _ji_free_all_widgets (void) +void _ji_free_all_widgets(void) { int c; @@ -109,7 +109,7 @@ void _ji_free_all_widgets (void) } } -bool _ji_is_valid_widget (JWidget widget) +bool _ji_is_valid_widget(JWidget widget) { return (widget && widget->id >= 0 && diff --git a/src/jinete/jintern.h b/src/jinete/jintern.h index 759509f09..3e6ec75e7 100644 --- a/src/jinete/jintern.h +++ b/src/jinete/jintern.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jlabel.c b/src/jinete/jlabel.c index b452fdcd4..69d855e54 100644 --- a/src/jinete/jlabel.c +++ b/src/jinete/jlabel.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jlabel.h b/src/jinete/jlabel.h index c909ff15a..0970216d9 100644 --- a/src/jinete/jlabel.h +++ b/src/jinete/jlabel.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jlist.c b/src/jinete/jlist.c index 7c8f6e925..c088bb409 100644 --- a/src/jinete/jlist.c +++ b/src/jinete/jlist.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jlist.h b/src/jinete/jlist.h index 0e70b8e29..58a187555 100644 --- a/src/jinete/jlist.h +++ b/src/jinete/jlist.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jlistbox.c b/src/jinete/jlistbox.c index acf2819d1..643e07c21 100644 --- a/src/jinete/jlistbox.c +++ b/src/jinete/jlistbox.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jlistbox.h b/src/jinete/jlistbox.h index 9cf7dfe60..4b4cd0484 100644 --- a/src/jinete/jlistbox.h +++ b/src/jinete/jlistbox.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jmanager.c b/src/jinete/jmanager.c index d91ebf170..a715eceef 100644 --- a/src/jinete/jmanager.c +++ b/src/jinete/jmanager.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,6 +36,7 @@ #include #endif +#include #include #include "jinete/jinete.h" @@ -49,6 +50,14 @@ JI_HIDDEN | \ JI_DECORATIVE)) == JI_FOCUSREST) +#define DOUBLE_CLICK_TIMEOUT_MSECS 400 + +enum { + DOUBLE_CLICK_NONE, + DOUBLE_CLICK_DOWN, + DOUBLE_CLICK_UP +}; + enum { STAGE_NORMAL, STAGE_WANT_CLOSE, @@ -56,16 +65,37 @@ enum { STAGE_CLOSE_ALL, }; +typedef struct Timer { + JWidget widget; + int interval; + int last_time; +} Timer; + +#define NFILTERS (JM_REGISTERED_MESSAGES+1) + +typedef struct Filter { + int message; + JWidget widget; +} Filter; + +static int double_click_level; +static int double_click_buttons; +static int double_click_ticks; + static int want_close_stage; /* variable to handle the external close button in some Windows enviroments */ static JWidget default_manager = NULL; +static Timer **timers; /* registered timers */ +static int n_timers; /* number of timers */ + static JList new_windows; /* windows that we should show */ static JList old_windows; /* windows that we should destroy */ static JList proc_windows_list; /* current window's list in process */ static JList msg_queue; /* messages queue */ +static JList msg_filters[NFILTERS]; /* filters for every enqueued message */ static JWidget focus_widget; /* the widget with the focus */ static JWidget mouse_widget; /* the widget with the mouse */ @@ -77,12 +107,17 @@ static bool first_time_poll; /* TRUE when we don't enter in poll yet */ static char old_readed_key[KEY_MAX]; /* keyboard status of previous poll */ +/* all messages are enqueue before this 'link' (or in the end of the + queue if it's NULL) */ +static JLink enqueue_messages_before_this = NULL; + +/* manager widget */ static bool manager_msg_proc(JWidget widget, JMessage msg); static void manager_request_size(JWidget widget, int *w, int *h); static void manager_set_position(JWidget widget, JRect rect); static void manager_redraw_region(JWidget widget, JRegion region); -static void dispatch_msgs(void); +/* auxiliary */ static void destroy_window(JWidget window); static void remove_msgs_for(JWidget widget, JMessage msg); static void generate_proc_windows_list(void); @@ -92,6 +127,9 @@ static JWidget find_magnetic_widget(JWidget widget); static JMessage new_mouse_msg(int type); static JMessage new_key_msg(int type, int readkey_value); static void broadcast_key_msg(JWidget manager, JMessage msg); +static Filter *filter_new(int message, JWidget widget); +static void filter_free(Filter *filter); + /* keyboard focus movement stuff */ static bool move_focus(JWidget manager, JMessage msg); static int count_widgets_accept_focus(JWidget widget); @@ -135,16 +173,25 @@ JWidget jmanager_new(void) old_windows = jlist_new(); proc_windows_list = jlist_new(); + for (c=0; cdata); + } + jlist_free(msg_filters[c]); + msg_filters[c] = NULL; + } + + /* destroy timers */ + for (c=0; cchildren)) return FALSE; + /* TODO check for STAGE */ +/* if (want_close_stage == STAGE_WANT_CLOSE) */ +/* return FALSE; */ + /* new windows to show? */ if (!jlist_empty(new_windows)) { JI_LIST_FOR_EACH(new_windows, link) { @@ -264,47 +334,45 @@ bool jmanager_poll(JWidget manager, bool all_windows) /* update mouse status */ mousemove = jmouse_poll(); + if (mousemove || !mouse_widget) { + /* get the widget under the mouse */ + widget = NULL; - /* get the widget under the mouse */ - widget = NULL; + JI_LIST_FOR_EACH(proc_windows_list, link) { + window = link->data; + widget = jwidget_pick(window, jmouse_x(0), jmouse_y(0)); + if (widget) + break; + } - JI_LIST_FOR_EACH(proc_windows_list, link) { - window = link->data; - widget = jwidget_pick(window, jmouse_x(0), jmouse_y(0)); - if (widget) - break; - } + /* fixup "mouse" flag */ + if (widget != mouse_widget) { + if (!widget) + jmanager_free_mouse(); + else + jmanager_set_mouse(widget); + } - /* fixup "mouse" flag */ - if (widget != mouse_widget) { - if (!widget) - jmanager_free_mouse(); - else - jmanager_set_mouse(widget); - } + /* mouse movement */ + if (mousemove) { + msg = new_mouse_msg(JM_MOTION); - /* mouse movement */ - if (mousemove) { - msg = new_mouse_msg(JM_MOTION); - /* TODO rigid marshal */ + /* reset double click status */ + double_click_level = DOUBLE_CLICK_NONE; - /* reset double click status */ - jmouse_set_click_level(JI_CLICK_NOT); + /* send the mouse movement message */ + if (capture_widget) + jmessage_broadcast_to_parents(msg, capture_widget); + else if (mouse_widget) + jmessage_broadcast_to_parents(msg, mouse_widget); - /* send the mouse movement message */ - if (capture_widget) - jmessage_broadcast_to_parents(msg, capture_widget); - else if (mouse_widget) - jmessage_broadcast_to_parents(msg, mouse_widget); - - jmanager_enqueue_message(msg); - jmessage_free(msg); + jmanager_enqueue_message(msg); + } } /* mouse wheel */ if (jmouse_z(0) != jmouse_z(1)) { msg = new_mouse_msg(JM_WHEEL); - /* TODO rigid marshal */ /* send the mouse wheel message */ if (capture_widget) @@ -313,23 +381,69 @@ bool jmanager_poll(JWidget manager, bool all_windows) jmessage_broadcast_to_parents(msg, mouse_widget); jmanager_enqueue_message(msg); - jmessage_free(msg); } /* mouse clicks */ if ((jmouse_b(0) != jmouse_b(1)) && ((!jmouse_b(0)) || (!jmouse_b(1)))) { + int current_ticks = ji_clock; + /* press and release button messages */ msg = new_mouse_msg((!jmouse_b(1))? JM_BUTTONPRESSED: JM_BUTTONRELEASED); - /* TODO rigid marshal */ - if (msg->type == JM_BUTTONPRESSED) - if (jmouse_get_click_level() == JI_CLICK_NOT) - jmouse_set_click_level(JI_CLICK_START); + /**********************************************************************/ + /* Double Click */ + if (msg->type == JM_BUTTONPRESSED) { + if (double_click_level != DOUBLE_CLICK_NONE) { + /* time out, back to NONE */ + if (current_ticks - double_click_ticks > DOUBLE_CLICK_TIMEOUT_MSECS) { + double_click_level = DOUBLE_CLICK_NONE; + } + else if (double_click_buttons == msg->mouse.flags) { + if (double_click_level == DOUBLE_CLICK_UP) { + msg->type = JM_DOUBLECLICK; + } + else { + double_click_level = DOUBLE_CLICK_NONE; + } + } + /* press other button, back to NONE */ + else { + double_click_level = DOUBLE_CLICK_NONE; + } + } + /* this could be the beginning of the state */ + if (double_click_level == DOUBLE_CLICK_NONE) { + double_click_level = DOUBLE_CLICK_DOWN; + double_click_buttons = msg->mouse.flags; + double_click_ticks = current_ticks; + } + } + else if (msg->type == JM_BUTTONRELEASED) { + if (double_click_level != DOUBLE_CLICK_NONE) { + /* time out, back to NONE */ + if (current_ticks - double_click_ticks > DOUBLE_CLICK_TIMEOUT_MSECS) { + double_click_level = DOUBLE_CLICK_NONE; + } + else if (double_click_buttons == msg->mouse.flags) { + if (double_click_level == DOUBLE_CLICK_DOWN) { + double_click_level = DOUBLE_CLICK_UP; + double_click_ticks = current_ticks; + } + } + /* press other button, back to NONE */ + else { + double_click_level = DOUBLE_CLICK_NONE; + } + } + } + + /* add receivers of the message */ + if (capture_widget) - jmessage_broadcast_to_parents (msg, capture_widget); + jmessage_broadcast_to_parents(msg, capture_widget); else if (mouse_widget) { /* Z-Order: Send the window to top (only when you click in a window @@ -366,38 +480,8 @@ bool jmanager_poll(JWidget manager, bool all_windows) jmessage_broadcast_to_parents(msg, mouse_widget); } - else { - jmouse_set_click_level(JI_CLICK_NOT); - - /* maybe someone want catch this lost click (menus use this to - down to parents) */ - msg->type = JM_IDLE; - - JI_LIST_FOR_EACH(proc_windows_list, link) { - window = link->data; - jmessage_broadcast_to_children(msg, window); - } - } jmanager_enqueue_message(msg); - jmessage_free(msg); - } - - /* double clicks */ - if (jmouse_get_click_level() == JI_CLICK_AGAIN) { - msg = new_mouse_msg(JM_DOUBLECLICK); - /* TODO rigid marshal */ - - jmouse_set_click_level(JI_CLICK_NOT); - - if (capture_widget) - jmessage_broadcast_to_parents(msg, capture_widget); - - if (mouse_widget) - jmessage_broadcast_to_parents(msg, mouse_widget); - - jmanager_enqueue_message(msg); - jmessage_free(msg); } /* generate JM_CHAR/JM_KEYPRESSED messages */ @@ -423,40 +507,63 @@ bool jmanager_poll(JWidget manager, bool all_windows) } jmanager_enqueue_message(msg); - jmessage_free(msg); } /* generate JM_KEYRELEASED messages */ for (c=0; cdata; - jmessage_broadcast_to_children (msg, window); + /* timers */ + if (n_timers > 0) { + int t = ji_clock; + + for (c=0; clast_time >= 0) { + while (t - timers[c]->last_time > timers[c]->interval) { + timers[c]->last_time += timers[c]->interval; + + msg = jmessage_new(JM_TIMER); + msg->timer.timer_id = c; + jmessage_add_dest(msg, timers[c]->widget); + jmanager_enqueue_message(msg); + + /* we spend too much time here */ + if (ji_clock - t > timers[c]->interval) { + timers[c]->last_time = ji_clock; + break; + } + } + } + } } - jmessage_add_dest(msg, manager); - jmanager_enqueue_message(msg); - jmessage_free(msg); /* process messages queue */ - jmanager_dispatch_messages(); + if (!jlist_empty(msg_queue)) { + /* clean the queue of messages */ + jmanager_dispatch_messages(); - /* redraw dirty widgets */ - jwidget_flush_redraw(manager); - jmanager_dispatch_messages(); + /* redraw dirty widgets */ + jwidget_flush_redraw(manager); + jmanager_dispatch_messages(); + + /* add the "Queue Processing" message for the manager */ + msg = new_mouse_msg(JM_QUEUEPROCESSING); + jmessage_add_dest(msg, manager); + jmanager_enqueue_message(msg); + + jmanager_dispatch_messages(); + } /* make some OSes happy */ yield_timeslice(); + rest(1); /* old windows to close? */ if (!jlist_empty(old_windows)) { @@ -489,14 +596,238 @@ bool jmanager_poll(JWidget manager, bool all_windows) return ret; } -void jmanager_enqueue_message(const JMessage msg) +/** + * Adds a timer event for the specified widget. + * + * @return A timer ID that can be used with @ref jmanager_remove_timer + */ +int jmanager_add_timer(JWidget widget, int interval) { - jlist_append(msg_queue, jmessage_new_copy(msg)); + Timer *timer; + int c, new_id = -1; + + assert_valid_widget(widget); + + for (c=0; cwidget = widget; + timer->interval = interval; + timer->last_time = -1; + timers[new_id] = timer; + + return new_id; +} + +void jmanager_remove_timer(int timer_id) +{ + assert(timer_id >= 0 && timer_id < n_timers); + assert(timers[timer_id] != NULL); + + jfree(timers[timer_id]); + timers[timer_id] = NULL; +} + +void jmanager_start_timer(int timer_id) +{ + assert(timer_id >= 0 && timer_id < n_timers); + assert(timers[timer_id] != NULL); + + timers[timer_id]->last_time = ji_clock; +} + +void jmanager_stop_timer(int timer_id) +{ + assert(timer_id >= 0 && timer_id < n_timers); + assert(timers[timer_id] != NULL); + + timers[timer_id]->last_time = -1; +} + +/** + * @param msg You can't use the this message after calling this + * routine. The message will be automatically freed through + * @ref jmessage_free + */ +void jmanager_enqueue_message(JMessage msg) +{ + int c; + + assert(msg_queue != NULL); + assert(msg != NULL); + + /* check if this message must be filtered by some widget before */ + c = msg->type; + if (c >= JM_REGISTERED_MESSAGES) + c = JM_REGISTERED_MESSAGES; + + if (!jlist_empty(msg_filters[c])) { /* ok, so are filters to add ... */ + JLink link; + + /* add all the filters in the destination list of the message */ + JI_LIST_FOR_EACH_BACK(msg_filters[c], link) { + Filter *filter = link->data; + if (msg->type == filter->message) + jmessage_add_pre_dest(msg, filter->widget); + } + } + +/* jlist_insert_before(msg_queue, */ +/* enqueue_messages_before_this, msg); */ + jlist_append(msg_queue, msg); } void jmanager_dispatch_messages(void) { - dispatch_msgs(); + JMessage msg, first_msg; + JLink link, link2, next; + JWidget widget; + bool done; +#ifdef LIMIT_DISPATCH_TIME + int t = ji_clock; +#endif + + assert(msg_queue != NULL); + + link = jlist_first(msg_queue); + while (link != msg_queue->end) { + msg = link->data; + +#ifdef LIMIT_DISPATCH_TIME + if (ji_clock-t > 250) + break; +#endif + + /* go to next message */ + if (msg->any.used) { + link = link->next; + continue; + } + + enqueue_messages_before_this = link->next; + + /* this message is in use */ + msg->any.used = TRUE; + first_msg = msg; + + done = FALSE; + do { + JI_LIST_FOR_EACH(msg->any.widgets, link2) { + widget = link2->data; + +#ifdef REPORT_EVENTS + { + static char *msg_name[] = { + "Open", + "Close", + "Destroy", + "Draw", + "Idle", + "Signal", + "Timer", + "ReqSize", + "SetPos", + "WinMove", + "DrawRgn", + "DirtyChildren", + "QueueProcessing", + "Char", + "KeyPressed", + "KeyReleased", + "FocusEnter", + "FocusLeave", + "ButtonPressed", + "ButtonReleased", + "DoubleClick", + "LostClick", + "MouseEnter", + "MouseLeave", + "Motion", + "Wheel", + }; + const char *string = + (msg->type >= JM_OPEN && + msg->type <= JM_WHEEL) ? msg_name[msg->type]: + "Unknown"; + + printf("Event: %s (%d)\n", string, widget->id); + fflush(stdout); + } +#endif + + /* draw message? */ + if (msg->type == JM_DRAW) { + /* hidden? */ + if (widget->flags & JI_HIDDEN) + continue; + + jmouse_hide(); + acquire_bitmap(ji_screen); + + /* set clip */ + set_clip(ji_screen, + msg->draw.rect.x1, msg->draw.rect.y1, + msg->draw.rect.x2-1, msg->draw.rect.y2-1); +#ifdef REPORT_EVENTS + printf("set_clip(%d, %d, %d, %d)\n", + msg->draw.rect.x1, msg->draw.rect.y1, + msg->draw.rect.x2-1, msg->draw.rect.y2-1); + fflush(stdout); +#endif +/* rectfill(ji_screen, 0, 0, JI_SCREEN_W-1, JI_SCREEN_H-1, makecol(255, 0, 0)); */ +/* vsync(); vsync(); vsync(); vsync(); */ + } + + /* call message handler */ + done = jwidget_send_message(widget, msg); + + /* restore clip */ + if (msg->type == JM_DRAW) { + set_clip(ji_screen, 0, 0, JI_SCREEN_W-1, JI_SCREEN_H-1); + + /* dirty rectangles */ + if (ji_dirty_region) + ji_add_dirty_rect(&msg->draw.rect); + + release_bitmap(ji_screen); + jmouse_show(); + } + + if (done) + break; + } + + /* done? */ + if (done) + /* don't go to sub-msg */ + msg = NULL; + else + /* use sub-msg */ + msg = msg->any.sub_msg; + + } while (msg); + + /* remove the message from the msg_queue */ + next = link->next; + jlist_delete_link(msg_queue, link); + link = next; + + /* destroy the message */ + jmessage_free(first_msg); + } + + enqueue_messages_before_this = NULL; } JWidget jmanager_get_focus(void) @@ -521,7 +852,7 @@ void jmanager_set_focus(JWidget widget) || (!(widget->flags & JI_DISABLED) && !(widget->flags & JI_HIDDEN) && !(widget->flags & JI_DECORATIVE) - && some_parent_is_focusrest (widget)))) { + && some_parent_is_focusrest(widget)))) { JList widget_parents = NULL; JWidget common_parent = NULL; JLink link, link2; @@ -535,8 +866,8 @@ void jmanager_set_focus(JWidget widget) /* fetch the focus */ if (focus_widget) { - JList focus_parents = jwidget_get_parents (focus_widget, TRUE); - msg = jmessage_new (JM_FOCUSLEAVE); + JList focus_parents = jwidget_get_parents(focus_widget, TRUE); + msg = jmessage_new(JM_FOCUSLEAVE); JI_LIST_FOR_EACH(focus_parents, link) { if (widget) { @@ -557,7 +888,6 @@ void jmanager_set_focus(JWidget widget) } jmanager_enqueue_message(msg); - jmessage_free(msg); jlist_free(focus_parents); } @@ -584,7 +914,6 @@ void jmanager_set_focus(JWidget widget) } jmanager_enqueue_message(msg); - jmessage_free(msg); } jlist_free(widget_parents); @@ -630,7 +959,6 @@ void jmanager_set_mouse(JWidget widget) } jmanager_enqueue_message(msg); - jmessage_free(msg); jlist_free(mouse_parents); } @@ -652,7 +980,6 @@ void jmanager_set_mouse(JWidget widget) } jmanager_enqueue_message(msg); - jmessage_free(msg); } jlist_free(widget_parents); @@ -737,6 +1064,29 @@ void jmanager_refresh_screen(void) jwidget_invalidate(default_manager); } +void jmanager_add_msg_filter(int message, JWidget widget) +{ + int c = message; + if (c >= JM_REGISTERED_MESSAGES) + c = JM_REGISTERED_MESSAGES; + + jlist_append(msg_filters[c], filter_new(message, widget)); +} + +void jmanager_remove_msg_filter(int message, JWidget widget) +{ + JLink link, next; + int c = message; + if (c >= JM_REGISTERED_MESSAGES) + c = JM_REGISTERED_MESSAGES; + + JI_LIST_FOR_EACH_SAFE(msg_filters[c], link, next) { + Filter *filter = link->data; + if (filter->widget == widget) + jlist_delete_link(msg_filters[c], link); + } +} + /* configures the window for begin the loop */ void _jmanager_open_window(JWidget manager, JWidget window) { @@ -758,7 +1108,6 @@ void _jmanager_open_window(JWidget manager, JWidget window) msg = jmessage_new(JM_OPEN); jmessage_broadcast_to_children(msg, window); jmanager_enqueue_message(msg); - jmessage_free(msg); /* update the new windows list to show */ jlist_append(new_windows, window); @@ -815,9 +1164,9 @@ void _jmanager_close_window(JWidget manager, JWidget window, msg = jmessage_new(JM_CLOSE); jmessage_broadcast_to_children(msg, window); jmanager_enqueue_message(msg); - jmessage_free(msg); - jmanager_dispatch_messages(); /* TODO WARNING!!! */ + /* TODO this was uncommented */ +/* jmanager_dispatch_messages(); /\* TODO WARNING!!! *\/ */ /* update manager list stuff */ jlist_remove(manager->children, window); @@ -840,7 +1189,6 @@ void _jmanager_close_window(JWidget manager, JWidget window, } } - /********************************************************************** Manager **********************************************************************/ @@ -977,149 +1325,17 @@ static void manager_redraw_region(JWidget widget, JRegion region) jregion_free(reg2); } - /********************************************************************** Internal routines **********************************************************************/ -static void dispatch_msgs(void) -{ - JMessage msg, first_msg; - JLink link, link2, next; - JWidget widget; - bool done; -#ifdef LIMIT_DISPATCH_TIME - int t = ji_clock; -#endif - - link = jlist_first(msg_queue); - while (link != msg_queue->end) { - msg = link->data; - -#ifdef LIMIT_DISPATCH_TIME - if (ji_clock-t > JI_TICKS_PER_SEC/4) - break; -#endif - - /* go to next message */ - if (msg->any.used) { - link = link->next; - continue; - } - - /* this message is in use */ - msg->any.used = TRUE; - first_msg = msg; - - done = FALSE; - do { - JI_LIST_FOR_EACH(msg->any.widgets, link2) { - widget = link2->data; - -#ifdef REPORT_EVENTS - if (msg->type != JM_IDLE) { /* don't report IDLE message */ - static char *msg_name[] = { - "Open", - "Close", - "Destroy", - "Draw", - "Idle", - "Signal", - "ReqSize", - "SetPos", - "WinMove", - "DrawRgn", - "DirtyChildren", - "Char", - "KeyPressed", - "KeyReleased", - "FocusEnter", - "FocusLeave", - "ButtonPressed", - "ButtonReleased", - "DoubleClick", - "MouseEnter", - "MouseLeave", - "Motion", - "Wheel", - }; - const char *string = - (msg->type >= JM_OPEN && - msg->type <= JM_WHEEL) ? msg_name[msg->type]: - "Unknown"; - - printf("Event: %s (%d)\n", string, widget->id); - } -#endif - - /* draw message? */ - if (msg->type == JM_DRAW) { - /* hidden? */ - if (widget->flags & JI_HIDDEN) - continue; - - jmouse_hide(); - acquire_bitmap(ji_screen); - - /* set clip */ - set_clip(ji_screen, - msg->draw.rect.x1, msg->draw.rect.y1, - msg->draw.rect.x2-1, msg->draw.rect.y2-1); -#ifdef REPORT_EVENTS - printf("set_clip (%d, %d, %d, %d)\n", - msg->draw.rect.x1, msg->draw.rect.y1, - msg->draw.rect.x2-1, msg->draw.rect.y2-1); -#endif -/* rectfill (ji_screen, 0, 0, JI_SCREEN_W-1, JI_SCREEN_H-1, makecol (255, 0, 0)); */ -/* vsync (); vsync (); vsync (); vsync (); */ - } - - /* call message handler */ - done = jwidget_send_message(widget, msg); - - /* restore clip */ - if (msg->type == JM_DRAW) { - set_clip(ji_screen, 0, 0, JI_SCREEN_W-1, JI_SCREEN_H-1); - - /* dirty rectangles */ - if (ji_dirty_region) - ji_add_dirty_rect(&msg->draw.rect); - - release_bitmap(ji_screen); - jmouse_show(); - } - - if (done) /* TODO use marshal? */ - break; - } - - /* done? */ - if (done) /* TODO use marshal? */ - /* don't go to sub-msg */ - msg = NULL; - else - /* use sub-msg */ - msg = msg->any.sub_msg; - - } while (msg); - - /* remove the message from the msg_queue */ - next = link->next; - jlist_delete_link(msg_queue, link); - link = next; - - /* destroy the message */ - jmessage_free(first_msg); - } -} - -static void destroy_window (JWidget window) +static void destroy_window(JWidget window) { /* printf (" %d DESTROYED BY MANAGER\n", window->id); */ /* delete the window */ - if (jwidget_is_autodestroy (window)) - jwidget_free (window); + if (jwidget_is_autodestroy(window)) + jwidget_free(window); } static void remove_msgs_for(JWidget widget, JMessage msg) @@ -1159,7 +1375,7 @@ static void generate_proc_windows_list2(JWidget widget) generate_proc_windows_list2(link->data); } -static int some_parent_is_focusrest (JWidget widget) +static int some_parent_is_focusrest(JWidget widget) { if (jwidget_is_focusrest(widget)) return TRUE; @@ -1194,7 +1410,6 @@ static JMessage new_mouse_msg(int type) msg->mouse.x = jmouse_x(0); msg->mouse.y = jmouse_y(0); msg->mouse.flags = - type == JM_DOUBLECLICK ? jmouse_get_click_button(): type == JM_BUTTONRELEASED ? jmouse_b(1): jmouse_b(0); msg->mouse.left = msg->mouse.flags & 1 ? TRUE: FALSE; @@ -1252,7 +1467,23 @@ static void broadcast_key_msg(JWidget manager, JMessage msg) } } - +static Filter *filter_new(int message, JWidget widget) +{ + Filter *filter = jnew(Filter, 1); + if (!filter) + return NULL; + + filter->message = message; + filter->widget = widget; + + return filter; +} + +static void filter_free(Filter *filter) +{ + jfree(filter); +} + /*********************************************************************** Focus Movement ***********************************************************************/ diff --git a/src/jinete/jmanager.h b/src/jinete/jmanager.h index e1cdcf8ae..44aa3136d 100644 --- a/src/jinete/jmanager.h +++ b/src/jinete/jmanager.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,9 +44,16 @@ void jmanager_free(JWidget manager); void jmanager_run(JWidget manager); bool jmanager_poll(JWidget manager, bool all_windows); +/* timers */ + +int jmanager_add_timer(JWidget widget, int interval); +void jmanager_remove_timer(int timer_id); +void jmanager_start_timer(int timer_id); +void jmanager_stop_timer(int timer_id); + /* routines that uses the ji_get_default_manager() */ -void jmanager_enqueue_message(const JMessage msg); +void jmanager_enqueue_message(JMessage msg); void jmanager_dispatch_messages(void); JWidget jmanager_get_focus(void); @@ -66,6 +73,9 @@ void jmanager_remove_message(JMessage msg); void jmanager_remove_messages_for(JWidget widget); void jmanager_refresh_screen(void); +void jmanager_add_msg_filter(int message, JWidget widget); +void jmanager_remove_msg_filter(int message, JWidget widget); + JI_END_DECLS #endif /* JINETE_MANAGER_H */ diff --git a/src/jinete/jmem.c b/src/jinete/jmem.c index 3f51ddfa2..d5639f848 100644 --- a/src/jinete/jmem.c +++ b/src/jinete/jmem.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jmenu.c b/src/jinete/jmenu.c index 1bdb253d6..d9f214259 100644 --- a/src/jinete/jmenu.c +++ b/src/jinete/jmenu.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,15 +31,22 @@ #include #include +#include #include #include #include "jinete/jinete.h" /* internal messages: to move between menus */ -#define DO_GOTOBAR 1 -#define DO_GOTODEST 2 +JM_MESSAGE(open_menuitem); +JM_MESSAGE(close_menuitem); +JM_MESSAGE(exe_menuitem); +#define JM_OPEN_MENUITEM jm_open_menuitem() +#define JM_CLOSE_MENUITEM jm_close_menuitem() +#define JM_EXE_MENUITEM jm_exe_menuitem() + +/* some auxiliar matros */ #define MOUSE_IN(pos) \ ((jmouse_x(0) >= pos->x1) && (jmouse_x(0) < pos->x2) && \ (jmouse_y(0) >= pos->y1) && (jmouse_y(0) < pos->y2)) @@ -47,40 +54,45 @@ #define MBOX(widget) \ ((MenuBox *)jwidget_get_data(((JWidget)widget), JI_MENUBOX)) +#define MENU(widget) \ + ((Menu *)jwidget_get_data(((JWidget)widget), JI_MENU)) + #define MITEM(widget) \ ((MenuItem *)jwidget_get_data(((JWidget)widget), JI_MENUITEM)) -/* JWidget *menuitem */ #define HAS_SUBMENU(menuitem) \ ((MITEM(menuitem)->submenu) && \ (!jlist_empty(MITEM(menuitem)->submenu->children))) -/* MenuBox *menubox_data */ -#define HAS_MENU(menubox_data) \ - ((menubox_data->menu) && (!jlist_empty(menubox_data->menu->children))) +/* data for the main jmenubar or the first popuped-jmenubox */ +typedef struct Base +{ + bool was_clicked : 1; + bool is_filtering : 1; + int current_level; +} Base; +/* data for a jmenu */ +typedef struct Menu +{ + JWidget menuitem; /* from where the menu was open */ +} Menu; + +/* data for a jmenubox */ typedef struct MenuBox { - JWidget menu; - JWidget parent_menuitem; + Base *base; } MenuBox; +/* data for a jmenuitem */ typedef struct MenuItem { JAccel accel; /* hot-key */ bool highlight : 1; /* is highlighted? */ - bool opened : 1; /* is sub-menu of this menu-item opened? */ JWidget submenu; /* the sub-menu */ + JWidget submenu_menubox; /* the opened menubox for this menu-item */ } MenuItem; -static int internal_msg = 0; -static JWidget dest_menubox = NULL; -static JWidget dest_menuitem = NULL; -static JWidget emitter_menuitem = NULL; -static bool dest_selectfirst = FALSE; -static bool was_clicked = FALSE; -static int current_level = 0; - static bool menu_msg_proc(JWidget widget, JMessage msg); static void menu_request_size(JWidget widget, int *w, int *h); static void menu_set_position(JWidget widget, JRect rect); @@ -92,23 +104,33 @@ static void menubox_set_position(JWidget widget, JRect rect); static bool menuitem_msg_proc(JWidget widget, JMessage msg); static void menuitem_request_size(JWidget widget, int *w, int *h); +static JWidget get_base_menubox(JWidget widget); +static Base *get_base(JWidget widget); +static Base *create_base(JWidget widget); + static JWidget get_highlight(JWidget menu); -static void set_highlight(JWidget menu, JWidget menuitem); +static void set_highlight(JWidget menu, JWidget menuitem, bool click, bool open_submenu, bool select_first_child); static void unhighlight(JWidget menu); + static void open_menuitem(JWidget menuitem, bool select_first); +static void close_menuitem(JWidget menuitem); +static void close_all(JWidget menu); +static void exe_menuitem(JWidget menuitem); + static JWidget check_for_letter(JWidget menu, int ascii); static JWidget check_for_accel(JWidget menu, JMessage msg); -static JWidget pick_menuitem(JWidget *menubox, JWidget *open_menubox); -static void emit_signal(JWidget menuitem); -static JWidget find_nextitem (JWidget menu, JWidget menuitem); -static JWidget find_previtem (JWidget menu, JWidget menuitem); +static JWidget find_nextitem(JWidget menu, JWidget menuitem); +static JWidget find_previtem(JWidget menu, JWidget menuitem); JWidget jmenu_new(void) { JWidget widget = jwidget_new(JI_MENU); + Menu *menu = jnew(Menu, 1); - jwidget_add_hook(widget, JI_MENU, menu_msg_proc, NULL); + menu->menuitem = NULL; + + jwidget_add_hook(widget, JI_MENU, menu_msg_proc, menu); jwidget_init_theme(widget); return widget; @@ -118,8 +140,9 @@ JWidget jmenubar_new(void) { JWidget widget = jmenubox_new(); - widget->type = JI_MENUBAR; + create_base(widget); + widget->type = JI_MENUBAR; jwidget_init_theme(widget); return widget; @@ -130,8 +153,7 @@ JWidget jmenubox_new(void) JWidget widget = jwidget_new(JI_MENUBOX); MenuBox *menubox = jnew(MenuBox, 1); - menubox->menu = NULL; - menubox->parent_menuitem = NULL; + menubox->base = NULL; jwidget_add_hook(widget, JI_MENUBOX, menubox_msg_proc, menubox); jwidget_focusrest(widget, TRUE); @@ -147,8 +169,8 @@ JWidget jmenuitem_new(const char *text) menuitem->accel = NULL; menuitem->highlight = FALSE; - menuitem->opened = FALSE; menuitem->submenu = NULL; + menuitem->submenu_menubox = NULL; jwidget_add_hook(widget, JI_MENUITEM, menuitem_msg_proc, menuitem); jwidget_set_text(widget, text); @@ -159,53 +181,79 @@ JWidget jmenuitem_new(const char *text) JWidget jmenubox_get_menu(JWidget widget) { - MenuBox *menubox = MBOX(widget); + assert_valid_widget(widget); - return menubox->menu ? menubox->menu: NULL; + if (jlist_empty(widget->children)) + return NULL; + else + return (JWidget)jlist_first(widget->children)->data; } JWidget jmenubar_get_menu(JWidget widget) { + assert_valid_widget(widget); + return jmenubox_get_menu(widget); } JWidget jmenuitem_get_submenu(JWidget widget) { - MenuItem *menuitem = MITEM(widget); + MenuItem *menuitem; + + assert_valid_widget(widget); + + menuitem = MITEM(widget); return menuitem->submenu ? menuitem->submenu: NULL; } JAccel jmenuitem_get_accel(JWidget widget) { - MenuItem *menuitem = MITEM(widget); + assert_valid_widget(widget); - return menuitem->accel; + return MITEM(widget)->accel; } void jmenubox_set_menu(JWidget widget, JWidget widget_menu) { - MenuBox *menubox = MBOX(widget); + JWidget old_menu; - if (menubox->menu) - jwidget_remove_child(widget, menubox->menu); + assert_valid_widget(widget); - menubox->menu = widget_menu; + old_menu = jmenubox_get_menu(widget); + if (old_menu) + jwidget_remove_child(widget, old_menu); - if (menubox->menu) - jwidget_add_child(widget, menubox->menu); + if (widget_menu) { + assert_valid_widget(widget_menu); + jwidget_add_child(widget, widget_menu); + } } void jmenubar_set_menu(JWidget widget, JWidget widget_menu) { + assert_valid_widget(widget); + jmenubox_set_menu(widget, widget_menu); } void jmenuitem_set_submenu(JWidget widget, JWidget widget_menu) { - MenuItem *menuitem = MITEM (widget); + MenuItem *menuitem; + + assert_valid_widget(widget); + + menuitem = MITEM(widget); + + if (menuitem->submenu) + MENU(menuitem->submenu)->menuitem = NULL; menuitem->submenu = widget_menu; + + if (menuitem->submenu) { + assert_valid_widget(widget_menu); + MENU(menuitem->submenu)->menuitem = widget; + } } /** @@ -217,8 +265,11 @@ void jmenuitem_set_submenu(JWidget widget, JWidget widget_menu) */ void jmenuitem_set_accel(JWidget widget, JAccel accel) { - MenuItem *menuitem = MITEM (widget); + MenuItem *menuitem; + assert_valid_widget(widget); + + menuitem = MITEM(widget); if (menuitem->accel) jaccel_free(menuitem->accel); @@ -227,30 +278,30 @@ void jmenuitem_set_accel(JWidget widget, JAccel accel) int jmenuitem_is_highlight(JWidget widget) { - MenuItem *menuitem = MITEM (widget); + assert_valid_widget(widget); - return menuitem->highlight; + return MITEM(widget)->highlight; } +/* TODO complete this routine */ void jmenu_popup(JWidget menu, int x, int y) { - JWidget window, menubox; + JWidget window, menubox/* , selected */; + Base *base; do { jmouse_poll(); } while (jmouse_b(0)); - was_clicked = TRUE; - current_level = 1; - internal_msg = 0; - emitter_menuitem = NULL; - /* new window and new menu-box */ window = jwindow_new(NULL); menubox = jmenubox_new(); + base = create_base(menubox); + base->was_clicked = TRUE; + base->current_level = 1; + jwindow_moveable(window, FALSE); /* can't move the window */ - MBOX(menubox)->parent_menuitem = NULL; /* without parent */ /* set children */ jmenubox_set_menu(menubox, menu); @@ -264,12 +315,16 @@ void jmenu_popup(JWidget menu, int x, int y) MID(0, y, JI_SCREEN_H-jrect_h(window->rc))); /* set the focus to the new menubox */ -/* jmanager_set_focus(menubox); */ + jmanager_set_focus(menubox); jwidget_magnetic(menubox, TRUE); /* open the window */ jwindow_open_fg(window); + /* selected menu item */ +/* selected = base->selected_menuitem; */ + + /* free focus */ jmanager_free_focus(); /* fetch the "menu" */ @@ -278,19 +333,30 @@ void jmenu_popup(JWidget menu, int x, int y) /* destroy the window */ jwidget_free(window); - was_clicked = FALSE; - current_level = 0; - internal_msg = 0; - /* emit signal */ - if(emitter_menuitem) - emit_signal(emitter_menuitem); +/* if (selected) */ +/* exe_menuitem(selected); */ } static bool menu_msg_proc(JWidget widget, JMessage msg) { switch (msg->type) { + case JM_DESTROY: + assert(MENU(widget) != NULL); + + if (MENU(widget)->menuitem) { + if (MITEM(MENU(widget)->menuitem)->submenu == widget) { + MITEM(MENU(widget)->menuitem)->submenu = NULL; + } + else { + assert(MITEM(MENU(widget)->menuitem)->submenu == NULL); + } + } + + jfree(MENU(widget)); + break; + case JM_REQSIZE: menu_request_size(widget, &msg->reqsize.w, &msg->reqsize.h); return TRUE; @@ -316,10 +382,10 @@ static void menu_request_size(JWidget widget, int *w, int *h) if (widget->parent->type == JI_MENUBAR) { *w += req_w + ((link->next != widget->children->end) ? widget->child_spacing: 0); - *h = MAX (*h, req_h); + *h = MAX(*h, req_h); } else { - *w = MAX (*w, req_w); + *w = MAX(*w, req_w); *h += req_h + ((link->next != widget->children->end) ? widget->child_spacing: 0); } @@ -362,14 +428,26 @@ static void menu_set_position(JWidget widget, JRect rect) static bool menubox_msg_proc(JWidget widget, JMessage msg) { - MenuBox *menubox = MBOX(widget); - int open_immediatly = FALSE; + JWidget menu = jmenubox_get_menu(widget); switch (msg->type) { - case JM_DESTROY: + case JM_DESTROY: { + MenuBox *menubox = jwidget_get_data(widget, JI_MENUBOX); + assert(menubox != NULL); + + if (menubox->base != NULL && + menubox->base->is_filtering) { + menubox->base->is_filtering = FALSE; + jmanager_remove_msg_filter(JM_BUTTONPRESSED, widget); + } + + if (menubox->base) + jfree(menubox->base); + jfree(menubox); break; + } case JM_REQSIZE: menubox_request_size(widget, &msg->reqsize.w, &msg->reqsize.h); @@ -381,399 +459,264 @@ static bool menubox_msg_proc(JWidget widget, JMessage msg) case JM_MOTION: /* isn't pressing a button? */ - if (!msg->mouse.flags && !was_clicked) + if (!msg->mouse.flags && !get_base(widget)->was_clicked) break; + /* fall through */ + case JM_BUTTONPRESSED: - if (!(internal_msg & (DO_GOTOBAR | DO_GOTODEST))) - open_immediatly = TRUE; - - case JM_FOCUSENTER: - if (jmanager_get_capture() && - jmanager_get_capture() != widget) - break; - - if (HAS_MENU(menubox)) { + if (menu) { JWidget picked; - /* in mouse-motion or button-pressed */ - if (msg->type != JM_FOCUSENTER) { - picked = jwidget_pick(menubox->menu, - msg->mouse.x, msg->mouse.y); - } - /* when focus enter */ - else { - /* in menu-bar */ - if (widget->type == JI_MENUBAR) { - /* there isn't highlight? */ - if (!get_highlight(menubox->menu)) { - /* highlight the first menu-item */ - picked = (JWidget)jlist_first(menubox->menu->children)->data; - } - else - return FALSE; /* we don't need to change the highlight */ + /* here we catch the filtered messages (menu-bar or the popuped + menu-box) to detect if the user press outside of the widget */ + if (msg->type == JM_BUTTONPRESSED + && MBOX(widget)->base != NULL) { + JWidget picked = jwidget_pick(ji_get_default_manager(), + msg->mouse.x, msg->mouse.y); + + /* if one of these conditions are accomplished we have to + close all menus (back to menu-bar or close the popuped menubox), + this is the place where we control if */ + if (picked == NULL || /* if the button was clicked nowhere */ + picked == widget || /* if the button was clicked in this menubox */ + /* the picked widget isn't menu-related */ + (picked->type != JI_MENUBOX && + picked->type != JI_MENUBAR && + picked->type != JI_MENUITEM) || + /* the picked widget (that is menu-related) isn't from the + same tree of menus */ + (get_base_menubox(picked) != widget)) { + + /* the user click outside all the menu-box/menu-items, close all */ + close_all(menu); + return TRUE; } - else - return FALSE; } + /* get the widget below the mouse cursor */ + picked = jwidget_pick(menu, msg->mouse.x, msg->mouse.y); if (picked) { - if (!(picked->flags & JI_DISABLED) && - picked->type == JI_MENUITEM) { - set_highlight(menubox->menu, picked); - - if (open_immediatly) { - was_clicked = TRUE; - open_menuitem(picked, FALSE); - } + if ((picked->type == JI_MENUITEM) && + !(picked->flags & JI_DISABLED) && + !MITEM(picked)->highlight) { + set_highlight(menu, picked, FALSE, TRUE, FALSE); } - else { - unhighlight(menubox->menu); + else if (!get_base(widget)->was_clicked) { + unhighlight(menu); } } } break; - case JM_FOCUSLEAVE: - if (jmanager_get_capture() && - jmanager_get_capture() != widget) - break; - - if (HAS_MENU(menubox)) { - JWidget highlight = get_highlight(menubox->menu); - - if ((highlight) && (!MITEM(highlight)->opened)) - unhighlight(menubox->menu); - } - break; - case JM_MOUSELEAVE: - if (jmanager_get_capture() && - jmanager_get_capture() != widget) - break; + if (menu) { + JWidget highlight = get_highlight(menu); - if (HAS_MENU(menubox)) { - JWidget highlight = get_highlight(menubox->menu); - - if ((highlight) && (!MITEM(highlight)->opened)) - unhighlight(menubox->menu); + if ((highlight) && (!MITEM(highlight)->submenu_menubox)) + unhighlight(menu); } break; case JM_BUTTONRELEASED: - if (jmanager_get_capture() && - jmanager_get_capture() != widget) - break; + if (menu) { + JWidget highlight = get_highlight(menu); - if (HAS_MENU(menubox)) { - JWidget highlight = get_highlight(menubox->menu); - - if ((highlight) && (!MITEM(highlight)->opened)) { - unhighlight(menubox->menu); - emit_signal(highlight); - was_clicked = FALSE; - - /* if (menubox->parent_menuitem) */ - internal_msg |= DO_GOTOBAR; + /* the item is highlighted and not opened */ + if ((highlight) && (!MITEM(highlight)->submenu_menubox)) { + close_all(menu); + exe_menuitem(highlight); } } break; case JM_CHAR: - if (jmanager_get_capture() && - jmanager_get_capture() != widget) - break; + get_base(widget)->was_clicked = FALSE; - /* there is an internal message waiting? */ - if (internal_msg) - break; - - was_clicked = FALSE; - - if (HAS_MENU(menubox)) { + if (menu) { JWidget selected; /* check for ALT+some letter in menubar and some letter in menuboxes */ if (((widget->type == JI_MENUBOX) && (!msg->any.shifts)) || ((widget->type == JI_MENUBAR) && (msg->any.shifts & KB_ALT_FLAG))) { - selected = check_for_letter(menubox->menu, - scancode_to_ascii(msg->key.scancode)); + selected = check_for_letter(menu, scancode_to_ascii(msg->key.scancode)); if (selected) { - set_highlight(menubox->menu, selected); - - if (HAS_SUBMENU(selected)) - open_menuitem(selected, TRUE); - else { - emit_signal(selected); - - /* if (menubox->parent_menuitem) */ - internal_msg |= DO_GOTOBAR; - } + set_highlight(menu, selected, TRUE, TRUE, TRUE); return TRUE; } } - /* only in menu-bars */ +#if 0 /* TODO check this for jinete-tests */ + /* only in menu-bars... */ if (widget->type == JI_MENUBAR) { - /* check for accelerators */ - selected = check_for_accel (menubox->menu, msg); + /* ...check for accelerators */ + selected = check_for_accel(menubox->menu, msg); if (selected) { - emit_signal (selected); - - /* if this is not the main menu, go to bar (this happend if - we press a keyboard shortcut when we have open a - sub-menu) */ - /* if (menubox->parent_menuitem) */ - internal_msg |= DO_GOTOBAR; - + close_all(menu); + exe_menuitem(selected); return TRUE; } } +#endif /* highlight movement with keyboard */ - if (jwidget_has_focus (widget)) { - JWidget highlight = get_highlight (menubox->menu); - int open_item = FALSE; + if (jwidget_has_focus(widget)) { + JWidget highlight = get_highlight(menu); + JWidget child; + JWidget child_with_submenu_opened = NULL; + JLink link; + bool used = FALSE; + /* search a child with highlight or the submenu opened */ + JI_LIST_FOR_EACH(menu->children, link) { + child = (JWidget)link->data; + + if (child->type != JI_MENUITEM) + continue; + + if (MITEM(child)->submenu_menubox) + child_with_submenu_opened = child; + } + + if (!highlight && child_with_submenu_opened) + highlight = child_with_submenu_opened; + switch (msg->key.scancode) { case KEY_ESC: - /* in menu-bar */ + /* in menu-bar */ if (widget->type == JI_MENUBAR) { - /* fetch the focus */ - jmanager_free_focus (); - return TRUE; - } - /* in menu-boxes */ - else { - /* go to parent */ - if (menubox->parent_menuitem) { - /* just retrogress one parent-level */ - jwidget_close_window (widget); + if (highlight) { + close_all(menu); + + /* fetch the focus */ + jmanager_free_focus(); + used = TRUE; } - } + } + /* in menu-boxes */ + else { + if (child_with_submenu_opened) { + close_menuitem(child_with_submenu_opened); + used = TRUE; + } + /* go to parent */ + else if (MENU(menu)->menuitem) { + /* just retrogress one parent-level */ + close_menuitem(MENU(menu)->menuitem); + used = TRUE; + } + } break; case KEY_UP: /* in menu-bar */ if (widget->type == JI_MENUBAR) { - /* do nothing */ + if (child_with_submenu_opened) + close_menuitem(child_with_submenu_opened); } /* in menu-boxes */ else { /* go to previous */ - highlight = find_previtem (menubox->menu, highlight); + highlight = find_previtem(menu, highlight); + set_highlight(menu, highlight, FALSE, FALSE, FALSE); } + used = TRUE; break; case KEY_DOWN: /* in menu-bar */ if (widget->type == JI_MENUBAR) { /* select the active menu */ - open_item = TRUE; + set_highlight(menu, highlight, TRUE, TRUE, TRUE); } /* in menu-boxes */ else { /* go to next */ - highlight = find_nextitem (menubox->menu, highlight); + highlight = find_nextitem(menu, highlight); + set_highlight(menu, highlight, FALSE, FALSE, FALSE); } + used = TRUE; break; case KEY_LEFT: /* in menu-bar */ if (widget->type == JI_MENUBAR) { /* go to previous */ - highlight = find_previtem (menubox->menu, highlight); + highlight = find_previtem(menu, highlight); + set_highlight(menu, highlight, FALSE, FALSE, FALSE); } /* in menu-boxes */ else { /* go to parent */ - if (menubox->parent_menuitem) { + if (MENU(menu)->menuitem) { JWidget menuitem; - JWidget parent = menubox->parent_menuitem->parent->parent; + JWidget parent = MENU(menu)->menuitem->parent->parent; /* go to the previous item in the parent */ /* if the parent is the menu-bar */ if (parent->type == JI_MENUBAR) { - menuitem = find_previtem - (MBOX (parent)->menu, - get_highlight (MBOX (parent)->menu)); + menu = jmenubox_get_menu(parent); + menuitem = find_previtem(menu, get_highlight(menu)); /* go to previous item in the parent */ - dest_menubox = parent; - dest_menuitem = menuitem; - dest_selectfirst = TRUE; - - internal_msg |= DO_GOTODEST; + set_highlight(menu, menuitem, FALSE, TRUE, TRUE); } /* if the parent isn't the menu-bar */ else { /* just retrogress one parent-level */ - jwidget_close_window (widget); + close_menuitem(MENU(menu)->menuitem); } } } + used = TRUE; break; case KEY_RIGHT: /* in menu-bar */ if (widget->type == JI_MENUBAR) { /* go to next */ - highlight = find_nextitem (menubox->menu, highlight); + highlight = find_nextitem(menu, highlight); + set_highlight(menu, highlight, FALSE, FALSE, FALSE); } /* in menu-boxes */ else { /* enter in sub-menu */ - if ((highlight) && HAS_SUBMENU (highlight)) { - open_item = TRUE; + if ((highlight) && HAS_SUBMENU(highlight)) { + set_highlight(menu, highlight, TRUE, TRUE, TRUE); } /* go to parent */ - else if (menubox->parent_menuitem) { + else if (MENU(menu)->menuitem) { JWidget root, menuitem; /* get the root menu */ - for (root=widget; - MBOX (root)->parent_menuitem; - root=MBOX (root)->parent_menuitem->parent->parent); + root = get_base_menubox(widget); + menu = jmenubox_get_menu(root); /* go to the next item in the root */ - menuitem = find_nextitem - (MBOX (root)->menu, - get_highlight (MBOX (root)->menu)); + menuitem = find_nextitem(menu, get_highlight(menu)); /* open the sub-menu */ - dest_menubox = root; - dest_menuitem = menuitem; - dest_selectfirst = TRUE; - - internal_msg |= DO_GOTODEST; + set_highlight(menu, menuitem, FALSE, TRUE, TRUE); } } + used = TRUE; break; case KEY_ENTER: case KEY_ENTER_PAD: - open_item = TRUE; + if (highlight) + set_highlight(menu, highlight, TRUE, TRUE, TRUE); + used = TRUE; break; - - default: - return FALSE; } - set_highlight(menubox->menu, highlight); - - if (open_item && highlight) { - if (HAS_SUBMENU (highlight)) - open_menuitem (highlight, TRUE); - else { - emit_signal (highlight); - - /* if (menubox->parent_menuitem) */ - internal_msg |= DO_GOTOBAR; - } - } - - return TRUE; + return used; } } break; - case JM_IDLE: - if (jmanager_get_capture () && - jmanager_get_capture () != widget) - break; - - /* goto destination */ - if (internal_msg & DO_GOTODEST) { - if (dest_menubox == widget) { - dest_menubox = NULL; - internal_msg ^= DO_GOTODEST; - - /* printf (" ENTRY IN (%d)\n", widget->id); */ - - if (dest_menuitem) { - /* printf (" OPEN MENU (%d)\n", dest_menuitem->id); */ - - set_highlight(menubox->menu, dest_menuitem); - open_menuitem(dest_menuitem, dest_selectfirst); - } - /********************************************************************************/ - } - else { - /* printf (" CLOSING (%d)\n", widget->id); */ - jwidget_close_window (widget); - } - return TRUE; - } - - /* a menubox created by open_menuitem() */ -/* if (menubox->parent_menuitem) { */ - if (widget->type == JI_MENUBAR) { - /* goto bar */ - if (internal_msg & DO_GOTOBAR) { - internal_msg ^= DO_GOTOBAR; - } - } - else if (widget->type == JI_MENUBOX) { - /* goto bar */ - if (internal_msg & DO_GOTOBAR) { - jwidget_close_window (widget); - break; - } - - /* mouse outside the box? */ - if (!MOUSE_IN (widget->rc)) { - /* control button press outside the menubox */ - if (jmouse_b(0) || was_clicked) { - JWidget picked_menubox = widget; - JWidget open_menubox = NULL; - JWidget picked = pick_menuitem (&picked_menubox, &open_menubox); - -/* printf ("CLICK OUTSIDE (%d): %d %d %d\n", */ -/* widget->id, */ -/* picked ? picked->id: 0, */ -/* picked_menubox ? picked_menubox->id: 0, */ -/* open_menubox ? open_menubox->id: 0); */ - - if (picked && jwidget_is_enabled (picked)) { -/* if (open_menubox != widget) { */ -/* dest_menubox = open_menubox; */ -/* dest_menuitem = NULL; */ -/* dest_selectfirst = FALSE; */ -/* was_clicked = TRUE; */ - -/* internal_msg |= DO_GOTODEST; */ -/* printf ("GO TO MENUBOX: %d\n", dest_menubox->id); */ -/* } */ - - if (MBOX (open_menubox)->parent_menuitem != picked) { - dest_menubox = picked_menubox; - dest_menuitem = picked; - dest_selectfirst = FALSE; - was_clicked = TRUE; - - internal_msg |= DO_GOTODEST; - /* printf ("GO TO MENUITEM: %d %d\n", dest_menubox->id, dest_menuitem->id); */ - } - } - } - - /* control button-released outside menubox */ - if ((!jmouse_b(0)) && (jmouse_b(1))) { - JWidget picked = - jwidget_pick - (menubox->parent_menuitem ? - menubox->parent_menuitem->parent: menubox->menu, - msg->mouse.x, msg->mouse.y); - - if ((!picked) || (menubox->parent_menuitem && - menubox->parent_menuitem != picked)) - internal_msg |= DO_GOTOBAR; - } - } - } - break; } return FALSE; @@ -781,10 +724,10 @@ static bool menubox_msg_proc(JWidget widget, JMessage msg) static void menubox_request_size(JWidget widget, int *w, int *h) { - MenuBox *menubox = MBOX (widget); + JWidget menu = jmenubox_get_menu(widget); - if (menubox->menu) - jwidget_request_size (menubox->menu, w, h); + if (menu) + jwidget_request_size(menu, w, h); else *w = *h = 0; @@ -794,23 +737,25 @@ static void menubox_request_size(JWidget widget, int *w, int *h) static void menubox_set_position(JWidget widget, JRect rect) { - MenuBox *menubox = MBOX (widget); + JWidget menu = jmenubox_get_menu(widget); jrect_copy(widget->rc, rect); - if (menubox->menu) { + if (menu) { JRect cpos = jwidget_get_child_rect(widget); - jwidget_set_rect(menubox->menu, cpos); + jwidget_set_rect(menu, cpos); jrect_free(cpos); } } static bool menuitem_msg_proc(JWidget widget, JMessage msg) { + MenuItem *menuitem = MITEM(widget); + switch (msg->type) { - case JM_DESTROY: { - MenuItem *menuitem = MITEM(widget); + case JM_DESTROY: + assert(menuitem != NULL); if (menuitem->accel) jaccel_free(menuitem->accel); @@ -820,7 +765,6 @@ static bool menuitem_msg_proc(JWidget widget, JMessage msg) jfree(menuitem); break; - } case JM_REQSIZE: menuitem_request_size(widget, &msg->reqsize.w, &msg->reqsize.h); @@ -831,6 +775,149 @@ static bool menuitem_msg_proc(JWidget widget, JMessage msg) /* TODO theme specific!! */ jwidget_dirty(widget); break; + + default: + if (msg->type == JM_OPEN_MENUITEM) { + /* has submenu */ + if (HAS_SUBMENU(widget)) { + JWidget window, menubox; + JRect pos, old_pos; + bool select_first = msg->user.a; + + old_pos = jwidget_get_rect(widget->parent->parent); + + /* new window and new menu-box */ + window = jwindow_new(NULL); + menubox = jmenubox_new(); + + menuitem->submenu_menubox = menubox; + + jwindow_moveable(window, FALSE); /* can't move the window */ + + /* set children */ + jmenubox_set_menu(menubox, menuitem->submenu); + jwidget_add_child(window, menubox); + + jwindow_remap(window); + + /* menubox position */ + pos = jwidget_get_rect(window); + + if (widget->parent->parent->type == JI_MENUBAR) { + jrect_moveto(pos, + MID(0, widget->rc->x1, JI_SCREEN_W-jrect_w(pos)), + MID(0, widget->rc->y2, JI_SCREEN_H-jrect_h(pos))); + } + else { + int x_left = widget->rc->x1-jrect_w(pos); + int x_right = widget->rc->x2; + int x, y = widget->rc->y1; + struct jrect r1, r2; + int s1, s2; + + r1.x1 = x_left = MID(0, x_left, JI_SCREEN_W-jrect_w(pos)); + r2.x1 = x_right = MID(0, x_right, JI_SCREEN_W-jrect_w(pos)); + + r1.y1 = r2.y1 = y = MID(0, y, JI_SCREEN_H-jrect_h(pos)); + + r1.x2 = r1.x1+jrect_w(pos); + r1.y2 = r1.y1+jrect_h(pos); + r2.x2 = r2.x1+jrect_w(pos); + r2.y2 = r2.y1+jrect_h(pos); + + /* calculate both intersections */ + s1 = jrect_intersect(&r1, old_pos); + s2 = jrect_intersect(&r2, old_pos); + + if (!s2) + x = x_right; /* use the right because there aren't + intersection with it */ + else if (!s1) + x = x_left; /* use the left because there are not + intersection */ + else if (jrect_w(&r2)*jrect_h(&r2) <= jrect_w(&r1)*jrect_h(&r1)) + x = x_right; /* use the right because there are less + intersection area */ + else + x = x_left; /* use the left because there are less + intersection area */ + + jrect_moveto(pos, x, y); + } + + jwindow_position(window, pos->x1, pos->y1); + jrect_free(pos); + + /* set the focus to the new menubox */ + jwidget_magnetic(menubox, TRUE); + + /* setup the highlight of the new menubox */ + if (select_first) { + /* select the first child */ + JWidget child, first_child = NULL; + JLink link; + + JI_LIST_FOR_EACH(menuitem->submenu->children, link) { + child = (JWidget)link->data; + + if (child->type != JI_MENUITEM) + continue; + + if (jwidget_is_enabled(child)) { + first_child = child; + break; + } + } + + if (first_child) + set_highlight(menuitem->submenu, first_child, FALSE, FALSE, FALSE); + else + unhighlight(menuitem->submenu); + } + else + unhighlight(menuitem->submenu); + + /* run in background */ + jwindow_open_bg(window); + + jrect_free(old_pos); + } + + return TRUE; + } + else if (msg->type == JM_CLOSE_MENUITEM) { + JWidget menubox, window; + + menubox = menuitem->submenu_menubox; + menuitem->submenu_menubox = NULL; + + assert(menubox != NULL); + + window = menubox->parent; + assert(window && window->type == JI_WINDOW); + + /* set the focus to this menu-item */ + jmanager_set_focus(widget->parent->parent); + + /* fetch the "menu" to avoid free it with 'jwidget_free()' */ + jmenubox_set_menu(menubox, NULL); + + /* destroy the window */ + jwindow_close(window, NULL); + + /* isn't necessary to free this window because it's + automatically destroyed by the manager + ... jwidget_free(window); + */ + + return TRUE; + } + else if (msg->type == JM_EXE_MENUITEM) { + jwidget_emit_signal(widget, JI_SIGNAL_MENUITEM_SELECT); + return TRUE; + } + break; + } return FALSE; @@ -864,6 +951,62 @@ static void menuitem_request_size(JWidget widget, int *w, int *h) } } +/** + * Clims the hierarchy of menus to get the 'base' of the most-top + * menubox. + */ +static JWidget get_base_menubox(JWidget widget) +{ + while (widget != NULL) { + assert_valid_widget(widget); + + /* we are in a menubox */ + if (widget->type == JI_MENUBOX || widget->type == JI_MENUBAR) { + if (MBOX(widget)->base != NULL) { + return widget; + } + else { + JWidget menu = jmenubox_get_menu(widget); + + assert(menu != NULL); + assert(MENU(menu)->menuitem != NULL); + + widget = MENU(menu)->menuitem; + } + } + /* we are in a menuitem */ + else { + assert(widget->type == JI_MENUITEM); + assert(widget->parent != NULL); + assert(widget->parent->type == JI_MENU); + + widget = widget->parent->parent; + } + } + + assert(FALSE); + return NULL; +} + +static Base *get_base(JWidget widget) +{ + widget = get_base_menubox(widget); + return MBOX(widget)->base; +} + +static Base *create_base(JWidget widget) +{ + Base *base = jnew(Base, 1); + + base->was_clicked = FALSE; + base->is_filtering = FALSE; + base->current_level = 0; + + MBOX(widget)->base = base; + + return base; +} + static JWidget get_highlight(JWidget menu) { JWidget child; @@ -882,198 +1025,187 @@ static JWidget get_highlight(JWidget menu) return NULL; } -static void set_highlight(JWidget menu, JWidget menuitem) +static void set_highlight(JWidget menu, JWidget menuitem, bool click, bool open_submenu, bool select_first_child) { JWidget child; JLink link; - + + /* find the menuitem with the highlight */ JI_LIST_FOR_EACH(menu->children, link) { child = (JWidget)link->data; if (child->type != JI_MENUITEM) continue; - if (MITEM(child)->highlight) { - if (child == menuitem) { - menuitem = NULL; - continue; + if (child != menuitem) { + /* is it? */ + if (MITEM(child)->highlight) { + MITEM(child)->highlight = FALSE; + jwidget_dirty(child); } - - MITEM(child)->highlight = FALSE; - jwidget_dirty(child); } } if (menuitem) { - MITEM(menuitem)->highlight = TRUE; - jwidget_dirty(menuitem); + if (!MITEM(menuitem)->highlight) { + MITEM(menuitem)->highlight = TRUE; + jwidget_dirty(menuitem); + } + + /* highlight parents */ + if (MENU(menu)->menuitem != NULL) { + set_highlight(MENU(menu)->menuitem->parent, + MENU(menu)->menuitem, FALSE, FALSE, FALSE); + } + + /* open submenu of the menitem */ + if (HAS_SUBMENU(menuitem)) { + if (open_submenu) { + /* if the submenu is closed, open it */ + if (MITEM(menuitem)->submenu_menubox == NULL) + open_menuitem(menuitem, select_first_child); + + /* the mouse was clicked */ + get_base(menuitem)->was_clicked = TRUE; + } + } + /* execute menuitem action */ + else if (click) { + close_all(menu); + exe_menuitem(menuitem); + } } } static void unhighlight(JWidget menu) { - set_highlight(menu, NULL); + set_highlight(menu, NULL, FALSE, FALSE, FALSE); } static void open_menuitem(JWidget menuitem, bool select_first) { - static struct jrect menubox_pos; - bool first_one = current_level == 0 ? TRUE: FALSE; - JRect pos, old_pos; + JWidget menu; + JWidget child; + JMessage msg; + JLink link; + Base *base; - if (first_one) - old_pos = jwidget_get_rect(menuitem->parent->parent); - else - old_pos = jrect_new_copy(&menubox_pos); + assert_valid_widget(menuitem); + assert(HAS_SUBMENU(menuitem)); -/* printf ("ENTER current_level=%d\n", current_level); */ - current_level++; + menu = menuitem->parent; - if (HAS_SUBMENU(menuitem)) { - JWidget window, menubox; + /* the menu item is already opened? */ + assert(MITEM(menuitem)->submenu_menubox == NULL); - MITEM(menuitem)->opened = TRUE; /* activate "opened" flag in the - menuitem */ - /* TODO */ -/* jwidget_flush_redraw (menuitem); /\* redraw the menuitem (the */ -/* highlight could be change) *\/ */ + assert_valid_widget(menu); - /* new window and new menu-box */ - window = jwindow_new(NULL); - menubox = jmenubox_new(); + /* close all siblings of 'menuitem' */ + if (menu->parent) { + JI_LIST_FOR_EACH(menu->children, link) { + child = link->data; - /* created_windows = jlist_prepend (created_windows, window); */ + if (child->type != JI_MENUITEM) + continue; - jwindow_moveable(window, FALSE); /* can't move the window */ - MBOX(menubox)->parent_menuitem = menuitem; /* menuitem parent */ - - /* set children */ - jmenubox_set_menu(menubox, MITEM(menuitem)->submenu); - jwidget_add_child(window, menubox); - - jwindow_remap(window); - - /* menubox position */ - pos = jwidget_get_rect (window); - - if (menuitem->parent->parent->type == JI_MENUBAR) { - jrect_moveto(pos, - MID(0, menuitem->rc->x1, JI_SCREEN_W-jrect_w(pos)), - MID(0, menuitem->rc->y2, JI_SCREEN_H-jrect_h(pos))); - } - else { - int x_left = menuitem->rc->x1-jrect_w(pos); - int x_right = menuitem->rc->x2; - int x, y = menuitem->rc->y1; - struct jrect r1, r2; - int s1, s2; - - r1.x1 = x_left = MID (0, x_left, JI_SCREEN_W-jrect_w(pos)); - r2.x1 = x_right = MID (0, x_right, JI_SCREEN_W-jrect_w(pos)); - - r1.y1 = r2.y1 = y = MID (0, y, JI_SCREEN_H-jrect_h(pos)); - - r1.x2 = r1.x1+jrect_w(pos); - r1.y2 = r1.y1+jrect_h(pos); - r2.x2 = r2.x1+jrect_w(pos); - r2.y2 = r2.y1+jrect_h(pos); - - /* calculate both intersections */ - s1 = jrect_intersect (&r1, old_pos); - s2 = jrect_intersect (&r2, old_pos); - - if (!s2) - x = x_right; /* use the right because there aren't - intersection with it */ - else if (!s1) - x = x_left; /* use the left because there are not - intersection */ - else if (jrect_w(&r2)*jrect_h(&r2) <= jrect_w(&r1)*jrect_h(&r1)) - x = x_right; /* use the right because there are less - intersection area */ - else - x = x_left; /* use the left because there are less - intersection area */ - - jrect_moveto (pos, x, y); - } - - jrect_copy (&menubox_pos, pos); - jwindow_position (window, pos->x1, pos->y1); - jrect_free (pos); - - /* set the focus to the new menubox */ - /* jmanager_set_focus (menubox); */ - jwidget_magnetic (menubox, TRUE); - - /* setup the highlight of the new menubox */ - if (select_first) - /* TODO */ -/* set_highlight(menubox, */ - set_highlight(MBOX(menubox)->menu, - jlist_first(MBOX(menubox)->menu->children)->data); - else - unhighlight(MBOX(menubox)->menu); - - /* run in foreground */ -/* { */ -/* static int tab = 0; */ -/* int c; */ -/* for (c=0; cid); */ -/* tab++; */ - jwindow_open_fg(window); -/* tab--; */ -/* for (c=0; cid); */ -/* } */ - - /* menuitem isn't "opened" anymore */ - MITEM(menuitem)->opened = FALSE; - - if (internal_msg & DO_GOTOBAR) { - /* final */ - if (first_one) { - /* TODO this isn't necessary */ -/* internal_msg ^= DO_GOTOBAR; */ - was_clicked = FALSE; + if (child != menuitem && MITEM(child)->submenu_menubox) { + close_menuitem(child); } - - jmanager_free_focus(); - unhighlight(menuitem->parent); } - else { - /* set the focus to the old menubox */ - jmanager_set_focus(menuitem->parent->parent); - set_highlight(menuitem->parent, menuitem); - } - - /* fetch the "menu" */ - jmenubox_set_menu(menubox, NULL); - - /* destroy the window */ - jwidget_free (window); } - jrect_copy (&menubox_pos, old_pos); - jrect_free (old_pos); + msg = jmessage_new(JM_OPEN_MENUITEM); + msg->user.a = select_first; + jmessage_add_dest(msg, menuitem); + jmanager_enqueue_message(msg); - current_level--; -/* printf ("EXIT current_level=%d\n", current_level); */ - - /* emit signal */ - if (emitter_menuitem) { - emit_signal (emitter_menuitem); - was_clicked = FALSE; + /* we need to add a filter of the JM_BUTTONPRESSED to intercept + clicks outside the menu (and close all the hierarchy in that + case); the widget to intercept messages is the base menu-bar or + popuped menu-box */ + base = get_base(menuitem); + if (!base->is_filtering) { + base->is_filtering = TRUE; + jmanager_add_msg_filter(JM_BUTTONPRESSED, + get_base_menubox(menuitem)); } } -static void emit_signal(JWidget menuitem) +static void close_menuitem(JWidget menuitem) { - emitter_menuitem = menuitem; + JWidget menu, child; + JMessage msg; + JLink link; - if (!current_level) { - jwidget_emit_signal (emitter_menuitem, JI_SIGNAL_MENUITEM_SELECT); - emitter_menuitem = NULL; + assert_valid_widget(menuitem); + assert(MITEM(menuitem)->submenu_menubox != NULL); + + /* first: recursively close the children */ + menu = jmenubox_get_menu(MITEM(menuitem)->submenu_menubox); + assert(menu != NULL); + + JI_LIST_FOR_EACH(menu->children, link) { + child = link->data; + + if (child->type != JI_MENUITEM) + continue; + + if (MITEM(child)->submenu_menubox) { + close_menuitem(link->data); + } } + + /* second: now we can close the 'menuitem' */ + msg = jmessage_new(JM_CLOSE_MENUITEM); + jmessage_add_dest(msg, menuitem); + jmanager_enqueue_message(msg); +} + +static void close_all(JWidget menu) +{ + JWidget menuitem = NULL; + JLink link; + Base *base; + + assert(menu != NULL); + + while (MENU(menu)->menuitem != NULL) { + menuitem = MENU(menu)->menuitem; + menu = menuitem->parent; + } + + base = get_base(menu->parent); + base->was_clicked = FALSE; + if (base->is_filtering) { + base->is_filtering = FALSE; + jmanager_remove_msg_filter(JM_BUTTONPRESSED, + get_base_menubox(menu->parent)); + } + + unhighlight(menu); + + if (menuitem != NULL) { + if (MITEM(menuitem)->submenu_menubox != NULL) + close_menuitem(menuitem); + } + else { + JI_LIST_FOR_EACH(menu->children, link) { + menuitem = link->data; + + if (menuitem->type != JI_MENUITEM) + continue; + + if (MITEM(menuitem)->submenu_menubox != NULL) + close_menuitem(menuitem); + } + } +} + +static void exe_menuitem(JWidget menuitem) +{ + JMessage msg = jmessage_new(JM_EXE_MENUITEM); + jmessage_add_dest(msg, menuitem); + jmanager_enqueue_message(msg); } static JWidget check_for_letter(JWidget menu, int ascii) @@ -1084,6 +1216,10 @@ static JWidget check_for_letter(JWidget menu, int ascii) JI_LIST_FOR_EACH(menu->children, link) { menuitem = (JWidget)link->data; + + if (menuitem->type != JI_MENUITEM) + continue; + if (menuitem->text) for (c=0; menuitem->text[c]; c++) if ((menuitem->text[c] == '&') && (menuitem->text[c+1] != '&')) @@ -1122,33 +1258,6 @@ static JWidget check_for_accel(JWidget menu, JMessage msg) return NULL; } -/* returns the widget (of JI_MENUITEM type) in the mouse position, or - NULL if there aren't nothing */ -static JWidget pick_menuitem(JWidget *_menubox, JWidget *open_menubox) -{ - JWidget menubox = *_menubox; - JWidget picked = NULL; - - for (;;) { - if (MOUSE_IN(menubox->rc)) { - *_menubox = menubox; - picked = jwidget_pick(MBOX(menubox)->menu, - jmouse_x(0), jmouse_y(0)); - if (picked->type != JI_MENUITEM) - picked = NULL; - break; - } - else if (MBOX(menubox)->parent_menuitem) { - *open_menubox = menubox; - menubox = MBOX(menubox)->parent_menuitem->parent->parent; - } - else - break; - } - - return picked; -} - /* finds the next item of `menuitem', if `menuitem' is NULL searchs from the first item in `menu' */ static JWidget find_nextitem(JWidget menu, JWidget menuitem) diff --git a/src/jinete/jmenu.h b/src/jinete/jmenu.h index c2667720f..5197b07c6 100644 --- a/src/jinete/jmenu.h +++ b/src/jinete/jmenu.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jmessage.c b/src/jinete/jmessage.c index acc7c0ed1..4b3124a36 100644 --- a/src/jinete/jmessage.c +++ b/src/jinete/jmessage.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ #include #include +#include #include "jinete/jlist.h" #include "jinete/jmanager.h" @@ -38,6 +39,13 @@ #include "jinete/jrect.h" #include "jinete/jwidget.h" +static int registered_messages = JM_REGISTERED_MESSAGES; + +int ji_register_message_type(void) +{ + return registered_messages++; +} + JMessage jmessage_new(int type) { JMessage msg; @@ -66,6 +74,8 @@ JMessage jmessage_new_copy(const JMessage msg) { JMessage copy; + assert(msg != NULL); + copy = jnew(union jmessage, 1); if (!copy) return NULL; @@ -82,6 +92,8 @@ JMessage jmessage_new_copy(const JMessage msg) void jmessage_free(JMessage msg) { + assert(msg != NULL); + if (msg->any.sub_msg) jmessage_free(msg->any.sub_msg); @@ -91,13 +103,27 @@ void jmessage_free(JMessage msg) void jmessage_add_dest(JMessage msg, JWidget widget) { + assert(msg != NULL); + assert_valid_widget(widget); + jlist_append(msg->any.widgets, widget); } +void jmessage_add_pre_dest(JMessage msg, JWidget widget) +{ + assert(msg != NULL); + assert_valid_widget(widget); + + jlist_prepend(msg->any.widgets, widget); +} + void jmessage_broadcast_to_children(JMessage msg, JWidget widget) { JLink link; + assert(msg != NULL); + assert_valid_widget(widget); + JI_LIST_FOR_EACH(widget->children, link) jmessage_broadcast_to_children(msg, link->data); @@ -106,6 +132,9 @@ void jmessage_broadcast_to_children(JMessage msg, JWidget widget) void jmessage_broadcast_to_parents(JMessage msg, JWidget widget) { + assert(msg != NULL); + assert_valid_widget(widget); + if (widget && widget->type != JI_MANAGER) { jmessage_add_dest(msg, widget); jmessage_broadcast_to_parents(msg, jwidget_get_parent(widget)); @@ -114,6 +143,8 @@ void jmessage_broadcast_to_parents(JMessage msg, JWidget widget) void jmessage_set_sub_msg(JMessage msg, JMessage sub_msg) { + assert(msg != NULL); + if (msg->any.sub_msg) jmessage_free(msg->any.sub_msg); diff --git a/src/jinete/jmessage.h b/src/jinete/jmessage.h index 4cbe9fb7d..e367776e2 100644 --- a/src/jinete/jmessage.h +++ b/src/jinete/jmessage.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,6 +37,16 @@ JI_BEGIN_DECLS +/* TODO add mutexes */ +#define JM_MESSAGE(name) \ + static int _jm_##name = 0; \ + static int jm_##name() \ + { \ + if (!_jm_##name) \ + _jm_##name = ji_register_message_type(); \ + return _jm_##name; \ + } \ + struct jmessage_any { int type; /* type of message */ @@ -77,6 +87,12 @@ struct jmessage_signal JWidget from; /* signal generator */ }; +struct jmessage_timer +{ + struct jmessage_any any; + int timer_id; /* number of timer */ +}; + struct jmessage_setpos { struct jmessage_any any; @@ -95,6 +111,13 @@ struct jmessage_drawrgn JRegion region; /* region to redraw */ }; +struct jmessage_user +{ + struct jmessage_any any; + int a, b, c; + void *dp; +}; + union jmessage { int type; @@ -103,16 +126,21 @@ union jmessage struct jmessage_draw draw; struct jmessage_mouse mouse; struct jmessage_signal signal; + struct jmessage_timer timer; struct jmessage_setpos setpos; struct jmessage_reqsize reqsize; struct jmessage_drawrgn drawrgn; + struct jmessage_user user; }; +int ji_register_message_type(void); + JMessage jmessage_new(int type); JMessage jmessage_new_copy(const JMessage msg); void jmessage_free(JMessage msg); void jmessage_add_dest(JMessage msg, JWidget widget); +void jmessage_add_pre_dest(JMessage msg, JWidget widget); void jmessage_broadcast_to_children(JMessage msg, JWidget widget); void jmessage_broadcast_to_parents(JMessage msg, JWidget widget); diff --git a/src/jinete/jpanel.c b/src/jinete/jpanel.c index fdd0b9153..45385f943 100644 --- a/src/jinete/jpanel.c +++ b/src/jinete/jpanel.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jpanel.h b/src/jinete/jpanel.h index ad5dbcb6b..253b6d824 100644 --- a/src/jinete/jpanel.h +++ b/src/jinete/jpanel.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jquickmenu.c b/src/jinete/jquickmenu.c index 39555d88b..ab564f622 100644 --- a/src/jinete/jquickmenu.c +++ b/src/jinete/jquickmenu.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jquickmenu.h b/src/jinete/jquickmenu.h index b00ca74e9..f10283115 100644 --- a/src/jinete/jquickmenu.h +++ b/src/jinete/jquickmenu.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jrect.c b/src/jinete/jrect.c index 978e451bd..61f270e36 100644 --- a/src/jinete/jrect.c +++ b/src/jinete/jrect.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jrect.h b/src/jinete/jrect.h index e78ea92c7..3f6c350ac 100644 --- a/src/jinete/jrect.h +++ b/src/jinete/jrect.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jregion.h b/src/jinete/jregion.h index 8cb5f337e..2d1718b03 100644 --- a/src/jinete/jregion.h +++ b/src/jinete/jregion.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jscroll.h b/src/jinete/jscroll.h index 913adde8d..840d22861 100644 --- a/src/jinete/jscroll.h +++ b/src/jinete/jscroll.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jsep.c b/src/jinete/jsep.c index 12cafdcec..350cda9dc 100644 --- a/src/jinete/jsep.c +++ b/src/jinete/jsep.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jsep.h b/src/jinete/jsep.h index 9187635ee..94b936668 100644 --- a/src/jinete/jsep.h +++ b/src/jinete/jsep.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jslider.c b/src/jinete/jslider.c index 175b58e7e..548507956 100644 --- a/src/jinete/jslider.c +++ b/src/jinete/jslider.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jslider.h b/src/jinete/jslider.h index cd1ed3d5d..5c52f5d93 100644 --- a/src/jinete/jslider.h +++ b/src/jinete/jslider.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jstream.c b/src/jinete/jstream.c index b2c446425..cc918b62c 100644 --- a/src/jinete/jstream.c +++ b/src/jinete/jstream.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2007 David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jstream.h b/src/jinete/jstream.h index 89e23bc9f..91e6e407c 100644 --- a/src/jinete/jstream.h +++ b/src/jinete/jstream.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2007 David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jsystem.c b/src/jinete/jsystem.c index f4db53753..d545c6256 100644 --- a/src/jinete/jsystem.c +++ b/src/jinete/jsystem.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,6 +63,10 @@ static BITMAP *sprite_cursor = NULL; static int focus_x; static int focus_y; +static BITMAP *covered_area = NULL; +static int covered_area_x; +static int covered_area_y; + /* Mouse information (button and position). */ static volatile int m_b[2]; @@ -73,19 +77,15 @@ static int m_z[2]; static bool moved; static int mouse_scares = 0; -/* For double click management. */ - -static volatile int click_clock = 0; -static volatile int click_level = JI_CLICK_NOT; -static volatile int click_mouse_b = 0; - /* Local routines. */ static void set_cursor(BITMAP *bmp, int x, int y); static void clock_inc(void); -static void check_click(void); static void update_mouse_position(void); +static void capture_covered_area(void); +static void restore_covered_area(void); + static void clock_inc(void) { ji_clock++; @@ -93,55 +93,6 @@ static void clock_inc(void) END_OF_STATIC_FUNCTION(clock_inc); -/* Based on "dclick_check" from allegro/src/gui.c. */ - -static void check_click(void) -{ - /* Waiting mouse released... */ - if (click_level == JI_CLICK_START) { - /* The button was released. */ - if (!m_b[0]) { - click_clock = 0; - click_level = JI_CLICK_RELEASE; - } - /* The button continue pressed. */ - else { - /* Does mouse button change? */ - if (click_mouse_b != m_b[0]) { - /* Start again with this new button. */ - click_clock = 0; - click_level = JI_CLICK_START; - click_mouse_b = m_b[0]; - } - else - click_clock++; - } - } - /* Waiting second mouse click... */ - else if (click_level == JI_CLICK_RELEASE) { - /* The button is pressed again. */ - if (m_b[0]) { - /* Is the same button? */ - if (m_b[0] == click_mouse_b) { - click_level = JI_CLICK_AGAIN; - } - /* If it's other button, start again with this one. */ - else { - click_clock = 0; - click_level = JI_CLICK_START; - click_mouse_b = m_b[0]; - } - } - else - click_clock++; - } - - if (click_clock > 10) - click_level = JI_CLICK_NOT; -} - -END_OF_STATIC_FUNCTION(check_click); - static void set_cursor(BITMAP *bmp, int x, int y) { sprite_cursor = bmp; @@ -160,14 +111,9 @@ int _ji_system_init(void) /* Install timer related stuff. */ LOCK_VARIABLE(ji_clock); LOCK_VARIABLE(m_b); - LOCK_VARIABLE(click_clock); - LOCK_VARIABLE(click_level); - LOCK_VARIABLE(click_mouse_b); LOCK_FUNCTION(clock_inc); - LOCK_FUNCTION(check_click); - if ((install_int_ex(clock_inc, BPS_TO_TIMER(JI_TICKS_PER_SEC)) < 0) || - (install_int(check_click, 20) < 0)) + if (install_int_ex(clock_inc, BPS_TO_TIMER(1000)) < 0) return -1; jmouse_poll(); @@ -182,7 +128,6 @@ void _ji_system_exit(void) { ji_set_screen(NULL); - remove_int(check_click); remove_int(clock_inc); } @@ -276,7 +221,7 @@ void ji_flip_rect(JRect rect) } } -void ji_set_translation_hook(const char *(*gettext) (const char *msgid)) +void ji_set_translation_hook(const char *(*gettext)(const char *msgid)) { strings_hook = gettext; } @@ -284,7 +229,7 @@ void ji_set_translation_hook(const char *(*gettext) (const char *msgid)) const char *ji_translate_string(const char *msgid) { if (strings_hook) - return (*strings_hook) (msgid); + return (*strings_hook)(msgid); else return msgid; } @@ -329,6 +274,7 @@ int jmouse_set_cursor(int type) */ void jmouse_draw_cursor() { +#if 0 if (sprite_cursor != NULL && mouse_scares == 0) { int x = m_x[0]-focus_x; int y = m_y[0]-focus_y; @@ -345,33 +291,57 @@ void jmouse_draw_cursor() jrect_free(rect); } +#endif + + if (sprite_cursor != NULL && mouse_scares == 0) { + int x = m_x[0]-focus_x; + int y = m_y[0]-focus_y; + + restore_covered_area(); + capture_covered_area(); + + draw_sprite(ji_screen, sprite_cursor, x, y); + + if (ji_dirty_region) { + JRect rect = jrect_new(x, y, + x+sprite_cursor->w, + y+sprite_cursor->h); + ji_add_dirty_rect(rect); + jrect_free(rect); + } + } } void jmouse_hide() { - ASSERT(mouse_scares >= 0); + assert(mouse_scares >= 0); + if (ji_screen == screen) scare_mouse(); + else if (mouse_scares == 0) + restore_covered_area(); + mouse_scares++; } void jmouse_show() { - ASSERT(mouse_scares > 0); + assert(mouse_scares > 0); mouse_scares--; + if (ji_screen == screen) unscare_mouse(); } bool jmouse_is_hidden() { - ASSERT(mouse_scares >= 0); + assert(mouse_scares >= 0); return mouse_scares > 0; } bool jmouse_is_shown() { - ASSERT(mouse_scares >= 0); + assert(mouse_scares >= 0); return mouse_scares == 0; } @@ -458,25 +428,6 @@ bool jmouse_control_infinite_scroll(JRect rect) return FALSE; } -int jmouse_get_click_button(void) -{ - return click_mouse_b; -} - -int jmouse_get_click_level(void) -{ - return click_level; -} - -void jmouse_set_click_level(int level) -{ - click_level = level; - if (level == JI_CLICK_START) { - click_clock = 0; - click_mouse_b = m_b[0]; - } -} - static void update_mouse_position(void) { if (ji_screen == screen) { @@ -528,3 +479,29 @@ static void update_mouse_position(void) #endif } +static void capture_covered_area(void) +{ + if (sprite_cursor != NULL && mouse_scares == 0) { + assert(covered_area == NULL); + + covered_area = create_bitmap(sprite_cursor->w, sprite_cursor->h); + covered_area_x = m_x[0]-focus_x; + covered_area_y = m_y[0]-focus_y; + + blit(ji_screen, covered_area, + covered_area_x, covered_area_y, 0, 0, + covered_area->w, covered_area->h); + } +} + +static void restore_covered_area(void) +{ + if (covered_area != NULL) { + blit(covered_area, ji_screen, + 0, 0, covered_area_x, covered_area_y, + covered_area->w, covered_area->h); + + destroy_bitmap(covered_area); + covered_area = NULL; + } +} diff --git a/src/jinete/jsystem.h b/src/jinete/jsystem.h index e705ebb81..49f0f0e45 100644 --- a/src/jinete/jsystem.h +++ b/src/jinete/jsystem.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,20 +63,11 @@ const char *ji_translate_string(const char *msgid); /***********************************************************************/ /* timer related */ -#define JI_TICKS_PER_SEC 1024 - -extern int volatile ji_clock; +extern int volatile ji_clock; /* in milliseconds */ /***********************************************************************/ /* mouse related */ -enum { - JI_CLICK_NOT, - JI_CLICK_START, - JI_CLICK_RELEASE, - JI_CLICK_AGAIN, -}; - enum { JI_CURSOR_NULL, JI_CURSOR_NORMAL, @@ -114,10 +105,6 @@ int jmouse_z(int antique); bool jmouse_control_infinite_scroll(JRect rect); -int jmouse_get_click_button(void); -int jmouse_get_click_level(void); -void jmouse_set_click_level(int level); - JI_END_DECLS #endif /* JINETE_SYSTEM_H */ diff --git a/src/jinete/jtextbox.c b/src/jinete/jtextbox.c index e074b9b58..17b796ee5 100644 --- a/src/jinete/jtextbox.c +++ b/src/jinete/jtextbox.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jtextbox.h b/src/jinete/jtextbox.h index 52003ea57..01f634974 100644 --- a/src/jinete/jtextbox.h +++ b/src/jinete/jtextbox.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jtheme.c b/src/jinete/jtheme.c index da6f02dce..a5a56fd5c 100644 --- a/src/jinete/jtheme.c +++ b/src/jinete/jtheme.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jtheme.h b/src/jinete/jtheme.h index 08ab73322..4547c3807 100644 --- a/src/jinete/jtheme.h +++ b/src/jinete/jtheme.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jview.c b/src/jinete/jview.c index 767fe7d25..5d4efbecf 100644 --- a/src/jinete/jview.c +++ b/src/jinete/jview.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jview.h b/src/jinete/jview.h index 7c276d539..6137c08b7 100644 --- a/src/jinete/jview.h +++ b/src/jinete/jview.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jwidget.c b/src/jinete/jwidget.c index 013ce2c8f..5611857f1 100644 --- a/src/jinete/jwidget.c +++ b/src/jinete/jwidget.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ /* #define REPORT_SIGNALS */ +#include #include #include #include @@ -46,9 +47,9 @@ #include "jinete/jinete.h" #include "jinete/jintern.h" -static bool widget_msg_proc (JWidget widget, JMessage msg); - -int ji_register_widget_type (void) +static bool widget_msg_proc(JWidget widget, JMessage msg); + +int ji_register_widget_type(void) { static int type = JI_USER_WIDGET; return type++; @@ -101,7 +102,7 @@ JWidget jwidget_new(int type) widget->user_data[2] = NULL; widget->user_data[3] = NULL; - jwidget_add_hook (widget, JI_WIDGET, widget_msg_proc, NULL); + jwidget_add_hook(widget, JI_WIDGET, widget_msg_proc, NULL); return widget; } @@ -111,6 +112,8 @@ void jwidget_free(JWidget widget) JLink link, next; JMessage msg; + assert_valid_widget(widget); + /* send destroy message */ msg = jmessage_new(JM_DESTROY); jwidget_send_message(widget, msg); @@ -122,7 +125,7 @@ void jwidget_free(JWidget widget) /* remove from parent */ if (widget->parent) - jwidget_remove_child (widget->parent, widget); + jwidget_remove_child(widget->parent, widget); /* remove children */ JI_LIST_FOR_EACH_SAFE(widget->children, link, next) { @@ -159,6 +162,8 @@ void jwidget_free(JWidget widget) void jwidget_init_theme(JWidget widget) { + assert_valid_widget(widget); + if (widget->theme) { if (!widget->draw_method) widget->draw_method = jtheme_get_method(widget->theme, widget->draw_type); @@ -173,7 +178,7 @@ void jwidget_init_theme(JWidget widget) } } } - + /**********************************************************************/ /* HOOKS */ @@ -185,8 +190,11 @@ void jwidget_init_theme(JWidget widget) void jwidget_add_hook(JWidget widget, int type, JMessageFunc msg_proc, void *data) { - JHook hook = jhook_new(); + JHook hook; + assert_valid_widget(widget); + + hook = jhook_new(); hook->type = type; hook->msg_proc = msg_proc; hook->data = data; @@ -200,6 +208,8 @@ void jwidget_add_hook(JWidget widget, int type, JHook jwidget_get_hook(JWidget widget, int type) { JLink link; + assert_valid_widget(widget); + JI_LIST_FOR_EACH(widget->hooks, link) { if (((JHook)link->data)->type == type) return ((JHook)link->data); @@ -213,55 +223,73 @@ JHook jwidget_get_hook(JWidget widget, int type) void *jwidget_get_data(JWidget widget, int type) { JLink link; + assert_valid_widget(widget); + JI_LIST_FOR_EACH(widget->hooks, link) { if (((JHook)link->data)->type == type) return ((JHook)link->data)->data; } + return NULL; } void _jwidget_add_hook(JWidget widget, JHook hook) { + assert_valid_widget(widget); + jlist_prepend(widget->hooks, hook); } void _jwidget_remove_hook(JWidget widget, JHook hook) { + assert_valid_widget(widget); + jlist_remove(widget->hooks, hook); } - /**********************************************************************/ /* main properties */ int jwidget_get_type(JWidget widget) { + assert_valid_widget(widget); + return widget->type; } const char *jwidget_get_name(JWidget widget) { + assert_valid_widget(widget); + return widget->name; } const char *jwidget_get_text(JWidget widget) { + assert_valid_widget(widget); + jwidget_emit_signal(widget, JI_SIGNAL_GET_TEXT); return widget->text; } int jwidget_get_align(JWidget widget) { + assert_valid_widget(widget); + return widget->align; } FONT *jwidget_get_font(JWidget widget) { + assert_valid_widget(widget); + return widget->text_font; } void jwidget_set_name(JWidget widget, const char *name) { + assert_valid_widget(widget); + if (widget->name) jfree (widget->name); @@ -270,6 +298,8 @@ void jwidget_set_name(JWidget widget, const char *name) void jwidget_set_text(JWidget widget, const char *text) { + assert_valid_widget(widget); + if (text) { /* more space needed */ if (!widget->text || widget->text_size < strlen (text)+1) { @@ -297,6 +327,8 @@ void jwidget_set_text(JWidget widget, const char *text) void jwidget_set_align(JWidget widget, int align) { + assert_valid_widget(widget); + widget->align = align; jwidget_dirty (widget); @@ -304,6 +336,8 @@ void jwidget_set_align(JWidget widget, int align) void jwidget_set_font(JWidget widget, FONT *font) { + assert_valid_widget(widget); + widget->text_font = font; if (widget->text && widget->text_font) @@ -315,12 +349,13 @@ void jwidget_set_font(JWidget widget, FONT *font) jwidget_dirty (widget); } - /**********************************************************************/ /* behavior properties */ void jwidget_magnetic(JWidget widget, bool state) { + assert_valid_widget(widget); + if (state) widget->flags |= JI_MAGNETIC; else @@ -329,6 +364,8 @@ void jwidget_magnetic(JWidget widget, bool state) void jwidget_expansive(JWidget widget, bool state) { + assert_valid_widget(widget); + if (state) widget->flags |= JI_EXPANSIVE; else @@ -337,6 +374,8 @@ void jwidget_expansive(JWidget widget, bool state) void jwidget_decorative(JWidget widget, bool state) { + assert_valid_widget(widget); + if (state) widget->flags |= JI_DECORATIVE; else @@ -347,6 +386,8 @@ void jwidget_autodestroy(JWidget widget, bool state) { JLink link; + assert_valid_widget(widget); + if (state) widget->flags |= JI_AUTODESTROY; else @@ -358,6 +399,8 @@ void jwidget_autodestroy(JWidget widget, bool state) void jwidget_focusrest(JWidget widget, bool state) { + assert_valid_widget(widget); + if (state) widget->flags |= JI_FOCUSREST; else @@ -366,34 +409,46 @@ void jwidget_focusrest(JWidget widget, bool state) bool jwidget_is_magnetic(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_MAGNETIC) ? TRUE: FALSE; } bool jwidget_is_expansive(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_EXPANSIVE) ? TRUE: FALSE; } bool jwidget_is_decorative(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_DECORATIVE) ? TRUE: FALSE; } bool jwidget_is_autodestroy(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_AUTODESTROY) ? TRUE: FALSE; } bool jwidget_is_focusrest(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_FOCUSREST) ? TRUE: FALSE; } - + /**********************************************************************/ /* status properties */ void jwidget_dirty(JWidget widget) { + assert_valid_widget(widget); + #if 0 /* is visible? */ if (jwidget_is_visible (widget)) { @@ -410,12 +465,14 @@ void jwidget_dirty(JWidget widget) jwidget_emit_signal (widget, JI_SIGNAL_DIRTY); } #else - jwidget_invalidate (widget); + jwidget_invalidate(widget); #endif } void jwidget_show(JWidget widget) { + assert_valid_widget(widget); + if (widget->flags & JI_HIDDEN) { widget->flags &= ~JI_HIDDEN; @@ -426,6 +483,8 @@ void jwidget_show(JWidget widget) void jwidget_hide(JWidget widget) { + assert_valid_widget(widget); + if (!(widget->flags & JI_HIDDEN)) { jmanager_free_widget (widget); /* free from mananger */ @@ -436,6 +495,8 @@ void jwidget_hide(JWidget widget) void jwidget_enable(JWidget widget) { + assert_valid_widget(widget); + if (widget->flags & JI_DISABLED) { widget->flags &= ~JI_DISABLED; jwidget_dirty (widget); @@ -446,6 +507,8 @@ void jwidget_enable(JWidget widget) void jwidget_disable(JWidget widget) { + assert_valid_widget(widget); + if (!(widget->flags & JI_DISABLED)) { jmanager_free_widget (widget); /* free from the manager */ @@ -458,6 +521,8 @@ void jwidget_disable(JWidget widget) void jwidget_select(JWidget widget) { + assert_valid_widget(widget); + if (!(widget->flags & JI_SELECTED)) { widget->flags |= JI_SELECTED; jwidget_dirty (widget); @@ -468,6 +533,8 @@ void jwidget_select(JWidget widget) void jwidget_deselect(JWidget widget) { + assert_valid_widget(widget); + if (widget->flags & JI_SELECTED) { widget->flags &= ~JI_SELECTED; jwidget_dirty (widget); @@ -478,11 +545,15 @@ void jwidget_deselect(JWidget widget) bool jwidget_is_visible(JWidget widget) { + assert_valid_widget(widget); + return !(jwidget_is_hidden(widget)); } bool jwidget_is_hidden(JWidget widget) { + assert_valid_widget(widget); + do { if (widget->flags & JI_HIDDEN) return TRUE; @@ -495,11 +566,15 @@ bool jwidget_is_hidden(JWidget widget) bool jwidget_is_enabled(JWidget widget) { + assert_valid_widget(widget); + return !(jwidget_is_disabled(widget)); } bool jwidget_is_disabled(JWidget widget) { + assert_valid_widget(widget); + do { if (widget->flags & JI_DISABLED) return TRUE; @@ -512,37 +587,50 @@ bool jwidget_is_disabled(JWidget widget) bool jwidget_is_selected(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_SELECTED) ? TRUE: FALSE; } bool jwidget_is_deselected(JWidget widget) { - return !(jwidget_is_selected (widget)); + assert_valid_widget(widget); + + return !(jwidget_is_selected(widget)); } - + /**********************************************************************/ /* properties with manager */ bool jwidget_has_focus(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_HASFOCUS) ? TRUE: FALSE; } bool jwidget_has_mouse(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_HASMOUSE) ? TRUE: FALSE; } bool jwidget_has_capture(JWidget widget) { + assert_valid_widget(widget); + return (widget->flags & JI_HASCAPTURE) ? TRUE: FALSE; } - + /**********************************************************************/ /* children handle */ void jwidget_add_child(JWidget widget, JWidget child) { + assert_valid_widget(widget); + assert_valid_widget(child); + jlist_append(widget->children, child); child->parent = widget; @@ -555,6 +643,8 @@ void jwidget_add_childs(JWidget widget, ...) JWidget child; va_list ap; + assert_valid_widget(widget); + va_start(ap, widget); while ((child = va_arg(ap, JWidget))) @@ -565,6 +655,9 @@ void jwidget_add_childs(JWidget widget, ...) void jwidget_remove_child(JWidget widget, JWidget child) { + assert_valid_widget(widget); + assert_valid_widget(child); + jlist_remove(widget->children, child); child->parent = NULL; @@ -576,6 +669,10 @@ void jwidget_replace_child(JWidget widget, JWidget old_child, JWidget new_child) { JLink before; + assert_valid_widget(widget); + assert_valid_widget(old_child); + assert_valid_widget(new_child); + before = jlist_find(widget->children, old_child); if (!before) return; @@ -589,19 +686,23 @@ void jwidget_replace_child(JWidget widget, JWidget old_child, JWidget new_child) jwidget_emit_signal(new_child, JI_SIGNAL_NEW_PARENT); jwidget_emit_signal(widget, JI_SIGNAL_ADD_CHILD); } - + /**********************************************************************/ /* parents and children */ /* gets the widget parent */ JWidget jwidget_get_parent(JWidget widget) { + assert_valid_widget(widget); + return widget->parent; } /* get the parent window */ JWidget jwidget_get_window(JWidget widget) { + assert_valid_widget(widget); + while (widget) { if (widget->type == JI_WINDOW) return widget; @@ -614,6 +715,8 @@ JWidget jwidget_get_window(JWidget widget) JWidget jwidget_get_manager(JWidget widget) { + assert_valid_widget(widget); + while (widget) { if (widget->type == JI_MANAGER) return widget; @@ -631,6 +734,8 @@ JList jwidget_get_parents(JWidget widget, bool ascendant) { JList list = jlist_new(); + assert_valid_widget(widget); + for (; widget; widget=widget->parent) { /* append parents in tail */ if (ascendant) @@ -646,6 +751,8 @@ JList jwidget_get_parents(JWidget widget, bool ascendant) /* returns a list of children (you must free the list) */ JList jwidget_get_children(JWidget widget) { + assert_valid_widget(widget); + return jlist_copy(widget->children); } @@ -654,6 +761,8 @@ JWidget jwidget_pick(JWidget widget, int x, int y) JWidget inside, picked = NULL; JLink link; + assert_valid_widget(widget); + if (!(widget->flags & JI_HIDDEN) && /* is visible */ jrect_point_in(widget->rc, x, y)) { /* the point is inside the bounds */ picked = widget; @@ -672,15 +781,22 @@ JWidget jwidget_pick(JWidget widget, int x, int y) bool jwidget_has_child(JWidget widget, JWidget child) { + assert_valid_widget(widget); + assert_valid_widget(child); + return jlist_find(widget->children, child) != widget->children->end ? TRUE: FALSE; } - + /**********************************************************************/ /* position and geometry */ void jwidget_request_size(JWidget widget, int *w, int *h) { - JMessage msg = jmessage_new(JM_REQSIZE); + JMessage msg; + + assert_valid_widget(widget); + + msg = jmessage_new(JM_REQSIZE); jwidget_send_message(widget, msg); *w = MID(widget->min_w, msg->reqsize.w, widget->max_w); *h = MID(widget->min_h, msg->reqsize.h, widget->max_h); @@ -690,12 +806,16 @@ void jwidget_request_size(JWidget widget, int *w, int *h) /* gets the position of the widget */ JRect jwidget_get_rect(JWidget widget) { + assert_valid_widget(widget); + return jrect_new_copy(widget->rc); } /* gets the position for children of the widget */ JRect jwidget_get_child_rect(JWidget widget) { + assert_valid_widget(widget); + return jrect_new(widget->rc->x1 + widget->border_width.l, widget->rc->y1 + widget->border_width.t, widget->rc->x2 - widget->border_width.r, @@ -706,6 +826,8 @@ JRegion jwidget_get_region(JWidget widget) { JRegion region; + assert_valid_widget(widget); + if ((widget->type == JI_WINDOW) && (widget->theme->get_window_mask)) region = (*widget->theme->get_window_mask)(widget); else @@ -717,13 +839,16 @@ JRegion jwidget_get_region(JWidget widget) /* gets the region to be able to draw in */ JRegion jwidget_get_drawable_region(JWidget widget, int flags) { - JRegion region = jwidget_get_region (widget); + JRegion region, reg1, reg2, reg3; JWidget window, manager, view; - JRegion reg1, reg2, reg3; JList windows_list; JLink link; JRect cpos; + assert_valid_widget(widget); + + region = jwidget_get_region(widget); + /* cut the top windows areas */ if (flags & JI_GDR_CUTTOPWINDOWS) { window = jwidget_get_window(widget); @@ -830,6 +955,8 @@ JRegion jwidget_get_drawable_region(JWidget widget, int flags) int jwidget_get_bg_color(JWidget widget) { + assert_valid_widget(widget); + if (widget->bg_color < 0 && widget->parent) return jwidget_get_bg_color (widget->parent); else @@ -838,6 +965,8 @@ int jwidget_get_bg_color(JWidget widget) JTheme jwidget_get_theme(JWidget widget) { + assert_valid_widget(widget); + return widget->theme; } @@ -852,7 +981,9 @@ int jwidget_get_text_length(JWidget widget) int jwidget_get_text_height(JWidget widget) { - return text_height (widget->text_font); + assert_valid_widget(widget); + + return text_height(widget->text_font); } void jwidget_get_texticon_info(JWidget widget, @@ -870,6 +1001,8 @@ void jwidget_get_texticon_info(JWidget widget, int box_x, box_y, box_w, box_h, icon_x, icon_y; int text_x, text_y, text_w, text_h; + assert_valid_widget(widget); + text_x = text_y = 0; /* size of the text */ @@ -951,9 +1084,9 @@ void jwidget_get_texticon_info(JWidget widget, icon_y = box_y; } - SETRECT (box); - SETRECT (text); - SETRECT (icon); + SETRECT(box); + SETRECT(text); + SETRECT(icon); } void jwidget_noborders(JWidget widget) @@ -964,51 +1097,65 @@ void jwidget_noborders(JWidget widget) widget->border_width.b = 0; widget->child_spacing = 0; - jwidget_dirty (widget); + jwidget_dirty(widget); } void jwidget_set_border(JWidget widget, int l, int t, int r, int b) { + assert_valid_widget(widget); + widget->border_width.l = l; widget->border_width.t = t; widget->border_width.r = r; widget->border_width.b = b; - jwidget_dirty (widget); + jwidget_dirty(widget); } void jwidget_set_rect(JWidget widget, JRect rect) { - JMessage msg = jmessage_new (JM_SETPOS); - jrect_copy (&msg->setpos.rect, rect); - jwidget_send_message (widget, msg); - jmessage_free (msg); + JMessage msg; + + assert_valid_widget(widget); + + msg = jmessage_new(JM_SETPOS); + jrect_copy(&msg->setpos.rect, rect); + jwidget_send_message(widget, msg); + jmessage_free(msg); } void jwidget_set_min_size(JWidget widget, int w, int h) { + assert_valid_widget(widget); + widget->min_w = w; widget->min_h = h; } void jwidget_set_max_size(JWidget widget, int w, int h) { + assert_valid_widget(widget); + widget->max_w = w; widget->max_h = h; } void jwidget_set_bg_color(JWidget widget, int color) { + assert_valid_widget(widget); + widget->bg_color = color; } void jwidget_set_theme(JWidget widget, JTheme theme) { + assert_valid_widget(widget); + widget->theme = theme; /* TODO mmhhh... maybe some JStyle in JWidget should be great */ widget->text_font = widget->theme ? widget->theme->default_font: NULL; } - + /**********************************************************************/ /* drawing methods */ @@ -1019,7 +1166,9 @@ void jwidget_flush_redraw(JWidget widget) JLink link; JRect rc; - nrects = JI_REGION_NUM_RECTS (widget->update_region); + assert_valid_widget(widget); + + nrects = JI_REGION_NUM_RECTS(widget->update_region); if (nrects > 0) { /* get areas to draw */ JRegion region = jwidget_get_drawable_region(widget, JI_GDR_CUTTOPWINDOWS); @@ -1029,22 +1178,20 @@ void jwidget_flush_redraw(JWidget widget) nrects = JI_REGION_NUM_RECTS(widget->update_region); - /* create the draw message */ - msg = jmessage_new(JM_DRAW); - msg->draw.count = nrects; - jmessage_add_dest(msg, widget); - /* draw the widget */ for (c=0, rc=JI_REGION_RECTS(widget->update_region); cdraw.count--; + /* create the draw message */ + msg = jmessage_new(JM_DRAW); + msg->draw.count = nrects-1 - c; msg->draw.rect = *rc; + jmessage_add_dest(msg, widget); + + /* enqueue the draw message */ jmanager_enqueue_message(msg); } - jmessage_free(msg); jregion_empty(widget->update_region); } @@ -1054,6 +1201,8 @@ void jwidget_flush_redraw(JWidget widget) void jwidget_redraw_region(JWidget widget, const JRegion region) { + assert_valid_widget(widget); + if (jwidget_is_visible(widget)) { #if 1 JMessage msg = jmessage_new(JM_DRAWRGN); @@ -1068,6 +1217,8 @@ void jwidget_redraw_region(JWidget widget, const JRegion region) void jwidget_invalidate(JWidget widget) { + assert_valid_widget(widget); + if (jwidget_is_visible(widget)) { JRegion reg1 = jwidget_get_drawable_region(widget, JI_GDR_CUTTOPWINDOWS); JLink link; @@ -1082,6 +1233,8 @@ void jwidget_invalidate(JWidget widget) void jwidget_invalidate_rect(JWidget widget, const JRect rect) { + assert_valid_widget(widget); + if (jwidget_is_visible(widget)) { JRegion reg1 = jregion_new(rect, 1); jwidget_invalidate_region(widget, reg1); @@ -1091,6 +1244,8 @@ void jwidget_invalidate_rect(JWidget widget, const JRect rect) void jwidget_invalidate_region(JWidget widget, const JRegion region) { + assert_valid_widget(widget); + if (jwidget_is_visible(widget) && jregion_rect_in(region, widget->rc) != JI_RGNOUT) { JRegion reg1 = jregion_new(NULL, 0); @@ -1114,11 +1269,15 @@ void jwidget_invalidate_region(JWidget widget, const JRegion region) void jwidget_scroll(JWidget widget, int dx, int dy, const JRect rect, JRegion update_region) { - JRegion reg1 = jwidget_get_drawable_region(widget, - JI_GDR_CUTTOPWINDOWS | - JI_GDR_USECHILDAREA); - JRegion reg2 = jregion_new(rect, 0); + JRegion reg1, reg2; + assert_valid_widget(widget); + + reg1 = jwidget_get_drawable_region(widget, + JI_GDR_CUTTOPWINDOWS | + JI_GDR_USECHILDAREA); + reg2 = jregion_new(rect, 0); + jregion_intersect(reg1, reg1, reg2); jregion_copy(reg2, reg1); @@ -1149,22 +1308,27 @@ void jwidget_scroll(JWidget widget, int dx, int dy, const JRect rect, jregion_free(reg2); } - /**********************************************************************/ /* signal handle */ void jwidget_signal_on(JWidget widget) { + assert_valid_widget(widget); + widget->emit_signals--; } void jwidget_signal_off(JWidget widget) { + assert_valid_widget(widget); + widget->emit_signals++; } int jwidget_emit_signal(JWidget widget, int signal_num) { + assert_valid_widget(widget); + if (!widget->emit_signals) { JMessage msg; int ret; @@ -1192,7 +1356,7 @@ int jwidget_emit_signal(JWidget widget, int signal_num) else return 0; } - + /**********************************************************************/ /* manager handler */ @@ -1209,6 +1373,9 @@ bool jwidget_send_message(JWidget widget, JMessage msg) JHook hook; JLink link; + assert_valid_widget(widget); + assert(msg != NULL); + JI_LIST_FOR_EACH(widget->hooks, link) { hook = link->data; SENDMSG(); @@ -1224,6 +1391,9 @@ bool jwidget_send_message_after_type(JWidget widget, JMessage msg, int type) JHook hook; JLink link; + assert_valid_widget(widget); + assert(msg != NULL); + JI_LIST_FOR_EACH(widget->hooks, link) { hook = link->data; @@ -1242,13 +1412,19 @@ bool jwidget_send_message_after_type(JWidget widget, JMessage msg, int type) void jwidget_close_window(JWidget widget) { - JWidget window = jwidget_get_window(widget); + JWidget window; + + assert_valid_widget(widget); + + window = jwidget_get_window(widget); if (window) jwindow_close(window, widget); } void jwidget_capture_mouse(JWidget widget) { + assert_valid_widget(widget); + if (!jmanager_get_capture()) { jmanager_set_capture(widget); @@ -1259,6 +1435,8 @@ void jwidget_capture_mouse(JWidget widget) void jwidget_hard_capture_mouse(JWidget widget) { + assert_valid_widget(widget); + if (!jmanager_get_capture()) { jmanager_set_capture(widget); #ifdef ALLEGRO_WINDOWS @@ -1272,6 +1450,8 @@ void jwidget_hard_capture_mouse(JWidget widget) void jwidget_release_mouse(JWidget widget) { + assert_valid_widget(widget); + if (jmanager_get_capture() == widget) { jmanager_free_capture(); #ifdef ALLEGRO_WINDOWS @@ -1281,7 +1461,7 @@ void jwidget_release_mouse(JWidget widget) widget->flags &= ~JI_HARDCAPTURE; } } - + /**********************************************************************/ /* miscellaneous */ @@ -1290,6 +1470,8 @@ JWidget jwidget_find_name(JWidget widget, const char *name) JWidget child; JLink link; + assert_valid_widget(widget); + JI_LIST_FOR_EACH(widget->children, link) { child = (JWidget)link->data; if (child->name && strcmp(child->name, name) == 0) @@ -1308,6 +1490,8 @@ bool jwidget_check_underscored(JWidget widget, int scancode) { int c, ascii; + assert_valid_widget(widget); + ascii = 0; if (scancode >= KEY_0 && scancode <= KEY_9) ascii = '0' + (scancode - KEY_0); @@ -1325,12 +1509,14 @@ bool jwidget_check_underscored(JWidget widget, int scancode) return FALSE; } - + /**********************************************************************/ /* widget message procedure */ -static bool widget_msg_proc (JWidget widget, JMessage msg) +static bool widget_msg_proc(JWidget widget, JMessage msg) { + assert_valid_widget(widget); + switch (msg->type) { case JM_DRAW: @@ -1368,6 +1554,7 @@ static bool widget_msg_proc (JWidget widget, JMessage msg) JMessage msg2; JRect rect; JLink link; + int count; for (it=msg->drawrgn.region->rects; it; it=it->next) { rect = it->data; @@ -1385,20 +1572,20 @@ static bool widget_msg_proc (JWidget widget, JMessage msg) region2 = jwidget_get_drawable_region (widget, 0); jregion_intersect2 (region2, msg->drawrgn.region); - /* create the draw message */ - msg2 = jmessage_new (JM_DRAW); - msg2->draw.count = jlist_length (region2->rects); - jmessage_add_dest (msg2, widget); - /* draw the widget */ + count = jlist_length(region2->rects); for (it=region2->rects; it; it=it->next) { - msg2->draw.count--; + /* create the draw message */ + msg2 = jmessage_new(JM_DRAW); + msg2->draw.count = --count; jrect_copy(&msg2->draw.rect, (JRect)it->data); + jmessage_add_dest(msg2, widget); + + /* enqueue message */ jmanager_enqueue_message(msg2); } - jmessage_free (msg2); - jregion_free (region2); + jregion_free(region2); /* send message to children */ JI_LIST_FOR_EACH(widget->children, link) diff --git a/src/jinete/jwidget.h b/src/jinete/jwidget.h index 9465ee247..319747bce 100644 --- a/src/jinete/jwidget.h +++ b/src/jinete/jwidget.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,6 +34,14 @@ #include "jinete/jbase.h" +#ifndef NDEBUG +#include "jinete/jintern.h" +#define assert_valid_widget(widget) assert((widget) != NULL && \ + _ji_is_valid_widget((widget))) +#else +#define assert_valid_widget(widget) ((void)0) +#endif + JI_BEGIN_DECLS struct FONT; diff --git a/src/jinete/jwindow.c b/src/jinete/jwindow.c index 75e7b892a..3755a6aa0 100644 --- a/src/jinete/jwindow.c +++ b/src/jinete/jwindow.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -181,9 +181,9 @@ void jwindow_open(JWidget widget) Window *window = jwidget_get_data (widget, JI_WINDOW); if (window->is_autoremap) - jwindow_center (widget); + jwindow_center(widget); - _jmanager_open_window (ji_get_default_manager (), widget); + _jmanager_open_window(ji_get_default_manager(), widget); } } @@ -623,7 +623,6 @@ static void move_window(JWidget widget, JRect rect, bool use_blit) msg = jmessage_new(JM_WINMOVE); jmessage_broadcast_to_children(msg, widget); jmanager_enqueue_message(msg); - jmessage_free(msg); old_reg = jwidget_get_region (widget); old_drawable_region = jwidget_get_drawable_region (widget, FLAGS); diff --git a/src/jinete/jwindow.h b/src/jinete/jwindow.h index 92a85d63c..fd6732b5a 100644 --- a/src/jinete/jwindow.h +++ b/src/jinete/jwindow.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jxml.c b/src/jinete/jxml.c index dc8a3aa38..0e1692a1f 100644 --- a/src/jinete/jxml.c +++ b/src/jinete/jxml.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2007 David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/jxml.h b/src/jinete/jxml.h index a6c518ae5..57492e13d 100644 --- a/src/jinete/jxml.h +++ b/src/jinete/jxml.h @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2007 David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/jinete/themes/jstandard_theme.c b/src/jinete/themes/jstandard_theme.c index 559f28cdd..8bde4e687 100644 --- a/src/jinete/themes/jstandard_theme.c +++ b/src/jinete/themes/jstandard_theme.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -753,7 +753,7 @@ static void theme_draw_listitem(JWidget widget) bg = COLOR_FACE; fg = COLOR_DISABLED; } - else if (jwidget_is_selected (widget)) { + else if (jwidget_is_selected(widget)) { bg = COLOR_SELECTED; fg = COLOR_BACKGROUND; } @@ -786,7 +786,7 @@ static void theme_draw_listitem(JWidget widget) static void theme_draw_menu(JWidget widget) { - jdraw_rectfill (widget->rc, BGCOLOR); + jdraw_rectfill(widget->rc, BGCOLOR); } static void theme_draw_menuitem(JWidget widget) @@ -828,7 +828,7 @@ static void theme_draw_menuitem(JWidget widget) y2 = widget->rc->y2-1; /* background */ - rectfill (ji_screen, x1, y1, x2, y2, bg); + rectfill(ji_screen, x1, y1, x2, y2, bg); /* draw an indicator for selected items */ if (jwidget_is_selected (widget)) { @@ -850,53 +850,53 @@ static void theme_draw_menuitem(JWidget widget) else widget->align = JI_LEFT | JI_MIDDLE; - pos = jwidget_get_rect (widget); + pos = jwidget_get_rect(widget); if (!bar) - jrect_displace (pos, widget->child_spacing/2, 0); - draw_textstring (NULL, fg, bg, FALSE, widget, pos, 0); - jrect_free (pos); + jrect_displace(pos, widget->child_spacing/2, 0); + draw_textstring(NULL, fg, bg, FALSE, widget, pos, 0); + jrect_free(pos); /* for menu-box */ if (!bar) { /* draw the arrown (to indicate which this menu has a sub-menu) */ - if (jmenuitem_get_submenu (widget)) { + if (jmenuitem_get_submenu(widget)) { /* enabled */ - if (jwidget_is_enabled (widget)) { + if (jwidget_is_enabled(widget)) { for (c=0; c<3; c++) - vline (ji_screen, - widget->rc->x2-3-c, - (widget->rc->y1+widget->rc->y2)/2-c, - (widget->rc->y1+widget->rc->y2)/2+c, fg); + vline(ji_screen, + widget->rc->x2-3-c, + (widget->rc->y1+widget->rc->y2)/2-c, + (widget->rc->y1+widget->rc->y2)/2+c, fg); } /* disabled */ else { for (c=0; c<3; c++) - vline (ji_screen, - widget->rc->x2-3-c+1, - (widget->rc->y1+widget->rc->y2)/2-c+1, - (widget->rc->y1+widget->rc->y2)/2+c+1, COLOR_BACKGROUND); + vline(ji_screen, + widget->rc->x2-3-c+1, + (widget->rc->y1+widget->rc->y2)/2-c+1, + (widget->rc->y1+widget->rc->y2)/2+c+1, COLOR_BACKGROUND); for (c=0; c<3; c++) - vline (ji_screen, - widget->rc->x2-3-c, - (widget->rc->y1+widget->rc->y2)/2-c, - (widget->rc->y1+widget->rc->y2)/2+c, COLOR_DISABLED); + vline(ji_screen, + widget->rc->x2-3-c, + (widget->rc->y1+widget->rc->y2)/2-c, + (widget->rc->y1+widget->rc->y2)/2+c, COLOR_DISABLED); } } /* draw the keyboard shortcut */ - else if (jmenuitem_get_accel (widget)) { + else if (jmenuitem_get_accel(widget)) { int old_align = widget->align; char buf[256]; - pos = jwidget_get_rect (widget); + pos = jwidget_get_rect(widget); pos->x2 -= widget->child_spacing/4; jaccel_to_string (jmenuitem_get_accel (widget), buf); widget->align = JI_RIGHT | JI_MIDDLE; - draw_textstring (buf, fg, bg, FALSE, widget, pos, 0); + draw_textstring(buf, fg, bg, FALSE, widget, pos, 0); widget->align = old_align; - jrect_free (pos); + jrect_free(pos); } } } diff --git a/src/jinete/themes/pcx2data.c b/src/jinete/themes/pcx2data.c index 266f9332c..2dcf8debf 100644 --- a/src/jinete/themes/pcx2data.c +++ b/src/jinete/themes/pcx2data.c @@ -1,5 +1,6 @@ -/* ji - a GUI library - * Copyright (C) 2003 by David A. Capello +/* Jinete - a GUI library + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. + * All rights reserved. * * Read "LICENSE.txt" for more information. */ diff --git a/src/modules/gui.c b/src/modules/gui.c index def908219..ce9c40b75 100644 --- a/src/modules/gui.c +++ b/src/modules/gui.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -773,10 +774,8 @@ static bool manager_msg_proc(JWidget widget, JMessage msg) { switch (msg->type) { - case JM_IDLE: + case JM_QUEUEPROCESSING: gui_feedback(); - /* don't eat CPU... rest some time */ - rest(0); rest(1); break; case JM_CHAR: { @@ -817,35 +816,7 @@ static bool manager_msg_proc(JWidget widget, JMessage msg) } break; } - /* TODO remove this */ -/* if (check_for_accel(ACCEL_FOR_SCREENSHOT, msg)) { */ -/* screen_shot(); */ -/* return TRUE; */ -/* } */ -/* else if (check_for_accel(ACCEL_FOR_FILMEDITOR, msg)) { */ -/* if (current_sprite) { */ -/* JWidget child; */ -/* JLink link; */ -/* bool dofilm = FALSE; */ -/* JI_LIST_FOR_EACH(widget->children, link) { */ -/* child = link->data; */ - -/* if (jwindow_is_foreground(child)) { */ -/* break; */ -/* } */ -/* else if (jwindow_is_desktop(child) && child == app_get_top_window()) { */ -/* dofilm = TRUE; */ -/* break; */ -/* } */ -/* } */ - -/* if (dofilm) { */ -/* switch_between_film_and_sprite_editor(); */ -/* return TRUE; */ -/* } */ -/* } */ -/* } */ } return FALSE; diff --git a/src/modules/tools.c b/src/modules/tools.c index bad151f12..e2c459f94 100644 --- a/src/modules/tools.c +++ b/src/modules/tools.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -20,6 +21,7 @@ #ifndef USE_PRECOMPILED_HEADER +#include #include #include #include @@ -173,7 +175,7 @@ void refresh_tools_names(void) void select_tool(Tool *tool) { - ASSERT(tool != NULL); + assert(tool != NULL); current_tool = tool; @@ -1089,7 +1091,7 @@ void control_tool(JWidget widget, Tool *tool, const char *_color) /* spray updating process */ if (current_tool == &ase_tool_spray) { - if (ji_clock-spray_time > (JI_TICKS_PER_SEC/20)*(100-air_speed)/100) { + if (ji_clock-spray_time > (1000/20)*(100-air_speed)/100) { spray_time = ji_clock; forced_update = TRUE; } diff --git a/src/raster/mask.h b/src/raster/mask.h index 51d1ce3ba..fc4711820 100644 --- a/src/raster/mask.h +++ b/src/raster/mask.h @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -23,9 +24,9 @@ struct Image; -typedef struct Mask Mask; - -struct Mask +typedef struct Mask Mask; + +struct Mask { GfxObj gfxobj; char *name; /* mask name */ diff --git a/src/test/jinete/03slider.c b/src/test/jinete/03slider.c index a74695c87..d6f7414f8 100644 --- a/src/test/jinete/03slider.c +++ b/src/test/jinete/03slider.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,11 +63,11 @@ int main(int argc, char *argv[]) slider5 = jslider_new(0, 255, 1); button1 = jbutton_new("&Close"); - jwidget_set_static_size(slider1, 128, 0); - jwidget_set_static_size(slider2, 128, 0); - jwidget_set_static_size(slider3, 128, 0); - jwidget_set_static_size(slider4, 128, 0); - jwidget_set_static_size(slider5, 128, 0); + jwidget_set_min_size(slider1, 128, 0); + jwidget_set_min_size(slider2, 128, 0); + jwidget_set_min_size(slider3, 128, 0); + jwidget_set_min_size(slider4, 128, 0); + jwidget_set_min_size(slider5, 128, 0); jwidget_expansive(slider1, TRUE); jwidget_expansive(slider2, TRUE); diff --git a/src/test/jinete/08txtbox.c b/src/test/jinete/08txtbox.c index 45d9a94eb..fa33d6e8b 100644 --- a/src/test/jinete/08txtbox.c +++ b/src/test/jinete/08txtbox.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (c) 2003, 2004, 2005, 2007, 2008 David A. Capello * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,7 +33,7 @@ #include "jinete/jinete.h" -void do_text (const char *title, int align) +void do_text(const char *title, int align) { const char *LGPL_text = "This library is free software; you can redistribute it and/or\n" @@ -53,67 +53,67 @@ void do_text (const char *title, int align) JWidget window, box1, box2, box3, box4, label1, label2; JWidget view1, view2, text_box1, text_box2, button; - window = jwindow_new (title); - box1 = jbox_new (JI_VERTICAL); - box2 = jbox_new (JI_HORIZONTAL | JI_HOMOGENEOUS); - box3 = jbox_new (JI_VERTICAL); - box4 = jbox_new (JI_VERTICAL); - label1 = jlabel_new ("With word-wrap"); - label2 = jlabel_new ("Without word-wrap"); - view1 = jview_new (); - view2 = jview_new (); - text_box1 = jtextbox_new (LGPL_text, align | JI_WORDWRAP); - text_box2 = jtextbox_new (LGPL_text, align | 0); - button = jbutton_new ("&Close"); + window = jwindow_new(title); + box1 = jbox_new(JI_VERTICAL); + box2 = jbox_new(JI_HORIZONTAL | JI_HOMOGENEOUS); + box3 = jbox_new(JI_VERTICAL); + box4 = jbox_new(JI_VERTICAL); + label1 = jlabel_new("With word-wrap"); + label2 = jlabel_new("Without word-wrap"); + view1 = jview_new(); + view2 = jview_new(); + text_box1 = jtextbox_new(LGPL_text, align | JI_WORDWRAP); + text_box2 = jtextbox_new(LGPL_text, align | 0); + button = jbutton_new("&Close"); - jview_attach (view1, text_box1); - jview_attach (view2, text_box2); + jview_attach(view1, text_box1); + jview_attach(view2, text_box2); - jwidget_expansive (view1, TRUE); - jwidget_expansive (view2, TRUE); - jwidget_expansive (box2, TRUE); + jwidget_expansive(view1, TRUE); + jwidget_expansive(view2, TRUE); + jwidget_expansive(box2, TRUE); - jwidget_set_static_size (view1, 64, 64); - jwidget_set_static_size (view2, 64, 64); + jwidget_set_min_size(view1, 64, 64); + jwidget_set_min_size(view2, 64, 64); - jwidget_add_child (box3, label1); - jwidget_add_child (box3, view1); - jwidget_add_child (box4, label2); - jwidget_add_child (box4, view2); - jwidget_add_child (box2, box3); - jwidget_add_child (box2, box4); - jwidget_add_child (box1, box2); - jwidget_add_child (box1, button); - jwidget_add_child (window, box1); + jwidget_add_child(box3, label1); + jwidget_add_child(box3, view1); + jwidget_add_child(box4, label2); + jwidget_add_child(box4, view2); + jwidget_add_child(box2, box3); + jwidget_add_child(box2, box4); + jwidget_add_child(box1, box2); + jwidget_add_child(box1, button); + jwidget_add_child(window, box1); - jwindow_open_bg (window); + jwindow_open_bg(window); } -int main (int argc, char *argv[]) +int main(int argc, char *argv[]) { JWidget manager; - allegro_init (); + allegro_init(); if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 320, 200, 0, 0) < 0) { if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) < 0) { allegro_message("%s\n", allegro_error); return 1; } } - install_timer (); - install_keyboard (); - install_mouse (); + install_timer(); + install_keyboard(); + install_mouse(); - manager = jmanager_new (); - ji_set_standard_theme (); + manager = jmanager_new(); + ji_set_standard_theme(); - do_text ("Right", JI_RIGHT); - do_text ("Center", JI_CENTER); - do_text ("Left", JI_LEFT); + do_text("Right", JI_RIGHT); + do_text("Center", JI_CENTER); + do_text("Left", JI_LEFT); - jmanager_run (manager); - jmanager_free (manager); + jmanager_run(manager); + jmanager_free(manager); return 0; } -END_OF_MAIN (); +END_OF_MAIN(); diff --git a/src/test/jinete/18tips.c b/src/test/jinete/18tips.c index d679b0d9b..cde894806 100644 --- a/src/test/jinete/18tips.c +++ b/src/test/jinete/18tips.c @@ -1,5 +1,5 @@ /* Jinete - a GUI library - * Copyright (c) 2003, 2004, 2005, 2007, David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 David A. Capello. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,8 +61,8 @@ int main (int argc, char *argv[]) button1 = jbutton_new("&OK"); button2 = jbutton_new("&Cancel"); - jwidget_add_tip(button1, "This is a tip for \"OK\" button"); - jwidget_add_tip(button2, "This is a tip for the \"Cancel\" button"); + jwidget_add_tip(button1, "This is the \"OK\" button"); + jwidget_add_tip(button2, "This is the \"Cancel\" button"); jwidget_add_child(window, box); jwidget_add_child(box, check1); @@ -78,7 +78,7 @@ int main (int argc, char *argv[]) } END_OF_MAIN(); - + /**********************************************************************/ /* tip */ @@ -91,48 +91,56 @@ static bool tip_window_hook(JWidget widget, JMessage msg); typedef struct TipData { int time; char *text; + int timer_id; } TipData; void jwidget_add_tip(JWidget widget, const char *text) { - TipData *tip = jnew (TipData, 1); + TipData *tip = jnew(TipData, 1); tip->time = -1; - tip->text = jstrdup (text); + tip->text = jstrdup(text); + tip->timer_id = -1; - jwidget_add_hook (widget, tip_type (), tip_hook, tip); + jwidget_add_hook(widget, tip_type(), tip_hook, tip); } static int tip_type(void) { static int type = 0; if (!type) - type = ji_register_widget_type (); + type = ji_register_widget_type(); return type; } static bool tip_hook(JWidget widget, JMessage msg) { - TipData *tip = jwidget_get_data (widget, tip_type ()); + TipData *tip = jwidget_get_data(widget, tip_type()); switch (msg->type) { case JM_DESTROY: - jfree (tip->text); - jfree (tip); + if (tip->timer_id >= 0) + jmanager_remove_timer(tip->timer_id); + + jfree(tip->text); + jfree(tip); break; case JM_MOUSEENTER: - tip->time = ji_clock; + if (tip->timer_id < 0) + tip->timer_id = jmanager_add_timer(widget, 1000); + + jmanager_start_timer(tip->timer_id); break; case JM_MOUSELEAVE: - tip->time = -1; + jmanager_stop_timer(tip->timer_id); break; - case JM_IDLE: - if (tip->time >= 0 && ji_clock-tip->time > JI_TICKS_PER_SEC) { - JWidget window = tip_window_new (tip->text); + case JM_TIMER: + if (msg->timer.timer_id == tip->timer_id) { + JWidget window = tip_window_new(tip->text); int w = jrect_w(window->rc); int h = jrect_h(window->rc); jwindow_remap(window); @@ -141,9 +149,10 @@ static bool tip_hook(JWidget widget, JMessage msg) MID(0, jmouse_y(0)-h/2, JI_SCREEN_H-h)); jwindow_open(window); - tip->time = -1; + jmanager_stop_timer(tip->timer_id); } break; + } return FALSE; } @@ -176,7 +185,7 @@ static bool tip_window_hook(JWidget widget, JMessage msg) case JM_SIGNAL: if (msg->signal.num == JI_SIGNAL_INIT_THEME) { widget->border_width.l = 3; - widget->border_width.t = 3+jwidget_get_text_height (widget); + widget->border_width.t = 3+jwidget_get_text_height(widget); widget->border_width.r = 3; widget->border_width.b = 3; return TRUE; @@ -189,15 +198,15 @@ static bool tip_window_hook(JWidget widget, JMessage msg) break; case JM_DRAW: { - JRect pos = jwidget_get_rect (widget); + JRect pos = jwidget_get_rect(widget); - jdraw_rect(pos, makecol (0, 0, 0)); + jdraw_rect(pos, makecol(0, 0, 0)); - jrect_shrink (pos, 1); - jdraw_rectfill (pos, makecol (255, 255, 140)); + jrect_shrink(pos, 1); + jdraw_rectfill(pos, makecol(255, 255, 140)); - jdraw_widget_text (widget, makecol (0, 0, 0), - makecol (255, 255, 140), FALSE); + jdraw_widget_text(widget, makecol(0, 0, 0), + makecol(255, 255, 140), FALSE); return TRUE; } } diff --git a/src/test/jinete/22xml.c b/src/test/jinete/22xml.c index 68feaa1e7..f298455dd 100644 --- a/src/test/jinete/22xml.c +++ b/src/test/jinete/22xml.c @@ -1,5 +1,5 @@ /* jinete - a GUI library - * Copyright (C) 2003-2005, 2007 by David A. Capello + * Copyright (C) 2003, 2004, 2005, 2007, 2008 by David A. Capello * * Jinete is gift-ware. */ @@ -53,8 +53,8 @@ int main(int argc, char *argv[]) jwidget_expansive(hbox, TRUE); jwidget_expansive(textsrc, TRUE); jwidget_expansive(textdst, TRUE); - jwidget_set_static_size(textsrc, 600, 200); - jwidget_set_static_size(textdst, 600, 200); + jwidget_set_min_size(textsrc, 600, 200); + jwidget_set_min_size(textdst, 600, 200); jwidget_add_child(hbox, textsrc); jwidget_add_child(hbox, textdst); diff --git a/src/test/raster/00dirty.c b/src/test/raster/00dirty.c index 78a49e07b..cd8e3ed2b 100644 --- a/src/test/raster/00dirty.c +++ b/src/test/raster/00dirty.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -16,6 +17,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" + #include #include "raster/raster.h" diff --git a/src/test/raster/01mask.c b/src/test/raster/01mask.c index 9ebdd24fc..0893af14f 100644 --- a/src/test/raster/01mask.c +++ b/src/test/raster/01mask.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -16,6 +17,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" + #include #include "raster/image.h" diff --git a/src/test/raster/02path.c b/src/test/raster/02path.c index 5d219d61d..a96384284 100644 --- a/src/test/raster/02path.c +++ b/src/test/raster/02path.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -16,6 +17,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" + #include #include diff --git a/src/test/raster/03sprite.c b/src/test/raster/03sprite.c index 7bf250bf6..fdafd1d0e 100644 --- a/src/test/raster/03sprite.c +++ b/src/test/raster/03sprite.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -16,6 +17,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" + #include #include #include diff --git a/src/util/recscr.c b/src/util/recscr.c index 149efce46..1d0a8c6dc 100644 --- a/src/util/recscr.c +++ b/src/util/recscr.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -20,6 +21,7 @@ #ifndef USE_PRECOMPILED_HEADER +#include #include #include #include @@ -59,7 +61,7 @@ void rec_screen_on(void) /* || (rec_file)) */ /* return; */ - ASSERT(rec_file == NULL); + assert(rec_file == NULL); /* get a file name for the record */ for (c=0; c<10000; c++) { @@ -129,7 +131,7 @@ void rec_screen_poll(void) { if (!is_interactive() || !rec_file) return; - else if (ji_clock-rec_clock > JI_TICKS_PER_SEC/FRAMES_PER_SECOND) { + else if (ji_clock-rec_clock > 1000/FRAMES_PER_SECOND) { BITMAP *t; int old_flag; int c, i; diff --git a/src/widgets/editor/editor.c b/src/widgets/editor/editor.c index 534ca1b05..479c61036 100644 --- a/src/widgets/editor/editor.c +++ b/src/widgets/editor/editor.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -517,7 +518,7 @@ void editor_draw_mask_safe(JWidget widget) if ((editor->sprite) && (editor->sprite->bound.seg)) { int thick = editor->cursor_thick; - if (ji_clock-editor->last_clock > JI_TICKS_PER_SEC/16) { + if (ji_clock-editor->last_clock > 1000/16) { JRegion region = jwidget_get_drawable_region(widget, JI_GDR_CUTTOPWINDOWS); int c, nrects = JI_REGION_NUM_RECTS(region); JRect rc; @@ -1033,6 +1034,7 @@ static bool editor_msg_proc (JWidget widget, JMessage msg) } return TRUE; +#if 0 case JM_IDLE: if (editor->sprite) editor_draw_mask_safe(widget); @@ -1062,6 +1064,7 @@ static bool editor_msg_proc (JWidget widget, JMessage msg) /* if (editor->refresh_region) */ /* editor_refresh_region (widget); */ break; +#endif case JM_MOUSEENTER: if (jmanager_get_capture() && diff --git a/src/widgets/editor/keys.c b/src/widgets/editor/keys.c index d2823a25b..ad7b5c00e 100644 --- a/src/widgets/editor/keys.c +++ b/src/widgets/editor/keys.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -95,7 +96,7 @@ int editor_keys_toset_zoom(JWidget widget, int scancode) int editor_keys_toset_frame(JWidget widget, int scancode) { - Editor *editor = editor_data (widget); + Editor *editor = editor_data(widget); if ((editor->sprite) && /* (jwidget_has_mouse (widget)) && */ diff --git a/src/widgets/preview.c b/src/widgets/preview.c index 3b08eea4e..6315cab92 100644 --- a/src/widgets/preview.c +++ b/src/widgets/preview.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -20,6 +21,9 @@ #ifndef USE_PRECOMPILED_HEADER +#include + +#include "jinete/jmanager.h" #include "jinete/jmessage.h" #include "jinete/jwidget.h" @@ -33,6 +37,7 @@ typedef struct Preview { Effect *effect; + int timer_id; } Preview; static bool preview_msg_proc(JWidget widget, JMessage msg); @@ -43,6 +48,7 @@ JWidget preview_new(Effect *effect) Preview *preview = jnew(Preview, 1); preview->effect = effect; + preview->timer_id = -1; jwidget_add_hook(widget, preview_type(), preview_msg_proc, preview); jwidget_hide(widget); @@ -60,24 +66,41 @@ int preview_type(void) void preview_restart(JWidget widget) { - effect_begin_for_preview(preview_get_effect(widget)); + Preview *preview; + + assert_valid_widget(widget); + + preview = jwidget_get_data(widget, preview_type()); + + effect_begin_for_preview(preview->effect); + + if (preview->timer_id < 0) + preview->timer_id = jmanager_add_timer(widget, 1); + jmanager_start_timer(preview->timer_id); } Effect *preview_get_effect(JWidget widget) { - return ((Preview *)jwidget_get_data(widget, preview_type()))->effect; + Preview *preview; + + assert_valid_widget(widget); + + preview = jwidget_get_data(widget, preview_type()); + return preview->effect; } static bool preview_msg_proc(JWidget widget, JMessage msg) { + Preview *preview = jwidget_get_data(widget, preview_type()); Effect *effect = preview_get_effect(widget); switch (msg->type) { case JM_DESTROY: - jfree(jwidget_get_data(widget, preview_type())); + jmanager_remove_timer(preview->timer_id); + jfree(preview); break; - + case JM_OPEN: set_preview_image(effect->sprite->layer, effect->dst); break; @@ -86,10 +109,12 @@ static bool preview_msg_proc(JWidget widget, JMessage msg) set_preview_image(NULL, NULL); break; - case JM_IDLE: + case JM_TIMER: if (effect) { if (effect_apply_step(effect)) effect_flush(effect); + else + jmanager_stop_timer(preview->timer_id); } break; } diff --git a/src/widgets/statebar.c b/src/widgets/statebar.c index b61e6ae31..c0fd34b5b 100644 --- a/src/widgets/statebar.c +++ b/src/widgets/statebar.c @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -84,7 +85,6 @@ JWidget status_bar_new(void) status_bar->widget = widget; status_bar->timeout = 0; - status_bar->restore = FALSE; status_bar->nprogress = 0; /* construct the commands box */ @@ -149,7 +149,7 @@ void status_bar_set_text(JWidget widget, int msecs, const char *format, ...) jfree (widget->text); widget->text = buf ? jstrdup (buf) : NULL; - status_bar->timeout = ji_clock + JI_TICKS_PER_SEC*msecs/1000; + status_bar->timeout = ji_clock + msecs; jwidget_dirty(widget); } } @@ -325,24 +325,18 @@ static bool status_bar_msg_proc(JWidget widget, JMessage msg) break; case JM_MOUSELEAVE: - if (jwidget_has_child(widget, status_bar->commands_box)) - status_bar->restore = TRUE; - break; + if (jwidget_has_child(widget, status_bar->commands_box)) { + /* if we want restore the state-bar and the slider doesn't have + the capture... */ + if (jmanager_get_capture() != status_bar->slider) { + /* exit from command mode */ + jmanager_free_focus(); - case JM_IDLE: { - /* if we want restore the state-bar and the slider doesn't have - the capture... */ - if (status_bar->restore && - jmanager_get_capture() != status_bar->slider) { - /* exit from command mode */ - status_bar->restore = FALSE; - jmanager_free_focus(); - - jwidget_remove_child(widget, status_bar->commands_box); - jwidget_dirty(widget); + jwidget_remove_child(widget, status_bar->commands_box); + jwidget_dirty(widget); + } } break; - } } return FALSE; @@ -442,7 +436,7 @@ static void update_from_layer(StatusBar *status_bar) jwidget_disable(status_bar->slider); } } - + /*********************************************************************** Animation Playing stuff ***********************************************************************/ diff --git a/src/widgets/statebar.h b/src/widgets/statebar.h index 4c5699ca6..b015abfc6 100644 --- a/src/widgets/statebar.h +++ b/src/widgets/statebar.h @@ -1,5 +1,6 @@ /* ASE - Allegro Sprite Editor - * Copyright (C) 2001-2005, 2007 David A. Capello + * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, + * 2008 David A. Capello * * 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 @@ -25,7 +26,6 @@ typedef struct StatusBar { JWidget widget; int timeout; - unsigned restore : 1; /* return from commands mode */ /* progress bar */ int nprogress; @@ -45,17 +45,17 @@ typedef struct StatusBar JWidget b_last; /* go to last frame */ } StatusBar; -JWidget status_bar_new (void); -int status_bar_type (void); +JWidget status_bar_new(void); +int status_bar_type(void); -StatusBar *status_bar_data (JWidget status_bar); +StatusBar *status_bar_data(JWidget status_bar); -void status_bar_set_text (JWidget status_bar, int msecs, const char *format, ...); +void status_bar_set_text(JWidget status_bar, int msecs, const char *format, ...); -void status_bar_do_progress (JWidget status_bar, int progress); -void status_bar_add_progress (JWidget status_bar, int max); -void status_bar_del_progress (JWidget status_bar); +void status_bar_do_progress(JWidget status_bar, int progress); +void status_bar_add_progress(JWidget status_bar, int max); +void status_bar_del_progress(JWidget status_bar); -void status_bar_update (JWidget status_bar); +void status_bar_update(JWidget status_bar); #endif /* WIDGETS_STATEBAR_H */ diff --git a/src/widgets/tabs.c b/src/widgets/tabs.c index 8ceacf9cf..664a38bb8 100644 --- a/src/widgets/tabs.c +++ b/src/widgets/tabs.c @@ -51,6 +51,7 @@ typedef struct Tabs Tab *hot; Tab *selected; void (*select_callback)(void *data); + int timer_id; int scroll_x; /* int hot_arrow; */ JWidget button_left; @@ -84,6 +85,7 @@ JWidget tabs_new(void (*select_callback)(void *data)) tabs->hot = NULL; tabs->selected = NULL; tabs->select_callback = select_callback; + tabs->timer_id = jmanager_add_timer(widget, 1000/60); tabs->scroll_x = 0; /* tabs->hot_arrow = 0; */ @@ -194,6 +196,8 @@ static bool tabs_msg_proc(JWidget widget, JMessage msg) jwidget_free(tabs->button_right); jlist_free(tabs->list_of_tabs); + + jmanager_remove_timer(tabs->timer_id); jfree(tabs); break; } @@ -291,7 +295,7 @@ static bool tabs_msg_proc(JWidget widget, JMessage msg) return TRUE; case JM_BUTTONPRESSED: - if (tabs->selected != tabs->hot) { + if (tabs->selected != tabs->hot && tabs->hot != NULL) { tabs->selected = tabs->hot; jwidget_dirty(widget); @@ -306,6 +310,15 @@ static bool tabs_msg_proc(JWidget widget, JMessage msg) return TRUE; } + case JM_TIMER: { +/* JWidget parent = jwidget_get_parent(widget); */ +/* Tabs *tabs = jwidget_get_data(parent, tabs_type()); */ +/* int dir = (int)jwidget_get_data(widget, tabs_type()); */ + int dir = jmanager_get_capture() == tabs->button_left ? -1: 1; + set_scroll_x(widget, tabs->scroll_x + dir*8); + break; + } + } return FALSE; @@ -313,25 +326,34 @@ static bool tabs_msg_proc(JWidget widget, JMessage msg) static bool tabs_button_msg_proc(JWidget widget, JMessage msg) { + JWidget parent; + Tabs *tabs; + + parent = jwidget_get_parent(widget); + if (parent) + tabs = jwidget_get_data(parent, tabs_type()); + switch (msg->type) { case JM_SIGNAL: - if (msg->signal.num == JI_SIGNAL_BUTTON_SELECT) + if (msg->signal.num == JI_SIGNAL_BUTTON_SELECT) { return TRUE; + } else if (msg->signal.num == JI_SIGNAL_DISABLE) { - if (jwidget_is_selected(widget)) + if (jwidget_is_selected(widget)) { + jmanager_stop_timer(tabs->timer_id); jwidget_deselect(widget); + } return TRUE; } break; - case JM_IDLE: - if (jwidget_has_capture(widget)) { - JWidget parent = jwidget_get_parent(widget); - Tabs *tabs = jwidget_get_data(parent, tabs_type()); - int dir = (int) jwidget_get_data(widget, tabs_type()); - set_scroll_x(parent, tabs->scroll_x + dir*8); - } + case JM_BUTTONPRESSED: + jmanager_start_timer(tabs->timer_id); + break; + + case JM_BUTTONRELEASED: + jmanager_stop_timer(tabs->timer_id); break; }